mirror of
https://github.com/migatu/conjurer.git
synced 2026-07-14 21:38:38 +00:00
Main refactoring
This commit is contained in:
+234
-1
@@ -1 +1,234 @@
|
||||
#ai command cogs
|
||||
# ai command cogs
|
||||
import logging
|
||||
import re
|
||||
import sys
|
||||
from datetime import datetime
|
||||
|
||||
import discord
|
||||
import openai
|
||||
import requests
|
||||
from discord.ext import commands
|
||||
|
||||
from ai_functions import handle_response
|
||||
from constants import (
|
||||
DATA,
|
||||
GRAPHICS_PATH,
|
||||
INITIAL_TIME_WAIT,
|
||||
MASTER_TIMEOUT,
|
||||
OPENAICLIENT,
|
||||
)
|
||||
|
||||
|
||||
class Events(commands.Cog):
|
||||
def __init__(self, bot):
|
||||
self.bot = bot
|
||||
self.logger = logging.getLogger("discord")
|
||||
|
||||
@commands.Cog.listener()
|
||||
async def on_ready(self):
|
||||
print("Ready!")
|
||||
print("Logged in as ---->", self.bot.user)
|
||||
print("ID:", self.bot.user.id)
|
||||
|
||||
@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):
|
||||
if message.author.id == 346956223645614080:
|
||||
await message.reply("Witam witam")
|
||||
return
|
||||
else:
|
||||
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)
|
||||
|
||||
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 self.word_reactions:
|
||||
if re.search(r"\b" + word + r"\b", message.content):
|
||||
tdelta = datetime.now() - self.word_reactions[word][2]
|
||||
tdelta = tdelta.total_seconds()
|
||||
security_clearance = self.word_reactions[word][4]
|
||||
reaction = self.word_reactions[word][3]
|
||||
if tdelta > self.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 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 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")
|
||||
|
||||
Reference in New Issue
Block a user