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 不清楚838355243817369620853297044922564608 是你的公会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 - 自定义命令前缀不起作用(没有命令运行)

discord py,ctx.guild.members,只返回bot

如果猜测错误,将用户与频道断开连接 DiscordPy

如何将拒绝消息添加到 Discord py 角色限制命令