Added logic to check table at startup
This commit is contained in:
		| @@ -7,10 +7,12 @@ from cpl_core.database.context import DatabaseContextABC | ||||
| from cpl_core.logging import LoggerABC | ||||
|  | ||||
| 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.known_user_repository_abc import KnownUserRepositoryABC | ||||
| from gismo_data.abc.user_joined_server_repository_abc import \ | ||||
|     UserJoinedServerRepositoryABC | ||||
| from gismo_data.abc.user_joined_voice_channel_abc import UserJoinedVoiceChannelRepositoryABC | ||||
| from gismo_data.abc.user_repository_abc import UserRepositoryABC | ||||
| from gismo_data.model.client import Client | ||||
| from gismo_data.model.known_user import KnownUser | ||||
| @@ -34,7 +36,8 @@ class Database(ModuleABC, OnReadyABC): | ||||
|         user_repo: UserRepositoryABC, | ||||
|         client_repo: ClientRepositoryABC, | ||||
|         known_users: KnownUserRepositoryABC, | ||||
|         user_joins: UserJoinedServerRepositoryABC | ||||
|         user_joins: UserJoinedServerRepositoryABC, | ||||
|         user_joins_vc: UserJoinedVoiceChannelRepositoryABC | ||||
|     ): | ||||
|         self._config = config | ||||
|  | ||||
| @@ -46,6 +49,7 @@ class Database(ModuleABC, OnReadyABC): | ||||
|         self._clients = client_repo | ||||
|         self._known_users = known_users | ||||
|         self._user_joins = user_joins | ||||
|         self._user_joins_vc = user_joins_vc | ||||
|  | ||||
|         ModuleABC.__init__(self) | ||||
|         self._priorities[OnReadyABC] = 0 | ||||
| @@ -241,6 +245,45 @@ class Database(ModuleABC, OnReadyABC): | ||||
|                  | ||||
|             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): | ||||
|         self._logger.debug(__name__, f'Module {type(self)} started') | ||||
|          | ||||
| @@ -249,6 +292,7 @@ class Database(ModuleABC, OnReadyABC): | ||||
|         self._check_clients() | ||||
|         self._check_users() | ||||
|         self._check_user_joins() | ||||
|         self._check_user_joins_vc() | ||||
|          | ||||
|         self._validate_init_time() | ||||
|         self._logger.trace(__name__, f'Module {type(self)} stopped') | ||||
|   | ||||
		Reference in New Issue
	
	Block a user