# ai command cogs import logging import re import sys from datetime import datetime import discord import openai import requests from discord.ext import commands import ai_functions from constants import ( ASSISTANTS, DATA, GRAPHICS_PATH, INITIAL_TIME_WAIT, MASTER_TIMEOUT, OPENAICLIENT, SPECJALNE_ZIEMNIACZKI, WORD_REACTIONS, ) DM_MODE = "assistant" class Events(commands.Cog): def __init__(self, bot): self.bot = bot self.logger = logging.getLogger("discord") async def cog_load(self): self.logger.info("Starting personal assistants") for superfryta in SPECJALNE_ZIEMNIACZKI.values(): if superfryta[4] !="": self.logger.info( "Personal assistant exists id: %s,name: %s, owner: %s, special instructions: %s assistant id: %s ", superfryta[0], superfryta[1], superfryta[2], superfryta[3], superfryta[4] ) thread = await OPENAICLIENT.beta.threads.create() ASSISTANTS[superfryta[1]] = (superfryta[2], superfryta[0], superfryta[4], thread) else: self.logger.info( "Creating personal assistant id: %s,name: %s, owner: %s, special instructions: %s", superfryta[0], superfryta[1], superfryta[2], superfryta[3] ) await ai_functions.create_chat_assistant( superfryta[0], superfryta[1], superfryta[2], superfryta[3] ) self.logger.info("Started personal assistants") @commands.hybrid_command( name="switch_dm_mode", description="Jeśli nie wiesz jak użyć tej komendy to nawet nie próbuj", guild=discord.Object(id=664789470779932693), ) async def switch_dm_mode(self, ctx): if isinstance(ctx.channel, discord.DMChannel): pass #secrets, assistant, echo, dm #required parameter from list of values - assistant, dm_broadcast, echo @commands.Cog.listener() async def on_message(self, message): """ Handle incoming messages in a Discord server, perform various checks and actions based on the content and context of the message, and respond accordingly. :param message: The message object that is received when a user sends a message in a Discord server or DM. The code is checking various conditions and performing actions based on the content of the message and the context in which it was sent. It also includes TODOs for future improvements :return: The function `on_message` is being returned. """ vykidailo = False channel = None if message.author == self.bot.user: return if isinstance(message.author, discord.Member): for role in message.author.roles: if role.name == "Vykidailo": vykidailo = True if ("Conjurer Śpij Słodko Aniołku" in message.content) and vykidailo: sys.exit() # kanal bez bota if message.channel.id == 1095985579147141202: return # wentylacja if message.channel.id == 1083804024173764739: return # legendy if message.channel.id == 1084448332841230388: return # interrogation booth if message.channel.id == 1111625221171052595: return if isinstance(message.channel, discord.DMChannel): self.logger.info(message.author.id) for superfryta in SPECJALNE_ZIEMNIACZKI.values(): self.logger.info(superfryta[0]) if message.author.id == superfryta[0]: await self.bot.process_commands(message) await ai_functions.chat_with_assistant(message, superfryta[1]) return channel = self.bot.get_channel(1064888712565100614) #await channel.send("Słyszałem ja żem że: " + message.content) return channel = message.channel # await self.bot.process_commands(message) #uncomment to bilocate message.content = message.content.lower() tdelta = datetime.now() - MASTER_TIMEOUT tdelta = tdelta.total_seconds() if "opowiedz o fabryczce" in message.content: await message.reply(DATA["fabryczka"]) if "opowiedz mi o fabryczce" in message.content: await message.reply(DATA["fabryczka"]) if tdelta > INITIAL_TIME_WAIT: for word in WORD_REACTIONS: if re.search(r"\b" + word + r"\b", message.content): tdelta = datetime.now() - WORD_REACTIONS[word][2] tdelta = tdelta.total_seconds() security_clearance = WORD_REACTIONS[word][4] reaction = WORD_REACTIONS[word][3] if tdelta > WORD_REACTIONS[word][1]: # TODO: to zrobic reactiony self.logger.info("Ping z procedury reakcji") if reaction: emoji = self.bot.get_emoji(self.word_reactions[word][0]) await message.add_reaction(emoji) elif security_clearance and vykidailo: await message.reply(self.word_reactions[word][0]) elif not security_clearance: await message.reply(self.word_reactions[word][0]) self.word_reactions[word][2] = datetime.now() # TODO: drobne literówki, mentiony, spacja przed dwukropkiem. napraw. kondziu_mentioned = False for mention in message.mentions: if mention == self.bot.user: kondziu_mentioned = True if kondziu_mentioned or "conjurer:" in message.content: async with channel.typing(): self.logger.debug("Procedura chatu") message.content = message.content.replace("conjurer: ", "") if message.author.nick: username = message.author.nick else: username = message.author.name vykidailo = False bartender = False if kondziu_mentioned: prompt = message.clean_content else: prompt = message.content for role in message.author.roles: if role.name == "Vykidailo": vykidailo = True if role.name == "Bartender": bartender = True global MESSAGE_TABLE # pylint: disable=global-statement result, MESSAGE_TABLE = await ai_functions.handle_response( prompt, vykidailo, bartender, MESSAGE_TABLE, username, "CONVERSATION", ) if len(result) < 1500: await message.reply(result) else: while len(result) > 1500: await message.reply(result[:1500]) result = result[1500:] if "imaginuje sobie:" in message.content: async with channel.typing(): self.logger.info("Poczatek procedury obrazkowej") message.content = message.content.replace("imaginuje sobie: ", "") self.logger.debug("Wywolanie obrazka: %s", message.content) try: response = await OPENAICLIENT.images.generate( model="dall-e-3", prompt=message.content, size="1024x1024", quality="standard", n=1, ) except openai.APITimeoutError as e: # Handle timeout error, e.g. retry or log await message.reply( f"*Kondziu patrzy na terminal, czeka, czeka, czeka,.... Jeszcze chwile czeka Przypierdala w niego pięścią....* Nie mogę się połączyć z Openai spróbuj od nowa. *Na ekranie pojawia się*: {e}" ) except openai.APIConnectionError as e: await message.reply( f"*Kondziu patrzy na terminal, chwile się zastanawia. Przypierdala w niego pięścią....* Nie mogę się połączyć z Openai. *Na ekranie pojawia się*: {e}" ) except openai.BadRequestError as e: # Handle invalid request error, e.g. validate parameters or log if message.author.nick: username = message.author.nick else: username = message.author.name resp, _ = await ai_functions.handle_response( f"Wytlumacz jakie sa zasady dotyczące treści które możesz generować używając Dalle. Wytłumacz błąd {e} prostym językiem. Przeproś za nadmierną cenzurę. Wytłumacz co mogło być nie tak w prompcie '{message.content}'", True, True, MESSAGE_TABLE, username, "RANDOM", ) await message.reply( f"Sorki, cenzura: {resp}. Jak chcesz to są kanały na nudle #sexy-foteczky i #kanal-do-fapania *Na ekranie pojawia się: {e}" ) except openai.AuthenticationError as e: # Handle authentication error, e.g. check credentials or log await message.reply( f"*Kondziu patrzy na terminal, chwile się zastanawia. Przypierdala w niego pięścią....* Wołaj szefa - coś się z hasłem zjebało. *Na terminalu pojawia się:* {e}" ) except openai.PermissionDeniedError as e: # Handle permission error, e.g. check scope or log await message.reply( ( f"*Kondziu patrzy na terminal, chwile się zastanawia. Przypierdala w niego pięścią....* Wołaj szefa - coś się z uprawnieniami zjebało. *Na terminalu pojawia się:* {e}" ) ) except openai.RateLimitError as e: await message.reply( f"*Kondziu patrzy na terminal* Wołaj szefa. Zapłacić rachunki za AI trzeba. Jak chcesz to się na #zebranie dorzuć. {e}" ) except openai.APIError as e: # Handle API error, e.g. retry or log await message.reply( f"*Kondziu nurkuje za bar, terminal wybucha. Przed tobą ląduje pergamin zapisany pięknym gotykiem a na nim*: {e}" ) if response: self.logger.info(response) image_url = response.data[0].url image_desc = response.data[0].revised_prompt self.logger.debug("Wynikowy obrazek pod url: %s", image_url) response = requests.get(image_url, timeout=360) temp_file_name = message.content + ".png" temp_file_name = GRAPHICS_PATH + message.content + ".png" with open(temp_file_name, "wb") as dalle_file: dalle_file.write(response.content) self.logger.info("Koniec procedury obrazkowej.") fnord = discord.File( temp_file_name, spoiler=False, description=message.content ) await message.reply(f"{image_desc}", file=fnord) # *=========================================== Define Functions async def setup(bot): logger = logging.getLogger("discord") await bot.add_cog(Events(bot)) logger.info("Loading ai events module done")