diff --git a/bot.py b/bot.py index c5bed69..a047655 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 @@ -42,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", { @@ -50,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") @@ -77,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 @@ -265,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.""" @@ -2022,6 +2040,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 @@ -2085,12 +2106,49 @@ 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 -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") + threads = [] + 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 bf194cf..2fee15a 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 22dacea..7406f4c 100644 --- a/conjurer_librarian/search_bot.py +++ b/conjurer_librarian/search_bot.py @@ -9,6 +9,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() @@ -29,6 +32,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: