如何查看特定用户在语音频道上花费的时间?[Discord.py]

Posted

技术标签:

【中文标题】如何查看特定用户在语音频道上花费的时间?[Discord.py]【英文标题】:How to check time spent on voice channel of a particular user?[Discord.py] 【发布时间】:2022-01-15 04:33:03 【问题描述】:

我正在使用此代码检查在特定用户的语音频道上花费的时间

    async def on_voice_state_update(self, member, before, after):
        if member.bot:
            return
        with open('voice_data.json', 'r') as file: 
            voice_data = json.load(file)
        new_user = str(member.id)
        guild_id = str(member.guild.id)
        if new_user not in voice_data[guild_id]:
            voice_data[guild_id][new_user] = 
                "total_time" : 0,
                "join_time" : None 
        userdata = voice_data[guild_id][new_user]
       
        if(before.channel == None):
            join_time = round(time.time())
            userdata["join_time"] = join_time
        
        elif(str(after.channel.guild.id) != guild_id):
            leave_time = time.time()
            passed_time = leave_time - userdata["join_time"]
            userdata["total_time"] += passed_time
            userdata["join_time"] = None
        with open('voice_data.json', 'w') as update_user_data:
            json.dump(voice_data, update_user_data, indent=4)

但由于某种原因,我收到此属性错误,它在 after.channel 中没有返回任何内容

Ignoring exception in on_voice_state_update
Traceback (most recent call last):
  File "C:\Users\hires\AppData\Roaming\Python\Python39\site-packages\discord\client.py", line 343, in _run_event
    await coro(*args, **kwargs)
  File "d:\Freelance Giveaway Bot\Commands\voice.py", line 28, in on_voice_state_update
    elif(str(after.channel.guild.id) != guild_id):
AttributeError: 'NoneType' object has no attribute 'guild'

    "884811895884894218": 
        "555463650358329354": 
            "total_time": 0,
            "join_time": 1639144293
        
    

这里是voice_data.json的摘录

【问题讨论】:

当用户断开频道时会发生这种情况吗?如果是这样,那么after.channel 将是None。您可能需要执行类似于 if(before.channel == None)... 的操作,但改用 after.channel 【参考方案1】:

如果用户离开语音频道,after.channel 可以是None。因此,您应该编写以下内容:

elif after.channel is not None and str(after.channel.guild.id) != guild_id:

代替

elif(str(after.channel.guild.id) != guild_id):

检查after.channel 是否不是None

【讨论】:

它没有显示任何错误,但它仍然什么也不做 我只是发现当我加入任何其他语音频道而不是断开连接时,它会更改 total_time 并将 voice_data.json 中的 join_time 更改为 null

以上是关于如何查看特定用户在语音频道上花费的时间?[Discord.py]的主要内容,如果未能解决你的问题,请参考以下文章

Discord.js 尝试在用户加入语音频道时发送消息

Discord bot:如何在语音频道中播放 mp3 文件

如何检测用户何时加入语音频道?

如何确定用户是不是加入/切换/离开了语音频道?

(discord.py) 获取特定语音频道中所有成员的列表

如何检查具有特定角色的成员是不是存在于 discord.js 的特定语音通道中