misc/migration related

This commit is contained in:
2025-06-08 08:53:27 -04:00
parent 046ad4f94a
commit 75addd629c
6 changed files with 113 additions and 33 deletions

View File

@ -136,10 +136,10 @@ class Meme(commands.Cog):
def __init__(self, bot: Havoc) -> None: def __init__(self, bot: Havoc) -> None:
self.bot: Havoc = bot self.bot: Havoc = bot
self.stats_db_path: str = os.path.join( self.stats_db_path: str = os.path.join(
"/mnt/data/share", "sqlite_dbs", "stats.db" "/", "usr", "local", "share", "sqlite_dbs", "stats.db"
) )
self.memedb_path: str = os.path.join( self.meme_db_path: str = os.path.join(
"/mnt/data/share", "sqlite_dbs", "meme.db" "/", "usr", "local", "share", "sqlite_dbs", "meme.db"
) )
self.meme_choices: list = [] self.meme_choices: list = []
self.meme_counter: int = 0 self.meme_counter: int = 0
@ -264,9 +264,10 @@ class Meme(commands.Cog):
phash: str = str(imagehash.phash(_image)) phash: str = str(imagehash.phash(_image))
query: str = "INSERT INTO memes(discord_uid, timestamp, image, message_ids, phash) VALUES(?, ?, ?, ?, ?)" query: str = "INSERT INTO memes(discord_uid, timestamp, image, message_ids, phash) VALUES(?, ?, ?, ?, ?)"
image.seek(0) image.seek(0)
async with sqlite3.connect(self.memedb_path, timeout=5) as db_conn: converted = self.convert_to_png(image)
async with sqlite3.connect(self.meme_db_path, timeout=5) as db_conn:
insert = await db_conn.execute_insert( insert = await db_conn.execute_insert(
query, (discord_uid, timestamp, image.read(), message_id, phash) query, (discord_uid, timestamp, converted, message_id, phash)
) )
if insert: if insert:
await db_conn.commit() await db_conn.commit()
@ -286,7 +287,7 @@ class Meme(commands.Cog):
try: try:
phash: str = str(imagehash.phash(image)) phash: str = str(imagehash.phash(image))
query: str = "SELECT message_ids FROM memes WHERE phash = ? LIMIT 1" query: str = "SELECT message_ids FROM memes WHERE phash = ? LIMIT 1"
async with sqlite3.connect(self.memedb_path, timeout=2) as db_conn: async with sqlite3.connect(self.meme_db_path, timeout=2) as db_conn:
db_conn.row_factory = sqlite3.Row db_conn.row_factory = sqlite3.Row
async with await db_conn.execute(query, (phash,)) as db_cursor: async with await db_conn.execute(query, (phash,)) as db_cursor:
result = await db_cursor.fetchone() result = await db_cursor.fetchone()
@ -741,12 +742,15 @@ class Meme(commands.Cog):
dupe_check = await self.dupe_check(Image.open(image)) dupe_check = await self.dupe_check(Image.open(image))
if dupe_check: if dupe_check:
channel = message.channel channel = message.channel
try:
original_message = await channel.fetch_message(dupe_check) # type: ignore original_message = await channel.fetch_message(dupe_check) # type: ignore
original_message_url = original_message.jump_url original_message_url = original_message.jump_url
await message.add_reaction( await message.add_reaction(
emoji="<:quietscheentchen:1255956612804247635>" emoji="<:quietscheentchen:1255956612804247635>"
) )
await message.reply(original_message_url) await message.reply(original_message_url)
except Exception as e:
logging.info("Failed to mark original image: %s", str(e))
else: else:
image.seek(0) image.seek(0)
unique_memes.append(image) unique_memes.append(image)
@ -856,6 +860,24 @@ class Meme(commands.Cog):
else: else:
await ctx.respond("NO embed :(") await ctx.respond("NO embed :(")
def convert_to_png(self, in_buffer: io.BytesIO) -> bytes:
"""
Convert an in-memory buffer to PNG
Args:
in_buffer (io.BytesIO)
Returns:
bytes
"""
in_buffer.seek(0)
with Image.open(in_buffer) as im:
if im.format == "PNG":
raise ValueError("Already a PNG")
out_buffer = io.BytesIO()
im.save(out_buffer, format="PNG")
out_buffer.seek(0)
return out_buffer.read()
def cog_unload(self) -> None: def cog_unload(self) -> None:
self.meme_stream_loop.cancel() self.meme_stream_loop.cancel()
self.explosm_loop.cancel() self.explosm_loop.cancel()

View File

@ -214,8 +214,51 @@ class Misc(commands.Cog):
except Exception as e: except Exception as e:
logging.debug("Failed to add xmas reaction: %s", str(e)) logging.debug("Failed to add xmas reaction: %s", str(e))
await ctx.respond( await ctx.respond(
f"Only {days} days, {hours} hours, {minutes} minutes,\ f"Only {days} days, {hours} hours, {minutes} minutes, {seconds} seconds and {ms} ms left until Christmas! (UTC)".translate(
{seconds} seconds and {ms} ms left! (UTC)".translate(xmas_trans) xmas_trans
)
)
except Exception as e:
traceback.print_exc()
return await ctx.respond(f"Error: {str(e)}")
@bridge.bridge_command()
async def halloween(self, ctx) -> None:
"""
Countdown til Halloween!
"""
try:
emojis: dict = {
"0": "0",
"1": "1",
"2": "2",
"3": "3",
"4": "4",
"5": "5",
"6": "6",
"7": "7",
"8": "8",
"9": "9",
}
with ctx.channel.typing():
countdown = self.util.get_days_to_halloween()
if not isinstance(countdown, tuple) or len(countdown) < 6:
return await ctx.respond(
"Oops, Halloween is cancelled."
) # Invalid countdown from util
(days, hours, minutes, seconds, ms, _) = countdown
now: datetime.datetime = datetime.datetime.now()
if now.month == 12 and now.day == 25:
return await ctx.respond("# IT IS HALLOWEEN!!!!!!!!\n-# GET ROWDY")
halloween_trans: dict = str.maketrans(emojis)
try:
await ctx.message.add_reaction(emoji="🎃")
except Exception as e:
logging.debug("Failed to add Halloween reaction: %s", str(e))
await ctx.respond(
f"Only {days} days, {hours} hours, {minutes} minutes, {seconds} seconds and {ms} ms left until Halloween! (UTC)".translate(
halloween_trans
)
) )
except Exception as e: except Exception as e:
traceback.print_exc() traceback.print_exc()

View File

@ -107,9 +107,7 @@ class Radio(commands.Cog):
but they exist. but they exist.
""" """
logging.info("Detected VC not playing... playing!") logging.info("Detected VC not playing... playing!")
source: discord.FFmpegAudio = discord.FFmpegOpusAudio( source: discord.FFmpegAudio = discord.FFmpegOpusAudio(self.STREAM_URL)
self.STREAM_URL
)
vc.play( # type: ignore vc.play( # type: ignore
source, source,
after=lambda e: logging.info("Error: %s", e) if e else None, after=lambda e: logging.info("Error: %s", e) if e else None,

View File

@ -61,8 +61,7 @@ class Sing(commands.Cog):
) )
await ctx.respond( await ctx.respond(
"*Searching...*", "*Searching...*", ephemeral=True
ephemeral=True
) # Must respond to interactions within 3 seconds, per Discord ) # Must respond to interactions within 3 seconds, per Discord
parsed = self.utility.parse_song_input(song, activity) parsed = self.utility.parse_song_input(song, activity)

View File

@ -10,7 +10,7 @@ class DB:
def __init__(self, bot) -> None: def __init__(self, bot) -> None:
self.db_path: str | LiteralString = os.path.join( self.db_path: str | LiteralString = os.path.join(
"/mnt/data/share", "sqlite_dbs", "lovehate.db" "/usr/local/share", "sqlite_dbs", "lovehate.db"
) )
async def get_wholovehates( async def get_wholovehates(

View File

@ -21,14 +21,14 @@ class Util:
self.URL_INSULTAPI: str = "https://insult.mattbas.org/api/insult" self.URL_INSULTAPI: str = "https://insult.mattbas.org/api/insult"
self.COMPLIMENT_GENERATOR = ComplimentGenerator() self.COMPLIMENT_GENERATOR = ComplimentGenerator()
self.dbs: dict[str, str | LiteralString] = { self.dbs: dict[str, str | LiteralString] = {
"whisky": os.path.join("/mnt/data/share", "sqlite_dbs", "whiskey.db"), "whisky": os.path.join("/usr/local/share", "sqlite_dbs", "whiskey.db"),
"drinks": os.path.join("/mnt/data/share", "sqlite_dbs", "cocktails.db"), "drinks": os.path.join("/usr/local/share", "sqlite_dbs", "cocktails.db"),
"strains": os.path.join("/mnt/data/share", "sqlite_dbs", "strains.db"), "strains": os.path.join("/usr/local/share", "sqlite_dbs", "strains.db"),
"qajoke": os.path.join("/mnt/data/share", "sqlite_dbs", "qajoke.db"), "qajoke": os.path.join("/usr/local/share", "sqlite_dbs", "qajoke.db"),
"rjokes": os.path.join("/mnt/data/share", "sqlite_dbs", "rjokes.db"), "rjokes": os.path.join("/usr/local/share", "sqlite_dbs", "rjokes.db"),
"randmsg": os.path.join("/mnt/data/share", "sqlite_dbs", "randmsg.db"), "randmsg": os.path.join("/usr/local/share", "sqlite_dbs", "randmsg.db"),
"stats": os.path.join("/mnt/data/share", "sqlite_dbs", "havoc_stats.db"), "stats": os.path.join("/usr/local/share", "sqlite_dbs", "havoc_stats.db"),
"cookies": os.path.join("/mnt/data/share", "sqlite_dbs", "cookies.db"), "cookies": os.path.join("/usr/local/share", "sqlite_dbs", "cookies.db"),
} }
self.COFFEES: list = [ self.COFFEES: list = [
"a cup of french-pressed coffee", "a cup of french-pressed coffee",
@ -165,7 +165,7 @@ class Util:
query, (counter,) if counter else None query, (counter,) if counter else None
) as db_cursor: ) as db_cursor:
result = await db_cursor.fetchone() result = await db_cursor.fetchone()
return result return dict(result)
async def get_stats_embed(self) -> Optional[Embed]: async def get_stats_embed(self) -> Optional[Embed]:
""" """
@ -207,9 +207,7 @@ class Util:
f"UPDATE stats SET {counter} = {counter} + 1" f"UPDATE stats SET {counter} = {counter} + 1"
) as db_cursor: ) as db_cursor:
if db_cursor.rowcount < 0: if db_cursor.rowcount < 0:
logging.critical( logging.critical("[increment_counter] Fail! %s", db_cursor.rowcount)
"[increment_counter] Fail! %s", db_cursor.rowcount
)
return False return False
await db_conn.commit() await db_conn.commit()
return True return True
@ -547,6 +545,26 @@ class Util:
return (days, hours, minutes, seconds, ms, us) return (days, hours, minutes, seconds, ms, us)
def get_days_to_halloween(self) -> Optional[tuple]:
"""
Get # of Days until Halloween
Returns:
Optional[tuple]
"""
today: datetime.datetime = datetime.datetime.now(tz=pytz.UTC)
halloween: datetime.datetime = datetime.datetime(
year=today.year,
month=10,
day=31,
tzinfo=pytz.UTC,
)
td: datetime.timedelta = halloween - today
days, hours, minutes, seconds, us, ms = self.tdTuple(td)
return (days, hours, minutes, seconds, ms, us)
async def get_randmsg(self) -> Optional[str]: async def get_randmsg(self) -> Optional[str]:
""" """
Get Random Message from randmsg.db Get Random Message from randmsg.db