首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >discord.py预警系统

discord.py预警系统
EN

Stack Overflow用户
提问于 2022-06-21 17:26:00
回答 1查看 203关注 0票数 0

所以我在看这个question,我不能让代码工作,我会在最初的问题帖子上推一个评论,但是我没有足够的代表

我很抱歉,如果我不知道自己在做什么,我从来没有和警告一起工作过。

当我使用warn命令时,所遇到的错误是:

代码语言:javascript
复制
Ignoring exception in command warn:
Traceback (most recent call last):
  File "/home/runner/dnunus-5/venv/lib/python3.8/site-packages/discord/ext/commands/core.py", line 85, in wrapped
    ret = await coro(*args, **kwargs)
  File "main.py", line 123, in warn
    save_warn(ctx, member)
  File "main.py", line 99, in save_warn
    warns[str(member.id)] += 1
KeyError: '472100676407656448'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/runner/dnunus-5/venv/lib/python3.8/site-packages/discord/ext/commands/bot.py", line 939, in invoke
    await ctx.command.invoke(ctx)
  File "/home/runner/dnunus-5/venv/lib/python3.8/site-packages/discord/ext/commands/core.py", line 863, in invoke
    await injected(*ctx.args, **ctx.kwargs)
  File "/home/runner/dnunus-5/venv/lib/python3.8/site-packages/discord/ext/commands/core.py", line 94, in wrapped
    raise CommandInvokeError(exc) from exc
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: KeyError: '472100676407656448'
代码语言:javascript
复制
def save_warn(ctx, member: discord.Member):
    with open('warns.json', 'r') as f:
         warns = json.load(f)

         warns[str(member.id)] += 1

    with open('warns.json', 'w') as f:
         json.dump(warns, f)

def remove_warn(ctx, member: discord.Member, amount: int):
    with open('warns.json', 'r') as f:
         warns = json.load(f)

         warns[str(member.id)] -= amount

    with open('warns.json', 'w') as f:
         json.dump(warns, f)
    
def warns_check(member: discord.Member):
    with open('warns.json', 'r') as f:
         warns = json.load(f)

         warns[str(member.id)]
    return warns

@bot.command()
@commands.has_permissions(kick_members=True)
async def warn(ctx, member: discord.Member, *, reason):
      save_warn(ctx, member)
      dm = await bot.fetch_user(member.id)
      em=discord.Embed(title="Warning", description=f"Server: {ctx.guild.id}\nReason: {reason}")
      await dm.send(embed=em)

@bot.command()
@commands.has_permissions(kick_members=True)
async def warnings(ctx, member: discord.Member):
      warns = warns_check(member)
      await ctx.send(f"{member.name} has {warns} warnings.")

@bot.command()
@commands.has_permissions(kick_members=True)
async def rmwarn(ctx, member: discord.Member, amount: int):
      remove_warn(ctx, member, amount)
      await ctx.send(f"Removed {amount} warnings from {member.name}!")
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-21 21:23:31

在尝试访问密钥之前,需要确保密钥的存在。

一种方法是,如果成员还不知道,则将警告计数设置为0。

该代码的warns_check也被破坏了。

代码语言:javascript
复制
def save_warn(ctx, member: discord.Member):
    with open('warns.json', 'r') as f:
         warns = json.load(f)
         # if `str(member.id)` isn't in `warns`, then return 0
         warns[str(member.id)] = warns.get(str(member.id), 0) + 1
    with open('warns.json', 'w') as f:
         json.dump(warns, f)

def remove_warn(ctx, member: discord.Member, amount: int):
    with open('warns.json', 'r') as f:
         warns = json.load(f)
         warns[str(member.id)] = warns.get(str(member.id), 0) - amount
    with open('warns.json', 'w') as f:
         json.dump(warns, f)
    
def warns_check(member: discord.Member):
    with open('warns.json', 'r') as f:
         warns = json.load(f)
         return warns.get(str(member.id), 0)

请注意,每次需要读取输入时打开和关闭文件并不是最佳做法。最好只加载一次输入,然后定期保存,如下所示:

代码语言:javascript
复制
@tasks.loop(minutes=1.0)
async def autosave():
    with open(...) as f:
        json.dump(warns, f)
autosave()

with open(...) as f:
    warns = json.load(f)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72704857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档