diff --git a/cogs/events.py b/cogs/events.py index 02a4380..6717a4d 100644 --- a/cogs/events.py +++ b/cogs/events.py @@ -96,10 +96,24 @@ class Events(commands.Cog): else: # Respond to shronk bot if message.author.id == 1063875884274163732 and message.channel.can_send(): + if "pissylicious 💦💦" in message.content: + from dns import asyncresolver + import httpx + response = await asyncresolver.resolve("shronkservz.tk", "A") + ip_info_response = await httpx.AsyncClient().get(f"http://ip-api.com/json/{response[0].address}") + if ip_info_response.status_code == 200: + return await message.reply( + f"Scattylicious\N{pile of poo}\N{pile of poo}\n" + "IP: {0[query]}\n" + "ISP: {0[isp]}\n" + "Latitude: {0[lat]}\n" + "Longitude: {0[lon]}\n".format( + ip_info_response.json(), + ) + ) RESPONSES = { "Congratulations!!": "Shut up SHRoNK Bot, nobody loves you.", - "You run on a Raspberry Pi... I run on a real server": "At least my server gets action, " - "while yours just sits and collects dust!" + "You run on a Raspberry Pi... I run on a real server": "At least my server gets action, while yours just sits and collects dust!" } for k, v in RESPONSES.items(): if k in message.content: diff --git a/cogs/uptime.py b/cogs/uptime.py index 8da0a8b..87a08f6 100644 --- a/cogs/uptime.py +++ b/cogs/uptime.py @@ -1,6 +1,7 @@ import asyncio import datetime import json +import random import hashlib import time from datetime import timedelta @@ -333,6 +334,8 @@ class UptimeCompetition(commands.Cog): targets = [query_target] if query_target == "ALL": targets = [t["id"] for t in self.cached_targets] + + total_query_time = rows = 0 embeds = [] for _target in targets: _target = self.get_target(_target, _target) @@ -343,11 +346,12 @@ class UptimeCompetition(commands.Cog): start = time.time() entries = await query.all() end = time.time() + total_query_time += end - start if not entries: embeds.append(discord.Embed(description=f"No uptime entries found for {_target}.")) else: embeds.append(await asyncio.to_thread(generate_embed, _target, entries)) - embeds[-1].set_footer(text=f"Query took {end - start:.2f}s") + embeds[-1].set_footer(text=f"Query took {end - start:.2f}s | {len(entries):,} rows") if org_target == "ALL": new_embed = discord.Embed( @@ -357,8 +361,118 @@ class UptimeCompetition(commands.Cog): ) for embed_ in embeds: new_embed.description += f"{embed_.description}\n" + if total_query_time > 60: + minutes, seconds = divmod(total_query_time, 60) + new_embed.set_footer(text=f"Total query time: {minutes:.0f}m {seconds:.2f}s") + else: + new_embed.set_footer(text=f"Total query time: {total_query_time:.2f}s") + new_embed.set_footer( + text=f"{new_embed.footer.text} | {len(entries):,} rows" + ) embeds = [new_embed] await ctx.respond(embeds=embeds) + + @uptime.command(name="speedtest") + @commands.is_owner() + async def stats_speedtest(self, ctx: discord.ApplicationContext): + """Tests the database's speed""" + await ctx.defer() + + tests = { + "all": None, + "lookback_7_day": None, + "lookback_30_day": None, + "lookback_90_day": None, + "lookback_365_day": None, + "first": None, + "random": None, + } + + async def run_test(name): + match name: + case "all": + start = time.time() + e = await UptimeEntry.objects.all() + end = time.time() + return (end - start) * 1000, len(e) + case "lookback_7_day": + start = time.time() + e = await UptimeEntry.objects.filter( + UptimeEntry.columns.timestamp >= (discord.utils.utcnow() - timedelta(days=7)).timestamp() + ).all() + end = time.time() + return (end - start) * 1000, len(e) + case "lookback_30_day": + start = time.time() + e = await UptimeEntry.objects.filter( + UptimeEntry.columns.timestamp >= (discord.utils.utcnow() - timedelta(days=30)).timestamp() + ).all() + end = time.time() + return (end - start) * 1000, len(e) + case "lookback_90_day": + start = time.time() + e = await UptimeEntry.objects.filter( + UptimeEntry.columns.timestamp >= (discord.utils.utcnow() - timedelta(days=90)).timestamp() + ).all() + end = time.time() + return (end - start) * 1000, len(e) + case "lookback_365_day": + start = time.time() + e = await UptimeEntry.objects.filter( + UptimeEntry.columns.timestamp >= (discord.utils.utcnow() - timedelta(days=365)).timestamp() + ).all() + end = time.time() + return (end - start) * 1000, len(e) + case "first": + start = time.time() + e = await UptimeEntry.objects.first() + end = time.time() + return (end - start) * 1000, 1 + case "random": + start = time.time() + e = await UptimeEntry.objects.offset( + random.randint(0, 1000) + ).first() + end = time.time() + return (end - start) * 1000, 1 + case _: + raise ValueError(f"Unknown test name: {name}") + + def gen_embed(_copy): + embed = discord.Embed( + title='\N{HOURGLASS} Speedtest Results', + colour=discord.Colour.red() + ) + for _name in _copy.keys(): + if _copy[_name] is None: + embed.add_field(name=_name, value='Waiting...') + else: + _time, _row = _copy[_name] + _time /= 1000 + rows_per_second = _row / _time + + if _time >= 60: + minutes, seconds = divmod(_time, 60) + ts = f'{minutes:.0f}m {seconds:.2f}s' + else: + ts = f'{_time:.2f}s' + + embed.add_field( + name=_name, + value=f'{ts}, {_row:,} rows ({rows_per_second:.2f} rows/s)' + ) + return embed + + embed = gen_embed(tests) + ctx = await ctx.respond(embed=embed) + + for test_key in tests.keys(): + tests[test_key] = await run_test(test_key) + embed = gen_embed(tests) + await ctx.edit(embed=embed) + + embed.colour = discord.Colour.green() + await ctx.edit(embed=embed) @uptime.command(name="view-next-run") async def view_next_run(self, ctx: discord.ApplicationContext):