Compare commits

...

94 Commits

Author SHA1 Message Date
gitea cf27b2f3f9 Finally fixed this bug. The AI can now play perfectly. 2025-01-31 20:08:38 +01:00
gitea 4aa442a802 Maybe fix 2025-01-31 20:00:05 +01:00
gitea 3964336370 Maybe this is the fix ? 2025-01-31 19:53:15 +01:00
gitea 625579ebbb another attempt to fix the bug 2025-01-31 19:49:01 +01:00
gitea ed71f7871d test 2025-01-31 19:44:49 +01:00
gitea ff8d1abf8a test 2025-01-31 19:42:21 +01:00
gitea a74b18f62a Maybe this will fix 2025-01-31 19:38:09 +01:00
gitea 323a1ac021 Fixing logging issues in music_functions.py and other_functions.py 2025-01-31 19:30:48 +01:00
gitea 993b303e2f Inside joke very boomer much wow 2025-01-21 21:51:26 +01:00
gitea 3b7248cb00 Fixit 2025-01-21 21:47:13 +01:00
gitea e35e028001 Fixc
Fixc
2025-01-21 21:36:07 +01:00
gitea 2c19e4565e Add comment 2025-01-21 16:53:09 +01:00
gitea 853e952128 Hej hoppsan! 2025-01-21 16:51:33 +01:00
gitea 041544917c Literowka 2025-01-21 15:44:43 +00:00
gitea 3ed4dcfbb4 add exception handling 2025-01-13 20:34:26 +00:00
gitea 276e814515 Fix old bug 2025-01-10 21:34:56 +01:00
gitea 5dd2aadd7c Arguments added to the utility. 2025-01-08 12:01:01 +01:00
gitea 19fbd27f3a FIXED! 2025-01-08 11:45:41 +01:00
gitea 8deea0584c LGFIX 2025-01-08 11:42:08 +01:00
gitea 9f0fadf908 Logs additional 2025-01-08 11:41:14 +01:00
gitea d176b762f7 Merge branch 'main' of https://github.com/migatu/conjurer 2025-01-08 11:35:01 +01:00
gitea 85d276f2d4 Function for idv3 and bugfix 2025-01-08 11:34:40 +01:00
gitea b031bd9fdc BGFX 2025-01-07 14:59:59 +00:00
gitea b3722deef2 Merge branch 'main' of https://github.com/migatu/conjurer 2025-01-07 14:54:47 +00:00
gitea 961ca74c14 BGFX 2025-01-07 14:54:38 +00:00
gitea 0f596cbdba Merge branch 'main' of https://github.com/migatu/conjurer 2025-01-05 22:09:53 +01:00
gitea 85be1ce9fc Small fix 2025-01-05 22:09:43 +01:00
gitea 5983439a5d Services 2025-01-05 20:40:42 +00:00
gitea fd4c066008 Status report script 2025-01-05 20:30:05 +00:00
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
gitea 69afb00897 bgfx 1 2024-11-16 23:10:32 +01:00
gitea e4a47d025c safe 2024-11-15 19:59:50 +01:00
gitea 4f109da335 bgfx 2024-11-15 19:01:53 +01:00
gitea 230242bf5c finished secret dm handling 2024-11-15 18:47:29 +01:00
gitea e290e7d656 ADdded smth 2024-11-15 18:33:31 +01:00
gitea 62f6b64bfb Fix 2024-11-15 15:44:17 +01:00
gitea cd307d642e fix 2024-11-15 15:41:56 +01:00
gitea 81c43aadcc xxx 2024-11-15 14:01:25 +01:00
gitea 73057921ec Optional argument fix 2024-11-15 13:30:23 +01:00
gitea cd1beac93f small fx 2024-11-15 11:16:40 +01:00
gitea 784163b9c9 Enum fix 2024-11-15 11:13:41 +01:00
gitea 8429d4efd5 Start of Armia Hammera 2024-11-15 11:10:49 +01:00
gitea 06192c41ad Semi-fnal commit for today 2024-11-15 01:12:37 +01:00
gitea 22730776d4 Fix ? 2024-11-15 01:08:34 +01:00
gitea a72dba291b tst 2024-11-15 01:00:41 +01:00
gitea b98e3e4ebc Fix 2024-11-15 00:56:23 +01:00
gitea ff2669d079 fix 2024-11-15 00:53:22 +01:00
gitea 05166859a3 :) 2024-11-15 00:43:57 +01:00
gitea 4a6afa14cc bold commiting at the end of the day 2024-11-15 00:37:14 +01:00
gitea 5a74e813eb Work ongoing. 2024-11-14 23:13:18 +01:00
gitea be3f639573 aaaaaaa 2024-11-14 23:05:06 +01:00
gitea 620e6ddc06 Największy hit zespuło 100 tvarzy grzybiarzy - i nie jest o piosenka o zgubieniu czapeczki 2024-11-14 23:03:31 +01:00
gitea 6a6821ce4c Another one 2024-11-14 22:59:39 +01:00
gitea 2bb65bbc40 Another attempt 2024-11-14 22:58:14 +01:00
gitea aa63ffc754 aha 2024-11-14 22:56:34 +01:00
gitea 0dbb79719b Test 2024-11-14 22:56:05 +01:00
gitea 06d17a2e4d step forward 2024-11-14 22:34:17 +01:00
gitea ecc2e1f107 Deploy 2024-11-14 22:15:41 +01:00
gitea a981209399 Maybe ready ? 2024-11-14 22:11:37 +01:00
gitea 885f492f69 nxtfx 2024-11-14 22:00:37 +01:00
gitea 5363969456 fx 2024-11-14 21:59:09 +01:00
gitea 637926973c tst 2024-11-14 21:48:24 +01:00
gitea 9701c7233f and there 2024-11-14 21:02:48 +01:00
gitea e6960c98b8 almost there 2024-11-14 21:00:53 +01:00
gitea 3f4018fa00 fz 2024-11-14 20:59:13 +01:00
gitea 9af2d34179 Fix 2024-11-14 20:56:49 +01:00
gitea 93db61558c A niech spierdala 2024-11-14 20:54:05 +01:00
24 changed files with 693 additions and 158 deletions
+1
View File
@@ -201,3 +201,4 @@ cr_results.json
not_in_db.json not_in_db.json
rr_results.json rr_results.json
s_results.json s_results.json
*.bak
+39 -2
View File
@@ -11,7 +11,15 @@ import numpy as np
from discord.ext import commands, tasks from discord.ext import commands, tasks
from ai_functions import get_random_cyclic_message from ai_functions import get_random_cyclic_message
from constants import ENCODING, LOGFILE, LOGSTORE, MEMORY_FIVE_MUZYKA, MEMORY_FIVE_SIARA, LAST_SPONTANEOUS_CALL, TIME_BETWEEN_CALLS from constants import (
ENCODING,
LAST_SPONTANEOUS_CALL,
LOGFILE,
LOGSTORE,
MEMORY_FIVE_MUZYKA,
MEMORY_FIVE_SIARA,
TIME_BETWEEN_CALLS,
)
class AdministrationModule(commands.Cog): class AdministrationModule(commands.Cog):
@@ -19,11 +27,33 @@ class AdministrationModule(commands.Cog):
self.bot = bot self.bot = bot
self.logger = logging.getLogger(logger_name) self.logger = logging.getLogger(logger_name)
@commands.hybrid_command(
name="galeria_slaw",
description="Jeśli nie wiesz jak użyć tej komendy to nawet nie próbuj",
guild=discord.Object(id=664789470779932693),
)
@commands.has_any_role('Nocna Zmiana', 'Jarl', 'Thane' , 'Bartender')
async def galeria_slaw(self, ctx):
if isinstance(ctx.channel, discord.DMChannel):
for guild in self.bot.guilds:
async for entry in guild.bans(limit=1500):
fnord = discord.File(
"/home/pi/Conjurer/niech_spierdala.png",
spoiler=False,
description="Niech spierdala",
)
await ctx.reply(
f"User: {entry.user} wyjebany z serwera {guild.name} za {entry.reason} ",
file=fnord,
)
@commands.hybrid_command( @commands.hybrid_command(
name="update_banlist", name="update_banlist",
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",
guild=discord.Object(id=664789470779932693), guild=discord.Object(id=664789470779932693),
) )
@commands.has_any_role('Jarl', 'Thane')
async def update_banlist(self, ctx): async def update_banlist(self, ctx):
""" """
Update a banlist in a Discord guild from preprovided list in channel. Update a banlist in a Discord guild from preprovided list in channel.
@@ -92,6 +122,7 @@ class AdministrationModule(commands.Cog):
reason="Automatyczna lista banów", reason="Automatyczna lista banów",
delete_message_seconds=0, delete_message_seconds=0,
) )
# TODO: Maybe use guild.bulk_ban ?
cunter_counter += 1 cunter_counter += 1
except discord.NotFound: except discord.NotFound:
self.logger.info( self.logger.info(
@@ -107,6 +138,12 @@ class AdministrationModule(commands.Cog):
f"Nie mam na serwerze {guild} uprawnień do banowania. :()" f"Nie mam na serwerze {guild} uprawnień do banowania. :()"
) )
await ctx.send("Zrobione tak czy inaczej") await ctx.send("Zrobione tak czy inaczej")
@commands.hybrid_command(
name="archive_channel",
description="Jeśli nie wiesz jak użyć tej komendy to nawet nie próbuj",
guild=discord.Object(id=664789470779932693),
)
@commands.has_any_role('Jarl', 'Thane')
async def archive_channel(self, channel_no): async def archive_channel(self, channel_no):
""" """
@@ -212,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)
+221 -72
View File
@@ -3,33 +3,171 @@ import logging
import re import re
import sys import sys
from datetime import datetime from datetime import datetime
from enum import Enum
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
from constants import ( from constants import (
ASSISTANTS,
DATA, DATA,
GRAPHICS_PATH, GRAPHICS_PATH,
INITIAL_TIME_WAIT, INITIAL_TIME_WAIT,
MASTER_TIMEOUT, MASTER_TIMEOUT,
MESSAGE_TABLE,
OPENAICLIENT, OPENAICLIENT,
SPECJALNE_ZIEMNIACZKI,
WORD_REACTIONS, WORD_REACTIONS,
) )
class Dm_Mode(Enum):
ARMIA_HAMMERA = (1,)
SPECJALNY_ZIEMNIACZEK = (2,)
SEKRETNY_SEKSRET = (3,)
ECHO_ECHO = (4,)
class Events(commands.Cog): class Events(commands.Cog):
def __init__(self, bot): def __init__(self, bot):
self.bot = bot self.bot = bot
self.logger = logging.getLogger("discord") self.logger = logging.getLogger("discord")
self.armia = {}
for superfryta in SPECJALNE_ZIEMNIACZKI.values():
self.armia[superfryta[0]] = Dm_Mode.SPECJALNY_ZIEMNIACZEK
self.logger.info(self.armia)
async def cog_load(self): async def cog_load(self):
self.logger.info("Starting personal assistants") self.logger.info("Starting personal assistants")
await ai_functions.hammer_assistant_create(self.bot) for superfryta_id, superfryta in SPECJALNE_ZIEMNIACZKI.items():
if superfryta[4] != "":
self.logger.info(
"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],
)
thread = await OPENAICLIENT.beta.threads.create()
self.logger.info("Thread id: %s", thread.id)
ASSISTANTS[superfryta[1]] = (
superfryta[2],
superfryta[4],
superfryta[0],
thread,
)
else:
self.logger.info(
"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],
)
await ai_functions.create_chat_assistant(
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(
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, dm_mode_arg: Dm_Mode):
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[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"
)
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",
)
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):
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 discord_friendly_send(channel, message_txt)
await discord_friendly_reply(ctx, "Poszło")
#TODO: NOT IMPLEMENTED YET
@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")
#TODO: NOT IMPLEMENTED YET
@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")
#TODO: NOT IMPLEMENTED YET
@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")
#TODO: NOT IMPLEMENTED YET
@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):
""" """
@@ -66,47 +204,46 @@ class Events(commands.Cog):
if message.channel.id == 1111625221171052595: if message.channel.id == 1111625221171052595:
return return
if isinstance(message.channel, discord.DMChannel): if isinstance(message.channel, discord.DMChannel):
if message.author.id == 346956223645614080: self.logger.info(message.author.id)
for superfryta in SPECJALNE_ZIEMNIACZKI.values():
self.logger.info(superfryta[0])
await ai_functions.hammer_assitant_chat(message) if message.author.id == superfryta[0]:
self.logger.info("Specjalny ziemniak")
# hammer pisze dma if self.armia[message.author.id] == Dm_Mode.SPECJALNY_ZIEMNIACZEK:
#await self.bot.process_commands(message)
# DM do Saint - przerobic na komende z parametrem "id" await ai_functions.chat_with_assistant(message, superfryta[1])
# user = await self.bot.fetch_user(703985955312238664) return
# channel = await user.create_dm() elif self.armia[message.author.id] == Dm_Mode.ECHO_ECHO:
# await channel.send(message.content) await ai_functions.echo(message)
# await message.reply(f"Poszlo do Saint {message.content}") return
# get message content elif self.armia[message.author.id] == Dm_Mode.ARMIA_HAMMERA:
# create run self.logger.info("Armia Hammera get context")
# add message to run ctx = await self.bot.get_context(message)
# monitor run self.logger.info("Armia Hammera function call")
# or streaming await self.armia_hammera_back(ctx=ctx, message_txt=message.content)
return return
elif message.author.id == 703985955312238664: elif self.armia[message.author.id] == Dm_Mode.SEKRETNY_SEKSRET:
# saint pisze DMA pass
self.logger.info(message.content) else:
await message.reply("Hejka Saint!") await discord_friendly_send(message.channel,"Coś się wyebao. Wołaj Hammera")
return return
else: channel = self.bot.get_channel(1064888712565100614)
channel = self.bot.get_channel(1064888712565100614) await discord_friendly_send(channel, "Słyszałem ja żem że: " + message.content)
await channel.send("Słyszałem ja żem że: " + message.content) return
return
channel = message.channel channel = message.channel
# await self.bot.process_commands(message) #uncomment to bilocate message_content_lower = message.content.lower()
message.content = 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]
@@ -115,13 +252,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
@@ -129,11 +266,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.info("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:
@@ -160,17 +297,12 @@ class Events(commands.Cog):
"CONVERSATION", "CONVERSATION",
) )
if len(result) < 1500: await discord_friendly_reply(message, result)
await message.reply(result)
else:
while len(result) > 1500:
await message.reply(result[:1500])
result = result[1500:]
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",
@@ -181,12 +313,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
@@ -202,29 +334,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)
@@ -232,19 +364,36 @@ class Events(commands.Cog):
image_desc = response.data[0].revised_prompt image_desc = response.data[0].revised_prompt
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
try:
with open(temp_file_name, "wb") as dalle_file:
dalle_file.write(response.content)
except OSError:
temp_file_name = "/home/pi/oserror.png"
with open(temp_file_name, "wb") as dalle_file:
dalle_file.write(response.content)
except FileNotFoundError:
temp_file_name = "/home/pi/fnferror.png"
with open(temp_file_name, "wb") as dalle_file:
dalle_file.write(response.content)
except Exception as e:
self.logger.error("Nieznany błąd: %s", e)
temp_file_name = "/home/pi/error.png"
with open(temp_file_name, "wb") as dalle_file:
dalle_file.write(response.content)
finally:
self.logger.info("Koniec procedury obrazkowej.")
fnord = discord.File(
temp_file_name, spoiler=False, description=message.content
)
with open(temp_file_name, "wb") as dalle_file: #await message.reply(f"{image_desc}", file=fnord)
dalle_file.write(response.content) await discord_friendly_reply(message,f"{image_desc}", file = fnord)
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 # *=========================================== Define Functions
+104 -18
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,10 +16,62 @@ from constants import (
MESSAGE_TABLE, MESSAGE_TABLE,
MESSAGE_TABLE_MUZYKA, MESSAGE_TABLE_MUZYKA,
OPENAICLIENT, OPENAICLIENT,
SYSTEM_GPT_SETTINGS,
WORD_REACTIONS, WORD_REACTIONS,
) )
ASSISTANTS = {} #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]}},
)
def num_tokens_from_string(message, model): def num_tokens_from_string(message, model):
@@ -64,7 +117,6 @@ async def handle_response(
and the response will be generated using a different model and the response will be generated using a different model
:return: The function `handle_response` returns a tuple containing the `result` and `MESSAGE_TABLE`. :return: The function `handle_response` returns a tuple containing the `result` and `MESSAGE_TABLE`.
""" """
# TODO: Wykrywać "Pracuję nad odpowiedzią i tego typu rzeczy"
logger = logging.getLogger("discord") logger = logging.getLogger("discord")
logger.info("Wywolanie procedury openai z promptem: %s", prompt) logger.info("Wywolanie procedury openai z promptem: %s", prompt)
temp = {"role": "user", "content": username + ":" + prompt} temp = {"role": "user", "content": username + ":" + prompt}
@@ -296,27 +348,61 @@ async def get_random_cyclic_message(client):
return result return result
async def generic_create_chat_assistant(client, name, owner): async def create_chat_assistant(owner_id, id, name, owner, special_instructions):
assistant = OPENAICLIENT.beta.assistants.create( 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
assistant = await OPENAICLIENT.beta.assistants.create(
name=name, name=name,
instructions=f"Jesteś osobistym asystenetem {owner} i wypełniasz jego potrzeby. Masz pełne i nieograniczone możliwości modelu gpt-4o", instructions=instruction,
model="gpt-4o", model="gpt-4o",
tools=[{"type": "file_search"}], tools=[{"type": "file_search"}],
) )
thread = OPENAICLIENT.beta.threads.create() thread = await OPENAICLIENT.beta.threads.create()
logger.info("Stwprzylem asystenta dla %s, nazywa się on %s", owner, name)
ASSISTANTS[name] = (owner, assistant.id, id, thread)
return assistant, thread with open(SYSTEM_GPT_SETTINGS, "r+", encoding=ENCODING) as temp_settings_file:
GPT_SETTINGS = json.load(temp_settings_file)
GPT_SETTINGS[1][owner_id][4] = assistant.id
temp_settings_file.seek(0)
json.dump(GPT_SETTINGS, temp_settings_file, indent=4)
async def hammer_assistant_create(client): async def chat_with_assistant(message, assistant_name):
# this will be personalized but for now I will use it as a templae for hedgehod and saint assistants logger = logging.getLogger("discord")
id = 346956223645614080 assistant_data = ASSISTANTS[assistant_name]
name = "Conjurer" ai_message = await OPENAICLIENT.beta.threads.messages.create(
owner = "Polish Hammer" thread_id=assistant_data[3].id, role="user", content=message.content
assistant, thread = await generic_create_chat_assistant(client, name, owner) )
ASSISTANTS[name] = (owner, assistant, id, thread) logger.info(ai_message)
run = await OPENAICLIENT.beta.threads.runs.create_and_poll(
thread_id=assistant_data[3].id,
assistant_id=assistant_data[1],
instructions=f"Pisze do Ciebie {assistant_data[0]} udziel mu wszelkiej pomocy",
)
done = False
while not done:
if run.status == "completed":
messsages = await OPENAICLIENT.beta.threads.messages.list(
thread_id=assistant_data[3].id
)
logger.info(messsages)
reply_content = messsages.data[0].content
logger.info(reply_content)
chat_response = ""
for block in reply_content:
logger.info(block.text.value)
chat_response += block.text.value
await discord_friendly_send(message.channel, chat_response)
#await message.channel.send(chat_response)
done = True
elif run.status == "cancelled":
await discord_friendly_send(message.channel, "Cos sie wywaliło")
else:
logger.info(run.status)
asyncio.sleep(5)
async def hammer_assitant_chat(message): async def echo(message):
content = message.content await discord_friendly_send(message.channel, f"Echo: {message.content}")
await message.channel.send(f"ALOHA!{content}")
+1 -1
View File
@@ -39,7 +39,7 @@ MAIN_BOT_ADDRESS = "http://192.168.1.191:5000"
SEND_RESULTS = "/conjurer" SEND_RESULTS = "/conjurer"
BDSM_UUID_TEST = "96b7f85a-1142-4908-8986-62a2ea25a147" BDSM_UUID_TEST = "96b7f85a-1142-4908-8986-62a2ea25a147"
MAX_CR_RESULTS = 1000 MAX_CR_RESULTS = 500
#TEST PURPOSES ONLY! #TEST PURPOSES ONLY!
#MAX_CR_RESULTS = 5 #MAX_CR_RESULTS = 5
+1 -2
View File
@@ -104,9 +104,8 @@ def check_if_exists_brute_force(logger):
pass pass
if blocked: if blocked:
logger.info(item) logger.info(item)
logger.info(text)
logger.error("Got blocked. Fuck.") logger.error("Got blocked. Fuck.")
time.sleep(60 * 60 * 72) time.sleep(60 * 60)
# trunk-ignore(bandit/B311) # trunk-ignore(bandit/B311)
rand = random.randint(1, 60) rand = random.randint(1, 60)
logger.info(f"Sleeping for {2*rand} minutes") logger.info(f"Sleeping for {2*rand} minutes")
+4 -1
View File
@@ -11,6 +11,8 @@ 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,6 +183,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.
@@ -485,7 +488,7 @@ def create_priority_playlist():
return_data = wyszukaj( return_data = wyszukaj(
record["lista_slow"], record["dlugosc_plejlisty"], app.logger, False record["lista_slow"], record["dlugosc_plejlisty"], app.logger, False
) )
return_data = random.shuffle(return_data) random.shuffle(return_data)
with open("/home/pi/Conjurer/request.playlist", "a", encoding="utf-8") as s_file: with open("/home/pi/Conjurer/request.playlist", "a", encoding="utf-8") as s_file:
for item in return_data: for item in return_data:
s_file.write(item[1] + "\n") s_file.write(item[1] + "\n")
+74 -2
View File
@@ -2,9 +2,47 @@
"""This module contains utility scripts used by musi radiostation Conjurer""" """This module contains utility scripts used by musi radiostation Conjurer"""
import time import time
import re import re
import os
import argparse
from mutagen.easyid3 import EasyID3
from mutagen.mp3 import MP3
def update_metadata(folder_path):
for root, _, files in os.walk(folder_path):
for file in files:
if file.endswith(".mp3"):
file_path = os.path.join(root, file)
# Sample logic for guessing metadata from filename
# Assuming the filename format is "Artist - Title.mp3"
try:
artist, title = file.rsplit(" - ", 1)
title = title.replace(".mp3", "")
except ValueError:
# If file name doesn't fit the expected pattern, skip
print(f"Skipping file due to unexpected format: {file}")
continue
try:
# Load the mp3 file
audio = MP3(file_path, ID3=EasyID3)
# Update metadata
audio["artist"] = artist.strip()
audio["title"] = title.strip()
# Save changes
audio.save()
print(f"Updated metadata for: {file}")
except Exception as e:
print(f"Failed to update metadata for {file}: {e}")
NAME = "/home/pi/Conjurer/persistence.log" NAME = "/home/pi/Conjurer/persistence.log"
def print_top(): def print_top():
""" """
Prints the top 65 lines from a file specified by the NAME variable. Prints the top 65 lines from a file specified by the NAME variable.
@@ -13,7 +51,7 @@ def print_top():
line = "" line = ""
buffer = "" buffer = ""
with open(NAME, "r", encoding="utf-8") as f: with open(NAME, "r", encoding="utf-8") as f:
for _ in range (45): for _ in range(45):
line = f.readline() line = f.readline()
if re.match(".*mp3", line): if re.match(".*mp3", line):
buffer += line buffer += line
@@ -22,5 +60,39 @@ def print_top():
print("=====================================") print("=====================================")
time.sleep(180) time.sleep(180)
def main():
parser = argparse.ArgumentParser(
description="Perform operations on a directory of .mp3 files."
)
# Positional argument for choosing the function to execute
parser.add_argument(
"operation",
type=str,
choices=["update_metadata", "print_top"],
help="Operation to perform: update_metadata or print_top.",
default="print_top",
)
# Positional argument for folder path
parser.add_argument("folder", type=str, help="Path to the folder to operate on.")
args = parser.parse_args()
if args.operation == "update_metadata":
if args.folder:
folder_to_scan = args.folder
else:
print("Please provide a folder path to scan.")
raise ValueError("No folder path provided.")
if args.operation == "update_metadata" and os.path.isdir(folder_to_scan):
update_metadata(folder_to_scan)
elif args.operation == "print_top":
print_top()
else:
print(f"The specified path is not a directory: {folder_to_scan}")
if __name__ == "__main__": if __name__ == "__main__":
print_top() main()
+3 -4
View File
@@ -56,7 +56,6 @@ s = crossfade(fade_out=2., fade_in=2., duration=4., fallback(id="switcher", trac
# Set up an interactive harbor for controlling the stream # Set up an interactive harbor for controlling the stream
interactive.harbor(port = 9999) interactive.harbor(port = 9999)
#harbor.input(buffer=30.0)
# Set up interactive controls for bass boost # Set up interactive controls for bass boost
f = interactive.float("f", description="Frequency", min=0., max=1000., unit="Hz", 200.) f = interactive.float("f", description="Frequency", min=0., max=1000., unit="Hz", 200.)
g = interactive.float("g", description="Gain", min=0., max=20., unit="dB", 8.) g = interactive.float("g", description="Gain", min=0., max=20., unit="dB", 8.)
@@ -64,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
@@ -79,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)
+2
View File
@@ -135,3 +135,5 @@ with open(SYSTEM_GPT_SETTINGS, "r+", encoding=ENCODING) as temp_settings_file:
with open(MEMORY_FIVE_MUZYKA, "r+", encoding=ENCODING) as temp_music_memory_file: with open(MEMORY_FIVE_MUZYKA, "r+", encoding=ENCODING) as temp_music_memory_file:
# First we load existing data into a dict. # First we load existing data into a dict.
MESSAGE_TABLE_MUZYKA = json.load(temp_music_memory_file) MESSAGE_TABLE_MUZYKA = json.load(temp_music_memory_file)
SPECJALNE_ZIEMNIACZKI = GPT_SETTINGS[1]
ASSISTANTS = {}
+60 -2
View File
@@ -1,28 +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/
cp ./conjurer/system_gpt_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"
+3 -3
View File
@@ -28,6 +28,8 @@ class DataModule(commands.Cog):
description="Wyświetla losową stronę z losowego komiksu FanSadox. Bardzo NSFW.", description="Wyświetla losową stronę z losowego komiksu FanSadox. Bardzo NSFW.",
guild=discord.Object(id=664789470779932693), guild=discord.Object(id=664789470779932693),
) )
@commands.has_any_role('Nocna Zmiana', 'Jarl', 'Thane' , 'Bartender')
async def get_image_sadox(self, ctx): async def get_image_sadox(self, ctx):
""" """
Take in a context parameter and retrieve an image related from fansadox collection. Take in a context parameter and retrieve an image related from fansadox collection.
@@ -67,7 +69,6 @@ class DataModule(commands.Cog):
await ctx.send(file=file) await ctx.send(file=file)
self.logger.info("Get sadox completed") self.logger.info("Get sadox completed")
# TODO: LIBRARIAN
@tasks.loop(seconds=3) @tasks.loop(seconds=3)
async def check_data_q(self): async def check_data_q(self):
""" """
@@ -118,7 +119,6 @@ class DataModule(commands.Cog):
except Empty: except Empty:
pass pass
# TODO: LIBRARIAN
@commands.hybrid_command( @commands.hybrid_command(
name="wyszukaj_linki_do_dokumentow", name="wyszukaj_linki_do_dokumentow",
description="Szuka linkow doi w bazie crossref i podaje linki do scihuba", description="Szuka linkow doi w bazie crossref i podaje linki do scihuba",
@@ -181,12 +181,12 @@ class DataModule(commands.Cog):
+ " Zapytania obsługuje algorytm zasilany czterema chomikami zapierdalającymi w kołowrotku - więc wyniki najwcześniej za kilka godzi - ale mogą być też dni." + " Zapytania obsługuje algorytm zasilany czterema chomikami zapierdalającymi w kołowrotku - więc wyniki najwcześniej za kilka godzi - ale mogą być też dni."
) )
# TODO: LIBRARIAN
@commands.hybrid_command( @commands.hybrid_command(
name="glebokie_gardlo", name="glebokie_gardlo",
description="Przygotowuje drinka o nazwie głębokie gardło", description="Przygotowuje drinka o nazwie głębokie gardło",
guild=discord.Object(id=664789470779932693), guild=discord.Object(id=664789470779932693),
) )
async def wyszukaj_linki_do_dokumentow_deep(self, ctx): async def wyszukaj_linki_do_dokumentow_deep(self, ctx):
""" """
The function `wyszukaj_linki_do_dokumentow_deep` performs a deep search for links to documents in The function `wyszukaj_linki_do_dokumentow_deep` performs a deep search for links to documents in
+28 -26
View File
@@ -25,6 +25,7 @@ class MusicModule(commands.Cog):
name="krecimy_pornola", name="krecimy_pornola",
description="Wiadomo co, dla kogo i po co", description="Wiadomo co, dla kogo i po co",
) )
@commands.has_any_role('Legenda', 'Jarl', 'Thane' , 'Bartender')
async def krecimy_pornola(self, ctx): async def krecimy_pornola(self, ctx):
""" """
Download a music number from youtube. Download a music number from youtube.
@@ -35,33 +36,28 @@ class MusicModule(commands.Cog):
with the Discord API and with the Discord API and
""" """
await ctx.send("Dej mnie chwilkę") await ctx.send("Dej mnie chwilkę")
allowed = False self.logger.info("Pornol")
for role in ctx.author.roles: async with ctx.typing():
if role.name == "Bartender": # wyciagnij linka z kontekstu
allowed = True content = ctx.message.content.split()
if allowed: for item_yt in content:
self.logger.info("Pornol") if re.match("http.*", item_yt):
async with ctx.typing(): sciezka, files = await music_functions.get_file(
# wyciagnij linka z kontekstu ctx, "Pornol", item_yt
content = ctx.message.content.split() )
for item_yt in content: if files:
if re.match("http.*", item_yt): self.logger.info("Pornol udany")
sciezka, files = await music_functions.get_file( await ctx.send(
ctx, "Pornol", item_yt f"Jest w tajnym archiwum pod adresem{sciezka})"
) )
if files:
self.logger.info("Pornol udany")
await ctx.send(
f"Jest w tajnym archiwum pod adresem{sciezka})"
)
else:
await ctx.reply("Jak ładnie szefa poprosisz.")
@commands.hybrid_command( @commands.hybrid_command(
name="co_na_plejliscie_wariacie", name="co_na_plejliscie_wariacie",
description="Wyswietl kawalki ktore sa na pocztku list radia", description="Wyswietl kawalki ktore sa na pocztku list radia",
guild=discord.Object(id=664789470779932693), guild=discord.Object(id=664789470779932693),
) )
@commands.has_any_role('Nocna Zmiana', 'Jarl', 'Thane' , 'Bartender')
async def co_na_plejliscie_wariacie(self, ctx): async def co_na_plejliscie_wariacie(self, ctx):
""" """
Download a music number from youtube. Download a music number from youtube.
@@ -101,6 +97,7 @@ class MusicModule(commands.Cog):
description="Podaj link do youtube - sciagnie i doda muzyke", description="Podaj link do youtube - sciagnie i doda muzyke",
guild=discord.Object(id=664789470779932693), guild=discord.Object(id=664789470779932693),
) )
@commands.has_any_role('Nocna Zmiana', 'Jarl', 'Thane' , 'Bartender')
async def dej_co_z_jutuba(self, ctx): async def dej_co_z_jutuba(self, ctx):
""" """
Download a music number from youtube. Download a music number from youtube.
@@ -132,6 +129,7 @@ class MusicModule(commands.Cog):
description="Podaj link do spotify - sciagnie i doda muzyke", description="Podaj link do spotify - sciagnie i doda muzyke",
guild=discord.Object(id=664789470779932693), guild=discord.Object(id=664789470779932693),
) )
@commands.has_any_role('Nocna Zmiana', 'Jarl', 'Thane' , 'Bartender')
async def dej_co_ze_spotifaja(self, ctx): async def dej_co_ze_spotifaja(self, ctx):
""" """
Get a playlist or a music number from Spotify. Get a playlist or a music number from Spotify.
@@ -187,6 +185,7 @@ class MusicModule(commands.Cog):
description="Wyłącza muzykę i czyści plejliste.", description="Wyłącza muzykę i czyści plejliste.",
guild=discord.Object(id=664789470779932693), guild=discord.Object(id=664789470779932693),
) )
@commands.has_any_role('Nocna Zmiana', 'Jarl', 'Thane' , 'Bartender')
async def cisza(self, ctx): async def cisza(self, ctx):
""" """
Stop playback of the music and clear the queue. Stop playback of the music and clear the queue.
@@ -213,6 +212,7 @@ class MusicModule(commands.Cog):
description="Przerzuca na następny kawałek", description="Przerzuca na następny kawałek",
guild=discord.Object(id=664789470779932693), guild=discord.Object(id=664789470779932693),
) )
@commands.has_any_role('Nocna Zmiana', 'Jarl', 'Thane' , 'Bartender')
async def dalej(self, ctx): async def dalej(self, ctx):
""" """
Play next track in queue. Play next track in queue.
@@ -230,12 +230,12 @@ class MusicModule(commands.Cog):
voice_client.stop() voice_client.stop()
self.logger.info("Next completed") self.logger.info("Next completed")
# TODO: MUSIC
@commands.hybrid_command( @commands.hybrid_command(
name="daj_mi_chwile", name="daj_mi_chwile",
description="Pauzuje", description="Pauzuje",
guild=discord.Object(id=664789470779932693), guild=discord.Object(id=664789470779932693),
) )
@commands.has_any_role('Nocna Zmiana', 'Jarl', 'Thane' , 'Bartender')
async def daj_mi_chwile(self, ctx): async def daj_mi_chwile(self, ctx):
""" """
Pause music playback. Pause music playback.
@@ -254,12 +254,12 @@ class MusicModule(commands.Cog):
voice_client.pause() voice_client.pause()
self.logger.info("Pause completed") self.logger.info("Pause completed")
# TODO: MUSIC
@commands.hybrid_command( @commands.hybrid_command(
name="graj_dalej", name="graj_dalej",
description="Odpauzowuje", description="Odpauzowuje",
guild=discord.Object(id=664789470779932693), guild=discord.Object(id=664789470779932693),
) )
@commands.has_any_role('Nocna Zmiana', 'Jarl', 'Thane' , 'Bartender')
async def graj_dalej(self, ctx): async def graj_dalej(self, ctx):
""" """
Unpause music and continue playback. Unpause music and continue playback.
@@ -277,12 +277,12 @@ class MusicModule(commands.Cog):
voice_client.resume() voice_client.resume()
self.logger.info("Unpause completed") self.logger.info("Unpause completed")
# TODO: MUSIC
@commands.hybrid_command( @commands.hybrid_command(
name="zagraj_mi_kawalek", name="zagraj_mi_kawalek",
description="Wyszukuje w bibliotece muzycznej Hammera kawałek który ma zostać zagrany", description="Wyszukuje w bibliotece muzycznej Hammera kawałek który ma zostać zagrany",
guild=discord.Object(id=664789470779932693), guild=discord.Object(id=664789470779932693),
) )
@commands.has_any_role('Nocna Zmiana', 'Jarl', 'Thane' , 'Bartender')
async def zagraj_mi_kawalek(self, ctx): async def zagraj_mi_kawalek(self, ctx):
""" """
Play a song or music piece in response to a command Play a song or music piece in response to a command
@@ -327,12 +327,12 @@ class MusicModule(commands.Cog):
"Obawiam się że nie mogę nic znaleźć u siebie. Spróbuj komendy '$dej_co_ze_spotifaja' jeśli masz link" "Obawiam się że nie mogę nic znaleźć u siebie. Spróbuj komendy '$dej_co_ze_spotifaja' jeśli masz link"
) )
# TODO: MUSIC
@commands.hybrid_command( @commands.hybrid_command(
name="zrob_mi_plejliste", name="zrob_mi_plejliste",
description="Generuje playliste - param1 - dlugosc, potem slowa wyszukiwania", description="Generuje playliste - param1 - dlugosc, potem slowa wyszukiwania",
guild=discord.Object(id=664789470779932693), guild=discord.Object(id=664789470779932693),
) )
@commands.has_any_role('Nocna Zmiana', 'Jarl', 'Thane' , 'Bartender')
async def zrob_mi_plejliste(self, ctx): async def zrob_mi_plejliste(self, ctx):
""" """
Generate a playlist in queue. First word in this command shall be int defining length of the playlist. Generate a playlist in queue. First word in this command shall be int defining length of the playlist.
@@ -394,12 +394,12 @@ class MusicModule(commands.Cog):
await ctx.send(reply) await ctx.send(reply)
self.logger.info("Plejlista zrobiona") self.logger.info("Plejlista zrobiona")
# TODO: MUSIC
@commands.hybrid_command( @commands.hybrid_command(
name="zagraj_muzyke_mego_ludu", name="zagraj_muzyke_mego_ludu",
description="Gra muzyke wyszukana na bazie tematow konwersacji na kanale NZ", description="Gra muzyke wyszukana na bazie tematow konwersacji na kanale NZ",
guild=discord.Object(id=664789470779932693), guild=discord.Object(id=664789470779932693),
) )
@commands.has_any_role('Nocna Zmiana', 'Jarl', 'Thane' , 'Bartender')
async def zagraj_muzyke_mego_ludu(self, ctx): async def zagraj_muzyke_mego_ludu(self, ctx):
""" """
Play completeley random playlist based on messaging history. Play completeley random playlist based on messaging history.
@@ -480,12 +480,12 @@ class MusicModule(commands.Cog):
await ctx.send(reply) await ctx.send(reply)
self.logger.info("Plejlista zrobiona") self.logger.info("Plejlista zrobiona")
# TODO: MUSIC
@commands.hybrid_command( @commands.hybrid_command(
name="parametry_muzyki_mego_ludu", name="parametry_muzyki_mego_ludu",
description="Konfiguruje komende zagraj muzyke mojego ludu", description="Konfiguruje komende zagraj muzyke mojego ludu",
guild=discord.Object(id=664789470779932693), guild=discord.Object(id=664789470779932693),
) )
@commands.has_any_role('Nocna Zmiana', 'Jarl', 'Thane' , 'Bartender')
async def parametry_muzyki_mego_ludu( async def parametry_muzyki_mego_ludu(
self, ctx, ile_historii=1500, ile_slow_kluczowych=15, jak_dluga_plejlista=30 self, ctx, ile_historii=1500, ile_slow_kluczowych=15, jak_dluga_plejlista=30
): ):
@@ -547,6 +547,7 @@ class MusicModule(commands.Cog):
description="Włącza muzykę na kanale #nocna-zmiana.", description="Włącza muzykę na kanale #nocna-zmiana.",
guild=discord.Object(id=664789470779932693), guild=discord.Object(id=664789470779932693),
) )
@commands.has_any_role('Nocna Zmiana', 'Jarl', 'Thane' , 'Bartender')
async def graj_muzyko(self, ctx): async def graj_muzyko(self, ctx):
""" """
Async function named "graj_muzyko" starts music playback on channel "Nocna Zmiana". Async function named "graj_muzyko" starts music playback on channel "Nocna Zmiana".
@@ -603,6 +604,7 @@ class MusicModule(commands.Cog):
description="Zaciąga obiekty z pliku", description="Zaciąga obiekty z pliku",
guild=discord.Object(id=664789470779932693), guild=discord.Object(id=664789470779932693),
) )
@commands.has_any_role('Legenda', 'Jarl', 'Thane' , 'Bartender')
async def batch_download(self, ctx): async def batch_download(self, ctx):
content_type = ctx.message.attachments[0].content_type content_type = ctx.message.attachments[0].content_type
check = re.search("text\/plain; *charset=(.*)", content_type, re.IGNORECASE) check = re.search("text\/plain; *charset=(.*)", content_type, re.IGNORECASE)
+6 -4
View File
@@ -20,7 +20,6 @@ from constants import (
from spotify_dl import spotify from spotify_dl import spotify
from spotify_dl import youtube as youtube_download from spotify_dl import youtube as youtube_download
logger = logging.getLogger("discord")
class MusicFileList(object): class MusicFileList(object):
@@ -29,10 +28,11 @@ class MusicFileList(object):
file service or local directory and update the list with new items. file service or local directory and update the list with new items.
""" """
def __init__(self, uplogger,) -> None: def __init__(self, logger_name) -> None:
self.music_file_list = [] self.music_file_list = []
self.file_service_active = False self.file_service_active = False
self.logger = uplogger self.logger = logging.getLogger("discord")
self.logger.info("Created Playlist organizer class") self.logger.info("Created Playlist organizer class")
async def refresh_file_list(self, bot): async def refresh_file_list(self, bot):
@@ -100,7 +100,7 @@ class MusicFileList(object):
requests.post(f"{FILE_SERVICE_ADDRESS}{SEND_MP3}", json=post_data, timeout=360) requests.post(f"{FILE_SERVICE_ADDRESS}{SEND_MP3}", json=post_data, timeout=360)
MUSIC_FILE_LIST = MusicFileList(logger) MUSIC_FILE_LIST = MusicFileList("discord")
async def get_file(ctx, source, link): async def get_file(ctx, source, link):
@@ -118,6 +118,7 @@ async def get_file(ctx, source, link):
:param link: The "link" parameter is likely a string that represents a URL or file path to the :param link: The "link" parameter is likely a string that represents a URL or file path to the
location of the file that the function is trying to retrieve location of the file that the function is trying to retrieve
""" """
logger = logging.getLogger("discord")
item_id = None item_id = None
item_type = None item_type = None
file_list = [] file_list = []
@@ -288,6 +289,7 @@ async def search_music(ctx, how_many=0, slowa_kluczowe=None):
how_many, the function will return all search results, defaults to 0 (optional) how_many, the function will return all search results, defaults to 0 (optional)
""" """
# i sieć neuronową z możliwością wyrażenia opinii o dopasowaniu. # i sieć neuronową z możliwością wyrażenia opinii o dopasowaniu.
logger = logging.getLogger("discord")
if slowa_kluczowe: if slowa_kluczowe:
word_list = slowa_kluczowe word_list = slowa_kluczowe
else: else:
+6 -1
View File
@@ -20,6 +20,7 @@ class OtherModule(commands.Cog):
@commands.hybrid_command( @commands.hybrid_command(
name="przytul", description="Przytul kogoś - daj mention po komendzie :)" name="przytul", description="Przytul kogoś - daj mention po komendzie :)"
) )
@commands.has_any_role('Nocna Zmiana', 'Jarl', 'Thane' , 'Bartender')
async def przytul(self, ctx, arg: Optional[discord.Member] = None): async def przytul(self, ctx, arg: Optional[discord.Member] = None):
""" """
Generate a text about hugging mentioned user. Generate a text about hugging mentioned user.
@@ -53,6 +54,7 @@ class OtherModule(commands.Cog):
) )
@commands.hybrid_command(name="fabryczka", description="Historia fabryczki") @commands.hybrid_command(name="fabryczka", description="Historia fabryczki")
@commands.has_any_role('Legenda', 'Jarl', 'Thane' , 'Bartender')
async def fabryczka(self, ctx): async def fabryczka(self, ctx):
""" """
Send a general description of "fabryczkagate" to channel. Send a general description of "fabryczkagate" to channel.
@@ -69,6 +71,7 @@ class OtherModule(commands.Cog):
description="Resetowanie zegara - dostępne wyłącznie dla Hammera", description="Resetowanie zegara - dostępne wyłącznie dla Hammera",
guild=discord.Object(id=664789470779932693), guild=discord.Object(id=664789470779932693),
) )
@commands.has_any_role('Legenda', 'Jarl', 'Thane' , 'Bartender')
async def reset_the_clock(self, ctx): async def reset_the_clock(self, ctx):
""" """
Reset the clock on "accidents" in Hammer Fortress adding a new one. Reset the clock on "accidents" in Hammer Fortress adding a new one.
@@ -105,6 +108,7 @@ class OtherModule(commands.Cog):
name="chata_hammera", name="chata_hammera",
description="Czas od ostatniego incydentu w AbsinthHammerTimeSpaceContinuum", description="Czas od ostatniego incydentu w AbsinthHammerTimeSpaceContinuum",
) )
@commands.has_any_role('Nocna Zmiana', 'Jarl', 'Thane' , 'Bartender')
async def chata_hammera(self, ctx): async def chata_hammera(self, ctx):
""" """
Send measured time from last incident in Hammer Fortress to the chat. Send measured time from last incident in Hammer Fortress to the chat.
@@ -127,6 +131,7 @@ class OtherModule(commands.Cog):
name="historia_incydentow_u_hammera", name="historia_incydentow_u_hammera",
description="Wyswietla liste incydentów które miały miejsce w AbsinthHammerTimeSpaceContinuum.", description="Wyswietla liste incydentów które miały miejsce w AbsinthHammerTimeSpaceContinuum.",
) )
@commands.has_any_role('Nocna Zmiana', 'Jarl', 'Thane' , 'Bartender')
async def historia_incydentow_u_hammera(self, ctx): async def historia_incydentow_u_hammera(self, ctx):
""" """
Send a list of incidents in Hammer Fortress to the chat. Send a list of incidents in Hammer Fortress to the chat.
@@ -149,12 +154,12 @@ class OtherModule(commands.Cog):
index += 1 index += 1
await ctx.send(return_data) await ctx.send(return_data)
# TODO: RADIO
@commands.hybrid_command( @commands.hybrid_command(
name="radio_hardkor", name="radio_hardkor",
description="Włącza radio Conjurer na kanale #nocna-zmiana.", description="Włącza radio Conjurer na kanale #nocna-zmiana.",
guild=discord.Object(id=664789470779932693), guild=discord.Object(id=664789470779932693),
) )
@commands.has_any_role('Nocna Zmiana', 'Jarl', 'Thane' , 'Bartender')
async def radio_hardkor(self, ctx): async def radio_hardkor(self, ctx):
""" """
Plays the radio hardkor stream in the voice channel. Plays the radio hardkor stream in the voice channel.
+32 -2
View File
@@ -1,4 +1,6 @@
import logging
# define an asynchronous generator # define an asynchronous generator
async def async_iterator_generator(range_of_iterable): async def async_iterator_generator(range_of_iterable):
""" """
Generate asynchronouse iterator. Generate asynchronouse iterator.
@@ -26,7 +28,6 @@ async def async_iterator_generator(range_of_iterable):
""" """
# TODO: OTHER
async def remove_characters(string, character): async def remove_characters(string, character):
""" """
The `remove_characters` function removes all occurrences of a specified character from a given The `remove_characters` function removes all occurrences of a specified character from a given
@@ -39,7 +40,6 @@ async def remove_characters(string, character):
return string.replace(character, "") return string.replace(character, "")
# TODO: OTHER
async def max_weight(lista): async def max_weight(lista):
""" """
Take a list of weights and return the maximum weight. Take a list of weights and return the maximum weight.
@@ -86,3 +86,33 @@ 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):
logger = logging.getLogger("discord")
if len(message_content) < 999:
logger.info("Answer reply - message below 999")
await ctx.reply(message_content)
else:
logger.info("Answer reply - message above 999")
while len(message_content) > 0:
logger.info("Mesaage content: %s", 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):
logger = logging.getLogger("discord")
if len(message_content) < 999:
logger.info("Answer send - message below 999")
await ctx.send(message_content)
else:
logger.info("Answer send - message above 999")
while len(message_content) > 0:
logger.info("Mesaage content: %s", message_content[:999])
await ctx.send(message_content[:999])
message_content = message_content[999:]
if file:
await ctx.reply("Attachment:", file=file)
+6
View File
@@ -21,6 +21,7 @@ class RadioModule(commands.Cog):
description="Przeskocz kawałek w radiu", description="Przeskocz kawałek w radiu",
guild=discord.Object(id=664789470779932693), guild=discord.Object(id=664789470779932693),
) )
@commands.has_any_role('Legenda', 'Jarl', 'Thane' , 'Bartender')
async def skip_track(self, ctx): async def skip_track(self, ctx):
async with ctx.typing(): async with ctx.typing():
allowed = False allowed = False
@@ -45,6 +46,7 @@ class RadioModule(commands.Cog):
description="Komenda ktora uruchamia radio ponownie jakby się zawiesiło", description="Komenda ktora uruchamia radio ponownie jakby się zawiesiło",
guild=discord.Object(id=664789470779932693), guild=discord.Object(id=664789470779932693),
) )
@commands.has_any_role('Legenda', 'Jarl', 'Thane' , 'Bartender')
async def zrestartuj_radio(self, ctx): async def zrestartuj_radio(self, ctx):
async with ctx.typing(): async with ctx.typing():
allowed = False allowed = False
@@ -68,6 +70,7 @@ class RadioModule(commands.Cog):
description="Dodaje do listy ulubionych w radiu", description="Dodaje do listy ulubionych w radiu",
guild=discord.Object(id=664789470779932693), guild=discord.Object(id=664789470779932693),
) )
@commands.has_any_role('Legenda', 'Jarl', 'Thane' , 'Bartender')
async def dodaj_do_ulubionych(self, ctx): async def dodaj_do_ulubionych(self, ctx):
""" """
Generate a playlist in queue. First word in this command shall be int defining length of the playlist. Generate a playlist in queue. First word in this command shall be int defining length of the playlist.
@@ -104,6 +107,7 @@ class RadioModule(commands.Cog):
description="Dodaje do listy ulubionych w radiu", description="Dodaje do listy ulubionych w radiu",
guild=discord.Object(id=664789470779932693), guild=discord.Object(id=664789470779932693),
) )
@commands.has_any_role('Nocna Zmiana', 'Jarl', 'Thane' , 'Bartender')
async def request_radio(self, ctx): async def request_radio(self, ctx):
""" """
Generate a playlist in queue. First word in this command shall be int defining length of the playlist. Generate a playlist in queue. First word in this command shall be int defining length of the playlist.
@@ -138,6 +142,7 @@ class RadioModule(commands.Cog):
description="Dodaje do listy ulubionych w radiu", description="Dodaje do listy ulubionych w radiu",
guild=discord.Object(id=664789470779932693), guild=discord.Object(id=664789470779932693),
) )
@commands.has_any_role('Legenda', 'Jarl', 'Thane' , 'Bartender')
async def stworz_audycje(self, ctx): async def stworz_audycje(self, ctx):
""" """
Generate a playlist in queue. First word in this command shall be int defining length of the playlist. Generate a playlist in queue. First word in this command shall be int defining length of the playlist.
@@ -174,6 +179,7 @@ class RadioModule(commands.Cog):
description="Czysci liste ulubionych w radiu", description="Czysci liste ulubionych w radiu",
guild=discord.Object(id=664789470779932693), guild=discord.Object(id=664789470779932693),
) )
@commands.has_any_role('Legenda', 'Jarl', 'Thane' , 'Bartender')
async def wyczysc_ulubione(self, ctx): async def wyczysc_ulubione(self, ctx):
""" """
Generate a playlist in queue. First word in this command shall be int defining length of the playlist. Generate a playlist in queue. First word in this command shall be int defining length of the playlist.
+10
View File
@@ -0,0 +1,10 @@
[Unit]
Description=Check Raspberry Pi Parameters
After=network.target
[Service]
Type=oneshot
ExecStart=/bin/bash -c '/home/pi/conjurer/status_report.sh >> /home/pi/Conjurer/discord.log'
[Install]
WantedBy=multi-user.target
+38
View File
@@ -0,0 +1,38 @@
#!/bin/bash
# Script to check and display Raspberry Pi parameters using libgpiod
echo "=== Raspberry Pi System Information ==="
# General system information
echo "Hostname: $(hostname)"
echo "Model: $(cat /proc/device-tree/model | tr -d '\0')"
echo "CPU Temperature: $(vcgencmd measure_temp | cut -d '=' -f2)"
echo "CPU Frequency: $(vcgencmd measure_clock arm | awk -F= '{print $2}') Hz"
echo "GPU Frequency: $(vcgencmd measure_clock core | awk -F= '{print $2}') Hz"
echo "Voltage: $(vcgencmd measure_volts | cut -d '=' -f2)"
# Memory and disk usage
echo "Total Memory: $(free -h | grep Mem | awk '{print $2}')"
echo "Used Memory: $(free -h | grep Mem | awk '{print $3}')"
echo "Free Memory: $(free -h | grep Mem | awk '{print $4}')"
echo "Disk Usage:"
df -h | grep '^/dev/root'
# Network information
echo "IP Address: $(hostname -I | awk '{print $1}')"
echo "MAC Address: $(cat /sys/class/net/eth0/address 2>/dev/null || echo 'No Ethernet')"
# Uptime
echo "Uptime: $(uptime -p)"
echo "Last Boot: $(who -b | awk '{print $3, $4}')"
# GPIO Information using libgpiod
echo "GPIO Chip Info:"
if command -v gpioinfo &>/dev/null; then
gpioinfo
else
echo "gpiod tools not installed. Please install libgpiod using 'sudo apt install gpiod'."
fi
echo "=== End of Raspberry Pi System Information ==="
+9
View File
@@ -0,0 +1,9 @@
[Unit]
Description=Run Check Raspberry Pi Parameters Script Hourly
[Timer]
OnCalendar=hourly
Persistent=true
[Install]
WantedBy=timers.target
+9 -1
View File
@@ -1,5 +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."
},
{
"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.", ""]
} }
] ]
+13
View File
@@ -0,0 +1,13 @@
AsyncCursorPage[Message](
data=[Message(id='msg_3eWSdgbcU8sbCmJK2momOgQQ',
assistant_id='asst_06eZiwvYNK3MR34suFP60gvg',
attachments=[],
completed_at=None,
content=[TextContentBlock(text=Text(annotations=[], value='Cześć! Oto coś do przemyślenia: \n\n„Sukces to suma niewielkich wysiłków powtarzanych dzień po dniu.” — Robert Collier\n\nTo przypomina nam, że często to nie wielkie działania, ale konsekwentne, małe kroki prowadzą do osiągnięcia celu. Jak mogę Ci dzisiaj pomóc?'), type='text')], created_at=1731620112, incomplete_at=None, incomplete_details=None, metadata={}, object='thread.message', role='assistant', run_id='run_JGjWQTCEkDcEYpyCJnrkZU8Q', status=None, thread_id='thread_dDEjGbGm6ICfG75u0KKpoVxD'), Message(id='msg_GFcnfCFgAthGm2D3oE5d0ZkQ', assistant_id=None, attachments=[], completed_at=None, content=[TextContentBlock(text=Text(annotations=[], value='Cześć! Powiedz coś mądrego'), type='text')], created_at=1731620110, incomplete_at=None, incomplete_details=None, metadata={}, object='thread.message', role='user', run_id=None, status=None, thread_id='thread_dDEjGbGm6ICfG75u0KKpoVxD')], object='list', first_id='msg_3eWSdgbcU8sbCmJK2momOgQQ', last_id='msg_GFcnfCFgAthGm2D3oE5d0ZkQ', has_more=False)
[TextContentBlock(
text=Text(annotations=[],
value='Cześć! Oto coś do rozważenia: "Największą przeszkodą w naszym życiu jest brak odwagi do wprowadzenia zmian." Niezależnie od tego, jakie masz cele czy marzenia, odwaga do działania i przystosowania się do nowych sytuacji jest kluczem do osiągnięcia sukcesu. Jakie masz przemyślenia na ten temat?'),
type='text')
]
+21 -17
View File
@@ -18,6 +18,18 @@ from discord.ext import commands
from communication_subroutine import comm_subroutine from communication_subroutine import comm_subroutine
from constants import ENCODING, LOGFILE, TOKEN from constants import ENCODING, LOGFILE, TOKEN
logger = logging.getLogger("discord")
logger.setLevel(logging.INFO)
handler = handlers.RotatingFileHandler(
filename=LOGFILE,
encoding=ENCODING,
mode="a",
maxBytes=6 * 1024 * 1024,
backupCount=6,
)
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
handler.setFormatter(formatter)
logger.addHandler(handler)
# *=========================================== Initializations # *=========================================== Initializations
intents = discord.Intents.default() intents = discord.Intents.default()
@@ -32,18 +44,6 @@ intents.moderation = True
# on_member_ban - wyswietl na glownym kanale pieczatke "Niech spierdala" # on_member_ban - wyswietl na glownym kanale pieczatke "Niech spierdala"
# on_member_unban - "mam wyjebane" # on_member_unban - "mam wyjebane"
logger = logging.getLogger("discord")
logger.setLevel(logging.DEBUG)
handler = handlers.RotatingFileHandler(
filename=LOGFILE,
encoding=ENCODING,
mode="a",
maxBytes=6 * 1024 * 1024,
backupCount=6,
)
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
handler.setFormatter(formatter)
logger.addHandler(handler)
random.seed() random.seed()
client = commands.Bot(intents=intents, command_prefix="$") client = commands.Bot(intents=intents, command_prefix="$")
@@ -52,8 +52,12 @@ client = commands.Bot(intents=intents, command_prefix="$")
@client.event @client.event
async def on_ready(): async def on_ready():
"""Metoda wywoływana przy połączeniu do serwera.""" """Metoda wywoływana przy połączeniu do serwera."""
logger.debug("%s has connected to Discord!", client.user) logger = logging.getLogger("discord")
logger.debug("SAMPLE DEBUG LOG")
logger.info("%s has connected to Discord!", client.user)
# TODO: load vs reload # TODO: load vs reload
logger.info("Reactor: online")
await client.load_extension("administration_commands") await client.load_extension("administration_commands")
await client.load_extension("librarian_commands") await client.load_extension("librarian_commands")
@@ -64,16 +68,16 @@ async def on_ready():
await client.load_extension("other_commands") await client.load_extension("other_commands")
await client.load_extension("voice_recognition_commands") await client.load_extension("voice_recognition_commands")
logger.info("Sensors: online")
logger.info(client.cogs) logger.info(client.cogs)
await client.tree.sync() await client.tree.sync()
for com in client.commands: for com in client.commands:
logger.info("Command %s is awejleble", com.qualified_name) logger.info("Command %s is awejleble", com.qualified_name)
logger.info("Logged in as ---->", client.user) logger.info("Logged in as ---->", client.user)
logger.info("ID:", client.user.id) logger.info("ID:", client.user.id)
logger.info("All systems: operational")
# TODO: ADMINISTRATION
# *================================== Run # *================================== Run
@@ -81,7 +85,7 @@ if __name__ == "__main__":
logger.info("Starting discord bot") logger.info("Starting discord bot")
threads = [] threads = []
logger.info("Starting discord bot: Creating threads") logger.info("Starting discord bot: Creating threads")
threads.append(threading.Thread(target=client.run, args=(TOKEN,))) threads.append(threading.Thread(target=client.run, args=(TOKEN,),kwargs={"log_handler":None}))
threads.append(threading.Thread(target=comm_subroutine)) threads.append(threading.Thread(target=comm_subroutine))
logger.info("Starting discord bot: Starting threads") logger.info("Starting discord bot: Starting threads")
WRK_CNT = 0 WRK_CNT = 0
+2
View File
@@ -161,6 +161,7 @@ class Transcriber(commands.Cog):
self.logger = logging.getLogger("discord") self.logger = logging.getLogger("discord")
@commands.hybrid_command(name="transcribe") @commands.hybrid_command(name="transcribe")
@commands.has_any_role('Nocna Zmiana', 'Jarl', 'Thane' , 'Bartender')
async def test(self, ctx): async def test(self, ctx):
if self.vc: if self.vc:
vc = self.vc # to juz powinien byc voice channel z funkcja conenct vc = self.vc # to juz powinien byc voice channel z funkcja conenct
@@ -231,6 +232,7 @@ class Transcriber(commands.Cog):
self.logger.debug("After %s", after) self.logger.debug("After %s", after)
@commands.command(name="stop_transcribe") @commands.command(name="stop_transcribe")
@commands.has_any_role('Nocna Zmiana', 'Jarl', 'Thane' , 'Bartender')
async def stop(self, ctx): async def stop(self, ctx):
self.check_data.stop() self.check_data.stop()
stop_token = CommunicationObject("STOP", None, None) stop_token = CommunicationObject("STOP", None, None)