Skip to content

Commit

Permalink
added settings subgroups and settings now change permissions (#21)
Browse files Browse the repository at this point in the history
* added settings subgroups and settings now change permissions

* forgot lint ;)

* fix

* rename

* lint
  • Loading branch information
An3loN authored Sep 16, 2024
1 parent f4d6b38 commit f75f7e0
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 32 deletions.
77 changes: 55 additions & 22 deletions bot/apps/settings/commands.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from typing import TYPE_CHECKING

import discord
from discord import SlashCommandGroup
from discord import PermissionOverwrite, SlashCommandGroup
from discord.ext import commands

from bot.dynamic_settings import dynamic_settings
Expand All @@ -22,25 +22,32 @@ class SettingsCog(commands.Cog):
),
contexts={discord.InteractionContextType.guild},
)
find_friends_subgroup = settings_group.create_subgroup(
'find_friends',
description='Настройка команды поиска друга',
)
voide_channels_subgroup = settings_group.create_subgroup(
'voice_channels',
description='Настройка голосовых комнат',
)

def __init__(self, bot: 'MagicRustBot'):
self.bot = bot

@settings_group.command(
description='Изменить кулдаун на поиск друга, указывать в секундах',
)
async def find_friend_cooldown(
self,
ctx: discord.ApplicationContext,
cooldown: discord.Option(int, description='В секундах'),
):
dynamic_settings.find_friend_cooldown = cooldown
logger.info(f'{ctx.author}:{ctx.author.id} изменил кулдаун поиска друга на {cooldown}')
await ctx.respond(
f'Кулдаун для поиска друга изменен на {cooldown} секунд',
ephemeral=True,
delete_after=10,
)
async def _make_channel_non_textable(self, channel: discord.abc.Messageable):
guild = self.bot.get_main_guild()
everyone_permissions = PermissionOverwrite()
everyone_permissions.send_messages = False
await channel.set_permissions(guild.default_role, overwrite=everyone_permissions)

async def _make_channel_locale_specific(self, channel: discord.abc.GuildChannel, locale: LocaleEnum):
guild = self.bot.get_main_guild()
everyone_permissions = PermissionOverwrite()
everyone_permissions.view_channel = False
locale_permissions = PermissionOverwrite()
locale_permissions.view_channel = True
await channel.set_permissions(guild.default_role, overwrite=everyone_permissions)
await channel.set_permissions(self.bot.get_locale_role(locale), overwrite=locale_permissions)

@settings_group.command(
description='Изменить какая роль отвечает за какой язык',
Expand All @@ -59,7 +66,25 @@ async def locale_roles(
delete_after=10,
)

@settings_group.command(
@find_friends_subgroup.command(
name='cooldown',
description='Изменить кулдаун на поиск друга, указывать в секундах',
)
async def find_friend_cooldown(
self,
ctx: discord.ApplicationContext,
cooldown: discord.Option(int, description='В секундах'),
):
dynamic_settings.find_friend_cooldown = cooldown
logger.info(f'{ctx.author}:{ctx.author.id} изменил кулдаун поиска друга на {cooldown}')
await ctx.respond(
f'Кулдаун для поиска друга изменен на {cooldown} секунд',
ephemeral=True,
delete_after=10,
)

@find_friends_subgroup.command(
name='channels',
description='Изменить каналы для поиска друга',
)
async def friend_channels(
Expand All @@ -70,8 +95,9 @@ async def friend_channels(
):
current_channels = dynamic_settings.find_friend_channels
current_channels[locale] = channel.id

dynamic_settings.find_friend_channels = current_channels
await self._make_channel_locale_specific(channel, locale)
await self._make_channel_non_textable(channel)
logger.info(f'{ctx.author}:{ctx.author.id} изменил каналы для поиска друга на {current_channels}')
await ctx.respond(
f'Канал для поиска друга для региона {locale} был установлен {channel}',
Expand All @@ -91,6 +117,8 @@ async def server_status_channels(
current_channels = dynamic_settings.server_status_channels
current_channels[locale] = channel.id
dynamic_settings.server_status_channels = current_channels
await self._make_channel_locale_specific(channel, locale)
await self._make_channel_non_textable(channel)
logger.info(f'{ctx.author}:{ctx.author.id} изменил каналы статуса серверов на {current_channels}')
await ctx.respond(
f'Канал статуса серверов для региона {locale} был установлен {channel}',
Expand All @@ -103,14 +131,16 @@ async def server_status_channels(
)
async def repost_channel(self, ctx: discord.ApplicationContext, channel: discord.TextChannel):
dynamic_settings.repost_channel = channel.id
await self._make_channel_non_textable(channel)
logger.info(f'{ctx.author}:{ctx.author.id} изменил канал для репостов: {channel.name}:{channel.id}')
await ctx.respond(
f'Канал для репостов установлен {channel.mention}',
ephemeral=True,
delete_after=10,
)

@settings_group.command(
@voide_channels_subgroup.command(
name='cooldown',
description='Изменить кулдаун создания голосовых каналов, указывать в секундах',
)
async def user_room_create_cooldown(
Expand All @@ -126,8 +156,8 @@ async def user_room_create_cooldown(
delete_after=10,
)

@settings_group.command(
description='Изменить комнаты создания каналов',
@voide_channels_subgroup.command(
description='Изменить комнаты создания голосовых каналов',
)
async def user_room_creating_channels(
self,
Expand All @@ -138,14 +168,16 @@ async def user_room_creating_channels(
current_channels = dynamic_settings.channel_creating_channels
current_channels[locale] = channel.id
dynamic_settings.channel_creating_channels = current_channels
await self._make_channel_locale_specific(channel, locale)
await self._make_channel_non_textable(channel)
logger.info(f'{ctx.author}:{ctx.author.id} изменил комнаты создания каналов на {current_channels}')
await ctx.respond(
f'Комната создания серверов для региона {locale} была установлена на {channel}',
ephemeral=True,
delete_after=10,
)

@settings_group.command(
@voide_channels_subgroup.command(
description='Изменить разделы для голосовых комнат',
)
async def user_rooms_categories(
Expand All @@ -157,6 +189,7 @@ async def user_rooms_categories(
current_channels = dynamic_settings.user_rooms_categories
current_channels[locale] = category.id
dynamic_settings.user_rooms_categories = current_channels
await self._make_channel_locale_specific(category, locale)
logger.info(f'{ctx.author}:{ctx.author.id} изменил каналы создания голосовых комнат на {current_channels}')
await ctx.respond(
f'Канал создания голосовых комнат для региона {locale} была установлен на {category}',
Expand Down
15 changes: 6 additions & 9 deletions bot/apps/voice_channels/room_creator.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,11 @@ async def create_room_for_user(self, member: Member, cooldown: float, locale: Lo
user_id=member.id,
cooldown_in_seconds=cooldown,
)
await new_channel.set_permissions(
member, manage_channels=True, move_members=True, set_voice_channel_status=True
)
permissions = PermissionOverwrite()
permissions.manage_channels = True
permissions.move_members = True
permissions.set_voice_channel_status = True
await new_channel.set_permissions(member, overwrite=permissions)
await member.move_to(new_channel)

async def create_room(self, room_name: str, locale: LocaleEnum) -> VoiceChannel:
Expand All @@ -69,13 +71,8 @@ async def create_room(self, room_name: str, locale: LocaleEnum) -> VoiceChannel:
name=self.room_name_localization[locale].format(room_name=room_name),
category=category,
overwrites={
self._get_locale_role(locale): PermissionOverwrite(view_channel=True),
self.bot.get_locale_role(locale): PermissionOverwrite(view_channel=True),
guild.default_role: PermissionOverwrite(view_channel=False, stream=True),
},
)
return new_channel

def _get_locale_role(self, locale: LocaleEnum):
for role_id, role_locale in dynamic_settings.locale_roles.items():
if locale == role_locale:
return self.bot.get_main_guild().get_role(role_id)
8 changes: 7 additions & 1 deletion bot/bot.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
from discord.bot import Bot

from bot.config import settings
from bot.dynamic_settings import CategoryId
from bot.dynamic_settings import CategoryId, dynamic_settings
from core.localization import LocaleEnum
from core.logger import logger

all_apps = [
Expand Down Expand Up @@ -49,6 +50,11 @@ def get_category(self, category_id: CategoryId) -> discord.CategoryChannel | Non
return category
return None

def get_locale_role(self, locale: LocaleEnum) -> discord.Role:
for role_id, role_locale in dynamic_settings.locale_roles.items():
if locale == role_locale:
return self.get_main_guild().get_role(role_id)

async def fetch_main_guild(self) -> discord.Guild:
return await self.fetch_guild(settings.MAGIC_RUST_GUILD_ID, with_counts=True)

Expand Down

0 comments on commit f75f7e0

Please sign in to comment.