Ставки «ХР» внутри команды discord.py - PullRequest
0 голосов
/ 01 сентября 2018

Я не могу обернуться, как разрешить пользователю ставить X суммы «XP» (я использую доллары) внутри команды. Я разместил ниже простую команду coinflip, которая, как мне кажется, должна быть логичной, но я не уверен на 100%, нахожусь ли я на правильном пути. Мне было интересно, как я могу вызвать get_dollars для пользователя, когда они ставят случайную сумму денег. Я предполагаю, что мне нужно будет создать что-то вроде betamount = enter authors bet amount, но я рисую пробел о том, как обрабатывать произвольную сумму, которую они могут положить, вместо того, чтобы жестко задавать фиксированную сумму, которая вынуждает пользователя использовать.

client = discord.Client()

try:
    with open("cash.json") as fp:
        cash = json.load(fp)
except Exception:
    cash = {}

def save_cash():
    with open("cash.json", "w+") as fp:
        json.dump(cash, fp, sort_keys=True, indent=4)

def get_dollars(user: discord.User):
    id = user.id
    if id in cash:
        return cash[id].get("dollars", 0)
    return 0

@client.event
async def on_message(message):
    betamount = ???
    if message.content.lower().startswith('!coinflip'):
        if get_dollars(message.author) < 0:
            await client.send_message(message.channel, "{} you don't have enough money to bet.".format(message.author.mention))
        else:
            choice = random.randint(0,1)
            if choice == 0
                await client.add_reaction(message, '⚫')
                await client.send_message(message.channel, "The coin handed on heads!)
                if 'heads' in message.content:
                    await client.send_message(message.channel, "You've won ${}".format(betamount))
                    add_dollars(message.author, betamount)
                else:
                    if 'tails' in message.content:
                        await client.send_message(message.channel, "You've lost ${}".format(betamount))
                        remove_dollars(message.author, betamount)
            elif choice == 1:
                await client.add_reaction(message, '⚪')
                await client.send_message(message.channel, "The coin handed on tails!")
                if 'tails' in message.content:
                    await client.send_message(message.channel, "You've won ${}".format(betamount))
                    add_dollars(message.author, betamount)
                else:
                    if 'heads' in message.content:
                        await client.send_message(message.channel, "You've lost ${}".format(betamount))
                        remove_dollars(message.author, betamount)

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

Если вы получаете команды с аргументами (особенно когда эти аргументы становятся типа, например discord.Member), я настоятельно рекомендую переключиться на использование расширения discord.ext.commands. Это делает написание команд намного проще, и это означает, что вы можете перемещать код из события on_message. Вот как будет выглядеть ваша команда, используя commands:

from discord.ext import commands

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

@bot.command(pass_context=True)
async def coinflip(ctx, guess: str, amount: float):
    guesses = ('heads', 'tails')
    guess = guess.lower()
    if guess not in guesses:
        await bot.say("Invalid guess.")
        return
    author = ctx.message.author
    balance = get_dollars(author)
    if balance < amount:
        await bot.say(f"You don't have that much money.  Your balance is ${balance:.2f}")
        return
    result = random.sample(guesses)
    if result == guess:
        await bot.say("You won!")
        add_dollars(author, amount)
    else:
        await bot.say("You lost!")
        remove_dollars(author, amount)

bot.run("TOKEN")

Также имейте в виду, что если вы начинаете использовать команды, вы должны добавить await bot.process_commands(message) в конец вашего on_message события

0 голосов
/ 01 сентября 2018

Если вы используете команду типа !coinflip (heads/tails) (amount), вы можете использовать x = message.content.split(" "), чтобы разбить сообщение на список. С этим вы можете сделать что-то вроде outcome = x[1] и betamount = x[2].

Я бы также рекомендовал изменить if 'tails' in message.content: на if outcome == 'tails'. В противном случае пользователь мог бы сделать что-то вроде !coinflip heads (amount) tails, которое каждый раз давало бы ему наличные.

...