Improved config loading
This commit is contained in:
parent
40419c9a0b
commit
4db97248ca
@ -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": []
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
2
src/gismo/config/base.json
Normal file
2
src/gismo/config/base.json
Normal file
@ -0,0 +1,2 @@
|
||||
{
|
||||
}
|
10
src/gismo/config/boot_log.json
Normal file
10
src/gismo/config/boot_log.json
Normal file
@ -0,0 +1,10 @@
|
||||
{
|
||||
"910199451145076828": {
|
||||
"LoginMessageChannelId": "910199452915093588",
|
||||
"LoginMessage": "Ich bin on the line :D\nDer Start hat {} Sekunden gedauert"
|
||||
},
|
||||
"511824600884051979": {
|
||||
"LoginMessageChannelId": "521260270757347328",
|
||||
"LoginMessage": "Ich bin on the line :D\nDer Start hat {} Sekunden gedauert"
|
||||
}
|
||||
}
|
2
src/gismo/config/database.json
Normal file
2
src/gismo/config/database.json
Normal file
@ -0,0 +1,2 @@
|
||||
{
|
||||
}
|
@ -54,9 +54,9 @@ class Startup(StartupABC):
|
||||
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)
|
||||
|
||||
|
@ -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()}')
|
||||
|
@ -8,6 +8,7 @@ from discord import guild
|
||||
from gismo_core.abc.bot_service_abc import BotServiceABC
|
||||
from gismo_core.abc.message_service_abc import MessageServiceABC
|
||||
from gismo_core.configuration.server_settings import ServerSettings
|
||||
from modules.boot_log.boot_log_settings import BootLogSettings
|
||||
from modules_core.abc.events.on_ready_abc import OnReadyABC
|
||||
from modules_core.abc.module_abc import ModuleABC
|
||||
|
||||
@ -27,8 +28,13 @@ class BootLog(ModuleABC, OnReadyABC):
|
||||
self._bot = bot
|
||||
self._message_service = message_service
|
||||
|
||||
ModuleABC.__init__(self)
|
||||
self._priorities[OnReadyABC] = 10
|
||||
ModuleABC.__init__(
|
||||
self,
|
||||
{
|
||||
OnReadyABC: 10
|
||||
},
|
||||
BootLogSettings
|
||||
)
|
||||
self._logger.trace(__name__, f'Module {type(self)} loaded')
|
||||
|
||||
async def on_ready(self):
|
||||
|
29
src/modules/boot_log/boot_log_settings.py
Normal file
29
src/modules/boot_log/boot_log_settings.py
Normal file
@ -0,0 +1,29 @@
|
||||
import traceback
|
||||
|
||||
from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC
|
||||
from cpl_core.console import Console
|
||||
|
||||
|
||||
class BootLogSettings(ConfigurationModelABC):
|
||||
|
||||
def __init__(self):
|
||||
ConfigurationModelABC.__init__(self)
|
||||
|
||||
self._login_message_channel_id: int = 0
|
||||
self._login_message: str = ''
|
||||
|
||||
@property
|
||||
def login_message_channel_id(self) -> int:
|
||||
return self._login_message_channel_id
|
||||
|
||||
@property
|
||||
def login_message(self) -> str:
|
||||
return self._login_message
|
||||
|
||||
def from_dict(self, settings: dict):
|
||||
try:
|
||||
self._login_message_channel_id = int(settings['LoginMessageChannelId'])
|
||||
self._login_message = settings['LoginMessage']
|
||||
except Exception as e:
|
||||
Console.error(f'[ ERROR ] [ {__name__} ]: Reading error in {__name__} settings')
|
||||
Console.error(f'[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}')
|
@ -1,12 +1,23 @@
|
||||
from abc import ABC, abstractmethod
|
||||
from typing import Optional
|
||||
|
||||
from cpl_core.configuration import ConfigurationModelABC
|
||||
|
||||
class ModuleABC(ABC):
|
||||
|
||||
@abstractmethod
|
||||
def __init__(self):
|
||||
self._priorities = {}
|
||||
def __init__(self, priorities: dict[type, int], settings_type: type):
|
||||
self._priorities = priorities
|
||||
self._success = True
|
||||
self._settings_type = settings_type
|
||||
|
||||
@property
|
||||
def success(self) -> bool:
|
||||
return self._success
|
||||
|
||||
@property
|
||||
def settings_type(self) -> type:
|
||||
return self._settings_type
|
||||
|
||||
def get_priority(self, t: type) -> int:
|
||||
if t not in self._priorities:
|
||||
@ -15,7 +26,3 @@ class ModuleABC(ABC):
|
||||
|
||||
def stop_propagation(self):
|
||||
self._success = False
|
||||
|
||||
@property
|
||||
def success(self) -> bool:
|
||||
return self._success
|
||||
|
@ -1,8 +1,10 @@
|
||||
from abc import ABC, ABCMeta
|
||||
from datetime import datetime
|
||||
import json
|
||||
from typing import Optional, Sequence, Union
|
||||
|
||||
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
|
||||
@ -64,8 +66,9 @@ class _MetaCogABC(ABCMeta, commands.CogMeta): pass
|
||||
|
||||
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()
|
||||
@ -75,10 +78,19 @@ class ModuleService(ModuleServiceABC, commands.Cog, metaclass=_MetaCogABC):
|
||||
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)
|
||||
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
|
||||
|
||||
with open(f'config/{String.convert_to_snake_case(type(module).__name__).lower()}.json', encoding='utf-8') as cfg:
|
||||
json_cfg = json.load(cfg)
|
||||
for id in json_cfg:
|
||||
settings: ConfigurationModelABC = module.settings_type()
|
||||
settings.from_dict(json_cfg[id])
|
||||
self._config.add_configuration(f'{type(module).__name__}_{id}', settings)
|
||||
self._logger.debug(__name__, f'Added config: {type(module).__name__}_{id}')
|
||||
|
||||
modules.append(module)
|
||||
|
||||
return modules.order_by(lambda m: m.get_priority(t))
|
||||
@ -94,6 +106,7 @@ class ModuleService(ModuleServiceABC, commands.Cog, metaclass=_MetaCogABC):
|
||||
func_name = String.convert_to_snake_case(event.__name__.split('ABC')[0])
|
||||
for module in modules:
|
||||
func = getattr(module, func_name)
|
||||
exit()
|
||||
await func(*args)
|
||||
if not module.success:
|
||||
self._logger.debug(__name__, f'Stopped propagation for {event} from {type(module)}')
|
||||
|
Reference in New Issue
Block a user