问题描述
所以我试图创建一个 /modlogs
命令,它会向其他人显示用户的每个日志。这意味着 Warns,Mutes,Bans,Unmutes,Unbans
。我设法找到了一种方法并存储了大部分数据。我目前正在尝试获取该数据并使用它。我的问题是机器人不会像我想要的那样回答。
之前展示我的代码等。我需要先向您展示我想要实现的目标。所以这是我想要实现的一个例子:
如您所见,运行该命令后,客户端将响应一些数据。 (Action,Date,Mod,Reason)
。它还响应不同的消息,这也是我想要实现的目标。
首先:
@commands.command()
@commands.has_permissions(manage_messages=True)
async def modlogs(self,ctx,user : discord.Member):
db = sqlite3.connect("main.sqlite")
cursor = db.cursor()
cursor.execute(f"SELECT guild_id FROM modlogsdb WHERE user_id = {user.id}")
result = cursor.fetchone()
if result is None:
await ctx.channel.send("This user has no Logs.")
elif result is not None:
cursor.execute(f"SELECT type FROM modlogsdb WHERE guild_id = {ctx.guild.id} AND user_id = {user.id}")
result = cursor.fetchone()
cursor.execute(f"SELECT reason FROM modlogsdb WHERE guild_id = {ctx.guild.id} AND user_id = {user.id}")
result1 = cursor.fetchone()
await ctx.channel.send(f"TYPE: {str(result[0])} - REASON: {str(result1[0])}")
db.commit()
cursor.close()
db.close()
如你所见,我已经添加了两个结果,这里的问题是它应该显示数据库中的每个结果,但它只显示一行。
类似这样,但数据库中有更多数据:
================================================ ==================================================== /p>
第二次尝试:
在尝试第一个之后,我做了一些改变:
@commands.command()
@commands.has_permissions(manage_messages=True)
async def modlogs(self,user : discord.Member):
db = sqlite3.connect("main.sqlite")
cursor = db.cursor()
cursor.execute(f"SELECT guild_id FROM modlogsdb WHERE user_id = {user.id}")
result = cursor.fetchone()
if result is None:
await ctx.channel.send("This user has no Logs.")
elif result is not None:
cursor.execute(f"SELECT type FROM modlogsdb WHERE guild_id = {ctx.guild.id} AND user_id = {user.id}")
result = cursor.fetchall()
cursor.execute(f"SELECT reason FROM modlogsdb WHERE guild_id = {ctx.guild.id} AND user_id = {user.id}")
result1 = cursor.fetchall()
await ctx.channel.send(f"TYPE: {str(result[0])} - REASON: {str(result1[0])}")
db.commit()
cursor.close()
db.close()
我基本上添加了 fetchall()
以便获取每一行,然后再试一次。我得到的第一个问题是响应在括号内。我得到的第二个问题是,原因在同一条线上。像这样:
那么有什么想法可以避免这些,或者至少设法获取我在第一张图片中显示的信息?
解决方法
您的第二个 SQL 查询
SELECT reason
FROM modlogsdb
WHERE guild_id = {ctx.guild.id} AND user_id = {user.id}
将返回用户被警告/静音/...的所有原因的列表
更好的方法是将每种类型的原因一一获取,即
SELECT reason
FROM modlogsdb
WHERE guild_id = {ctx.guild.id}
AND user_id = {user.id}
AND type = "Warning"
这将返回用户被警告的所有原因。
或者,我想如果你使用
SELECT type,reason
FROM modlogsdb
WHERE guild_id = {ctx.guild.id}
AND user_id = {user.id}
你会得到一个包含 [('Warning','Bad Words'),('Warning','NSFW Emojis')]
或类似内容的元组列表