微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Discord Python Time Bot Bug

如何解决Discord Python Time Bot Bug

我最近编写了一个 python 机器人来跟踪用户在不和谐的语音频道中花费的时间。机器人乍一看似乎在工作,但随着时间的推移,跟踪的时间变得越来越不准确。例如,有一次我的一个朋友跟踪了 25 个小时,当时机器人只运行了大约 20 个小时。任何帮助表示赞赏。


import asyncio
import discord
import datetime
from discord.utils import get
from discord.ext import commands
from secrets import *


leaderboard = dict()
userjoindict = dict()
userjoineddict = dict()
userdurationdict = dict()
intents = discord.Intents.all()

client = commands.Bot(command_prefix='/',intents=intents)


@client.event
async def on_ready():
    print('ready')


@client.event
async def on_voice_state_update(member,before,after):
    for guild in client.guilds:
        if guild.name == GUILD:
            break

    channelid = [channel.id for channel in guild.channels]

    if before.channel and after.channel:
        if (before.channel.id not in channelid or before.channel.id == guild.afk_channel.id) and (
                after.channel.id in channelid and after.channel.id != guild.afk_channel.id):
            await start_tracking(member)
        if before.channel.id in channelid and (after.channel.id not in channelid or after.channel.id == guild.afk_channel.id):
            await stop_tracking(member)

    if not before.channel and (after.channel and after.channel.id != guild.afk_channel.id):
        await start_tracking(member)

    if before.channel and not after.channel:
        if before.channel.id != guild.afk_channel.id:
            await stop_tracking(member)


@client.event
async def start_tracking(member: discord.Member):
    print('startedtracking')
    userjoineddict.update({member: '1'})
    userjoindict.update({member: datetime.datetime.Now().time()})
    print(type(userjoindict.get(member)))

@client.command()
async def time(cxt,*,member: discord.Member = None):
    if member is None:
        author = cxt.message.author
    else:
        author = member

    if userdurationdict.get(author) is None and userjoineddict.get(author) is None:
        time = 0
        await cxt.send('no time amk')

    elif userdurationdict.get(author) is not None and userjoineddict.get(author) == '0':
        time = userdurationdict.get(author)
        await cxt.send('{} has spent {} in a channel on this discord'.format(author.name,str(time)))

    elif userdurationdict.get(author) is not None and userjoineddict.get(author) == '1':
        t1 = datetime.datetime.Now().time() - userjoindict.get(author)
        time = userdurationdict.get(author) + t1
        await cxt.send('{} has {} in a channel on this discord'.format(author.name,str(time)))

    elif userdurationdict.get(author) is None and userjoineddict.get(author) == '1':
        time = datetime.datetime.Now().time() - userjoindict.get(author)
        await cxt.send('{} has spent {} in a channel on this discord'.format(author.name,str(time)))


@client.command()
async def place(cxt,place: discord.Member = None):
    for guild in client.guilds:
        if guild == GUILD:
            break
    for member in guild.members:
        if userdurationdict.get(member) is None and userjoineddict.get(member) is None:
            leaderboard.update({member.name: 0})
        elif userdurationdict.get(member) is not None and userjoineddict.get(member) == '0':
            time = userdurationdict.get(member)
            leaderboard.update({member.name: time.total_seconds()})
        elif userdurationdict.get(member) is not None and userjoineddict.get(member) == '1':
            t1 = datetime.datetime.Now().time() - userjoindict.get(member)
            time = userdurationdict.get(member) + t1
            leaderboard.update({member.name: time.total_seconds()})
        elif userdurationdict.get(member) is None and userjoineddict.get(member) == '1':
            time = datetime.datetime.Now().time() - userjoindict.get(member)
            leaderboard.update({member.name: time.total_seconds()})
    sorted_lb = sorted(leaderboard.items(),key=lambda x: x[1],reverse=True)
    if place is None:
        search = cxt.message.author.name
    else:
        search = str(place.name)
    i = 0
    for x in sorted_lb:
        i += 1
        if x[0] == search:
            t = int(x[1])
            time = str(datetime.timedelta(seconds=t))
            await cxt.send('Your searched member is place {} with a time of {}'.format(i,time))
            break
    sorted_lb.clear()
    leaderboard.clear()


@client.command()
async def top(cxt,num: int = None):
    if num is None:
        await cxt.send('Please enter a number. For example "top 10" to se the top 10')
        return
    for guild in client.guilds:
        if guild == GUILD:
            break
    for member in guild.members:
        if userdurationdict.get(member) is None and userjoineddict.get(member) is None:
            leaderboard.update({member.name: 0})
        elif userdurationdict.get(member) is not None and userjoineddict.get(member) == '0':
            time = userdurationdict.get(member)
            leaderboard.update({member.name: time.total_seconds()})
        elif userdurationdict.get(member) is not None and userjoineddict.get(member) == '1':
            t1 = datetime.datetime.Now().time() - userjoindict.get(member)
            time = userdurationdict.get(member) + t1
            leaderboard.update({member.name: time.total_seconds()})
        elif userdurationdict.get(member) is None and userjoineddict.get(member) == '1':
            time = datetime.datetime.Now().time() - userjoindict.get(member)
            leaderboard.update({member.name: time.total_seconds()})
    sorted_lb = sorted(leaderboard.items(),reverse=True)
    i = 0
    for x in sorted_lb:
        i += 1
        time = datetime.timedelta(seconds=int(x[1]))
        await cxt.send('{}. {} with a time of {}'.format(i,x[0],time))
        if i == num:
            return





@client.event
async def checking():
    while True:
        if datetime.datetime.Now().minute == 30:
            with open('save.txt','w') as f:
                f.write(str(userdurationdict))
                f.close()
        await asyncio.sleep(2)


@client.event
async def stop_tracking(member: discord.Member):
    userjoineddict.update({member: '0'})
    if datetime.datetime.Now().time() < userjoindict.get(member):
        pass
    duration = datetime.datetime.Now().time() - userjoindict.get(member)
    if member in userdurationdict:
        newduration = userdurationdict.get(member) + duration
        userdurationdict.update({member: newduration})
    elif member not in userdurationdict:
        userdurationdict.update({member: duration})
    print('stoppedtracking')
    print(userdurationdict.get(member))


client.run(TOKEN)
client.loop.create_task(checking())

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?