You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于JSON存储的Discord Python Bot玩家昵称管理命令问题求解

修复说明

问题1:带空格昵称拆分处理

原代码使用*args接收参数时,discord.py默认按空格拆分输入内容,导致带空格的昵称被拆分为多个条目,两种适配方案可选:

  • 保留批量添加能力:用户输入带空格的昵称时用双引号包裹即可,如!add "张三 测试" "李四 测试",框架原生支持引号内内容识别为单个参数,无需修改代码逻辑
  • 单条命令仅添加1个昵称:将参数改为*, name: str,命令后所有内容会自动合并为单个字符串,无需用户额外加引号

问题2:列表输出格式化

改用Discord Embed组件排版,昵称逐行展示,同时修复原代码隐含问题:

  • 修正删除命令触发词,支持输入!delete调用
  • 替换占用Python内置关键字的list变量名
  • 新增昵称不存在的异常捕获,避免删除操作时Bot崩溃
  • 新增列表为空时的友好提示
  • 新增启动时list.json不存在的初始化逻辑,避免首次运行报错
完整修改后代码
import json
import os
import discord
from discord.ext import commands

# 配置命令前缀,开启消息内容意图(discord.py v2.x 版本必须开启)
intents = discord.Intents.default()
intents.message_content = True
bot = commands.Bot(command_prefix='!', intents=intents)

# 启动时初始化数据文件
@bot.event
async def on_ready():
    if not os.path.exists('list.json'):
        with open('list.json', 'w', encoding='utf-8') as f:
            json.dump([], f, ensure_ascii=False, indent=2)
    print(f'Bot已登录:{bot.user}')

@bot.command(name='delete')
async def delete_nick(ctx, *args):
    with open('list.json', 'r', encoding='utf-8') as f:
        nick_list = json.load(f)
    
    failed = []
    for name in args:
        try:
            nick_list.remove(name)
        except ValueError:
            failed.append(name)
    
    with open('list.json', 'w', encoding='utf-8') as f:
        json.dump(nick_list, f, ensure_ascii=False, indent=2)
    
    msg = "✅ 昵称删除完成"
    if failed:
        msg += f"\n❌ 以下昵称不存在:{', '.join(failed)}"
    await ctx.send(msg)

@bot.command(name='add')
async def add_nick(ctx, *args):
    # 若要改为单条命令仅加1个昵称,把上面的参数改为 *, name: str,去掉for循环直接添加name即可
    with open('list.json', 'r', encoding='utf-8') as f:
        nick_list = json.load(f)
    
    for name in args:
        nick_list.append(name)
    
    with open('list.json', 'w', encoding='utf-8') as f:
        json.dump(nick_list, f, ensure_ascii=False, indent=2)
    
    await ctx.send(f"✅ 成功添加 {len(args)} 个昵称")

@bot.command(name='list')
async def list_nick(ctx):
    with open('list.json', 'r', encoding='utf-8') as f:
        nick_list = json.load(f)
    
    if not nick_list:
        await ctx.send("📋 当前昵称列表为空")
        return
    
    # 构造Embed格式化输出
    embed = discord.Embed(title="📋 昵称列表", color=discord.Color.blue())
    content = '\n'.join([f"- {nick}" for nick in nick_list])
    embed.description = content
    await ctx.send(embed=embed)

bot.run("MY TOKEN HERE")

注意:如果你使用的是discord.py 2.x及以上版本,需要在Discord开发者后台的Bot设置里开启Message Content Intent权限,否则命令无法正常触发。

内容的提问来源于stack exchange,提问作者Martin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 03:18:02