Ввод данных в переменную и их вывод в модуле Discord.py
Я совсем недавно начал работать с модулем для Python 'Discord.py' и у меня появилась необходимость создания функции которая работает так: пользователь вводит текст, а бот этот текст переотправляет. Пожалуйста, помогите мне разобраться в том как это сделать. Вот мой код:
import discord
from discord.ext import commands
bot = discord.ext.commands.Bot(command_prefix = "!");
client = discord.Client()
@client.event
async def on_ready():
print('We have logged in as {0.user}'.format(client))
@client.event
async def on_message(message):
if message.author == client.user:
return
if message.content.startswith('!привет'):
await message.channel.send(f' { message.author.mention }, Привет!')
if message.content.startswith('!хелп'):
await message.channel.send('Я бот, да ты и сам знаешь.\n**Мои команды:**\n```!привет - Вывод сообщения с приветом.``` ```!хелп - эта команда.```')
if message.content.startswith('!print '): #После команды !print пользователь должен ввести текст который как-то нужно указать, возможно в переменной.
await message.channel.send('') #Бот его должен вывести.
client.run('TOKEN')
Мой Python 3.7.0
Ответы (1 шт):
Есть 2 типа ботов - discord.Client() и commands.Bot()
В коде вы объявляете обоих, но используете только первого - client:
bot= discord.ext.commands.Bot(command_prefix = "!")
client= discord.Client()
Объект bot отличается тем, что умеет обрабатывать поступающие команды вместе с отдельными аргументами. Такие команды объявляются строкой @bot.command(), которая ставится перед асинхронной функцией команды. Объект client такую команду обработать не сможет. А вот bot, может помимо команды отлавливать также события, помеченные как @bot.event. К таким событиям относятся: on_ready() - вызывается когда бот загрузился и готов к работе, on_message() - вызывается при получении ботом любого сообщения, и др.
У вас в коде как раз таки присутствует обработка получения сообщения on_message(), в которой вы пытаетесь имитировать выполнение команд, путем сравнения поступающих слов. Это неправильно. Во всяком случае, это не то что вам нужно. Если вы хотите обрабатывать команды, с передачей в них различных аргументов, то использовать нужно именно объект commands.Bot(), который вы объявили в коде под именем bot. Далее к нему.
При определении объекта, в скобках вы указываете параметр command_prefix, равный значению "!". Параметр "префикс" является обязательным и нужен для того, чтобы при его использовании бот определял, что в чате была использована именно команда. Сама команда выглядит следующим образом:
@bot.command() # указываем боту на то, что это его команда
async def command(ctx, *, text):
await ctx.send(f'Получен текст: {text}')
Вызывается команда при написании в чат такой конструкции: [префикс][имя команды] [аргументы]
Для вызова этой команды нужно написать в чат "!command текст, который нужно вернуть", на что бот ответит: "Получен текст: текст, который нужно вернуть"
Здесь command - название команды; Аргумент ctx - контекст, обязательный аргумент, грубо говоря, это текстовый канал, в котором была вызвана команда. Аргумент text будет содержать в себе весь текст после "!command". Звездочка нужна для того, чтобы бот получил в качестве аргумента весь текст после пробела, а не только первое слово. То есть, если вам, например, нужно получить от пользователя 2 числовых значения, разделенные пробелом, обработка аргументов будет выглядеть так: async def command(ctx, arg1: int, arg2: int)
Из контекста ctx можно получить объект автора - author = ctx.message.author и еще много чего полезного. Подробнее о работе с аргументами обязательно ознакомьтесь в документации!
Что касается вашего кода; Первым делом, предлагаю полностью убрать из него объект discord.Client, заменив его на commands.Bot. Чтобы не переписывать весь код, просто поменяем bot на client в строке bot = discord.ext.commands.Bot(command_prefix = "!")
Затем, объявим в коде полноценные команды и получим результат:
import discord
from discord.ext import commands
client = discord.ext.commands.Bot(command_prefix = "!")
@client.event
async def on_ready():
print('We have logged in as {0.user}'.format(client))
@client.command()
async def привет(ctx):
await ctx.send(f'{ctx.message.author.mention}, Привет!')
@client.command()
async def хелп(ctx):
await ctx.send('Я бот, да ты и сам знаешь.\n**Мои команды:**\n```!привет - Вывод сообщения с приветом.``` ```!хелп - эта команда.```')
@client.command()
async def print(ctx, *, text):
await ctx.send(f'{text}')
client.run('TOKEN')
А в конструкции on_message() нужно обрабатывать именно те сообщения, которые не являются командой и при обработке которых не нужны аргументы. Например, через это событие можно отлавливать мат, после чего бот будет выдавать предупреждение участнику. Удачи :)