Вычислить разницу во времени между двумя идентификаторами разногласий / снежинками

#python #discord #discord.py

Вопрос:

Команда timedif принимает два идентификатора сообщений и вычисляет разницу во времени, когда они были отправлены, с точностью до 2 знаков после запятой.

Это то, что я сделал:

 @bot.command(name='timedif', help='', aliases=['snowflake', 'timediff'])
async def timedif(ctx, id1, id2):
    try:
        id1 = int(id1)
        id2 = int(id2)
        
    except:
        await ctx.reply("Check your message ID's! They are incorrect!")
    
    msg1 = await ctx.fetch_message(id1)
    msg2 = await ctx.fetch_message(id2)
        
    time1 = msg1.created_at
    time2 = msg2.created_at
    
    ts_diff = time2 - time1
    secs = abs(ts_diff.total_seconds())
    days,secs=divmod(secs,secs_per_day:=60*60*24)
    hrs,secs=divmod(secs,secs_per_hr:=60*60)
    mins,secs=divmod(secs,secs_per_min:=60)
    secs=round(secs, 2)
    answer='{} secs'.format(secs)
    
    if secs > 60:
        answer='{} mins and {} secs'.format(int(mins),secs)
        if mins > 60:
            answer='{} hrs, {} mins and {} secs'.format(int(hrs),int(mins),secs)
            if hrs > 24:
                answer='{} days, {} hrs, {} mins and {} secs'.format(int(days),int(hrs),int(mins),secs)
    
    embed = discord.Embed(title="**Time Difference**", description=f"""IDs: {id1}, {id2}
Time difference between the 2 IDs: 
{answer}""")
    await ctx.reply(embed=embed)
 

Я протестировал бота, но столкнулся с проблемой:
Для этого кода он может извлекать сообщения только из того же канала, что и ‘ctx’. Но если я беру один из идентификаторов из другого канала (т. Е. канала DM), бот не может получить к нему доступ. Существует ли алгоритм / функция, которая позволяет мне вычислять разницу во времени для любых 2 идентификаторов? Я думаю, что это возможно, так как в последнее время это делают многие боты.

Чтобы уточнить: для сообщений от ctx.channel , он работает нормально и способен вычислять разницу во времени. Единственная проблема заключается в том, что он не может извлекать сообщения из других каналов.

Комментарии:

1. Вы не можете получать идентификаторы от DM. Кроме того, убедитесь, что у вас включены intents.

Ответ №1:

Вычисление разницы во времени между любыми двумя идентификаторами Discord не требует никаких запросов API. Поскольку время создания каждого объекта snowflake кодируется в пределах этих 19-21 цифр. При чтении в двоичном формате бит 22 и выше является отметкой времени.

Для недавних discord.py версии, для вас уже есть вспомогательный метод!

 time1 = discord.utils.snowflake_time(int(id1))
time2 = discord.utils.snowflake_time(int(id2))
ts_diff = time2 - time1
secs = abs(ts_diff.total_seconds())
 

Если это еще не существует для вашей версии, это просто реализовать snowflake_time() :

 import datetime

def snowflake_time(id):
    return datetime.datetime.utcfromtimestamp(((id >> 22)   1420070400000) / 1000)
 

Этот метод работает для любого идентификатора Discord (идентификатор сообщения, идентификатор канала, идентификатор гильдии, идентификатор категории, идентификатор журнала аудита и т. Д.)

Структура снежинки Discord: https://discord.com/developers/docs/reference#snowflakes .

Комментарии:

1. Привет! Я попробовал, и это не сработало: discord.ext.commands.errors. CommandInvokeError: команда вызвала исключение: не найдено: 404 не найдено (код ошибки: 10008): неизвестное сообщение

2. @JMuzhen Привет. Просто используйте первый фрагмент кода в моем ответе, он не включает в себя никаких запросов Discord.

3. Поэтому вам нужно будет избавиться от строк msg1 = await ctx.fetch_message(id1) и. msg2 = await ctx.fetch_message(id2)

4. Хорошо, спасибо! Я сделал это и жду результата.

5. @JMuzhen Нет проблем, дайте мне знать, как это происходит 🙂 Также в качестве примечания, для вашего исключения, не забудьте «return» в вашем блоке except, если идентификаторы не являются целыми числами.