Как настроить бота для работы на нескольких серверах Discord с использованием команд ввода?

Вопрос касается "запоминания" данных, которые вводятся в команду. <br/><br/> <pre><code class="python">@bot.command()
async def explosion_channel(ctx: discord.ApplicationContext, id_channel, id_role):
               
    global channel_id
    global role
    """Введите ID канала и ID роли"""    
    channel_id = int(id_channel)
    role = int(id_role)
    await ctx.respond('Канал принят!')
    await asyncio.sleep(3)
    await ctx.delete()</code></pre> <br/> Конкретно, при выполнении этой команды бот запоминает ID канала для отправки сообщения и ID роли для упоминания. Однако проблема в том, что при использовании команды на разных серверах информация перезаписывается, что приводит к некорректной работе бота. Я пытался реализовать проверку, используя <br/><br/> <pre><code class="python">def check(msg):
    return msg.author == ctx.author and msg.channel == ctx.channel</code></pre> <br/> Но возникает ошибка отправки при выполнении команды на втором сервере. <br/><br/> Я бы хотел избежать использования базы данных, так как планируется сделать простой бот с API для отправки уведомлений и возможностью добавления его на свои серверы.
  • 8 ноября 2024 г. 5:13
Ответы на вопрос 2
Для управления запоминанием данных на нескольких серверах Discord, лучше использовать структуры данных, которые будут хранить информацию отдельно для каждого сервера (гильдии). Это предотвратит перезапись данных при использовании команд на разных серверах.

Давайте создадим словарь, который будет использовать ID сервера (гильдии) в качестве ключа и хранить информацию о канале и роли в виде словаря. Вот пример модифицированного кода:

```python
import discord
from discord.ext import commands
import asyncio

bot = commands.Bot(command_prefix='!')

# Словарь для хранения настроек бота на каждом сервере
server_settings = {}

@bot.command()
async def explosion_channel(ctx: discord.ApplicationContext, id_channel: int, id_role: int):
    guild_id = ctx.guild.id  # Получаем ID сервера

    # Сохраняем настройки для сервера (если еще не было настроек)
    if guild_id not in server_settings:
        server_settings[guild_id] = {'channel_id': None, 'role_id': None}

    # Сохраняем данные канала и роли
    server_settings[guild_id]['channel_id'] = id_channel
    server_settings[guild_id]['role_id'] = id_role

    await ctx.respond('Канал и роль приняты!')
    await asyncio.sleep(3)
    await ctx.delete()

@bot.command()
async def get_explosion_settings(ctx: discord.ApplicationContext):
    guild_id = ctx.guild.id  # Получаем ID сервера

    # Проверяем, есть ли настройки для сервера
    if guild_id in server_settings:
        channel_id = server_settings[guild_id]['channel_id']
        role_id = server_settings[guild_id]['role_id']
        await ctx.respond(f'Канал: {channel_id}, Роль: {role_id}')
    else:
        await ctx.respond('Настройки еще не заданы для этого сервера.')

# Запускаем бота
bot.run('YOUR_TOKEN')
```

### Объяснение кода
1. **Словарь `server_settings`:** Мы используем словарь, где ключом является ID сервера (гильдии), а значением — другой словарь, содержащий `channel_id` и `role_id`.
   
2. **Команда `explosion_channel`:** При вызове этой команды бот запоминает указанное ID канала и ID роли для конкретного сервера.

3. **Команда `get_explosion_settings`:** Это дополнительная команда, чтобы показать текущие настройки канала и роли для сервера. Она проверяет, есть ли настройки для данного сервера.

### Важно
- Обратите внимание, что этот метод хорош для небольших ботов, особенно без необходимости долгосрочного хранения данных. Если вам нужно больше данных или сложная логика, рассмотрите возможность использования базы данных.
- Убедитесь, что ваш бот имеет соответствующие разрешения для работы с Discord (например, доступ к каналам и ролям).

Теперь каждая гильдия сможет иметь свои уникальные настройки, и они не будут перезаписываться.
Как реализовать работу бота на нескольких серверах Discord с вводом команды?
Использовать базу данных. Удалить все глобалы.
Не хотелось бы использовать базу данных
А придется.
Похожие вопросы