discord.py - Помощь с командой обратного отсчета - PullRequest
0 голосов
/ 12 октября 2018

Я пытаюсь создать команду для брака для Discord Bot (не спрашивайте меня, почему), и я не могу понять, как заставить его отсчитывать 30 секунд, чтобы получить информацию от упомянутого человека.Обобщение того, что я хочу:

Пользователь вводит! Чат в чате и упоминает о человеке, за которого он хочет "жениться".

Команда больше не может использоваться кем-либо еще, пока не будет инициированаТаймер 30 секунд заканчивается.

Упомянутое лицо должно либо набрать «y», либо «n», чтобы принять предложение, либо отклонить его в течение 30 секунд. Обратный отсчет.

Если указанное лицо выполнит одно из следующих действий:после этого обратный отсчет прекратится, появится сообщение, и команда снова станет доступной.

Если указанный человек не ответит в течение этих 30 секунд, появится сообщение и команда пригодна для использования.

Я уже справился с большей частью этого, но я все еще новичок в Python, и я просто не могу заставить это работать, и я чувствую, что написанный мной код утомителен и небрежен.Вот оно:

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

Client = discord.Client()
client = commands.Bot(command_prefix="!")

@client.event
async def on_message(message):
    author = message.author.mention
    user_mentioned = message.mentions

    if message.content == '!marriage':
        await client.send_message(message.channel, author + " you must tag another user!")

    if message.content.startswith('!marriage '):
        if message.channel.name == "restricted-area":
            if len(user_mentioned) == 1:
                if message.mentions[0].mention == author:
                    await client.send_message(message.channel, author + " you cannot tag yourself!")
                else:
                    # if time_up + 30.0 <= time.time() or marriage_active == 1:
                    global marriage_active
                    marriage_active = 1
                    if marriage_active == 1:
                        global marriage_mention
                        global marriage_author
                        marriage_mention = message.mentions[0].id[:]
                        marriage_author = message.author.id[:]
                        msg = await client.send_message(message.channel, author + " has asked for " + message.mentions[0].mention + "'s hand in marriage!")
                        time.sleep(0.3)
                        await client.edit_message(msg, author + " has asked for " + message.mentions[0].mention + "'s hand in marriage!\n" + message.mentions[0].mention + " if you wish to either accept or deny the request, simply type 'y' for yes or 'n' for no!")
                        time.sleep(0.3)
                        await client.edit_message(msg, author + " has asked for " + message.mentions[0].mention + "'s hand in marriage!\n" + message.mentions[0].mention + " if you wish to either accept or deny the request, simply type 'y' for yes or 'n' for no!\n You have 30 seconds to reply...")

                        marriage_active = 0
                        global time_up
                        time_up = time.time()

                    else:
                        await client.send_message(message.channel, author + " please wait until the current request is finished!")
        else:
            await client.send_message(message.channel, author + " this command is currently in the works!")

    if message.content == "y":
        if message.author.id == marriage_author and marriage_active == 0:
            if time_up + 30.0 > time.time():
                await client.send_message(message.channel, author + " said yes! :heart:")
                marriage_active = 1
            else:
                marriage_active = 1
    if message.content == "n":
        if message.author.id == marriage_author and marriage_active == 0:
            if time_up + 30.0 > time.time():
                await client.send_message(message.channel, author + " denied <@" + marriage_author + ">'s proposal. :cry:")
                marriage_active = 1
            else:
                marriage_active = 1

Я не могу использовать цикл while в команде! Wedding, потому что она никогда не покинет команду, пока не истечет 30 секунд, и я не могу поставить "y"«или» n команд в! браке либо потому, что они не будут приняты упомянутым человеком, только автором, который первоначально инициировал команду.

Если есть намного лучший способ сделать это или простойисправить мою проблему, любая помощь с благодарностью!: -)

1 Ответ

0 голосов
/ 12 октября 2018

Мы можем многое исправить, используя расширение commands .Мы будем использовать wait_for_message для ожидания сообщения

from discord.ext import commands
import discord

bot = commands.Bot(command_prefix='!')  # Use Bot instead of Client

@bot.event
async def on_message(message):
    await bot.process_commands(message)  # You need this line if you have an on_message

bot.marriage_active = False
@bot.command(pass_context=True)
async def marriage(ctx, member: discord.Member):
    if bot.marriage_active:
        return  # Do nothing
    bot.marriage_active = True
    await bot.say("{} wanna get hitched?".format(member.mention))
    reply = await bot.wait_for_message(author=member, channel=ctx.message.channel, timeout=30)
    if not reply or reply.content.lower() not in ("y", "yes", "yeah"):
        await bot.say("Too bad")
    else:
        await bot.say("Mazel Tov!")
    bot.marriage_active = False

bot.run("Token")

Возможно, вам придется заменить bot.marriage_active на переменную global.

Дляпринимать только y или n, мы включили бы check в wait_for_message, который ищет этот контент

    def check(message):
       return message.content in ('y', 'n')

    reply = await bot.wait_for_message(author=member, channel=ctx.message.channel, 
                                       timeout=30, check=check)
    if not reply or reply.content == 'n':
        await bot.say("Too bad")
    else:
        await bot.say("Mazel Tov!")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...