From 9061203aae93d127a178b13a4ddca34fa4174f31 Mon Sep 17 00:00:00 2001 From: Migatu Date: Sun, 7 Apr 2024 22:02:53 +0200 Subject: [PATCH 1/4] Plany --- bot.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/bot.py b/bot.py index c5bed69..c3ddd03 100644 --- a/bot.py +++ b/bot.py @@ -2022,6 +2022,9 @@ async def wyszukaj_linki_do_dokumentow(ctx): coroutine = asyncio.to_thread(requests.post, f"{LIBRARIAN_SERVICE_ADDRESS}{SEND_QUERY}", json=json_query, timeout=360) #query_response = await requests.post(f"{LIBRARIAN_SERVICE_ADDRESS}{SEND_QUERY}", json=json_query, timeout=360) query_response = await coroutine + #TODO: tutaj jest informacja UUID o requescie zapisywana w queue i konczymy + #TODO: response'y idą do serwera, serwer sobie je mieli i potem wysyła do nas posta albo response + if not query_response.status_code == 200: await ctx.send("Wołaj szefa - coś się wyjebało") return @@ -2088,8 +2091,10 @@ async def krecimy_pornola(ctx): # *================================== Run -logger.info("Starting discord bot") -client.run(TOKEN) +if __name__ == "__main__": + #TODO: wpakowac kondzia w wąteki odpalic asynchronicznie rownolegle z flaskiem do sterowania nim + logger.info("Starting discord bot") + client.run(TOKEN) #widok - generuje się 5 stron po 4 linki From e93eef28b3c462c26f3e9174f0a02433a3668ef9 Mon Sep 17 00:00:00 2001 From: Migatu Date: Mon, 8 Apr 2024 15:20:44 +0200 Subject: [PATCH 2/4] Threading att 1 --- bot.py | 18 ++++++++++++++---- conjurer_librarian/conjurer_librarian.py | 4 ---- conjurer_librarian/search_bot.py | 4 ++++ 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/bot.py b/bot.py index c3ddd03..10d05e3 100644 --- a/bot.py +++ b/bot.py @@ -18,13 +18,14 @@ import re import shutil import sys import uuid +import threading from datetime import datetime from logging import handlers from pathlib import Path, PurePath from platform import uname from sys import platform from typing import List, Optional, TypedDict - +from queue import Queue, Empty # *==============Imported libraries import discord import eyed3 @@ -2094,8 +2095,17 @@ async def krecimy_pornola(ctx): if __name__ == "__main__": #TODO: wpakowac kondzia w wąteki odpalic asynchronicznie rownolegle z flaskiem do sterowania nim logger.info("Starting discord bot") - client.run(TOKEN) - + threads = [] + comm_q = Queue() + t_bot = threads.append(threading.Thread(target=client.run, args=(TOKEN,))) + for worker in threads: + worker.start() + for worker in threads: + worker.join() #widok - generuje się 5 stron po 4 linki -# odśwież - zamienić na "dalej" - zaciąga kolejne 20 rezultatów \ No newline at end of file +# odśwież - zamienić na "dalej" - zaciąga kolejne 20 rezultatów +# po wyslaniu czekamy na odbior i dodajemy UUID oraz nick poszukiwacza do queue ktora jest sprawdzana +# flask sobie chodzi i jak dostaje posta z wynikami to wyciaga z queue UUID i odpowiada że znalazła +# po samym wyszukaniu dajemy info że "Zaczynam szukać ale pare godzin to potrwa." +# OPCJONALNIE: Dosyłamy znalezione wyniki na bieżąco - wtedy wkładamy do queue dla UUID wyniki \ No newline at end of file diff --git a/conjurer_librarian/conjurer_librarian.py b/conjurer_librarian/conjurer_librarian.py index b1b627a..0e38b52 100644 --- a/conjurer_librarian/conjurer_librarian.py +++ b/conjurer_librarian/conjurer_librarian.py @@ -199,7 +199,3 @@ if __name__ == "__main__": worker.start() for worker in threads: worker.join() - -#1. robi liste wyników i ją wyświetla - ale tylko tytuły niezależnych dzieł - jeśli jest coś w containerze to trza pogrupować -#2. Tworzy przyciski pozwalające sprawdzić czy jest dostępne - i jeśli jest zwraca link -#3. Jest też przycisk "more" - wyszukujemy po 100, wyświetlamy po 20. Po 100 jak jeszcze to dopiero odpytujemy crossref przyciski strzałek przesuwają po obecnej porcji danych diff --git a/conjurer_librarian/search_bot.py b/conjurer_librarian/search_bot.py index 9fc9fad..1a46a56 100644 --- a/conjurer_librarian/search_bot.py +++ b/conjurer_librarian/search_bot.py @@ -8,6 +8,9 @@ ENCODING = "utf-8" CHUNk = "_chunk.txt" _sentinel = object() +#TODO: Doisy wchodzą jako lista krotek (doi, False) - po znalezieniu zaznaczamy na True i potem już nie porównujemy +#TODO: lista krotek - jeśli wszystkie mają True dajemy terma + def producer(out_q, control_q, filename): with open(DATABASE_PATH + filename, "r+", encoding=ENCODING) as operated_file: lines = operated_file.readlines() @@ -28,6 +31,7 @@ def producer(out_q, control_q, filename): #IMPORTANT!!! ONLY ONE CONSUMER THREAD AS WE ARE NOT PUTTING SENTINELS BACK +#TODO: Change doi to tuple list and only put term when all doi are found => (doi, True) def consumer(in_q, control_q, doi): sentinels = 0 while True: From 730845e01c2d2fc1a959a1d90429e9f7dbf1605d Mon Sep 17 00:00:00 2001 From: Migatu Date: Mon, 8 Apr 2024 15:41:39 +0200 Subject: [PATCH 3/4] Server to communicate --- bot.py | 52 ++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 48 insertions(+), 4 deletions(-) diff --git a/bot.py b/bot.py index 10d05e3..7d0e329 100644 --- a/bot.py +++ b/bot.py @@ -43,6 +43,11 @@ import yt_dlp from spotify_dl import spotify from spotify_dl import youtube as youtube_download +from flask import Flask, jsonify, request +from waitress import serve + + +COMM_Q = Queue() Music_Config = TypedDict( "Music_Config", { @@ -51,6 +56,15 @@ Music_Config = TypedDict( "requester": List[str], }, ) +class QueryControl(): + def __init__(self, query_author, query_uuid, query_content, uplogger) -> None: + self.author = query_author + self.uuid = query_uuid + self.content = query_content + self.logger = uplogger + self.logger.info(f"Created Query control for {self.author}, {self.uuid}: {self.content}") + self.replies = [] + # *=========================================== Predefines formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") @@ -78,6 +92,8 @@ LIBRARIAN_SERVICE_ADDRESS = "http://192.168.1.192:5001" SEND_QUERY = "/query" TIME_BETWEEN_CALLS = 100000 LAST_SPONTANEOUS_CALL = datetime.now() +HOST_ADDRESS = "http://192.168.1.192" +PORT_ADDRESS = "5000" # *=========================================== Platform Specific Predefines @@ -266,9 +282,10 @@ logger.info("Done") logger.info("Creating discord bot") client = commands.Bot(intents=intents, command_prefix="$") logger.info("Done") +logger.info("Creating flask app") +app = Flask(__name__) +logger.info("Done") # *=========================================== Define Events - - @client.event async def on_ready(): """Metoda wywoływana przy połączeniu do serwera.""" @@ -2089,6 +2106,34 @@ async def krecimy_pornola(ctx): else: ctx.reply("Jak ładnie szefa poprosisz.") +@app.route("/", methods=["POST"]) +def answer_external_command(): + record = json.loads(request.data) + logger.info(record) + answer_data = None + if "UUID" in record and "QUERY" in record and "AUTHOR" in record: + answer_data = "Query logged" + + return_data = ( + jsonify(isError=False, message="Success", statusCode=200, data=answer_data), + 200, + ) + return return_data + +def flask_debug(): + """ + The `flask_debug` function starts a Flask application in debug mode without using the reloader. + Do not use for production for fucks sake. + """ + # trunk-ignore(bandit/B201) + app.run(debug=True, use_reloader=False, host=HOST_ADDRESS, port=PORT_ADDRESS) + +def waitress_run(): + """ + The `waitress_run` function serves the `app` on host "0.0.0.0" + and port 5000 using the Waitress WSGI server. + """ + serve(app, host=HOST_ADDRESS, port=PORT_ADDRESS) # *================================== Run @@ -2096,8 +2141,7 @@ if __name__ == "__main__": #TODO: wpakowac kondzia w wąteki odpalic asynchronicznie rownolegle z flaskiem do sterowania nim logger.info("Starting discord bot") threads = [] - comm_q = Queue() - t_bot = threads.append(threading.Thread(target=client.run, args=(TOKEN,))) + threads.append(threading.Thread(target=client.run, args=(TOKEN,))) for worker in threads: worker.start() for worker in threads: From d99e8c12cac43e60a8b520fd0d4ee7fdea8b0082 Mon Sep 17 00:00:00 2001 From: Migatu Date: Mon, 8 Apr 2024 15:42:08 +0200 Subject: [PATCH 4/4] Server pt2 --- bot.py | 1 - 1 file changed, 1 deletion(-) diff --git a/bot.py b/bot.py index 7d0e329..a047655 100644 --- a/bot.py +++ b/bot.py @@ -2113,7 +2113,6 @@ def answer_external_command(): answer_data = None if "UUID" in record and "QUERY" in record and "AUTHOR" in record: answer_data = "Query logged" - return_data = ( jsonify(isError=False, message="Success", statusCode=200, data=answer_data), 200,