From 945a8b850ade62258978d87e76fd25d2a80b627d Mon Sep 17 00:00:00 2001 From: Dustin Pianalto Date: Sun, 15 Dec 2019 15:06:15 -0900 Subject: [PATCH] Add commands to return info on a user and process snowflakes --- geeksbot/exts/inspect.py | 65 +++++++++++++++++++++++++++++++++++++++ geeksbot/imports/utils.py | 16 ++++++++++ 2 files changed, 81 insertions(+) create mode 100644 geeksbot/exts/inspect.py diff --git a/geeksbot/exts/inspect.py b/geeksbot/exts/inspect.py new file mode 100644 index 0000000..d2e41fe --- /dev/null +++ b/geeksbot/exts/inspect.py @@ -0,0 +1,65 @@ +import discord +from discord.ext import commands +from datetime import datetime, timedelta +from geeksbot.imports.utils import process_snowflake + + +class Inspect(commands.Cog): + def __init__(self, bot): + self.bot = bot + + @commands.command(aliases=['u']) + async def user(self, ctx, member: discord.Member): + em = discord.Embed(style='rich', + title=f'{member.name}#{member.discriminator} ({member.display_name})', + description=f'({member.id})', + color=self.bot.embed_color) + em.set_thumbnail(url=f'{member.avatar_url}') + em.add_field(name=f'Highest Role:', + value=f'{member.top_role.mention}', + inline=True) + em.add_field(name=f'Bot:', + value=f'{member.bot}', + inline=True) + em.add_field(name=f'Joined Guild:', + value=f'{self.create_date_string(member.joined_at, ctx.message.created_at)}', + inline=False) + em.add_field(name=f'Joined Discord:', + value=f'{self.create_date_string(member.created_at, ctx.message.created_at)}', + inline=False) + em.add_field(name=f'Current Status:', + value=f'{member.status}', + inline=True) + em.add_field(name=f"Currently{' ' + member.activity.type.name.title() if member.activity else ''}:", + value=f"{member.activity.name if member.activity else 'Not doing anything important.'}", + inline=True) + count = 0 + async for message in ctx.channel.history(after=(ctx.message.created_at - timedelta(hours=1))): + if message.author == member: + count += 1 + em.add_field(name=f'Activity:', + value=f'{member.display_name} has sent {count} ' + f'{"message" if count == 1 else "messages"} in the last hour to this channel.', + inline=False) + await ctx.send(embed=em) + + @commands.command(aliases=['s']) + async def snowflake(self, ctx, snowflake: int): + try: + snowflake = int(snowflake) + except ValueError: + await ctx.send('That is not a valid snowflake') + if len(bin(snowflake))-2 < 63 or len(bin(snowflake))-2 > 64: + await ctx.send('That is not a valid snowflake') + creation_time, worker, process, counter = process_snowflake(snowflake) + em = discord.Embed(title=str(snowflake), + description=f'Created At: {creation_time.strftime("%c")}\n' + f'Worker: {worker}\n' + f'Process: {process}\n' + f'Increment Counter: {counter}', + color=self.bot.embed_color) + await ctx.send(em) + + +def setup(bot): + bot.add_cog(Inspect(bot)) diff --git a/geeksbot/imports/utils.py b/geeksbot/imports/utils.py index 08c6e75..de63cb5 100644 --- a/geeksbot/imports/utils.py +++ b/geeksbot/imports/utils.py @@ -1,12 +1,28 @@ import discord import asyncio import typing +from datetime import datetime async def get_guild_config(bot, guild_id): guild_config = bot.cache.get() +def process_snowflake(snowflake: int) -> typing.Tuple[datetime, int, int, int]: + DISCORD_EPOCH = 1420070400000 + TIME_BITS_LOC = 22 + WORKER_ID_LOC = 17 + WORKER_ID_MASK = 0x3E0000 + PROCESS_ID_LOC = 12 + PROCESS_ID_MASK = 0x1F000 + INCREMENT_MASK = 0xFFF + creation_time = datetime.fromtimestamp((snowflake >> TIME_BITS_LOC) + DISCORD_EPOCH) + worker_id = (snowflake >> WORKER_ID_LOC) & WORKER_ID_MASK + process_id = (snowflake >> PROCESS_ID_LOC) & PROCESS_ID_MASK + counter = snowflake & INCREMENT_MASK + return creation_time, worker_id, process_id, counter + + # noinspection PyDefaultArgument def to_list_of_str(items, out: list = list(), level=1, recurse=0): # noinspection PyShadowingNames