Compare commits
51 Commits
Author | SHA1 | Date | |
---|---|---|---|
0f2f17b1f4 | |||
e7747a306f | |||
8a1dfb92f8 | |||
ef276564d2 | |||
f8fe9af8da | |||
db175b5b28 | |||
4bbb2b5c45 | |||
c74a74a3c5 | |||
3ae2b68528 | |||
2deeecf8ff | |||
8416eaf32a | |||
5489cc96b4 | |||
82ba1ae904 | |||
a5267a793d | |||
010bb65ba7 | |||
b5d5e0cf66 | |||
c968fbb3d7 | |||
0ef2428b9d | |||
e17b24a0c1 | |||
234a9a382a | |||
|
9eef94baf2 | ||
ca7798987c | |||
e825a708ac | |||
a4df809916 | |||
6bfcd4748d | |||
dee76b4d0d | |||
01a7b1f996 | |||
c04389ecaf | |||
fcf1d2038b | |||
558d134bd7 | |||
26963b2bef | |||
bc8ff7dc0f | |||
7d4a28d524 | |||
d83e842551 | |||
0c142f51cc | |||
291d9ad6d6 | |||
7f3541c5c8 | |||
|
0662be7b79 | ||
|
853c1262e7 | ||
|
dc025170e1 | ||
|
c9a5a64c7b | ||
bed3f07347 | |||
ab44aa55bc | |||
ed2dab6ff8 | |||
7dd2d13b58 | |||
b352987dcc | |||
a8663b8d54 | |||
ff247bcec3 | |||
500d884ea1 | |||
2f657a7ce7 | |||
4db97248ca |
2
.gitignore
vendored
2
.gitignore
vendored
@@ -142,3 +142,5 @@ cython_debug/
|
||||
PythonImportHelper-v2-Completion.json
|
||||
appsettings.*.json
|
||||
|
||||
# idea
|
||||
.idea/
|
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
[submodule "src/gismo/config"]
|
||||
path = src/gismo/config
|
||||
url = https://git.sh-edraft.de/sh-edraft.de/sh_gismo_config.git
|
31
.vscode/launch.json
vendored
31
.vscode/launch.json
vendored
@@ -1,31 +0,0 @@
|
||||
{
|
||||
// Use IntelliSense to learn about possible attributes.
|
||||
// Hover to view descriptions of existing attributes.
|
||||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Python: Aktuelle Datei",
|
||||
"type": "python",
|
||||
"request": "launch",
|
||||
"program": "${file}",
|
||||
"console": "integratedTerminal"
|
||||
},
|
||||
{
|
||||
"name": "Gismo",
|
||||
"type": "python",
|
||||
"request": "launch",
|
||||
"cwd": "${workspaceFolder}/src/gismo",
|
||||
"program": "main.py",
|
||||
"console": "integratedTerminal",
|
||||
"args": [
|
||||
"--customer=sh-edraft.de"
|
||||
],
|
||||
"env": {
|
||||
"CPL_NAME": "Gismo",
|
||||
"GISMO_ENVIRONMENT": "development",
|
||||
"PYTHONPATH": "${workspaceFolder}/src/:$PYTHONPATH"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
24
.vscode/settings.json
vendored
24
.vscode/settings.json
vendored
@@ -1,24 +0,0 @@
|
||||
{
|
||||
"workbench.colorCustomizations": {
|
||||
"activityBar.activeBackground": "#93e6fc",
|
||||
"activityBar.activeBorder": "#fa45d4",
|
||||
"activityBar.background": "#93e6fc",
|
||||
"activityBar.foreground": "#15202b",
|
||||
"activityBar.inactiveForeground": "#15202b99",
|
||||
"activityBarBadge.background": "#fa45d4",
|
||||
"activityBarBadge.foreground": "#15202b",
|
||||
"sash.hoverBorder": "#93e6fc",
|
||||
"statusBar.background": "#61dafb",
|
||||
"statusBar.foreground": "#15202b",
|
||||
"statusBarItem.hoverBackground": "#2fcefa",
|
||||
"statusBarItem.remoteBackground": "#61dafb",
|
||||
"statusBarItem.remoteForeground": "#15202b",
|
||||
"titleBar.activeBackground": "#61dafb",
|
||||
"titleBar.activeForeground": "#15202b",
|
||||
"titleBar.inactiveBackground": "#61dafb99",
|
||||
"titleBar.inactiveForeground": "#15202b99"
|
||||
},
|
||||
"peacock.color": "#61dafb",
|
||||
"python.pythonPath": "${workspaceRoot}/venv/bin/python",
|
||||
"python.defaultInterpreterPath": "${workspaceRoot}/venv/bin/python",
|
||||
}
|
@@ -6,23 +6,27 @@
|
||||
"gismo-cli": "src/gismo_cli/gismo-cli.json",
|
||||
"gismo-core": "src/gismo_core/gismo-core.json",
|
||||
"gismo-data": "src/gismo_data/gismo-data.json",
|
||||
"modules-core": "src/modules_core/modules-core.json",
|
||||
"boot-log": "src/modules/boot_log/boot-log.json",
|
||||
"level-generator": "tools/level_generator/level-generator.json",
|
||||
"ontime-calculator": "tools/ontime_calculator/ontime-calculator.json",
|
||||
"database": "src/modules/database/database.json",
|
||||
"base": "src/modules/base/base.json"
|
||||
"base": "src/modules/base/base.json",
|
||||
"permission": "src/modules/permission/permission.json"
|
||||
},
|
||||
"Scripts": {
|
||||
"build-start": "cd src/gismo_cli; echo 'gismo-cli:'; cpl build; cd ../gismo; echo 'gismo:'; cpl build; cd ../../dist/gismo/build/gismo; bash gismo",
|
||||
"build-gismo": "cd src/gismo; echo 'gismo:'; cpl build; cd ../../;",
|
||||
"build-gismo-cli": "cd src/gismo_cli; echo 'gismo-cli:'; cpl build; cd ../../;",
|
||||
"build-start": "cpl build-gismo-cli; cpl build-gismo; cd dist/gismo/build/gismo; bash gismo",
|
||||
"bs": "cpl build-start",
|
||||
"build-all": "cpl build-gismo-cli; cpl build-gismo;",
|
||||
"ba": "cpl build-all",
|
||||
"pre-build": "cd ../gismo_cli; echo 'gismo-cli:'; cpl build; echo 'gismo:'",
|
||||
"pre-start": "if [ -z $GISMO_ENVIRONMENT ]; then echo '!WARNING! You should start with the right environment!\nRun cpl start-ENV\nSee workspace for more details.'; sleep 2; fi",
|
||||
"pre-dev": "echo 'development:'; ",
|
||||
"pre-dev": "echo 'development:';",
|
||||
"dev": "export GISMO_ENVIRONMENT=development; export GISMO_NAME=Gismo-dev; cpl start",
|
||||
"pre-test": "echo 'staging:'; ",
|
||||
"pre-test": "echo 'staging:';",
|
||||
"test": "export GISMO_ENVIRONMENT=staging; export GISMO_NAME=Gismo-test; cpl start",
|
||||
"pre-prod": "echo 'production:'; ",
|
||||
"pre-prod": "echo 'production:';",
|
||||
"prod": "export GISMO_ENVIRONMENT=production; export GISMO_NAME=Gismo-prod; cpl start"
|
||||
}
|
||||
}
|
||||
|
@@ -15,11 +15,11 @@ __title__ = 'gismo'
|
||||
__author__ = 'Sven Heidemann'
|
||||
__license__ = 'MIT'
|
||||
__copyright__ = 'Copyright (c) 2021 - 2022 sh-edraft.de'
|
||||
__version__ = '0.3.0'
|
||||
__version__ = '0.4.2'
|
||||
|
||||
from collections import namedtuple
|
||||
|
||||
# imports:
|
||||
|
||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||
version_info = VersionInfo(major='0', minor='4', micro='2')
|
||||
|
@@ -5,8 +5,9 @@ from cpl_core.dependency_injection import ServiceProviderABC
|
||||
from cpl_core.logging import LoggerABC
|
||||
|
||||
from gismo_core.abc.bot_service_abc import BotServiceABC
|
||||
from gismo_core.configuration.bot_settings import BotSettings
|
||||
from gismo_core.configuration.server_settings import ServerSettings
|
||||
from gismo_core.service.bot_service import BotService
|
||||
from gismo_data.service.migration_service import MigrationService
|
||||
|
||||
|
||||
class Gismo(ApplicationABC):
|
||||
@@ -16,14 +17,19 @@ class Gismo(ApplicationABC):
|
||||
|
||||
self._bot: BotService = services.get_service(BotServiceABC)
|
||||
self._logger: LoggerABC = services.get_service(LoggerABC)
|
||||
self._migrations: MigrationService = services.get_service(MigrationService)
|
||||
self._bot_settings: BotSettings = config.get_configuration(BotSettings)
|
||||
|
||||
async def configure(self):
|
||||
pass
|
||||
self._logger.debug(__name__, 'Try to load discord server configs')
|
||||
for server in self._bot_settings.servers:
|
||||
server: ServerSettings = server
|
||||
self._logger.trace(__name__, f'Try to load config for server: {server.id}')
|
||||
self._configuration.add_configuration(f'DSERVER_{server.id}', server)
|
||||
self._logger.trace(__name__, f'Loaded config for server: {server.id}')
|
||||
|
||||
async def main(self):
|
||||
try:
|
||||
self._migrations.migrate()
|
||||
self._logger.debug(__name__, f'Starting...\n')
|
||||
self._logger.trace(__name__, f'Try to start {BotService}')
|
||||
await self._bot.start_async()
|
||||
except Exception as e:
|
||||
|
@@ -1,36 +0,0 @@
|
||||
{
|
||||
"TimeFormatSettings": {
|
||||
"DateFormat": "%Y-%m-%d",
|
||||
"TimeFormat": "%H:%M:%S",
|
||||
"DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f",
|
||||
"DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S"
|
||||
},
|
||||
"LoggingSettings": {
|
||||
"Path": "logs/",
|
||||
"Filename": "log_$start_time.log",
|
||||
"ConsoleLogLevel": "ERROR",
|
||||
"FileLogLevel": "WARN"
|
||||
},
|
||||
"Discord": {
|
||||
"Token": ""
|
||||
},
|
||||
"Bot": {
|
||||
"Prefix": "!g",
|
||||
"Servers": [
|
||||
{
|
||||
"Id": "",
|
||||
"LoginMessageChannelId": "",
|
||||
"LoginMessage": "",
|
||||
"MessageDeleteTimer": 0,
|
||||
"WelcomeMessage": "",
|
||||
"GoodbyeMessage": "",
|
||||
"MaxVoiceStateHours": 0,
|
||||
"XpPerMessage": 0,
|
||||
"XpPerOntimeHour": 0,
|
||||
"AFKChannelIds": [],
|
||||
"AdminRoleIds": [],
|
||||
"ModeratorRoleIds": []
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
@@ -1,14 +0,0 @@
|
||||
{
|
||||
"TimeFormatSettings": {
|
||||
"DateFormat": "%Y-%m-%d",
|
||||
"TimeFormat": "%H:%M:%S",
|
||||
"DateTimeFormat": "%Y-%m-%d %H:%M:%S.%f",
|
||||
"DateTimeLogFormat": "%Y-%m-%d_%H-%M-%S"
|
||||
},
|
||||
"LoggingSettings": {
|
||||
"Path": "logs/",
|
||||
"Filename": "log_$start_time.log",
|
||||
"ConsoleLogLevel": "ERROR",
|
||||
"FileLogLevel": "WARN"
|
||||
}
|
||||
}
|
1
src/gismo/config
Submodule
1
src/gismo/config
Submodule
Submodule src/gismo/config added at 83fd51adff
@@ -3,8 +3,8 @@
|
||||
"Name": "gismo",
|
||||
"Version": {
|
||||
"Major": "0",
|
||||
"Minor": "3",
|
||||
"Micro": "0"
|
||||
"Minor": "4",
|
||||
"Micro": "2"
|
||||
},
|
||||
"Author": "Sven Heidemann",
|
||||
"AuthorEmail": "sven.heidemann@sh-edraft.de",
|
||||
@@ -16,10 +16,11 @@
|
||||
"LicenseName": "MIT",
|
||||
"LicenseDescription": "MIT, see LICENSE for more details.",
|
||||
"Dependencies": [
|
||||
"sh_cpl-core>=2021.11.0",
|
||||
"sh_cpl-query>=2021.11.0",
|
||||
"discord.py==1.7.3"
|
||||
"cpl-core>=2022.6.0",
|
||||
"discord.py==1.7.3",
|
||||
"cpl-query>=2022.6.0"
|
||||
],
|
||||
"DevDependencies": [],
|
||||
"PythonVersion": ">=3.9.2",
|
||||
"PythonPath": {
|
||||
"linux": "../../venv/bin/python"
|
||||
@@ -47,10 +48,10 @@
|
||||
"ProjectReferences": [
|
||||
"../gismo_core/gismo-core.json",
|
||||
"../gismo_data/gismo-data.json",
|
||||
"../modules_core/modules-core.json",
|
||||
"../modules/boot_log/boot-log.json",
|
||||
"../modules/base/base.json",
|
||||
"../modules/database/database.json"
|
||||
"../modules/database/database.json",
|
||||
"../modules/permission/permission.json"
|
||||
]
|
||||
}
|
||||
}
|
@@ -19,7 +19,7 @@ class Main:
|
||||
app_builder.use_extension(DatabaseExtension)
|
||||
app_builder.use_extension(BootLogExtension)
|
||||
app_builder.use_startup(Startup)
|
||||
self._gismo: Gismo = await app_builder.build_async()
|
||||
self._gismo = await app_builder.build_async()
|
||||
await self._gismo.run_async()
|
||||
|
||||
async def stop(self):
|
||||
@@ -43,3 +43,5 @@ if __name__ == '__main__':
|
||||
# / ) ) ~ edraft
|
||||
# ___// | /
|
||||
# `--' \_~-,
|
||||
|
||||
# happy new year :)
|
||||
|
@@ -4,15 +4,18 @@ from typing import Optional
|
||||
|
||||
from cpl_core.application import StartupABC
|
||||
from cpl_core.configuration import ConfigurationABC
|
||||
from cpl_core.console import Console
|
||||
from cpl_core.database import DatabaseSettings
|
||||
from cpl_core.dependency_injection import (ServiceCollectionABC,
|
||||
ServiceProviderABC)
|
||||
from cpl_core.dependency_injection import ServiceCollectionABC, ServiceProviderABC
|
||||
from cpl_core.environment import ApplicationEnvironment
|
||||
from cpl_core.logging import LoggerABC
|
||||
|
||||
from gismo_core.abc.bot_service_abc import BotServiceABC
|
||||
from gismo_core.abc.client_utils_service_abc import ClientUtilsServiceABC
|
||||
from gismo_core.abc.command_abc import CommandABC
|
||||
from gismo_core.abc.message_service_abc import MessageServiceABC
|
||||
from gismo_core.service.bot_service import BotService
|
||||
from gismo_core.service.client_utils_service import ClientUtilsService
|
||||
from gismo_core.service.message_service import MessageService
|
||||
from gismo_data.abc.known_user_repository_abc import KnownUserRepositoryABC
|
||||
from gismo_data.abc.migration_abc import MigrationABC
|
||||
@@ -35,11 +38,20 @@ from gismo_data.service.user_joined_server_repository_service import UserJoinedS
|
||||
from gismo_data.service.user_joined_voice_channel_service import UserJoinedVoiceChannelRepositoryService
|
||||
from gismo_data.service.user_repository_service import UserRepositoryService
|
||||
from modules.base.base import Base
|
||||
from modules.base.service.afk_command_service import AFKCommandService
|
||||
from modules.base.service.help_command_service import HelpCommandService
|
||||
from modules.base.service.info_command_service import InfoCommandService
|
||||
from modules.base.service.ping_command_service import PingCommandService
|
||||
from modules.base.service.purge_command_service import PurgeCommandService
|
||||
from modules.base.service.user_info_command_service import UserInfoCommandService
|
||||
from modules.boot_log.boot_log import BootLog
|
||||
from modules.database.database import Database
|
||||
from modules_core.abc.module_abc import ModuleABC
|
||||
from modules_core.abc.module_service_abc import ModuleServiceABC
|
||||
from modules_core.service.module_service import ModuleService
|
||||
from modules.permission.abc.permission_service_abc import PermissionServiceABC
|
||||
from modules.permission.permission import Permission
|
||||
from gismo_core.abc.module_abc import ModuleABC
|
||||
from gismo_core.abc.module_service_abc import ModuleServiceABC
|
||||
from gismo_core.service.module_service import ModuleService
|
||||
from modules.permission.service.permission_service import PermissionService
|
||||
|
||||
|
||||
class Startup(StartupABC):
|
||||
@@ -50,31 +62,30 @@ class Startup(StartupABC):
|
||||
|
||||
self._config: Optional[ConfigurationABC] = None
|
||||
|
||||
async def configure_configuration(self, configuration: ConfigurationABC, environment: ApplicationEnvironment) -> ConfigurationABC:
|
||||
def configure_configuration(self, configuration: ConfigurationABC, environment: ApplicationEnvironment) -> ConfigurationABC:
|
||||
environment.set_working_directory(os.path.dirname(os.path.realpath(__file__)))
|
||||
configuration.add_environment_variables('GISMO_')
|
||||
|
||||
configuration.add_json_file(f'appsettings.json', optional=False)
|
||||
configuration.add_json_file(f'appsettings.{environment.environment_name}.json', optional=True)
|
||||
configuration.add_json_file(f'appsettings.{environment.host_name}.json', optional=True)
|
||||
configuration.add_json_file(f'config/appsettings.json', optional=False)
|
||||
configuration.add_json_file(f'config/appsettings.{environment.environment_name}.json', optional=True)
|
||||
configuration.add_json_file(f'config/appsettings.{environment.host_name}.json', optional=True)
|
||||
|
||||
configuration.add_configuration('Startup_StartTime', self._start_time)
|
||||
configuration.add_configuration('Startup_StartTime', str(self._start_time))
|
||||
|
||||
self._config = configuration
|
||||
return configuration
|
||||
|
||||
async def configure_services(self, services: ServiceCollectionABC, environment: ApplicationEnvironment) -> ServiceProviderABC:
|
||||
def configure_services(self, services: ServiceCollectionABC, environment: ApplicationEnvironment) -> ServiceProviderABC:
|
||||
services.add_logging()
|
||||
|
||||
services.add_db_context(DBContext, self._config.get_configuration(DatabaseSettings))
|
||||
|
||||
# modules
|
||||
# general services
|
||||
services.add_singleton(ModuleServiceABC, ModuleService)
|
||||
services.add_singleton(BotServiceABC, BotService)
|
||||
services.add_transient(MessageServiceABC, MessageService)
|
||||
|
||||
# services
|
||||
services.add_transient(MigrationService)
|
||||
services.add_transient(ClientUtilsServiceABC, ClientUtilsService)
|
||||
|
||||
# data services
|
||||
services.add_transient(ServerRepositoryABC, ServerRepositoryService)
|
||||
@@ -84,20 +95,31 @@ class Startup(StartupABC):
|
||||
services.add_transient(UserJoinedServerRepositoryABC, UserJoinedServerRepositoryService)
|
||||
services.add_transient(UserJoinedVoiceChannelRepositoryABC, UserJoinedVoiceChannelRepositoryService)
|
||||
|
||||
# module services
|
||||
services.add_singleton(PermissionServiceABC, PermissionService)
|
||||
|
||||
# commands
|
||||
services.add_transient(CommandABC, PingCommandService)
|
||||
services.add_transient(CommandABC, PurgeCommandService)
|
||||
services.add_transient(CommandABC, AFKCommandService)
|
||||
services.add_transient(CommandABC, HelpCommandService)
|
||||
services.add_transient(CommandABC, InfoCommandService)
|
||||
services.add_transient(CommandABC, UserInfoCommandService)
|
||||
|
||||
# modules
|
||||
services.add_transient(ModuleABC, Database)
|
||||
services.add_transient(ModuleABC, Base)
|
||||
services.add_transient(ModuleABC, BootLog)
|
||||
services.add_singleton(ModuleABC, Permission)
|
||||
services.add_singleton(ModuleABC, Base)
|
||||
|
||||
# migrations
|
||||
services.add_transient(MigrationABC, InitialMigration)
|
||||
services.add_transient(MigrationABC, Migration_0_3)
|
||||
services.add_transient(MigrationABC, Migration_0_3_1)
|
||||
|
||||
startup_init_time = round((datetime.now() - datetime.strptime(self._config.get_configuration('Startup_StartTime'), '%Y-%m-%d %H:%M:%S.%f')).total_seconds(), 2)
|
||||
self._config.add_configuration('Startup_InitTime', str(startup_init_time))
|
||||
provider: ServiceProviderABC = services.build_service_provider()
|
||||
|
||||
startup_init_time = round((datetime.now() - self._config.get_configuration('Startup_StartTime')).total_seconds(), 2)
|
||||
self._config.add_configuration('Startup_InitTime', startup_init_time)
|
||||
logger: LoggerABC = provider.get_service(LoggerABC)
|
||||
logger.debug(__name__, f'Startup Init time: {startup_init_time}s')
|
||||
|
||||
|
@@ -15,11 +15,11 @@ __title__ = 'gismo_core'
|
||||
__author__ = 'Sven Heidemann'
|
||||
__license__ = 'MIT'
|
||||
__copyright__ = 'Copyright (c) 2021 - 2022 sh-edraft.de'
|
||||
__version__ = '0.3.0'
|
||||
__version__ = '0.4.2'
|
||||
|
||||
from collections import namedtuple
|
||||
|
||||
# imports
|
||||
|
||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||
version_info = VersionInfo(major='0', minor='4', micro='2')
|
||||
|
@@ -15,11 +15,11 @@ __title__ = 'gismo_core.abc'
|
||||
__author__ = 'Sven Heidemann'
|
||||
__license__ = 'MIT'
|
||||
__copyright__ = 'Copyright (c) 2021 - 2022 sh-edraft.de'
|
||||
__version__ = '0.3.0'
|
||||
__version__ = '0.4.2'
|
||||
|
||||
from collections import namedtuple
|
||||
|
||||
# imports
|
||||
|
||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||
version_info = VersionInfo(major='0', minor='4', micro='2')
|
||||
|
16
src/gismo_core/abc/client_utils_service_abc.py
Normal file
16
src/gismo_core/abc/client_utils_service_abc.py
Normal file
@@ -0,0 +1,16 @@
|
||||
from abc import ABC, abstractmethod
|
||||
|
||||
|
||||
class ClientUtilsServiceABC(ABC):
|
||||
|
||||
@abstractmethod
|
||||
def __init__(self): pass
|
||||
|
||||
@abstractmethod
|
||||
def received_command(self, guild_id: int): pass
|
||||
|
||||
@abstractmethod
|
||||
def moved_user(self, guild_id: int): pass
|
||||
|
||||
@abstractmethod
|
||||
def get_client(self, dc_ic: int, guild_id: int): pass
|
11
src/gismo_core/abc/command_abc.py
Normal file
11
src/gismo_core/abc/command_abc.py
Normal file
@@ -0,0 +1,11 @@
|
||||
from abc import ABC, abstractmethod
|
||||
|
||||
from discord.ext import commands
|
||||
|
||||
from gismo_core.commands_meta import CommandsMeta
|
||||
|
||||
|
||||
class CommandABC(ABC, commands.Cog, metaclass=CommandsMeta):
|
||||
|
||||
@abstractmethod
|
||||
def __init__(self): pass
|
25
src/gismo_core/abc/events/__init__.py
Normal file
25
src/gismo_core/abc/events/__init__.py
Normal file
@@ -0,0 +1,25 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
gismo sh-edraft Gismo
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
sh-edraft Dicord bot Gismo
|
||||
|
||||
:copyright: (c) 2021 - 2022 sh-edraft.de
|
||||
:license: MIT, see LICENSE for more details.
|
||||
|
||||
"""
|
||||
|
||||
__title__ = 'gismo_core.abc.events'
|
||||
__author__ = 'Sven Heidemann'
|
||||
__license__ = 'MIT'
|
||||
__copyright__ = 'Copyright (c) 2021 - 2022 sh-edraft.de'
|
||||
__version__ = '0.4.2'
|
||||
|
||||
from collections import namedtuple
|
||||
|
||||
# imports:
|
||||
|
||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||
version_info = VersionInfo(major='0', minor='4', micro='2')
|
@@ -12,16 +12,16 @@ class MessageServiceABC(ABC):
|
||||
def __init__(self): pass
|
||||
|
||||
@abstractmethod
|
||||
async def delete_messages(self, messages: List[discord.Message]): pass
|
||||
async def delete_messages(self, messages: List[discord.Message], guild_id: int): pass
|
||||
|
||||
@abstractmethod
|
||||
async def delete_message(self, message: discord.Message): pass
|
||||
|
||||
@abstractmethod
|
||||
async def send_channel_message(self, channel: discord.TextChannel, message: str): pass
|
||||
async def send_channel_message(self, channel: discord.TextChannel, message: Union[str, discord.Embed]): pass
|
||||
|
||||
@abstractmethod
|
||||
async def send_dm_message(self, message: str, receiver: Union[discord.User, discord.Member]): pass
|
||||
async def send_dm_message(self, message: Union[str, discord.Embed], receiver: Union[discord.User, discord.Member]): pass
|
||||
|
||||
@abstractmethod
|
||||
async def send_ctx_msg(self, ctx: Context, message: str, file: discord.File = None): pass
|
||||
async def send_ctx_msg(self, ctx: Context, message: Union[str, discord.Embed], file: discord.File = None, is_persistent: bool = False, wait_before_delete: int = None): pass
|
||||
|
@@ -1,12 +1,22 @@
|
||||
from abc import ABC, abstractmethod
|
||||
from typing import Optional
|
||||
|
||||
|
||||
class ModuleABC(ABC):
|
||||
|
||||
@abstractmethod
|
||||
def __init__(self):
|
||||
self._priorities = {}
|
||||
def __init__(self, priorities: dict[type, int], settings_types: list[Optional[type]]):
|
||||
self._priorities = priorities
|
||||
self._success = True
|
||||
self._settings_types = settings_types
|
||||
|
||||
@property
|
||||
def success(self) -> bool:
|
||||
return self._success
|
||||
|
||||
@property
|
||||
def settings_types(self) -> list[type]:
|
||||
return self._settings_types
|
||||
|
||||
def get_priority(self, t: type) -> int:
|
||||
if t not in self._priorities:
|
||||
@@ -15,7 +25,3 @@ class ModuleABC(ABC):
|
||||
|
||||
def stop_propagation(self):
|
||||
self._success = False
|
||||
|
||||
@property
|
||||
def success(self) -> bool:
|
||||
return self._success
|
@@ -10,6 +10,9 @@ class ModuleServiceABC(ABC):
|
||||
@abstractmethod
|
||||
def __init__(self): pass
|
||||
|
||||
@abstractmethod
|
||||
def load_modules(self): pass
|
||||
|
||||
@abstractmethod
|
||||
async def on_connect(self): pass
|
||||
|
5
src/gismo_core/commands_meta.py
Normal file
5
src/gismo_core/commands_meta.py
Normal file
@@ -0,0 +1,5 @@
|
||||
from abc import ABCMeta
|
||||
from discord.ext import commands
|
||||
|
||||
|
||||
class CommandsMeta(ABCMeta, commands.CogMeta): pass
|
@@ -15,11 +15,11 @@ __title__ = 'gismo_core.configuration'
|
||||
__author__ = 'Sven Heidemann'
|
||||
__license__ = 'MIT'
|
||||
__copyright__ = 'Copyright (c) 2021 - 2022 sh-edraft.de'
|
||||
__version__ = '0.3.0'
|
||||
__version__ = '0.4.2'
|
||||
|
||||
from collections import namedtuple
|
||||
|
||||
# imports
|
||||
|
||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||
version_info = VersionInfo(major='0', minor='4', micro='2')
|
||||
|
@@ -19,5 +19,5 @@ class DiscordSettings(ConfigurationModelABC):
|
||||
try:
|
||||
self._token = settings['Token']
|
||||
except Exception as e:
|
||||
Console.error(f'[ ERROR ] [ {__name__} ]: Reading error in {self.__name__} settings')
|
||||
Console.error(f'[ ERROR ] [ {__name__} ]: Reading error in {__name__} settings')
|
||||
Console.error(f'[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}')
|
||||
|
53
src/gismo_core/configuration/embed_description_settings.py
Normal file
53
src/gismo_core/configuration/embed_description_settings.py
Normal file
@@ -0,0 +1,53 @@
|
||||
import traceback
|
||||
from typing import Optional
|
||||
|
||||
from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC
|
||||
from cpl_core.console import Console
|
||||
from cpl_query.extension import List
|
||||
|
||||
from gismo_core.model.embed_description import EmbedDescription
|
||||
from gismo_core.model.embed_description_field import EmbedDescriptionField
|
||||
|
||||
|
||||
class EmbedDescriptionSettings(ConfigurationModelABC):
|
||||
|
||||
def __init__(self):
|
||||
ConfigurationModelABC.__init__(self)
|
||||
|
||||
self._embed_description: Optional[EmbedDescription] = None
|
||||
|
||||
@property
|
||||
def embed_description(self) -> EmbedDescription:
|
||||
return self._embed_description
|
||||
|
||||
def from_dict(self, settings: dict):
|
||||
try:
|
||||
title = ''
|
||||
description = ''
|
||||
url = ''
|
||||
color = ''
|
||||
fields = List(EmbedDescriptionField)
|
||||
footer = ''
|
||||
|
||||
for key in settings:
|
||||
if key == 'Title':
|
||||
title = settings[key]
|
||||
elif key == 'Description':
|
||||
description = settings[key]
|
||||
elif key == 'URL':
|
||||
url = settings[key]
|
||||
elif key == 'Color':
|
||||
color = settings[key]
|
||||
elif key == 'Fields':
|
||||
for field in settings[key]:
|
||||
fields.append(EmbedDescriptionField(field['Name'], field['Value'], bool(field['Inline'])))
|
||||
elif key == 'Footer':
|
||||
footer = settings[key]
|
||||
else:
|
||||
raise Exception(f'Unexpected key {key}')
|
||||
|
||||
self._embed_description = EmbedDescription(title, description, url, color, fields, footer)
|
||||
|
||||
except Exception as e:
|
||||
Console.error(f'[ ERROR ] [ {__name__} ]: Reading error in {self.__name__} settings')
|
||||
Console.error(f'[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}')
|
@@ -11,20 +11,10 @@ class ServerSettings(ConfigurationModelABC):
|
||||
|
||||
self._id: int = 0
|
||||
self._message_delete_timer: int = 0
|
||||
self._login_message_channel_id: int = 0
|
||||
self._login_message: str = ''
|
||||
self._welcome_message: str = ''
|
||||
self._welcome_message_for_team: str = ''
|
||||
self._goodbye_message: str = ''
|
||||
self._max_voice_state_hours: int = 0
|
||||
self._xp_per_message: int = 0
|
||||
self._xp_per_ontime_hour: int = 0
|
||||
self._afk_channel_ids: list[int] = []
|
||||
self._admin_roles: list[int] = []
|
||||
self._moderator_roles: list[int] = []
|
||||
self._bot_has_no_permission_message: str = ''
|
||||
|
||||
@property
|
||||
def id(self) -> str:
|
||||
def id(self) -> int:
|
||||
return self._id
|
||||
|
||||
@property
|
||||
@@ -32,69 +22,14 @@ class ServerSettings(ConfigurationModelABC):
|
||||
return self._message_delete_timer
|
||||
|
||||
@property
|
||||
def login_message_channel_id(self) -> int:
|
||||
return self._login_message_channel_id
|
||||
|
||||
@property
|
||||
def login_message(self) -> str:
|
||||
return self._login_message
|
||||
|
||||
@property
|
||||
def welcome_message(self) -> str:
|
||||
return self._welcome_message
|
||||
|
||||
@property
|
||||
def welcome_message_for_team(self) -> str:
|
||||
return self._welcome_message_for_team
|
||||
|
||||
@property
|
||||
def goodbye_message(self) -> str:
|
||||
return self._goodbye_message
|
||||
|
||||
@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_ontime_hour(self) -> int:
|
||||
return self._xp_per_ontime_hour
|
||||
|
||||
@property
|
||||
def afk_channel_ids(self) -> list[int]:
|
||||
return self._afk_channel_ids
|
||||
|
||||
@property
|
||||
def admin_roles(self) -> list[int]:
|
||||
return self._admin_roles
|
||||
|
||||
@property
|
||||
def moderator_roles(self) -> list[int]:
|
||||
return self._moderator_roles
|
||||
def bot_has_no_permission_message(self) -> str:
|
||||
return self._bot_has_no_permission_message
|
||||
|
||||
def from_dict(self, settings: dict):
|
||||
try:
|
||||
self._id = int(settings['Id'])
|
||||
self._message_delete_timer = int(settings['MessageDeleteTimer'])
|
||||
self._login_message_channel_id = int(settings['LoginMessageChannelId'])
|
||||
self._login_message = settings['LoginMessage']
|
||||
self._welcome_message = settings['WelcomeMessage']
|
||||
self._welcome_message_for_team = settings['WelcomeMessageForTeam']
|
||||
self._goodbye_message = settings['GoodbyeMessage']
|
||||
self._max_voice_state_hours = int(settings['MaxVoiceStateHours'])
|
||||
self._xp_per_message = int(settings['XpPerMessage'])
|
||||
self._xp_per_ontime_hour = int(settings['XpPerOntimeHour'])
|
||||
for id in settings['AFKChannelIds']:
|
||||
self._afk_channel_ids.append(int(id))
|
||||
|
||||
for id in settings['AdminRoleIds']:
|
||||
self._admin_roles.append(int(id))
|
||||
|
||||
for id in settings['ModeratorRoleIds']:
|
||||
self._moderator_roles.append(int(id))
|
||||
self._bot_has_no_permission_message = settings['BotHasNoPermissionMessage']
|
||||
except Exception as e:
|
||||
Console.error(f'[ ERROR ] [ {__name__} ]: Reading error in settings')
|
||||
Console.error(f'[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}')
|
||||
|
@@ -11,15 +11,15 @@ sh-edraft Dicord bot Gismo
|
||||
|
||||
"""
|
||||
|
||||
__title__ = 'modules_core'
|
||||
__title__ = 'gismo_core.model'
|
||||
__author__ = 'Sven Heidemann'
|
||||
__license__ = 'MIT'
|
||||
__copyright__ = 'Copyright (c) 2021 - 2022 sh-edraft.de'
|
||||
__version__ = '0.3.0'
|
||||
__version__ = '0.4.2'
|
||||
|
||||
from collections import namedtuple
|
||||
|
||||
# imports
|
||||
|
||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||
version_info = VersionInfo(major='0', minor='4', micro='2')
|
60
src/gismo_core/model/embed_description.py
Normal file
60
src/gismo_core/model/embed_description.py
Normal file
@@ -0,0 +1,60 @@
|
||||
from cpl_query.extension import List
|
||||
|
||||
from gismo_core.model.embed_description_field import EmbedDescriptionField
|
||||
|
||||
|
||||
class EmbedDescription:
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
title: str = None,
|
||||
description: str = None,
|
||||
url: str = None,
|
||||
color: str = None,
|
||||
fields: list[EmbedDescriptionField] = None,
|
||||
footer: str = None
|
||||
):
|
||||
self._title = title
|
||||
self._description = description
|
||||
self._url = url
|
||||
self._color = color
|
||||
self._fields = fields
|
||||
self._footer = footer
|
||||
|
||||
@property
|
||||
def title(self) -> str:
|
||||
return self._title
|
||||
|
||||
@title.setter
|
||||
def title(self, value: str):
|
||||
self._title = value
|
||||
|
||||
@property
|
||||
def description(self) -> str:
|
||||
return self._description
|
||||
|
||||
@description.setter
|
||||
def description(self, value: str):
|
||||
self._description = value
|
||||
|
||||
@property
|
||||
def url(self) -> str:
|
||||
return self._url
|
||||
|
||||
@property
|
||||
def color(self) -> str:
|
||||
return self._color
|
||||
|
||||
@property
|
||||
def fields(self) -> list[EmbedDescriptionField]:
|
||||
return self._fields
|
||||
|
||||
@fields.setter
|
||||
def fields(self, value: list[EmbedDescriptionField]):
|
||||
self._fields = value
|
||||
|
||||
@property
|
||||
def footer(self) -> str:
|
||||
return self._footer
|
||||
|
||||
|
27
src/gismo_core/model/embed_description_field.py
Normal file
27
src/gismo_core/model/embed_description_field.py
Normal file
@@ -0,0 +1,27 @@
|
||||
class EmbedDescriptionField:
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
name: str,
|
||||
value: str,
|
||||
inline: bool
|
||||
):
|
||||
self._name = name
|
||||
self._value = value
|
||||
self._inline = inline
|
||||
|
||||
@property
|
||||
def name(self) -> str:
|
||||
return self._name
|
||||
|
||||
@property
|
||||
def value(self) -> str:
|
||||
return self._value
|
||||
|
||||
@value.setter
|
||||
def value(self, value: str):
|
||||
self._value = value
|
||||
|
||||
@property
|
||||
def inline(self) -> bool:
|
||||
return self._inline
|
@@ -15,11 +15,11 @@ __title__ = 'gismo_core.service'
|
||||
__author__ = 'Sven Heidemann'
|
||||
__license__ = 'MIT'
|
||||
__copyright__ = 'Copyright (c) 2021 - 2022 sh-edraft.de'
|
||||
__version__ = '0.3.0'
|
||||
__version__ = '0.4.2'
|
||||
|
||||
from collections import namedtuple
|
||||
|
||||
# imports
|
||||
|
||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||
version_info = VersionInfo(major='0', minor='4', micro='2')
|
||||
|
@@ -8,8 +8,8 @@ from gismo_core.abc.bot_service_abc import BotServiceABC
|
||||
from gismo_core.configuration.bot_settings import BotSettings
|
||||
from gismo_core.configuration.discord_settings import DiscordSettings
|
||||
from gismo_core.configuration.server_settings import ServerSettings
|
||||
from modules_core.abc.module_service_abc import ModuleServiceABC
|
||||
from modules_core.service.module_service import ModuleService
|
||||
from gismo_core.abc.module_service_abc import ModuleServiceABC
|
||||
from gismo_core.service.module_service import ModuleService
|
||||
|
||||
|
||||
class BotService(BotServiceABC, commands.Bot):
|
||||
@@ -25,7 +25,6 @@ class BotService(BotServiceABC, commands.Bot):
|
||||
logging_st: LoggingSettings,
|
||||
):
|
||||
# services
|
||||
self._config = config
|
||||
self._logger = logger
|
||||
self._modules = modules
|
||||
self._env = env
|
||||
@@ -33,7 +32,6 @@ class BotService(BotServiceABC, commands.Bot):
|
||||
|
||||
# settings
|
||||
self._discord_settings = discord_settings
|
||||
self._bot_settings: BotSettings = bot_settings
|
||||
|
||||
# setup super
|
||||
commands.Bot.__init__(self, command_prefix=bot_settings.prefix, help_command=None, intents=discord.Intents().all())
|
||||
@@ -41,7 +39,7 @@ class BotService(BotServiceABC, commands.Bot):
|
||||
async def start_async(self):
|
||||
self._logger.trace(__name__, 'Try to connect to discord')
|
||||
|
||||
self.add_cog(self._modules)
|
||||
self._modules.load_modules()
|
||||
|
||||
await self.start(self._discord_settings.token)
|
||||
# continue at on_ready
|
||||
@@ -57,15 +55,10 @@ class BotService(BotServiceABC, commands.Bot):
|
||||
async def on_ready(self):
|
||||
self._logger.info(__name__, 'Connected to discord')
|
||||
|
||||
self._logger.debug(__name__, 'Try to load discord server configs')
|
||||
for server in self._bot_settings.servers:
|
||||
server: ServerSettings = server
|
||||
self._logger.trace(__name__, f'Try to load config for server: {server.id}')
|
||||
self._config.add_configuration(f'DSERVER_{server.id}', server)
|
||||
self._logger.trace(__name__, f'Loaded config for server: {server.id}')
|
||||
|
||||
self._logger.header(f'{self.user.name}:')
|
||||
if self._logging_st.console.value >= LoggingLevelEnum.INFO.value:
|
||||
Console.banner(self._env.application_name if self._env.application_name != '' else 'Gismo')
|
||||
|
||||
self.add_cog(self._modules)
|
||||
|
||||
await self._modules.on_ready()
|
||||
|
41
src/gismo_core/service/client_utils_service.py
Normal file
41
src/gismo_core/service/client_utils_service.py
Normal file
@@ -0,0 +1,41 @@
|
||||
from cpl_core.database.context import DatabaseContextABC
|
||||
|
||||
from gismo_core.abc.bot_service_abc import BotServiceABC
|
||||
from gismo_core.abc.client_utils_service_abc import ClientUtilsServiceABC
|
||||
from gismo_data.abc.client_repository_abc import ClientRepositoryABC
|
||||
from gismo_data.abc.server_repository_abc import ServerRepositoryABC
|
||||
|
||||
|
||||
class ClientUtilsService(ClientUtilsServiceABC):
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
bot: BotServiceABC,
|
||||
servers: ServerRepositoryABC,
|
||||
clients: ClientRepositoryABC,
|
||||
db: DatabaseContextABC
|
||||
):
|
||||
ClientUtilsServiceABC.__init__(self)
|
||||
self._bot = bot
|
||||
self._servers = servers
|
||||
self._clients = clients
|
||||
self._db = db
|
||||
|
||||
def received_command(self, guild_id: int):
|
||||
server = self._servers.get_server_by_discord_id(guild_id)
|
||||
client = self._clients.find_client_by_discord_id_and_server_id(self._bot.user.id, server.server_id)
|
||||
client.received_command_count += 1
|
||||
self._clients.update_client(client)
|
||||
self._db.save_changes()
|
||||
|
||||
def moved_user(self, guild_id: int):
|
||||
server = self._servers.get_server_by_discord_id(guild_id)
|
||||
client = self._clients.find_client_by_discord_id_and_server_id(self._bot.user.id, server.server_id)
|
||||
client.moved_users_count += 1
|
||||
self._clients.update_client(client)
|
||||
self._db.save_changes()
|
||||
|
||||
def get_client(self, dc_ic: int, guild_id: int):
|
||||
server = self._servers.get_server_by_discord_id(guild_id)
|
||||
client = self._clients.find_client_by_discord_id_and_server_id(self._bot.user.id, server.server_id)
|
||||
return client
|
23
src/gismo_core/service/embed_service.py
Normal file
23
src/gismo_core/service/embed_service.py
Normal file
@@ -0,0 +1,23 @@
|
||||
import discord
|
||||
|
||||
from gismo_core.model.embed_description import EmbedDescription
|
||||
|
||||
|
||||
class EmbedService:
|
||||
|
||||
@staticmethod
|
||||
def get_embed(description: EmbedDescription) -> discord.Embed:
|
||||
embed = discord.Embed(
|
||||
title=description.title,
|
||||
url=description.url,
|
||||
description=description.description,
|
||||
color=int(description.color, 16)
|
||||
)
|
||||
|
||||
for field in description.fields:
|
||||
embed.add_field(name=field.name, value=field.value, inline=field.inline)
|
||||
|
||||
if description.footer is not None:
|
||||
embed.set_footer(text=description.footer)
|
||||
|
||||
return embed
|
@@ -23,15 +23,18 @@ class MessageService(MessageServiceABC):
|
||||
self._clients = clients
|
||||
self._db = db
|
||||
|
||||
async def delete_messages(self, messages: List[discord.Message]):
|
||||
async def delete_messages(self, messages: List[discord.Message], guild_id: int):
|
||||
self._logger.debug(__name__, f'Try to delete {messages.count()} messages')
|
||||
server_st: ServerSettings = self._config.get_configuration(f'DSERVER_{guild_id}')
|
||||
await asyncio.sleep(server_st.message_delete_timer)
|
||||
for message in messages:
|
||||
await self.delete_message(message)
|
||||
await self.delete_message(message, mass_delete=True)
|
||||
self._logger.debug(__name__, 'Deleting messages finished')
|
||||
|
||||
async def delete_message(self, message: discord.Message):
|
||||
async def delete_message(self, message: discord.Message, mass_delete=False):
|
||||
server_st: ServerSettings = self._config.get_configuration(f'DSERVER_{message.guild.id}')
|
||||
await asyncio.sleep(server_st.message_delete_timer)
|
||||
if not mass_delete:
|
||||
await asyncio.sleep(server_st.message_delete_timer)
|
||||
self._logger.debug(__name__, f'Try to delete message:\n\t{message}\n\t{message.content}')
|
||||
guild_id = message.guild.id
|
||||
try:
|
||||
@@ -39,35 +42,41 @@ class MessageService(MessageServiceABC):
|
||||
except Exception as e:
|
||||
self._logger.error(__name__, f'Deleting message failed', e)
|
||||
else:
|
||||
self._clients.apppend_deleted_message_count(self._bot.user.id, guild_id, 1)
|
||||
self._clients.append_deleted_message_count(self._bot.user.id, guild_id, 1)
|
||||
self._db.save_changes()
|
||||
self._logger.info(__name__, f'Deleted message {message}')
|
||||
|
||||
async def send_channel_message(self, channel: discord.TextChannel, message: str):
|
||||
async def send_channel_message(self, channel: discord.TextChannel, message: Union[str, discord.Embed]):
|
||||
self._logger.debug(__name__, f'Try to send message\n\t{message}\n\tto: {channel}')
|
||||
msg = None
|
||||
try:
|
||||
msg = await channel.send(message)
|
||||
if isinstance(message, discord.Embed):
|
||||
msg = await channel.send(embed=message)
|
||||
else:
|
||||
msg = await channel.send(message)
|
||||
except Exception as e:
|
||||
self._logger.error(__name__, f'Send message to channel {channel.id} failed', e)
|
||||
else:
|
||||
self._logger.info(__name__, f'Sent message to channel {channel.id}')
|
||||
self._clients.apppend_sent_message_count(self._bot.user.id, channel.guild.id, 1)
|
||||
self._clients.append_sent_message_count(self._bot.user.id, channel.guild.id, 1)
|
||||
self._db.save_changes()
|
||||
await self.delete_message(msg)
|
||||
|
||||
async def send_dm_message(self, message: str, receiver: Union[discord.User, discord.Member]):
|
||||
async def send_dm_message(self, message: Union[str, discord.Embed], receiver: Union[discord.User, discord.Member]):
|
||||
self._logger.debug(__name__, f'Try to send message\n\t{message}\n\tto: {receiver}')
|
||||
try:
|
||||
await receiver.send(message)
|
||||
if isinstance(message, discord.Embed):
|
||||
msg = await receiver.send(embed=message)
|
||||
else:
|
||||
msg = await receiver.send(message)
|
||||
except Exception as e:
|
||||
self._logger.error(__name__, f'Send message to user {receiver.id} failed', e)
|
||||
else:
|
||||
self._clients.apppend_sent_message_count(self._bot.user.id, receiver.guild.id, 1)
|
||||
self._clients.append_sent_message_count(self._bot.user.id, receiver.guild.id, 1)
|
||||
self._db.save_changes()
|
||||
self._logger.info(__name__, f'Sent message to user {receiver.id}')
|
||||
|
||||
async def send_ctx_msg(self, ctx: Context, message: Union[str, discord.File]):
|
||||
async def send_ctx_msg(self, ctx: Context, message: Union[str, discord.Embed], file: discord.File = None, is_persistent: bool = False, wait_before_delete: int = None):
|
||||
if ctx is None:
|
||||
self._logger.warn(__name__, 'Message context is empty')
|
||||
self._logger.debug(__name__, f'Message: {message}')
|
||||
@@ -76,14 +85,21 @@ class MessageService(MessageServiceABC):
|
||||
self._logger.debug(__name__, f'Try to send message\t\t{message}\n\tto: {ctx.channel}')
|
||||
msg = None
|
||||
try:
|
||||
if isinstance(message, discord.File):
|
||||
msg = await ctx.send(file=message)
|
||||
if isinstance(message, discord.Embed):
|
||||
msg = await ctx.send(embed=message, file=file)
|
||||
else:
|
||||
msg = await ctx.send(message)
|
||||
msg = await ctx.send(message, file=file)
|
||||
except Exception as e:
|
||||
self._logger.error(__name__, f'Send message to channel {ctx.channel.id} failed', e)
|
||||
else:
|
||||
self._logger.info(__name__, f'Sent message to channel {ctx.channel.id}')
|
||||
self._clients.apppend_sent_message_count(self._bot.user.id, ctx.guild.id, 1)
|
||||
self._clients.append_sent_message_count(self._bot.user.id, ctx.guild.id, 1)
|
||||
self._db.save_changes()
|
||||
await self.delete_message(msg)
|
||||
if wait_before_delete is not None:
|
||||
await asyncio.sleep(wait_before_delete)
|
||||
|
||||
if is_persistent:
|
||||
await self.delete_message(ctx.message)
|
||||
return
|
||||
|
||||
await self.delete_messages(List(discord.Message, [msg, ctx.message]), ctx.guild.id)
|
||||
|
@@ -1,106 +1,127 @@
|
||||
from abc import ABC, ABCMeta
|
||||
from datetime import datetime
|
||||
from typing import Optional, Sequence, Union
|
||||
import json
|
||||
from typing import Optional, Sequence, Union, Type
|
||||
|
||||
import discord
|
||||
from cpl_core.configuration import ConfigurationModelABC, ConfigurationABC
|
||||
from cpl_core.dependency_injection import ServiceProviderABC
|
||||
from cpl_core.environment import ApplicationEnvironmentABC
|
||||
from cpl_core.logging import LoggerABC
|
||||
from cpl_core.utils import String
|
||||
from cpl_query.extension import List
|
||||
from cpl_query.extension import List, OrderedIterableABC
|
||||
from discord.ext import commands
|
||||
from modules_core.abc.events.on_bulk_message_delete_abc import OnBulkMessageDeleteABC
|
||||
from modules_core.abc.events.on_connect_abc import OnConnectABC
|
||||
from modules_core.abc.events.on_disconnect_abc import OnDisconnectABC
|
||||
from modules_core.abc.events.on_group_join_abc import OnGroupJoinABC
|
||||
from modules_core.abc.events.on_group_remove_abc import OnGroupRemoveABC
|
||||
from modules_core.abc.events.on_guild_available_abc import OnGuildAvailableABC
|
||||
from modules_core.abc.events.on_guild_channel_create_abc import OnGuildChannelCreateABC
|
||||
from modules_core.abc.events.on_guild_channel_delete_abc import OnGuildChannelDeleteABC
|
||||
from modules_core.abc.events.on_guild_channel_pins_update_abc import OnGuildChannelPinsUpdateABC
|
||||
from modules_core.abc.events.on_guild_channel_update_abc import OnGuildChannelUpdateABC
|
||||
from modules_core.abc.events.on_guild_emojis_update_abc import OnGuildEmojisUpdateABC
|
||||
from modules_core.abc.events.on_guild_integrations_update_abc import OnGuildIntegrationsUpdateABC
|
||||
from modules_core.abc.events.on_guild_join_abc import OnGuildJoinABC
|
||||
from modules_core.abc.events.on_guild_remove_abc import OnGuildRemoveABC
|
||||
from modules_core.abc.events.on_guild_role_create_abc import OnGuildRoleCreateABC
|
||||
from modules_core.abc.events.on_guild_role_delete_abc import OnGuildRoleDeleteABC
|
||||
from modules_core.abc.events.on_guild_role_update_abc import OnGuildRoleUpdateABC
|
||||
from modules_core.abc.events.on_guild_unavailable_abc import OnGuildUnavailableABC
|
||||
from modules_core.abc.events.on_guild_update_abc import OnGuildUpdateABC
|
||||
from modules_core.abc.events.on_invite_create_abc import OnInviteCreateABC
|
||||
from modules_core.abc.events.on_invite_delete_abc import OnInviteDeleteABC
|
||||
from modules_core.abc.events.on_member_ban_abc import OnMemberBanABC
|
||||
from modules_core.abc.events.on_member_join_abc import OnMemberJoinABC
|
||||
from modules_core.abc.events.on_member_remove_abc import OnMemberRemoveABC
|
||||
from modules_core.abc.events.on_member_unban_abc import OnMemberUnbanABC
|
||||
from modules_core.abc.events.on_member_update_abc import OnMemberUpdateABC
|
||||
from modules_core.abc.events.on_message_abc import OnMessageABC
|
||||
from modules_core.abc.events.on_message_delete_abc import OnMessageDeleteABC
|
||||
from modules_core.abc.events.on_message_edit_abc import OnMessageEditABC
|
||||
from modules_core.abc.events.on_private_channel_create_abc import OnPrivateChannelCreateABC
|
||||
from modules_core.abc.events.on_private_channel_delete_abc import OnPrivateChannelDeleteABC
|
||||
from modules_core.abc.events.on_private_channel_pins_update_abc import OnPrivateChannelPinsUpdateABC
|
||||
from modules_core.abc.events.on_private_channel_update_abc import OnPrivateChannelUpdateABC
|
||||
from modules_core.abc.events.on_reaction_add_abc import OnReactionAddABC
|
||||
from modules_core.abc.events.on_reaction_clear_abc import OnReactionClearABC
|
||||
from modules_core.abc.events.on_reaction_clear_emoji_abc import OnReactionClearEmojiABC
|
||||
from modules_core.abc.events.on_reaction_remove_abc import OnReactionRemoveABC
|
||||
from modules_core.abc.events.on_ready_abc import OnReadyABC
|
||||
from modules_core.abc.events.on_relationship_add_abc import OnRelationshipAddABC
|
||||
from modules_core.abc.events.on_relationship_remove_abc import OnRelationshipRemoveABC
|
||||
from modules_core.abc.events.on_relationship_update_abc import OnRelationshipUpdateABC
|
||||
from modules_core.abc.events.on_resume_abc import OnResumeABC
|
||||
from modules_core.abc.events.on_typing_abc import OnTypingABC
|
||||
from modules_core.abc.events.on_user_update_abc import OnUserUpdateABC
|
||||
from modules_core.abc.events.on_voice_state_update_abc import OnVoiceStateUpdateABC
|
||||
from modules_core.abc.events.on_webhooks_update_abc import OnWebhooksUpdateABC
|
||||
from modules_core.abc.module_abc import ModuleABC
|
||||
from modules_core.abc.module_service_abc import ModuleServiceABC
|
||||
from gismo_core.abc.events.on_bulk_message_delete_abc import OnBulkMessageDeleteABC
|
||||
from gismo_core.abc.events.on_connect_abc import OnConnectABC
|
||||
from gismo_core.abc.events.on_disconnect_abc import OnDisconnectABC
|
||||
from gismo_core.abc.events.on_group_join_abc import OnGroupJoinABC
|
||||
from gismo_core.abc.events.on_group_remove_abc import OnGroupRemoveABC
|
||||
from gismo_core.abc.events.on_guild_available_abc import OnGuildAvailableABC
|
||||
from gismo_core.abc.events.on_guild_channel_create_abc import OnGuildChannelCreateABC
|
||||
from gismo_core.abc.events.on_guild_channel_delete_abc import OnGuildChannelDeleteABC
|
||||
from gismo_core.abc.events.on_guild_channel_pins_update_abc import OnGuildChannelPinsUpdateABC
|
||||
from gismo_core.abc.events.on_guild_channel_update_abc import OnGuildChannelUpdateABC
|
||||
from gismo_core.abc.events.on_guild_emojis_update_abc import OnGuildEmojisUpdateABC
|
||||
from gismo_core.abc.events.on_guild_integrations_update_abc import OnGuildIntegrationsUpdateABC
|
||||
from gismo_core.abc.events.on_guild_join_abc import OnGuildJoinABC
|
||||
from gismo_core.abc.events.on_guild_remove_abc import OnGuildRemoveABC
|
||||
from gismo_core.abc.events.on_guild_role_create_abc import OnGuildRoleCreateABC
|
||||
from gismo_core.abc.events.on_guild_role_delete_abc import OnGuildRoleDeleteABC
|
||||
from gismo_core.abc.events.on_guild_role_update_abc import OnGuildRoleUpdateABC
|
||||
from gismo_core.abc.events.on_guild_unavailable_abc import OnGuildUnavailableABC
|
||||
from gismo_core.abc.events.on_guild_update_abc import OnGuildUpdateABC
|
||||
from gismo_core.abc.events.on_invite_create_abc import OnInviteCreateABC
|
||||
from gismo_core.abc.events.on_invite_delete_abc import OnInviteDeleteABC
|
||||
from gismo_core.abc.events.on_member_ban_abc import OnMemberBanABC
|
||||
from gismo_core.abc.events.on_member_join_abc import OnMemberJoinABC
|
||||
from gismo_core.abc.events.on_member_remove_abc import OnMemberRemoveABC
|
||||
from gismo_core.abc.events.on_member_unban_abc import OnMemberUnbanABC
|
||||
from gismo_core.abc.events.on_member_update_abc import OnMemberUpdateABC
|
||||
from gismo_core.abc.events.on_message_abc import OnMessageABC
|
||||
from gismo_core.abc.events.on_message_delete_abc import OnMessageDeleteABC
|
||||
from gismo_core.abc.events.on_message_edit_abc import OnMessageEditABC
|
||||
from gismo_core.abc.events.on_private_channel_create_abc import OnPrivateChannelCreateABC
|
||||
from gismo_core.abc.events.on_private_channel_delete_abc import OnPrivateChannelDeleteABC
|
||||
from gismo_core.abc.events.on_private_channel_pins_update_abc import OnPrivateChannelPinsUpdateABC
|
||||
from gismo_core.abc.events.on_private_channel_update_abc import OnPrivateChannelUpdateABC
|
||||
from gismo_core.abc.events.on_reaction_add_abc import OnReactionAddABC
|
||||
from gismo_core.abc.events.on_reaction_clear_abc import OnReactionClearABC
|
||||
from gismo_core.abc.events.on_reaction_clear_emoji_abc import OnReactionClearEmojiABC
|
||||
from gismo_core.abc.events.on_reaction_remove_abc import OnReactionRemoveABC
|
||||
from gismo_core.abc.events.on_ready_abc import OnReadyABC
|
||||
from gismo_core.abc.events.on_relationship_add_abc import OnRelationshipAddABC
|
||||
from gismo_core.abc.events.on_relationship_remove_abc import OnRelationshipRemoveABC
|
||||
from gismo_core.abc.events.on_relationship_update_abc import OnRelationshipUpdateABC
|
||||
from gismo_core.abc.events.on_resume_abc import OnResumeABC
|
||||
from gismo_core.abc.events.on_typing_abc import OnTypingABC
|
||||
from gismo_core.abc.events.on_user_update_abc import OnUserUpdateABC
|
||||
from gismo_core.abc.events.on_voice_state_update_abc import OnVoiceStateUpdateABC
|
||||
from gismo_core.abc.events.on_webhooks_update_abc import OnWebhooksUpdateABC
|
||||
from gismo_core.abc.module_abc import ModuleABC
|
||||
from gismo_core.abc.module_service_abc import ModuleServiceABC
|
||||
from gismo_core.commands_meta import CommandsMeta
|
||||
|
||||
|
||||
class _MetaCogABC(ABCMeta, commands.CogMeta): pass
|
||||
class ModuleService(ModuleServiceABC, commands.Cog, metaclass=CommandsMeta):
|
||||
|
||||
|
||||
class ModuleService(ModuleServiceABC, commands.Cog, metaclass=_MetaCogABC):
|
||||
|
||||
def __init__(self, logger: LoggerABC, services: ServiceProviderABC, env: ApplicationEnvironmentABC):
|
||||
def __init__(self, logger: LoggerABC, config: ConfigurationABC, services: ServiceProviderABC, env: ApplicationEnvironmentABC):
|
||||
self._logger = logger
|
||||
self._config = config
|
||||
self._services = services
|
||||
self._env = env
|
||||
self._modules: List[ModuleABC] = List()
|
||||
self._modules.extend(ModuleABC.__subclasses__())
|
||||
|
||||
def _get_modules(self, t: type) -> List[ModuleABC]:
|
||||
module_types = self._modules.where(lambda m: issubclass(m, t))
|
||||
modules = List(t)
|
||||
for module_type in module_types:
|
||||
module = self._services.get_service(module_type)
|
||||
if module is None:
|
||||
self._logger.warn(__name__, f'Module {module_type} not found in services!')
|
||||
break
|
||||
modules.append(module)
|
||||
|
||||
return modules.order_by(lambda m: m.get_priority(t))
|
||||
self._modules_types: List[Type[ModuleABC]] = List()
|
||||
self._modules_types.extend(ModuleABC.__subclasses__())
|
||||
self._modules: List[ModuleABC] = List(ModuleABC)
|
||||
|
||||
async def _handle_event(self, event: type, *args):
|
||||
self._logger.debug(__name__, f'Start {event} modules')
|
||||
modules = self._get_modules(event)
|
||||
# modules = self._get_modules(event)
|
||||
modules = self._modules.where(lambda m: isinstance(m, event)).order_by(lambda m: m.get_priority(event))
|
||||
|
||||
if modules.count() < 1:
|
||||
self._logger.debug(__name__, f'Stopped {event} modules')
|
||||
return
|
||||
|
||||
func_name = String.convert_to_snake_case(event.__name__.split('ABC')[0])
|
||||
for module in modules:
|
||||
func = getattr(module, func_name)
|
||||
await func(*args)
|
||||
if not module.success:
|
||||
self._logger.debug(__name__, f'Stopped propagation for {event} from {type(module)}')
|
||||
break
|
||||
try:
|
||||
func_name = String.convert_to_snake_case(event.__name__.split('ABC')[0])
|
||||
for module in modules:
|
||||
self._logger.trace(__name__, f'Start {type(module)} module')
|
||||
func = getattr(module, func_name)
|
||||
await func(*args)
|
||||
if not module.success:
|
||||
self._logger.debug(__name__, f'Stopped propagation for {event} from {type(module)}')
|
||||
break
|
||||
except Exception as e:
|
||||
self._logger.error(__name__, f'Start {event} modules failed', e)
|
||||
|
||||
self._logger.debug(__name__, f'Stopped {event} modules')
|
||||
|
||||
def load_modules(self):
|
||||
self._logger.debug(__name__, f'Start loading modules')
|
||||
for module_type in self._modules_types:
|
||||
module: ModuleABC = self._services.get_service(module_type)
|
||||
if module is None:
|
||||
self._logger.warn(__name__, f'Module {module_type} not found in services!')
|
||||
break
|
||||
|
||||
loaded_settings: list[str] = []
|
||||
for settings_type in module.settings_types:
|
||||
settings_name = settings_type.__name__.split('Settings')[0]
|
||||
if settings_name in loaded_settings:
|
||||
continue
|
||||
|
||||
with open(f'config/{String.convert_to_snake_case(settings_name).lower()}.json', encoding='utf-8') as cfg:
|
||||
json_cfg = json.load(cfg)
|
||||
for index in json_cfg:
|
||||
settings: ConfigurationModelABC = settings_type()
|
||||
settings.from_dict(json_cfg[index])
|
||||
self._config.add_configuration(f'{type(module).__name__}_{index}', settings)
|
||||
self._logger.debug(__name__, f'Added config: {type(module).__name__}_{index}')
|
||||
|
||||
loaded_settings.append(settings_name)
|
||||
|
||||
self._modules.append(module)
|
||||
|
||||
@commands.Cog.listener()
|
||||
async def on_connect(self):
|
||||
self._logger.trace(__name__, f'Received on_connect')
|
@@ -15,11 +15,11 @@ __title__ = 'gismo_data'
|
||||
__author__ = 'Sven Heidemann'
|
||||
__license__ = 'MIT'
|
||||
__copyright__ = 'Copyright (c) 2021 - 2022 sh-edraft.de'
|
||||
__version__ = '0.3.0'
|
||||
__version__ = '0.4.2'
|
||||
|
||||
from collections import namedtuple
|
||||
|
||||
# imports
|
||||
|
||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||
version_info = VersionInfo(major='0', minor='4', micro='2')
|
||||
|
@@ -15,11 +15,11 @@ __title__ = 'gismo_data.abc'
|
||||
__author__ = 'Sven Heidemann'
|
||||
__license__ = 'MIT'
|
||||
__copyright__ = 'Copyright (c) 2021 - 2022 sh-edraft.de'
|
||||
__version__ = '0.3.0'
|
||||
__version__ = '0.4.2'
|
||||
|
||||
from collections import namedtuple
|
||||
|
||||
# imports
|
||||
|
||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||
version_info = VersionInfo(major='0', minor='4', micro='2')
|
||||
|
@@ -14,7 +14,7 @@ class ClientRepositoryABC(ABC):
|
||||
def get_clients(self) -> List[Client]: pass
|
||||
|
||||
@abstractmethod
|
||||
def get_client_by_id(self, id: int) -> Client: pass
|
||||
def get_client_by_id(self, client_id: int) -> Client: pass
|
||||
|
||||
@abstractmethod
|
||||
def get_client_by_discord_id(self, discord_id: int) -> Client: pass
|
||||
@@ -38,16 +38,16 @@ class ClientRepositoryABC(ABC):
|
||||
def delete_client(self, client: Client): pass
|
||||
|
||||
@abstractmethod
|
||||
def apppend_sent_message_count(self, id: int, server_id: int, value: int): pass
|
||||
def append_sent_message_count(self, client_id: int, server_id: int, value: int): pass
|
||||
|
||||
@abstractmethod
|
||||
def apppend_received_message_count(self, id: int, server_id: int, value: int): pass
|
||||
def append_received_message_count(self, client_id: int, server_id: int, value: int): pass
|
||||
|
||||
@abstractmethod
|
||||
def apppend_deleted_message_count(self, id: int, server_id: int, value: int): pass
|
||||
def append_deleted_message_count(self, client_id: int, server_id: int, value: int): pass
|
||||
|
||||
@abstractmethod
|
||||
def apppend_received_command_count(self, id: int, server_id: int, value: int): pass
|
||||
def append_received_command_count(self, client_id: int, server_id: int, value: int): pass
|
||||
|
||||
@abstractmethod
|
||||
def apppend_moved_users_count(self, id: int, server_id: int, value: int): pass
|
||||
def append_moved_users_count(self, client_id: int, server_id: int, value: int): pass
|
||||
|
@@ -24,6 +24,9 @@ class UserJoinedVoiceChannelRepositoryABC(ABC):
|
||||
@abstractmethod
|
||||
def find_active_user_joined_voice_channel_by_user_id(self, user_id: int) -> Optional[UserJoinedVoiceChannel]: pass
|
||||
|
||||
@abstractmethod
|
||||
def find_active_user_joined_voice_channels_by_user_id(self, user_id: int) -> List[Optional[UserJoinedVoiceChannel]]: pass
|
||||
|
||||
@abstractmethod
|
||||
def add_user_joined_voice_channel(self, user_joined_voice_channel: UserJoinedVoiceChannel): pass
|
||||
|
||||
|
@@ -11,7 +11,6 @@ class DBContext(DatabaseContext):
|
||||
|
||||
DatabaseContext.__init__(self)
|
||||
|
||||
|
||||
def connect(self, database_settings: DatabaseSettings):
|
||||
try:
|
||||
self._logger.debug(__name__, "Connecting to database")
|
||||
|
@@ -15,11 +15,11 @@ __title__ = 'gismo_data.migration'
|
||||
__author__ = 'Sven Heidemann'
|
||||
__license__ = 'MIT'
|
||||
__copyright__ = 'Copyright (c) 2021 - 2022 sh-edraft.de'
|
||||
__version__ = '0.3.0'
|
||||
__version__ = '0.4.2'
|
||||
|
||||
from collections import namedtuple
|
||||
|
||||
# imports
|
||||
|
||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||
version_info = VersionInfo(major='0', minor='4', micro='2')
|
||||
|
@@ -3,6 +3,7 @@ from cpl_core.logging import LoggerABC
|
||||
from gismo_data.abc.migration_abc import MigrationABC
|
||||
from gismo_data.db_context import DBContext
|
||||
|
||||
|
||||
class Migration_0_3(MigrationABC):
|
||||
|
||||
def __init__(self, logger: LoggerABC, db: DBContext):
|
||||
|
@@ -3,6 +3,7 @@ from cpl_core.logging import LoggerABC
|
||||
from gismo_data.abc.migration_abc import MigrationABC
|
||||
from gismo_data.db_context import DBContext
|
||||
|
||||
|
||||
class Migration_0_3_1(MigrationABC):
|
||||
|
||||
def __init__(self, logger: LoggerABC, db: DBContext):
|
||||
|
@@ -15,11 +15,11 @@ __title__ = 'gismo_data.model'
|
||||
__author__ = 'Sven Heidemann'
|
||||
__license__ = 'MIT'
|
||||
__copyright__ = 'Copyright (c) 2021 - 2022 sh-edraft.de'
|
||||
__version__ = '0.3.0'
|
||||
__version__ = '0.4.2'
|
||||
|
||||
from collections import namedtuple
|
||||
|
||||
# imports
|
||||
|
||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||
version_info = VersionInfo(major='0', minor='4', micro='2')
|
||||
|
@@ -15,11 +15,11 @@ __title__ = 'gismo_data.service'
|
||||
__author__ = 'Sven Heidemann'
|
||||
__license__ = 'MIT'
|
||||
__copyright__ = 'Copyright (c) 2021 - 2022 sh-edraft.de'
|
||||
__version__ = '0.3.0'
|
||||
__version__ = '0.4.2'
|
||||
|
||||
from collections import namedtuple
|
||||
|
||||
# imports
|
||||
|
||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||
version_info = VersionInfo(major='0', minor='4', micro='2')
|
||||
|
@@ -37,9 +37,9 @@ class ClientRepositoryService(ClientRepositoryABC):
|
||||
|
||||
return clients
|
||||
|
||||
def get_client_by_id(self, id: int) -> Client:
|
||||
self._logger.trace(__name__, f'Send SQL command: {Client.get_select_by_id_string(id)}')
|
||||
result = self._context.select(Client.get_select_by_id_string(id))
|
||||
def get_client_by_id(self, client_id: int) -> Client:
|
||||
self._logger.trace(__name__, f'Send SQL command: {Client.get_select_by_id_string(client_id)}')
|
||||
result = self._context.select(Client.get_select_by_id_string(client_id))
|
||||
return Client(
|
||||
result[1],
|
||||
result[2],
|
||||
@@ -147,27 +147,27 @@ class ClientRepositoryService(ClientRepositoryABC):
|
||||
|
||||
return client
|
||||
|
||||
def apppend_sent_message_count(self, id: int, server_id: int, value: int):
|
||||
client = self._get_client_and_server(id, server_id)
|
||||
def append_sent_message_count(self, client_id: int, server_id: int, value: int):
|
||||
client = self._get_client_and_server(client_id, server_id)
|
||||
client.sent_message_count += value
|
||||
self.update_client(client)
|
||||
|
||||
def apppend_received_message_count(self, id: int, server_id: int, value: int):
|
||||
client = self._get_client_and_server(id, server_id)
|
||||
def append_received_message_count(self, client_id: int, server_id: int, value: int):
|
||||
client = self._get_client_and_server(client_id, server_id)
|
||||
client.received_message_count += value
|
||||
self.update_client(client)
|
||||
|
||||
def apppend_deleted_message_count(self, id: int, server_id: int, value: int):
|
||||
client = self._get_client_and_server(id, server_id)
|
||||
def append_deleted_message_count(self, client_id: int, server_id: int, value: int):
|
||||
client = self._get_client_and_server(client_id, server_id)
|
||||
client.deleted_message_count += value
|
||||
self.update_client(client)
|
||||
|
||||
def apppend_received_command_count(self, id: int, server_id: int, value: int):
|
||||
client = self._get_client_and_server(id, server_id)
|
||||
def append_received_command_count(self, client_id: int, server_id: int, value: int):
|
||||
client = self._get_client_and_server(client_id, server_id)
|
||||
client.received_command_count += value
|
||||
self.update_client(client)
|
||||
|
||||
def apppend_moved_users_count(self, id: int, server_id: int, value: int):
|
||||
client = self._get_client_and_server(id, server_id)
|
||||
def append_moved_users_count(self, client_id: int, server_id: int, value: int):
|
||||
client = self._get_client_and_server(client_id, server_id)
|
||||
client.moved_users_count += value
|
||||
self.update_client(client)
|
||||
|
@@ -27,7 +27,7 @@ class KnownUserRepositoryService(KnownUserRepositoryABC):
|
||||
users.append(KnownUser(
|
||||
result[1],
|
||||
result[2],
|
||||
self._servers.get_server_by_id(result[3]),
|
||||
result[3],
|
||||
id=result[0]
|
||||
))
|
||||
|
||||
@@ -39,7 +39,7 @@ class KnownUserRepositoryService(KnownUserRepositoryABC):
|
||||
return KnownUser(
|
||||
result[1],
|
||||
result[2],
|
||||
self._servers.get_server_by_id(result[3]),
|
||||
result[3],
|
||||
id=result[0]
|
||||
)
|
||||
|
||||
@@ -49,7 +49,7 @@ class KnownUserRepositoryService(KnownUserRepositoryABC):
|
||||
return KnownUser(
|
||||
result[1],
|
||||
result[2],
|
||||
self._servers.get_server_by_id(result[3]),
|
||||
result[3],
|
||||
id=result[0]
|
||||
)
|
||||
|
||||
|
@@ -1,3 +1,5 @@
|
||||
from typing import Type
|
||||
|
||||
from cpl_core.database.context import DatabaseContextABC
|
||||
from cpl_core.dependency_injection import ServiceProviderABC
|
||||
from cpl_core.logging import LoggerABC
|
||||
@@ -15,7 +17,7 @@ class MigrationService:
|
||||
self._db = db
|
||||
self._cursor = db.cursor
|
||||
|
||||
self._migrations: list[MigrationABC] = MigrationABC.__subclasses__()
|
||||
self._migrations: list[Type[MigrationABC]] = MigrationABC.__subclasses__()
|
||||
|
||||
def migrate(self):
|
||||
self._logger.info(__name__, f"Running Migrations")
|
||||
@@ -28,8 +30,8 @@ class MigrationService:
|
||||
if result:
|
||||
# there is a table named "tableName"
|
||||
self._logger.trace(__name__, f"Running SQL Command: {MigrationHistory.get_select_by_id_string(migration_id)}")
|
||||
migration_from_db: MigrationHistory = self._db.select(MigrationHistory.get_select_by_id_string(migration_id))
|
||||
self._logger.trace(__name__, migration_from_db)
|
||||
migration_from_db = self._db.select(MigrationHistory.get_select_by_id_string(migration_id))
|
||||
self._logger.trace(__name__, str(migration_from_db))
|
||||
if migration_from_db is not None and len(migration_from_db) > 0:
|
||||
continue
|
||||
|
||||
|
@@ -27,9 +27,9 @@ class ServerRepositoryService(ServerRepositoryABC):
|
||||
|
||||
return servers
|
||||
|
||||
def get_server_by_id(self, id: int) -> Server:
|
||||
self._logger.trace(__name__, f'Send SQL command: {Server.get_select_by_id_string(id)}')
|
||||
result = self._context.select(Server.get_select_by_id_string(id))[0]
|
||||
def get_server_by_id(self, server_id: int) -> Server:
|
||||
self._logger.trace(__name__, f'Send SQL command: {Server.get_select_by_id_string(server_id)}')
|
||||
result = self._context.select(Server.get_select_by_id_string(server_id))[0]
|
||||
return Server(
|
||||
result[1],
|
||||
id=result[0]
|
||||
|
@@ -2,9 +2,8 @@ from typing import Optional
|
||||
|
||||
from cpl_core.database.context import DatabaseContextABC
|
||||
from cpl_core.logging import LoggerABC
|
||||
from cpl_query.extension import List
|
||||
from cpl_query.extension import List, IterableABC
|
||||
from gismo_data.abc.user_repository_abc import UserRepositoryABC
|
||||
from gismo_data.model.user import User
|
||||
from gismo_data.model.user_joined_voice_channel import UserJoinedVoiceChannel
|
||||
|
||||
from gismo_data.abc.user_joined_voice_channel_abc import UserJoinedVoiceChannelRepositoryABC
|
||||
@@ -94,6 +93,23 @@ class UserJoinedVoiceChannelRepositoryService(UserJoinedVoiceChannelRepositoryAB
|
||||
id=result[0]
|
||||
)
|
||||
|
||||
def find_active_user_joined_voice_channels_by_user_id(self, user_id: int) -> List[Optional[UserJoinedVoiceChannel]]:
|
||||
self._logger.trace(__name__, f'Send SQL command: {UserJoinedVoiceChannel.get_select_by_user_id_string(user_id)}')
|
||||
result = List(UserJoinedVoiceChannel)
|
||||
db_results = self._context.select(UserJoinedVoiceChannel.get_select_active_by_user_id_string(user_id))
|
||||
|
||||
for db_result in db_results:
|
||||
result.append(UserJoinedVoiceChannel(
|
||||
self._users.get_user_by_id(db_result[1]),
|
||||
db_result[2],
|
||||
db_result[3],
|
||||
db_result[4],
|
||||
db_result[5],
|
||||
id=db_result[0]
|
||||
))
|
||||
|
||||
return result
|
||||
|
||||
def add_user_joined_voice_channel(self, user_joined_voice_channel: UserJoinedVoiceChannel):
|
||||
self._logger.trace(__name__, f'Send SQL command: {user_joined_voice_channel.insert_string}')
|
||||
self._context.cursor.execute(user_joined_voice_channel.insert_string)
|
||||
|
@@ -56,6 +56,8 @@ class UserRepositoryService(UserRepositoryABC):
|
||||
id=result[0]
|
||||
))
|
||||
|
||||
return users
|
||||
|
||||
def get_user_by_discord_id_and_server_id(self, discord_id: int, server_id: int) -> User:
|
||||
self._logger.trace(__name__, f'Send SQL command: {User.get_select_by_discord_id_and_server_id_string(discord_id, server_id)}')
|
||||
result = self._context.select(User.get_select_by_discord_id_and_server_id_string(discord_id, server_id))[0]
|
||||
@@ -78,9 +80,9 @@ class UserRepositoryService(UserRepositoryABC):
|
||||
return User(
|
||||
result[1],
|
||||
result[2],
|
||||
result[3],
|
||||
result[4],
|
||||
self._servers.get_server_by_id(result[3]),
|
||||
result[4],
|
||||
result[5],
|
||||
id=result[0]
|
||||
)
|
||||
|
||||
|
@@ -0,0 +1 @@
|
||||
# imports
|
||||
|
@@ -15,11 +15,11 @@ __title__ = 'modules.base'
|
||||
__author__ = 'Sven Heidemann'
|
||||
__license__ = 'MIT'
|
||||
__copyright__ = 'Copyright (c) 2021 - 2022 sh-edraft.de'
|
||||
__version__ = '0.3.0'
|
||||
__version__ = '0.4.2'
|
||||
|
||||
from collections import namedtuple
|
||||
|
||||
# imports:
|
||||
|
||||
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||
version_info = VersionInfo(major='0', minor='4', micro='2')
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user