import asyncio import os import re import discord import datetime import json from src.utils.misc import moderate, ModerationError, Hasher from src.utils.variousclasses import models, characters, apis from src.guild import Guild from src.utils.openaicaller import openai_caller from src.functionscalls import ( call_function, functions, server_normal_channel_functions, FuntionCallError, ) class Chat: def __init__(self, bot, message: discord.Message): self.bot = bot self.message: discord.Message = message self.guild = Guild(self.message.guild.id) self.author = message.author self.is_bots_thread = False async def getSupplementaryData(self) -> None: """ This function gets various contextual data that will be needed later on - The original message (if the message is a reply to a previous message from the bot) - The channel the message was sent in (if the message was sent in a thread) """ if isinstance(self.message.channel, discord.Thread): if self.message.channel.owner_id == self.bot.user.id: self.is_bots_thread = True self.channelIdForSettings = self.message.channel.parent_id else: self.channelIdForSettings = self.message.channel.id try: self.original_message = await self.message.channel.fetch_message( self.message.reference.message_id ) except: self.original_message = None if ( self.original_message != None and self.original_message.author.id == self.bot.user.id ): self.original_message = None async def preExitCriteria(self) -> bool: """ Returns True if any of the exit criterias are met This checks if the guild has the needed settings for the bot to work """ returnCriterias = [] returnCriterias.append(self.message.author.id == self.bot.user.id) returnCriterias.append(self.api_key == None) returnCriterias.append(self.is_active == 0) return any(returnCriterias) async def postExitCriteria(self) -> bool: """ Returns True if any of the exit criterias are met (their opposite is met but there is a not in front of the any() function) This checks if the bot should actuallly respond to the message or if the message doesn't concern the bot """ returnCriterias = [] returnCriterias.append( self.guild.sanitizedChannels.get(str(self.message.channel.id), None) != None ) returnCriterias.append( self.message.content.find("<@" + str(self.bot.user.id) + ">") != -1 ) returnCriterias.append(self.original_message != None) returnCriterias.append(self.is_bots_thread) return not any(returnCriterias) async def getSettings(self): self.settings = self.guild.getChannelInfo(str(self.channelIdForSettings)) self.model = self.settings["model"] self.character = self.settings["character"] self.openai_api_key = self.guild.api_keys.get("openai", None)