mirror of
https://github.com/Paillat-dev/Botator.git
synced 2026-01-02 09:16:19 +00:00
86 lines
3.1 KiB
Python
86 lines
3.1 KiB
Python
|
|
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)
|
||
|
|
|
||
|
|
|