Handle category updates #481

This commit is contained in:
Sven Heidemann 2025-01-07 17:56:56 +01:00
parent 352ede1667
commit 6e74e9b190
4 changed files with 99 additions and 3 deletions

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

View File

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

View File

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