Как правильно удалить бота с определенного сервера?

Как можно обеспечить выключение бота на серверах с параметром `active==false` в JSON-конфигурации так, чтобы бот не покидал серверы? Как можно эффективно реализовать эту логику до выполнения каждой команды, необходимо ли вставлять проверку `active` в начало обработчика команд, или существует более эффективный способ применения глобально данной логики?
  • 16 июля 2024 г. 6:52
Ответы на вопрос 2
1. Для удаления бота с определенного сервера вам нужно использовать метод `bot.remove_from_guild(guild_id)`, где `guild_id` - идентификатор сервера, с которого вы хотите удалить бота. Пример:

```python
@bot.command()
async def remove_from_server(ctx):
    guild_id = 1234567890
    guild = bot.get_guild(guild_id)
    if guild:
        await bot.remove_from_guild(guild)
        await ctx.send(f"Бот успешно удален с сервера {guild.name}")
    else:
        await ctx.send("Указанный сервер не найден")
```

2. Для обеспечения выключения бота на серверах с параметром `active==false` в JSON-конфигурации, вы можете использовать глобальный декоратор, который будет проверять данный параметр перед выполнением каждой команды. Пример:

```python
def check_active(func):
    async def wrapper(ctx, *args, **kwargs):
        if not bot.active:
            await ctx.send("Бот отключен на данном сервере")
        else:
            await func(ctx, *args, **kwargs)
    return wrapper

@bot.command()
@check_active
async def command_example(ctx):
    await ctx.send("Пример команды")
```

Таким образом, вы можете использовать декоратор `check_active` для проверки параметра `active` перед выполнением каждой команды.
При помощи такого решения теперь достаточно лишь добавить декоратор is_active к каждой команде, тогда команды перестанут работать на серверах, где active==false 
import discord.ext.commands as commands

def get_whitelist():
    #  Получает список серверов с active==true
    ...

def is_active(ctx):
    return ctx.guild.id in get_whitelist()

@client.slash_command(name="isavailable", pass_context=True)
@commands.check(is_active)
async def isavalable_command_handler(ctx):
    await ctx.response.send_message('бот доступен на вашем сервере!')

Меня это вполне устраивает, но был бы рад услышать, что есть решение получше этого
Похожие вопросы