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