[英]How can I get user input in a python discord bot?
I have a python discord bot and I need it to get user input after a command, how can I do this?我有一个 python discord 机器人,我需要它在命令后获取用户输入,我该怎么做? I am new to python and making discord bots.
我是 python 和制作 discord 机器人的新手。 Here is my code:
这是我的代码:
import discord, datetime, time
from discord.ext import commands
from datetime import date, datetime
prefix = "!!"
client = commands.Bot(command_prefix=prefix, case_insensitive=True)
times_used = 0
@client.event
async def on_ready():
print(f"I am ready to go - {client.user.name}")
await client.change_presence(activity=discord.Activity(type=discord.ActivityType.watching, name=f"{client.command_prefix}python_help. This bot is made by drakeerv."))
@client.command(name="ping")
async def _ping(ctx):
global times_used
await ctx.send(f"Ping: {client.latency}")
times_used = times_used + 1
@client.command(name="time")
async def _time(ctx):
global times_used
from datetime import date, datetime
now = datetime.now()
if (now.strftime("%H") <= "12"):
am_pm = "AM"
else:
am_pm = "PM"
datetime = now.strftime("%m/%d/%Y, %I:%M")
await ctx.send("Current Time:" + ' ' + datetime + ' ' + am_pm)
times_used = times_used + 1
@client.command(name="times_used")
async def _used(ctx):
global times_used
await ctx.send(f"Times used since last reboot:" + ' ' + str(times_used))
times_used = times_used + 1
@client.command(name="command") #THIS LINE
async def _command(ctx):
global times_used
await ctx.send(f"y or n")
times_used = times_used + 1
@client.command(name="python_help")
async def _python_help(ctx):
global times_used
msg = '\r\n'.join(["!!help: returns all of the commands and what they do.",
"!!time: returns the current time.",
"!!ping: returns the ping to the server."])
await ctx.send(msg)
times_used = times_used + 1
client.run("token")
I am using python version 3.8.3.我正在使用 python 版本 3.8.3。 I have already looked at other posts but they did not answer my question or gave me errors.
我已经看过其他帖子,但他们没有回答我的问题或给我错误。 Any help would be greatly appreciated!
任何帮助将不胜感激!
You'll be wanting to use Client.wait_for()
:你会想要使用
Client.wait_for()
:
@client.command(name="command")
async def _command(ctx):
global times_used
await ctx.send(f"y or n")
# This will make sure that the response will only be registered if the following
# conditions are met:
def check(msg):
return msg.author == ctx.author and msg.channel == ctx.channel and \
msg.content.lower() in ["y", "n"]
msg = await client.wait_for("message", check=check)
if msg.content.lower() == "y":
await ctx.send("You said yes!")
else:
await ctx.send("You said no!")
times_used = times_used + 1
And with a timeout:并有超时:
import asyncio # To get the exception
@client.command(...)
async def _command(ctx):
# code
try:
msg = await client.wait_for("message", check=check, timeout=30) # 30 seconds to reply
except asyncio.TimeoutError:
await ctx.send("Sorry, you didn't reply in time!")
References:参考:
Client.wait_for()
- More examples in here Client.wait_for()
- 更多示例在这里Message.author
Message.channel
Message.content
asyncio.TimeoutError
With this you can make something like this有了这个,你可以做这样的事情
@client.command()
async def command(ctx):
computer = random.randint(1, 10)
await ctx.send('Guess my number')
def check(msg):
return msg.author == ctx.author and msg.channel == ctx.channel and int(msg.content) in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
msg = await client.wait_for("message", check=check)
if int(msg.content) == computer:
await ctx.send("Correct")
else:
await ctx.send(f"Nope it was {computer}")
I've had a few days on trying to figure that out, and the only thing that was simple for me was storing the message.content into a list and using it later.我花了几天时间试图弄清楚这一点,对我来说唯一简单的事情就是将 message.content 存储到一个列表中并稍后使用它。
some_list = []
user_message = message.content.split()
some_list.append(user_message)
and since I am using commands I wanted to remove that '!'因为我使用的是命令,所以我想删除那个'!' and get the raw message
并获取原始消息
for i in some_list:
del i[0]# delete's command tag
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.