Added discord impl #378

This commit is contained in:
2023-09-28 17:00:30 +02:00
parent 3546d38f75
commit 0cc8d6f2c7
19 changed files with 280 additions and 16 deletions

View 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")

View 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")

View File

@@ -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)

View 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")

View File

@@ -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)

View 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": []
}
}

View File

@@ -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)

View File

@@ -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)