Tag: 1.24

Intermediate commits (oldest → newest):
- Merge branch 'main' of https://github.com/migatu/conjurer
- Merge branch 'main' of https://github.com/migatu/conjurer
- BGFX
- Function for idv3 and bugfix
- Merge branch 'main' of https://github.com/migatu/conjurer
- Logs additional
- LGFIX
- FIXED!
- Arguments added to the utility.
- Fix old bug
- add exception handling
- Literowka
- Hej hoppsan!
- Add comment
- Fixc Fixc
- Fixit
- Inside joke very boomer much wow
- Fixing logging issues in music_functions.py and other_functions.py
- Maybe this will fix
- test
- test
- another attempt to fix the bug
- Maybe this is the fix ?
- Maybe fix
This commit is contained in:
2025-10-30 16:59:19 +01:00
parent db48605849
commit f73fd703b7
44 changed files with 4437 additions and 1888 deletions
+166 -77
View File
@@ -16,10 +16,10 @@ import os
import random
import re
import shutil
import subprocess
import sys
import threading
import uuid
import subprocess
from datetime import datetime
from logging import handlers
from pathlib import Path, PurePath
@@ -42,11 +42,16 @@ from discord.ext import commands, tasks
from spotipy.oauth2 import SpotifyClientCredentials
import yt_dlp
from communication_subroutine import (
IN_COMM_Q,
OUT_COMM_Q,
QueryControl,
comm_subroutine,
PREPPED_TRACKS,
)
from spotify_dl import spotify
from spotify_dl import youtube as youtube_download
from communication_subroutine import comm_subroutine, IN_COMM_Q, OUT_COMM_Q, QueryControl
# *=========================== Classes definition
# The above code is defining a TypedDict called `Music_Config` in Python. This TypedDict has three
@@ -63,7 +68,6 @@ Music_Config = TypedDict(
)
class MusicFileList(object):
"""
The `MusicFileList` class manages a list of music files, with the ability to refresh the list from a
@@ -118,7 +122,6 @@ class MusicFileList(object):
# *=========================================== Predefines
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
MASTER_TIMEOUT = datetime.now()
INITIAL_TIME_WAIT = 500
MUZYKA: Music_Config = {"ctx": None, "queue": [], "requester": []}
@@ -212,7 +215,6 @@ REMOTE_HOST_NAME = "openai"
authTokens = netrc_mod.authenticators(REMOTE_HOST_NAME)
openai.api_key = authTokens[2]
openAIClient = openai.AsyncOpenAI(api_key=openai.api_key)
REMOTE_HOST_NAME = "spotipy"
authTokens = netrc_mod.authenticators(REMOTE_HOST_NAME)
spotify_ctrl = spotipy.Spotify(
@@ -239,6 +241,7 @@ handler = handlers.RotatingFileHandler(
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()
@@ -284,7 +287,6 @@ for key in word_reactions:
logger.info("Done")
# *=========================================== Create Client
logger.info("Creating discord bot")
client = commands.Bot(intents=intents, command_prefix="$")
@@ -298,8 +300,14 @@ logger.info("Done")
async def on_ready():
"""Metoda wywoływana przy połączeniu do serwera."""
logger.debug("%s has connected to Discord!", client.user)
#TODO: load vs reload
#try:
await client.load_extension("voice_recognition_commands")
logger.info(client.cogs)
await client.change_presence(activity=discord.Game(name="Axe Throwing Darts"))
await client.tree.sync()
for com in client.commands:
logger.info("Command %s is awejleble", com.qualified_name)
check_self.start()
check_data_q.start()
@@ -339,9 +347,13 @@ async def on_message(message):
if message.channel.id == 1111625221171052595:
return
if isinstance(message.channel, discord.DMChannel):
channel = client.get_channel(1064888712565100614)
await channel.send("Słyszałem ja żem że: " + message.content)
return
if message.author.id == 346956223645614080:
await message.reply("Witam witam")
return
else:
channel = client.get_channel(1064888712565100614)
await channel.send("Słyszałem ja żem że: " + message.content)
return
channel = message.channel
await client.process_commands(message)
@@ -404,7 +416,13 @@ async def on_message(message):
result, MESSAGE_TABLE = await handle_response(
prompt, vykidailo, bartender, MESSAGE_TABLE, username, "CONVERSATION"
)
await message.reply(result)
if len(result) < 1500:
await message.reply(result)
else:
while len(result) > 1500:
await message.reply(result[:1500])
result = result[1500:]
if "imaginuje sobie:" in message.content:
async with channel.typing():
logger.info("Poczatek procedury obrazkowej")
@@ -528,16 +546,20 @@ async def connect(ctx, arg=None):
"""
if ctx and arg:
logger.info("Ctx and arg defined for connect")
voice_channel = client.get_channel(1060349757349974066)
if client.voice_clients:
voice_client = client.voice_clients[0]
if voice_client.is_connected():
logger.info("Already connected with other client")
else:
vc = None
if ctx.author.voice.channel:
vc = await ctx.author.voice.channel.connect()
else:
voice_channel = client.get_channel(1060349757349974066)
vc = await voice_channel.connect()
if not vc:
logger.error("Not possible to connect to voice")
return
voice_channel_connection = await voice_channel.connect()
if not voice_channel_connection:
logger.error("Not possible to connect to voice")
logger.info("Connecting to voice")
logger.info("Connected to voice")
async def disconnect(ctx):
@@ -637,7 +659,12 @@ async def play(ctx, zamawial=None, arg=None):
query, vykidailo, bartender, message_table_muzyka, username, "MUSIC"
)
logger.debug("Obecna historia czatu: %s", message_table_muzyka)
await ctx.send(result)
if len(result) < 1500:
await ctx.send(result)
else:
while len(result) > 1500:
await ctx.send(result[:1500])
result = result[1500:]
async def archive_channel(channel_no):
@@ -676,6 +703,7 @@ async def check_music():
await play(MUZYKA["ctx"], MUZYKA["requester"])
await asyncio.sleep(2)
@tasks.loop(seconds=3)
async def check_data_q():
"""
@@ -691,40 +719,42 @@ async def check_data_q():
for doi in fresh_data.entries:
logger.info(doi)
desc = fresh_data.entries[doi]
title = desc['Title'][0]
entries.append(f"{l_p}. {title} pod linkiem https://www.sci-hub.se/{doi} i jest to {desc['type']}\n")
l_p+=1
message = '*Z podłogi wysuwa się winda na książki*'
title = desc["Title"][0]
entries.append(
f"{l_p}. {title} pod linkiem https://www.sci-hub.se/{doi} i jest to {desc['type']}\n"
)
l_p += 1
message = "*Z podłogi wysuwa się winda na książki*"
if fresh_data.ctx is not None:
ctx = fresh_data.ctx
message += f' Dzielny poszukiwaczu @{searcher} w odpowiedzi na twoje zapytanie {query} nr {fresh_data.uuid}'
message += f" Dzielny poszukiwaczu @{searcher} w odpowiedzi na twoje zapytanie {query} nr {fresh_data.uuid}"
else:
ctx = client.get_channel(1062047571557744721)
message += f' Mam wynik dla zapytania {fresh_data.uuid} ale że Hammer coś grzebał nie pamiętam kto to chciał i co chciał'
message += f" Mam wynik dla zapytania {fresh_data.uuid} ale że Hammer coś grzebał nie pamiętam kto to chciał i co chciał"
message += 'nasza biblioteka służy Ci odpowiedzią. Przy dźwięku fanfar winda się otwiera a w środku '
if len(entries)<1:
message += "nasza biblioteka służy Ci odpowiedzią. Przy dźwięku fanfar winda się otwiera a w środku "
if len(entries) < 1:
message += "niestety nie ma nic"
await ctx.send(message)
elif len(entries)>=1 and len(entries)<5:
elif len(entries) >= 1 and len(entries) < 5:
message += " znajduje się coś:\n"
for item in entries:
message+=item
message += item
await ctx.send(message)
else:
message+= " znajduje się cholernie dużo:\n"
message += " znajduje się cholernie dużo:\n"
for item in entries:
message+=item
message += item
if len(message) > 1500:
await ctx.send(message)
message = ""
#Kept for sentimental reasons
#await ctx.send(f"O. A tak będzie wyglądało coś ciekawego w przyszłości: {data}")
# Kept for sentimental reasons
# await ctx.send(f"O. A tak będzie wyglądało coś ciekawego w przyszłości: {data}")
except Empty:
pass
@tasks.loop(seconds=120)
async def check_self():
"""
@@ -1082,9 +1112,13 @@ async def get_file(ctx, source, link):
logger.info(item_type)
logger.info(item_id)
logger.info("Spotify link provided")
file_list = await asyncio.to_thread(spotify.fetch_tracks, spotify_ctrl, item_type, link)
file_list = await asyncio.to_thread(
spotify.fetch_tracks, spotify_ctrl, item_type, link
)
logger.info(file_list)
directory_name = await asyncio.to_thread(spotify.get_item_name, spotify_ctrl, item_type, item_id)
directory_name = await asyncio.to_thread(
spotify.get_item_name, spotify_ctrl, item_type, item_id
)
logger.info(directory_name)
logger.info("Spotify scrape done")
url_data = {"urls": []}
@@ -1351,6 +1385,7 @@ async def max_weight(lista):
# *=========================================== Define Commands
@client.hybrid_command(
name="skip_track",
description="Przeskocz kawałek w radiu",
@@ -1360,15 +1395,15 @@ async def skip_track(ctx):
async with ctx.typing():
allowed = False
for role in ctx.author.roles:
if role.name in ("Thane","Jarl"):
if role.name in ("Thane", "Jarl"):
allowed = True
if not allowed:
await ctx.send("Łapy precz od radia")
else:
coroutine = asyncio.to_thread(
requests.get,
f"{RADIO_HARBOR_ADDRESS}{SKIP_TRACK}",
timeout=360,
requests.get,
f"{RADIO_HARBOR_ADDRESS}{SKIP_TRACK}",
timeout=360,
)
result = await coroutine
logger.info("Done %s", result)
@@ -1384,13 +1419,19 @@ async def zrestartuj_radio(ctx):
async with ctx.typing():
allowed = False
for role in ctx.author.roles:
if role.name in ("Thane","Jarl"):
if role.name in ("Thane", "Jarl"):
allowed = True
if not allowed:
await ctx.send("Łapy precz od radia")
else:
retcode = subprocess.run("/home/pi/Conjurer/restart_radio.sh", shell=False, check = False, capture_output = True)
logger.info("Wynik: %s",retcode)
retcode = subprocess.run(
"/home/pi/Conjurer/restart_radio.sh",
shell=False,
check=False,
capture_output=True,
)
logger.info("Wynik: %s", retcode)
@client.hybrid_command(
name="dej_co_ze_spotifaja",
@@ -1633,6 +1674,7 @@ async def graj_muzyko(ctx):
logger.info("Press play on tape completed")
check_music.start()
@client.hybrid_command(
name="radio_hardkor",
description="Włącza radio Conjurer na kanale #nocna-zmiana.",
@@ -1657,9 +1699,10 @@ async def radio_hardkor(ctx):
voice_client = client.voice_clients[0]
voice_client.play(
discord.PCMVolumeTransformer(
discord.FFmpegPCMAudio("http://95.175.16.246:666/mp3-stream"), volume=0.3
)
discord.FFmpegPCMAudio("http://95.175.16.246:666/mp3-stream"),
volume=0.3,
)
)
logger.info("Press play on radio completed")
else:
logger.error("Already playing")
@@ -1667,7 +1710,6 @@ async def radio_hardkor(ctx):
check_music.start()
@client.hybrid_command(
name="cisza",
description="Wyłącza muzykę i czyści plejliste.",
@@ -1810,6 +1852,7 @@ async def zagraj_mi_kawalek(ctx):
"Obawiam się że nie mogę nic znaleźć u siebie. Spróbuj komendy '$dej_co_ze_spotifaja' jeśli masz link"
)
@client.hybrid_command(
name="dodaj_do_ulubionych",
description="Dodaje do listy ulubionych w radiu",
@@ -1844,6 +1887,8 @@ async def dodaj_do_ulubionych(ctx):
result = await coroutine
logger.info("Done %s", result)
await ctx.send("Zrobione szefie!")
@client.hybrid_command(
name="ja_chciol",
description="Dodaje do listy ulubionych w radiu",
@@ -1877,6 +1922,7 @@ async def request_radio(ctx):
logger.info("Done %s", result)
await ctx.send("Zrobione szefie!")
@client.hybrid_command(
name="stworz_audycje",
description="Dodaje do listy ulubionych w radiu",
@@ -2316,11 +2362,18 @@ async def wyszukaj_linki_do_dokumentow(ctx):
"""
query = ctx.message.content
query_uuid = uuid.uuid4()
#TODO: TESTING ONLY!!
#query_uuid = uuid.UUID('{12345678-1234-5678-1234-567812345678}')
ctx.message.content = ctx.message.content.replace("$wyszukaj_linki_do_dokumentow", "")
# TODO: TESTING ONLY!!
# query_uuid = uuid.UUID('{12345678-1234-5678-1234-567812345678}')
ctx.message.content = ctx.message.content.replace(
"$wyszukaj_linki_do_dokumentow", ""
)
json_query = {"UUID": str(query_uuid), "query": str(query), "page": 1, "deep_search": False}
json_query = {
"UUID": str(query_uuid),
"query": str(query),
"page": 1,
"deep_search": False,
}
coroutine = asyncio.to_thread(
requests.post,
f"{LIBRARIAN_SERVICE_ADDRESS}{SEND_QUERY}",
@@ -2328,14 +2381,16 @@ async def wyszukaj_linki_do_dokumentow(ctx):
timeout=360,
)
await ctx.send(
"*Conjurer powoli notuje podane przez Ciebie. Podchodzi do sprytnie ukrytej przy barze rury od poczty pneumatycznej i" +
" wrzuca twój liścik do środka* To teraz trza poczekać kilka godzin. Biblioteka to 3/4 stacji."+
" A przecież pół stacji to browar, motelik dla zabaw cielesnych i ten Bar. Więc 12/8 stacji teraz będzie ciężko pracować"
"*Conjurer powoli notuje podane przez Ciebie. Podchodzi do sprytnie ukrytej przy barze rury od poczty pneumatycznej i"
+ " wrzuca twój liścik do środka* To teraz trza poczekać kilka godzin. Biblioteka to 3/4 stacji."
+ " A przecież pół stacji to browar, motelik dla zabaw cielesnych i ten Bar. Więc 12/8 stacji teraz będzie ciężko pracować"
)
query_response = await coroutine
if not query_response.status_code == 200:
await ctx.send("*Z rury wydobywa się dym. Conjurer łapie pierwszą ciecz pod ręką i pryska na rurę. Następuje drobna eksplozja i wszystko zaczyna się palić."+
" Conjurer jest skonfundowany..* Wołaj szefa - mam nieodparte wrażenie że się coś wyjebało")
await ctx.send(
"*Z rury wydobywa się dym. Conjurer łapie pierwszą ciecz pod ręką i pryska na rurę. Następuje drobna eksplozja i wszystko zaczyna się palić."
+ " Conjurer jest skonfundowany..* Wołaj szefa - mam nieodparte wrażenie że się coś wyjebało"
)
return
query, query_uuid, queue_size = (
@@ -2347,10 +2402,13 @@ async def wyszukaj_linki_do_dokumentow(ctx):
username = ctx.message.author.nick
else:
username = ctx.message.author.name
query_object = QueryControl(username, query_uuid, query, logger, ctx)
query_object = QueryControl(username, query_uuid, query, ctx)
OUT_COMM_Q.put(query_object)
await ctx.send(f"No dobra poszło. Zapamiętaj proszę {query_uuid} - to identyfikator twojego zapytania. Jesteś {queue_size} w kolejce."+
" 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.")
await ctx.send(
f"No dobra poszło. Zapamiętaj proszę {query_uuid} - to identyfikator twojego zapytania. Jesteś {queue_size} w kolejce."
+ " 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."
)
@client.hybrid_command(
name="glebokie_gardlo",
@@ -2394,13 +2452,23 @@ async def wyszukaj_linki_do_dokumentow_deep(ctx):
result, MESSAGE_TABLE = await handle_response(
prompt, vykidailo, bartender, MESSAGE_TABLE, username, "CONVERSATION"
)
await ctx.send(result)
if len(result) < 1500:
await ctx.send(result)
else:
while len(result) > 1500:
await ctx.send(result[:1500])
result = result[1500:]
return
query_uuid = uuid.uuid4()
#TODO: TESTING ONLY!!
#query_uuid = uuid.UUID('{12345678-1234-5678-1234-567812345678}')
json_query = {"UUID": str(query_uuid), "query": str(query), "page": 1, "deep_search": True}
# TODO: TESTING ONLY!!
# query_uuid = uuid.UUID('{12345678-1234-5678-1234-567812345678}')
json_query = {
"UUID": str(query_uuid),
"query": str(query),
"page": 1,
"deep_search": True,
}
coroutine = asyncio.to_thread(
requests.post,
f"{LIBRARIAN_SERVICE_ADDRESS}{SEND_QUERY}",
@@ -2408,14 +2476,16 @@ async def wyszukaj_linki_do_dokumentow_deep(ctx):
timeout=360,
)
await ctx.send(
"*Conjurer mruga okiem i zamiast drinka wyjmuje dysk usb z terminala. Podchodzi do sprytnie ukrytej przy barze rury od poczty pneumatycznej i" +
" wrzuca ten dysk do środk* To teraz trza poczekać kilka godzin. TO będzie głębokie wyszukanie"+
" Rozgląda się dookoła i stawia przed tobą mętnego drinka o zapachu mięty, gwiezdnego pyłu i oleju silnikowego"
"*Conjurer mruga okiem i zamiast drinka wyjmuje dysk usb z terminala. Podchodzi do sprytnie ukrytej przy barze rury od poczty pneumatycznej i"
+ " wrzuca ten dysk do środk* To teraz trza poczekać kilka godzin. TO będzie głębokie wyszukanie"
+ " Rozgląda się dookoła i stawia przed tobą mętnego drinka o zapachu mięty, gwiezdnego pyłu i oleju silnikowego"
)
query_response = await coroutine
if not query_response.status_code == 200:
await ctx.send("*Z rury wydobywa się dym. Conjurer łapie pierwszą ciecz pod ręką i pryska na rurę. Następuje drobna eksplozja i wszystko zaczyna się palić."+
" Conjurer jest skonfundowany..* Wołaj szefa - mam nieodparte wrażenie że się coś wyjebało")
await ctx.send(
"*Z rury wydobywa się dym. Conjurer łapie pierwszą ciecz pod ręką i pryska na rurę. Następuje drobna eksplozja i wszystko zaczyna się palić."
+ " Conjurer jest skonfundowany..* Wołaj szefa - mam nieodparte wrażenie że się coś wyjebało"
)
return
query, query_uuid, queue_size = (
@@ -2427,11 +2497,12 @@ async def wyszukaj_linki_do_dokumentow_deep(ctx):
username = ctx.message.author.nick
else:
username = ctx.message.author.name
query_object = QueryControl(username, query_uuid, query, logger, ctx)
query_object = QueryControl(username, query_uuid, query, ctx)
OUT_COMM_Q.put(query_object)
await ctx.send(f"Wypij wypi {query_uuid} - to identyfikator twojego zapytania. Jesteś {queue_size} w kolejce niestety kolejka obowiazuje zawsze."+
" Zapytania obsługuje algorytm zasilany czterema chomikami zapierdalającymi w kołowrotku - więc wyniki najwcześniej za kilka godzin - ale mogą być też dni. Głębokie zabawy trwają dłużej. *Znowu mruga*")
await ctx.send(
f"Wypij wypi {query_uuid} - to identyfikator twojego zapytania. Jesteś {queue_size} w kolejce niestety kolejka obowiazuje zawsze."
+ " Zapytania obsługuje algorytm zasilany czterema chomikami zapierdalającymi w kołowrotku - więc wyniki najwcześniej za kilka godzin - ale mogą być też dni. Głębokie zabawy trwają dłużej. *Znowu mruga*"
)
@client.hybrid_command(
@@ -2463,11 +2534,29 @@ async def krecimy_pornola(ctx):
sciezka, files = await get_file(ctx, "Pornol", item_yt)
if files:
logger.info("Pornol udany")
ctx.send(f"Jest w tajnym archiwum pod adresem{sciezka})")
await ctx.send(f"Jest w tajnym archiwum pod adresem{sciezka})")
else:
ctx.reply("Jak ładnie szefa poprosisz.")
await ctx.reply("Jak ładnie szefa poprosisz.")
@client.hybrid_command(
name="co_na_plejliscie_wariacie",
description="Wyswietl kawalki ktore sa na pocztku list radia",
guild=discord.Object(id=664789470779932693),
)
async def co_na_plejliscie_wariacie(ctx):
"""
Download a music number from youtube.
:param ctx: ctx stands for "context" and is a parameter commonly used in Discord.py commands. It
represents the context in which the command was invoked, including information such as the message,
the channel, the server, and the user who invoked the command. It allows the command to interact
with the Discord API and
"""
await ctx.send("Dej mnie chwilkę")
async with ctx.typing():
logger.info("plejlista")
logger.info(PREPPED_TRACKS)
await ctx.send(f"Didżej Hammer i jego sztuczna inteligencja (||he he||) prezentują: \n- obecnie grany jest {(PREPPED_TRACKS['now_playing']).rstrip()} (wg metadanych: {PREPPED_TRACKS['meta']}) \n- następny będzie{(PREPPED_TRACKS['next']).rstrip()} \n- na liście priorytetowej {(PREPPED_TRACKS['priority']).rstrip()} \n- na liście hitów obecnie czeka kawałek {(PREPPED_TRACKS['hit']).rstrip()} \n- na liście wszystkich kawałków {(PREPPED_TRACKS['all']).rstrip()} \n- najświeższym zamówieniem od słuchaczy jest {(PREPPED_TRACKS['requests']).rstrip()} \nZ kolei jingiel to: {(PREPPED_TRACKS['jingles']).rstrip()}")
# *================================== Run
if __name__ == "__main__":
@@ -2475,16 +2564,16 @@ if __name__ == "__main__":
threads = []
logger.info("Starting discord bot: Creating threads")
threads.append(threading.Thread(target=client.run, args=(TOKEN,)))
threads.append(threading.Thread(target=comm_subroutine, args=(logger,)))
threads.append(threading.Thread(target=comm_subroutine))
logger.info("Starting discord bot: Starting threads")
WRK_CNT = 0
for worker in threads:
WRK_CNT+=1
WRK_CNT += 1
logger.info("Starting discord bot: Starting thread %s", WRK_CNT)
worker.start()
logger.info("Starting discord bot: Joining threads")
WRK_CNT=0
WRK_CNT = 0
for worker in threads:
WRK_CNT+=1
WRK_CNT += 1
logger.info("Starting discord bot: Joining thread %s", WRK_CNT)
worker.join()