diff --git a/bot.py b/bot.py index bba940f..6706ded 100644 --- a/bot.py +++ b/bot.py @@ -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,15 @@ 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, +) 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 +67,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 @@ -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="$") @@ -404,7 +406,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") @@ -637,7 +645,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 +689,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 +705,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 +1098,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 +1371,7 @@ async def max_weight(lista): # *=========================================== Define Commands + @client.hybrid_command( name="skip_track", description="Przeskocz kawałek w radiu", @@ -1360,15 +1381,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 +1405,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 +1660,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 +1685,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 +1696,6 @@ async def radio_hardkor(ctx): check_music.start() - @client.hybrid_command( name="cisza", description="Wyłącza muzykę i czyści plejliste.", @@ -1810,6 +1838,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 +1873,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 +1908,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 +2348,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 +2367,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 = ( @@ -2349,8 +2390,11 @@ async def wyszukaj_linki_do_dokumentow(ctx): username = ctx.message.author.name query_object = QueryControl(username, query_uuid, query, logger, 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 +2438,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 +2462,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 = ( @@ -2429,9 +2485,10 @@ async def wyszukaj_linki_do_dokumentow_deep(ctx): username = ctx.message.author.name query_object = QueryControl(username, query_uuid, query, logger, 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( @@ -2468,7 +2525,6 @@ async def krecimy_pornola(ctx): ctx.reply("Jak ładnie szefa poprosisz.") - # *================================== Run if __name__ == "__main__": logger.info("Starting discord bot") @@ -2479,12 +2535,12 @@ if __name__ == "__main__": 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()