diff --git a/kdb-bot/src/bot/bot.json b/kdb-bot/src/bot/bot.json index e5666f6a..2b74c8ea 100644 --- a/kdb-bot/src/bot/bot.json +++ b/kdb-bot/src/bot/bot.json @@ -19,7 +19,7 @@ "cpl-core==2022.12.1.post3", "cpl-translation==2022.12.1", "cpl-query==2022.12.2.post1", - "Flask==2.2.2", + "Flask==2.2.3", "Flask-Classful==0.14.2", "Flask-Cors==3.0.10", "PyJWT==2.6.0", @@ -41,15 +41,15 @@ "BuildSettings": { "ProjectType": "console", "SourcePath": "", - "OutputPath": "../../dist", + "OutputPath": "..\\..\\dist", "Main": "bot.main", "EntryPoint": "bot", "IncludePackageData": false, "Included": [], "Excluded": [ - "*/__pycache__", - "*/logs", - "*/tests" + "*\\__pycache__", + "*\\logs", + "*\\tests" ], "PackageData": {}, "ProjectReferences": [ diff --git a/kdb-bot/src/bot/config b/kdb-bot/src/bot/config index ac704682..e8c7334e 160000 --- a/kdb-bot/src/bot/config +++ b/kdb-bot/src/bot/config @@ -1 +1 @@ -Subproject commit ac7046820f3410f55e779797126d9410c6bcdc9f +Subproject commit e8c7334eee0dcc25d11343fae0adb106aca079f1 diff --git a/kdb-bot/src/bot/module_list.py b/kdb-bot/src/bot/module_list.py index b5388245..700f0c73 100644 --- a/kdb-bot/src/bot/module_list.py +++ b/kdb-bot/src/bot/module_list.py @@ -11,7 +11,6 @@ from modules.boot_log.boot_log_module import BootLogModule from modules.database.database_module import DatabaseModule from modules.level.level_module import LevelModule from modules.permission.permission_module import PermissionModule -from modules.stats.stats_module import StatsModule from modules.technician.technician_module import TechnicianModule @@ -31,7 +30,6 @@ class ModuleList: BaseModule, LevelModule, ApiModule, - StatsModule, TechnicianModule, # has to be last! BootLogModule, diff --git a/kdb-bot/src/bot_data/migration/stats_migration.py b/kdb-bot/src/bot_data/migration/stats_migration.py index c28eeda9..b5bb0715 100644 --- a/kdb-bot/src/bot_data/migration/stats_migration.py +++ b/kdb-bot/src/bot_data/migration/stats_migration.py @@ -4,7 +4,7 @@ from bot_data.db_context import DBContext class StatsMigration(MigrationABC): - name = "0.3_StatsMigration" + name = "1.0_RemoveStatsMigration" def __init__(self, logger: DatabaseLogger, db: DBContext): MigrationABC.__init__(self) @@ -18,20 +18,26 @@ class StatsMigration(MigrationABC): self._cursor.execute( str( f""" - CREATE TABLE IF NOT EXISTS `Statistics` ( - `Id` BIGINT NOT NULL AUTO_INCREMENT, - `Name` VARCHAR(255) NOT NULL, - `Description` VARCHAR(255) NOT NULL, - `Code` LONGTEXT NOT NULL, - `ServerId` BIGINT, - `CreatedAt` DATETIME(6), - `LastModifiedAt` DATETIME(6), - PRIMARY KEY(`Id`), - FOREIGN KEY (`ServerId`) REFERENCES `Servers`(`ServerId`) - ); - """ + DROP TABLE IF EXISTS `Statistics`; + """ ) ) def downgrade(self): - self._cursor.execute("DROP TABLE `Statistics`;") + self._cursor.execute( + str( + f""" + CREATE TABLE IF NOT EXISTS `Statistics` ( + `Id` BIGINT NOT NULL AUTO_INCREMENT, + `Name` VARCHAR(255) NOT NULL, + `Description` VARCHAR(255) NOT NULL, + `Code` LONGTEXT NOT NULL, + `ServerId` BIGINT, + `CreatedAt` DATETIME(6), + `LastModifiedAt` DATETIME(6), + PRIMARY KEY(`Id`), + FOREIGN KEY (`ServerId`) REFERENCES `Servers`(`ServerId`) + ); + """ + ) + ) diff --git a/kdb-bot/src/modules/stats/__init__.py b/kdb-bot/src/modules/stats/__init__.py deleted file mode 100644 index 0c26311e..00000000 --- a/kdb-bot/src/modules/stats/__init__.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -bot Keksdose bot -~~~~~~~~~~~~~~~~~~~ - -Discord bot for the Keksdose discord Server - -:copyright: (c) 2022 - 2023 sh-edraft.de -:license: MIT, see LICENSE for more details. - -""" - -__title__ = "modules.stats" -__author__ = "Sven Heidemann" -__license__ = "MIT" -__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" -__version__ = "0.3.1" - -from collections import namedtuple - - -# imports: - -VersionInfo = namedtuple("VersionInfo", "major minor micro") -version_info = VersionInfo(major="0", minor="3", micro="1") diff --git a/kdb-bot/src/modules/stats/command/__init__.py b/kdb-bot/src/modules/stats/command/__init__.py deleted file mode 100644 index f5346950..00000000 --- a/kdb-bot/src/modules/stats/command/__init__.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -bot Keksdose bot -~~~~~~~~~~~~~~~~~~~ - -Discord bot for the Keksdose discord Server - -:copyright: (c) 2022 - 2023 sh-edraft.de -:license: MIT, see LICENSE for more details. - -""" - -__title__ = "modules.stats.command" -__author__ = "Sven Heidemann" -__license__ = "MIT" -__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" -__version__ = "0.3.1" - -from collections import namedtuple - - -# imports - -VersionInfo = namedtuple("VersionInfo", "major minor micro") -version_info = VersionInfo(major="0", minor="3", micro="1") diff --git a/kdb-bot/src/modules/stats/command/stats_group.py b/kdb-bot/src/modules/stats/command/stats_group.py deleted file mode 100644 index 7db65858..00000000 --- a/kdb-bot/src/modules/stats/command/stats_group.py +++ /dev/null @@ -1,232 +0,0 @@ -from typing import List as TList - -import discord -from cpl_core.database.context import DatabaseContextABC -from cpl_discord.command import DiscordCommandABC -from cpl_translation import TranslatePipe -from discord import app_commands -from discord.ext import commands -from discord.ext.commands import Context - -from bot_core.abc.client_utils_abc import ClientUtilsABC -from bot_core.abc.message_service_abc import MessageServiceABC -from bot_core.helper.command_checks import CommandChecks -from bot_core.logging.command_logger import CommandLogger -from bot_data.abc.server_repository_abc import ServerRepositoryABC -from bot_data.abc.statistic_repository_abc import StatisticRepositoryABC -from modules.permission.abc.permission_service_abc import PermissionServiceABC -from modules.stats.service.statistic_service import StatisticService -from modules.stats.ui.add_statistic_form import AddStatisticForm - - -class StatsGroup(DiscordCommandABC): - def __init__( - self, - logger: CommandLogger, - message_service: MessageServiceABC, - client_utils: ClientUtilsABC, - translate: TranslatePipe, - permission_service: PermissionServiceABC, - statistic: StatisticService, - servers: ServerRepositoryABC, - stats: StatisticRepositoryABC, - db: DatabaseContextABC, - ): - DiscordCommandABC.__init__(self) - - self._logger = logger - self._client_utils = client_utils - self._message_service = message_service - self._t = translate - self._permissions = permission_service - self._statistic = statistic - self._servers = servers - self._stats = stats - self._db = db - - @commands.hybrid_group() - @commands.guild_only() - async def stats(self, ctx: Context): - pass - - @stats.command() - @commands.guild_only() - @CommandChecks.check_is_ready() - @CommandChecks.check_is_member_moderator() - async def list(self, ctx: Context, wait: int = None): - self._logger.debug(__name__, f"Received command stats list {ctx}") - - if ctx.guild is None: - return - - embed = discord.Embed( - title=self._t.transform("modules.auto_role.list.title"), - description=self._t.transform("modules.auto_role.list.description"), - color=int("ef9d0d", 16), - ) - - server = self._servers.get_server_by_discord_id(ctx.guild.id) - stats = self._stats.get_statistics_by_server_id(server.server_id) - - if stats.count() == 0: - await self._message_service.send_ctx_msg(ctx, self._t.transform("modules.stats.list.nothing_found")) - return - - statistics = "" - descriptions = "" - for statistic in stats: - statistics += f"\n{statistic.name}" - descriptions += f"\n{statistic.description}" - - embed.add_field( - name=self._t.transform("modules.stats.list.statistic"), - value=statistics, - inline=True, - ) - embed.add_field( - name=self._t.transform("modules.stats.list.description"), - value=descriptions, - inline=True, - ) - await self._message_service.send_ctx_msg(ctx, embed, wait_before_delete=wait) - self._logger.trace(__name__, f"Finished command stats list") - - @stats.command() - @commands.guild_only() - @CommandChecks.check_is_ready() - @CommandChecks.check_is_member_moderator() - async def view(self, ctx: Context, name: str, wait: int = None): - self._logger.debug(__name__, f"Received command stats view {ctx}:{name}") - - if ctx.guild is None: - return - - try: - server = self._servers.get_server_by_discord_id(ctx.guild.id) - stats = self._stats.get_statistics_by_server_id(server.server_id) - statistic = stats.where(lambda s: s.name == name).single() - result = await self._statistic.execute(statistic.code, server) - - embed = discord.Embed( - title=statistic.name, - description=statistic.description, - color=int("ef9d0d", 16), - ) - - for i in range(result.header.count()): - header = result.header[i] - value = "" - for row in result.values: - value += f"\n{row[i]}" - embed.add_field(name=header, value=value, inline=True) - - await self._message_service.send_ctx_msg(ctx, embed, wait_before_delete=wait) - except Exception as e: - self._logger.error(__name__, f"Cannot view statistic {name}", e) - await self._message_service.send_ctx_msg(ctx, self._t.transform("modules.stats.view.failed")) - - self._logger.trace(__name__, f"Finished stats view command") - - @view.autocomplete("name") - async def view_autocomplete( - self, interaction: discord.Interaction, current: str - ) -> TList[app_commands.Choice[str]]: - server = self._servers.get_server_by_discord_id(interaction.guild.id) - stats = self._stats.get_statistics_by_server_id(server.server_id) - return [ - app_commands.Choice(name=f"{statistic.name}: {statistic.description}", value=statistic.name) - for statistic in stats - ] - - @stats.command() - @commands.guild_only() - @CommandChecks.check_is_ready() - @CommandChecks.check_is_member_technician() - async def add(self, ctx: Context, name: str): - self._logger.debug(__name__, f"Received command stats add {ctx}: {name}") - - if ctx.guild is None: - return - - server = self._servers.get_server_by_discord_id(ctx.guild.id) - form = AddStatisticForm( - server, - self._stats, - self._db, - name, - self._message_service, - self._logger, - self._t, - ) - self._logger.trace(__name__, f"Finished stats add command") - self._logger.trace(__name__, f"Started stats command form") - await ctx.interaction.response.send_modal(form) - - @stats.command() - @commands.guild_only() - @CommandChecks.check_is_ready() - @CommandChecks.check_is_member_technician() - async def edit(self, ctx: Context, name: str): - self._logger.debug(__name__, f"Received command stats edit {ctx}: {name}") - - try: - server = self._servers.get_server_by_discord_id(ctx.guild.id) - stats = self._stats.get_statistics_by_server_id(server.server_id) - statistic = stats.where(lambda s: s.name == name).single() - form = AddStatisticForm( - server, - self._stats, - self._db, - name, - self._message_service, - self._logger, - self._t, - code=statistic.code, - description=statistic.description, - ) - self._logger.trace(__name__, f"Finished stats edit command") - self._logger.trace(__name__, f"Started stats command form") - await ctx.interaction.response.send_modal(form) - except Exception as e: - self._logger.error(__name__, f"Cannot edit statistic {name}", e) - await self._message_service.send_ctx_msg(ctx, self._t.transform("modules.stats.edit.failed")) - - @edit.autocomplete("name") - async def edit_autocomplete( - self, interaction: discord.Interaction, current: str - ) -> TList[app_commands.Choice[str]]: - server = self._servers.get_server_by_discord_id(interaction.guild.id) - stats = self._stats.get_statistics_by_server_id(server.server_id) - return [ - app_commands.Choice(name=f"{statistic.name}: {statistic.description}", value=statistic.name) - for statistic in stats - ] - - @stats.command() - @commands.guild_only() - @CommandChecks.check_is_ready() - @CommandChecks.check_is_member_technician() - async def remove(self, ctx: Context, name: str): - self._logger.debug(__name__, f"Received command stats remove {ctx}: {name}") - - try: - server = self._servers.get_server_by_discord_id(ctx.guild.id) - statistic = self._stats.get_statistic_by_name(name, server.server_id) - self._stats.delete_statistic(statistic) - self._db.save_changes() - await self._message_service.send_ctx_msg(ctx, self._t.transform("modules.stats.remove.success")) - self._logger.trace(__name__, f"Finished stats remove command") - except Exception as e: - self._logger.error(__name__, f"Cannot remove statistic {name}", e) - await self._message_service.send_ctx_msg(ctx, self._t.transform("modules.stats.remove.failed")) - - @remove.autocomplete("name") - async def edit_autocomplete( - self, interaction: discord.Interaction, current: str - ) -> TList[app_commands.Choice[str]]: - server = self._servers.get_server_by_discord_id(interaction.guild.id) - stats = self._stats.get_statistics_by_server_id(server.server_id) - return [ - app_commands.Choice(name=f"{statistic.name}: {statistic.description}", value=statistic.name) - for statistic in stats - ] diff --git a/kdb-bot/src/modules/stats/model/__init__.py b/kdb-bot/src/modules/stats/model/__init__.py deleted file mode 100644 index ce2d9618..00000000 --- a/kdb-bot/src/modules/stats/model/__init__.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -bot Keksdose bot -~~~~~~~~~~~~~~~~~~~ - -Discord bot for the Keksdose discord Server - -:copyright: (c) 2022 - 2023 sh-edraft.de -:license: MIT, see LICENSE for more details. - -""" - -__title__ = "modules.stats.model" -__author__ = "Sven Heidemann" -__license__ = "MIT" -__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" -__version__ = "0.3.1" - -from collections import namedtuple - - -# imports - -VersionInfo = namedtuple("VersionInfo", "major minor micro") -version_info = VersionInfo(major="0", minor="3", micro="1") diff --git a/kdb-bot/src/modules/stats/model/statistic_result.py b/kdb-bot/src/modules/stats/model/statistic_result.py deleted file mode 100644 index d8e62bf6..00000000 --- a/kdb-bot/src/modules/stats/model/statistic_result.py +++ /dev/null @@ -1,23 +0,0 @@ -from cpl_query.extension import List - - -class StatisticResult: - def __init__(self): - self._header = List(str) - self._values = List(List) - - @property - def header(self) -> List[str]: - return self._header - - @header.setter - def header(self, value: List[str]): - self._header = value - - @property - def values(self) -> List[List]: - return self._values - - @values.setter - def values(self, value: List[List]): - self._values = value diff --git a/kdb-bot/src/modules/stats/service/__init__.py b/kdb-bot/src/modules/stats/service/__init__.py deleted file mode 100644 index 74fb38e5..00000000 --- a/kdb-bot/src/modules/stats/service/__init__.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -bot Keksdose bot -~~~~~~~~~~~~~~~~~~~ - -Discord bot for the Keksdose discord Server - -:copyright: (c) 2022 - 2023 sh-edraft.de -:license: MIT, see LICENSE for more details. - -""" - -__title__ = "modules.stats.service" -__author__ = "Sven Heidemann" -__license__ = "MIT" -__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" -__version__ = "0.3.1" - -from collections import namedtuple - - -# imports - -VersionInfo = namedtuple("VersionInfo", "major minor micro") -version_info = VersionInfo(major="0", minor="3", micro="1") diff --git a/kdb-bot/src/modules/stats/service/statistic_service.py b/kdb-bot/src/modules/stats/service/statistic_service.py deleted file mode 100644 index 8286c533..00000000 --- a/kdb-bot/src/modules/stats/service/statistic_service.py +++ /dev/null @@ -1,87 +0,0 @@ -from abc import abstractmethod - -from cpl_discord.service import DiscordBotServiceABC -from cpl_query.extension import List -from discord import Guild - -from bot_data.abc.auto_role_repository_abc import AutoRoleRepositoryABC -from bot_data.abc.client_repository_abc import ClientRepositoryABC -from bot_data.abc.known_user_repository_abc import KnownUserRepositoryABC -from bot_data.abc.level_repository_abc import LevelRepositoryABC -from bot_data.abc.server_repository_abc import ServerRepositoryABC -from bot_data.abc.user_joined_server_repository_abc import UserJoinedServerRepositoryABC -from bot_data.abc.user_joined_voice_channel_repository_abc import ( - UserJoinedVoiceChannelRepositoryABC, -) -from bot_data.abc.user_repository_abc import UserRepositoryABC -from bot_data.model.auto_role import AutoRole -from bot_data.model.client import Client -from bot_data.model.known_user import KnownUser -from bot_data.model.level import Level -from bot_data.model.server import Server -from bot_data.model.user import User -from bot_data.model.user_joined_server import UserJoinedServer -from bot_data.model.user_joined_voice_channel import UserJoinedVoiceChannel -from modules.stats.model.statistic_result import StatisticResult - - -class StatisticService: - def __init__( - self, - auto_roles: AutoRoleRepositoryABC, - clients: ClientRepositoryABC, - known_users: KnownUserRepositoryABC, - levels: LevelRepositoryABC, - servers: ServerRepositoryABC, - user_joined_servers: UserJoinedServerRepositoryABC, - user_joined_voice_channel: UserJoinedVoiceChannelRepositoryABC, - users: UserRepositoryABC, - bot: DiscordBotServiceABC, - ): - self._auto_roles = auto_roles - self._clients = clients - self._known_users = known_users - self._levels = levels - self._servers = servers - self._user_joined_servers = user_joined_servers - self._user_joined_voice_channel = user_joined_voice_channel - self._users = users - self._bot = bot - - async def execute(self, code: str, server: Server) -> StatisticResult: - guild = self._bot.guilds.where(lambda g: g.id == server.discord_server_id).single() - - return await self.get_data( - code, - self._auto_roles.get_auto_roles().where(lambda x: x.server.server_id == server.server_id), - self._clients.get_clients().where(lambda x: x.server.server_id == server.server_id), - self._known_users.get_users(), - self._levels.get_levels().where(lambda x: x.server.server_id == server.server_id), - self._servers.get_servers().where(lambda x: x.server_id == server.server_id), - self._user_joined_servers.get_user_joined_servers().where( - lambda x: x.user.server.server_id == server.server_id - ), - self._user_joined_voice_channel.get_user_joined_voice_channels().where( - lambda x: x.user.server.server_id == server.server_id - ), - self._users.get_users().where(lambda x: x.server.server_id == server.server_id), - guild, - ) - - @staticmethod - async def get_data( - code: str, - auto_roles: List[AutoRole], - clients: List[Client], - known_users: List[KnownUser], - levels: List[Level], - servers: List[Server], - user_joined_servers: List[UserJoinedServer], - user_joined_voice_channel: List[UserJoinedVoiceChannel], - users: List[User], - guild: Guild, - ) -> StatisticResult: - result = StatisticResult() - exec(code) - - return result diff --git a/kdb-bot/src/modules/stats/stats.json b/kdb-bot/src/modules/stats/stats.json deleted file mode 100644 index d063c651..00000000 --- a/kdb-bot/src/modules/stats/stats.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "ProjectSettings": { - "Name": "stats", - "Version": { - "Major": "0", - "Minor": "3", - "Micro": "1" - }, - "Author": "", - "AuthorEmail": "", - "Description": "", - "LongDescription": "", - "URL": "", - "CopyrightDate": "", - "CopyrightName": "", - "LicenseName": "", - "LicenseDescription": "", - "Dependencies": [ - "cpl-core==2022.12.0" - ], - "DevDependencies": [ - "cpl-cli==2022.12.0" - ], - "PythonVersion": ">=3.10.4", - "PythonPath": {}, - "Classifiers": [] - }, - "BuildSettings": { - "ProjectType": "library", - "SourcePath": "", - "OutputPath": "../../dist", - "Main": "stats.main", - "EntryPoint": "stats", - "IncludePackageData": false, - "Included": [], - "Excluded": [ - "*/__pycache__", - "*/logs", - "*/tests" - ], - "PackageData": {}, - "ProjectReferences": [] - } -} \ No newline at end of file diff --git a/kdb-bot/src/modules/stats/stats_module.py b/kdb-bot/src/modules/stats/stats_module.py deleted file mode 100644 index 9cb459af..00000000 --- a/kdb-bot/src/modules/stats/stats_module.py +++ /dev/null @@ -1,23 +0,0 @@ -from cpl_core.configuration import ConfigurationABC -from cpl_core.dependency_injection import ServiceCollectionABC -from cpl_core.environment import ApplicationEnvironmentABC -from cpl_discord.service.discord_collection_abc import DiscordCollectionABC - -from bot_core.abc.module_abc import ModuleABC -from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum -from modules.stats.command.stats_group import StatsGroup -from modules.stats.service.statistic_service import StatisticService - - -class StatsModule(ModuleABC): - def __init__(self, dc: DiscordCollectionABC): - ModuleABC.__init__(self, dc, FeatureFlagsEnum.stats_module) - - def configure_configuration(self, config: ConfigurationABC, env: ApplicationEnvironmentABC): - pass - - def configure_services(self, services: ServiceCollectionABC, env: ApplicationEnvironmentABC): - services.add_transient(StatisticService) - # commands - self._dc.add_command(StatsGroup) - # events diff --git a/kdb-bot/src/modules/stats/ui/__init__.py b/kdb-bot/src/modules/stats/ui/__init__.py deleted file mode 100644 index 8e71e850..00000000 --- a/kdb-bot/src/modules/stats/ui/__init__.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -bot Keksdose bot -~~~~~~~~~~~~~~~~~~~ - -Discord bot for the Keksdose discord Server - -:copyright: (c) 2022 - 2023 sh-edraft.de -:license: MIT, see LICENSE for more details. - -""" - -__title__ = "modules.stats.ui" -__author__ = "Sven Heidemann" -__license__ = "MIT" -__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" -__version__ = "0.3.1" - -from collections import namedtuple - - -# imports - -VersionInfo = namedtuple("VersionInfo", "major minor micro") -version_info = VersionInfo(major="0", minor="3", micro="1") diff --git a/kdb-bot/src/modules/stats/ui/add_statistic_form.py b/kdb-bot/src/modules/stats/ui/add_statistic_form.py deleted file mode 100644 index e07502e2..00000000 --- a/kdb-bot/src/modules/stats/ui/add_statistic_form.py +++ /dev/null @@ -1,98 +0,0 @@ -import discord -from cpl_core.database.context import DatabaseContextABC -from cpl_query.extension import List -from cpl_translation import TranslatePipe -from discord import ui, TextStyle - -from bot_core.abc.message_service_abc import MessageServiceABC -from bot_core.logging.command_logger import CommandLogger -from bot_data.abc.statistic_repository_abc import StatisticRepositoryABC -from bot_data.model.server import Server -from bot_data.model.statistic import Statistic - - -class AddStatisticForm(ui.Modal): - description = ui.TextInput(label="Beschreibung", required=True) - code = ui.TextInput(label="Code", required=True, style=TextStyle.long) - - def __init__( - self, - server: Server, - stats: StatisticRepositoryABC, - db: DatabaseContextABC, - name: str, - message_service: MessageServiceABC, - logger: CommandLogger, - t: TranslatePipe, - code: str = None, - description: str = None, - ): - ui.Modal.__init__(self, title=name) - - self._server = server - self._stats = stats - self._db = db - self._name = name - self._message_service = message_service - self._logger = logger - self._t = t - - if code is not None: - self.code.default = code - - if description is not None: - self.description.default = description - - async def on_submit(self, interaction: discord.Interaction): - statistic = ( - self._stats.get_statistics_by_server_id(self._server.server_id) - .where(lambda s: s.name == self._name) - .single_or_default() - ) - - if interaction.guild is None: - if statistic is None: - await self._message_service.send_interaction_msg( - interaction, self._t.transform("modules.stats.add.failed") - ) - else: - await self._message_service.send_interaction_msg( - interaction, self._t.transform("modules.stats.edit.failed") - ) - return - - try: - if statistic is None: - self._stats.add_statistic( - Statistic( - self._name, - self.description.value, - self.code.value, - self._server, - ) - ) - self._db.save_changes() - await self._message_service.send_interaction_msg( - interaction, self._t.transform("modules.stats.add.success") - ) - return - - statistic.description = self.description.value - statistic.code = self.code.value - self._stats.update_statistic(statistic) - self._db.save_changes() - await self._message_service.send_interaction_msg( - interaction, self._t.transform("modules.stats.edit.success") - ) - except Exception as e: - self._logger.error(__name__, f"Save statistic {self._name} failed", e) - if statistic is None: - await self._message_service.send_interaction_msg( - interaction, self._t.transform("modules.stats.add.failed") - ) - else: - await self._message_service.send_interaction_msg( - interaction, self._t.transform("modules.stats.edit.failed") - ) - - self._logger.trace(__name__, f"Finished stats command form")