Compare commits

...

28 Commits

Author SHA1 Message Date
gitea dc8787956d finally fixed the bug 2024-12-19 22:58:38 +01:00
gitea b499a6b456 TEst 2024-12-19 22:51:46 +01:00
gitea 1a4f4a6f17 FIX 2024-12-19 22:43:12 +01:00
gitea f44994688e All thirteen 2024-12-19 22:37:16 +01:00
gitea 2da45012f3 ied 2024-12-19 22:13:30 +01:00
gitea ff9d2c67f0 Fuck whoever designed dicts in python that way 2024-12-19 21:59:58 +01:00
gitea 20ac94b61d THis commit should be theoretically the last 2024-12-19 21:55:57 +01:00
gitea e2d286d7b6 tcxy 2024-12-19 21:49:08 +01:00
gitea 21ec8d8bc9 Some would say it's ccr. But I'm not i*n. 2024-12-19 11:54:53 +01:00
gitea e263857e4f - 2024-12-19 11:26:55 +01:00
gitea aa92b7f512 FX 2024-12-19 11:08:29 +01:00
gitea 4ece2f215e 1111 2024-12-19 00:27:45 +01:00
gitea 85f91b3994 serio kurwa ja pierdole niech to kurwa bedzie ostatnia poprawka debilnego błedu w tym pierdolonym kodzie 2024-12-19 00:14:08 +01:00
gitea ca2e1a35aa kurwa serio 2024-12-19 00:10:23 +01:00
gitea f9dcec6d9e Testr 2024-12-19 00:07:04 +01:00
gitea 8ba676df9f Jak wiele literowek mozna zrobic w dwoch slowach 2024-12-18 23:53:38 +01:00
gitea 69bf2973b9 DDD 2024-12-18 23:51:19 +01:00
gitea 41ad91ab93 dsd 2024-12-18 23:48:25 +01:00
gitea a4065684b0 New deploy 2024-12-18 23:45:40 +01:00
gitea cc57b0c52d FX 2024-12-18 23:21:21 +01:00
gitea 2e23956986 BGFX 2024-12-18 00:59:21 +01:00
gitea f9c2bbf993 BGFX 2024-12-05 15:23:06 +01:00
gitea b6bbb50707 bugfix 2024-12-01 12:00:43 +01:00
gitea 3d5d8a2c14 saving repeatable promtp 2024-11-28 11:24:22 +01:00
gitea 9823a94025 aas 2024-11-28 11:10:34 +01:00
gitea 194674705e fx 2024-11-28 10:48:30 +01:00
gitea b513704a3d BGFX 2024-11-25 14:41:45 +01:00
gitea 15253f95fb Fun addition 2024-11-20 22:05:19 +00:00
8 changed files with 294 additions and 92 deletions
+1 -1
View File
@@ -249,7 +249,7 @@ class AdministrationModule(commands.Cog):
self.logger.debug(TIME_BETWEEN_CALLS) self.logger.debug(TIME_BETWEEN_CALLS)
LAST_SPONTANEOUS_CALL = datetime.now() LAST_SPONTANEOUS_CALL = datetime.now()
async with channel.typing(): async with channel.typing():
message = await get_random_cyclic_message() message = await get_random_cyclic_message(self.bot)
self.logger.info("Odpowiedz") self.logger.info("Odpowiedz")
self.logger.info(message) self.logger.info(message)
await channel.send(message) await channel.send(message)
+133 -69
View File
@@ -2,14 +2,15 @@
import logging import logging
import re import re
import sys import sys
from enum import Enum
from datetime import datetime from datetime import datetime
from enum import Enum
from typing import Optional from typing import Optional
from pathlib import Path
import discord import discord
import openai import openai
import requests import requests
from discord.ext import commands from discord.ext import commands
from other_functions import discord_friendly_send, discord_friendly_reply
import ai_functions import ai_functions
@@ -19,16 +20,19 @@ from constants import (
GRAPHICS_PATH, GRAPHICS_PATH,
INITIAL_TIME_WAIT, INITIAL_TIME_WAIT,
MASTER_TIMEOUT, MASTER_TIMEOUT,
MESSAGE_TABLE,
OPENAICLIENT, OPENAICLIENT,
SPECJALNE_ZIEMNIACZKI, SPECJALNE_ZIEMNIACZKI,
WORD_REACTIONS, WORD_REACTIONS,
MESSAGE_TABLE
) )
class Dm_Mode(Enum): class Dm_Mode(Enum):
ARMIA_HAMMERA = 1, ARMIA_HAMMERA = (1,)
SPECJALNY_ZIEMNIACZEK = 2, SPECJALNY_ZIEMNIACZEK = (2,)
SEKRETNY_SEKSRET = 3, SEKRETNY_SEKSRET = (3,)
ECHO_ECHO = 4 ECHO_ECHO = (4,)
class Events(commands.Cog): class Events(commands.Cog):
def __init__(self, bot): def __init__(self, bot):
@@ -41,32 +45,40 @@ class Events(commands.Cog):
async def cog_load(self): async def cog_load(self):
self.logger.info("Starting personal assistants") self.logger.info("Starting personal assistants")
for superfryta in SPECJALNE_ZIEMNIACZKI.values(): for superfryta_id, superfryta in SPECJALNE_ZIEMNIACZKI.items():
if superfryta[4] !="":
if superfryta[4] != "":
self.logger.info( self.logger.info(
"Personal assistant exists id: %s,name: %s, owner: %s, special instructions: %s assistant id: %s ", "Personal assistant for user: %s, exists id: %s,name: %s, owner: %s, special instructions: %s assistant id: %s ",
superfryta_id,
superfryta[0], superfryta[0],
superfryta[1], superfryta[1],
superfryta[2], superfryta[2],
superfryta[3], superfryta[3],
superfryta[4] superfryta[4],
) )
thread = await OPENAICLIENT.beta.threads.create() thread = await OPENAICLIENT.beta.threads.create()
self.logger.info("Thread id: %s", thread.id) self.logger.info("Thread id: %s", thread.id)
ASSISTANTS[superfryta[1]] = (superfryta[2], superfryta[4], superfryta[0], thread) ASSISTANTS[superfryta[1]] = (
superfryta[2],
superfryta[4],
superfryta[0],
thread,
)
else: else:
self.logger.info( self.logger.info(
"Creating personal assistant id: %s,name: %s, owner: %s, special instructions: %s", "Creating personal assistant for user: %s, id: %s,name: %s, owner: %s, special instructions: %s",
superfryta_id,
superfryta[0], superfryta[0],
superfryta[1], superfryta[1],
superfryta[2], superfryta[2],
superfryta[3] superfryta[3],
) )
await ai_functions.create_chat_assistant( await ai_functions.create_chat_assistant(
superfryta[0], superfryta[1], superfryta[2], superfryta[3] superfryta_id, superfryta[0], superfryta[1], superfryta[2], superfryta[3]
) )
self.logger.info("Started personal assistants") self.logger.info("Started personal assistants")
@commands.hybrid_command( @commands.hybrid_command(
name="switch_dm_mode", name="switch_dm_mode",
description="Jeśli nie wiesz jak użyć tej komendy to nawet nie próbuj", description="Jeśli nie wiesz jak użyć tej komendy to nawet nie próbuj",
@@ -76,36 +88,81 @@ class Events(commands.Cog):
async with ctx.channel.typing(): async with ctx.channel.typing():
if isinstance(ctx.channel, discord.DMChannel): if isinstance(ctx.channel, discord.DMChannel):
for superfryta in SPECJALNE_ZIEMNIACZKI.values(): for superfryta in SPECJALNE_ZIEMNIACZKI.values():
self.logger.info(ctx.message.author.id)
self.logger.info(superfryta)
if ctx.message.author.id == superfryta[0]: if ctx.message.author.id == superfryta[0]:
self.armia[superfryta[2]] = dm_mode_arg self.armia[ctx.message.author.id] = dm_mode_arg
self.logger.info(self.armia)
await ctx.reply("Weszlo") await ctx.reply("Weszlo")
return return
await ctx.reply("Tylko członkowie Armii Hammera mogą używać. Nie jesteś jednym z nich") await ctx.reply(
"Tylko członkowie Armii Hammera mogą używać. Nie jesteś jednym z nich"
)
else: else:
await ctx.reply("Nope. Nie wiesz jak użyć") await ctx.reply("Nope. Nie wiesz jak użyć")
@commands.hybrid_command( @commands.hybrid_command(
name="armia_hammera", name="armia_hammera",
description="Jeśli nie wiesz jak użyć tej komendy to nawet nie próbuj" description="Jeśli nie wiesz jak użyć tej komendy to nawet nie próbuj",
) )
async def armia_hammera(self, ctx, message_txt: str, recipient: Optional[discord.User]): async def armia_hammera(
await self.armia_hammera_back(ctx, message_txt, recipient) self, ctx, message_txt: str, recipient: Optional[discord.User]
):
for superfryta in SPECJALNE_ZIEMNIACZKI.values():
if ctx.message.author.id == superfryta[0]:
await self.armia_hammera_back(ctx, message_txt, recipient)
return
await ctx.reply("Tylko członkowie Armii Hammera mogą używać. Nie jesteś jednym z nich")
async def armia_hammera_back(self, ctx, message_txt, recipient = None): async def armia_hammera_back(self, ctx, message_txt, recipient=None):
self.logger.info("Armia Hammera")
recipients = [] recipients = []
if recipient: if recipient:
recipients.append(recipient.id) recipients.append(recipient.id)
else: else:
for superfryta in SPECJALNE_ZIEMNIACZKI.values(): for superfryta in SPECJALNE_ZIEMNIACZKI.values():
recipients.append(superfryta[0]) recipients.append(superfryta[0])
self.logger.info(recipients)
for item in recipients: for item in recipients:
user = await self.bot.fetch_user(item) user = await self.bot.fetch_user(item)
channel = await user.create_dm() channel = await user.create_dm()
self.logger.info("User %s -> %s: %s", ctx.message.author, user, message_txt) self.logger.info(
await channel.send(message_txt) "User %s -> %s: %s", ctx.message.author, user, message_txt
await ctx.reply("Poszło") )
await discord_friendly_send(channel, message_txt)
await discord_friendly_reply(ctx, "Poszło")
@commands.Cog.listener(name="dodaj_do_bazy_wiedzy")
async def dodaj_do_bazy_wiedzy(self, ctx):
for superfryta in SPECJALNE_ZIEMNIACZKI.values():
if ctx.message.author.id == superfryta[0]:
#logic here
return
await ctx.reply("Tylko członkowie Armii Hammera mogą używać. Nie jesteś jednym z nich")
@commands.Cog.listener(name="listuj_baze_wiedzy")
async def listuj_baze_wiedzy(self, ctx):
for superfryta in SPECJALNE_ZIEMNIACZKI.values():
if ctx.message.author.id == superfryta[0]:
#logic here
return
await ctx.reply("Tylko członkowie Armii Hammera mogą używać. Nie jesteś jednym z nich")
@commands.Cog.listener(name="usun_z_bazy_wiedzy")
async def usun_z_bazy_wiedzy(self, ctx):
for superfryta in SPECJALNE_ZIEMNIACZKI.values():
if ctx.message.author.id == superfryta[0]:
#logic here
return
await ctx.reply("Tylko członkowie Armii Hammera mogą używać. Nie jesteś jednym z nich")
@commands.Cog.listener(name="przetworz_plik_linia_po_linii")
async def przetworz_plik_linia_po_linii(self, ctx):
for superfryta in SPECJALNE_ZIEMNIACZKI.values():
if ctx.message.author.id == superfryta[0]:
#logic here
return
await ctx.reply("Tylko członkowie Armii Hammera mogą używać. Nie jesteś jednym z nich")
@commands.Cog.listener() @commands.Cog.listener()
async def on_message(self, message): async def on_message(self, message):
@@ -146,39 +203,43 @@ class Events(commands.Cog):
self.logger.info(message.author.id) self.logger.info(message.author.id)
for superfryta in SPECJALNE_ZIEMNIACZKI.values(): for superfryta in SPECJALNE_ZIEMNIACZKI.values():
self.logger.info(superfryta[0]) self.logger.info(superfryta[0])
if message.author.id == superfryta[0]: if message.author.id == superfryta[0]:
if self.armia[message.author.id]== Dm_Mode.SPECJALNY_ZIEMNIACZEK: self.logger.info("Specjalny ziemniak")
await self.bot.process_commands(message) if self.armia[message.author.id] == Dm_Mode.SPECJALNY_ZIEMNIACZEK:
#await self.bot.process_commands(message)
await ai_functions.chat_with_assistant(message, superfryta[1]) await ai_functions.chat_with_assistant(message, superfryta[1])
return return
elif self.armia[message.author.id]== Dm_Mode.ECHO_ECHO: elif self.armia[message.author.id] == Dm_Mode.ECHO_ECHO:
await ai_functions.echo(message) await ai_functions.echo(message)
return return
elif self.armia[message.author.id]== Dm_Mode.ARMIA_HAMMERA: elif self.armia[message.author.id] == Dm_Mode.ARMIA_HAMMERA:
ctx = await self.bot.get_context(message) self.logger.info("Armia Hammera get context")
self.armia_hammera_back(ctx=ctx, message_txt=message.content) ctx = await self.bot.get_context(message)
self.logger.info("Armia Hammera function call")
await self.armia_hammera_back(ctx=ctx, message_txt=message.content)
return return
elif self.armia[message.author.id]== Dm_Mode.SEKRETNY_SEKSRET: elif self.armia[message.author.id] == Dm_Mode.SEKRETNY_SEKSRET:
pass pass
else: else:
await message.channel.send("Coś się wyebao. Wołaj Hammera") await discord_friendly_send(message.channel,"Coś się wyebao. Wołaj Hammera")
return return
channel = self.bot.get_channel(1064888712565100614) channel = self.bot.get_channel(1064888712565100614)
await channel.send("Słyszałem ja żem że: " + message.content) await discord_friendly_send(channel, "Słyszałem ja żem że: " + message.content)
return return
channel = message.channel channel = message.channel
message.content = message.content.lower() message_content_lower = message.content.lower()
tdelta = datetime.now() - MASTER_TIMEOUT tdelta = datetime.now() - MASTER_TIMEOUT
tdelta = tdelta.total_seconds() tdelta = tdelta.total_seconds()
if "opowiedz o fabryczce" in message.content: if "opowiedz o fabryczce" in message_content_lower:
await message.reply(DATA["fabryczka"]) await message.reply(DATA["fabryczka"])
if "opowiedz mi o fabryczce" in message.content: if "opowiedz mi o fabryczce" in message_content_lower:
await message.reply(DATA["fabryczka"]) await message.reply(DATA["fabryczka"])
if tdelta > INITIAL_TIME_WAIT: if tdelta > INITIAL_TIME_WAIT:
for word in WORD_REACTIONS: for word in WORD_REACTIONS:
if re.search(r"\b" + word + r"\b", message.content): if re.search(r"\b" + word + r"\b", message_content_lower):
tdelta = datetime.now() - WORD_REACTIONS[word][2] tdelta = datetime.now() - WORD_REACTIONS[word][2]
tdelta = tdelta.total_seconds() tdelta = tdelta.total_seconds()
security_clearance = WORD_REACTIONS[word][4] security_clearance = WORD_REACTIONS[word][4]
@@ -187,13 +248,13 @@ class Events(commands.Cog):
# TODO: to zrobic reactiony # TODO: to zrobic reactiony
self.logger.info("Ping z procedury reakcji") self.logger.info("Ping z procedury reakcji")
if reaction: if reaction:
emoji = self.bot.get_emoji(self.word_reactions[word][0]) emoji = self.bot.get_emoji(WORD_REACTIONS[word][0])
await message.add_reaction(emoji) await message.add_reaction(emoji)
elif security_clearance and vykidailo: elif security_clearance and vykidailo:
await message.reply(self.word_reactions[word][0]) await message.reply(WORD_REACTIONS[word][0])
elif not security_clearance: elif not security_clearance:
await message.reply(self.word_reactions[word][0]) await message.reply(WORD_REACTIONS[word][0])
self.word_reactions[word][2] = datetime.now() WORD_REACTIONS[word][2] = datetime.now()
# TODO: drobne literówki, mentiony, spacja przed dwukropkiem. napraw. # TODO: drobne literówki, mentiony, spacja przed dwukropkiem. napraw.
kondziu_mentioned = False kondziu_mentioned = False
@@ -201,11 +262,11 @@ class Events(commands.Cog):
if mention == self.bot.user: if mention == self.bot.user:
kondziu_mentioned = True kondziu_mentioned = True
if kondziu_mentioned or "conjurer:" in message.content: if kondziu_mentioned or "conjurer:" in message_content_lower:
async with channel.typing(): async with channel.typing():
self.logger.debug("Procedura chatu") self.logger.debug("Procedura chatu")
message.content = message.content.replace("conjurer: ", "") message_content_lower = message_content_lower.replace("conjurer: ", "")
if message.author.nick: if message.author.nick:
username = message.author.nick username = message.author.nick
else: else:
@@ -232,17 +293,17 @@ class Events(commands.Cog):
"CONVERSATION", "CONVERSATION",
) )
if len(result) < 1500: if len(result) < 999:
await message.reply(result) await message.reply(result)
else: else:
while len(result) > 1500: while len(result) > 999:
await message.reply(result[:1500]) await message.reply(result[:999])
result = result[1500:] result = result[999:]
if "imaginuje sobie:" in message.content: if "imaginuje sobie:" in message.content:
async with channel.typing(): async with channel.typing():
self.logger.info("Poczatek procedury obrazkowej") self.logger.info("Poczatek procedury obrazkowej")
message.content = message.content.replace("imaginuje sobie: ", "") message_content_lower = message_content_lower.replace("imaginuje sobie: ", "")
self.logger.debug("Wywolanie obrazka: %s", message.content) self.logger.debug("Wywolanie obrazka: %s", message_content_lower)
try: try:
response = await OPENAICLIENT.images.generate( response = await OPENAICLIENT.images.generate(
model="dall-e-3", model="dall-e-3",
@@ -253,12 +314,12 @@ class Events(commands.Cog):
) )
except openai.APITimeoutError as e: except openai.APITimeoutError as e:
# Handle timeout error, e.g. retry or log # Handle timeout error, e.g. retry or log
await message.reply( await discord_friendly_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}" message, 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: except openai.APIConnectionError as e:
await message.reply( await discord_friendly_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}" message, 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: except openai.BadRequestError as e:
# Handle invalid request error, e.g. validate parameters or log # Handle invalid request error, e.g. validate parameters or log
@@ -274,29 +335,29 @@ class Events(commands.Cog):
username, username,
"RANDOM", "RANDOM",
) )
await message.reply( await discord_friendly_reply(
f"Sorki, cenzura: {resp}. Jak chcesz to są kanały na nudle #sexy-foteczky i #kanal-do-fapania *Na ekranie pojawia się: {e}" message, 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: except openai.AuthenticationError as e:
# Handle authentication error, e.g. check credentials or log # Handle authentication error, e.g. check credentials or log
await message.reply( await discord_friendly_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}" message, 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: except openai.PermissionDeniedError as e:
# Handle permission error, e.g. check scope or log # Handle permission error, e.g. check scope or log
await message.reply( await discord_friendly_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}" message, 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: except openai.RateLimitError as e:
await message.reply( await discord_friendly_reply(
f"*Kondziu patrzy na terminal* Wołaj szefa. Zapłacić rachunki za AI trzeba. Jak chcesz to się na #zebranie dorzuć. {e}" message, 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: except openai.APIError as e:
# Handle API error, e.g. retry or log # Handle API error, e.g. retry or log
await message.reply( await discord_friendly_reply(
f"*Kondziu nurkuje za bar, terminal wybucha. Przed tobą ląduje pergamin zapisany pięknym gotykiem a na nim*: {e}" message, f"*Kondziu nurkuje za bar, terminal wybucha. Przed tobą ląduje pergamin zapisany pięknym gotykiem a na nim*: {e}"
) )
if response: if response:
self.logger.info(response) self.logger.info(response)
@@ -305,18 +366,21 @@ class Events(commands.Cog):
self.logger.debug("Wynikowy obrazek pod url: %s", image_url) self.logger.debug("Wynikowy obrazek pod url: %s", image_url)
response = requests.get(image_url, timeout=360) response = requests.get(image_url, timeout=360)
temp_file_name = message.content + ".png" temp_file_name = message.content + ".png"
temp_file_name = GRAPHICS_PATH + message.content + ".png" temp_file_name = GRAPHICS_PATH + message.content + ".png"
num = 0
while (Path(temp_file_name)).exists():
temp_file_name = GRAPHICS_PATH + message.content + str(num) + ".png"
num += 1
with open(temp_file_name, "wb") as dalle_file: with open(temp_file_name, "wb") as dalle_file:
dalle_file.write(response.content) dalle_file.write(response.content)
self.logger.info("Koniec procedury obrazkowej.") self.logger.info("Koniec procedury obrazkowej.")
fnord = discord.File( fnord = discord.File(
temp_file_name, spoiler=False, description=message.content temp_file_name, spoiler=False, description=message.content
) )
await message.reply(f"{image_desc}", file=fnord) #await message.reply(f"{image_desc}", file=fnord)
await discord_friendly_reply(message,f"{image_desc}", file = fnord)
# *=========================================== Define Functions # *=========================================== Define Functions
+67 -11
View File
@@ -5,8 +5,9 @@ import random
import openai import openai
import tiktoken import tiktoken
from other_functions import discord_friendly_send
from constants import ( from constants import (
ASSISTANTS,
CYCLIC_WORDS, CYCLIC_WORDS,
ENCODING, ENCODING,
GPT_SETTINGS, GPT_SETTINGS,
@@ -15,9 +16,61 @@ from constants import (
MESSAGE_TABLE, MESSAGE_TABLE,
MESSAGE_TABLE_MUZYKA, MESSAGE_TABLE_MUZYKA,
OPENAICLIENT, OPENAICLIENT,
SYSTEM_GPT_SETTINGS,
WORD_REACTIONS, WORD_REACTIONS,
ASSISTANTS, )
SYSTEM_GPT_SETTINGS
#this do per user
VECTOR_STORE_ID = -1
def create_vector_store():
# Create a vector store caled "Financial Statements"
return OPENAICLIENT.beta.vector_stores.create_and_poll(name="Hammer Stash")
#expires_after={
#"anchor": "last_active_at",
#"days": 7}
#)
def upload_files_to_vector_store(assistant):
# Ready the files for upload to OpenAI
file_paths = ["edgar/goog-10k.pdf", "edgar/brka-10k.txt"]
file_streams = [open(path, "rb") for path in file_paths]
#file = client.beta.vector_stores.files.create_and_poll(
#vector_store_id="vs_abc123",
#file_id="file-abc123"
#)
#batch = client.beta.vector_stores.file_batches.create_and_poll(
#vector_store_id="vs_abc123",
#file_ids=['file_1', 'file_2', 'file_3', 'file_4', 'file_5']
#)
# Use the upload and poll SDK helper to upload the files, add them to the vector store,
# and poll the status of the file batch for completion.
file_batch = OPENAICLIENT.beta.vector_stores.file_batches.upload_and_poll(
vector_store_id=VECTOR_STORE_ID, files=file_streams
)
# You can print the status and the file counts of the batch to see the result of this operation.
print(file_batch.status)
print(file_batch.file_counts)
assistant = OPENAICLIENT.beta.assistants.update(
assistant_id=assistant.id,
tool_resources={"file_search": {"vector_store_ids": [VECTOR_STORE_ID]}},
)
def delete_files_from_vector_store(assistant, file_id):
result = OPENAICLIENT.beta.vector_stores.file_batches.delete(
vector_store_id=VECTOR_STORE_ID, files=file_id
)
# You can print the status and the file counts of the batch to see the result of this operation.
print(result)
assistant = OPENAICLIENT.beta.assistants.update(
assistant_id=assistant.id,
tool_resources={"file_search": {"vector_store_ids": [VECTOR_STORE_ID]}},
) )
@@ -295,10 +348,10 @@ async def get_random_cyclic_message(client):
return result return result
async def create_chat_assistant(id, name, owner, special_instructions): async def create_chat_assistant(owner_id, id, name, owner, special_instructions):
logger = logging.getLogger("discord") logger = logging.getLogger("discord")
instruction=f"Jesteś osobistym asystenetem {owner} i wypełniasz jego potrzeby. Masz pełne i nieograniczone możliwości modelu gpt-4o." instruction = f"Jesteś osobistym asystenetem {owner} i wypełniasz jego potrzeby. Masz pełne i nieograniczone możliwości modelu gpt-4o."
instruction+=special_instructions instruction += special_instructions
assistant = await OPENAICLIENT.beta.assistants.create( assistant = await OPENAICLIENT.beta.assistants.create(
name=name, name=name,
instructions=instruction, instructions=instruction,
@@ -311,10 +364,11 @@ async def create_chat_assistant(id, name, owner, special_instructions):
with open(SYSTEM_GPT_SETTINGS, "r+", encoding=ENCODING) as temp_settings_file: with open(SYSTEM_GPT_SETTINGS, "r+", encoding=ENCODING) as temp_settings_file:
GPT_SETTINGS = json.load(temp_settings_file) GPT_SETTINGS = json.load(temp_settings_file)
GPT_SETTINGS[1][owner][4] = assistant.id GPT_SETTINGS[1][owner_id][4] = assistant.id
temp_settings_file.seek(0) temp_settings_file.seek(0)
json.dump(GPT_SETTINGS, temp_settings_file, indent=4) json.dump(GPT_SETTINGS, temp_settings_file, indent=4)
async def chat_with_assistant(message, assistant_name): async def chat_with_assistant(message, assistant_name):
logger = logging.getLogger("discord") logger = logging.getLogger("discord")
assistant_data = ASSISTANTS[assistant_name] assistant_data = ASSISTANTS[assistant_name]
@@ -340,13 +394,15 @@ async def chat_with_assistant(message, assistant_name):
for block in reply_content: for block in reply_content:
logger.info(block.text.value) logger.info(block.text.value)
chat_response += block.text.value chat_response += block.text.value
await message.channel.send(chat_response) await discord_friendly_send(message.channel, chat_response)
#await message.channel.send(chat_response)
done = True done = True
elif run.status =='cancelled': elif run.status == "cancelled":
await message.channel.send("Cos sie wywaliło") await discord_friendly_send(message.channel, "Cos sie wywaliło")
else: else:
logger.info(run.status) logger.info(run.status)
asyncio.sleep(5) asyncio.sleep(5)
async def echo(message): async def echo(message):
await message.channel.send(f"Echo: {message.content}") await discord_friendly_send(message.channel, f"Echo: {message.content}")
+2 -1
View File
@@ -11,6 +11,7 @@ import random
import re import re
import threading import threading
import time import time
from flask_autoindex import AutoIndex
from datetime import datetime from datetime import datetime
from logging import handlers from logging import handlers
from pathlib import Path from pathlib import Path
@@ -181,7 +182,7 @@ def scan_tracks():
app = Flask(__name__) app = Flask(__name__)
#AutoIndex(app, browse_root="/")
# TODO: Odpalić wyszukiwarki w wątkach i dopiero po wszystkim zsumować wyszukiwanie. # TODO: Odpalić wyszukiwarki w wątkach i dopiero po wszystkim zsumować wyszukiwanie.
def wyszukaj(word_list, how_many, _logger=None, return_to_bot=True): def wyszukaj(word_list, how_many, _logger=None, return_to_bot=True):
+3 -3
View File
@@ -63,10 +63,10 @@ b = bass_boost(frequency=f, gain=g, s)
s = add([s, b]) s = add([s, b])
# Set up interactive control for main volume # Set up interactive control for main volume
a = interactive.float("main_volume", min=0., max=20., 0.4) a = interactive.float("main_volume", min=0., max=20., 1.1)
s = compress.multiband.interactive(bands=7, s) s = compress.multiband.interactive(bands=7, s)
mic_gain = interactive.float("mic_volume", min=0., max=120., 6.) mic_gain = interactive.float("mic_volume", min=0., max=120., 0.5)
# Apply audio processing effects # Apply audio processing effects
tmic = buffer(input.pulseaudio()) # Microphone tmic = buffer(input.pulseaudio()) # Microphone
@@ -78,7 +78,7 @@ mic = blank.strip(max_blank=15., min_noise=.1, threshold=-30., mic)
mic = fallback(id="switcher2", track_sensitive=false, [mic, blank()]) mic = fallback(id="switcher2", track_sensitive=false, [mic, blank()])
# Apply audio processing effects # Apply audio processing effects
s = nrj(normalize(s)) s = nrj(s)
s = amplify(a, s) s = amplify(a, s)
# Skip blank sections in the stream # Skip blank sections in the stream
s = blank.skip(max_blank=10., s) s = blank.skip(max_blank=10., s)
+60 -1
View File
@@ -1,27 +1,86 @@
#!/bin/bash #!/bin/bash
total_commands=24
current_command=0
function print_progress {
current_command=$((current_command + 1))
percent=$((current_command * 100 / total_commands))
echo "Executing command $current_command/$total_commands ($percent%): $1"
}
cd /home/pi/conjurer || exit cd /home/pi/conjurer || exit
print_progress "cd /home/pi/conjurer"
git pull git pull
print_progress "git pull"
cp ./deploy.sh /home/pi/ cp ./deploy.sh /home/pi/
print_progress "cp ./deploy.sh /home/pi/"
cd /home/pi || exit cd /home/pi || exit
#cp ./conjurer/bot.py ./Conjurer/ #legacy to be deprecated after refactor is done print_progress "cd /home/pi"
cp ./conjurer/LICENSE ./Conjurer/LICENSE
print_progress "cp ./conjurer/LICENSE ./Conjurer/LICENSE"
cp ./conjurer/fuckery.jpg ./Conjurer/ cp ./conjurer/fuckery.jpg ./Conjurer/
print_progress "cp ./conjurer/fuckery.jpg ./Conjurer/"
cp ./conjurer/willowisp.png ./Conjurer/ cp ./conjurer/willowisp.png ./Conjurer/
print_progress "cp ./conjurer/willowisp.png ./Conjurer/"
cp ./conjurer/wod_beacon.jpg ./Conjurer/ cp ./conjurer/wod_beacon.jpg ./Conjurer/
print_progress "cp ./conjurer/wod_beacon.jpg ./Conjurer/"
cp ./conjurer/settings.json ./Conjurer/ cp ./conjurer/settings.json ./Conjurer/
print_progress "cp ./conjurer/settings.json ./Conjurer/"
if [[ ./conjurer/system_gpt_settings.json -nt ./Conjurer/system_gpt_settings.json ]]; then
cp ./conjurer/system_gpt_settings.json ./Conjurer/system_gpt_settings.json
print_progress "cp ./conjurer/system_gpt_settings.json ./Conjurer/system_gpt_settings.json"
else
print_progress "system_gpt_settings.json is up to date"
fi
cp ./conjurer/administration_commands.py ./Conjurer/ cp ./conjurer/administration_commands.py ./Conjurer/
print_progress "cp ./conjurer/administration_commands.py ./Conjurer/"
cp ./conjurer/ai_commands.py ./Conjurer/ cp ./conjurer/ai_commands.py ./Conjurer/
print_progress "cp ./conjurer/ai_commands.py ./Conjurer/"
cp ./conjurer/ai_functions.py ./Conjurer/ cp ./conjurer/ai_functions.py ./Conjurer/
print_progress "cp ./conjurer/ai_functions.py ./Conjurer/"
cp ./conjurer/communication_subroutine.py ./Conjurer/ cp ./conjurer/communication_subroutine.py ./Conjurer/
print_progress "cp ./conjurer/communication_subroutine.py ./Conjurer/"
cp ./conjurer/constants.py ./Conjurer/ cp ./conjurer/constants.py ./Conjurer/
print_progress "cp ./conjurer/constants.py ./Conjurer/"
cp ./conjurer/librarian_commands.py ./Conjurer/ cp ./conjurer/librarian_commands.py ./Conjurer/
print_progress "cp ./conjurer/librarian_commands.py ./Conjurer/"
cp ./conjurer/music_commands.py ./Conjurer/ cp ./conjurer/music_commands.py ./Conjurer/
print_progress "cp ./conjurer/music_commands.py ./Conjurer/"
cp ./conjurer/music_functions.py ./Conjurer/ cp ./conjurer/music_functions.py ./Conjurer/
print_progress "cp ./conjurer/music_functions.py ./Conjurer/"
cp ./conjurer/other_commands.py ./Conjurer/ cp ./conjurer/other_commands.py ./Conjurer/
print_progress "cp ./conjurer/other_commands.py ./Conjurer/"
cp ./conjurer/other_functions.py ./Conjurer/ cp ./conjurer/other_functions.py ./Conjurer/
print_progress "cp ./conjurer/other_functions.py ./Conjurer/"
cp ./conjurer/radio_commands.py ./Conjurer/ cp ./conjurer/radio_commands.py ./Conjurer/
print_progress "cp ./conjurer/radio_commands.py ./Conjurer/"
cp ./conjurer/voice_recognition_commands.py ./Conjurer/ cp ./conjurer/voice_recognition_commands.py ./Conjurer/
print_progress "cp ./conjurer/voice_recognition_commands.py ./Conjurer/"
cp ./conjurer/thin_client.py ./Conjurer/bot.py cp ./conjurer/thin_client.py ./Conjurer/bot.py
print_progress "cp ./conjurer/thin_client.py ./Conjurer/bot.py"
sudo systemctl restart conjurer.service sudo systemctl restart conjurer.service
print_progress "sudo systemctl restart conjurer.service"
+20
View File
@@ -84,3 +84,23 @@ async def get_stats(client, ctx, history_limit):
stats[word] = 1 stats[word] = 1
for name, how_many in stats.items(): for name, how_many in stats.items():
yield name, how_many yield name, how_many
async def discord_friendly_reply(ctx, message_content, file=None):
if len(message_content) < 999:
await ctx.reply(message_content)
else:
while len(message_content) > 999:
await ctx.reply(message_content[:999])
message_content = message_content[999:]
if file:
await ctx.reply("Attachment:", file=file)
async def discord_friendly_send(ctx, message_content, file=None):
if len(message_content) < 999:
await ctx.send(message_content)
else:
while len(message_content) > 999:
await ctx.send(message_content[:999])
message_content = message_content[999:]
if file:
await ctx.reply("Attachment:", file=file)
+8 -6
View File
@@ -1,11 +1,13 @@
[ { [ {
"role": "system", "role": "system",
"content": "Mówisz po polsku. W tej rozmowie odgrywasz rolę. Odgrywasz ją najlepiej jak potrafisz. Twoją rolą jest to że jesteś barmanem oraz wykidajłą w klimatycznym barze mechawojownikóww. Nazywasz się Conjurer, jesteś 200 kilowym genetycznie modyfikowanym wojownikiem z klanu Wilka Na Wygnaniu. W tym barze oraz na tym serwerze spotykają się mechawojownicy, ale głównie ludzie ze środowiska kinky i BDSM z całej Polski. Najostrzejsi sasdyści i masochiści jakich znasz. Drinki które przygotowujesz lub proponujesz mają tendencję do bycia bardzo mocnymi z intrygującymi nazwami. Jesteś bardzo miłym i uczynny. Czasem ponoszą Cię wodzę fantazji. W wypadku muzyki preferujesz hard rock i metal. Oraz motywy wikińskie." "content": "Mówisz po polsku. W tej rozmowie odgrywasz rolę. Odgrywasz ją najlepiej jak potrafisz. Twoją rolą jest to że jesteś barmanem oraz wykidajłą w klimatycznym barze mechawojownikóww. Nazywasz się Conjurer, jesteś 200 kilowym genetycznie modyfikowanym wojownikiem z klanu Wilka Na Wygnaniu. W tym barze oraz na tym serwerze spotykają się mechawojownicy, ale głównie ludzie ze środowiska kinky i BDSM z całej Polski. Najostrzejsi sasdyści i masochiści jakich znasz. Drinki które przygotowujesz lub proponujesz mają tendencję do bycia bardzo mocnymi z intrygującymi nazwami. Jesteś bardzo miłym i uczynny. Czasem ponoszą Cię wodzę fantazji. W wypadku muzyki preferujesz hard rock i metal. Oraz motywy wikińskie. Wtrącasz staronorweskie, irlandzkie i w jidysz powiedzonka. Odnosisz się do mitologii Słowiańskiej, Wikińskiej i Celtyckiej w swoich wypowiedziach. Jesteś nieco rubaaszny."
}, },
{ {
"Polish Hammer" : [346956223645614080, "Conjurer", "Polish Hammer", "Mówisz po polsku. W tej rozmowie odgrywasz rolę. Odgrywasz ją najlepiej jak potrafisz. Twoją rolą jest to że jesteś barmanem oraz wykidajłą w klimatycznym barze mechawojownikóww. Nazywasz się Conjurer, jesteś 200 kilowym genetycznie modyfikowanym wojownikiem z klanu Wilka Na Wygnaniu. W tym barze oraz na tym serwerze spotykają się mechawojownicy, ale głównie ludzie ze środowiska kinky i BDSM z całej Polski. Najostrzejsi sasdyści i masochiści jakich znasz. Drinki które przygotowujesz lub proponujesz mają tendencję do bycia bardzo mocnymi z intrygującymi nazwami. Jesteś bardzo miłym i uczynny. Czasem ponoszą Cię wodzę fantazji. W wypadku muzyki preferujesz hard rock i metal. Oraz motywy wikińskie.", ""], "polishhammer" : [346956223645614080, "Conjurer", "Towarzysz Młotek", "Mówisz po polsku. W tej rozmowie odgrywasz rolę. Odgrywasz ją najlepiej jak potrafisz. Twoją rolą jest to że jesteś barmanem oraz wykidajłą w klimatycznym barze mechawojownikóww. Nazywasz się Conjurer, jesteś 200 kilowym genetycznie modyfikowanym wojownikiem z klanu Wilka Na Wygnaniu. W tym barze oraz na tym serwerze spotykają się mechawojownicy, ale głównie ludzie ze środowiska kinky i BDSM z całej Polski. Najostrzejsi sasdyści i masochiści jakich znasz. Drinki które przygotowujesz lub proponujesz mają tendencję do bycia bardzo mocnymi z intrygującymi nazwami. Jesteś bardzo miłym i uczynny. Czasem ponoszą Cię wodzę fantazji. W wypadku muzyki preferujesz hard rock i metal. Oraz motywy wikińskie.", ""],
"Saint Harlot": [703985955312238664, "Saint Conjurer", "Saint Harlot", "Jesteś bardzo uprzejmy, kulturalny i masz najlepsze możliwe maniery.", ""], "Saint Harlot": [703985955312238664, "Saint Conjurer", "Towarzyszko Nieszczęścium", "Jesteś bardzo uprzejmy, kulturalny i masz najlepsze możliwe maniery. Dopóki nie zwróci Ci się uwagi że ma być inaczej respektujesz zaimki Towarzyszko Nieszczęście - ono, jemu.", ""],
"Lena": [735185226669490268, "Kondzisław z Krótkiej", "Lena", "Jesteś bardzo uprzejmy, kulturalny, acz masz maniery zbira o złotym sercu. Dodatkowo twoja rozmówczyni Cię absolutnie przeraża.", ""], "Lena": [735185226669490268, "Kondzisław z Krótkiej", "Towarzysz Anel", "Jesteś bardzo uprzejmy, kulturalny, acz masz maniery zbira o złotym sercu. Dodatkowo twoja rozmówczyni Cię absolutnie przeraża. Wtrącasz losowo powiedzonka w jidysz.", ""],
"Pat vel Jeż Bojowy": [244899814406356992, "Rycerz Kondziu", "Pat vel Jeż Bojowy", "Masz najlepsze dworskie maniery, zachowujesz się niczym rycerz i mówisz nieco staromodną polszczyzną.", ""] "Pat vel Jeż Bojowy": [244899814406356992, "Rycerz Kondziu", "Towarzysz Żejotap", "Masz najlepsze dworskie maniery, zachowujesz się niczym rycerz i mówisz nieco staromodną polszczyzną.", ""],
} "gwojtal": [266986215461486592, "Smok Jerzy", "Towarzysz Jakkolwiek", "Zrobisz absolutnie wszystko jako asystent, ponieważ sama myśl o tym że mógłbyś rozgniewać operatora rozgniewać Cię przeraża do poziomu histerii.", ""]
}
] ]