From 7cb3d61d7272f25c2b5a0797ab41bce9c5f9019a Mon Sep 17 00:00:00 2001 From: Polish Hammer Date: Thu, 30 Oct 2025 16:59:17 +0100 Subject: [PATCH] Tag: 1.21 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Intermediate commits (oldest → newest): - Start of Armia Hammera - Enum fix - small fx - Optional argument fix - xxx - fix - Fix - ADdded smth - finished secret dm handling - bgfx - safe --- administration_commands.py | 9 ++++ ai_commands.py | 77 +++++++++++++++++++++++----- ai_functions.py | 1 - conjurer_musician/radio_conjurer.liq | 1 - librarian_commands.py | 6 +-- music_commands.py | 54 +++++++++---------- other_commands.py | 7 ++- other_functions.py | 2 - radio_commands.py | 6 +++ thin_client.py | 3 -- voice_recognition_commands.py | 2 + 11 files changed, 119 insertions(+), 49 deletions(-) diff --git a/administration_commands.py b/administration_commands.py index e93a323..6113f05 100644 --- a/administration_commands.py +++ b/administration_commands.py @@ -32,6 +32,7 @@ class AdministrationModule(commands.Cog): 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: @@ -51,6 +52,8 @@ class AdministrationModule(commands.Cog): 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 update_banlist(self, ctx): """ Update a banlist in a Discord guild from preprovided list in channel. @@ -135,6 +138,12 @@ class AdministrationModule(commands.Cog): f"Nie mam na serwerze {guild} uprawnień do banowania. :()" ) 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): """ diff --git a/ai_commands.py b/ai_commands.py index 6ae44c8..02cafb3 100644 --- a/ai_commands.py +++ b/ai_commands.py @@ -2,13 +2,16 @@ import logging import re import sys +from enum import Enum from datetime import datetime +from typing import Optional import discord import openai import requests from discord.ext import commands + import ai_functions from constants import ( ASSISTANTS, @@ -19,12 +22,22 @@ from constants import ( OPENAICLIENT, SPECJALNE_ZIEMNIACZKI, WORD_REACTIONS, + MESSAGE_TABLE ) -DM_MODE = "assistant" +class Dm_Mode(Enum): + ARMIA_HAMMERA = 1, + SPECJALNY_ZIEMNIACZEK = 2, + SEKRETNY_SEKSRET = 3, + ECHO_ECHO = 4 + class Events(commands.Cog): def __init__(self, bot): self.bot = bot 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): self.logger.info("Starting personal assistants") @@ -59,11 +72,40 @@ class Events(commands.Cog): description="Jeśli nie wiesz jak użyć tej komendy to nawet nie próbuj", guild=discord.Object(id=664789470779932693), ) - async def switch_dm_mode(self, ctx): - if isinstance(ctx.channel, discord.DMChannel): - pass - #secrets, assistant, echo, dm - #required parameter from list of values - assistant, dm_broadcast, echo + 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(): + if ctx.message.author.id == superfryta[0]: + self.armia[superfryta[2]] = dm_mode_arg + 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]): + await self.armia_hammera_back(ctx, message_txt, recipient) + + async def armia_hammera_back(self, ctx, message_txt, recipient = None): + recipients = [] + if recipient: + recipients.append(recipient.id) + else: + for superfryta in SPECJALNE_ZIEMNIACZKI.values(): + recipients.append(superfryta[0]) + + 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") + @commands.Cog.listener() async def on_message(self, message): @@ -105,15 +147,26 @@ class Events(commands.Cog): for superfryta in SPECJALNE_ZIEMNIACZKI.values(): self.logger.info(superfryta[0]) if message.author.id == superfryta[0]: - await self.bot.process_commands(message) - await ai_functions.chat_with_assistant(message, superfryta[1]) - return + 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: + 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) + return + elif self.armia[message.author.id]== Dm_Mode.SEKRETNY_SEKSRET: + pass + else: + await message.channel.send("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 channel.send("Słyszałem ja żem że: " + message.content) return channel = message.channel - # await self.bot.process_commands(message) #uncomment to bilocate - message.content = message.content.lower() tdelta = datetime.now() - MASTER_TIMEOUT diff --git a/ai_functions.py b/ai_functions.py index bbca134..eb1395f 100644 --- a/ai_functions.py +++ b/ai_functions.py @@ -64,7 +64,6 @@ async def handle_response( and the response will be generated using a different model :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.info("Wywolanie procedury openai z promptem: %s", prompt) temp = {"role": "user", "content": username + ":" + prompt} diff --git a/conjurer_musician/radio_conjurer.liq b/conjurer_musician/radio_conjurer.liq index c26f5e1..2db40b0 100644 --- a/conjurer_musician/radio_conjurer.liq +++ b/conjurer_musician/radio_conjurer.liq @@ -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 interactive.harbor(port = 9999) -#harbor.input(buffer=30.0) # Set up interactive controls for bass boost 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.) diff --git a/librarian_commands.py b/librarian_commands.py index e3c67e8..ed858f6 100644 --- a/librarian_commands.py +++ b/librarian_commands.py @@ -28,6 +28,8 @@ class DataModule(commands.Cog): description="Wyświetla losową stronę z losowego komiksu FanSadox. Bardzo NSFW.", guild=discord.Object(id=664789470779932693), ) + @commands.has_any_role('Nocna Zmiana', 'Jarl', 'Thane' , 'Bartender') + async def get_image_sadox(self, ctx): """ 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) self.logger.info("Get sadox completed") - # TODO: LIBRARIAN @tasks.loop(seconds=3) async def check_data_q(self): """ @@ -118,7 +119,6 @@ class DataModule(commands.Cog): except Empty: pass - # TODO: LIBRARIAN @commands.hybrid_command( name="wyszukaj_linki_do_dokumentow", 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." ) - # TODO: LIBRARIAN @commands.hybrid_command( name="glebokie_gardlo", description="Przygotowuje drinka o nazwie głębokie gardło", guild=discord.Object(id=664789470779932693), ) + 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 diff --git a/music_commands.py b/music_commands.py index 1870199..12c4288 100644 --- a/music_commands.py +++ b/music_commands.py @@ -25,6 +25,7 @@ class MusicModule(commands.Cog): name="krecimy_pornola", description="Wiadomo co, dla kogo i po co", ) + @commands.has_any_role('Legenda', 'Jarl', 'Thane' , 'Bartender') async def krecimy_pornola(self, ctx): """ Download a music number from youtube. @@ -35,33 +36,28 @@ class MusicModule(commands.Cog): with the Discord API and """ await ctx.send("Dej mnie chwilkę") - allowed = False - for role in ctx.author.roles: - if role.name == "Bartender": - allowed = True - if allowed: - self.logger.info("Pornol") - async with ctx.typing(): - # wyciagnij linka z kontekstu - content = ctx.message.content.split() - for item_yt in content: - if re.match("http.*", item_yt): - sciezka, files = await music_functions.get_file( - ctx, "Pornol", item_yt + self.logger.info("Pornol") + async with ctx.typing(): + # wyciagnij linka z kontekstu + content = ctx.message.content.split() + for item_yt in content: + if re.match("http.*", item_yt): + sciezka, files = await music_functions.get_file( + ctx, "Pornol", item_yt + ) + if files: + self.logger.info("Pornol udany") + await ctx.send( + 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( name="co_na_plejliscie_wariacie", description="Wyswietl kawalki ktore sa na pocztku list radia", guild=discord.Object(id=664789470779932693), ) + @commands.has_any_role('Nocna Zmiana', 'Jarl', 'Thane' , 'Bartender') + async def co_na_plejliscie_wariacie(self, ctx): """ Download a music number from youtube. @@ -101,6 +97,7 @@ class MusicModule(commands.Cog): description="Podaj link do youtube - sciagnie i doda muzyke", guild=discord.Object(id=664789470779932693), ) + @commands.has_any_role('Nocna Zmiana', 'Jarl', 'Thane' , 'Bartender') async def dej_co_z_jutuba(self, ctx): """ Download a music number from youtube. @@ -132,6 +129,7 @@ class MusicModule(commands.Cog): description="Podaj link do spotify - sciagnie i doda muzyke", guild=discord.Object(id=664789470779932693), ) + @commands.has_any_role('Nocna Zmiana', 'Jarl', 'Thane' , 'Bartender') async def dej_co_ze_spotifaja(self, ctx): """ 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.", guild=discord.Object(id=664789470779932693), ) + @commands.has_any_role('Nocna Zmiana', 'Jarl', 'Thane' , 'Bartender') async def cisza(self, ctx): """ Stop playback of the music and clear the queue. @@ -213,6 +212,7 @@ class MusicModule(commands.Cog): description="Przerzuca na następny kawałek", guild=discord.Object(id=664789470779932693), ) + @commands.has_any_role('Nocna Zmiana', 'Jarl', 'Thane' , 'Bartender') async def dalej(self, ctx): """ Play next track in queue. @@ -230,12 +230,12 @@ class MusicModule(commands.Cog): voice_client.stop() self.logger.info("Next completed") - # TODO: MUSIC @commands.hybrid_command( name="daj_mi_chwile", description="Pauzuje", guild=discord.Object(id=664789470779932693), ) + @commands.has_any_role('Nocna Zmiana', 'Jarl', 'Thane' , 'Bartender') async def daj_mi_chwile(self, ctx): """ Pause music playback. @@ -254,12 +254,12 @@ class MusicModule(commands.Cog): voice_client.pause() self.logger.info("Pause completed") - # TODO: MUSIC @commands.hybrid_command( name="graj_dalej", description="Odpauzowuje", guild=discord.Object(id=664789470779932693), ) + @commands.has_any_role('Nocna Zmiana', 'Jarl', 'Thane' , 'Bartender') async def graj_dalej(self, ctx): """ Unpause music and continue playback. @@ -277,12 +277,12 @@ class MusicModule(commands.Cog): voice_client.resume() self.logger.info("Unpause completed") - # TODO: MUSIC @commands.hybrid_command( name="zagraj_mi_kawalek", description="Wyszukuje w bibliotece muzycznej Hammera kawałek który ma zostać zagrany", guild=discord.Object(id=664789470779932693), ) + @commands.has_any_role('Nocna Zmiana', 'Jarl', 'Thane' , 'Bartender') async def zagraj_mi_kawalek(self, ctx): """ 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" ) - # TODO: MUSIC @commands.hybrid_command( name="zrob_mi_plejliste", description="Generuje playliste - param1 - dlugosc, potem slowa wyszukiwania", guild=discord.Object(id=664789470779932693), ) + @commands.has_any_role('Nocna Zmiana', 'Jarl', 'Thane' , 'Bartender') 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. @@ -394,12 +394,12 @@ class MusicModule(commands.Cog): await ctx.send(reply) self.logger.info("Plejlista zrobiona") - # TODO: MUSIC @commands.hybrid_command( name="zagraj_muzyke_mego_ludu", description="Gra muzyke wyszukana na bazie tematow konwersacji na kanale NZ", guild=discord.Object(id=664789470779932693), ) + @commands.has_any_role('Nocna Zmiana', 'Jarl', 'Thane' , 'Bartender') async def zagraj_muzyke_mego_ludu(self, ctx): """ Play completeley random playlist based on messaging history. @@ -480,12 +480,12 @@ class MusicModule(commands.Cog): await ctx.send(reply) self.logger.info("Plejlista zrobiona") - # TODO: MUSIC @commands.hybrid_command( name="parametry_muzyki_mego_ludu", description="Konfiguruje komende zagraj muzyke mojego ludu", guild=discord.Object(id=664789470779932693), ) + @commands.has_any_role('Nocna Zmiana', 'Jarl', 'Thane' , 'Bartender') async def parametry_muzyki_mego_ludu( 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.", guild=discord.Object(id=664789470779932693), ) + @commands.has_any_role('Nocna Zmiana', 'Jarl', 'Thane' , 'Bartender') async def graj_muzyko(self, ctx): """ 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", guild=discord.Object(id=664789470779932693), ) + @commands.has_any_role('Legenda', 'Jarl', 'Thane' , 'Bartender') async def batch_download(self, ctx): content_type = ctx.message.attachments[0].content_type check = re.search("text\/plain; *charset=(.*)", content_type, re.IGNORECASE) diff --git a/other_commands.py b/other_commands.py index 22e4691..3609f2d 100644 --- a/other_commands.py +++ b/other_commands.py @@ -20,6 +20,7 @@ class OtherModule(commands.Cog): @commands.hybrid_command( 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): """ Generate a text about hugging mentioned user. @@ -53,6 +54,7 @@ class OtherModule(commands.Cog): ) @commands.hybrid_command(name="fabryczka", description="Historia fabryczki") + @commands.has_any_role('Legenda', 'Jarl', 'Thane' , 'Bartender') async def fabryczka(self, ctx): """ 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", guild=discord.Object(id=664789470779932693), ) + @commands.has_any_role('Legenda', 'Jarl', 'Thane' , 'Bartender') async def reset_the_clock(self, ctx): """ Reset the clock on "accidents" in Hammer Fortress adding a new one. @@ -105,6 +108,7 @@ class OtherModule(commands.Cog): name="chata_hammera", description="Czas od ostatniego incydentu w AbsinthHammerTimeSpaceContinuum", ) + @commands.has_any_role('Nocna Zmiana', 'Jarl', 'Thane' , 'Bartender') async def chata_hammera(self, ctx): """ 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", 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): """ Send a list of incidents in Hammer Fortress to the chat. @@ -149,12 +154,12 @@ class OtherModule(commands.Cog): index += 1 await ctx.send(return_data) - # TODO: RADIO @commands.hybrid_command( name="radio_hardkor", description="Włącza radio Conjurer na kanale #nocna-zmiana.", guild=discord.Object(id=664789470779932693), ) + @commands.has_any_role('Nocna Zmiana', 'Jarl', 'Thane' , 'Bartender') async def radio_hardkor(self, ctx): """ Plays the radio hardkor stream in the voice channel. diff --git a/other_functions.py b/other_functions.py index 58a69fc..28957d6 100644 --- a/other_functions.py +++ b/other_functions.py @@ -26,7 +26,6 @@ async def async_iterator_generator(range_of_iterable): """ -# TODO: OTHER async def remove_characters(string, character): """ The `remove_characters` function removes all occurrences of a specified character from a given @@ -39,7 +38,6 @@ async def remove_characters(string, character): return string.replace(character, "") -# TODO: OTHER async def max_weight(lista): """ Take a list of weights and return the maximum weight. diff --git a/radio_commands.py b/radio_commands.py index 53234a1..04d4d35 100644 --- a/radio_commands.py +++ b/radio_commands.py @@ -21,6 +21,7 @@ class RadioModule(commands.Cog): description="Przeskocz kawałek w radiu", guild=discord.Object(id=664789470779932693), ) + @commands.has_any_role('Legenda', 'Jarl', 'Thane' , 'Bartender') async def skip_track(self, ctx): async with ctx.typing(): allowed = False @@ -45,6 +46,7 @@ class RadioModule(commands.Cog): description="Komenda ktora uruchamia radio ponownie jakby się zawiesiło", guild=discord.Object(id=664789470779932693), ) + @commands.has_any_role('Legenda', 'Jarl', 'Thane' , 'Bartender') async def zrestartuj_radio(self, ctx): async with ctx.typing(): allowed = False @@ -68,6 +70,7 @@ class RadioModule(commands.Cog): description="Dodaje do listy ulubionych w radiu", guild=discord.Object(id=664789470779932693), ) + @commands.has_any_role('Legenda', 'Jarl', 'Thane' , 'Bartender') 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. @@ -104,6 +107,7 @@ class RadioModule(commands.Cog): description="Dodaje do listy ulubionych w radiu", guild=discord.Object(id=664789470779932693), ) + @commands.has_any_role('Nocna Zmiana', 'Jarl', 'Thane' , 'Bartender') async def request_radio(self, ctx): """ 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", guild=discord.Object(id=664789470779932693), ) + @commands.has_any_role('Legenda', 'Jarl', 'Thane' , 'Bartender') async def stworz_audycje(self, ctx): """ 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", guild=discord.Object(id=664789470779932693), ) + @commands.has_any_role('Legenda', 'Jarl', 'Thane' , 'Bartender') async def wyczysc_ulubione(self, ctx): """ Generate a playlist in queue. First word in this command shall be int defining length of the playlist. diff --git a/thin_client.py b/thin_client.py index a54cd6e..ddfefe6 100644 --- a/thin_client.py +++ b/thin_client.py @@ -73,9 +73,6 @@ async def on_ready(): logger.info("ID:", client.user.id) -# TODO: ADMINISTRATION - - # *================================== Run if __name__ == "__main__": logger.info("Starting discord bot") diff --git a/voice_recognition_commands.py b/voice_recognition_commands.py index 67b9be5..4ff2921 100644 --- a/voice_recognition_commands.py +++ b/voice_recognition_commands.py @@ -161,6 +161,7 @@ class Transcriber(commands.Cog): self.logger = logging.getLogger("discord") @commands.hybrid_command(name="transcribe") + @commands.has_any_role('Nocna Zmiana', 'Jarl', 'Thane' , 'Bartender') async def test(self, ctx): if self.vc: 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) @commands.command(name="stop_transcribe") + @commands.has_any_role('Nocna Zmiana', 'Jarl', 'Thane' , 'Bartender') async def stop(self, ctx): self.check_data.stop() stop_token = CommunicationObject("STOP", None, None)