sparkytron3000/extensions/inky_phat.py

125 lines
4.2 KiB
Python
Raw Normal View History

import socket # used to get local IP
import time
2024-02-02 22:41:11 -08:00
import os
import datetime
import psutil
from PIL import Image, ImageFont, ImageDraw
from discord.ext import commands, tasks
import inky
2024-02-02 22:41:11 -08:00
def is_enabled():
if os.getenv("inky").lower() == "enabled":
return True
else:
return False
class InkyScreen(commands.Cog):
def __init__(self, bot):
self.bot = bot
2024-02-02 22:42:33 -08:00
self.enabled = is_enabled()
self.old_message = None
self.display = self.setup()
self.start_time = time.time()
self.admin_ids = [242018983241318410]
2024-02-02 23:15:01 -08:00
self.message_loop.start()
def setup(self):
if self.enabled:
display = inky.auto()
2024-02-02 23:15:01 -08:00
display.set_border(inky.YELLOW)
return display
else:
return None
2024-02-02 22:53:52 -08:00
async def write_to_display(self, text: list):
if text is not self.old_message:
#try:
# image = Image.open("data/inky/bg.png")
#except:
# self.bot.logger.exception("InkyScreen: Failed to load background image.")
image = Image.new("P", (self.display.WIDTH, self.display.HEIGHT), (self.display.BLACK))
draw = ImageDraw.Draw(image)
2024-02-02 23:03:01 -08:00
width = self.display.WIDTH
height = self.display.HEIGHT
lines = len(text)
height_diff = height/lines
2024-02-02 22:59:48 -08:00
x = 0
y = 0
for line in text:
2024-02-02 23:03:01 -08:00
if y <= width:
2024-02-03 00:08:02 -08:00
draw.text((x, y), line, self.display.YELLOW, font=ImageFont.load_default(size=22))
2024-02-02 23:40:56 -08:00
y += height_diff
else:
self.bot.logger.warning("InkyScreen: Text too long to fit on image.")
2024-02-02 23:10:57 -08:00
image = image.rotate(180)
self.display.set_image(image)
self.display.show()
self.bot.logger.info("InkyScreen: Text successfully written to image.")
self.old_message = text
else:
self.bot.logger.info("InkyScreen: Text is the same as the previous message, not writing to image.")
def get_ip_address(self):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("8.8.8.8", 80))
ip = s.getsockname()[0]
s.close()
return ip
def get_uptime(self):
sparky_uptime = time.time() - self.start_time
2024-02-03 00:08:02 -08:00
return str(datetime.timedelta(seconds=sparky_uptime))[0:-7]
def get_memory_usage(self):
memory_info = psutil.virtual_memory()
used_memory = memory_info.used
if used_memory >= 1000000000:
2024-02-03 00:11:15 -08:00
used_memory = round(used_memory/1000000000,1)
2024-02-03 00:08:02 -08:00
used_memory = f"{used_memory}GB"
else:
2024-02-03 00:11:15 -08:00
used_memory = round(used_memory/1000000)
2024-02-03 00:08:02 -08:00
used_memory = f"{used_memory}MB"
2024-02-03 00:11:15 -08:00
total_memory = round(memory_info.total/1000000000,1)
2024-02-03 00:08:02 -08:00
return f"Memory: {used_memory}/{total_memory}GB"
2024-02-02 22:53:52 -08:00
async def generate_message(self):
message_list = []
try:
message_list.append(f"IP: {self.get_ip_address()}")
message_list.append(f"Time: {time.strftime('%H:%M:%S')}")
message_list.append(f"Uptime: {self.get_uptime()}")
2024-02-02 23:40:56 -08:00
#message_list.append(f"Servers: {len(self.bot.guilds)}")
cpu_percent = psutil.cpu_percent()
message_list.append(f"CPU: {cpu_percent}%")
2024-02-03 00:08:02 -08:00
message_list.append(self.get_memory_usage())
except Exception as e:
self.bot.logger.error(f"Error generating InkyScreen message: {e}")
return message_list
@commands.command()
async def inkyscreen_update(self, ctx):
if ctx.author.id in self.admin_ids:
2024-02-02 22:53:52 -08:00
message = await self.generate_message()
await self.write_to_display(message)
await ctx.send("InkyScreen updated.")
else:
await ctx.send("You do not have permission to use this command.")
@tasks.loop(minutes=10)
2024-02-02 22:58:29 -08:00
async def message_loop(self):
if self.enabled:
2024-02-02 22:56:31 -08:00
message = await self.generate_message()
await self.write_to_display(message)
async def setup(bot):
2024-02-02 22:43:25 -08:00
try:
await bot.add_cog(InkyScreen(bot))
bot.logger.info("InkyScreen cog loaded")
except:
bot.logger.exception("Error loading InkyScreen cog")