8 Commits

366 changed files with 1665 additions and 9459 deletions

View File

@@ -1,100 +0,0 @@
from cpl_cli.abc.generate_schematic_abc import GenerateSchematicABC
class DBTable(GenerateSchematicABC):
def __init__(self, *args: str):
GenerateSchematicABC.__init__(self, *args)
self._name = self._name.replace("_db_table", "")
self._class_name = self._class_name.split("Db_table")[0]
def get_code(self) -> str:
import textwrap
code = textwrap.dedent(
"""\
from datetime import datetime
from cpl_core.database import TableABC
class $ClassName(TableABC):
def __init__(
self,
value: str,
created_at: datetime = None,
modified_at: datetime = None,
id=0,
):
self._id = id
self._value = value
TableABC.__init__(self)
self._created_at = created_at if created_at is not None else self._created_at
self._modified_at = modified_at if modified_at is not None else self._modified_at
@property
def value(self) -> str:
return self._value
@value.setter
def value(self, value: str):
self._value = value
@staticmethod
def get_select_all_string() -> str:
return str(
f\"""
SELECT * FROM `$TableName`;
\"""
)
@staticmethod
def get_select_by_id_string(id: int) -> str:
return str(
f\"""
SELECT * FROM `$TableName`
WHERE `Id` = {id};
\"""
)
@property
def insert_string(self) -> str:
return str(
f\"""
INSERT INTO `$TableName` (
`Value`
) VALUES (
{self._value}
);
\"""
)
@property
def udpate_string(self) -> str:
return str(
f\"""
UPDATE `$TableName`
SET `Value` = {self._value}
WHERE `Id` = {self._id};
\"""
)
@property
def delete_string(self) -> str:
return str(
f\"""
DELETE FROM `$TableName`
WHERE `Id` = {self._id};
\"""
)
"""
)
return self.build_code_str(
code,
ClassName=self._class_name,
TableName=self._class_name,
)
@classmethod
def register(cls):
GenerateSchematicABC.register(cls, "db-table", [])

View File

@@ -1,55 +0,0 @@
from cpl_cli.abc.generate_schematic_abc import GenerateSchematicABC
class Migration(GenerateSchematicABC):
def __init__(self, *args: str):
GenerateSchematicABC.__init__(self, *args)
def get_code(self) -> str:
import textwrap
code = textwrap.dedent(
"""\
from bot_core.logging.database_logger import DatabaseLogger
from bot_data.abc.migration_abc import MigrationABC
from bot_data.db_context import DBContext
class $ClassName(MigrationABC):
name = "1.0_$ClassName"
def __init__(self, logger: DatabaseLogger, db: DBContext):
MigrationABC.__init__(self)
self._logger = logger
self._db = db
self._cursor = db.cursor
def upgrade(self):
self._logger.debug(__name__, "Running upgrade")
self._cursor.execute(
str(
f\"""
CREATE TABLE IF NOT EXISTS `$TableName` (
`Id` BIGINT NOT NULL AUTO_INCREMENT,
`CreatedAt` DATETIME(6),
`LastModifiedAt` DATETIME(6),
PRIMARY KEY(`Id`)
);
\"""
)
)
def downgrade(self):
self._cursor.execute("DROP TABLE `$TableName`;")
"""
)
return self.build_code_str(
code,
ClassName=self._class_name,
TableName=self._class_name.split("Migration")[0],
)
@classmethod
def register(cls):
GenerateSchematicABC.register(cls, "migration", [])

View File

@@ -1,7 +1,7 @@
from cpl_cli.abc.generate_schematic_abc import GenerateSchematicABC from cpl_cli.abc.generate_schematic_abc import GenerateSchematicABC
class Query(GenerateSchematicABC): class query(GenerateSchematicABC):
def __init__(self, *args: str): def __init__(self, *args: str):
GenerateSchematicABC.__init__(self, *args) GenerateSchematicABC.__init__(self, *args)

View File

@@ -7,11 +7,9 @@
"bot-core": "src/bot_core/bot-core.json", "bot-core": "src/bot_core/bot-core.json",
"bot-data": "src/bot_data/bot-data.json", "bot-data": "src/bot_data/bot-data.json",
"bot-graphql": "src/bot_graphql/bot-graphql.json", "bot-graphql": "src/bot_graphql/bot-graphql.json",
"achievements": "src/modules/achievements/achievements.json",
"auto-role": "src/modules/auto_role/auto-role.json", "auto-role": "src/modules/auto_role/auto-role.json",
"base": "src/modules/base/base.json", "base": "src/modules/base/base.json",
"boot-log": "src/modules/boot_log/boot-log.json", "boot-log": "src/modules/boot_log/boot-log.json",
"config": "src/modules/config/config.json",
"database": "src/modules/database/database.json", "database": "src/modules/database/database.json",
"level": "src/modules/level/level.json", "level": "src/modules/level/level.json",
"permission": "src/modules/permission/permission.json", "permission": "src/modules/permission/permission.json",
@@ -23,18 +21,25 @@
}, },
"Scripts": { "Scripts": {
"format": "black ./", "format": "black ./",
"sv": "cpl set-version $ARGS", "sv": "cpl set-version $ARGS",
"set-version": "cpl run set-version $ARGS --dev; echo '';", "set-version": "cpl run set-version $ARGS --dev; echo '';",
"gv": "cpl get-version", "gv": "cpl get-version",
"get-version": "export VERSION=$(cpl run get-version --dev); echo $VERSION;", "get-version": "export VERSION=$(cpl run get-version --dev); echo $VERSION;",
"pre-build": "cpl set-version $ARGS; black ./;", "pre-build": "cpl set-version $ARGS; black ./;",
"post-build": "cpl run post-build --dev; black ./;", "post-build": "cpl run post-build --dev; black ./;",
"pre-prod": "cpl build", "pre-prod": "cpl build",
"prod": "export KDB_ENVIRONMENT=production; export KDB_NAME=KDB-Prod; cpl start;", "prod": "export KDB_ENVIRONMENT=production; export KDB_NAME=KDB-Prod; cpl start;",
"pre-stage": "cpl build", "pre-stage": "cpl build",
"stage": "export KDB_ENVIRONMENT=staging; export KDB_NAME=KDB-Stage; cpl start;", "stage": "export KDB_ENVIRONMENT=staging; export KDB_NAME=KDB-Stage; cpl start;",
"pre-dev": "cpl build", "pre-dev": "cpl build",
"dev": "export KDB_ENVIRONMENT=development; export KDB_NAME=KDB-Dev; cpl start;", "dev": "export KDB_ENVIRONMENT=development; export KDB_NAME=KDB-Dev; cpl start;",
"docker-build": "cpl build $ARGS; docker build -t kdb-bot/kdb-bot:$(cpl gv) .;", "docker-build": "cpl build $ARGS; docker build -t kdb-bot/kdb-bot:$(cpl gv) .;",
"dc-up": "docker-compose up -d", "dc-up": "docker-compose up -d",
"dc-down": "docker-compose down", "dc-down": "docker-compose down",

View File

@@ -15,7 +15,7 @@ __title__ = "bot"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.3" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports: # imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="3") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -70,8 +70,8 @@ class Application(DiscordBotApplicationABC):
if self._feature_flags.get_flag(FeatureFlagsEnum.api_module): if self._feature_flags.get_flag(FeatureFlagsEnum.api_module):
self._api.stop() self._api.stop()
self._data_integrity.check_data_integrity(is_for_shutdown=True)
await self._bot.close() await self._bot.close()
await self._data_integrity.check_data_integrity(is_for_shutdown=True)
self._logger.info(__name__, f"Stopped {DiscordBotService.__name__}") self._logger.info(__name__, f"Stopped {DiscordBotService.__name__}")
except Exception as e: except Exception as e:
self._logger.error(__name__, "stop failed", e) self._logger.error(__name__, "stop failed", e)
@@ -79,4 +79,4 @@ class Application(DiscordBotApplicationABC):
Console.write_line() Console.write_line()
def is_restart(self): def is_restart(self):
return True if self._configuration.get_configuration("IS_RESTART") == "true" else False return True if self._configuration.get_configuration("IS_RESTART") == "true" else False #

View File

@@ -3,8 +3,8 @@
"Name": "bot", "Name": "bot",
"Version": { "Version": {
"Major": "1", "Major": "1",
"Minor": "1", "Minor": "0",
"Micro": "3" "Micro": "7"
}, },
"Author": "Sven Heidemann", "Author": "Sven Heidemann",
"AuthorEmail": "sven.heidemann@sh-edraft.de", "AuthorEmail": "sven.heidemann@sh-edraft.de",
@@ -16,26 +16,24 @@
"LicenseName": "MIT", "LicenseName": "MIT",
"LicenseDescription": "MIT, see LICENSE for more details.", "LicenseDescription": "MIT, see LICENSE for more details.",
"Dependencies": [ "Dependencies": [
"cpl-core==2023.4.0.post5", "cpl-core==2023.4.0.post2",
"cpl-translation==2023.4.0.post1", "cpl-translation==2023.4.0.post1",
"cpl-query==2023.4.0.post1", "cpl-query==2023.4.0.post1",
"cpl-discord==2023.4.0.post3", "cpl-discord==2023.4.0.post3",
"Flask==2.3.2", "Flask==2.3.2",
"Flask-Classful==0.14.2", "Flask-Classful==0.14.2",
"Flask-Cors==4.0.0", "Flask-Cors==3.0.10",
"PyJWT==2.8.0", "PyJWT==2.7.0",
"waitress==2.1.2", "waitress==2.1.2",
"Flask-SocketIO==5.3.4", "Flask-SocketIO==5.3.4",
"eventlet==0.33.3", "eventlet==0.33.3",
"requests-oauthlib==1.3.1", "requests-oauthlib==1.3.1",
"icmplib==3.0.3", "icmplib==3.0.3",
"ariadne==0.20.1", "ariadne==0.19.1"
"cryptography==41.0.2",
"discord>=2.3.2"
], ],
"DevDependencies": [ "DevDependencies": [
"cpl-cli==2023.4.0.post3", "cpl-cli==2023.4.0.post3",
"pygount==1.6.1" "pygount==1.5.1"
], ],
"PythonVersion": ">=3.10.4", "PythonVersion": ">=3.10.4",
"PythonPath": {}, "PythonPath": {},
@@ -60,11 +58,9 @@
"../bot_core/bot-core.json", "../bot_core/bot-core.json",
"../bot_data/bot-data.json", "../bot_data/bot-data.json",
"../bot_graphql/bot-graphql.json", "../bot_graphql/bot-graphql.json",
"../modules/achievements/achievements.json",
"../modules/auto_role/auto-role.json", "../modules/auto_role/auto-role.json",
"../modules/base/base.json", "../modules/base/base.json",
"../modules/boot_log/boot-log.json", "../modules/boot_log/boot-log.json",
"../modules/config/config.json",
"../modules/database/database.json", "../modules/database/database.json",
"../modules/level/level.json", "../modules/level/level.json",
"../modules/permission/permission.json", "../modules/permission/permission.json",

View File

@@ -15,7 +15,7 @@ __title__ = "bot.extension"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.3" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports: # imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="3") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -3,7 +3,7 @@ from cpl_core.configuration import ConfigurationABC
from cpl_core.dependency_injection import ServiceProviderABC from cpl_core.dependency_injection import ServiceProviderABC
from cpl_discord.service import DiscordBotServiceABC from cpl_discord.service import DiscordBotServiceABC
from bot_data.model.technician_config import TechnicianConfig from bot_core.configuration.bot_settings import BotSettings
class InitBotExtension(ApplicationExtensionABC): class InitBotExtension(ApplicationExtensionABC):
@@ -11,6 +11,6 @@ class InitBotExtension(ApplicationExtensionABC):
ApplicationExtensionABC.__init__(self) ApplicationExtensionABC.__init__(self)
async def run(self, config: ConfigurationABC, services: ServiceProviderABC): async def run(self, config: ConfigurationABC, services: ServiceProviderABC):
settings = config.get_configuration(TechnicianConfig) settings = config.get_configuration(BotSettings)
bot: DiscordBotServiceABC = services.get_service(DiscordBotServiceABC, max_messages=settings.cache_max_messages) bot: DiscordBotServiceABC = services.get_service(DiscordBotServiceABC, max_messages=settings.cache_max_messages)

View File

@@ -15,7 +15,6 @@ from bot.startup_settings_extension import StartupSettingsExtension
from bot_api.app_api_extension import AppApiExtension from bot_api.app_api_extension import AppApiExtension
from bot_core.core_extension.core_extension import CoreExtension from bot_core.core_extension.core_extension import CoreExtension
from modules.boot_log.boot_log_extension import BootLogExtension from modules.boot_log.boot_log_extension import BootLogExtension
from modules.config.config_extension import ConfigExtension
from modules.database.database_extension import DatabaseExtension from modules.database.database_extension import DatabaseExtension
@@ -31,10 +30,9 @@ class Program:
.use_extension(StartupDiscordExtension) .use_extension(StartupDiscordExtension)
.use_extension(StartupModuleExtension) .use_extension(StartupModuleExtension)
.use_extension(StartupMigrationExtension) .use_extension(StartupMigrationExtension)
.use_extension(DatabaseExtension)
.use_extension(ConfigExtension)
.use_extension(InitBotExtension) .use_extension(InitBotExtension)
.use_extension(BootLogExtension) .use_extension(BootLogExtension)
.use_extension(DatabaseExtension)
.use_extension(AppApiExtension) .use_extension(AppApiExtension)
.use_extension(CoreExtension) .use_extension(CoreExtension)
.use_startup(Startup) .use_startup(Startup)

View File

@@ -5,11 +5,9 @@ from bot_core.core_extension.core_extension_module import CoreExtensionModule
from bot_core.core_module import CoreModule from bot_core.core_module import CoreModule
from bot_data.data_module import DataModule from bot_data.data_module import DataModule
from bot_graphql.graphql_module import GraphQLModule from bot_graphql.graphql_module import GraphQLModule
from modules.achievements.achievements_module import AchievementsModule
from modules.auto_role.auto_role_module import AutoRoleModule from modules.auto_role.auto_role_module import AutoRoleModule
from modules.base.base_module import BaseModule from modules.base.base_module import BaseModule
from modules.boot_log.boot_log_module import BootLogModule from modules.boot_log.boot_log_module import BootLogModule
from modules.config.config_module import ConfigModule
from modules.database.database_module import DatabaseModule from modules.database.database_module import DatabaseModule
from modules.level.level_module import LevelModule from modules.level.level_module import LevelModule
from modules.permission.permission_module import PermissionModule from modules.permission.permission_module import PermissionModule
@@ -25,16 +23,14 @@ class ModuleList:
[ [
CoreModule, # has to be first! CoreModule, # has to be first!
DataModule, DataModule,
ConfigModule, # has to be before db check
DatabaseModule,
GraphQLModule, GraphQLModule,
PermissionModule, PermissionModule,
DatabaseModule,
AutoRoleModule, AutoRoleModule,
BaseModule, BaseModule,
LevelModule, LevelModule,
ApiModule, ApiModule,
TechnicianModule, TechnicianModule,
AchievementsModule,
# has to be last! # has to be last!
BootLogModule, BootLogModule,
CoreExtensionModule, CoreExtensionModule,

View File

@@ -4,15 +4,11 @@ from cpl_core.dependency_injection import ServiceCollectionABC
from cpl_core.environment import ApplicationEnvironmentABC from cpl_core.environment import ApplicationEnvironmentABC
from bot_data.abc.migration_abc import MigrationABC from bot_data.abc.migration_abc import MigrationABC
from bot_data.migration.achievements_migration import AchievementsMigration
from bot_data.migration.api_key_migration import ApiKeyMigration from bot_data.migration.api_key_migration import ApiKeyMigration
from bot_data.migration.api_migration import ApiMigration from bot_data.migration.api_migration import ApiMigration
from bot_data.migration.auto_role_fix1_migration import AutoRoleFix1Migration from bot_data.migration.auto_role_fix1_migration import AutoRoleFix1Migration
from bot_data.migration.auto_role_migration import AutoRoleMigration from bot_data.migration.auto_role_migration import AutoRoleMigration
from bot_data.migration.config_feature_flags_migration import ConfigFeatureFlagsMigration
from bot_data.migration.config_migration import ConfigMigration
from bot_data.migration.db_history_migration import DBHistoryMigration from bot_data.migration.db_history_migration import DBHistoryMigration
from bot_data.migration.default_role_migration import DefaultRoleMigration
from bot_data.migration.initial_migration import InitialMigration from bot_data.migration.initial_migration import InitialMigration
from bot_data.migration.level_migration import LevelMigration from bot_data.migration.level_migration import LevelMigration
from bot_data.migration.remove_stats_migration import RemoveStatsMigration from bot_data.migration.remove_stats_migration import RemoveStatsMigration
@@ -46,7 +42,3 @@ class StartupMigrationExtension(StartupExtensionABC):
services.add_transient(MigrationABC, RemoveStatsMigration) # 19.02.2023 #190 - 1.0.0 services.add_transient(MigrationABC, RemoveStatsMigration) # 19.02.2023 #190 - 1.0.0
services.add_transient(MigrationABC, UserWarningMigration) # 21.02.2023 #35 - 1.0.0 services.add_transient(MigrationABC, UserWarningMigration) # 21.02.2023 #35 - 1.0.0
services.add_transient(MigrationABC, DBHistoryMigration) # 06.03.2023 #246 - 1.0.0 services.add_transient(MigrationABC, DBHistoryMigration) # 06.03.2023 #246 - 1.0.0
services.add_transient(MigrationABC, AchievementsMigration) # 14.06.2023 #268 - 1.1.0
services.add_transient(MigrationABC, ConfigMigration) # 19.07.2023 #127 - 1.1.0
services.add_transient(MigrationABC, ConfigFeatureFlagsMigration) # 15.08.2023 #334 - 1.1.0
services.add_transient(MigrationABC, DefaultRoleMigration) # 24.09.2023 #360 - 1.1.3

View File

@@ -1,6 +1,6 @@
import os import os
from datetime import datetime from datetime import datetime
from typing import Optional, Type, Callable from typing import Callable, Type, Optional
from cpl_core.application import StartupExtensionABC from cpl_core.application import StartupExtensionABC
from cpl_core.configuration import ConfigurationABC from cpl_core.configuration import ConfigurationABC
@@ -8,6 +8,11 @@ from cpl_core.dependency_injection import ServiceCollectionABC
from cpl_core.environment import ApplicationEnvironmentABC from cpl_core.environment import ApplicationEnvironmentABC
from bot_core.configuration.bot_logging_settings import BotLoggingSettings from bot_core.configuration.bot_logging_settings import BotLoggingSettings
from bot_core.configuration.bot_settings import BotSettings
from modules.base.configuration.base_settings import BaseSettings
from modules.boot_log.configuration.boot_log_settings import BootLogSettings
from modules.level.configuration.level_settings import LevelSettings
from modules.permission.configuration.permission_settings import PermissionSettings
class StartupSettingsExtension(StartupExtensionABC): class StartupSettingsExtension(StartupExtensionABC):
@@ -29,6 +34,13 @@ class StartupSettingsExtension(StartupExtensionABC):
configuration.add_json_file(f"config/feature-flags.{environment.host_name}.json", optional=True) configuration.add_json_file(f"config/feature-flags.{environment.host_name}.json", optional=True)
configuration.add_configuration("Startup_StartTime", str(self._start_time)) configuration.add_configuration("Startup_StartTime", str(self._start_time))
self._configure_settings_with_sub_settings(configuration, BotSettings, lambda x: x.servers, lambda x: x.id)
self._configure_settings_with_sub_settings(configuration, BaseSettings, lambda x: x.servers, lambda x: x.id)
self._configure_settings_with_sub_settings(configuration, BootLogSettings, lambda x: x.servers, lambda x: x.id)
self._configure_settings_with_sub_settings(configuration, LevelSettings, lambda x: x.servers, lambda x: x.id)
self._configure_settings_with_sub_settings(
configuration, PermissionSettings, lambda x: x.servers, lambda x: x.id
)
self._configure_settings_with_sub_settings( self._configure_settings_with_sub_settings(
configuration, BotLoggingSettings, lambda x: x.files, lambda x: x.key configuration, BotLoggingSettings, lambda x: x.files, lambda x: x.key
) )
@@ -38,9 +50,9 @@ class StartupSettingsExtension(StartupExtensionABC):
@staticmethod @staticmethod
def _configure_settings_with_sub_settings( def _configure_settings_with_sub_settings(
config: ConfigurationABC, settings_type: Type, list_atr: Callable, atr: Callable config: ConfigurationABC, settings: Type, list_atr: Callable, atr: Callable
): ):
settings: Optional[settings_type] = config.get_configuration(settings_type) settings: Optional[settings] = config.get_configuration(settings)
if settings is None: if settings is None:
return return

View File

@@ -93,12 +93,6 @@
} }
}, },
"modules": { "modules": {
"achievements": {
"got_new_achievement": "{} hat die Errungenschaft {} freigeschaltet :D",
"commands": {
"check": "Alles klar, ich schaue eben nach... nom nom"
}
},
"auto_role": { "auto_role": {
"add": { "add": {
"error": { "error": {
@@ -151,19 +145,6 @@
} }
}, },
"base": { "base": {
"member_left_message": "{} hat uns leider verlassen :(",
"complaints": {
"title": "Beschwerde einreichen",
"label": "Beschwerde",
"message": "{} hat eine Beschwerde eingereicht:\n{}",
"response": "Danke für deine Beschwerde"
},
"bug": {
"title": "Bug melden",
"label": "Bug",
"message": "{} meldet einen Bug:\n{}",
"response": "Danke für dein Feedback :D"
},
"afk_command_channel_missing_message": "Zu unfähig einem Sprachkanal beizutreten?", "afk_command_channel_missing_message": "Zu unfähig einem Sprachkanal beizutreten?",
"afk_command_move_message": "Ich verschiebe dich ja schon... (◔_◔)", "afk_command_move_message": "Ich verschiebe dich ja schon... (◔_◔)",
"game_server": { "game_server": {

View File

@@ -15,7 +15,7 @@ __title__ = "bot_api"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.3" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports: # imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="3") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -15,7 +15,7 @@ __title__ = "bot_api.abc"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.3" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports: # imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="3") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -3,8 +3,8 @@
"Name": "bot-api", "Name": "bot-api",
"Version": { "Version": {
"Major": "1", "Major": "1",
"Minor": "1", "Minor": "0",
"Micro": "3" "Micro": "7"
}, },
"Author": "", "Author": "",
"AuthorEmail": "", "AuthorEmail": "",

View File

@@ -15,7 +15,7 @@ __title__ = "bot_api.configuration"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.3" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports # imports
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="3") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -1,13 +1,16 @@
import traceback
from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC
from cpl_core.console import Console
class ApiSettings(ConfigurationModelABC): class ApiSettings(ConfigurationModelABC):
def __init__(self, port: int = None, host: str = None, redirect_uri: bool = None): def __init__(self):
ConfigurationModelABC.__init__(self) ConfigurationModelABC.__init__(self)
self._port = 80 if port is None else port self._port = 80
self._host = "" if host is None else host self._host = ""
self._redirect_to_https = False if redirect_uri is None else redirect_uri self._redirect_to_https = False
@property @property
def port(self) -> int: def port(self) -> int:
@@ -20,3 +23,12 @@ class ApiSettings(ConfigurationModelABC):
@property @property
def redirect_to_https(self) -> bool: def redirect_to_https(self) -> bool:
return self._redirect_to_https return self._redirect_to_https
def from_dict(self, settings: dict):
try:
self._port = int(settings["Port"])
self._host = settings["Host"]
self._redirect_to_https = bool(settings["RedirectToHTTPS"])
except Exception as e:
Console.error(f"[ ERROR ] [ {__name__} ]: Reading error in {type(self).__name__} settings")
Console.error(f"[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}")

View File

@@ -1,22 +1,19 @@
import traceback
from datetime import datetime
from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC
from cpl_core.console import Console
class AuthenticationSettings(ConfigurationModelABC): class AuthenticationSettings(ConfigurationModelABC):
def __init__( def __init__(self):
self,
secret_key: str = None,
issuer: str = None,
audience: str = None,
token_expire_time: int = None,
refresh_token_expire_time: int = None,
):
ConfigurationModelABC.__init__(self) ConfigurationModelABC.__init__(self)
self._secret_key = "" if secret_key is None else secret_key self._secret_key = ""
self._issuer = "" if issuer is None else issuer self._issuer = ""
self._audience = "" if audience is None else audience self._audience = ""
self._token_expire_time = 0 if token_expire_time is None else token_expire_time self._token_expire_time = 0
self._refresh_token_expire_time = 0 if refresh_token_expire_time is None else refresh_token_expire_time self._refresh_token_expire_time = 0
@property @property
def secret_key(self) -> str: def secret_key(self) -> str:
@@ -37,3 +34,14 @@ class AuthenticationSettings(ConfigurationModelABC):
@property @property
def refresh_token_expire_time(self) -> int: def refresh_token_expire_time(self) -> int:
return self._refresh_token_expire_time return self._refresh_token_expire_time
def from_dict(self, settings: dict):
try:
self._secret_key = settings["SecretKey"]
self._issuer = settings["Issuer"]
self._audience = settings["Audience"]
self._token_expire_time = int(settings["TokenExpireTime"])
self._refresh_token_expire_time = int(settings["RefreshTokenExpireTime"])
except Exception as e:
Console.error(f"[ ERROR ] [ {__name__} ]: Reading error in {type(self).__name__} settings")
Console.error(f"[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}")

View File

@@ -1,23 +1,19 @@
import traceback
from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC
from cpl_core.console import Console
from cpl_query.extension import List from cpl_query.extension import List
class DiscordAuthenticationSettings(ConfigurationModelABC): class DiscordAuthenticationSettings(ConfigurationModelABC):
def __init__( def __init__(self):
self,
client_secret: str = None,
redirect_uri: str = None,
scope: list = None,
token_url: str = None,
auth_url: str = None,
):
ConfigurationModelABC.__init__(self) ConfigurationModelABC.__init__(self)
self._client_secret = "" if client_secret is None else client_secret self._client_secret = ""
self._redirect_url = "" if redirect_uri is None else redirect_uri self._redirect_url = ""
self._scope = List() if scope is None else List(str, scope) self._scope = List()
self._token_url = "" if token_url is None else token_url self._token_url = ""
self._auth_url = "" if auth_url is None else auth_url self._auth_url = ""
@property @property
def client_secret(self) -> str: def client_secret(self) -> str:
@@ -38,3 +34,14 @@ class DiscordAuthenticationSettings(ConfigurationModelABC):
@property @property
def auth_url(self) -> str: def auth_url(self) -> str:
return self._auth_url return self._auth_url
def from_dict(self, settings: dict):
try:
self._client_secret = settings["ClientSecret"]
self._redirect_url = settings["RedirectURL"]
self._scope = List(str, settings["Scope"])
self._token_url = settings["TokenURL"]
self._auth_url = settings["AuthURL"]
except Exception as e:
Console.error(f"[ ERROR ] [ {__name__} ]: Reading error in {type(self).__name__} settings")
Console.error(f"[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}")

View File

@@ -1,12 +1,22 @@
import traceback
from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC
from cpl_core.console import Console
class FrontendSettings(ConfigurationModelABC): class FrontendSettings(ConfigurationModelABC):
def __init__(self, url: str = None): def __init__(self):
ConfigurationModelABC.__init__(self) ConfigurationModelABC.__init__(self)
self._url = "" if url is None else url self._url = ""
@property @property
def url(self) -> str: def url(self) -> str:
return self._url return self._url
def from_dict(self, settings: dict):
try:
self._url = settings["URL"]
except Exception as e:
Console.error(f"[ ERROR ] [ {__name__} ]: Reading error in {type(self).__name__} settings")
Console.error(f"[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}")

View File

@@ -0,0 +1,49 @@
from typing import Optional
from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC
from cpl_cli.configuration.version_settings_name_enum import VersionSettingsNameEnum
class VersionSettings(ConfigurationModelABC):
def __init__(self, major: str = None, minor: str = None, micro: str = None):
ConfigurationModelABC.__init__(self)
self._major: Optional[str] = major
self._minor: Optional[str] = minor
self._micro: Optional[str] = micro
@property
def major(self) -> str:
return self._major
@property
def minor(self) -> str:
return self._minor
@property
def micro(self) -> str:
return self._micro
def to_str(self) -> str:
if self._micro is None:
return f"{self._major}.{self._minor}"
else:
return f"{self._major}.{self._minor}.{self._micro}"
def from_dict(self, settings: dict):
self._major = settings[VersionSettingsNameEnum.major.value]
self._minor = settings[VersionSettingsNameEnum.minor.value]
micro = settings[VersionSettingsNameEnum.micro.value]
if micro != "":
self._micro = micro
def to_dict(self) -> dict:
version = {
VersionSettingsNameEnum.major.value: self._major,
VersionSettingsNameEnum.minor.value: self._minor,
}
if self._micro is not None:
version[VersionSettingsNameEnum.micro.value] = self._micro
return version

View File

@@ -15,7 +15,7 @@ __title__ = "bot_api.controller"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.3" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports: # imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="3") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -1,5 +1,5 @@
from ariadne import graphql_sync from ariadne import graphql_sync
from ariadne.explorer import ExplorerPlayground from ariadne.explorer import ExplorerGraphiQL
from cpl_core.configuration import ConfigurationABC from cpl_core.configuration import ConfigurationABC
from cpl_core.environment import ApplicationEnvironmentABC from cpl_core.environment import ApplicationEnvironmentABC
from flask import request, jsonify from flask import request, jsonify
@@ -30,7 +30,7 @@ class GraphQLController:
if self._env.environment_name != "development": if self._env.environment_name != "development":
return "", 403 return "", 403
return ExplorerPlayground().html(None), 200 return ExplorerGraphiQL().html(None), 200
@Route.post(f"{BasePath}") @Route.post(f"{BasePath}")
@Route.authorize(by_api_key=True) @Route.authorize(by_api_key=True)

View File

@@ -15,7 +15,7 @@ __title__ = "bot_api.event"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.3" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports: # imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="3") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -15,7 +15,7 @@ __title__ = "bot_api.exception"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.3" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports: # imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="3") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -15,7 +15,7 @@ __title__ = "bot_api.filter"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.3" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports: # imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="3") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -15,7 +15,7 @@ __title__ = "bot_api.filter.discord"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.3" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports: # imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="3") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -15,7 +15,7 @@ __title__ = "bot_api.logging"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.3" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports: # imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="3") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -15,7 +15,7 @@ __title__ = "bot_api.model"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.3" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports: # imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="3") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -15,7 +15,7 @@ __title__ = "bot_api.model.discord"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.3" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports: # imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="3") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -15,7 +15,7 @@ __title__ = "bot_api.route"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.3" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports: # imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="3") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -15,7 +15,7 @@ __title__ = "bot_api.service"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.3" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports # imports
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="3") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -494,13 +494,8 @@ class AuthService(AuthServiceABC):
added_user = True added_user = True
db_user = self._auth_users.get_auth_user_by_email(user_dto.email) db_user = self._auth_users.get_auth_user_by_email(user_dto.email)
user_ids = db_user.users.select(lambda x: x.id) if db_user.users.count() == 0:
members.for_each(lambda x: self._auth_users.add_auth_user_user_rel(AuthUserUsersRelation(db_user, x)))
for user in self._users.get_users_by_discord_id(dc_id):
if user.id in user_ids:
continue
self._auth_users.add_auth_user_user_rel(AuthUserUsersRelation(db_user, user))
if db_user.confirmation_id is not None and not added_user: if db_user.confirmation_id is not None and not added_user:
raise ServiceException(ServiceErrorCode.Forbidden, "E-Mail not verified") raise ServiceException(ServiceErrorCode.Forbidden, "E-Mail not verified")

View File

@@ -15,7 +15,7 @@ __title__ = "bot_api.transformer"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.3" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports: # imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="3") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -15,7 +15,7 @@ __title__ = "bot_core"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.3" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports # imports
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="3") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -15,7 +15,7 @@ __title__ = "bot_core.abc"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.3" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports: # imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="3") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -1,14 +1,14 @@
from abc import ABC, abstractmethod from abc import ABC, abstractmethod
from datetime import datetime from datetime import datetime
from typing import Callable, Union from typing import Callable
import discord import discord
from cpl_query.extension import List from cpl_query.extension import List
from discord.ext.commands import Context from discord.ext.commands import Context
from bot_data.model.auto_role_rule import AutoRoleRule from bot_data.model.auto_role_rule import AutoRoleRule
from bot_data.model.server_config import ServerConfig
from bot_data.model.user import User from bot_data.model.user import User
from modules.base.configuration.base_server_settings import BaseServerSettings
class ClientUtilsABC(ABC): class ClientUtilsABC(ABC):
@@ -53,7 +53,7 @@ class ClientUtilsABC(ABC):
self, self,
created_at: datetime, created_at: datetime,
user: User, user: User,
settings: ServerConfig, settings: BaseServerSettings,
is_reaction: bool = False, is_reaction: bool = False,
) -> bool: ) -> bool:
pass pass
@@ -67,7 +67,3 @@ class ClientUtilsABC(ABC):
self, discord_channel_id: int, discord_message_id: int, rule: AutoRoleRule, guild: discord.Guild self, discord_channel_id: int, discord_message_id: int, rule: AutoRoleRule, guild: discord.Guild
): ):
pass pass
@abstractmethod
async def check_default_role(self, member: Union[discord.User, discord.Member]):
pass

View File

@@ -3,8 +3,8 @@
"Name": "bot-core", "Name": "bot-core",
"Version": { "Version": {
"Major": "1", "Major": "1",
"Minor": "1", "Minor": "0",
"Micro": "3" "Micro": "7"
}, },
"Author": "Sven Heidemann", "Author": "Sven Heidemann",
"AuthorEmail": "sven.heidemann@sh-edraft.de", "AuthorEmail": "sven.heidemann@sh-edraft.de",

View File

@@ -15,7 +15,7 @@ __title__ = "bot_core.configuration"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.3" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports: # imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="3") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -6,12 +6,12 @@ from bot_core.configuration.file_logging_settings import FileLoggingSettings
class BotLoggingSettings(ConfigurationModelABC): class BotLoggingSettings(ConfigurationModelABC):
def __init__(self, **kwargs: dict): def __init__(self, custom_logs: dict = None):
ConfigurationModelABC.__init__(self) ConfigurationModelABC.__init__(self)
self._files: List[FileLoggingSettings] = List(FileLoggingSettings) self._files: List[FileLoggingSettings] = List(FileLoggingSettings)
if kwargs is not None: if custom_logs is not None:
self._files_from_dict(kwargs) self._files_from_dict(custom_logs)
@property @property
def files(self) -> List[FileLoggingSettings]: def files(self) -> List[FileLoggingSettings]:
@@ -21,5 +21,6 @@ class BotLoggingSettings(ConfigurationModelABC):
files = List(FileLoggingSettings) files = List(FileLoggingSettings)
for s in settings: for s in settings:
settings[s]["Key"] = s settings[s]["Key"] = s
files.append(JSONProcessor.process(FileLoggingSettings, settings[s])) st = JSONProcessor.process(FileLoggingSettings, settings[s])
files.append(st)
self._files = files self._files = files

View File

@@ -0,0 +1,62 @@
import traceback
from cpl_core.configuration import ConfigurationModelABC
from cpl_core.console import Console
from cpl_query.extension import List
from bot_core.configuration.server_settings import ServerSettings
class BotSettings(ConfigurationModelABC):
def __init__(self):
ConfigurationModelABC.__init__(self)
self._servers: List[ServerSettings] = List(ServerSettings)
self._technicians: List[int] = List(int)
self._wait_for_restart = 2
self._wait_for_shutdown = 2
self._cache_max_messages = 1000
@property
def servers(self) -> List[ServerSettings]:
return self._servers
@property
def technicians(self) -> List[int]:
return self._technicians
@property
def wait_for_restart(self) -> int:
return self._wait_for_restart
@property
def wait_for_shutdown(self) -> int:
return self._wait_for_shutdown
@property
def cache_max_messages(self) -> int:
return self._cache_max_messages
def from_dict(self, settings: dict):
try:
self._technicians = settings["Technicians"]
self._wait_for_restart = settings["WaitForRestart"]
self._wait_for_shutdown = settings["WaitForShutdown"]
settings.pop("Technicians")
settings.pop("WaitForRestart")
settings.pop("WaitForShutdown")
if "CacheMaxMessages" in settings:
self._cache_max_messages = settings["CacheMaxMessages"]
settings.pop("CacheMaxMessages")
servers = List(ServerSettings)
for s in settings:
st = ServerSettings()
settings[s]["Id"] = s
st.from_dict(settings[s])
servers.append(st)
self._servers = servers
except Exception as e:
Console.error(f"[ ERROR ] [ {__name__} ]: Reading error in {type(self).__name__} settings")
Console.error(f"[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}")

View File

@@ -3,14 +3,13 @@ from enum import Enum
class FeatureFlagsEnum(Enum): class FeatureFlagsEnum(Enum):
# modules # modules
achievements_module = "AchievementsModule"
api_module = "ApiModule" api_module = "ApiModule"
admin_module = "AdminModule"
auto_role_module = "AutoRoleModule" auto_role_module = "AutoRoleModule"
base_module = "BaseModule" base_module = "BaseModule"
boot_log_module = "BootLogModule" boot_log_module = "BootLogModule"
core_module = "CoreModule" core_module = "CoreModule"
core_extension_module = "CoreExtensionModule" core_extension_module = "CoreExtensionModule"
config_module = "ConfigModule"
data_module = "DataModule" data_module = "DataModule"
database_module = "DatabaseModule" database_module = "DatabaseModule"
level_module = "LevelModule" level_module = "LevelModule"

View File

@@ -1,48 +1,33 @@
import traceback
from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC
from cpl_core.console import Console
from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
class FeatureFlagsSettings(ConfigurationModelABC): class FeatureFlagsSettings(ConfigurationModelABC):
_flags = { def __init__(self):
# modules
FeatureFlagsEnum.achievements_module.value: False, # 14.06.2023 #268
FeatureFlagsEnum.api_module.value: False, # 13.10.2022 #70
FeatureFlagsEnum.auto_role_module.value: False, # 03.10.2022 #54
FeatureFlagsEnum.base_module.value: True, # 02.10.2022 #48
FeatureFlagsEnum.boot_log_module.value: True, # 02.10.2022 #48
FeatureFlagsEnum.core_module.value: True, # 03.10.2022 #56
FeatureFlagsEnum.core_extension_module.value: True, # 03.10.2022 #56
FeatureFlagsEnum.data_module.value: True, # 03.10.2022 #56
FeatureFlagsEnum.database_module.value: True, # 02.10.2022 #48
FeatureFlagsEnum.moderator_module.value: False, # 02.10.2022 #48
FeatureFlagsEnum.permission_module.value: True, # 02.10.2022 #48
FeatureFlagsEnum.config_module.value: True, # 19.07.2023 #127
# features
FeatureFlagsEnum.api_only.value: False, # 13.10.2022 #70
FeatureFlagsEnum.presence.value: True, # 03.10.2022 #56
FeatureFlagsEnum.version_in_presence.value: False, # 21.03.2023 #253
}
def __init__(self, **kwargs: dict):
ConfigurationModelABC.__init__(self) ConfigurationModelABC.__init__(self)
if len(kwargs.keys()) == 0: self._flags = {
return # modules
FeatureFlagsEnum.api_module.value: False, # 13.10.2022 #70
for flag in [f.value for f in FeatureFlagsEnum]: FeatureFlagsEnum.admin_module.value: False, # 02.10.2022 #48
self._load_flag(kwargs, FeatureFlagsEnum(flag)) FeatureFlagsEnum.auto_role_module.value: True, # 03.10.2022 #54
FeatureFlagsEnum.base_module.value: True, # 02.10.2022 #48
@classmethod FeatureFlagsEnum.boot_log_module.value: True, # 02.10.2022 #48
def get_flag_from_dict(cls, flags: dict, key: FeatureFlagsEnum) -> bool: FeatureFlagsEnum.core_module.value: True, # 03.10.2022 #56
def get_flag(): FeatureFlagsEnum.core_extension_module.value: True, # 03.10.2022 #56
if key.value not in cls._flags: FeatureFlagsEnum.data_module.value: True, # 03.10.2022 #56
return False FeatureFlagsEnum.database_module.value: True, # 02.10.2022 #48
return cls._flags[key.value] FeatureFlagsEnum.moderator_module.value: False, # 02.10.2022 #48
FeatureFlagsEnum.permission_module.value: True, # 02.10.2022 #48
if key.value not in flags: # features
return get_flag() FeatureFlagsEnum.api_only.value: False, # 13.10.2022 #70
return flags[key.value] FeatureFlagsEnum.presence.value: True, # 03.10.2022 #56
FeatureFlagsEnum.version_in_presence.value: False, # 21.03.2023 #253
}
def get_flag(self, key: FeatureFlagsEnum) -> bool: def get_flag(self, key: FeatureFlagsEnum) -> bool:
if key.value not in self._flags: if key.value not in self._flags:
@@ -54,3 +39,11 @@ class FeatureFlagsSettings(ConfigurationModelABC):
return return
self._flags[key.value] = bool(settings[key.value]) self._flags[key.value] = bool(settings[key.value])
def from_dict(self, settings: dict):
try:
for flag in [f.value for f in FeatureFlagsEnum]:
self._load_flag(settings, FeatureFlagsEnum(flag))
except Exception as e:
Console.error(f"[ ERROR ] [ {__name__} ]: Reading error in {type(self).__name__} settings")
Console.error(f"[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}")

View File

@@ -17,3 +17,11 @@ class FileLoggingSettings(LoggingSettings):
@property @property
def key(self) -> str: def key(self) -> str:
return self._key return self._key
# def from_dict(self, settings: dict):
# try:
# self._key = settings["Key"]
# super().from_dict(settings)
# except Exception as e:
# Console.error(f"[ ERROR ] [ {__name__} ]: Reading error in {type(self).__name__} settings")
# Console.error(f"[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}")

View File

@@ -0,0 +1,28 @@
import traceback
from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC
from cpl_core.console import Console
class ServerSettings(ConfigurationModelABC):
def __init__(self):
ConfigurationModelABC.__init__(self)
self._id: int = 0
self._message_delete_timer: int = 0
@property
def id(self) -> int:
return self._id
@property
def message_delete_timer(self) -> int:
return self._message_delete_timer
def from_dict(self, settings: dict):
try:
self._id = int(settings["Id"])
self._message_delete_timer = int(settings["MessageDeleteTimer"])
except Exception as e:
Console.error(f"[ ERROR ] [ {__name__} ]: Reading error in settings")
Console.error(f"[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}")

View File

@@ -15,7 +15,7 @@ __title__ = "bot_core.core_extension"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.3" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports: # imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="3") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -11,7 +11,6 @@ from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
from bot_core.events.core_on_ready_event import CoreOnReadyEvent from bot_core.events.core_on_ready_event import CoreOnReadyEvent
from bot_core.pipes.date_time_offset_pipe import DateTimeOffsetPipe from bot_core.pipes.date_time_offset_pipe import DateTimeOffsetPipe
from bot_core.service.client_utils_service import ClientUtilsService from bot_core.service.client_utils_service import ClientUtilsService
from bot_core.service.config_service import ConfigService
from bot_core.service.data_integrity_service import DataIntegrityService from bot_core.service.data_integrity_service import DataIntegrityService
from bot_core.service.message_service import MessageService from bot_core.service.message_service import MessageService
@@ -24,7 +23,6 @@ class CoreModule(ModuleABC):
pass pass
def configure_services(self, services: ServiceCollectionABC, env: ApplicationEnvironmentABC): def configure_services(self, services: ServiceCollectionABC, env: ApplicationEnvironmentABC):
services.add_transient(ConfigService)
services.add_transient(MessageServiceABC, MessageService) services.add_transient(MessageServiceABC, MessageService)
services.add_transient(ClientUtilsABC, ClientUtilsService) services.add_transient(ClientUtilsABC, ClientUtilsService)
services.add_transient(DataIntegrityService) services.add_transient(DataIntegrityService)

View File

@@ -15,7 +15,7 @@ __title__ = "bot_core.events"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.3" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports: # imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="3") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -15,7 +15,7 @@ __title__ = "bot_core.exception"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.3" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports: # imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="3") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -15,7 +15,7 @@ __title__ = "bot_core.helper"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.3" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports: # imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="3") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -15,7 +15,7 @@ __title__ = "bot_core.logging"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.3" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports # imports
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="3") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -15,7 +15,7 @@ __title__ = "bot_core.pipes"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.3" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports # imports
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="3") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -15,7 +15,7 @@ __title__ = "bot_core.service"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.3" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports: # imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="3") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -1,5 +1,5 @@
from datetime import datetime from datetime import datetime
from typing import Callable, Union from typing import Callable
import discord import discord
from cpl_core.configuration import ConfigurationABC from cpl_core.configuration import ConfigurationABC
@@ -25,9 +25,9 @@ from bot_data.abc.user_message_count_per_hour_repository_abc import (
UserMessageCountPerHourRepositoryABC, UserMessageCountPerHourRepositoryABC,
) )
from bot_data.model.auto_role_rule import AutoRoleRule from bot_data.model.auto_role_rule import AutoRoleRule
from bot_data.model.server_config import ServerConfig
from bot_data.model.user import User from bot_data.model.user import User
from bot_data.model.user_message_count_per_hour import UserMessageCountPerHour from bot_data.model.user_message_count_per_hour import UserMessageCountPerHour
from modules.base.configuration.base_server_settings import BaseServerSettings
class ClientUtilsService(ClientUtilsABC): class ClientUtilsService(ClientUtilsABC):
@@ -139,7 +139,7 @@ class ClientUtilsService(ClientUtilsABC):
self, self,
created_at: datetime, created_at: datetime,
user: User, user: User,
settings: ServerConfig, settings: BaseServerSettings,
is_reaction: bool = False, is_reaction: bool = False,
) -> bool: ) -> bool:
umcph = None umcph = None
@@ -218,20 +218,3 @@ class ClientUtilsService(ClientUtilsABC):
f"Cannot add reaction {rule.emoji_name} to message: {discord_message_id}", f"Cannot add reaction {rule.emoji_name} to message: {discord_message_id}",
e, e,
) )
async def check_default_role(self, member: Union[discord.User, discord.Member]):
try:
server = self._servers.get_server_by_discord_id(member.guild.id)
settings: ServerConfig = self._config.get_configuration(f"ServerConfig_{server.discord_id}")
if settings.default_role_id is None:
return
default_role = member.guild.get_role(settings.default_role_id)
if default_role in member.roles:
return
await member.add_roles(default_role)
except Exception as e:
self._logger.error(__name__, f"Cannot check for default role for member {member.id}", e)

View File

@@ -1,50 +0,0 @@
from cpl_core.configuration import ConfigurationABC
from cpl_core.dependency_injection import ServiceProviderABC
from bot_core.configuration.feature_flags_settings import FeatureFlagsSettings
from bot_data.abc.server_config_repository_abc import ServerConfigRepositoryABC
from bot_data.abc.technician_config_repository_abc import TechnicianConfigRepositoryABC
from bot_data.model.server import Server
from bot_data.model.technician_config import TechnicianConfig
from bot_data.service.server_config_seeder import ServerConfigSeeder
from bot_data.service.technician_config_seeder import TechnicianConfigSeeder
from modules.permission.abc.permission_service_abc import PermissionServiceABC
class ConfigService:
def __init__(
self,
config: ConfigurationABC,
services: ServiceProviderABC,
technician_config_repo: TechnicianConfigRepositoryABC,
server_config_repo: ServerConfigRepositoryABC,
tech_seeder: TechnicianConfigSeeder,
server_seeder: ServerConfigSeeder,
):
self._config = config
self._services = services
self._technician_config_repo = technician_config_repo
self._server_config_repo = server_config_repo
self._tech_seeder = tech_seeder
self._server_seeder = server_seeder
async def reload_technician_config(self):
if not self._technician_config_repo.does_technician_config_exists():
await self._tech_seeder.seed()
technician_config = self._technician_config_repo.get_technician_config()
self._config.add_configuration(TechnicianConfig, technician_config)
self._config.add_configuration(FeatureFlagsSettings, FeatureFlagsSettings(**technician_config.feature_flags))
async def reload_server_config(self, server: Server):
if not self._server_config_repo.does_server_config_exists(server.id):
await self._server_seeder.seed()
server_config = self._server_config_repo.get_server_config_by_server(server.id)
self._config.add_configuration(
f"{type(server_config).__name__}_{server_config.server.discord_id}", server_config
)
permissions: PermissionServiceABC = self._services.get_service(PermissionServiceABC)
permissions.on_ready()

View File

@@ -6,7 +6,6 @@ from cpl_core.configuration import ConfigurationABC
from cpl_core.database.context import DatabaseContextABC from cpl_core.database.context import DatabaseContextABC
from cpl_discord.service import DiscordBotServiceABC from cpl_discord.service import DiscordBotServiceABC
from bot_core.abc.client_utils_abc import ClientUtilsABC
from bot_core.logging.database_logger import DatabaseLogger from bot_core.logging.database_logger import DatabaseLogger
from bot_core.pipes.date_time_offset_pipe import DateTimeOffsetPipe from bot_core.pipes.date_time_offset_pipe import DateTimeOffsetPipe
from bot_data.abc.client_repository_abc import ClientRepositoryABC from bot_data.abc.client_repository_abc import ClientRepositoryABC
@@ -20,13 +19,12 @@ from bot_data.abc.user_repository_abc import UserRepositoryABC
from bot_data.model.client import Client from bot_data.model.client import Client
from bot_data.model.known_user import KnownUser from bot_data.model.known_user import KnownUser
from bot_data.model.server import Server from bot_data.model.server import Server
from bot_data.model.server_config import ServerConfig
from bot_data.model.user import User from bot_data.model.user import User
from bot_data.model.user_joined_server import UserJoinedServer from bot_data.model.user_joined_server import UserJoinedServer
from bot_data.model.user_joined_voice_channel import UserJoinedVoiceChannel from bot_data.model.user_joined_voice_channel import UserJoinedVoiceChannel
from bot_data.service.seeder_service import SeederService from bot_data.service.seeder_service import SeederService
from bot_data.service.user_repository_service import ServerRepositoryABC from bot_data.service.user_repository_service import ServerRepositoryABC
from modules.achievements.achievement_service import AchievementService from modules.base.configuration.base_server_settings import BaseServerSettings
class DataIntegrityService: class DataIntegrityService:
@@ -44,8 +42,6 @@ class DataIntegrityService:
user_joins: UserJoinedServerRepositoryABC, user_joins: UserJoinedServerRepositoryABC,
user_joins_vc: UserJoinedVoiceChannelRepositoryABC, user_joins_vc: UserJoinedVoiceChannelRepositoryABC,
user_joined_gs: UserJoinedGameServerRepositoryABC, user_joined_gs: UserJoinedGameServerRepositoryABC,
achievement_service: AchievementService,
client_utils: ClientUtilsABC,
dtp: DateTimeOffsetPipe, dtp: DateTimeOffsetPipe,
): ):
self._config = config self._config = config
@@ -61,8 +57,6 @@ class DataIntegrityService:
self._user_joins = user_joins self._user_joins = user_joins
self._user_joins_vc = user_joins_vc self._user_joins_vc = user_joins_vc
self._user_joined_gs = user_joined_gs self._user_joined_gs = user_joined_gs
self._achievements = achievement_service
self._client_utils = client_utils
self._dtp = dtp self._dtp = dtp
self._is_for_shutdown = False self._is_for_shutdown = False
@@ -177,7 +171,7 @@ class DataIntegrityService:
self._logger.warn(__name__, f"User not found in database: {u.id}") self._logger.warn(__name__, f"User not found in database: {u.id}")
self._logger.debug(__name__, f"Add user: {u.id}") self._logger.debug(__name__, f"Add user: {u.id}")
self._users.add_user(User(u.id, 0, 0, 0, server)) self._users.add_user(User(u.id, 0, server))
self._db_context.save_changes() self._db_context.save_changes()
self._logger.debug(__name__, f"Added User: {u.id}") self._logger.debug(__name__, f"Added User: {u.id}")
@@ -258,7 +252,7 @@ class DataIntegrityService:
self._logger.debug(__name__, f"Start checking UserJoinedVoiceChannel table") self._logger.debug(__name__, f"Start checking UserJoinedVoiceChannel table")
for guild in self._bot.guilds: for guild in self._bot.guilds:
guild: discord.Guild = guild guild: discord.Guild = guild
settings: ServerConfig = self._config.get_configuration(f"ServerConfig_{guild.id}") settings: BaseServerSettings = self._config.get_configuration(f"BaseServerSettings_{guild.id}")
server = self._servers.find_server_by_discord_id(guild.id) server = self._servers.find_server_by_discord_id(guild.id)
if server is None: if server is None:
@@ -294,7 +288,7 @@ class DataIntegrityService:
self._user_joins_vc.update_user_joined_voice_channel(join) self._user_joins_vc.update_user_joined_voice_channel(join)
if self._is_for_shutdown: if self._is_for_shutdown:
user.xp += round(join.time * settings.xp_per_ontime_hour) user.xp = round(join.time * settings.xp_per_ontime_hour)
self._users.update_user(user) self._users.update_user(user)
self._db_context.save_changes() self._db_context.save_changes()
@@ -350,7 +344,7 @@ class DataIntegrityService:
f"Active UserJoinedGameServer found in database: {guild.id}:{member.id}@{join.joined_on}", f"Active UserJoinedGameServer found in database: {guild.id}:{member.id}@{join.joined_on}",
) )
join.leaved_on = datetime.now() join.leaved_on = datetime.now()
settings: ServerConfig = self._config.get_configuration(f"ServerConfig_{guild.id}") settings: BaseServerSettings = self._config.get_configuration(f"BaseServerSettings_{guild.id}")
if ( if (
(join.leaved_on - join.joined_on).total_seconds() / 60 / 60 (join.leaved_on - join.joined_on).total_seconds() / 60 / 60
@@ -359,42 +353,17 @@ class DataIntegrityService:
self._user_joined_gs.update_user_joined_game_server(join) self._user_joined_gs.update_user_joined_game_server(join)
if self._is_for_shutdown: if self._is_for_shutdown:
user.xp += round(join.time * settings.xp_per_ontime_hour) user.xp = round(join.time * settings.xp_per_ontime_hour)
self._users.update_user(user) self._users.update_user(user)
self._db_context.save_changes() self._db_context.save_changes()
except Exception as e: except Exception as e:
self._logger.error(__name__, f"Cannot get UserJoinedGameServer", e) self._logger.error(__name__, f"Cannot get UserJoinedGameServer", e)
async def _check_for_user_achievements(self): def check_data_integrity(self, is_for_shutdown=False):
self._logger.debug(__name__, f"Start checking UserGotAchievement table")
for guild in self._bot.guilds:
server = self._servers.find_server_by_discord_id(guild.id)
if server is None:
self._logger.fatal(__name__, f"Server not found in database: {guild.id}")
for member in guild.members:
if member.bot:
self._logger.trace(__name__, f"User {member.id} is ignored, because its a bot")
continue
user = self._users.find_user_by_discord_id_and_server_id(member.id, server.id)
if user is None:
self._logger.fatal(__name__, f"User not found in database: {member.id}")
await self._achievements.validate_achievements_for_user(user)
async def _check_default_role(self):
for guild in self._bot.guilds:
for member in guild.members:
await self._client_utils.check_default_role(member)
async def check_data_integrity(self, is_for_shutdown=False):
if is_for_shutdown != self._is_for_shutdown: if is_for_shutdown != self._is_for_shutdown:
self._is_for_shutdown = is_for_shutdown self._is_for_shutdown = is_for_shutdown
await self._check_default_role()
self._check_known_users() self._check_known_users()
self._check_servers() self._check_servers()
self._check_clients() self._check_clients()
@@ -402,4 +371,3 @@ class DataIntegrityService:
self._check_user_joins() self._check_user_joins()
self._check_user_joins_vc() self._check_user_joins_vc()
self._check_user_joined_gs() self._check_user_joined_gs()
await self._check_for_user_achievements()

View File

@@ -10,10 +10,10 @@ from discord import Interaction
from discord.ext.commands import Context from discord.ext.commands import Context
from bot_core.abc.message_service_abc import MessageServiceABC from bot_core.abc.message_service_abc import MessageServiceABC
from bot_core.configuration.server_settings import ServerSettings
from bot_core.helper.log_message_helper import LogMessageHelper from bot_core.helper.log_message_helper import LogMessageHelper
from bot_core.logging.message_logger import MessageLogger from bot_core.logging.message_logger import MessageLogger
from bot_data.abc.client_repository_abc import ClientRepositoryABC from bot_data.abc.client_repository_abc import ClientRepositoryABC
from bot_data.model.server_config import ServerConfig
class MessageService(MessageServiceABC): class MessageService(MessageServiceABC):
@@ -33,7 +33,7 @@ class MessageService(MessageServiceABC):
async def delete_messages(self, messages: List[discord.Message], guild_id: int, without_tracking=False): async def delete_messages(self, messages: List[discord.Message], guild_id: int, without_tracking=False):
self._logger.debug(__name__, f"Try to delete {messages.count()} messages") self._logger.debug(__name__, f"Try to delete {messages.count()} messages")
server_st: ServerConfig = self._config.get_configuration(f"ServerConfig_{guild_id}") server_st: ServerSettings = self._config.get_configuration(f"ServerSettings_{guild_id}")
await asyncio.sleep(server_st.message_delete_timer) await asyncio.sleep(server_st.message_delete_timer)
for message in messages: for message in messages:
await self.delete_message(message, mass_delete=True, without_tracking=without_tracking) await self.delete_message(message, mass_delete=True, without_tracking=without_tracking)
@@ -50,7 +50,7 @@ class MessageService(MessageServiceABC):
else None else None
) )
server_st: ServerConfig = self._config.get_configuration(f"ServerConfig_{guild_id}") server_st: ServerSettings = self._config.get_configuration(f"ServerSettings_{guild_id}")
if not mass_delete: if not mass_delete:
await asyncio.sleep(server_st.message_delete_timer) await asyncio.sleep(server_st.message_delete_timer)
self._logger.debug( self._logger.debug(

View File

@@ -15,7 +15,7 @@ __title__ = "bot_data"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.3" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports # imports
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="3") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -15,7 +15,7 @@ __title__ = "bot_data.abc"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.3" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports # imports
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="3") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -1,52 +0,0 @@
from abc import ABC, abstractmethod
from cpl_query.extension import List
from bot_data.model.achievement import Achievement
from bot_data.model.user_got_achievement import UserGotAchievement
class AchievementRepositoryABC(ABC):
@abstractmethod
def __init__(self):
pass
@abstractmethod
def get_achievements(self) -> List[Achievement]:
pass
@abstractmethod
def get_achievement_by_id(self, id: int) -> Achievement:
pass
@abstractmethod
def get_achievements_by_server_id(self, server_id: int) -> List[Achievement]:
pass
@abstractmethod
def get_achievements_by_user_id(self, user_id: int) -> List[Achievement]:
pass
@abstractmethod
def get_user_got_achievements_by_achievement_id(self, achievement_id: int) -> List[Achievement]:
pass
@abstractmethod
def add_achievement(self, achievement: Achievement):
pass
@abstractmethod
def update_achievement(self, achievement: Achievement):
pass
@abstractmethod
def delete_achievement(self, achievement: Achievement):
pass
@abstractmethod
def add_user_got_achievement(self, join: UserGotAchievement):
pass
@abstractmethod
def delete_user_got_achievement(self, join: UserGotAchievement):
pass

View File

@@ -14,10 +14,6 @@ class AuthUserRepositoryABC(ABC):
def __init__(self): def __init__(self):
pass pass
@abstractmethod
def get_auth_user_relation_ids(self, auth_user: AuthUser) -> List[int]:
pass
@abstractmethod @abstractmethod
def get_all_auth_users(self) -> List[AuthUser]: def get_all_auth_users(self) -> List[AuthUser]:
pass pass

View File

@@ -7,5 +7,5 @@ class DataSeederABC(ABC):
pass pass
@abstractmethod @abstractmethod
async def seed(self): def seed(self):
pass pass

View File

@@ -1,59 +0,0 @@
from abc import ABC, abstractmethod
from bot_data.model.server_afk_channel_ids_config import ServerAFKChannelIdsConfig
from bot_data.model.server_config import ServerConfig
from bot_data.model.server_team_role_ids_config import ServerTeamRoleIdsConfig
class ServerConfigRepositoryABC(ABC):
@abstractmethod
def __init__(self):
pass
@abstractmethod
def does_server_config_exists(self, server_id: int) -> bool:
pass
@abstractmethod
def get_server_config_by_server(self, server_id: int) -> ServerConfig:
pass
@abstractmethod
def get_server_config_by_id(self, config_id: int) -> ServerConfig:
pass
@abstractmethod
def add_server_config(self, server_config: ServerConfig):
pass
@abstractmethod
def update_server_config(self, server_config: ServerConfig):
pass
@abstractmethod
def delete_server_config(self, server_config: ServerConfig):
pass
@abstractmethod
def add_server_team_role_id_config(self, server_team_role_id: ServerTeamRoleIdsConfig):
pass
@abstractmethod
def update_server_team_role_id_config(self, server_team_role_id: ServerTeamRoleIdsConfig):
pass
@abstractmethod
def delete_server_team_role_id_config(self, server_team_role_id: ServerTeamRoleIdsConfig):
pass
@abstractmethod
def add_server_afk_channel_config(self, server_afk_channel: ServerAFKChannelIdsConfig):
pass
@abstractmethod
def update_server_afk_channel_config(self, server_afk_channel: ServerAFKChannelIdsConfig):
pass
@abstractmethod
def delete_server_afk_channel_config(self, server_afk_channel: ServerAFKChannelIdsConfig):
pass

View File

@@ -1,55 +0,0 @@
from abc import ABC, abstractmethod
from bot_data.model.technician_config import TechnicianConfig
from bot_data.model.technician_id_config import TechnicianIdConfig
from bot_data.model.technician_ping_url_config import TechnicianPingUrlConfig
class TechnicianConfigRepositoryABC(ABC):
@abstractmethod
def __init__(self):
pass
@abstractmethod
def does_technician_config_exists(self) -> bool:
pass
@abstractmethod
def get_technician_config(self) -> TechnicianConfig:
pass
@abstractmethod
def add_technician_config(self, technician_config: TechnicianConfig):
pass
@abstractmethod
def update_technician_config(self, technician_config: TechnicianConfig):
pass
@abstractmethod
def delete_technician_config(self, technician_config: TechnicianConfig):
pass
@abstractmethod
def add_technician_id_config(self, technician_id: TechnicianIdConfig):
pass
@abstractmethod
def update_technician_id_config(self, technician_id: TechnicianIdConfig):
pass
@abstractmethod
def delete_technician_id_config(self, technician_id: TechnicianIdConfig):
pass
@abstractmethod
def add_technician_ping_url_config(self, technician_ping_url: TechnicianPingUrlConfig):
pass
@abstractmethod
def update_technician_ping_url_config(self, technician_ping_url: TechnicianPingUrlConfig):
pass
@abstractmethod
def delete_technician_ping_url_config(self, technician_ping_url: TechnicianPingUrlConfig):
pass

View File

@@ -3,8 +3,8 @@
"Name": "bot-data", "Name": "bot-data",
"Version": { "Version": {
"Major": "1", "Major": "1",
"Minor": "1", "Minor": "0",
"Micro": "3" "Micro": "7"
}, },
"Author": "Sven Heidemann", "Author": "Sven Heidemann",
"AuthorEmail": "sven.heidemann@sh-edraft.de", "AuthorEmail": "sven.heidemann@sh-edraft.de",

View File

@@ -5,18 +5,14 @@ from cpl_discord.service.discord_collection_abc import DiscordCollectionABC
from bot_core.abc.module_abc import ModuleABC from bot_core.abc.module_abc import ModuleABC
from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
from bot_data.abc.achievement_repository_abc import AchievementRepositoryABC
from bot_data.abc.api_key_repository_abc import ApiKeyRepositoryABC from bot_data.abc.api_key_repository_abc import ApiKeyRepositoryABC
from bot_data.abc.auth_user_repository_abc import AuthUserRepositoryABC from bot_data.abc.auth_user_repository_abc import AuthUserRepositoryABC
from bot_data.abc.auto_role_repository_abc import AutoRoleRepositoryABC from bot_data.abc.auto_role_repository_abc import AutoRoleRepositoryABC
from bot_data.abc.client_repository_abc import ClientRepositoryABC from bot_data.abc.client_repository_abc import ClientRepositoryABC
from bot_data.abc.data_seeder_abc import DataSeederABC
from bot_data.abc.game_server_repository_abc import GameServerRepositoryABC from bot_data.abc.game_server_repository_abc import GameServerRepositoryABC
from bot_data.abc.known_user_repository_abc import KnownUserRepositoryABC from bot_data.abc.known_user_repository_abc import KnownUserRepositoryABC
from bot_data.abc.level_repository_abc import LevelRepositoryABC from bot_data.abc.level_repository_abc import LevelRepositoryABC
from bot_data.abc.server_config_repository_abc import ServerConfigRepositoryABC
from bot_data.abc.server_repository_abc import ServerRepositoryABC from bot_data.abc.server_repository_abc import ServerRepositoryABC
from bot_data.abc.technician_config_repository_abc import TechnicianConfigRepositoryABC
from bot_data.abc.user_game_ident_repository_abc import UserGameIdentRepositoryABC from bot_data.abc.user_game_ident_repository_abc import UserGameIdentRepositoryABC
from bot_data.abc.user_joined_game_server_repository_abc import UserJoinedGameServerRepositoryABC from bot_data.abc.user_joined_game_server_repository_abc import UserJoinedGameServerRepositoryABC
from bot_data.abc.user_joined_server_repository_abc import UserJoinedServerRepositoryABC from bot_data.abc.user_joined_server_repository_abc import UserJoinedServerRepositoryABC
@@ -28,7 +24,6 @@ from bot_data.abc.user_message_count_per_hour_repository_abc import (
) )
from bot_data.abc.user_repository_abc import UserRepositoryABC from bot_data.abc.user_repository_abc import UserRepositoryABC
from bot_data.abc.user_warnings_repository_abc import UserWarningsRepositoryABC from bot_data.abc.user_warnings_repository_abc import UserWarningsRepositoryABC
from bot_data.service.achievements_repository_service import AchievementRepositoryService
from bot_data.service.api_key_repository_service import ApiKeyRepositoryService from bot_data.service.api_key_repository_service import ApiKeyRepositoryService
from bot_data.service.auth_user_repository_service import AuthUserRepositoryService from bot_data.service.auth_user_repository_service import AuthUserRepositoryService
from bot_data.service.auto_role_repository_service import AutoRoleRepositoryService from bot_data.service.auto_role_repository_service import AutoRoleRepositoryService
@@ -38,11 +33,7 @@ from bot_data.service.game_server_repository_service import GameServerRepository
from bot_data.service.known_user_repository_service import KnownUserRepositoryService from bot_data.service.known_user_repository_service import KnownUserRepositoryService
from bot_data.service.level_repository_service import LevelRepositoryService from bot_data.service.level_repository_service import LevelRepositoryService
from bot_data.service.seeder_service import SeederService from bot_data.service.seeder_service import SeederService
from bot_data.service.server_config_repository_service import ServerConfigRepositoryService
from bot_data.service.server_config_seeder import ServerConfigSeeder
from bot_data.service.server_repository_service import ServerRepositoryService from bot_data.service.server_repository_service import ServerRepositoryService
from bot_data.service.technician_config_repository_service import TechnicianConfigRepositoryService
from bot_data.service.technician_config_seeder import TechnicianConfigSeeder
from bot_data.service.user_game_ident_repository_service import UserGameIdentRepositoryService from bot_data.service.user_game_ident_repository_service import UserGameIdentRepositoryService
from bot_data.service.user_joined_game_server_repository_service import UserJoinedGameServerRepositoryService from bot_data.service.user_joined_game_server_repository_service import UserJoinedGameServerRepositoryService
from bot_data.service.user_joined_server_repository_service import ( from bot_data.service.user_joined_server_repository_service import (
@@ -86,10 +77,5 @@ class DataModule(ModuleABC):
) )
services.add_transient(GameServerRepositoryABC, GameServerRepositoryService) services.add_transient(GameServerRepositoryABC, GameServerRepositoryService)
services.add_transient(UserGameIdentRepositoryABC, UserGameIdentRepositoryService) services.add_transient(UserGameIdentRepositoryABC, UserGameIdentRepositoryService)
services.add_transient(AchievementRepositoryABC, AchievementRepositoryService)
services.add_transient(TechnicianConfigRepositoryABC, TechnicianConfigRepositoryService)
services.add_transient(ServerConfigRepositoryABC, ServerConfigRepositoryService)
services.add_transient(SeederService) services.add_transient(SeederService)
services.add_transient(DataSeederABC, TechnicianConfigSeeder)
services.add_transient(DataSeederABC, ServerConfigSeeder)

View File

@@ -11,7 +11,6 @@ class DBContext(DatabaseContext):
self._logger = logger self._logger = logger
DatabaseContext.__init__(self) DatabaseContext.__init__(self)
self._fails = 0
def connect(self, database_settings: DatabaseSettings): def connect(self, database_settings: DatabaseSettings):
try: try:
@@ -33,11 +32,7 @@ class DBContext(DatabaseContext):
try: try:
return super(DBContext, self).select(statement) return super(DBContext, self).select(statement)
except Exception as e: except Exception as e:
if self._fails >= 3:
self._logger.fatal(__name__, f"Database error caused by {statement}", e)
self._logger.error(__name__, f"Database error caused by {statement}", e) self._logger.error(__name__, f"Database error caused by {statement}", e)
self._fails += 1
try: try:
time.sleep(0.5) time.sleep(0.5)
return self.select(statement) return self.select(statement)

View File

@@ -15,7 +15,7 @@ __title__ = "bot_data.migration"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.3" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports # imports
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="3") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -1,127 +0,0 @@
from bot_core.logging.database_logger import DatabaseLogger
from bot_data.abc.migration_abc import MigrationABC
from bot_data.db_context import DBContext
class AchievementsMigration(MigrationABC):
name = "1.1.0_AchievementsMigration"
def __init__(self, logger: DatabaseLogger, db: DBContext):
MigrationABC.__init__(self)
self._logger = logger
self._db = db
self._cursor = db.cursor
def upgrade(self):
self._logger.debug(__name__, "Running upgrade")
self._cursor.execute(
str(
f"""
CREATE TABLE IF NOT EXISTS `Achievements` (
`Id` BIGINT NOT NULL AUTO_INCREMENT,
`Name` VARCHAR(255) NOT NULL,
`Description` VARCHAR(255) NOT NULL,
`Attribute` VARCHAR(255) NOT NULL,
`Operator` VARCHAR(255) NOT NULL,
`Value` VARCHAR(255) NOT NULL,
`ServerId` BIGINT,
`CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6),
`LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
PRIMARY KEY(`Id`),
FOREIGN KEY (`ServerId`) REFERENCES `Servers`(`ServerId`)
);
"""
)
)
self._cursor.execute(
str(
f"""
CREATE TABLE IF NOT EXISTS `AchievementsHistory`
(
`Id` BIGINT(20) NOT NULL,
`Name` VARCHAR(255) NOT NULL,
`Description` VARCHAR(255) NOT NULL,
`Attribute` VARCHAR(255) NOT NULL,
`Operator` VARCHAR(255) NOT NULL,
`Value` VARCHAR(255) NOT NULL,
`ServerId` BIGINT,
`Deleted` BOOL DEFAULT FALSE,
`DateFrom` DATETIME(6) NOT NULL,
`DateTo` DATETIME(6) NOT NULL
);
"""
)
)
self._cursor.execute(
str(
f"""
CREATE TABLE IF NOT EXISTS `UserGotAchievements` (
`Id` BIGINT NOT NULL AUTO_INCREMENT,
`UserId` BIGINT,
`AchievementId` BIGINT,
`CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6),
`LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
PRIMARY KEY(`Id`),
FOREIGN KEY (`UserId`) REFERENCES `Users`(`UserId`),
FOREIGN KEY (`AchievementId`) REFERENCES `Achievements`(`Id`)
);
"""
)
)
# A join table history between users and achievements is not necessary.
self._cursor.execute(str(f"""ALTER TABLE Users ADD MessageCount BIGINT NOT NULL DEFAULT 0 AFTER XP;"""))
self._cursor.execute(str(f"""ALTER TABLE Users ADD ReactionCount BIGINT NOT NULL DEFAULT 0 AFTER XP;"""))
self._cursor.execute(str(f"""ALTER TABLE UsersHistory ADD MessageCount BIGINT NOT NULL DEFAULT 0 AFTER XP;"""))
self._cursor.execute(str(f"""ALTER TABLE UsersHistory ADD ReactionCount BIGINT NOT NULL DEFAULT 0 AFTER XP;"""))
self._cursor.execute(str(f"""DROP TRIGGER IF EXISTS `TR_AchievementsUpdate`;"""))
self._cursor.execute(
str(
f"""
CREATE TRIGGER `TR_AchievementsUpdate`
AFTER UPDATE
ON `Achievements`
FOR EACH ROW
BEGIN
INSERT INTO `AchievementsHistory` (
`Id`, `Name`, `Description`, `Attribute`, `Operator`, `Value`, `ServerId`, `DateFrom`, `DateTo`
)
VALUES (
OLD.Id, OLD.Name, OLD.Description, OLD.Attribute, OLD.Operator, OLD.Value, OLD.ServerId, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6)
);
END;
"""
)
)
self._cursor.execute(str(f"""DROP TRIGGER IF EXISTS `TR_AchievementsDelete`;"""))
self._cursor.execute(
str(
f"""
CREATE TRIGGER `TR_AchievementsDelete`
AFTER DELETE
ON `Achievements`
FOR EACH ROW
BEGIN
INSERT INTO `AchievementsHistory` (
`Id`, `Name`, `Description`, `Attribute`, `Operator`, `Value`, `ServerId`, `Deleted`, `DateFrom`, `DateTo`
)
VALUES (
OLD.Id, OLD.Name, OLD.Description, OLD.Attribute, OLD.Operator, OLD.Value, OLD.ServerId, TRUE, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6)
);
END;
"""
)
)
def downgrade(self):
self._cursor.execute("DROP TABLE `Achievements`;")
self._cursor.execute(str(f"""ALTER TABLE Users DROP COLUMN MessageCount;"""))
self._cursor.execute(str(f"""ALTER TABLE Users DROP COLUMN ReactionCount;"""))

View File

@@ -1,29 +0,0 @@
from bot_core.logging.database_logger import DatabaseLogger
from bot_data.abc.migration_abc import MigrationABC
from bot_data.db_context import DBContext
class ConfigFeatureFlagsMigration(MigrationABC):
name = "1.1.0_ConfigFeatureFlagsMigration"
def __init__(self, logger: DatabaseLogger, db: DBContext):
MigrationABC.__init__(self)
self._logger = logger
self._db = db
self._cursor = db.cursor
def upgrade(self):
self._logger.debug(__name__, "Running upgrade")
self._cursor.execute(
str("""ALTER TABLE CFG_Technician ADD FeatureFlags JSON NULL DEFAULT ('{}') AFTER CacheMaxMessages;""")
)
self._cursor.execute(
str("""ALTER TABLE CFG_Server ADD FeatureFlags JSON NULL DEFAULT ('{}') AFTER LoginMessageChannelId;""")
)
def downgrade(self):
self._logger.debug(__name__, "Running downgrade")
self._cursor.execute("ALTER TABLE CFG_Technician DROP COLUMN FeatureFlags;")
self._cursor.execute("ALTER TABLE CFG_Server DROP COLUMN FeatureFlags;")

View File

@@ -1,155 +0,0 @@
import os
from bot_core.logging.database_logger import DatabaseLogger
from bot_data.abc.migration_abc import MigrationABC
from bot_data.db_context import DBContext
class ConfigMigration(MigrationABC):
name = "1.1.0_ConfigMigration"
def __init__(self, logger: DatabaseLogger, db: DBContext):
MigrationABC.__init__(self)
self._logger = logger
self._db = db
self._cursor = db.cursor
def _exec(self, file: str):
path = f"{os.path.dirname(os.path.realpath(__file__))}/db_history_scripts"
sql = open(f"{path}/{file}").read()
for statement in sql.split("\n\n"):
self._cursor.execute(statement + ";")
def upgrade(self):
self._logger.debug(__name__, "Running upgrade")
self._server_upgrade()
self._technician_upgrade()
self._exec("config/server.sql")
self._exec("config/server_afk_channels.sql")
self._exec("config/server_team_roles.sql")
self._exec("config/technician.sql")
self._exec("config/technician_ids.sql")
self._exec("config/technician_ping_urls.sql")
def _server_upgrade(self):
self._cursor.execute(
str(
f"""
CREATE TABLE IF NOT EXISTS `CFG_Server` (
`Id` BIGINT NOT NULL AUTO_INCREMENT,
`MessageDeleteTimer` BIGINT NOT NULL DEFAULT 6,
`NotificationChatId` BIGINT NOT NULL,
`MaxVoiceStateHours` BIGINT NOT NULL DEFAULT 6,
`XpPerMessage` BIGINT NOT NULL DEFAULT 1,
`XpPerReaction` BIGINT NOT NULL DEFAULT 1,
`MaxMessageXpPerHour` BIGINT NOT NULL DEFAULT 20,
`XpPerOntimeHour` BIGINT NOT NULL DEFAULT 10,
`XpPerEventParticipation` BIGINT NOT NULL DEFAULT 10,
`XpPerAchievement` BIGINT NOT NULL DEFAULT 10,
`AFKCommandChannelId` BIGINT NOT NULL,
`HelpVoiceChannelId` BIGINT NOT NULL,
`TeamChannelId` BIGINT NOT NULL,
`LoginMessageChannelId` BIGINT NOT NULL,
`ServerId` BIGINT NOT NULL,
`CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6),
`LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
PRIMARY KEY(`Id`),
FOREIGN KEY (`ServerId`) REFERENCES `Servers`(`ServerId`)
);
"""
)
)
self._cursor.execute(
str(
f"""
CREATE TABLE IF NOT EXISTS `CFG_ServerAFKChannelIds` (
`Id` BIGINT NOT NULL AUTO_INCREMENT,
`ChannelId` BIGINT NOT NULL,
`ServerId` BIGINT NOT NULL,
`CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6),
`LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
PRIMARY KEY(`Id`),
FOREIGN KEY (`ServerId`) REFERENCES `Servers`(`ServerId`)
);
"""
)
)
self._cursor.execute(
str(
f"""
CREATE TABLE IF NOT EXISTS `CFG_ServerTeamRoleIds` (
`Id` BIGINT NOT NULL AUTO_INCREMENT,
`RoleId` BIGINT NOT NULL,
`TeamMemberType` ENUM('Moderator', 'Admin') NOT NULL,
`ServerId` BIGINT NOT NULL,
`CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6),
`LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
PRIMARY KEY(`Id`),
FOREIGN KEY (`ServerId`) REFERENCES `Servers`(`ServerId`)
);
"""
)
)
def _technician_upgrade(self):
self._cursor.execute(
str(
f"""
CREATE TABLE IF NOT EXISTS `CFG_Technician` (
`Id` BIGINT NOT NULL AUTO_INCREMENT,
`HelpCommandReferenceUrl` VARCHAR(255) NOT NULL,
`WaitForRestart` BIGINT NOT NULL DEFAULT 8,
`WaitForShutdown` BIGINT NOT NULL DEFAULT 8,
`CacheMaxMessages` BIGINT NOT NULL DEFAULT 1000000,
`CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6),
`LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
PRIMARY KEY(`Id`)
);
"""
)
)
self._cursor.execute(
str(
f"""
CREATE TABLE IF NOT EXISTS `CFG_TechnicianPingUrls` (
`Id` BIGINT NOT NULL AUTO_INCREMENT,
`URL` VARCHAR(255) NOT NULL,
`CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6),
`LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
PRIMARY KEY(`Id`)
);
"""
)
)
self._cursor.execute(
str(
f"""
CREATE TABLE IF NOT EXISTS `CFG_TechnicianIds` (
`Id` BIGINT NOT NULL AUTO_INCREMENT,
`TechnicianId` BIGINT NOT NULL,
`CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6),
`LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
PRIMARY KEY(`Id`)
);
"""
)
)
def downgrade(self):
self._logger.debug(__name__, "Running downgrade")
self._server_downgrade()
self._technician_downgrade()
def _server_downgrade(self):
self._cursor.execute("DROP TABLE `CFG_Server`;")
def _technician_downgrade(self):
self._cursor.execute("DROP TABLE `CFG_Technician`;")
self._cursor.execute("DROP TABLE `CFG_TechnicianPingUrls`;")
self._cursor.execute("DROP TABLE `CFG_TechnicianIds`;")

View File

@@ -1,117 +0,0 @@
CREATE TABLE IF NOT EXISTS `CFG_ServerHistory`
(
`Id` BIGINT(20) NOT NULL,
`MessageDeleteTimer` BIGINT NOT NULL DEFAULT 6,
`NotificationChatId` BIGINT NOT NULL,
`MaxVoiceStateHours` BIGINT NOT NULL DEFAULT 6,
`XpPerMessage` BIGINT NOT NULL DEFAULT 1,
`XpPerReaction` BIGINT NOT NULL DEFAULT 1,
`MaxMessageXpPerHour` BIGINT NOT NULL DEFAULT 20,
`XpPerOntimeHour` BIGINT NOT NULL DEFAULT 10,
`XpPerEventParticipation` BIGINT NOT NULL DEFAULT 10,
`XpPerAchievement` BIGINT NOT NULL DEFAULT 10,
`AFKCommandChannelId` BIGINT NOT NULL,
`HelpVoiceChannelId` BIGINT NOT NULL,
`TeamChannelId` BIGINT NOT NULL,
`LoginMessageChannelId` BIGINT NOT NULL,
`ServerId` BIGINT NOT NULL,
`Deleted` BOOL DEFAULT FALSE,
`DateFrom` DATETIME(6) NOT NULL,
`DateTo` DATETIME(6) NOT NULL
);
DROP TRIGGER IF EXISTS `TR_CFG_ServerUpdate`;
CREATE TRIGGER `TR_CFG_ServerUpdate`
AFTER UPDATE
ON `CFG_Server`
FOR EACH ROW
BEGIN
INSERT INTO `CFG_ServerHistory` (
`Id`,
`MessageDeleteTimer`,
`NotificationChatId`,
`MaxVoiceStateHours`,
`XpPerMessage`,
`XpPerReaction`,
`MaxMessageXpPerHour`,
`XpPerOntimeHour`,
`XpPerEventParticipation`,
`XpPerAchievement`,
`AFKCommandChannelId`,
`HelpVoiceChannelId`,
`TeamChannelId`,
`LoginMessageChannelId`,
`ServerId`,
`DateFrom`,
`DateTo`
)
VALUES (
OLD.Id,
OLD.MessageDeleteTimer,
OLD.NotificationChatId,
OLD.MaxVoiceStateHours,
OLD.XpPerMessage,
OLD.XpPerReaction,
OLD.MaxMessageXpPerHour,
OLD.XpPerOntimeHour,
OLD.XpPerEventParticipation,
OLD.XpPerAchievement,
OLD.AFKCommandChannelId,
OLD.HelpVoiceChannelId,
OLD.TeamChannelId,
OLD.LoginMessageChannelId,
OLD.ServerId,
OLD.LastModifiedAt,
CURRENT_TIMESTAMP(6)
);
END;
DROP TRIGGER IF EXISTS `TR_CFG_ServerDelete`;
CREATE TRIGGER `TR_CFG_ServerDelete`
AFTER DELETE
ON `CFG_Server`
FOR EACH ROW
BEGIN
INSERT INTO `CFG_ServerHistory` (
`Id`,
`MessageDeleteTimer`,
`NotificationChatId`,
`MaxVoiceStateHours`,
`XpPerMessage`,
`XpPerReaction`,
`MaxMessageXpPerHour`,
`XpPerOntimeHour`,
`XpPerEventParticipation`,
`XpPerAchievement`,
`AFKCommandChannelId`,
`HelpVoiceChannelId`,
`TeamChannelId`,
`LoginMessageChannelId`,
`ServerId`,
`Deleted`,
`DateFrom`,
`DateTo`
)
VALUES (
OLD.Id,
OLD.MessageDeleteTimer,
OLD.NotificationChatId,
OLD.MaxVoiceStateHours,
OLD.XpPerMessage,
OLD.XpPerReaction,
OLD.MaxMessageXpPerHour,
OLD.XpPerOntimeHour,
OLD.XpPerEventParticipation,
OLD.XpPerAchievement,
OLD.AFKCommandChannelId,
OLD.HelpVoiceChannelId,
OLD.TeamChannelId,
OLD.LoginMessageChannelId,
OLD.ServerId,
TRUE,
OLD.LastModifiedAt,
CURRENT_TIMESTAMP(6)
);
END;

View File

@@ -1,57 +0,0 @@
CREATE TABLE IF NOT EXISTS `CFG_ServerAFKChannelIdsHistory`
(
`Id` BIGINT(20) NOT NULL,
`ChannelId` BIGINT NOT NULL,
`ServerId` BIGINT NOT NULL,
`Deleted` BOOL DEFAULT FALSE,
`DateFrom` DATETIME(6) NOT NULL,
`DateTo` DATETIME(6) NOT NULL
);
DROP TRIGGER IF EXISTS `TR_CFG_ServerAFKChannelIdsUpdate`;
CREATE TRIGGER `TR_CFG_ServerAFKChannelIdsUpdate`
AFTER UPDATE
ON `CFG_ServerAFKChannelIds`
FOR EACH ROW
BEGIN
INSERT INTO `CFG_ServerAFKChannelIdsHistory` (
`Id`,
`ChannelId`,
`ServerId`,
`DateFrom`,
`DateTo`
)
VALUES (
OLD.Id,
OLD.ChannelId,
OLD.ServerId,
OLD.LastModifiedAt,
CURRENT_TIMESTAMP(6)
);
END;
DROP TRIGGER IF EXISTS `TR_CFG_ServerAFKChannelIdsDelete`;
CREATE TRIGGER `TR_CFG_ServerAFKChannelIdsDelete`
AFTER DELETE
ON `CFG_ServerAFKChannelIds`
FOR EACH ROW
BEGIN
INSERT INTO `CFG_ServerAFKChannelIdsHistory` (
`Id`,
`ChannelId`,
`ServerId`,
`Deleted`,
`DateFrom`,
`DateTo`
)
VALUES (
OLD.Id,
OLD.ChannelId,
OLD.ServerId,
TRUE,
OLD.LastModifiedAt,
CURRENT_TIMESTAMP(6)
);
END;

View File

@@ -1,62 +0,0 @@
CREATE TABLE IF NOT EXISTS `CFG_ServerTeamRoleIdsHistory`
(
`Id` BIGINT(20) NOT NULL,
`RoleId` BIGINT NOT NULL,
`TeamMemberType` ENUM('Moderator', 'Admin') NOT NULL,
`ServerId` BIGINT NOT NULL,
`Deleted` BOOL DEFAULT FALSE,
`DateFrom` DATETIME(6) NOT NULL,
`DateTo` DATETIME(6) NOT NULL
);
DROP TRIGGER IF EXISTS `TR_CFG_ServerTeamRoleIdsUpdate`;
CREATE TRIGGER `TR_CFG_ServerTeamRoleIdsUpdate`
AFTER UPDATE
ON `CFG_ServerTeamRoleIds`
FOR EACH ROW
BEGIN
INSERT INTO `CFG_ServerTeamRoleIdsHistory` (
`Id`,
`RoleId`,
`TeamMemberType`,
`ServerId`,
`DateFrom`,
`DateTo`
)
VALUES (
OLD.Id,
OLD.RoleId,
OLD.TeamMemberType,
OLD.ServerId,
OLD.LastModifiedAt,
CURRENT_TIMESTAMP(6)
);
END;
DROP TRIGGER IF EXISTS `TR_CFG_ServerTeamRoleIdsDelete`;
CREATE TRIGGER `TR_CFG_ServerTeamRoleIdsDelete`
AFTER DELETE
ON `CFG_ServerTeamRoleIds`
FOR EACH ROW
BEGIN
INSERT INTO `CFG_ServerTeamRoleIdsHistory` (
`Id`,
`RoleId`,
`TeamMemberType`,
`ServerId`,
`Deleted`,
`DateFrom`,
`DateTo`
)
VALUES (
OLD.Id,
OLD.RoleId,
OLD.TeamMemberType,
OLD.ServerId,
TRUE,
OLD.LastModifiedAt,
CURRENT_TIMESTAMP(6)
);
END;

View File

@@ -1,67 +0,0 @@
CREATE TABLE IF NOT EXISTS `CFG_TechnicianHistory`
(
`Id` BIGINT(20) NOT NULL,
`HelpCommandReferenceUrl` VARCHAR(255) NOT NULL,
`WaitForRestart` BIGINT NOT NULL DEFAULT 8,
`WaitForShutdown` BIGINT NOT NULL DEFAULT 8,
`CacheMaxMessages` BIGINT NOT NULL DEFAULT 1000000,
`Deleted` BOOL DEFAULT FALSE,
`DateFrom` DATETIME(6) NOT NULL,
`DateTo` DATETIME(6) NOT NULL
);
DROP TRIGGER IF EXISTS `TR_CFG_TechnicianUpdate`;
CREATE TRIGGER `TR_CFG_TechnicianUpdate`
AFTER UPDATE
ON `CFG_Technician`
FOR EACH ROW
BEGIN
INSERT INTO `CFG_TechnicianHistory` (
`Id`,
`HelpCommandReferenceUrl`,
`WaitForRestart`,
`WaitForShutdown`,
`CacheMaxMessages`,
`DateFrom`,
`DateTo`
)
VALUES (
OLD.Id,
OLD.HelpCommandReferenceUrl,
OLD.WaitForRestart,
OLD.WaitForShutdown,
OLD.CacheMaxMessages,
OLD.LastModifiedAt,
CURRENT_TIMESTAMP(6)
);
END;
DROP TRIGGER IF EXISTS `TR_CFG_TechnicianDelete`;
CREATE TRIGGER `TR_CFG_TechnicianDelete`
AFTER DELETE
ON `CFG_Technician`
FOR EACH ROW
BEGIN
INSERT INTO `CFG_TechnicianHistory` (
`Id`,
`HelpCommandReferenceUrl`,
`WaitForRestart`,
`WaitForShutdown`,
`CacheMaxMessages`,
`Deleted`,
`DateFrom`,
`DateTo`
)
VALUES (
OLD.Id,
OLD.HelpCommandReferenceUrl,
OLD.WaitForRestart,
OLD.WaitForShutdown,
OLD.CacheMaxMessages,
TRUE,
OLD.LastModifiedAt,
CURRENT_TIMESTAMP(6)
);
END;

View File

@@ -1,52 +0,0 @@
CREATE TABLE IF NOT EXISTS `CFG_TechnicianIdsHistory`
(
`Id` BIGINT(20) NOT NULL,
`TechnicianId` BIGINT NOT NULL,
`Deleted` BOOL DEFAULT FALSE,
`DateFrom` DATETIME(6) NOT NULL,
`DateTo` DATETIME(6) NOT NULL
);
DROP TRIGGER IF EXISTS `TR_CFG_TechnicianIdsUpdate`;
CREATE TRIGGER `TR_CFG_TechnicianIdsUpdate`
AFTER UPDATE
ON `CFG_TechnicianIds`
FOR EACH ROW
BEGIN
INSERT INTO `CFG_TechnicianIdsHistory` (
`Id`,
`TechnicianId`,
`DateFrom`,
`DateTo`
)
VALUES (
OLD.Id,
OLD.TechnicianId,
OLD.LastModifiedAt,
CURRENT_TIMESTAMP(6)
);
END;
DROP TRIGGER IF EXISTS `TR_CFG_TechnicianIdsDelete`;
CREATE TRIGGER `TR_CFG_TechnicianIdsDelete`
AFTER DELETE
ON `CFG_TechnicianIds`
FOR EACH ROW
BEGIN
INSERT INTO `CFG_TechnicianIdsHistory` (
`Id`,
`TechnicianId`,
`Deleted`,
`DateFrom`,
`DateTo`
)
VALUES (
OLD.Id,
OLD.TechnicianId,
TRUE,
OLD.LastModifiedAt,
CURRENT_TIMESTAMP(6)
);
END;

View File

@@ -1,52 +0,0 @@
CREATE TABLE IF NOT EXISTS `CFG_TechnicianPingUrlsHistory`
(
`Id` BIGINT(20) NOT NULL,
`URL` VARCHAR(255) NOT NULL,
`Deleted` BOOL DEFAULT FALSE,
`DateFrom` DATETIME(6) NOT NULL,
`DateTo` DATETIME(6) NOT NULL
);
DROP TRIGGER IF EXISTS `TR_CFG_TechnicianPingUrlsUpdate`;
CREATE TRIGGER `TR_CFG_TechnicianPingUrlsUpdate`
AFTER UPDATE
ON `CFG_TechnicianPingUrls`
FOR EACH ROW
BEGIN
INSERT INTO `CFG_TechnicianPingUrlsHistory` (
`Id`,
`URL`,
`DateFrom`,
`DateTo`
)
VALUES (
OLD.Id,
OLD.URL,
OLD.LastModifiedAt,
CURRENT_TIMESTAMP(6)
);
END;
DROP TRIGGER IF EXISTS `TR_CFG_TechnicianPingUrlsDelete`;
CREATE TRIGGER `TR_CFG_TechnicianPingUrlsDelete`
AFTER DELETE
ON `CFG_TechnicianPingUrls`
FOR EACH ROW
BEGIN
INSERT INTO `CFG_TechnicianPingUrlsHistory` (
`Id`,
`URL`,
`Deleted`,
`DateFrom`,
`DateTo`
)
VALUES (
OLD.Id,
OLD.URL,
TRUE,
OLD.LastModifiedAt,
CURRENT_TIMESTAMP(6)
);
END;

View File

@@ -1,34 +0,0 @@
from bot_core.logging.database_logger import DatabaseLogger
from bot_data.abc.migration_abc import MigrationABC
from bot_data.db_context import DBContext
class DefaultRoleMigration(MigrationABC):
name = "1.1.3_DefaultRoleMigration"
def __init__(self, logger: DatabaseLogger, db: DBContext):
MigrationABC.__init__(self)
self._logger = logger
self._db = db
self._cursor = db.cursor
def upgrade(self):
self._logger.debug(__name__, "Running upgrade")
self._cursor.execute(
str(
f"""
ALTER TABLE CFG_Server
ADD DefaultRoleId BIGINT NULL AFTER LoginMessageChannelId;
"""
)
)
def downgrade(self):
self._cursor.execute(
str(
f"""
ALTER TABLE CFG_Server DROP COLUMN DefaultRoleId;
"""
)
)

View File

@@ -15,7 +15,7 @@ __title__ = "bot_data.model"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.3" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports # imports
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="3") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -1,158 +0,0 @@
from datetime import datetime
from typing import Optional
from cpl_core.database import TableABC
from cpl_core.dependency_injection import ServiceProviderABC
from bot_data.model.server import Server
class Achievement(TableABC):
def __init__(
self,
name: str,
description: str,
attribute: str,
operator: str,
value: str,
server: Optional[Server],
created_at: datetime = None,
modified_at: datetime = None,
id=0,
):
self._id = id
self._name = name
self._description = description
self._attribute = attribute
if self._is_operator_valid(operator):
raise ValueError("Operator invalid")
self._operator = operator
self._value = value
self._server = server
TableABC.__init__(self)
self._created_at = created_at if created_at is not None else self._created_at
self._modified_at = modified_at if modified_at is not None else self._modified_at
@ServiceProviderABC.inject
def _is_operator_valid(self, operator, service: ServiceProviderABC) -> bool:
from modules.achievements.achievement_service import AchievementService
achievements: AchievementService = service.get_service(AchievementService)
return operator not in achievements.get_operators()
@property
def id(self) -> int:
return self._id
@property
def name(self) -> str:
return self._name
@name.setter
def name(self, value: str):
self._name = value
@property
def description(self) -> str:
return self._description
@description.setter
def description(self, value: str):
self._description = value
@property
def attribute(self) -> str:
return self._attribute
@attribute.setter
def attribute(self, value: str):
self._attribute = value
@property
def operator(self) -> str:
return self._operator
@operator.setter
def operator(self, value: str):
self._operator = value
@property
def value(self) -> str:
return self._value
@value.setter
def value(self, value: str):
self._value = value
@property
def server(self) -> Server:
return self._server
@staticmethod
def get_select_all_string() -> str:
return str(
f"""
SELECT * FROM `Achievements`;
"""
)
@staticmethod
def get_select_by_id_string(id: int) -> str:
return str(
f"""
SELECT * FROM `Achievements`
WHERE `Id` = {id};
"""
)
@staticmethod
def get_select_by_server_id_string(id: int) -> str:
return str(
f"""
SELECT * FROM `Achievements`
WHERE `ServerId` = {id};
"""
)
@property
def insert_string(self) -> str:
return str(
f"""
INSERT INTO `Achievements` (
`Name`, `Description`, `Attribute`, `Operator`, `Value`, `ServerId`
) VALUES (
'{self._name}',
'{self._description}',
'{self._attribute}',
'{self._operator}',
'{self._value}',
{self._server.id}
);
"""
)
@property
def udpate_string(self) -> str:
return str(
f"""
UPDATE `Achievements`
SET `Name` = '{self._name}',
`Description` = '{self._description}',
`Attribute` = '{self._attribute}',
`Operator` = '{self._operator}',
`Value` = '{self._value}'
WHERE `Id` = {self._id};
"""
)
@property
def delete_string(self) -> str:
return str(
f"""
DELETE FROM `Achievements`
WHERE `Id` = {self._id};
"""
)

View File

@@ -1,58 +0,0 @@
from bot_data.abc.history_table_abc import HistoryTableABC
class AchievementHistory(HistoryTableABC):
def __init__(
self,
name: str,
description: str,
attribute: str,
operator: str,
value: str,
server: int,
deleted: bool,
date_from: str,
date_to: str,
id=0,
):
HistoryTableABC.__init__(self)
self._id = id
self._name = name
self._description = description
self._attribute = attribute
self._operator = operator
self._value = value
self._server = server
self._deleted = deleted
self._date_from = date_from
self._date_to = date_to
@property
def id(self) -> int:
return self._id
@property
def name(self) -> str:
return self._name
@property
def description(self) -> str:
return self._description
@property
def attribute(self) -> str:
return self._attribute
@property
def operator(self) -> str:
return self._operator
@property
def value(self) -> str:
return self._value
@property
def server(self) -> int:
return self._server

View File

@@ -1,85 +0,0 @@
from datetime import datetime
from cpl_core.database import TableABC
class ServerAFKChannelIdsConfig(TableABC):
def __init__(
self,
channel_id: int,
server_id: int,
created_at: datetime = None,
modified_at: datetime = None,
id=0,
):
self._id = id
self._channel_id = channel_id
self._server_id = server_id
TableABC.__init__(self)
self._created_at = created_at if created_at is not None else self._created_at
self._modified_at = modified_at if modified_at is not None else self._modified_at
@property
def channel_id(self) -> int:
return self._channel_id
@staticmethod
def get_select_all_string() -> str:
return str(
f"""
SELECT * FROM `CFG_ServerAFKChannelIds`;
"""
)
@staticmethod
def get_select_by_id_string(id: int) -> str:
return str(
f"""
SELECT * FROM `CFG_ServerAFKChannelIds`
WHERE `Id` = {id};
"""
)
@staticmethod
def get_select_by_server_id_string(server_id: int) -> str:
return str(
f"""
SELECT * FROM `CFG_ServerAFKChannelIds`
WHERE `ServerId` = {server_id};
"""
)
@property
def insert_string(self) -> str:
return str(
f"""
INSERT INTO `CFG_ServerAFKChannelIds` (
`ChannelId`,
`ServerId`
) VALUES (
{self._channel_id},
{self._server_id}
);
"""
)
@property
def udpate_string(self) -> str:
return str(
f"""
UPDATE `CFG_ServerAFKChannelIds`
SET `ChannelId` = {self._channel_id},
`ServerId` = {self._server_id}
WHERE `Id` = {self._id};
"""
)
@property
def delete_string(self) -> str:
return str(
f"""
DELETE FROM `CFG_ServerAFKChannelIds`
WHERE `ChannelId` = {self._channel_id};
"""
)

View File

@@ -1,306 +0,0 @@
import json
from datetime import datetime
from cpl_core.configuration import ConfigurationModelABC
from cpl_core.database import TableABC
from cpl_query.extension import List
from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
from bot_data.model.server import Server
from bot_data.model.server_team_role_ids_config import ServerTeamRoleIdsConfig
class ServerConfig(TableABC, ConfigurationModelABC):
def __init__(
self,
message_delete_timer: int,
notification_chat_id: int,
max_voice_state_hours: int,
xp_per_message: int,
xp_per_reaction: int,
max_message_xp_per_hour: int,
xp_per_ontime_hour: int,
xp_per_event_participation: int,
xp_per_achievement: int,
afk_command_channel_id: int,
help_voice_channel_id: int,
team_channel_id: int,
login_message_channel_id: int,
default_role_id: int,
feature_flags: dict[FeatureFlagsEnum],
server: Server,
afk_channel_ids: List[int],
team_role_ids: List[ServerTeamRoleIdsConfig],
created_at: datetime = None,
modified_at: datetime = None,
id=0,
):
self._id = id
self._message_delete_timer = message_delete_timer
self._notification_chat_id = notification_chat_id
self._max_voice_state_hours = max_voice_state_hours
self._xp_per_message = xp_per_message
self._xp_per_reaction = xp_per_reaction
self._max_message_xp_per_hour = max_message_xp_per_hour
self._xp_per_ontime_hour = xp_per_ontime_hour
self._xp_per_event_participation = xp_per_event_participation
self._xp_per_achievement = xp_per_achievement
self._afk_command_channel_id = afk_command_channel_id
self._help_voice_channel_id = help_voice_channel_id
self._team_channel_id = team_channel_id
self._login_message_channel_id = login_message_channel_id
self._default_role_id = default_role_id
self._feature_flags = feature_flags
self._server = server
self._afk_channel_ids = afk_channel_ids
self._team_role_ids = team_role_ids
TableABC.__init__(self)
self._created_at = created_at if created_at is not None else self._created_at
self._modified_at = modified_at if modified_at is not None else self._modified_at
@property
def id(self) -> int:
return self._id
@property
def message_delete_timer(self) -> int:
return self._message_delete_timer
@message_delete_timer.setter
def message_delete_timer(self, value: int):
self._message_delete_timer = value
@property
def notification_chat_id(self) -> int:
return self._notification_chat_id
@notification_chat_id.setter
def notification_chat_id(self, value: int):
self._notification_chat_id = value
@property
def max_voice_state_hours(self) -> int:
return self._max_voice_state_hours
@max_voice_state_hours.setter
def max_voice_state_hours(self, value: int):
self._max_voice_state_hours = value
@property
def xp_per_message(self) -> int:
return self._xp_per_message
@xp_per_message.setter
def xp_per_message(self, value: int):
self._xp_per_message = value
@property
def xp_per_reaction(self) -> int:
return self._xp_per_reaction
@xp_per_reaction.setter
def xp_per_reaction(self, value: int):
self._xp_per_reaction = value
@property
def max_message_xp_per_hour(self) -> int:
return self._max_message_xp_per_hour
@max_message_xp_per_hour.setter
def max_message_xp_per_hour(self, value: int):
self._max_message_xp_per_hour = value
@property
def xp_per_ontime_hour(self) -> int:
return self._xp_per_ontime_hour
@xp_per_ontime_hour.setter
def xp_per_ontime_hour(self, value: int):
self._xp_per_ontime_hour = value
@property
def xp_per_event_participation(self) -> int:
return self._xp_per_event_participation
@xp_per_event_participation.setter
def xp_per_event_participation(self, value: int):
self._xp_per_event_participation = value
@property
def xp_per_achievement(self) -> int:
return self._xp_per_achievement
@xp_per_achievement.setter
def xp_per_achievement(self, value: int):
self._xp_per_achievement = value
@property
def afk_command_channel_id(self) -> int:
return self._afk_command_channel_id
@afk_command_channel_id.setter
def afk_command_channel_id(self, value: int):
self._afk_command_channel_id = value
@property
def help_voice_channel_id(self) -> int:
return self._help_voice_channel_id
@help_voice_channel_id.setter
def help_voice_channel_id(self, value: int):
self._help_voice_channel_id = value
@property
def team_channel_id(self) -> int:
return self._team_channel_id
@team_channel_id.setter
def team_channel_id(self, value: int):
self._team_channel_id = value
@property
def login_message_channel_id(self) -> int:
return self._login_message_channel_id
@login_message_channel_id.setter
def login_message_channel_id(self, value: int):
self._login_message_channel_id = value
@property
def default_role_id(self) -> int:
return self._default_role_id
@default_role_id.setter
def default_role_id(self, value: int):
self._default_role_id = value
@property
def feature_flags(self) -> dict[FeatureFlagsEnum]:
return self._feature_flags
@feature_flags.setter
def feature_flags(self, value: dict[FeatureFlagsEnum]):
self._feature_flags = value
@property
def afk_channel_ids(self) -> List[int]:
return self._afk_channel_ids
@afk_channel_ids.setter
def afk_channel_ids(self, value: List[int]):
self._afk_channel_ids = value
@property
def team_role_ids(self) -> List[ServerTeamRoleIdsConfig]:
return self._team_role_ids
@team_role_ids.setter
def team_role_ids(self, value: List[ServerTeamRoleIdsConfig]):
self._team_role_ids = value
@property
def server(self) -> Server:
return self._server
@staticmethod
def get_select_all_string() -> str:
return str(
f"""
SELECT * FROM `CFG_Server`;
"""
)
@staticmethod
def get_select_by_id_string(id: int) -> str:
return str(
f"""
SELECT * FROM `CFG_Server`
WHERE `Id` = {id};
"""
)
@staticmethod
def get_select_by_server_id_string(server_id: int) -> str:
return str(
f"""
SELECT * FROM `CFG_Server`
WHERE `ServerId` = {server_id};
"""
)
@property
def insert_string(self) -> str:
return str(
f"""
INSERT INTO `CFG_Server` (
`MessageDeleteTimer`,
`NotificationChatId`,
`MaxVoiceStateHours`,
`XpPerMessage`,
`XpPerReaction`,
`MaxMessageXpPerHour`,
`XpPerOntimeHour`,
`XpPerEventParticipation`,
`XpPerAchievement`,
`AFKCommandChannelId`,
`HelpVoiceChannelId`,
`TeamChannelId`,
`LoginMessageChannelId`,
`DefaultRoleId`,
`FeatureFlags`,
`ServerId`
) VALUES (
{self._message_delete_timer},
{self._notification_chat_id},
{self._max_voice_state_hours},
{self._xp_per_message},
{self._xp_per_reaction},
{self._max_message_xp_per_hour},
{self._xp_per_ontime_hour},
{self._xp_per_event_participation},
{self._xp_per_achievement},
{self._afk_command_channel_id},
{self._help_voice_channel_id},
{self._team_channel_id},
{self._login_message_channel_id},
{self._default_role_id},
'{json.dumps(self._feature_flags)}',
{self._server.id}
);
"""
)
@property
def udpate_string(self) -> str:
return str(
f"""
UPDATE `CFG_Server`
SET `MessageDeleteTimer` = {self._message_delete_timer},
`NotificationChatId` = {self._notification_chat_id},
`MaxVoiceStateHours` = {self._max_voice_state_hours},
`XpPerMessage` = {self._xp_per_message},
`XpPerReaction` = {self._xp_per_reaction},
`MaxMessageXpPerHour` = {self._max_message_xp_per_hour},
`XpPerOntimeHour` = {self._xp_per_ontime_hour},
`XpPerEventParticipation` = {self._xp_per_event_participation},
`XpPerAchievement` = {self._xp_per_achievement},
`AFKCommandChannelId` = {self._afk_command_channel_id},
`HelpVoiceChannelId` = {self._help_voice_channel_id},
`TeamChannelId` = {self._team_channel_id},
`LoginMessageChannelId` = {self._login_message_channel_id},
`DefaultRoleId` = {self._default_role_id},
`FeatureFlags` = '{json.dumps(self._feature_flags)}',
`ServerId` = {self._server.id}
WHERE `Id` = {self._id};
"""
)
@property
def delete_string(self) -> str:
return str(
f"""
DELETE FROM `CFG_Server`
WHERE `Id` = {self._id};
"""
)

View File

@@ -1,114 +0,0 @@
from bot_data.abc.history_table_abc import HistoryTableABC
class ServerConfigHistory(HistoryTableABC):
def __init__(
self,
message_delete_timer: int,
notification_chat_id: int,
max_voice_state_hours: int,
xp_per_message: int,
xp_per_reaction: int,
max_message_xp_per_hour: int,
xp_per_ontime_hour: int,
xp_per_event_participation: int,
xp_per_achievement: int,
afk_command_channel_id: int,
help_voice_channel_id: int,
team_channel_id: int,
login_message_channel_id: int,
default_role_id: int,
feature_flags: dict[str],
server_id: int,
deleted: bool,
date_from: str,
date_to: str,
id=0,
):
HistoryTableABC.__init__(self)
self._id = id
self._message_delete_timer = message_delete_timer
self._notification_chat_id = notification_chat_id
self._max_voice_state_hours = max_voice_state_hours
self._xp_per_message = xp_per_message
self._xp_per_reaction = xp_per_reaction
self._max_message_xp_per_hour = max_message_xp_per_hour
self._xp_per_ontime_hour = xp_per_ontime_hour
self._xp_per_event_participation = xp_per_event_participation
self._xp_per_achievement = xp_per_achievement
self._afk_command_channel_id = afk_command_channel_id
self._help_voice_channel_id = help_voice_channel_id
self._team_channel_id = team_channel_id
self._login_message_channel_id = login_message_channel_id
self._default_role_id = default_role_id
self._feature_flags = feature_flags
self._server_id = server_id
self._deleted = deleted
self._date_from = date_from
self._date_to = date_to
@property
def message_delete_timer(self) -> int:
return self._message_delete_timer
@property
def notification_chat_id(self) -> int:
return self._notification_chat_id
@property
def max_voice_state_hours(self) -> int:
return self._max_voice_state_hours
@property
def xp_per_message(self) -> int:
return self._xp_per_message
@property
def xp_per_reaction(self) -> int:
return self._xp_per_reaction
@property
def max_message_xp_per_hour(self) -> int:
return self._max_message_xp_per_hour
@property
def xp_per_ontime_hour(self) -> int:
return self._xp_per_ontime_hour
@property
def xp_per_event_participation(self) -> int:
return self._xp_per_event_participation
@property
def xp_per_achievement(self) -> int:
return self._xp_per_achievement
@property
def afk_command_channel_id(self) -> int:
return self._afk_command_channel_id
@property
def help_voice_channel_id(self) -> int:
return self._help_voice_channel_id
@property
def team_channel_id(self) -> int:
return self._team_channel_id
@property
def login_message_channel_id(self) -> int:
return self._login_message_channel_id
@property
def default_role_id(self) -> int:
return self._default_role_id
@property
def feature_flags(self) -> dict[str]:
return self._feature_flags
@property
def server_id(self) -> int:
return self._server_id

View File

@@ -1,100 +0,0 @@
from datetime import datetime
from cpl_core.database import TableABC
from bot_data.model.team_member_type_enum import TeamMemberTypeEnum
class ServerTeamRoleIdsConfig(TableABC):
def __init__(
self,
role_id: int,
team_member_type: TeamMemberTypeEnum,
server_id: int,
created_at: datetime = None,
modified_at: datetime = None,
id=0,
):
self._id = id
self._role_id = role_id
self._team_member_type = team_member_type
self._server_id = server_id
TableABC.__init__(self)
self._created_at = created_at if created_at is not None else self._created_at
self._modified_at = modified_at if modified_at is not None else self._modified_at
@property
def id(self) -> int:
return self._id
@property
def role_id(self) -> int:
return self._role_id
@property
def team_member_type(self) -> TeamMemberTypeEnum:
return self._team_member_type
@staticmethod
def get_select_all_string() -> str:
return str(
f"""
SELECT * FROM `CFG_ServerTeamRoleIds`;
"""
)
@staticmethod
def get_select_by_id_string(id: int) -> str:
return str(
f"""
SELECT * FROM `CFG_ServerTeamRoleIds`
WHERE `Id` = {id};
"""
)
@staticmethod
def get_select_by_server_id_string(server_id: int) -> str:
return str(
f"""
SELECT * FROM `CFG_ServerTeamRoleIds`
WHERE `ServerId` = {server_id};
"""
)
@property
def insert_string(self) -> str:
return str(
f"""
INSERT INTO `CFG_ServerTeamRoleIds` (
`RoleId`,
`TeamMemberType`,
`ServerId`
) VALUES (
{self._role_id},
'{self._team_member_type.value}',
{self._server_id}
);
"""
)
@property
def udpate_string(self) -> str:
return str(
f"""
UPDATE `CFG_ServerTeamRoleIds`
SET `RoleId` = {self._role_id},
`TeamMemberType` = '{self._team_member_type.value}',
`ServerId` = {self._server_id}
WHERE `Id` = {self._id};
"""
)
@property
def delete_string(self) -> str:
return str(
f"""
DELETE FROM `CFG_ServerTeamRoleIds`
WHERE `RoleId` = {self._role_id};
"""
)

View File

@@ -1,6 +0,0 @@
from enum import Enum
class TeamMemberTypeEnum(Enum):
moderator = "Moderator"
admin = "Admin"

View File

@@ -1,152 +0,0 @@
import json
from datetime import datetime
from cpl_core.configuration import ConfigurationModelABC
from cpl_core.database import TableABC
from cpl_query.extension import List
from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
class TechnicianConfig(TableABC, ConfigurationModelABC):
def __init__(
self,
help_command_reference_url: str,
wait_for_restart: int,
wait_for_shutdown: int,
cache_max_messages: int,
feature_flags: dict[FeatureFlagsEnum],
technician_ids: List[int],
ping_urls: List[str],
created_at: datetime = None,
modified_at: datetime = None,
id=0,
):
self._id = id
self._help_command_reference_url = help_command_reference_url
self._wait_for_restart = wait_for_restart
self._wait_for_shutdown = wait_for_shutdown
self._cache_max_messages = cache_max_messages
self._feature_flags = feature_flags
self._technician_ids = technician_ids
self._ping_urls = ping_urls
TableABC.__init__(self)
self._created_at = created_at if created_at is not None else self._created_at
self._modified_at = modified_at if modified_at is not None else self._modified_at
@property
def id(self) -> int:
return self._id
@property
def help_command_reference_url(self) -> str:
return self._help_command_reference_url
@help_command_reference_url.setter
def help_command_reference_url(self, value: str):
self._help_command_reference_url = value
@property
def wait_for_restart(self) -> int:
return self._wait_for_restart
@wait_for_restart.setter
def wait_for_restart(self, value: int):
self._wait_for_restart = value
@property
def wait_for_shutdown(self) -> int:
return self._wait_for_shutdown
@wait_for_shutdown.setter
def wait_for_shutdown(self, value: int):
self._wait_for_shutdown = value
@property
def cache_max_messages(self) -> int:
return self._cache_max_messages
@cache_max_messages.setter
def cache_max_messages(self, value: int):
self._cache_max_messages = value
@property
def feature_flags(self) -> dict[FeatureFlagsEnum]:
return self._feature_flags
@feature_flags.setter
def feature_flags(self, value: dict[FeatureFlagsEnum]):
self._feature_flags = value
@property
def technician_ids(self) -> List[int]:
return self._technician_ids
@technician_ids.setter
def technician_ids(self, value: List[int]):
self._technician_ids = value
@property
def ping_urls(self) -> List[str]:
return self._ping_urls
@ping_urls.setter
def ping_urls(self, value: List[str]):
self._ping_urls = value
@staticmethod
def get_select_all_string() -> str:
return str(
f"""
SELECT * FROM `CFG_Technician`;
"""
)
@staticmethod
def get_select_by_id_string(id: int) -> str:
return str(
f"""
SELECT * FROM `CFG_Technician`
WHERE `Id` = {id};
"""
)
@property
def insert_string(self) -> str:
return str(
f"""
INSERT INTO `CFG_Technician` (
`HelpCommandReferenceUrl`, `WaitForRestart`, `WaitForShutdown`, `CacheMaxMessages`, `FeatureFlags`
) VALUES (
'{self._help_command_reference_url}',
{self._wait_for_restart},
{self._wait_for_shutdown},
{self._cache_max_messages},
'{json.dumps(self._feature_flags)}'
);
"""
)
@property
def udpate_string(self) -> str:
return str(
f"""
UPDATE `CFG_Technician`
SET `HelpCommandReferenceUrl` = '{self._help_command_reference_url}',
`WaitForRestart` = {self._wait_for_restart},
`WaitForShutdown` = {self._wait_for_shutdown},
`CacheMaxMessages` = {self._cache_max_messages},
`FeatureFlags` = '{json.dumps(self._feature_flags)}'
WHERE `Id` = {self._id};
"""
)
@property
def delete_string(self) -> str:
return str(
f"""
DELETE FROM `CFG_Technician`
WHERE `Id` = {self._id};
"""
)

View File

@@ -1,58 +0,0 @@
from bot_data.abc.history_table_abc import HistoryTableABC
class TechnicianConfigHistory(HistoryTableABC):
def __init__(
self,
help_command_reference_url: str,
wait_for_restart: int,
wait_for_shutdown: int,
cache_max_messages: int,
deleted: bool,
date_from: str,
date_to: str,
id=0,
):
HistoryTableABC.__init__(self)
self._id = id
self._help_command_reference_url = help_command_reference_url
self._wait_for_restart = wait_for_restart
self._wait_for_shutdown = wait_for_shutdown
self._cache_max_messages = cache_max_messages
self._deleted = deleted
self._date_from = date_from
self._date_to = date_to
@property
def help_command_reference_url(self) -> str:
return self._help_command_reference_url
@help_command_reference_url.setter
def help_command_reference_url(self, value: str):
self._help_command_reference_url = value
@property
def wait_for_restart(self) -> int:
return self._wait_for_restart
@wait_for_restart.setter
def wait_for_restart(self, value: int):
self._wait_for_restart = value
@property
def wait_for_shutdown(self) -> int:
return self._wait_for_shutdown
@wait_for_shutdown.setter
def wait_for_shutdown(self, value: int):
self._wait_for_shutdown = value
@property
def cache_max_messages(self) -> int:
return self._cache_max_messages
@cache_max_messages.setter
def cache_max_messages(self, value: int):
self._cache_max_messages = value

View File

@@ -1,79 +0,0 @@
from datetime import datetime
from cpl_core.database import TableABC
class TechnicianIdConfig(TableABC):
def __init__(
self,
technician_id: str,
created_at: datetime = None,
modified_at: datetime = None,
id=0,
):
self._id = id
self._technician_id = technician_id
TableABC.__init__(self)
self._created_at = created_at if created_at is not None else self._created_at
self._modified_at = modified_at if modified_at is not None else self._modified_at
@property
def id(self) -> int:
return self._id
@property
def technician_id(self) -> str:
return self._technician_id
@technician_id.setter
def technician_id(self, value: str):
self._technician_id = value
@staticmethod
def get_select_all_string() -> str:
return str(
f"""
SELECT * FROM `CFG_TechnicianIds`;
"""
)
@staticmethod
def get_select_by_id_string(id: int) -> str:
return str(
f"""
SELECT * FROM `CFG_TechnicianIds`
WHERE `Id` = {id};
"""
)
@property
def insert_string(self) -> str:
return str(
f"""
INSERT INTO `CFG_TechnicianIds` (
`TechnicianId`
) VALUES (
'{self._technician_id}'
);
"""
)
@property
def udpate_string(self) -> str:
return str(
f"""
UPDATE `CFG_TechnicianIds`
SET `TechnicianId` = '{self._technician_id}'
WHERE `Id` = {self._id};
"""
)
@property
def delete_string(self) -> str:
return str(
f"""
DELETE FROM `CFG_TechnicianIds`
WHERE `TechnicianId` = {self._technician_id};
"""
)

View File

@@ -1,28 +0,0 @@
from bot_data.abc.history_table_abc import HistoryTableABC
class TechnicianIdConfigHistory(HistoryTableABC):
def __init__(
self,
technician_id: int,
deleted: bool,
date_from: str,
date_to: str,
id=0,
):
HistoryTableABC.__init__(self)
self._id = id
self._technician_id = technician_id
self._deleted = deleted
self._date_from = date_from
self._date_to = date_to
@property
def technician_id(self) -> int:
return self._technician_id
@technician_id.setter
def technician_id(self, value: int):
self._technician_id = value

View File

@@ -1,79 +0,0 @@
from datetime import datetime
from cpl_core.database import TableABC
class TechnicianPingUrlConfig(TableABC):
def __init__(
self,
ping_url: str,
created_at: datetime = None,
modified_at: datetime = None,
id=0,
):
self._id = id
self._ping_url = ping_url
TableABC.__init__(self)
self._created_at = created_at if created_at is not None else self._created_at
self._modified_at = modified_at if modified_at is not None else self._modified_at
@property
def id(self) -> int:
return self._id
@property
def ping_url(self) -> str:
return self._ping_url
@ping_url.setter
def ping_url(self, value: str):
self._ping_url = value
@staticmethod
def get_select_all_string() -> str:
return str(
f"""
SELECT * FROM `CFG_TechnicianPingUrls`;
"""
)
@staticmethod
def get_select_by_id_string(id: int) -> str:
return str(
f"""
SELECT * FROM `CFG_TechnicianPingUrls`
WHERE `Id` = {id};
"""
)
@property
def insert_string(self) -> str:
return str(
f"""
INSERT INTO `CFG_TechnicianPingUrls` (
`URL`
) VALUES (
'{self._ping_url}'
);
"""
)
@property
def udpate_string(self) -> str:
return str(
f"""
UPDATE `CFG_TechnicianPingUrls`
SET `URL` = '{self._ping_url}'
WHERE `Id` = {self._id};
"""
)
@property
def delete_string(self) -> str:
return str(
f"""
DELETE FROM `CFG_TechnicianPingUrls`
WHERE `URL` = '{self._ping_url}';
"""
)

View File

@@ -1,28 +0,0 @@
from bot_data.abc.history_table_abc import HistoryTableABC
class TechnicianPingUrlConfigHistory(HistoryTableABC):
def __init__(
self,
url: str,
deleted: bool,
date_from: str,
date_to: str,
id=0,
):
HistoryTableABC.__init__(self)
self._id = id
self._url = url
self._deleted = deleted
self._date_from = date_from
self._date_to = date_to
@property
def url(self) -> str:
return self._url
@url.setter
def url(self, value: str):
self._url = value

View File

@@ -15,8 +15,6 @@ class User(TableABC):
self, self,
dc_id: int, dc_id: int,
xp: int, xp: int,
reaction_count: int,
message_count: int,
server: Optional[Server], server: Optional[Server],
created_at: datetime = None, created_at: datetime = None,
modified_at: datetime = None, modified_at: datetime = None,
@@ -25,8 +23,6 @@ class User(TableABC):
self._user_id = id self._user_id = id
self._discord_id = dc_id self._discord_id = dc_id
self._xp = xp self._xp = xp
self._reaction_count = reaction_count
self._message_count = message_count
self._server = server self._server = server
TableABC.__init__(self) TableABC.__init__(self)
@@ -63,22 +59,6 @@ class User(TableABC):
def xp(self, value: int): def xp(self, value: int):
self._xp = value self._xp = value
@property
def message_count(self) -> int:
return self._message_count
@message_count.setter
def message_count(self, value: int):
self._message_count = value
@property
def reaction_count(self) -> int:
return self._reaction_count
@reaction_count.setter
def reaction_count(self, value: int):
self._reaction_count = value
@property @property
@ServiceProviderABC.inject @ServiceProviderABC.inject
def ontime(self, services: ServiceProviderABC) -> float: def ontime(self, services: ServiceProviderABC) -> float:
@@ -171,12 +151,10 @@ class User(TableABC):
return str( return str(
f""" f"""
INSERT INTO `Users` ( INSERT INTO `Users` (
`DiscordId`, `XP`, `MessageCount`, `ReactionCount`, `ServerId` `DiscordId`, `XP`, `ServerId`
) VALUES ( ) VALUES (
{self._discord_id}, {self._discord_id},
{self._xp}, {self._xp},
{self._message_count},
{self._reaction_count},
{self._server.id} {self._server.id}
); );
""" """
@@ -187,9 +165,7 @@ class User(TableABC):
return str( return str(
f""" f"""
UPDATE `Users` UPDATE `Users`
SET `XP` = {self._xp}, SET `XP` = {self._xp}
`MessageCount` = {self._message_count},
`ReactionCount` = {self._reaction_count}
WHERE `UserId` = {self._user_id}; WHERE `UserId` = {self._user_id};
""" """
) )

View File

@@ -1,105 +0,0 @@
from datetime import datetime
from typing import Optional
from cpl_core.database import TableABC
from bot_data.model.achievement import Achievement
from bot_data.model.user import User
class UserGotAchievement(TableABC):
def __init__(
self,
user: Optional[User],
achievement: Optional[Achievement],
created_at: datetime = None,
modified_at: datetime = None,
id=0,
):
self._id = id
self._user = user
self._achievement = achievement
TableABC.__init__(self)
self._created_at = created_at if created_at is not None else self._created_at
self._modified_at = modified_at if modified_at is not None else self._modified_at
@property
def id(self) -> int:
return self._id
@property
def user(self) -> User:
return self._user
@property
def achievement(self) -> Achievement:
return self._achievement
@staticmethod
def get_select_all_string() -> str:
return str(
f"""
SELECT * FROM `UserGotAchievements`;
"""
)
@staticmethod
def get_select_by_id_string(id: int) -> str:
return str(
f"""
SELECT * FROM `UserGotAchievements`
WHERE `Id` = {id};
"""
)
@staticmethod
def get_select_by_user_id_string(id: int) -> str:
return str(
f"""
SELECT * FROM `UserGotAchievements`
WHERE `UserId` = {id};
"""
)
@staticmethod
def get_select_by_achievement_id_string(id: int) -> str:
return str(
f"""
SELECT * FROM `UserGotAchievements`
WHERE `AchievementId` = {id};
"""
)
@property
def insert_string(self) -> str:
return str(
f"""
INSERT INTO `UserGotAchievements` (
`UserId`, `AchievementId`
) VALUES (
{self._user.id},
{self._achievement.id}
);
"""
)
@property
def udpate_string(self) -> str:
return str(
f"""
UPDATE `UserGotAchievements`
SET `UserId` = '{self._user.id}',
`AchievementId` = '{self._achievement.id}'
WHERE `Id` = {self._id};
"""
)
@property
def delete_string(self) -> str:
return str(
f"""
DELETE FROM `UserGotAchievements`
WHERE `Id` = {self._id};
"""
)

View File

@@ -9,8 +9,6 @@ class UserHistory(HistoryTableABC):
self, self,
dc_id: int, dc_id: int,
xp: int, xp: int,
message_count: int,
reaction_count: int,
server: int, server: int,
deleted: bool, deleted: bool,
date_from: str, date_from: str,
@@ -22,8 +20,6 @@ class UserHistory(HistoryTableABC):
self._user_id = id self._user_id = id
self._discord_id = dc_id self._discord_id = dc_id
self._xp = xp self._xp = xp
self._message_count = message_count
self._reaction_count = reaction_count
self._server = server self._server = server
self._deleted = deleted self._deleted = deleted
@@ -42,14 +38,6 @@ class UserHistory(HistoryTableABC):
def xp(self) -> int: def xp(self) -> int:
return self._xp return self._xp
@property
def message_count(self) -> int:
return self._message_count
@property
def reaction_count(self) -> int:
return self._reaction_count
@property @property
def server(self) -> int: def server(self) -> int:
return self._server return self._server

Some files were not shown because too many files have changed in this diff Show More