import config import openai import discord import asyncio import logging from logging.handlers import TimedRotatingFileHandler from openai import AsyncOpenAI logger = logging.getLogger("garflog") logger.setLevel(logging.INFO) formatter = logging.Formatter( "%(asctime)s [%(levelname)s] %(message)s", datefmt="%Y-%m-%d %H:%M:%S" ) file_handler = TimedRotatingFileHandler( "jonbot.log", when="midnight", interval=1, backupCount=7, delay=True, ) file_handler.setFormatter(formatter) console_handler = logging.StreamHandler() console_handler.setFormatter(formatter) logger.addHandler(file_handler) logger.addHandler(console_handler) if not logger.hasHandlers(): logger.addHandler(file_handler) logger.addHandler(console_handler) openai.api_key = config.OPENAI_TOKEN jonkey = config.JONBOT_TOKEN model = config.TXT_MODEL intents = discord.Intents.default() intents.messages = True intents.message_content = True client = discord.Client(intents=intents) @client.event async def on_ready(): print(f"Logged in as {client.user.name} running {model}.", flush=True) @client.event async def on_message(message): if message.author == client.user: return if message.content.lower().startswith("hey jon") or isinstance(message.channel, discord.DMChannel): question = message.content[7:] if message.content.lower().startswith("hey jon") else message.content try: response = openai.ChatCompletion.create( model=model, messages=[ {"role": "system", "content": "Pretend you are friendly Jon Arbuckle."}, {"role": "user", "content": f"{question}"} ], max_tokens=400 ) answer = response['choices'][0]['message']['content'] answer = answer.replace("AI language model", "American citizen") answer = answer.replace("language model AI", "citizen of the United States") await message.channel.send(answer) except Exception as e: e = str(e) await message.channel.send(f"`JonBot Error: {e}`") oai = AsyncOpenAI( api_key=config.OPENAI_TOKEN, base_url=config.BASE_URL, ) async def generate_chat(self, question: str) -> str: try: response = await oai.chat.completions.create( model=self.txtmodel, messages=[ {"role": "system", "content": self.sysprompt}, {"role": "user", "content": question}, ], max_tokens=400, temperature=1.2, ) answer = response.choices[0].message.content return answer.replace("an AI language model", "a cartoon animal") except openai.BadRequestError as e: logger.error(e) return f"`JonBot Error: {e}`" except openai.APIError as e: logger.error(e) return "`JonBot Error: Odie`" except Exception as e: logger.error(e) return "`JonBot Error: Liz`" async def jonbot_connect(): while True: try: await client.start(jonkey) except Exception as e: e = str(e) logger.error(f"Jonbot couldn't connect! {e}") await asyncio.sleep(60) if __name__ == "__main__": asyncio.run(jonbot_connect())