Package: nonebot-adapter-discord
NoneBot-Adapter-Discord✨ Discord 协议适配 ✨安装通过nb adapter install nonebot-adapter-discord安装本适配器。或在nb create创建项目时选择Discord适配器。可通过pip install git+https://github.com/nonebot/adapter-discord.git@master安装开发中版本。由于Discord 文档存在部分表述不清的地方，并且结构复杂，存在很多partial object，
需要更多实际测试以找出问题，欢迎提出 ISSUE 反馈。配置修改 NoneBot 配置文件.env或者.env.*。Driver参考driver配置项，添加ForwardDriver支持。如：DRIVER=~httpx+~websocketsDISCORD_BOTS配置机器人帐号，如：DISCORD_BOTS='
[
  {
    "token": "xxx",
    "intent": {
      "guild_messages": true,
      "direct_messages": true
    },
    "application_commands": {"*": ["*"]}
  }
]
'

# application_commands的{"*": ["*"]}代表将全部应用命令注册为全局应用命令
# {"admin": ["123", "456"]}则代表将admin命令注册为id是123、456服务器的局部命令，其余命令不注册DISCORD_COMPRESS是否启用数据压缩，默认为False，如：DISCORD_COMPRESS=TrueDISCORD_API_VERSIONDiscord API 版本，默认为10，如：DISCORD_API_VERSION=10DISCORD_API_TIMEOUTDiscord API 超时时间，默认为30秒，如：DISCORD_API_TIMEOUT=15.0DISCORD_HANDLE_SELF_MESSAGE是否处理自己发送的消息，默认为False，如：DISCORD_HANDLE_SELF_MESSAGE=TrueDISCORD_PROXY代理设置，默认无，如：DISCORD_PROXY='http://127.0.0.1:6666'插件示例以下是一个简单的插件示例，展示各种消息段：importdatetimefromnonebotimporton_commandfromnonebot.paramsimportCommandArgfromnonebot.adapters.discordimportBot,MessageEvent,MessageSegment,Messagefromnonebot.adapters.discord.apiimport*matcher=on_command('send')@matcher.handle()asyncdefready(bot:Bot,event:MessageEvent,msg:Message=CommandArg()):# 调用discord的apiself_info=awaitbot.get_current_user()# 获取机器人自身信息user=awaitbot.get_user(user_id=event.user_id)# 获取指定用户信息...# 各种消息段msg=msg.extract_plain_text()ifmsg=='mention_me':# 发送一个提及你的消息awaitmatcher.finish(MessageSegment.mention_user(event.user_id))elifmsg=='time':# 发送一个时间，使用相对时间（RelativeTime）样式awaitmatcher.finish(MessageSegment.timestamp(datetime.datetime.now(),style=TimeStampStyle.RelativeTime))elifmsg=='mention_everyone':# 发送一个提及全体成员的消息awaitmatcher.finish(MessageSegment.mention_everyone())elifmsg=='mention_channel':# 发送一个提及当前频道的消息awaitmatcher.finish(MessageSegment.mention_channel(event.channel_id))elifmsg=='embed':# 发送一个嵌套消息，其中包含a embed标题，nonebot logo描述和来自网络url的logo图片awaitmatcher.finish(MessageSegment.embed(Embed(title='a embed',type=EmbedTypes.image,description='nonebot logo',image=EmbedImage(url='https://v2.nonebot.dev/logo.png'))))elifmsg=='attachment':# 发送一个附件，其中包含来自本地的logo.png图片withopen('logo.png','rb')asf:awaitmatcher.finish(MessageSegment.attachment(file='logo.png',content=f.read()))elifmsg=='component':# 发送一个复杂消息，其中包含一个当前时间，一个字符串选择菜单，一个用户选择菜单和一个按钮time_now=MessageSegment.timestamp(datetime.datetime.now())string_select=MessageSegment.component(SelectMenu(type=ComponentType.StringSelect,custom_id='string select',placeholder='select a value',options=[SelectOption(label='A',value='a'),SelectOption(label='B',value='b'),SelectOption(label='C',value='c')]))select=MessageSegment.component(SelectMenu(type=ComponentType.UserInput,custom_id='user_input',placeholder='please select a user'))button=MessageSegment.component(Button(label='button',custom_id='button',style=ButtonStyle.Primary))awaitmatcher.finish('now time:'+time_now+string_select+select+button)else:# 发送一个文本消息awaitmatcher.finish(MessageSegment.text(msg))以下是一个 Discord 斜杠命令的插件示例：importasynciofromtypingimportOptionalfromnonebot.adapters.discord.apiimport(IntegerOption,NumberOption,StringOption,SubCommandOption,User,UserOption,)fromnonebot.adapters.discord.commandsimport(CommandOption,on_slash_command,)matcher=on_slash_command(name="permission",description="权限管理",options=[SubCommandOption(name="add",description="添加",options=[StringOption(name="plugin",description="插件名",required=True,),IntegerOption(name="priority",description="优先级",required=False,),],),SubCommandOption(name="remove",description="移除",options=[StringOption(name="plugin",description="插件名",required=True),NumberOption(name="time",description="时长",required=False),],),SubCommandOption(name="ban",description="禁用",options=[UserOption(name="user",description="用户",required=False),],),],)@matcher.handle_sub_command("add")asyncdefhandle_user_add(plugin:CommandOption[str],priority:CommandOption[Optional[int]]):awaitmatcher.send_deferred_response()awaitasyncio.sleep(2)awaitmatcher.edit_response(f"你添加了插件{plugin}，优先级{priority}")awaitasyncio.sleep(2)fm=awaitmatcher.send_followup_msg(f"你添加了插件{plugin}，优先级{priority}(新消息)")awaitasyncio.sleep(2)awaitmatcher.edit_followup_msg(fm.id,f"你添加了插件{plugin}，优先级{priority}(新消息修改后)")@matcher.handle_sub_command("remove")asyncdefhandle_user_remove(plugin:CommandOption[str],time:CommandOption[Optional[float]]):awaitmatcher.send(f"你移除了插件{plugin}，时长{time}")@matcher.handle_sub_command("ban")asyncdefhandle_admin_ban(user:CommandOption[User]):awaitmatcher.finish(f"你禁用了用户{user.username}")