discord.py如何设置默认命令?需合并presencas与带参presencascanal命令
实现方案
你可以通过给presencas命令设置可选参数的方式实现需求,无需保留两个独立命令,逻辑判断参数是否存在即可分别触发两种模式,同时可设置命令别名兼容原来的presencascanal触发习惯。
核心改动点
- 给命令函数新增可选参数
canal,设置默认值为None - 函数内判断参数是否为空,分别走全服务器/指定频道的逻辑
- 给
presencas命令设置别名presencascanal,兼容原有使用习惯
整合后完整代码
import typing import datetime import time import csv import discord from discord.ext import commands # 整合后的单命令实现 @bot.command(name='presencas', aliases=['presencascanal']) @commands.has_role(admin_id) async def presencas(ctx, canal: typing.Optional[discord.TextChannel] = None): current_date = str(datetime.now().date()) current_time = time.strftime(r"%H:%M") + 'H' # 判断触发模式 if canal is None: # 无参数:全服务器模式 send_msg = f'Presenças no servidor no dia: {current_date} às {current_time}' file_name = f'presencas_{current_date}.csv' member_list = ctx.guild.members else: # 带参数:指定频道模式 send_msg = f'Presenças no canal {canal.name} no dia {current_date} às {current_time}' file_name = f'presencas_canal_{canal.name}_{current_date}.csv' member_list = canal.members # 通用输出逻辑 await ctx.send(send_msg) with open(file_name, 'w', newline='', encoding='utf-8') as file: writer = csv.writer(file, delimiter='"', quoting=csv.QUOTE_NONE) writer.writerow(['Nome, tag, timestamp']) for user in member_list: if user.status != discord.Status.offline: row_content = f'{user.name}, #{user.discriminator}, {current_date} {current_time}' writer.writerow([row_content]) await ctx.send(file=discord.File(file_name))
使用说明
- 无参数触发全服务器统计:
presencas - 带参数触发指定频道统计:
presencas 频道ID/频道名/@频道 - 兼容原有触发方式:
presencascanal 频道ID仍然可以正常使用
注意:使用成员统计功能需要你在Discord开发者后台开启服务器成员意图(Server Members Intent)和在线状态意图(Presence Intent),同时代码中初始化bot时要声明对应意图:
intents = discord.Intents.default() intents.members = True intents.presences = True bot = commands.Bot(command_prefix='你的命令前缀', intents=intents)
内容的提问来源于stack exchange,提问作者Bernardo Pereira
相关产品推荐
相关产品推荐

