From c56b2dbc32a191774533c5c36f56075f3910dbd3 Mon Sep 17 00:00:00 2001
From: WhatDidYouExpect <89535984+WhatDidYouExpect@users.noreply.github.com>
Date: Thu, 17 Jul 2025 16:03:47 +0200
Subject: [PATCH 1/9] Update README.md
---
README.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index dc1f094..3939b86 100644
--- a/README.md
+++ b/README.md
@@ -5,4 +5,5 @@ Special thanks to [Charlie's Computers](https://github.com/PowerPCFan) for being
[Goober Central](https://github.com/whatdidyouexpect/goober-central)
-
+[Another mirror](https://forgejo.expect.ovh/WhatDidYouExpect/goober)
+no promises that it'll be stable
From eb5109424bfe090c729457614bb413b6223e1849 Mon Sep 17 00:00:00 2001
From: WhatDidYouExpect <89535984+WhatDidYouExpect@users.noreply.github.com>
Date: Thu, 17 Jul 2025 18:50:39 +0200
Subject: [PATCH 2/9] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 3939b86..c1e9957 100644
--- a/README.md
+++ b/README.md
@@ -5,5 +5,5 @@ Special thanks to [Charlie's Computers](https://github.com/PowerPCFan) for being
[Goober Central](https://github.com/whatdidyouexpect/goober-central)
-[Another mirror](https://forgejo.expect.ovh/WhatDidYouExpect/goober)
+[Another mirror](https://forgejo.expect.ovh/gooberinc/goober)
no promises that it'll be stable
From 8021d17d2767ab62ceca7f360e2e5c43836dc9f8 Mon Sep 17 00:00:00 2001
From: WhatDidYouExpect <89535984+WhatDidYouExpect@users.noreply.github.com>
Date: Tue, 22 Jul 2025 19:34:46 +0200
Subject: [PATCH 3/9] lobotmized goober and cleared out junk
---
assets/cogs/fuckup.py | 98 ----
assets/cogs/lastfm.py.disabled | 84 ---
assets/cogs/songchanger.py | 33 --
assets/cogs/webscraper.py.disabled | 113 ----
assets/cogs/webserver.py | 880 -----------------------------
assets/fonts/TNR.ttf | Bin 347988 -> 0 bytes
bot.py => main.py | 140 +----
modules/globalvars.py | 2 +-
modules/image.py | 64 ---
modules/markovmemory.py | 14 +-
modules/minigames.py | 71 ---
modules/prestartchecks.py | 3 +-
modules/unhandledexception.py | 4 -
modules/version.py | 1 -
14 files changed, 19 insertions(+), 1488 deletions(-)
delete mode 100644 assets/cogs/fuckup.py
delete mode 100644 assets/cogs/lastfm.py.disabled
delete mode 100644 assets/cogs/songchanger.py
delete mode 100644 assets/cogs/webscraper.py.disabled
delete mode 100644 assets/cogs/webserver.py
delete mode 100644 assets/fonts/TNR.ttf
rename bot.py => main.py (78%)
delete mode 100644 modules/minigames.py
diff --git a/assets/cogs/fuckup.py b/assets/cogs/fuckup.py
deleted file mode 100644
index 1dbc4d0..0000000
--- a/assets/cogs/fuckup.py
+++ /dev/null
@@ -1,98 +0,0 @@
-import discord
-from discord.ext import commands
-from modules.image import *
-from modules.volta.main import _
-from PIL import Image, ImageEnhance, ImageFilter, ImageOps, ImageChops, ImageColor
-import os, random, shutil, tempfile
-
-async def deepfryimage(path):
- with Image.open(path).convert("RGB") as im:
- # make it burn
- for _ in range(3):
- im = im.resize((int(im.width * 0.7), int(im.height * 0.7)))
- im = im.resize((int(im.width * 1.5), int(im.height * 1.5)))
- im = ImageEnhance.Contrast(im).enhance(random.uniform(5, 10))
- im = ImageEnhance.Sharpness(im).enhance(random.uniform(10, 50))
- im = ImageEnhance.Brightness(im).enhance(random.uniform(1.5, 3))
- r, g, b = im.split()
- r = r.point(lambda i: min(255, i * random.uniform(1.2, 2.0)))
- g = g.point(lambda i: min(255, i * random.uniform(0.5, 1.5)))
- b = b.point(lambda i: min(255, i * random.uniform(0.5, 2.0)))
- channels = [r, g, b]
- random.shuffle(channels)
- im = Image.merge("RGB", tuple(channels))
- overlay_color = tuple(random.randint(0, 255) for _ in range(3))
- overlay = Image.new("RGB", im.size, overlay_color)
- im = ImageChops.add(im, overlay, scale=2.0, offset=random.randint(-64, 64))
-
- im = im.filter(ImageFilter.EDGE_ENHANCE_MORE)
- im = im.filter(ImageFilter.GaussianBlur(radius=random.uniform(0.5, 2)))
- for _ in range(3):
- tmp_path = tempfile.mktemp(suffix=".jpg")
- im.save(tmp_path, format="JPEG", quality=random.randint(5, 15))
- im = Image.open(tmp_path)
- if random.random() < 0.3:
- im = ImageOps.posterize(im, bits=random.choice([2, 3, 4]))
- if random.random() < 0.2:
- im = ImageOps.invert(im)
- out_path = tempfile.mktemp(suffix=".jpg")
- im.save(out_path, format="JPEG", quality=5)
- return out_path
-
-
-class whami(commands.Cog):
- def __init__(self, bot):
- self.bot = bot
-
-
- @commands.command()
- async def fuckup(self, ctx):
- assets_folder = "assets/images"
- temp_input = None
-
- def get_random_asset_image():
- files = [f for f in os.listdir(assets_folder) if f.lower().endswith(('.png', '.jpg', '.jpeg', '.webp'))]
- if not files:
- return None
- return os.path.join(assets_folder, random.choice(files))
-
- if ctx.message.attachments:
- attachment = ctx.message.attachments[0]
- if attachment.content_type and attachment.content_type.startswith("image/"):
- ext = os.path.splitext(attachment.filename)[1]
- temp_input = f"tempy{ext}"
- await attachment.save(temp_input)
- input_path = temp_input
- else:
- fallback_image = get_random_asset_image()
- if fallback_image is None:
- await ctx.reply(_('no_image_available'))
- return
- temp_input = tempfile.mktemp(suffix=os.path.splitext(fallback_image)[1])
- shutil.copy(fallback_image, temp_input)
- input_path = temp_input
- else:
- fallback_image = get_random_asset_image()
- if fallback_image is None:
- await ctx.reply(_('no_image_available'))
- return
- temp_input = tempfile.mktemp(suffix=os.path.splitext(fallback_image)[1])
- shutil.copy(fallback_image, temp_input)
- input_path = temp_input
-
- output_path = await gen_meme(input_path)
-
- if output_path is None or not os.path.isfile(output_path):
- if temp_input and os.path.exists(temp_input):
- os.remove(temp_input)
- await ctx.reply(_('failed_generate_image'))
- return
-
- deepfried_path = await deepfryimage(output_path)
- await ctx.send(file=discord.File(deepfried_path))
-
- if temp_input and os.path.exists(temp_input):
- os.remove(temp_input)
-
-async def setup(bot):
- await bot.add_cog(whami(bot))
diff --git a/assets/cogs/lastfm.py.disabled b/assets/cogs/lastfm.py.disabled
deleted file mode 100644
index 822305a..0000000
--- a/assets/cogs/lastfm.py.disabled
+++ /dev/null
@@ -1,84 +0,0 @@
-import os
-import discord
-from discord.ext import commands, tasks
-import aiohttp
-from dotenv import load_dotenv
-
-load_dotenv()
-
-#stole most of this code from my old expect bot so dont be suprised if its poorly made
-
-LASTFM_API_KEY = os.getenv("LASTFM_API_KEY")
-LASTFM_USERNAME = os.getenv("LASTFM_USERNAME")
-
-class LastFmCog(commands.Cog):
- def __init__(self, bot):
- self.bot = bot
- self.current_track = None
- self.update_presence_task = None
- self.ready = False
- bot.loop.create_task(self.wait_until_ready())
-
- async def wait_until_ready(self):
- await self.bot.wait_until_ready()
- self.ready = True
- self.update_presence.start()
-
- @tasks.loop(seconds=60)
- async def update_presence(self):
- print("Looped!")
- if not self.ready:
- return
- track = await self.fetch_current_track()
- if track and track != self.current_track:
- self.current_track = track
- artist, song = track
- activity_name = f"{artist} - {song}"
- await self.bot.change_presence(activity=discord.Activity(type=discord.ActivityType.listening, name=activity_name))
- print(f"Updated song to {artist} - {song}")
- else:
- print("LastFM gave me the same track! not updating...")
-
- @update_presence.before_loop
- async def before_update_presence(self):
- await self.bot.wait_until_ready()
-
- @commands.command(name="lastfm")
- async def lastfm_command(self, ctx):
- track = await self.fetch_current_track()
- if not track:
- await ctx.send("No track currently playing or could not fetch data")
- return
- self.current_track = track
- artist, song = track
- activity_name = f"{artist} - {song}"
- await self.bot.change_presence(activity=discord.Activity(type=discord.ActivityType.listening, name=activity_name))
- await ctx.send(f"Updated presence to: Listening to {activity_name}")
-
- async def fetch_current_track(self):
- url = (
- f"http://ws.audioscrobbler.com/2.0/?method=user.getrecenttracks"
- f"&user={LASTFM_USERNAME}&api_key={LASTFM_API_KEY}&format=json&limit=1"
- )
- async with aiohttp.ClientSession() as session:
- async with session.get(url) as resp:
- if resp.status != 200:
- return None
- data = await resp.json()
-
- recenttracks = data.get("recenttracks", {}).get("track", [])
- if not recenttracks:
- return None
-
- track = recenttracks[0]
- if '@attr' in track and track['@attr'].get('nowplaying') == 'true':
- artist = track.get('artist', {}).get('#text', 'Unknown Artist')
- song = track.get('name', 'Unknown Song')
- return artist, song
- return None
-
-async def setup(bot):
- if not LASTFM_API_KEY or not LASTFM_USERNAME:
- return
- else:
- await bot.add_cog(LastFmCog(bot))
diff --git a/assets/cogs/songchanger.py b/assets/cogs/songchanger.py
deleted file mode 100644
index 36fde47..0000000
--- a/assets/cogs/songchanger.py
+++ /dev/null
@@ -1,33 +0,0 @@
-import discord
-from discord.ext import commands
-from modules.globalvars import RED, GREEN, RESET, LOCAL_VERSION_FILE
-import os
-
-class songchange(commands.Cog):
- def __init__(self, bot):
- self.bot = bot
-
- def get_local_version():
- if os.path.exists(LOCAL_VERSION_FILE):
- with open(LOCAL_VERSION_FILE, "r") as f:
- return f.read().strip()
- return "0.0.0"
-
- global local_version
- local_version = get_local_version()
-
- @commands.command()
- async def changesong(self, ctx):
- if LOCAL_VERSION_FILE > "0.11.8":
- await ctx.send(f"Goober is too old! you must have version 0.11.8 you have {local_version}")
- return
- await ctx.send("Check the terminal! (this does not persist across restarts)")
- song = input("\nEnter a song:\n")
- try:
- await self.bot.change_presence(activity=discord.Activity(type=discord.ActivityType.listening, name=f"{song}"))
- print(f"{GREEN}Changed song to {song}{RESET}")
- except Exception as e:
- print(f"{RED}An error occurred while changing songs..: {str(e)}{RESET}")
-
-async def setup(bot):
- await bot.add_cog(songchange(bot))
diff --git a/assets/cogs/webscraper.py.disabled b/assets/cogs/webscraper.py.disabled
deleted file mode 100644
index 351e2e8..0000000
--- a/assets/cogs/webscraper.py.disabled
+++ /dev/null
@@ -1,113 +0,0 @@
-import discord
-from discord.ext import commands
-import aiohttp
-from bs4 import BeautifulSoup
-import json
-import asyncio
-from urllib.parse import urljoin
-from modules.globalvars import ownerid
-class WebScraper(commands.Cog):
- def __init__(self, bot):
- self.bot = bot
- self.visited_urls = set()
-
- async def fetch(self, session, url):
- """Fetch the HTML content of a URL."""
- try:
- async with session.get(url, timeout=10) as response:
- return await response.text()
- except Exception as e:
- print(f"Failed to fetch {url}: {e}")
- return None
-
- def extract_sentences(self, text):
- """Extract sentences from text."""
- sentences = text.split('.')
- return [sentence.strip() for sentence in sentences if sentence.strip()]
-
- def save_to_json(self, sentences):
- """Save sentences to memory.json."""
- try:
- try:
- with open("memory.json", "r") as file:
- data = json.load(file)
- except (FileNotFoundError, json.JSONDecodeError):
- data = []
- data.extend(sentences)
- with open("memory.json", "w") as file:
- json.dump(data, file, indent=4)
- except Exception as e:
- print(f"Failed to save to JSON: {e}")
-
- def undo_last_scrape(self):
- """Undo the last scrape by removing the most recent sentences."""
- try:
- with open("memory.json", "r") as file:
- data = json.load(file)
-
- if not data:
- print("No data to undo.")
- return False
-
-
- data = data[:-1]
-
- with open("memory.json", "w") as file:
- json.dump(data, file, indent=4)
-
- return True
- except (FileNotFoundError, json.JSONDecodeError):
- print("No data to undo or failed to load JSON.")
- return False
- except Exception as e:
- print(f"Failed to undo last scrape: {e}")
- return False
-
- async def scrape_links(self, session, url, depth=2):
- print(f"Scraping: {url}")
- self.visited_urls.add(url)
-
- html = await self.fetch(session, url)
- if not html:
- return
-
- soup = BeautifulSoup(html, "html.parser")
-
- for paragraph in soup.find_all('p'):
- sentences = self.extract_sentences(paragraph.get_text())
- self.save_to_json(sentences)
-
-
- @commands.command()
- async def start_scrape(self, ctx, start_url: str):
- """Command to start the scraping process."""
- if ctx.author.id != ownerid:
- await ctx.send("You do not have permission to use this command.")
- return
-
- if not start_url.startswith("http"):
- await ctx.send("Please provide a valid URL.")
- return
-
- await ctx.send(f"Starting scrape from {start_url}... This may take a while!")
-
- async with aiohttp.ClientSession() as session:
- await self.scrape_links(session, start_url)
-
- await ctx.send("Scraping complete! Sentences saved to memory.json.")
-
- @commands.command()
- async def undo_scrape(self, ctx):
- """Command to undo the last scrape."""
- if ctx.author.id != ownerid:
- await ctx.send("You do not have permission to use this command.")
- return
-
- success = self.undo_last_scrape()
- if success:
- await ctx.send("Last scrape undone successfully.")
- else:
- await ctx.send("No data to undo or an error occurred.")
-
-async def setup(bot):
- await bot.add_cog(WebScraper(bot))
diff --git a/assets/cogs/webserver.py b/assets/cogs/webserver.py
deleted file mode 100644
index 110c20d..0000000
--- a/assets/cogs/webserver.py
+++ /dev/null
@@ -1,880 +0,0 @@
-import discord
-from discord.ext import commands, tasks
-import asyncio
-from aiohttp import web
-import psutil
-import os
-import json
-from datetime import datetime
-import time
-import aiohttp
-import re
-from aiohttp import WSMsgType
-from modules.globalvars import VERSION_URL
-import sys
-import subprocess
-
-class GooberWeb(commands.Cog):
- def __init__(self, bot):
- self.bot = bot
- self.app = web.Application()
- self.runner = None
- self.site = None
- self.last_command = "No commands executed yet"
- self.last_command_time = "Never"
- self.start_time = time.time()
- self.websockets = set()
-
- self.app.add_routes([
- web.get('/', self.handle_index),
- web.get('/changesong', self.handle_changesong),
- web.get('/stats', self.handle_stats),
- web.get('/data', self.handle_json_data),
- web.get('/ws', self.handle_websocket),
- web.get('/styles.css', self.handle_css),
- web.get('/settings', self.handle_settings),
- web.post('/update_settings', self.handle_update_settings),
- web.post('/restart_bot', self.handle_restart_bot),
- ])
-
- self.bot.loop.create_task(self.start_web_server())
- self.update_clients.start()
-
- async def restart_bot(self):
- await asyncio.sleep(1)
- python = sys.executable
- os.execl(python, python, *sys.argv)
-
- async def handle_restart_bot(self, request):
- asyncio.create_task(self.restart_bot())
- return web.Response(text="Bot is restarting...")
-
- async def get_blacklisted_users(self):
- blacklisted_ids = os.getenv("BLACKLISTED_USERS", "").split(",")
- blacklisted_users = []
-
- for user_id in blacklisted_ids:
- if not user_id.strip():
- continue
-
- try:
- user = await self.bot.fetch_user(int(user_id))
- blacklisted_users.append({
- "name": f"{user.name}",
- "avatar_url": str(user.avatar.url) if user.avatar else str(user.default_avatar.url),
- "id": user.id
- })
- except discord.NotFound:
- blacklisted_users.append({
- "name": f"Unknown User ({user_id})",
- "avatar_url": "",
- "id": user_id
- })
- except discord.HTTPException as e:
- print(f"Error fetching user {user_id}: {e}")
- continue
-
- return blacklisted_users
-
- async def get_enhanced_guild_info(self):
- guilds = sorted(self.bot.guilds, key=lambda g: g.member_count, reverse=True)
- guild_info = []
-
- for guild in guilds:
- icon_url = str(guild.icon.url) if guild.icon else ""
- guild_info.append({
- "name": guild.name,
- "member_count": guild.member_count,
- "icon_url": icon_url,
- "id": guild.id
- })
-
- return guild_info
-
- async def start_web_server(self):
- self.runner = web.AppRunner(self.app)
- await self.runner.setup()
- self.site = web.TCPSite(self.runner, '0.0.0.0', 8080)
- await self.site.start()
- print("Goober web server started on port 8080")
-
- async def stop_web_server(self):
- await self.site.stop()
- await self.runner.cleanup()
- print("Web server stopped")
-
- def cog_unload(self):
- self.update_clients.cancel()
- self.bot.loop.create_task(self.stop_web_server())
-
- @tasks.loop(seconds=5)
- async def update_clients(self):
- if not self.websockets:
- return
-
- stats = await self.get_bot_stats()
- message = json.dumps(stats)
-
- for ws in set(self.websockets):
- try:
- await ws.send_str(message)
- except ConnectionResetError:
- self.websockets.remove(ws)
- except Exception as e:
- print(f"Error sending to websocket: {e}")
- self.websockets.remove(ws)
-
- async def handle_websocket(self, request):
- ws = web.WebSocketResponse()
- await ws.prepare(request)
- self.websockets.add(ws)
-
- try:
- async for msg in ws:
- if msg.type == WSMsgType.ERROR:
- print(f"WebSocket error: {ws.exception()}")
- finally:
- self.websockets.remove(ws)
-
- return ws
-
- async def handle_css(self, request):
- css_path = os.path.join(os.path.dirname(__file__), 'styles.css')
- if os.path.exists(css_path):
- return web.FileResponse(css_path)
- return web.Response(text="CSS file not found", status=404)
-
- @commands.Cog.listener()
- async def on_message(self, message):
- if message.author.bot:
- return
-
- ctx = await self.bot.get_context(message)
- if ctx.valid and ctx.command:
- self._update_command_stats(ctx.command.name, ctx.author)
-
- @commands.Cog.listener()
- async def on_app_command_completion(self, interaction, command):
- self._update_command_stats(command.name, interaction.user)
-
- def _update_command_stats(self, command_name, user):
- self.last_command = f"{command_name} (by {user.name})"
- self.last_command_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
- if self.websockets:
- asyncio.create_task(self.update_clients())
-
- async def get_bot_stats(self):
- process = psutil.Process(os.getpid())
- mem_info = process.memory_full_info()
- cpu_percent = psutil.cpu_percent()
- process_cpu = process.cpu_percent()
-
- memory_json_size = "N/A"
- if os.path.exists("memory.json"):
- memory_json_size = f"{os.path.getsize('memory.json') / 1024:.2f} KB"
-
- guild_info = await self.get_enhanced_guild_info()
- blacklisted_users = await self.get_blacklisted_users()
-
- uptime_seconds = int(time.time() - self.start_time)
- uptime_str = f"{uptime_seconds // 86400}d {(uptime_seconds % 86400) // 3600}h {(uptime_seconds % 3600) // 60}m {uptime_seconds % 60}s"
-
- return {
- "ram_usage": f"{mem_info.rss / 1024 / 1024:.2f} MB",
- "cpu_usage": f"{process_cpu}%",
- "system_cpu": f"{cpu_percent}%",
- "memory_json_size": memory_json_size,
- "guild_count": len(guild_info),
- "bl_count": len(blacklisted_users),
- "guilds": guild_info,
- "blacklisted_users": blacklisted_users,
- "last_command": self.last_command,
- "last_command_time": self.last_command_time,
- "bot_uptime": uptime_str,
- "latency": f"{self.bot.latency * 1000:.2f} ms",
- "bot_name": self.bot.user.name,
- "bot_avatar_url": str(self.bot.user.avatar.url) if self.bot.user.avatar else "",
- "authenticated": os.getenv("gooberauthenticated"),
- "lastmsg": os.getenv("gooberlatestgen"),
- "localversion": os.getenv("gooberlocal_version"),
- "latestversion": os.getenv("gooberlatest_version"),
- "owner": os.getenv("ownerid")
- }
-
- async def handle_update(self, request):
- if os.path.exists("goob/update.py"):
- return web.FileResponse("goob/update.py")
- return web.Response(text="Update file not found", status=404)
-
- async def handle_changesong(self, request):
- song = request.query.get('song', '')
- if song:
- await self.bot.change_presence(activity=discord.Activity(type=discord.ActivityType.listening, name=song))
- return web.Response(text=f"Changed song to: {song}")
- return web.Response(text="Please provide a song parameter", status=400)
-
- async def handle_changes(self, request):
- if os.path.exists("goob/changes.txt"):
- return web.FileResponse("goob/changes.txt")
- return web.Response(text="Changelog not found", status=404)
-
- async def read_env_file(self):
- env_vars = {}
- try:
- with open('.env', 'r') as f:
- for line in f:
- line = line.strip()
- if not line or line.startswith('#') or '=' not in line:
- continue
-
- key, value = line.split('=', 1)
- key = key.strip()
- if key in ['splashtext', 'DISCORD_BOT_TOKEN']:
- continue
-
- env_vars[key] = value.strip('"\'')
- except FileNotFoundError:
- print(".env file not found")
- return env_vars
-
-
- async def handle_settings(self, request):
- env_vars = await self.read_env_file()
-
- # Get config.py variables
- config_vars = {}
- try:
- with open('config.py', 'r') as f:
- for line in f:
- if line.startswith('VERSION_URL'):
- config_vars['VERSION_URL'] = line.split('=', 1)[1].strip().strip('"')
- except FileNotFoundError:
- pass
-
- settings_html = """
-
-
-
- Goober Settings
-
-
-
-
-
-
- """
-
- return web.Response(text=settings_html, content_type='text/html')
-
- async def handle_update_settings(self, request):
- data = await request.post()
- env_text = ""
-
- try:
- with open('.env', 'r') as f:
- env_text = f.read()
- except FileNotFoundError:
- pass
-
- def replace_match(match):
- key = match.group(1)
- value = match.group(2)
- if key in ['splashtext', 'DISCORD_BOT_TOKEN']:
- return match.group(0)
- if key in data:
- new_value = data[key]
- if not (new_value.startswith('"') and new_value.endswith('"')):
- new_value = f'"{new_value}"'
- return f'{key}={new_value}'
- return match.group(0)
-
- env_text = re.sub(r'^(\w+)=([\s\S]+?)(?=\n\w+=|\Z)', replace_match, env_text, flags=re.MULTILINE)
-
- with open('.env', 'w') as f:
- f.write(env_text.strip() + '\n')
-
- if 'VERSION_URL' in data:
- config_text = ""
- try:
- with open('config.py', 'r') as f:
- config_text = f.read()
- except FileNotFoundError:
- pass
-
- config_text = re.sub(r'^(VERSION_URL\s*=\s*").+?"', f'\\1{data["VERSION_URL"]}"', config_text, flags=re.MULTILINE)
-
- with open('config.py', 'w') as f:
- f.write(config_text.strip() + '\n')
-
- return aiohttp.web.Response(text="Settings updated successfully!")
-
- async def handle_index(self, request):
- stats = await self.get_bot_stats()
-
- guild_list_html = ""
- for guild in stats['guilds']:
- icon_html = f'
' if guild["icon_url"] else ''
- guild_list_html += f"""
-
- {icon_html}
-
-
{guild["name"]}
-
{guild["member_count"]} members
-
-
- """
- blacklisted_users_html = ""
- for user in stats['blacklisted_users']:
- avatar_html = f'
' if user["avatar_url"] else ''
- blacklisted_users_html += f"""
-
- {avatar_html}
-
-
{user["name"]}
-
ID: {user["id"]}
-
-
- """
-
- owner_id = stats.get('owner')
- owner = None
- owner_username = "Owner"
- owner_pfp = ""
-
- if owner_id:
- try:
- owner = await self.bot.fetch_user(int(owner_id))
- owner_username = f"{owner.name}"
- owner_pfp = str(owner.avatar.url) if owner and owner.avatar else ""
- except:
- pass
-
-
- html_content = f"""
-
-
-
- goobs central
-
-
-
-
-

-
Welcome, {owner_username}
-
-
-
- RAM:
- {stats['ram_usage']}
-
-
- CPU:
- {stats['system_cpu']}
-
-
- Latency:
- {stats['latency']}
-
-
- JSON Size:
- {stats['memory_json_size']}
-
-
- Uptime:
- {stats['bot_uptime']}
-
-
-
-
-
-

-
{stats['bot_name']}
-
-
-
your stupid little goober that learns off other people's messages
-
-
-
-
-
Last Command
-
{stats['last_command']}
-
at {stats['last_command_time']}
-
-
Logged into goober central
-
{stats['authenticated']}
-
-
Last generated message
-
{stats['lastmsg']}
-
-
Version
-
Installed Version: {stats['localversion']}
-
Latest Version: {stats['latestversion']}
-
-
goober-central URL
-
{VERSION_URL}
-
-
Change song
-
-
-
-
-
Servers ({stats['guild_count']})
-
- {guild_list_html}
-
-
-
Blacklisted Users ({stats['bl_count']})
-
- {blacklisted_users_html if stats['blacklisted_users'] else "
No blacklisted users
"}
-
-
-
-
-
-
- """
-
- return web.Response(text=html_content, content_type='text/html')
-
- async def handle_stats(self, request):
- return await self.handle_index(request)
-
- async def handle_json_data(self, request):
- stats = await self.get_bot_stats()
- return web.json_response(stats)
-
-async def setup(bot):
- await bot.add_cog(GooberWeb(bot))
diff --git a/assets/fonts/TNR.ttf b/assets/fonts/TNR.ttf
deleted file mode 100644
index 51261a005cd5b17755274fd7d2bdde4edd01bf1c..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 347988
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