Discord-py Как сделать так, чтобы бот мог выполнять пассивную работу и отвечать на вопросы одновременно?
Проблема в том, что бот делает какие-либо действия только с функцией on_message. При попытке сразу же стриггерить прогу на функции Hello и Wink бот молчит. Как мне сделать так, чтобы бот и выполнял пассивную работу, и отвечал на команды? Буду благодарен за помощь.
import json
import requests
import random
import os
from discord.ext import commands
from config import settings
bot = commands.Bot(command_prefix = settings['prefix'])
class MyClient(discord.Client):
async def on_message(self, message):
author = message.author
word_list = ['Ниггер','Nigga','Nigger','Nibba','Негр','негр','igger','negr','niger''gay','Nigayer','Nigay','NIger','Niger','nigger','nIgGeRmAn','Nigger','Nibba','Sucker','CockSucker',
'Пидор', 'Pidor','Пидорас','Pidoras','Pidrila','Пидрила','gitler','Gitler']
messageContent = message.content
if len(messageContent) > 0:
for word in word_list:
if word in messageContent:
await message.delete()
await message.channel.send(f'Do not say that, {author.mention}!')
await message.author.edit(nick = 'BadWorder2009')
messageattachments = message.attachments
if len(messageattachments) > 0:
for attachment in messageattachments:
if attachment.filename.endswith(".dll"):
await message.delete()
await message.channel.send("No DLL's allowed!")
elif attachment.filename.endswith('.exe'):
await message.delete()
await message.channel.send("No EXE's allowed!")
else:
break
@bot.command
async def Hello():
author = ctx.message.author
Welcome = ['Welcome to the club,',
"I smell one of cum monsters... Wait! That's just",
'You entered this server... But at what cost? Oh, sure. For 300 bucks. Hi,',
'Fuck you, slave -',
'Hello,',
'Inserting dick into ',
'And so it begins... Oh! Hello,']
await ctx.send(f'{random.choice(Welcome)} {author.mention}!')
response = requests.get('https://some-random-api.ml/animu/hug')
json_data = json.loads(response.text)
embed = discord.Embed(color = 0xff9900)
embed.set_image(url = json_data['link'])
await ctx.send(embed = embed)
@bot.command()
async def wink(ctx):
author = ctx.message.author
user = ctx.message.mentions[0]
Winky = [' just winked to ',
' tried to hit on ']
await ctx.send(f'{author.name}{random.choice(Winky)}{user.mention}!')
response = requests.get('https://some-random-api.ml/animu/wink')
json_data = json.loads(response.text)
embed = discord.Embed(color = 0xff9900)
embed.set_image(url = json_data['link'])
await ctx.send(embed = embed)
client = MyClient()
client.run(settings['token'])
Ответы (1 шт):
Ваша главная проблема в том, что в качестве основного бота вы используете класс MyClient, объектом которого является discord.Client - бот, который не умеет обрабатывать команды.
Да, в строке bot = commands.Bot(command_prefix = settings['prefix']) вы объявляете бота commands.Bot, который умеет обрабатывать команды, но по итогу не запускаете его.
*Для запуска бота, нужно вызвать у его объекта функцию run(token). Эту функцию (в самом низу кода) вы вызываете только для бота из класса MyClient.
После того, как вы решите первую проблему, перед вами скорее всего встанет вторая:
В функции on_message() бот принимает абсолютно все сообщения, а вам нужно также обрабатывать команды. Как раз для таких случаев в Discord API есть функция await bot.process_commands(message). Добавьте ее в начало функции обработки сообщений и тогда бот сначала будет проверять сообщение на предмет команды, а уже затем выполнять какие-то действия.