added logging and small tweaks

This commit is contained in:
abcrate 2023-11-20 10:02:30 -06:00 committed by GitHub
parent 515bdaf2ee
commit 23750b92b3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 50 additions and 22 deletions

1
.gitignore vendored
View File

@ -3,3 +3,4 @@ config.py
/images/* /images/*
*.json *.json
*.old *.old
*.log*

View File

@ -6,15 +6,32 @@ import aiohttp
import asyncio import asyncio
import discord import discord
import requests import requests
import logging
import random import random
from openai import AsyncOpenAI from openai import AsyncOpenAI
from datetime import datetime from datetime import datetime
from collections import defaultdict from collections import defaultdict
from operator import itemgetter from operator import itemgetter
from logging.handlers import TimedRotatingFileHandler
# Log setup
garflog = logging.getLogger('garfbot_logger')
garflog.setLevel(logging.INFO)
handler = TimedRotatingFileHandler(
'garfbot.log',
when='midnight',
interval=1,
backupcount=7
)
formatter=logging.Formatter(
'%(asctime)s [%(levelname)s] %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
handler.setFormatter(formatter)
# Bot setup and init etc.
# Bot setup
openaikey = config.OPENAI_TOKEN openaikey = config.OPENAI_TOKEN
gapikey = config.GIF_TOKEN gapikey = config.GIF_TOKEN
garfkey = config.GARFBOT_TOKEN garfkey = config.GARFBOT_TOKEN
@ -25,13 +42,14 @@ intents = discord.Intents.default()
intents.members = True intents.members = True
intents.messages = True intents.messages = True
intents.message_content = True intents.message_content = True
client = discord.Client(intents=intents) garfbot = discord.Client(intents=intents)
@client.event @garfbot.event
async def on_ready(): async def on_ready():
asyncio.create_task(process_image_requests()) # Important! asyncio.create_task(process_image_requests()) # Important!
print(f"Logged in as {client.user.name} running {txtmodel} {imgmodel}.", flush=True) garflog.info(f"Logged in as {garfbot.user.name} running {txtmodel} {imgmodel}.")
print(f"Logged in as {garfbot.user.name} running {txtmodel} {imgmodel}.", flush=True)
# Json Handling # Json Handling
@ -88,9 +106,11 @@ async def generate_image(prompt):
except openai.BadRequestError as e: except openai.BadRequestError as e:
return f"`GarfBot Error: ({e.status_code}) - Your request was rejected as a result of our safety system.`" return f"`GarfBot Error: ({e.status_code}) - Your request was rejected as a result of our safety system.`"
except openai.InternalServerError as e: except openai.InternalServerError as e:
garflog.error(e)
print(e, flush=True) print(e, flush=True)
return f"`GarfBot Error: {e.status_code} - Monday`" return f"`GarfBot Error: ({e.status_code}) - Monday`"
except Exception as e: except Exception as e:
garflog.error(e)
print(e, flush=True) print(e, flush=True)
return f"`GarfBot Error: Lasagna`" return f"`GarfBot Error: Lasagna`"
@ -108,12 +128,12 @@ async def process_image_requests():
if resp.status == 200: if resp.status == 200:
image_data = await resp.read() image_data = await resp.read()
timestamp = message.created_at.strftime('%Y%m%d%H%M%S') timestamp = message.created_at.strftime('%Y%m%d%H%M%S')
filename = f"images/{timestamp}_generated_image.png" save_filename = f"images/{timestamp}_generated_image.png"
new_filename = f"{timestamp}_generated_image.png" # There is probably a better way to do this. send_filename = f"{timestamp}_generated_image.png" # There is probably a better way to do this.
with open(filename, "wb") as f: with open(save_filename, "wb") as f:
f.write(image_data) f.write(image_data)
with open(filename, "rb") as f: with open(save_filename, "rb") as f:
await message.channel.send(file=discord.File(f, new_filename)) await message.channel.send(file=discord.File(f, send_filename))
else: else:
await message.channel.send("`GarfBot Error: Odie`") await message.channel.send("`GarfBot Error: Odie`")
else: else:
@ -122,11 +142,10 @@ async def process_image_requests():
await asyncio.sleep(2) await asyncio.sleep(2)
# Message Listener # Message Listener
@client.event @garfbot.event
async def on_message(message): async def on_message(message):
if message.author == client.user: if message.author == garfbot.user:
return return
if message.content.lower().startswith("hey garfield") or isinstance(message.channel, discord.DMChannel): if message.content.lower().startswith("hey garfield") or isinstance(message.channel, discord.DMChannel):
@ -138,6 +157,7 @@ async def on_message(message):
user = message.author.name user = message.author.name
server = message.guild.name if message.guild else "Direct Message" server = message.guild.name if message.guild else "Direct Message"
prompt = message.content[8:] prompt = message.content[8:]
garflog.info(f"Image Request - User: {user}, Server: {server}, Prompt: {prompt}")
print(f"Image Request - User: {user}, Server: {server}, Prompt: {prompt}", flush=True) print(f"Image Request - User: {user}, Server: {server}, Prompt: {prompt}", flush=True)
await message.channel.send(f"`Please wait... image generation queued: {prompt}`") await message.channel.send(f"`Please wait... image generation queued: {prompt}`")
await image_request_queue.put({'message': message, 'prompt': prompt}) await image_request_queue.put({'message': message, 'prompt': prompt})
@ -156,7 +176,8 @@ async def on_message(message):
if message.guild and message.guild.id == 719605634772893757: if message.guild and message.guild.id == 719605634772893757:
if "meow" in message.content.lower(): if "meow" in message.content.lower():
print(f"Meow detected: {message.content}") garflog.info(f"Meow detected! {message.author.name} said: {message.content}")
print(f"Meow detected! {message.author.name} said: {message.content}", flush=True)
meow_counts[str(message.author.id)] += 1 meow_counts[str(message.author.id)] += 1
@ -171,7 +192,7 @@ async def on_message(message):
top_meowers = sorted(meow_counts.items(), key=itemgetter(1), reverse=True)[:10] top_meowers = sorted(meow_counts.items(), key=itemgetter(1), reverse=True)[:10]
embed = discord.Embed(title="Top Meowers :cat:", color=0x000000) embed = discord.Embed(title="Top Meowers :cat:", color=0x000000)
for i, (user_id, meow_count) in enumerate(top_meowers): for i, (user_id, meow_count) in enumerate(top_meowers):
user = await client.fetch_user(int(user_id)) user = await garfbot.fetch_user(int(user_id))
embed.add_field(name=f"{i+1}. {user.name}", value=f"{meow_count} meows", inline=False) embed.add_field(name=f"{i+1}. {user.name}", value=f"{meow_count} meows", inline=False)
await message.channel.send(embed=embed) await message.channel.send(embed=embed)
@ -215,10 +236,10 @@ async def on_message(message):
minutes, total_time_seconds = divmod(total_time_seconds, 60) minutes, total_time_seconds = divmod(total_time_seconds, 60)
seconds, fractions = divmod(total_time_seconds, 1) seconds, fractions = divmod(total_time_seconds, 1)
fractions_str = f"{fractions:.3f}"[2:] fractions_str = f"{fractions:.3f}"[2:]
username = client.get_user(int(user_id)).name username = garfbot.get_user(int(user_id)).name
table_rows.append([username, str(stats["check_ins"]), f"{int(hours)}h {int(minutes)}m {int(seconds)}s {fractions_str}ms"]) table_rows.append([username, str(stats["check_ins"]), f"{int(hours)}h {int(minutes)}m {int(seconds)}s {fractions_str}ms"])
else: else:
username = client.get_user(int(user_id)).name username = garfbot.get_user(int(user_id)).name
table_rows.append([username, "Currently checked in", "-"]) table_rows.append([username, "Currently checked in", "-"])
table_columns = list(zip(*table_rows[1:])) table_columns = list(zip(*table_rows[1:]))
table_fields = table_rows[0] table_fields = table_rows[0]
@ -227,9 +248,8 @@ async def on_message(message):
await message.channel.send(embed=stats_embed) await message.channel.send(embed=stats_embed)
# GarfGifs (I put this at the bottom because it looks messy)
# GarfGifs (I put this at the bottom bc it looks messy) @garfbot.event
@client.event
async def send_gif(message, search_term): async def send_gif(message, search_term):
lmt = 50 lmt = 50
ckey = "garfbot" ckey = "garfbot"
@ -246,10 +266,17 @@ async def send_gif(message, search_term):
await message.channel.send(f"`Oops, something went wrong. Error code: {r.status_code}`") await message.channel.send(f"`Oops, something went wrong. Error code: {r.status_code}`")
# discord.py error handling
@garfbot.event
async def on_error(event, *args, **kwargs):
garflog.error(f'GarfBot Error: {event}')
print(f'GarfBot Error: {event}', flush=True)
# Run GarfBot :)
# Run GarfBot!
try: try:
client.run(garfkey) garfbot.run(garfkey)
except Exception as e: except Exception as e:
e = str(e) e = str(e)
garflog.error(f"GarfBot Init Error: {e}")
print(f"GarfBot Init Error: {e}", flush=True) print(f"GarfBot Init Error: {e}", flush=True)