From a7724608275af5148453d594f297431a4a8a0438 Mon Sep 17 00:00:00 2001 From: Aaron Crate Date: Fri, 17 Nov 2023 19:03:31 +0000 Subject: [PATCH] small formatting changes --- garfbot.py | 489 ++++++++++++++++++++++++++-------------------------- jonbot.py | 4 +- moneybot.py | 3 +- 3 files changed, 248 insertions(+), 248 deletions(-) diff --git a/garfbot.py b/garfbot.py index af14fe3..d97c464 100644 --- a/garfbot.py +++ b/garfbot.py @@ -1,244 +1,245 @@ -import os -import json -import config -import openai -import aiohttp -import asyncio -import discord -import requests -import random -from openai import AsyncOpenAI -from datetime import datetime -from collections import defaultdict -from operator import itemgetter - -intents = discord.Intents.default() -intents.members = True -intents.messages = True -intents.message_content = True -client = discord.Client(intents=intents) - -openaikey = config.OPENAI_TOKEN -gapikey = config.GIF_TOKEN -garfkey = config.GARFBOT_TOKEN - -@client.event -async def on_ready(): - asyncio.create_task(process_image_requests()) - print(f"Logged in as {client.user.name} running gpt-3.5-turbo.", flush=True) - -# MeowCounts File -counts_file = "meow_counts.json" -meow_counts = defaultdict(int) -if os.path.isfile(counts_file): - with open(counts_file, "r") as f: - meow_counts.update(json.load(f)) -elif os.path.exists(counts_file): - with open(counts_file, "r") as f: - meow_counts = json.load(f) -try: - with open("user_stats.json", "r") as f: - user_stats = json.load(f) -except FileNotFoundError: - user_stats = {} - -# GarfChats -async def generate_chat_response(question): - try: - client = AsyncOpenAI(api_key = openaikey) - response = await client.chat.completions.create( - model="gpt-3.5-turbo", - messages=[ - {"role": "system", "content": "Pretend you are sarcastic Garfield."}, - {"role": "user", "content": f"{question}"} - ], - max_tokens=400 - ) - answer = response.choices[0].message.content - return answer.replace("an AI language model", "a cartoon animal") - except openai.BadRequestError as e: - return f"`GarfBot Error: {e}`" - except openai.APIError as e: - print(e, flush=True) - return f"`GarfBot Error: Monday`" - except Exception as e: - print(e, flush=True) - return f"`GarfBot Error: Lasagna`" - -# GarfPics -async def generate_image(prompt): - try: - client = AsyncOpenAI(api_key = openaikey) - response = await client.images.generate( - model="dall-e-3", - prompt=prompt, - n=1, - size="1024x1024" - ) - image_url = response.data[0].url - return image_url - except openai.BadRequestError as e: - return f"`GarfBot Error: ({e.status_code}) - Your request was rejected as a result of our safety system.`" - except openai.InternalServerError as e: - print(e, flush=True) - return f"`GarfBot Error: {e.status_code} - Monday`" - except Exception as e: - print(e, flush=True) - return f"`GarfBot Error: Lasagna`" - -image_request_queue = asyncio.Queue() - -async def process_image_requests(): - async with aiohttp.ClientSession() as session: - while True: - request = await image_request_queue.get() - message = request['message'] - prompt = request['prompt'] - image_url = await generate_image(prompt) - if "GarfBot Error" not in image_url: - async with session.get(image_url) as resp: - if resp.status == 200: - image_data = await resp.read() - timestamp = message.created_at.strftime('%Y%m%d%H%M%S') - filename = f"images/{timestamp}_generated_image.png" - with open(filename, "wb") as f: - f.write(image_data) - with open(filename, "rb") as f: - await message.channel.send(file=discord.File(f)) - else: - await message.channel.send("`GarfBot Error: Odie`") - else: - await message.channel.send(image_url) - image_request_queue.task_done() - await asyncio.sleep(2) - -# Listen for messages -@client.event -async def on_message(message): - if message.author == client.user: - return - - if message.content.lower().startswith("hey garfield") or isinstance(message.channel, discord.DMChannel): - question = message.content[12:] if message.content.lower().startswith("hey garfield") else message.content - answer = await generate_chat_response(question) - await message.channel.send(answer) - - if message.content.lower().startswith('garfpic '): - user = message.author.name - server = message.guild.name if message.guild else "Direct Message" - prompt = message.content[8:] - print(f"Image Request - User: {user}, Server: {server}, Prompt: {prompt}", flush=True) - await message.channel.send(f"`Please wait... image generation queued: {prompt}`") - await image_request_queue.put({'message': message, 'prompt': prompt}) - - if message.content.lower() == "lasagna": - await send_gif(message, "garfield lasagna") - - if message.content.lower() == "monday": - await send_gif(message, "garfield monday") - - if message.content.lower().startswith("garfgif "): - search_term = message.content[8:] - await send_gif(message, search_term) - - if message.guild and message.guild.id == 719605634772893757: - - if "meow" in message.content.lower(): - print(f"Meow detected: {message.content}") - - meow_counts[str(message.author.id)] += 1 - - with open(counts_file, "w") as f: - json.dump(dict(meow_counts), f) - - if message.content.lower() == "meowcount": - response = f"My records show that <@{message.author.id}> has meowed {meow_counts[str(message.author.id)]} time(s). Have a nice day." - await message.channel.send(response) - - if message.content.lower() == "top meowers": - top_meowers = sorted(meow_counts.items(), key=itemgetter(1), reverse=True)[:10] - embed = discord.Embed(title="Top Meowers :cat:", color=0x000000) - for i, (user_id, meow_count) in enumerate(top_meowers): - user = await client.fetch_user(int(user_id)) - embed.add_field(name=f"{i+1}. {user.name}", value=f"{meow_count} meows", inline=False) - await message.channel.send(embed=embed) - - if message.content.lower() == "checking in": - # Check if user has already checked in - user_id = str(message.author.id) - if user_id in user_stats and user_stats[user_id]["check_in_time"] is not None: - await message.channel.send(f"{message.author.mention} You are already checked in. Please check out first.") - return - - # Record check-in time and add user to user_stats if not already there - check_in_time = datetime.utcnow().timestamp() - if user_id not in user_stats: - user_stats[user_id] = {"check_ins": 0, "total_time": 0, "check_in_time": None} - user_stats[user_id]["check_in_time"] = check_in_time - await message.channel.send(f"{message.author.mention} You have been checked in. Please mute your microphone.") - - elif message.content.lower() == "checking out": - # Check if user has already checked in - user_id = str(message.author.id) - if user_id not in user_stats or user_stats[user_id]["check_in_time"] is None: - await message.channel.send(f"{message.author.mention} You have not checked in yet. Please check in first.") - return - - # Record check-out time and update user stats - check_out_time = datetime.utcnow().timestamp() - check_in_time = user_stats[user_id]["check_in_time"] - time_delta = check_out_time - check_in_time - user_stats[user_id]["check_ins"] += 1 - user_stats[user_id]["total_time"] += time_delta - user_stats[user_id]["check_in_time"] = None - - # Save user stats to file - with open("user_stats.json", "w") as f: - json.dump(user_stats, f) - await message.channel.send(f"{message.author.mention} You have been checked out. Your session was {time_delta:.2f} seconds.") - - elif message.content.lower() == "stats": - stats_embed = discord.Embed(title="User stats :trophy:", color=0x000000) - sorted_user_stats = sorted(user_stats.items(), key=lambda x: x[1]["total_time"], reverse=True) - table_rows = [["Name", "Check-ins", "Total Time"]] - for user_id, stats in sorted_user_stats: - if stats["check_in_time"] is None: - total_time_seconds = stats["total_time"] - hours, total_time_seconds = divmod(total_time_seconds, 3600) - minutes, total_time_seconds = divmod(total_time_seconds, 60) - seconds, fractions = divmod(total_time_seconds, 1) - fractions_str = f"{fractions:.3f}"[2:] - username = client.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"]) - else: - username = client.get_user(int(user_id)).name - table_rows.append([username, "Currently checked in", "-"]) - table_columns = list(zip(*table_rows[1:])) - table_fields = table_rows[0] - for field, values in zip(table_fields, table_columns): - stats_embed.add_field(name=field, value="\n".join(values), inline=True) - await message.channel.send(embed=stats_embed) - -# GarfGifs -@client.event -async def send_gif(message, search_term): - lmt = 50 - ckey = "garfbot" - r = requests.get(f"https://tenor.googleapis.com/v2/search?q={search_term}&key={gapikey}&client_key={ckey}&limit={lmt}") - if r.status_code == 200: - top_50gifs = json.loads(r.content) - gif_url = random.choice(top_50gifs["results"])["itemurl"] - print(gif_url) - try: - await message.channel.send(gif_url) - except KeyError: - await message.channel.send("Oops, something went wrong.") - else: - await message.channel.send(f"`Oops, something went wrong. Error code: {r.status_code}`") - -# Run GarfBot -try: - client.run(garfkey) -except Exception as e: - e = str(e) - print(f"GarfBot Error: {e}") +import os +import json +import config +import openai +import aiohttp +import asyncio +import discord +import requests +import random +from openai import AsyncOpenAI +from datetime import datetime +from collections import defaultdict +from operator import itemgetter + +openaikey = config.OPENAI_TOKEN +gapikey = config.GIF_TOKEN +garfkey = config.GARFBOT_TOKEN + +intents = discord.Intents.default() +intents.members = True +intents.messages = True +intents.message_content = True +client = discord.Client(intents=intents) + +@client.event +async def on_ready(): + asyncio.create_task(process_image_requests()) + print(f"Logged in as {client.user.name} running gpt-3.5-turbo.", flush=True) + +# MeowCounts File +counts_file = "meow_counts.json" +meow_counts = defaultdict(int) +if os.path.isfile(counts_file): + with open(counts_file, "r") as f: + meow_counts.update(json.load(f)) +elif os.path.exists(counts_file): + with open(counts_file, "r") as f: + meow_counts = json.load(f) +try: + with open("user_stats.json", "r") as f: + user_stats = json.load(f) +except FileNotFoundError: + user_stats = {} + +# GarfChats +async def generate_chat_response(question): + try: + client = AsyncOpenAI(api_key = openaikey) + response = await client.chat.completions.create( + model="gpt-3.5-turbo", + messages=[ + {"role": "system", "content": "Pretend you are sarcastic Garfield."}, + {"role": "user", "content": f"{question}"} + ], + max_tokens=400 + ) + answer = response.choices[0].message.content + return answer.replace("an AI language model", "a cartoon animal") + except openai.BadRequestError as e: + return f"`GarfBot Error: {e}`" + except openai.APIError as e: + print(e, flush=True) + return f"`GarfBot Error: Monday`" + except Exception as e: + print(e, flush=True) + return f"`GarfBot Error: Lasagna`" + +# GarfPics +async def generate_image(prompt): + try: + client = AsyncOpenAI(api_key = openaikey) + response = await client.images.generate( + model="dall-e-3", + prompt=prompt, + n=1, + size="1024x1024" + ) + image_url = response.data[0].url + return image_url + except openai.BadRequestError as e: + return f"`GarfBot Error: ({e.status_code}) - Your request was rejected as a result of our safety system.`" + except openai.InternalServerError as e: + print(e, flush=True) + return f"`GarfBot Error: {e.status_code} - Monday`" + except Exception as e: + print(e, flush=True) + return f"`GarfBot Error: Lasagna`" + +image_request_queue = asyncio.Queue() + +async def process_image_requests(): + async with aiohttp.ClientSession() as session: + while True: + request = await image_request_queue.get() + message = request['message'] + prompt = request['prompt'] + image_url = await generate_image(prompt) + if "GarfBot Error" not in image_url: + async with session.get(image_url) as resp: + if resp.status == 200: + image_data = await resp.read() + timestamp = message.created_at.strftime('%Y%m%d%H%M%S') + filename = f"images/{timestamp}_generated_image.png" + with open(filename, "wb") as f: + f.write(image_data) + with open(filename, "rb") as f: + await message.channel.send(file=discord.File(f)) + else: + await message.channel.send("`GarfBot Error: Odie`") + else: + await message.channel.send(image_url) + image_request_queue.task_done() + await asyncio.sleep(2) + +# Listen for messages +@client.event +async def on_message(message): + if message.author == client.user: + return + + if message.content.lower().startswith("hey garfield") or isinstance(message.channel, discord.DMChannel): + question = message.content[12:] if message.content.lower().startswith("hey garfield") else message.content + answer = await generate_chat_response(question) + await message.channel.send(answer) + + if message.content.lower().startswith('garfpic '): + user = message.author.name + server = message.guild.name if message.guild else "Direct Message" + prompt = message.content[8:] + print(f"Image Request - User: {user}, Server: {server}, Prompt: {prompt}", flush=True) + await message.channel.send(f"`Please wait... image generation queued: {prompt}`") + await image_request_queue.put({'message': message, 'prompt': prompt}) + + if message.content.lower() == "lasagna": + await send_gif(message, "garfield lasagna") + + if message.content.lower() == "monday": + await send_gif(message, "garfield monday") + + if message.content.lower().startswith("garfgif "): + search_term = message.content[8:] + await send_gif(message, search_term) + + # Army of Dawn Server + if message.guild and message.guild.id == 719605634772893757: + + if "meow" in message.content.lower(): + print(f"Meow detected: {message.content}") + + meow_counts[str(message.author.id)] += 1 + + with open(counts_file, "w") as f: + json.dump(dict(meow_counts), f) + + if message.content.lower() == "meowcount": + response = f"My records show that <@{message.author.id}> has meowed {meow_counts[str(message.author.id)]} time(s). Have a nice day." + await message.channel.send(response) + + if message.content.lower() == "top meowers": + top_meowers = sorted(meow_counts.items(), key=itemgetter(1), reverse=True)[:10] + embed = discord.Embed(title="Top Meowers :cat:", color=0x000000) + for i, (user_id, meow_count) in enumerate(top_meowers): + user = await client.fetch_user(int(user_id)) + embed.add_field(name=f"{i+1}. {user.name}", value=f"{meow_count} meows", inline=False) + await message.channel.send(embed=embed) + + if message.content.lower() == "checking in": + # Check if user has already checked in + user_id = str(message.author.id) + if user_id in user_stats and user_stats[user_id]["check_in_time"] is not None: + await message.channel.send(f"{message.author.mention} You are already checked in. Please check out first.") + return + + # Record check-in time and add user to user_stats if not already there + check_in_time = datetime.utcnow().timestamp() + if user_id not in user_stats: + user_stats[user_id] = {"check_ins": 0, "total_time": 0, "check_in_time": None} + user_stats[user_id]["check_in_time"] = check_in_time + await message.channel.send(f"{message.author.mention} You have been checked in. Please mute your microphone.") + + elif message.content.lower() == "checking out": + # Check if user has already checked in + user_id = str(message.author.id) + if user_id not in user_stats or user_stats[user_id]["check_in_time"] is None: + await message.channel.send(f"{message.author.mention} You have not checked in yet. Please check in first.") + return + + # Record check-out time and update user stats + check_out_time = datetime.utcnow().timestamp() + check_in_time = user_stats[user_id]["check_in_time"] + time_delta = check_out_time - check_in_time + user_stats[user_id]["check_ins"] += 1 + user_stats[user_id]["total_time"] += time_delta + user_stats[user_id]["check_in_time"] = None + + # Save user stats to file + with open("user_stats.json", "w") as f: + json.dump(user_stats, f) + await message.channel.send(f"{message.author.mention} You have been checked out. Your session was {time_delta:.2f} seconds.") + + elif message.content.lower() == "stats": + stats_embed = discord.Embed(title="User stats :trophy:", color=0x000000) + sorted_user_stats = sorted(user_stats.items(), key=lambda x: x[1]["total_time"], reverse=True) + table_rows = [["Name", "Check-ins", "Total Time"]] + for user_id, stats in sorted_user_stats: + if stats["check_in_time"] is None: + total_time_seconds = stats["total_time"] + hours, total_time_seconds = divmod(total_time_seconds, 3600) + minutes, total_time_seconds = divmod(total_time_seconds, 60) + seconds, fractions = divmod(total_time_seconds, 1) + fractions_str = f"{fractions:.3f}"[2:] + username = client.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"]) + else: + username = client.get_user(int(user_id)).name + table_rows.append([username, "Currently checked in", "-"]) + table_columns = list(zip(*table_rows[1:])) + table_fields = table_rows[0] + for field, values in zip(table_fields, table_columns): + stats_embed.add_field(name=field, value="\n".join(values), inline=True) + await message.channel.send(embed=stats_embed) + +# GarfGifs +@client.event +async def send_gif(message, search_term): + lmt = 50 + ckey = "garfbot" + r = requests.get(f"https://tenor.googleapis.com/v2/search?q={search_term}&key={gapikey}&client_key={ckey}&limit={lmt}") + if r.status_code == 200: + top_50gifs = json.loads(r.content) + gif_url = random.choice(top_50gifs["results"])["itemurl"] + print(gif_url) + try: + await message.channel.send(gif_url) + except KeyError: + await message.channel.send("Oops, something went wrong.") + else: + await message.channel.send(f"`Oops, something went wrong. Error code: {r.status_code}`") + +# Run GarfBot +try: + client.run(garfkey) +except Exception as e: + e = str(e) + print(f"GarfBot Error: {e}") diff --git a/jonbot.py b/jonbot.py index 8e25459..d0a137b 100644 --- a/jonbot.py +++ b/jonbot.py @@ -4,16 +4,16 @@ import discord import os openai.api_key = config.OPENAI_TOKEN +jonkey = config.JONBOT_TOKEN intents = discord.Intents.default() intents.messages = True intents.message_content = True client = discord.Client(intents=intents) -jonkey = config.JONBOT_TOKEN @client.event async def on_ready(): - print(f"Logged in as {client.user.name} running gpt-3.5-turbo-0613.") + print(f"Logged in as {client.user.name} running gpt-3.5-turbo-0613.", flush=True) @client.event async def on_message(message): diff --git a/moneybot.py b/moneybot.py index 227a6f1..02e8bef 100644 --- a/moneybot.py +++ b/moneybot.py @@ -13,13 +13,12 @@ client = discord.Client(intents=intents) @client.event async def on_ready(): - print(f"Logged in as {client.user.name} running gpt-3.5-turbo-0613.") + print(f"Logged in as {client.user.name} running gpt-3.5-turbo-0613.", flush=True) @client.event async def on_message(message): if message.author == client.user: return - if message.content.lower().startswith("hey money") or isinstance(message.channel, discord.DMChannel): question = message.content[9:] if message.content.lower().startswith("hey money") else message.content try: