Заставить двух ботов считать сообщения друг друга

#python #discord #bots

Вопрос:

Итак, в качестве праздничного проекта я пытаюсь создать двух ботов, которые будут отвечать на сообщения друг друга. Они проверят идентификатор отправителя, и если он совпадает с идентификатором другого бота, он отправит сообщение с тем количеством раз, когда бот ответил.

Проблема в том, что, когда я пытаюсь выполнить это, оба бота отправляют два сообщения, и количество не превышает 1.

Вот мой код:

 import discord
import time

TOKEN = #BOT TOKEN#
client = discord.Client()


@client.event
async def on_ready():
    print(f'{client.user} has connected to Discord!')


@client.event
async def on_message(message):
    if message.author == client.user:
        return
    tally = 0
    if message.author.id == 887901692673261618:
        tally  = 1
        time.sleep(5)
        await message.channel.send(tally)


client.run(TOKEN)
    
 

Я попытался определить переменную tally под определением токена и клиента, но затем в ней говорится, что на нее ссылаются перед назначением

Комментарии:

1. tally устанавливается равным 0 при каждом вызове on_message . Сохраните это число как глобальную переменную и не устанавливайте его равным нулю в этом методе?

Ответ №1:

В каждом сообщении вы устанавливаете значение переменной подсчета в 0. Это сброс счетчика, и, следовательно, он не увеличивается

Что касается переменной, на которую ссылаются перед назначением, вы должны определить ее над функцией для ясности. Определение его в любом месте до client.run этого сработает, но не после client.run , так client.run как блокирует дальнейшее выполнение кода, если бот не будет остановлен, поэтому ваша переменная определяется после закрытия бота, а не во время его работы, поэтому ошибка. Теперь

  • Вы можете использовать ключевое слово global для изменения значения переменной, определенной вне функции
  • Вы можете установить tally в качестве атрибута клиента, это избавит вас от необходимости использовать глобальное ключевое слово

Пример установки его в качестве атрибута client

 import discord
import time

TOKEN = #BOT TOKEN#
client = discord.Client()
client.tally = 0

@client.event
async def on_ready():
    print(f'{client.user} has connected to Discord!')


@client.event
async def on_message(message):
    if message.author == client.user:
        return
    if message.author.id == 887901692673261618:
        client.tally  = 1
        time.sleep(5)
        await message.channel.send(client.tally)


client.run(TOKEN)
 

Пример установки его в качестве глобальной переменной

 import discord
import time

TOKEN = #BOT TOKEN#
client = discord.Client()
tally = 0

@client.event
async def on_ready():
    print(f'{client.user} has connected to Discord!')


@client.event
async def on_message(message):
    global tally
    if message.author == client.user:
        return
    if message.author.id == 887901692673261618:
        tally  = 1
        time.sleep(5)
        await message.channel.send(tally)


client.run(TOKEN)
 

Подумайте о том, чтобы узнать больше о переменных областях в python