Added discord impl #378
This commit is contained in:
		
							
								
								
									
										26
									
								
								kdb-bot/src/modules/short_role_name/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								kdb-bot/src/modules/short_role_name/__init__.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| # -*- coding: utf-8 -*- | ||||
|  | ||||
| """ | ||||
| bot Keksdose bot | ||||
| ~~~~~~~~~~~~~~~~~~~ | ||||
|  | ||||
| Discord bot  for the Keksdose discord Server | ||||
|  | ||||
| :copyright: (c) 2022 - 2023 sh-edraft.de | ||||
| :license: MIT, see LICENSE for more details. | ||||
|  | ||||
| """ | ||||
|  | ||||
| __title__ = "modules.short_role_name" | ||||
| __author__ = "Sven Heidemann" | ||||
| __license__ = "MIT" | ||||
| __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" | ||||
| __version__ = "1.1.7" | ||||
|  | ||||
| from collections import namedtuple | ||||
|  | ||||
|  | ||||
| # imports | ||||
|  | ||||
| VersionInfo = namedtuple("VersionInfo", "major minor micro") | ||||
| version_info = VersionInfo(major="1", minor="1", micro="7") | ||||
							
								
								
									
										26
									
								
								kdb-bot/src/modules/short_role_name/events/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								kdb-bot/src/modules/short_role_name/events/__init__.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| # -*- coding: utf-8 -*- | ||||
|  | ||||
| """ | ||||
| bot Keksdose bot | ||||
| ~~~~~~~~~~~~~~~~~~~ | ||||
|  | ||||
| Discord bot  for the Keksdose discord Server | ||||
|  | ||||
| :copyright: (c) 2022 - 2023 sh-edraft.de | ||||
| :license: MIT, see LICENSE for more details. | ||||
|  | ||||
| """ | ||||
|  | ||||
| __title__ = "modules.short_role_name.events" | ||||
| __author__ = "Sven Heidemann" | ||||
| __license__ = "MIT" | ||||
| __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" | ||||
| __version__ = "1.1.7" | ||||
|  | ||||
| from collections import namedtuple | ||||
|  | ||||
|  | ||||
| # imports | ||||
|  | ||||
| VersionInfo = namedtuple("VersionInfo", "major minor micro") | ||||
| version_info = VersionInfo(major="1", minor="1", micro="7") | ||||
| @@ -0,0 +1,14 @@ | ||||
| import discord | ||||
| from cpl_discord.events import OnMemberUpdateABC | ||||
|  | ||||
| from modules.short_role_name.service.short_role_name_service import ShortRoleNameService | ||||
|  | ||||
|  | ||||
| class ShortRoleNameOnMemberUpdateEvent(OnMemberUpdateABC): | ||||
|     def __init__(self, service: ShortRoleNameService): | ||||
|         OnMemberUpdateABC.__init__(self) | ||||
|         self._service = service | ||||
|  | ||||
|     async def on_member_update(self, before: discord.member.Member, after: discord.member.Member): | ||||
|         if before.roles != after.roles or before.name != after.name: | ||||
|             await self._service.check_short_role_names(after) | ||||
							
								
								
									
										26
									
								
								kdb-bot/src/modules/short_role_name/service/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								kdb-bot/src/modules/short_role_name/service/__init__.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| # -*- coding: utf-8 -*- | ||||
|  | ||||
| """ | ||||
| bot Keksdose bot | ||||
| ~~~~~~~~~~~~~~~~~~~ | ||||
|  | ||||
| Discord bot  for the Keksdose discord Server | ||||
|  | ||||
| :copyright: (c) 2022 - 2023 sh-edraft.de | ||||
| :license: MIT, see LICENSE for more details. | ||||
|  | ||||
| """ | ||||
|  | ||||
| __title__ = "modules.short_role_name.service" | ||||
| __author__ = "Sven Heidemann" | ||||
| __license__ = "MIT" | ||||
| __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" | ||||
| __version__ = "1.1.7" | ||||
|  | ||||
| from collections import namedtuple | ||||
|  | ||||
|  | ||||
| # imports | ||||
|  | ||||
| VersionInfo = namedtuple("VersionInfo", "major minor micro") | ||||
| version_info = VersionInfo(major="1", minor="1", micro="7") | ||||
| @@ -0,0 +1,76 @@ | ||||
| import discord | ||||
| from cpl_core.configuration import ConfigurationABC | ||||
| from cpl_core.logging import LoggerABC | ||||
| from cpl_discord.service import DiscordBotServiceABC | ||||
| from cpl_query.extension import List | ||||
|  | ||||
| from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum | ||||
| from bot_core.configuration.feature_flags_settings import FeatureFlagsSettings | ||||
| from bot_data.abc.server_repository_abc import ServerRepositoryABC | ||||
| from bot_data.abc.short_role_name_repository_abc import ShortRoleNameRepositoryABC | ||||
| from bot_data.model.server_config import ServerConfig | ||||
| from bot_data.model.short_role_name import ShortRoleName | ||||
| from bot_data.model.short_role_name_position_enum import ShortRoleNamePositionEnum | ||||
|  | ||||
|  | ||||
| class ShortRoleNameService: | ||||
|     def __init__( | ||||
|         self, | ||||
|         config: ConfigurationABC, | ||||
|         logger: LoggerABC, | ||||
|         bot: DiscordBotServiceABC, | ||||
|         server: ServerRepositoryABC, | ||||
|         short_role_names: ShortRoleNameRepositoryABC, | ||||
|     ): | ||||
|         self._config = config | ||||
|         self._logger = logger | ||||
|         self._bot = bot | ||||
|         self._server = server | ||||
|         self._short_role_names = short_role_names | ||||
|  | ||||
|     async def check_short_role_names(self, member: discord.Member): | ||||
|         self._logger.debug(__name__, f"Started short role name check for {member.id}") | ||||
|         settings: ServerConfig = self._config.get_configuration(f"ServerConfig_{member.guild.id}") | ||||
|         if not FeatureFlagsSettings.get_flag_from_dict(settings.feature_flags, FeatureFlagsEnum.short_role_name): | ||||
|             self._logger.debug(__name__, f"Feature not active") | ||||
|             return | ||||
|  | ||||
|         if member == member.guild.owner: | ||||
|             return | ||||
|  | ||||
|         before = "" | ||||
|         after = "" | ||||
|         new_nick = member.nick if member.nick is not None else member.name | ||||
|         role_ids = List(discord.Role, member.roles).select(lambda x: x.id) | ||||
|  | ||||
|         server = self._server.get_server_by_discord_id(member.guild.id) | ||||
|         for short_role_name in self._short_role_names.get_short_role_names_by_server_id(server.id): | ||||
|             short_role_name: ShortRoleName = short_role_name | ||||
|  | ||||
|             new_nick = new_nick.replace(f" [{short_role_name.short_name}]", "") | ||||
|             new_nick = new_nick.replace(f"[{short_role_name.short_name}] ", "") | ||||
|             new_nick = new_nick.replace(f"[{short_role_name.short_name}]", "") | ||||
|  | ||||
|             if short_role_name.role_id not in role_ids: | ||||
|                 continue | ||||
|  | ||||
|             if short_role_name.position == ShortRoleNamePositionEnum.before: | ||||
|                 before += f"[{short_role_name.short_name}] " | ||||
|             elif short_role_name.position == ShortRoleNamePositionEnum.after: | ||||
|                 after += f" [{short_role_name.short_name}]" | ||||
|  | ||||
|         if before != "": | ||||
|             new_nick = before + new_nick | ||||
|  | ||||
|         if after != "": | ||||
|             new_nick = new_nick + after | ||||
|  | ||||
|         if member.nick is None or member.nick == new_nick: | ||||
|             return | ||||
|  | ||||
|         try: | ||||
|             self._logger.debug(__name__, f"Update member {member.id}") | ||||
|             await member.edit(nick=new_nick) | ||||
|             self._logger.debug(__name__, f"Updated member {member.id} {member.name}") | ||||
|         except Exception as e: | ||||
|             self._logger.error(__name__, f"Renaming member {member.name} failed", e) | ||||
							
								
								
									
										46
									
								
								kdb-bot/src/modules/short_role_name/short-role-name.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								kdb-bot/src/modules/short_role_name/short-role-name.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | ||||
| { | ||||
|   "ProjectSettings": { | ||||
|     "Name": "short-role-name", | ||||
|     "Version": { | ||||
|       "Major": "0", | ||||
|       "Minor": "0", | ||||
|       "Micro": "0" | ||||
|     }, | ||||
|     "Author": "", | ||||
|     "AuthorEmail": "", | ||||
|     "Description": "", | ||||
|     "LongDescription": "", | ||||
|     "URL": "", | ||||
|     "CopyrightDate": "", | ||||
|     "CopyrightName": "", | ||||
|     "LicenseName": "", | ||||
|     "LicenseDescription": "", | ||||
|     "Dependencies": [ | ||||
|       "cpl-core>=2023.4.0.post5" | ||||
|     ], | ||||
|     "DevDependencies": [ | ||||
|       "cpl-cli>=2023.4.0.post3" | ||||
|     ], | ||||
|     "PythonVersion": ">=3.10.4", | ||||
|     "PythonPath": { | ||||
|       "linux": "" | ||||
|     }, | ||||
|     "Classifiers": [] | ||||
|   }, | ||||
|   "BuildSettings": { | ||||
|     "ProjectType": "library", | ||||
|     "SourcePath": "", | ||||
|     "OutputPath": "../../dist", | ||||
|     "Main": "short_role_name.main", | ||||
|     "EntryPoint": "short-role-name", | ||||
|     "IncludePackageData": false, | ||||
|     "Included": [], | ||||
|     "Excluded": [ | ||||
|       "*/__pycache__", | ||||
|       "*/logs", | ||||
|       "*/tests" | ||||
|     ], | ||||
|     "PackageData": {}, | ||||
|     "ProjectReferences": [] | ||||
|   } | ||||
| } | ||||
| @@ -0,0 +1,28 @@ | ||||
| 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 bot_data.abc.data_seeder_abc import DataSeederABC | ||||
| from modules.short_role_name.events.short_role_name_on_member_update_event import ShortRoleNameOnMemberUpdateEvent | ||||
| from modules.short_role_name.service.short_role_name_service import ShortRoleNameService | ||||
| from modules.short_role_name.short_role_name_seeder import ShortRoleNameSeeder | ||||
|  | ||||
|  | ||||
| class ShortRoleNameModule(ModuleABC): | ||||
|     def __init__(self, dc: DiscordCollectionABC): | ||||
|         ModuleABC.__init__(self, dc, FeatureFlagsEnum.short_role_name_module) | ||||
|  | ||||
|     def configure_configuration(self, config: ConfigurationABC, env: ApplicationEnvironmentABC): | ||||
|         pass | ||||
|  | ||||
|     def configure_services(self, services: ServiceCollectionABC, env: ApplicationEnvironmentABC): | ||||
|         services.add_transient(DataSeederABC, ShortRoleNameSeeder) | ||||
|         services.add_transient(ShortRoleNameService) | ||||
|  | ||||
|         # commands | ||||
|         # events | ||||
|         self._dc.add_event(DiscordEventTypesEnum.on_member_update.value, ShortRoleNameOnMemberUpdateEvent) | ||||
| @@ -0,0 +1,21 @@ | ||||
| from cpl_discord.service import DiscordBotServiceABC | ||||
|  | ||||
| from bot_data.abc.data_seeder_abc import DataSeederABC | ||||
| from modules.short_role_name.service.short_role_name_service import ShortRoleNameService | ||||
|  | ||||
|  | ||||
| class ShortRoleNameSeeder(DataSeederABC): | ||||
|     def __init__( | ||||
|         self, | ||||
|         bot: DiscordBotServiceABC, | ||||
|         short_role_name_service: ShortRoleNameService, | ||||
|     ): | ||||
|         DataSeederABC.__init__(self) | ||||
|  | ||||
|         self._bot = bot | ||||
|         self._short_role_name_service = short_role_name_service | ||||
|  | ||||
|     async def seed(self): | ||||
|         for guild in self._bot.guilds: | ||||
|             for member in guild.members: | ||||
|                 await self._short_role_name_service.check_short_role_names(member) | ||||
		Reference in New Issue
	
	Block a user