A-0.3 - Basismodul #36
@ -23,7 +23,10 @@
|
|||||||
"LoginMessage": "",
|
"LoginMessage": "",
|
||||||
"MessageDeleteTimer": 0,
|
"MessageDeleteTimer": 0,
|
||||||
"WelcomeMessage": "",
|
"WelcomeMessage": "",
|
||||||
"GoodbyeMessage": ""
|
"GoodbyeMessage": "",
|
||||||
|
"MaxVoiceStateHours": 0,
|
||||||
|
"XpPerMessage": 0,
|
||||||
|
"XpPerOntimeHour": 0
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -23,6 +23,7 @@ from gismo_data.abc.user_repository_abc import UserRepositoryABC
|
|||||||
from gismo_data.db_context import DBContext
|
from gismo_data.db_context import DBContext
|
||||||
from gismo_data.migration.initial_migration import InitialMigration
|
from gismo_data.migration.initial_migration import InitialMigration
|
||||||
from gismo_data.migration.migration_0_3 import Migration_0_3
|
from gismo_data.migration.migration_0_3 import Migration_0_3
|
||||||
|
from gismo_data.migration.migration_0_3_1 import Migration_0_3_1
|
||||||
from gismo_data.service.client_repository_service import (
|
from gismo_data.service.client_repository_service import (
|
||||||
ClientRepositoryABC, ClientRepositoryService)
|
ClientRepositoryABC, ClientRepositoryService)
|
||||||
from gismo_data.service.known_user_repository_service import \
|
from gismo_data.service.known_user_repository_service import \
|
||||||
@ -91,6 +92,7 @@ class Startup(StartupABC):
|
|||||||
# migrations
|
# migrations
|
||||||
services.add_transient(MigrationABC, InitialMigration)
|
services.add_transient(MigrationABC, InitialMigration)
|
||||||
services.add_transient(MigrationABC, Migration_0_3)
|
services.add_transient(MigrationABC, Migration_0_3)
|
||||||
|
services.add_transient(MigrationABC, Migration_0_3_1)
|
||||||
|
|
||||||
provider: ServiceProviderABC = services.build_service_provider()
|
provider: ServiceProviderABC = services.build_service_provider()
|
||||||
|
|
||||||
|
@ -15,6 +15,9 @@ class ServerSettings(ConfigurationModelABC):
|
|||||||
self._login_message: str = ''
|
self._login_message: str = ''
|
||||||
self._welcome_message: str = ''
|
self._welcome_message: str = ''
|
||||||
self._goodbye_message: 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
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def id(self) -> str:
|
def id(self) -> str:
|
||||||
@ -40,6 +43,18 @@ class ServerSettings(ConfigurationModelABC):
|
|||||||
def goodbye_message(self) -> str:
|
def goodbye_message(self) -> str:
|
||||||
return self._goodbye_message
|
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
|
||||||
|
|
||||||
def from_dict(self, settings: dict):
|
def from_dict(self, settings: dict):
|
||||||
try:
|
try:
|
||||||
self._id = int(settings['Id'])
|
self._id = int(settings['Id'])
|
||||||
@ -48,6 +63,9 @@ class ServerSettings(ConfigurationModelABC):
|
|||||||
self._login_message = settings['LoginMessage']
|
self._login_message = settings['LoginMessage']
|
||||||
self._welcome_message = settings['WelcomeMessage']
|
self._welcome_message = settings['WelcomeMessage']
|
||||||
self._goodbye_message = settings['GoodbyeMessage']
|
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'])
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
Console.error(f'[ ERROR ] [ {__name__} ]: Reading error in settings')
|
Console.error(f'[ ERROR ] [ {__name__} ]: Reading error in settings')
|
||||||
Console.error(f'[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}')
|
Console.error(f'[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}')
|
||||||
|
@ -7,10 +7,12 @@ from cpl_core.database.context import DatabaseContextABC
|
|||||||
from cpl_core.logging import LoggerABC
|
from cpl_core.logging import LoggerABC
|
||||||
|
|
||||||
from gismo_core.abc.bot_service_abc import BotServiceABC
|
from gismo_core.abc.bot_service_abc import BotServiceABC
|
||||||
|
from gismo_core.configuration.server_settings import ServerSettings
|
||||||
from gismo_data.abc.client_repository_abc import ClientRepositoryABC
|
from gismo_data.abc.client_repository_abc import ClientRepositoryABC
|
||||||
from gismo_data.abc.known_user_repository_abc import KnownUserRepositoryABC
|
from gismo_data.abc.known_user_repository_abc import KnownUserRepositoryABC
|
||||||
from gismo_data.abc.user_joined_server_repository_abc import \
|
from gismo_data.abc.user_joined_server_repository_abc import \
|
||||||
UserJoinedServerRepositoryABC
|
UserJoinedServerRepositoryABC
|
||||||
|
from gismo_data.abc.user_joined_voice_channel_abc import UserJoinedVoiceChannelRepositoryABC
|
||||||
from gismo_data.abc.user_repository_abc import UserRepositoryABC
|
from gismo_data.abc.user_repository_abc import UserRepositoryABC
|
||||||
from gismo_data.model.client import Client
|
from gismo_data.model.client import Client
|
||||||
from gismo_data.model.known_user import KnownUser
|
from gismo_data.model.known_user import KnownUser
|
||||||
@ -34,7 +36,8 @@ class Database(ModuleABC, OnReadyABC):
|
|||||||
user_repo: UserRepositoryABC,
|
user_repo: UserRepositoryABC,
|
||||||
client_repo: ClientRepositoryABC,
|
client_repo: ClientRepositoryABC,
|
||||||
known_users: KnownUserRepositoryABC,
|
known_users: KnownUserRepositoryABC,
|
||||||
user_joins: UserJoinedServerRepositoryABC
|
user_joins: UserJoinedServerRepositoryABC,
|
||||||
|
user_joins_vc: UserJoinedVoiceChannelRepositoryABC
|
||||||
):
|
):
|
||||||
self._config = config
|
self._config = config
|
||||||
|
|
||||||
@ -46,6 +49,7 @@ class Database(ModuleABC, OnReadyABC):
|
|||||||
self._clients = client_repo
|
self._clients = client_repo
|
||||||
self._known_users = known_users
|
self._known_users = known_users
|
||||||
self._user_joins = user_joins
|
self._user_joins = user_joins
|
||||||
|
self._user_joins_vc = user_joins_vc
|
||||||
|
|
||||||
ModuleABC.__init__(self)
|
ModuleABC.__init__(self)
|
||||||
self._priorities[OnReadyABC] = 0
|
self._priorities[OnReadyABC] = 0
|
||||||
@ -241,6 +245,45 @@ class Database(ModuleABC, OnReadyABC):
|
|||||||
|
|
||||||
self._db_context.save_changes()
|
self._db_context.save_changes()
|
||||||
|
|
||||||
|
def _check_user_joins_vc(self):
|
||||||
|
self._logger.debug(__name__, f'Start checking UserJoinedVoiceChannel table')
|
||||||
|
for guild in self._bot.guilds:
|
||||||
|
guild: discord.Guild = guild
|
||||||
|
|
||||||
|
server = self._servers.find_server_by_discord_id(guild.id)
|
||||||
|
if server is None:
|
||||||
|
self._logger.fatal(__name__, f'Server not found in database: {guild.id}')
|
||||||
|
|
||||||
|
try:
|
||||||
|
for u in guild.members:
|
||||||
|
u: discord.User = u
|
||||||
|
if u.bot:
|
||||||
|
self._logger.trace(__name__, f'User {u.id} is ignored, because its a bot')
|
||||||
|
continue
|
||||||
|
|
||||||
|
user = self._users.find_user_by_discord_id_and_server_id(u.id, server.server_id)
|
||||||
|
if user is None:
|
||||||
|
self._logger.fatal(__name__, f'User not found in database: {u.id}')
|
||||||
|
|
||||||
|
join = self._user_joins_vc.find_active_user_joined_voice_channel_by_user_id(user.user_id)
|
||||||
|
if join is None:
|
||||||
|
continue
|
||||||
|
|
||||||
|
m: discord.Member = u
|
||||||
|
self._logger.warn(__name__, f'Active UserJoinedVoiceChannel found in database: {guild.id}:{u.id}@{m.joined_at}')
|
||||||
|
join.leaved_on = datetime.now()
|
||||||
|
server_st: ServerSettings = self._config.get_configuration(f'DSERVER_{guild.id}')
|
||||||
|
|
||||||
|
if ((join.leaved_on - join.joined_on).total_seconds/60/60) > server_st.max_voice_state_hours:
|
||||||
|
join.leaved_on = join.joined_on + datetime.timedelta(hours=server_st.max_voice_state_hours)
|
||||||
|
|
||||||
|
self._user_joins_vc.update_user_joined_voice_channel(join)
|
||||||
|
# todo: maybe add XP
|
||||||
|
self._db_context.save_changes()
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
self._logger.error(__name__, f'Cannot get UserJoinedVoiceChannel', e)
|
||||||
|
|
||||||
async def on_ready(self):
|
async def on_ready(self):
|
||||||
self._logger.debug(__name__, f'Module {type(self)} started')
|
self._logger.debug(__name__, f'Module {type(self)} started')
|
||||||
|
|
||||||
@ -249,6 +292,7 @@ class Database(ModuleABC, OnReadyABC):
|
|||||||
self._check_clients()
|
self._check_clients()
|
||||||
self._check_users()
|
self._check_users()
|
||||||
self._check_user_joins()
|
self._check_user_joins()
|
||||||
|
self._check_user_joins_vc()
|
||||||
|
|
||||||
self._validate_init_time()
|
self._validate_init_time()
|
||||||
self._logger.trace(__name__, f'Module {type(self)} stopped')
|
self._logger.trace(__name__, f'Module {type(self)} stopped')
|
||||||
|
Reference in New Issue
Block a user