120 lines
3.1 KiB
Python
120 lines
3.1 KiB
Python
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())
|