diff --git a/administration_commands.py b/administration_commands.py index 6113f05..c964d48 100644 --- a/administration_commands.py +++ b/administration_commands.py @@ -249,7 +249,7 @@ class AdministrationModule(commands.Cog): self.logger.debug(TIME_BETWEEN_CALLS) LAST_SPONTANEOUS_CALL = datetime.now() 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(message) await channel.send(message) diff --git a/ai_commands.py b/ai_commands.py index 02cafb3..ec91cf3 100644 --- a/ai_commands.py +++ b/ai_commands.py @@ -2,14 +2,15 @@ import logging import re import sys -from enum import Enum from datetime import datetime +from enum import Enum from typing import Optional - +from pathlib import Path import discord import openai import requests from discord.ext import commands +from other_functions import discord_friendly_send, discord_friendly_reply import ai_functions @@ -19,16 +20,19 @@ from constants import ( GRAPHICS_PATH, INITIAL_TIME_WAIT, MASTER_TIMEOUT, + MESSAGE_TABLE, OPENAICLIENT, SPECJALNE_ZIEMNIACZKI, WORD_REACTIONS, - MESSAGE_TABLE ) + + class Dm_Mode(Enum): - ARMIA_HAMMERA = 1, - SPECJALNY_ZIEMNIACZEK = 2, - SEKRETNY_SEKSRET = 3, - ECHO_ECHO = 4 + ARMIA_HAMMERA = (1,) + SPECJALNY_ZIEMNIACZEK = (2,) + SEKRETNY_SEKSRET = (3,) + ECHO_ECHO = (4,) + class Events(commands.Cog): def __init__(self, bot): @@ -41,32 +45,40 @@ class Events(commands.Cog): async def cog_load(self): self.logger.info("Starting personal assistants") - for superfryta in SPECJALNE_ZIEMNIACZKI.values(): - if superfryta[4] !="": + for superfryta_id, superfryta in SPECJALNE_ZIEMNIACZKI.items(): + + if superfryta[4] != "": 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[1], superfryta[2], superfryta[3], - superfryta[4] - + superfryta[4], ) thread = await OPENAICLIENT.beta.threads.create() 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: 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[1], superfryta[2], - superfryta[3] + superfryta[3], ) 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") + @commands.hybrid_command( name="switch_dm_mode", 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(): if isinstance(ctx.channel, discord.DMChannel): for superfryta in SPECJALNE_ZIEMNIACZKI.values(): + self.logger.info(ctx.message.author.id) + self.logger.info(superfryta) 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") 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: await ctx.reply("Nope. Nie wiesz jak użyć") @commands.hybrid_command( 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]): - await self.armia_hammera_back(ctx, message_txt, recipient) + async def armia_hammera( + 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 = [] if recipient: recipients.append(recipient.id) else: for superfryta in SPECJALNE_ZIEMNIACZKI.values(): recipients.append(superfryta[0]) - + self.logger.info(recipients) for item in recipients: user = await self.bot.fetch_user(item) channel = await user.create_dm() - self.logger.info("User %s -> %s: %s", ctx.message.author, user, message_txt) - await channel.send(message_txt) - await ctx.reply("Poszło") + self.logger.info( + "User %s -> %s: %s", ctx.message.author, user, message_txt + ) + 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() async def on_message(self, message): @@ -146,39 +203,43 @@ class Events(commands.Cog): self.logger.info(message.author.id) for superfryta in SPECJALNE_ZIEMNIACZKI.values(): self.logger.info(superfryta[0]) + if message.author.id == superfryta[0]: - if self.armia[message.author.id]== Dm_Mode.SPECJALNY_ZIEMNIACZEK: - await self.bot.process_commands(message) + self.logger.info("Specjalny ziemniak") + 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]) 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) return - elif self.armia[message.author.id]== Dm_Mode.ARMIA_HAMMERA: - ctx = await self.bot.get_context(message) - self.armia_hammera_back(ctx=ctx, message_txt=message.content) + elif self.armia[message.author.id] == Dm_Mode.ARMIA_HAMMERA: + self.logger.info("Armia Hammera get context") + 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 - elif self.armia[message.author.id]== Dm_Mode.SEKRETNY_SEKSRET: + elif self.armia[message.author.id] == Dm_Mode.SEKRETNY_SEKSRET: pass else: - await message.channel.send("Coś się wyebao. Wołaj Hammera") + await discord_friendly_send(message.channel,"Coś się wyebao. Wołaj Hammera") return 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 channel = message.channel - message.content = message.content.lower() + message_content_lower = message.content.lower() tdelta = datetime.now() - MASTER_TIMEOUT tdelta = tdelta.total_seconds() - if "opowiedz o fabryczce" in message.content: + if "opowiedz o fabryczce" in message_content_lower: 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"]) if tdelta > INITIAL_TIME_WAIT: 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 = tdelta.total_seconds() security_clearance = WORD_REACTIONS[word][4] @@ -187,13 +248,13 @@ class Events(commands.Cog): # TODO: to zrobic reactiony self.logger.info("Ping z procedury reakcji") 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) elif security_clearance and vykidailo: - await message.reply(self.word_reactions[word][0]) + await message.reply(WORD_REACTIONS[word][0]) elif not security_clearance: - await message.reply(self.word_reactions[word][0]) - self.word_reactions[word][2] = datetime.now() + await message.reply(WORD_REACTIONS[word][0]) + WORD_REACTIONS[word][2] = datetime.now() # TODO: drobne literówki, mentiony, spacja przed dwukropkiem. napraw. kondziu_mentioned = False @@ -201,11 +262,11 @@ class Events(commands.Cog): if mention == self.bot.user: kondziu_mentioned = True - if kondziu_mentioned or "conjurer:" in message.content: + if kondziu_mentioned or "conjurer:" in message_content_lower: async with channel.typing(): self.logger.debug("Procedura chatu") - message.content = message.content.replace("conjurer: ", "") + message_content_lower = message_content_lower.replace("conjurer: ", "") if message.author.nick: username = message.author.nick else: @@ -232,17 +293,17 @@ class Events(commands.Cog): "CONVERSATION", ) - if len(result) < 1500: + if len(result) < 999: await message.reply(result) else: - while len(result) > 1500: - await message.reply(result[:1500]) - result = result[1500:] + while len(result) > 999: + await message.reply(result[:999]) + result = result[999:] 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) + message_content_lower = message_content_lower.replace("imaginuje sobie: ", "") + self.logger.debug("Wywolanie obrazka: %s", message_content_lower) try: response = await OPENAICLIENT.images.generate( model="dall-e-3", @@ -253,12 +314,12 @@ class Events(commands.Cog): ) 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}" + await discord_friendly_reply( + 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: - 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}" + await discord_friendly_reply( + 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: # Handle invalid request error, e.g. validate parameters or log @@ -274,29 +335,29 @@ class Events(commands.Cog): 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}" + await discord_friendly_reply( + 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: # 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}" + await discord_friendly_reply( + 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: # 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: - 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}" + await discord_friendly_reply( + 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: # 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}" + await discord_friendly_reply( + message, 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) @@ -305,18 +366,21 @@ class Events(commands.Cog): 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" - + 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: 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) - - + #await message.reply(f"{image_desc}", file=fnord) + await discord_friendly_reply(message,f"{image_desc}", file = fnord) # *=========================================== Define Functions diff --git a/ai_functions.py b/ai_functions.py index eb1395f..d02b148 100644 --- a/ai_functions.py +++ b/ai_functions.py @@ -5,8 +5,9 @@ import random import openai import tiktoken - +from other_functions import discord_friendly_send from constants import ( + ASSISTANTS, CYCLIC_WORDS, ENCODING, GPT_SETTINGS, @@ -15,9 +16,61 @@ from constants import ( MESSAGE_TABLE, MESSAGE_TABLE_MUZYKA, OPENAICLIENT, + SYSTEM_GPT_SETTINGS, 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 -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") - 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 = f"Jesteś osobistym asystenetem {owner} i wypełniasz jego potrzeby. Masz pełne i nieograniczone możliwości modelu gpt-4o." + instruction += special_instructions assistant = await OPENAICLIENT.beta.assistants.create( name=name, 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: 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) json.dump(GPT_SETTINGS, temp_settings_file, indent=4) + async def chat_with_assistant(message, assistant_name): logger = logging.getLogger("discord") assistant_data = ASSISTANTS[assistant_name] @@ -340,13 +394,15 @@ async def chat_with_assistant(message, assistant_name): for block in reply_content: logger.info(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 - elif run.status =='cancelled': - await message.channel.send("Cos sie wywaliło") + elif run.status == "cancelled": + await discord_friendly_send(message.channel, "Cos sie wywaliło") else: logger.info(run.status) asyncio.sleep(5) + async def echo(message): - await message.channel.send(f"Echo: {message.content}") + await discord_friendly_send(message.channel, f"Echo: {message.content}") diff --git a/conjurer_musician/conjurer_musician.py b/conjurer_musician/conjurer_musician.py index 1e46469..32b89ec 100644 --- a/conjurer_musician/conjurer_musician.py +++ b/conjurer_musician/conjurer_musician.py @@ -11,6 +11,7 @@ import random import re import threading import time +from flask_autoindex import AutoIndex from datetime import datetime from logging import handlers from pathlib import Path @@ -181,7 +182,7 @@ def scan_tracks(): app = Flask(__name__) - +#AutoIndex(app, browse_root="/") # TODO: Odpalić wyszukiwarki w wątkach i dopiero po wszystkim zsumować wyszukiwanie. def wyszukaj(word_list, how_many, _logger=None, return_to_bot=True): diff --git a/conjurer_musician/radio_conjurer.liq b/conjurer_musician/radio_conjurer.liq index 2db40b0..d536607 100644 --- a/conjurer_musician/radio_conjurer.liq +++ b/conjurer_musician/radio_conjurer.liq @@ -63,10 +63,10 @@ b = bass_boost(frequency=f, gain=g, s) s = add([s, b]) # 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) -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 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()]) # Apply audio processing effects -s = nrj(normalize(s)) +s = nrj(s) s = amplify(a, s) # Skip blank sections in the stream s = blank.skip(max_blank=10., s) diff --git a/deploy.sh b/deploy.sh index b483556..ff0e8d9 100755 --- a/deploy.sh +++ b/deploy.sh @@ -1,27 +1,86 @@ #!/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 +print_progress "cd /home/pi/conjurer" + git pull +print_progress "git pull" + cp ./deploy.sh /home/pi/ +print_progress "cp ./deploy.sh /home/pi/" + 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/ +print_progress "cp ./conjurer/fuckery.jpg ./Conjurer/" + cp ./conjurer/willowisp.png ./Conjurer/ +print_progress "cp ./conjurer/willowisp.png ./Conjurer/" + cp ./conjurer/wod_beacon.jpg ./Conjurer/ +print_progress "cp ./conjurer/wod_beacon.jpg ./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/ +print_progress "cp ./conjurer/administration_commands.py ./Conjurer/" + cp ./conjurer/ai_commands.py ./Conjurer/ +print_progress "cp ./conjurer/ai_commands.py ./Conjurer/" + cp ./conjurer/ai_functions.py ./Conjurer/ +print_progress "cp ./conjurer/ai_functions.py ./Conjurer/" + cp ./conjurer/communication_subroutine.py ./Conjurer/ +print_progress "cp ./conjurer/communication_subroutine.py ./Conjurer/" + cp ./conjurer/constants.py ./Conjurer/ +print_progress "cp ./conjurer/constants.py ./Conjurer/" + cp ./conjurer/librarian_commands.py ./Conjurer/ +print_progress "cp ./conjurer/librarian_commands.py ./Conjurer/" + cp ./conjurer/music_commands.py ./Conjurer/ +print_progress "cp ./conjurer/music_commands.py ./Conjurer/" + cp ./conjurer/music_functions.py ./Conjurer/ +print_progress "cp ./conjurer/music_functions.py ./Conjurer/" + cp ./conjurer/other_commands.py ./Conjurer/ +print_progress "cp ./conjurer/other_commands.py ./Conjurer/" + cp ./conjurer/other_functions.py ./Conjurer/ +print_progress "cp ./conjurer/other_functions.py ./Conjurer/" + cp ./conjurer/radio_commands.py ./Conjurer/ +print_progress "cp ./conjurer/radio_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 +print_progress "cp ./conjurer/thin_client.py ./Conjurer/bot.py" sudo systemctl restart conjurer.service +print_progress "sudo systemctl restart conjurer.service" \ No newline at end of file diff --git a/other_functions.py b/other_functions.py index 28957d6..263217e 100644 --- a/other_functions.py +++ b/other_functions.py @@ -84,3 +84,23 @@ async def get_stats(client, ctx, history_limit): stats[word] = 1 for name, how_many in stats.items(): 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) diff --git a/system_gpt_settings.json b/system_gpt_settings.json index e72d41b..3de9b8f 100644 --- a/system_gpt_settings.json +++ b/system_gpt_settings.json @@ -1,11 +1,13 @@ [ { "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.", ""], - "Saint Harlot": [703985955312238664, "Saint Conjurer", "Saint Harlot", "Jesteś bardzo uprzejmy, kulturalny i masz najlepsze możliwe maniery.", ""], - "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.", ""], - "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ą.", ""] - } + "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", "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", "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", "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.", ""] + +} ] \ No newline at end of file