import config import openai from openai import AsyncOpenAI import discord from discord.ext import commands import asyncio import logging from logging.handlers import TimedRotatingFileHandler 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 txtmodel = config.TXT_MODEL sysprompt = config.SYSTEM_PROMPT intents = discord.Intents.default() intents.messages = True intents.message_content = True client = commands.Bot( command_prefix=["Jonbot ", "jonbot ", "Jon", "jon"], case_insensitive=True, intents=intents, ) @client.event async def on_ready(): print(f"Logged in as {client.user.name} running {txtmodel}.", flush=True) @client.command(name="chat") async def jonchat(ctx, *, prompt): if "is this true" in prompt.lower(): messages = [msg async for msg in ctx.channel.history(limit=2)] prompt = messages[1].content prompt = f"Is this true: {prompt}" answer = await generate_chat(prompt) logger.info( f"Chat Request - User: {ctx.author.name}, Server: {ctx.guild.name}, Prompt: {prompt}" ) await ctx.reply(answer) @client.event async def on_message(message): if message.author == client.user: return content = message.content.strip() lower = content.lower() if lower.startswith("hey jon") or isinstance( message.channel, discord.DMChannel ): ctx = await client.get_context(message) await jonchat(ctx, prompt=content) oai = AsyncOpenAI( api_key=config.OPENAI_TOKEN, base_url=config.BASE_URL, ) async def generate_chat(question: str) -> str: try: response = await oai.chat.completions.create( model=txtmodel, messages=[ {"role": "system", "content": sysprompt}, {"role": "user", "content": question}, ], max_tokens=400, temperature=1.2, ) answer = response.choices[0].message.content return answer 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())