#481 #482
							
								
								
									
										0
									
								
								bot/src/modules/realms/events/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								bot/src/modules/realms/events/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										75
									
								
								bot/src/modules/realms/events/realm_on_channel_update.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								bot/src/modules/realms/events/realm_on_channel_update.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,75 @@ | ||||
| import discord | ||||
| from cpl_core.configuration import ConfigurationABC | ||||
| from cpl_discord.events import OnGuildChannelUpdateABC | ||||
| from discord import CategoryChannel | ||||
|  | ||||
| from bot_core.logging.message_logger import MessageLogger | ||||
| from bot_data.abc.realm_repository_abc import RealmRepositoryABC | ||||
| from bot_data.abc.server_repository_abc import ServerRepositoryABC | ||||
| from bot_data.abc.user_repository_abc import UserRepositoryABC | ||||
| from bot_data.model.realm_moderator import RealmModerator | ||||
| from modules.realms.realm_utils import RealmUtils | ||||
|  | ||||
|  | ||||
| class RealmOnChannelUpdateEvent(OnGuildChannelUpdateABC): | ||||
|     def __init__( | ||||
|         self, | ||||
|         config: ConfigurationABC, | ||||
|         logger: MessageLogger, | ||||
|         servers: ServerRepositoryABC, | ||||
|         users: UserRepositoryABC, | ||||
|         realms: RealmRepositoryABC, | ||||
|         realm_utils: RealmUtils, | ||||
|     ): | ||||
|         OnGuildChannelUpdateABC.__init__(self) | ||||
|  | ||||
|         self._config = config | ||||
|         self._logger = logger | ||||
|         self._servers = servers | ||||
|         self._users = users | ||||
|         self._realms = realms | ||||
|         self._realm_utils = realm_utils | ||||
|  | ||||
|     async def on_guild_channel_update(self, before: discord.abc.GuildChannel, after: discord.abc.GuildChannel): | ||||
|         self._logger.debug(__name__, f"Module {type(self)} started") | ||||
|  | ||||
|         realm = self._realms.find_realm_by_name(before.name) | ||||
|         if realm is None: | ||||
|             return | ||||
|  | ||||
|         if before.name != after.name: | ||||
|             realm.name = after.name | ||||
|             self._realms.update_realm(realm) | ||||
|             role = self._realm_utils.find_role_by_name(after.guild, before.name) | ||||
|             if role is not None: | ||||
|                 await role.edit(name=after.name) | ||||
|  | ||||
|         if before.overwrites != after.overwrites: | ||||
|             role = self._realm_utils.get_role_by_name(after.guild, after.name) | ||||
|             if role not in after.overwrites: | ||||
|                 await after.set_permissions( | ||||
|                     role, | ||||
|                     view_channel=True, | ||||
|                     connect=True, | ||||
|                     manage_channels=True, | ||||
|                     manage_permissions=True, | ||||
|                     create_instant_invite=True, | ||||
|                 ) | ||||
|  | ||||
|             mods = self._realms.get_realm_moderators_by_realm_id(realm.id) | ||||
|             mod_users = mods.select(lambda x: x.user) | ||||
|             for mod in mods: | ||||
|                 if mod.user not in after.overwrites: | ||||
|                     self._realms.delete_realm_moderator(mod) | ||||
|  | ||||
|             server = self._servers.get_server_by_discord_id(after.guild.id) | ||||
|             for mod in after.overwrites: | ||||
|                 if isinstance(mod, discord.Role): | ||||
|                     continue | ||||
|  | ||||
|                 if mod not in mod_users: | ||||
|                     user = self._users.find_user_by_discord_id_and_server_id(mod.id, server.id) | ||||
|                     self._realms.add_realm_moderator(RealmModerator(realm, user)) | ||||
|                     await self._realm_utils.assign_moderator(after, mod) | ||||
|  | ||||
|         self._logger.debug(__name__, f"Module {type(self)} stopped") | ||||
| @@ -1,8 +1,9 @@ | ||||
| from typing import Optional | ||||
| from typing import Optional, Union | ||||
|  | ||||
| import discord | ||||
| from cpl_discord.container import Role, CategoryChannel | ||||
| from discord import Guild, Member | ||||
| from discord.abc import GuildChannel | ||||
|  | ||||
| from bot_data.abc.realm_repository_abc import RealmRepositoryABC | ||||
|  | ||||
| @@ -18,6 +19,13 @@ class RealmUtils: | ||||
|                 return Role(role) | ||||
|         return None | ||||
|  | ||||
|     @staticmethod | ||||
|     def get_role_by_name(guild: Guild, name: str) -> Optional[Role]: | ||||
|         for role in guild.roles: | ||||
|             if role.name == name: | ||||
|                 return Role(role) | ||||
|         raise ValueError(f"Role {name} not found") | ||||
|  | ||||
|     @staticmethod | ||||
|     def find_category_by_name(guild: Guild, name: str) -> Optional[CategoryChannel]: | ||||
|         for category in guild.categories: | ||||
| @@ -25,6 +33,13 @@ class RealmUtils: | ||||
|                 return CategoryChannel(category) | ||||
|         return None | ||||
|  | ||||
|     @staticmethod | ||||
|     def get_category_by_name(guild: Guild, name: str) -> Optional[CategoryChannel]: | ||||
|         for category in guild.categories: | ||||
|             if category.name == name: | ||||
|                 return CategoryChannel(category) | ||||
|         raise ValueError(f"Category {name} not found") | ||||
|  | ||||
|     @staticmethod | ||||
|     def check_realm_role(guild: Guild, role: Role) -> bool: | ||||
|         return role in guild.roles | ||||
| @@ -50,7 +65,7 @@ class RealmUtils: | ||||
|         return await guild.create_category(name, overwrites=overwrites) | ||||
|  | ||||
|     @staticmethod | ||||
|     async def assign_moderator(category: CategoryChannel, member: Member): | ||||
|     async def assign_moderator(category: Union[CategoryChannel, GuildChannel], member: Member): | ||||
|         await category.set_permissions( | ||||
|             member, | ||||
|             view_channel=True, | ||||
| @@ -61,7 +76,7 @@ class RealmUtils: | ||||
|         ) | ||||
|  | ||||
|     @staticmethod | ||||
|     async def remove_moderator(category: CategoryChannel, member: Member): | ||||
|     async def remove_moderator(category: Union[CategoryChannel, GuildChannel], member: Member): | ||||
|         await category.set_permissions( | ||||
|             member, | ||||
|             view_channel=True, | ||||
|   | ||||
| @@ -1,11 +1,13 @@ | ||||
| from cpl_core.configuration import ConfigurationABC | ||||
| from cpl_core.dependency_injection import ServiceCollectionABC | ||||
| from cpl_core.environment import ApplicationEnvironmentABC | ||||
| from cpl_discord.discord_event_types_enum import DiscordEventTypesEnum | ||||
| from cpl_discord.service.discord_collection_abc import DiscordCollectionABC | ||||
|  | ||||
| from bot_core.abc.module_abc import ModuleABC | ||||
| from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum | ||||
| from modules.realms.command.realm_group import RealmGroup | ||||
| from modules.realms.events.realm_on_channel_update import RealmOnChannelUpdateEvent | ||||
| from modules.realms.realm_utils import RealmUtils | ||||
|  | ||||
|  | ||||
| @@ -19,3 +21,7 @@ class RealmsModule(ModuleABC): | ||||
|     def configure_services(self, services: ServiceCollectionABC, env: ApplicationEnvironmentABC): | ||||
|         services.add_transient(RealmGroup) | ||||
|         services.add_transient(RealmUtils) | ||||
|         services.add_transient( | ||||
|             DiscordEventTypesEnum.on_guild_channel_update.value, | ||||
|             RealmOnChannelUpdateEvent, | ||||
|         ) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user