Разбор команд для Discord.py - PullRequest
0 голосов
/ 03 июня 2018

Есть ли синтаксический анализатор аргументов команды для Discord.py, похожий на модуль 'argparse'?Я создал бот-диск, который принимает 2 целых числа и 1 строковую переменную, обрабатывает их и выводит результат клиенту.Это хорошо, когда пользователи используют его правильно, но когда им это не нужно, мне нужен простой способ передать клиенту ошибки, чтобы сообщить пользователю, что они неправильно использовали команду.Было бы здорово, если бы я мог использовать argparse для этого, иначе мне придется написать парсер с нуля - это было бы больно!Вот код:

import discord
from discord.ext import commands
from discord.ext.commands import Bot
import random
import asyncio

client = discord.Client()
bot = commands.Bot(command_prefix='#')

#Tells you when the bot is ready.
@bot.event
async def on_ready():
    print('Logged in as')
    print(bot.user.name)
    print(bot.user.id)
    print('------')

#The bot listens in on every message. 
@bot.event
async def on_message(message):
    #New command beginning with # to make the bot say "Hello there!" Always remember to begin with # as you have specified the command prefix as # above.
    if message.content.lower().startswith("#greet"):
        userID = message.author.id
        await bot.send_message(message.channel, "<@" + userID + ">" + " Hello there!")

    #Another command that accepts parameters.
    if message.content.lower().startswith("#say"):
        args = message.content.split(" ")   #This turns everything in the string after the command "#say" into a string.
        await bot.send_message(message.channel, args[1:])
        await bot.send_message(message.channel, " ".join(args[1:])) #This joins all the strings back without [] and commas.

    #Another, more sophisticated command that accepts parameters parses them.
    if message.content.lower().startswith("#compton_scatter_eq"):
        args = message.content.split(" ")
        a = int(args[1])
        b = int(args[2])
        c = args[3]
        result = str(a + b) + c
        await bot.send_message(message.channel, result)

bot.run(...)

Подскажите, пожалуйста, есть ли модуль, похожий на argparse, или есть способ использовать модуль argparse с Discord.py?

Редактировать:

@ Rishav - ты классный чувак!Это сработало, но теперь у меня появилась новая проблема.Вот мой код:

#Another, more sophisticated command that accepts parameters parses them.
    if message.content.lower().startswith("#compton_scatter_eq"):
        args = message.content.split(" ")

        #Pass arguments through argparse module.
        parser = argparse.ArgumentParser(description="Example program to get my bot to use argparse")
        parser.add_argument("a", nargs='?', type=int, default=10, help="This is your first variable.")
        parser.add_argument("b", nargs='?', type=int, default=10, help="This is your second variable.")
        parser.add_argument("c", nargs='?', type=str, default="East", help="This is your third variable.")

        #Catch errors and pass them back to the client.
        try:
            await bot.send_message(message.channel, vars(parser.parse_args(args[1:])))
        except BaseException as e:
            await bot.send_message(message.channel, str(e))

К сожалению, ошибки появляются в терминале командной строки, но не в клиенте.Как передать ошибку обратно клиенту?И как мне получить доступ к переменным a, b и c?Спасибо за вашу помощь!

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

Вы импортируете расширение discord.ext.commands, но фактически не используете его. Он имеет великолепный, простой в написании синтаксический анализ команд, встроенный в .

from discord.ext import commands

bot = commands.Bot('#')

@bot.command(pass_context=True)
async def greet(ctx):
    await bot.say("{} Hello there!".format(ctx.author.mention))

@bot.command(pass_context=True, name="say")
async def _say(ctx, *, message):
    await bot.say(message)

@bot.command(pass_context=True)
async def compton_scatter_eq(ctx, a: int, b: int, c):
    await bot.say(str(a + b) + c)

@bot.event
async def on_command_error(ctx, error):
    channel = ctx.message.channel
    if isinstance(error, commands.MissingRequiredArgument):
        await bot.send_message(channel, "Missing required argument: {}".format(error.param))
    elif isinstance(error, commands.BadArgument):
        bot.send_message(channel, "Could not parse commands argument.")

Если вы хотите более детально обрабатывать ошибки, вы можете реализовать обработчики ошибок для каждой команды

0 голосов
/ 03 июня 2018

Да, см. этот пример из argparse docs.

Я думаю, он прекрасно описывает вашу потребность.

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument(
...     'integers', metavar='int', type=int, choices=range(10),
...     nargs='+', help='an integer in the range 0..9')
>>> parser.add_argument(
...     '--sum', dest='accumulate', action='store_const', const=sum,
...     default=max, help='sum the integers (default: find the max)')
>>> parser.parse_args(['1', '2', '3', '4'])
Namespace(accumulate=<built-in function max>, integers=[1, 2, 3, 4])
>>> parser.parse_args(['1', '2', '3', '4', '--sum'])
Namespace(accumulate=<built-in function sum>, integers=[1, 2, 3, 4])
...