@maks_petrov9

Как в discord.py сделать чтобы создатель сервера мог указывать роли для команд?

я пишу бота на пайтоне и никак не могу разобраться, можно ли сделать так, чтобы можно указывать роль (через команду) которая может писать команды такие как - кик, бан и т.д
Я просто пишу бота для всех серверов
и хочу чтобы создатель сервера сам указывал роль
Которая может банить и кикать

надеюсь понели)
Вот мой код, где я пытался это сделать сам ;)

@Bot.command ( pass_context = True )
#@commands.has_permissions ( administrator = True )
async def модерроль(ctx, arg, *, role = discord.Role):

moderrole = discord.utils.get(ctx.guild.roles, id = role.id )
await ctx.send( f'>>> Администратор {ctx.author.mention} установил для модераторов роль - {arg}', delete_after = 35 )

# // Кик
@Bot.command ( pass_context = True )
@commands.has_role( moderrole )
async def кик( ctx, member: discord.Member, *, reason = None ):

await member.send ( embed = discord.Embed( title = 'Вас кикнули!', description = f'Вы были кикнуты Администратором { ctx.author.mention }! Причина: {reason}', color = discord.Colour.red(), inline = True ) )
await member.kick ( reason = reason )

emb = discord.Embed ( title = 'Успешно :white_check_mark:', description = f'Участик { member.mention } был успешно кикнут! ', color = 0x00FF00, inline = True )
emb.set_author ( name = Bot.user.name, icon_url = Bot.user.avatar_url )
emb.add_field ( name = 'Модератор:', value = f'{ ctx.author.mention }', inline = True )
emb.add_field ( name = 'Причина:', value = reason, inline = True )

await ctx.send ( embed = emb )
  • Вопрос задан
  • 311 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Нужна база данных, так как эту информацию нужно будет сохранять при перезапуске бота.
Если задача стоит как "укажите, какая роль будет модератором", то тогда в базе должна быть таблица, где сопоставляется ID сервера и ID роли.
Тогда алгоритм задания роли будет такой:
1. Проверяем, что отправивший команду является владельцем сервера.
2. Определяем ID сервера.
3. Вытаскиваем из параметров команды название роли.
4. Перебираем роли на сервере, ищем роль с таким названием, запоминаем её ID.
5. Помещаем пару сервер-роль в таблицу БД. Для обычной базы данных на основе SQL (вроде строенной питоновской sqlite) хорошо использовать запрос вида INSERT ... ON CONFLICT UPDATE ... - это позволит не париться, была ли уже задана роль модератора для этого сервера.

Алгоритм проверки роли будет такой:
1. Получаем ID сервера, на котором была отправлена команда.
2. Получаем ID роли отправителя команды.
3. Проверяем, есть ли в таблице строка с такой парой сервер-роль.
4. Если есть, разрешаем выполнить команду.

В качестве упражнения для обучения это хорошая идея.
С практической точки зрения - это абсолютно бесполезно, потому что роль с правами модератора может кикать и банить по правому щелчку мыши по юзеру, безо всяких ботов.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы