Discordpy Mod 日志命令
Posted
技术标签:
【中文标题】Discordpy Mod 日志命令【英文标题】:Discordpy Mod Logs Command 【发布时间】:2021-10-14 03:27:48 【问题描述】:我正在尝试制作模组日志,但我并不擅长此操作,我自己编写了脚本并且有点工作,但没有成功。所以基本上我的计划是当有人键入 .modlogs #channel 时,机器人将获取频道 ID 并将其键入带有公会 ID 的 json 文件,我让它工作得很好我一直坚持从 json 文件中获取关键信息,我打印值并且它们是相同的。
@commands.command(aliases=['purge'])
@commands.guild_only()
@commands.has_permissions(manage_messages=True)
async def clear(self,ctx, arg: int = None):
if arg is None:
await ctx.send(':x: You need to state a value!')
else:
with open('./logs.json', 'r') as f:
logsf = json.load(f)
if ctx.guild.id in logsf:
embedv = discord.Embed(color = discord.Colour.random())
embedv.add_field(name='Event Type:', value="Clear")
embedv.add_field(name='Channel:', value= ctx.channel)
embedv.add_field(name='Moderator:', value=ctx.message.author)
embedv.footer(text='Epifiz Logging')
schannel = commands.get_channel(logsf[ctx.guild.id])
await ctx.channel.purge(limit=arg)
await discord.schannel.send(embed=embedv)
await ctx.send('Done')
elif ctx.guild.id not in logsf:
await ctx.channel.purge(limit=arg)
await ctx.send(':white_check_mark: Successfully cleared messages.'.format(arg))
也是我的 json 文件:
"838355243817369620": 853297044922564608
公会ID也在json文件中,没有错。
Output
【问题讨论】:
你的 json 字典有一个字符串作为键,而 ctx.guild.id 是一个 int。要解决此问题,您有两个选择:要么在加载 json(使用 object_hook 函数)时将密钥恢复为整数,要么在每次需要时将 ctx.guild.id 转换为 str 我将如何使我的密钥 int? 在 json.load() 中使用 object_hook 关键字,例如:data = json.load(f, object_hook=convert_keys_to_int) 用于我使用的 convert_keys_to_int...原谅格式:def convert_keys_to_int(d) : new_dict = for k, v in d.items(): try: new_key = int(k) except ValueError: new_key = k if type(v) == dict: v = convert_keys_to_int(v) new_dict[new_key] = v 返回新字典 谢谢,我解决了。 没问题,请注意,如果可能,使用该函数将所有键转换为整数,因此,如果您有任何键是字符串但可以转换为整数,它将转换它们并可能破坏您的程序 【参考方案1】:您在代码中犯了多个错误。您收到错误的原因是因为if ctx.guild.id in logsf:
的这一行返回False
,即使公会的 id 在您的 JSON 文件中也是如此。原因如下:
logsf = json.load(f)
返回一个字典。你会得到"838355243817369620": 853297044922564608
不清楚838355243817369620
或853297044922564608
是你的公会ID,但可以这样想:
s = 1:2
2 in s
返回False
第二个错误是将"838355243817369620"
插入为str
,而不是像838355243817369620
这样的int
。
解决方案是使用list()
如下if ctx.guild.id in list(logsf):
并在您的JSON 文件中插入"838355243817369620"
作为一个int,所以它看起来像这样:
838355243817369620: 853297044922564608
#rather than this
"838355243817369620": 853297044922564608
value
in embeds 接受 str 而不是 discord 对象。使用 f"input"
而不是对象作为输入。
embedv.add_field(name='Channel:', value= f"ctx.channel")
embedv.add_field(name='Moderator:', value=f"ctx.message.author")
await schannel.send(embed=embedv)
而不是 await discord.schannel.send(embed=embedv)
从这行schannel = commands.get_channel(logsf[ctx.guild.id])
我可以假设838355243817369620
是您的服务器的ID。所以,我认为你可以使用:
if ctx.guild.id in logsf.keys():
而不是if ctx.guild.id in list(logsf):
并确保将其键值转换为 int
而不是 str
以使其工作。
【讨论】:
以上是关于Discordpy Mod 日志命令的主要内容,如果未能解决你的问题,请参考以下文章
我如何为 client = discord.Client() 使用 discordpy 冷却命令 [关闭]
Discord Py - 如何使用文本命令向公会的所有成员添加多个角色
discord py - 自定义命令前缀不起作用(没有命令运行)