如何使用discord.Member.mobile_status?兼与is_on_mobile的区别及角色分配实现
解决方案:移动端用户加入语音频道触发角色分配与消息通知
一、discord.Member.mobile_status 与 discord.Member.is_on_mobile() 的区别
is_on_mobile():是一个实例方法,返回布尔值(True/False),直接判断该成员当前是否通过移动端在线。用法为member.is_on_mobile()。mobile_status:是一个属性,返回discord.Status枚举值(如online、idle、offline等),仅表示成员在移动端的登录状态,而非是否正在使用移动端。若成员未在移动端登录,该值为offline。
二、功能实现代码修正
你的示例代码存在类属性调用错误、未监听语音事件、判断逻辑偏差等问题,以下是完整可运行的实现代码:
import discord from discord.ext import commands # 启用必要的意图 intents = discord.Intents.default() intents.members = True intents.voice_states = True bot = commands.Bot(command_prefix="!", intents=intents) # 替换为你服务器的实际ID GUILD_ID = 1234567890 TARGET_ROLE_ID = 9876543210 # 要分配的角色ID TARGET_TEXT_CHANNEL_ID = 1357924680 # 发送通知的文本频道ID @bot.event async def on_voice_state_update(member, before, after): # 判断用户是否刚加入语音频道(之前无频道,现在有频道) if before.channel is None and after.channel is not None: # 检查用户是否使用移动端 if member.is_on_mobile(): guild = bot.get_guild(GUILD_ID) target_role = guild.get_role(TARGET_ROLE_ID) target_channel = guild.get_channel(TARGET_TEXT_CHANNEL_ID) if target_role: await member.add_roles(target_role) if target_channel: await target_channel.send(f"{member.name} 用移动端加入语音频道,已为其分配指定角色!") bot.run("你的机器人令牌")
代码说明
- 意图配置:必须启用
members和voice_states意图,否则无法监听语音状态变化和获取成员信息。 - 事件监听:通过
on_voice_state_update事件捕捉用户语音频道的加入动作。 - 移动端验证:用
member.is_on_mobile()精准判断用户当前的登录设备类型。 - 角色与消息操作:通过ID获取目标角色和文本频道,执行角色分配和通知发送。
三、注意事项
- 确保机器人拥有管理角色和发送消息的服务器权限。
- 代码中所有ID需替换为你服务器的实际数值。
- 机器人令牌需妥善保管,禁止泄露。
内容的提问来源于stack exchange,提问作者kch94
相关产品推荐
相关产品推荐

