This commit is contained in:
2024-04-10 13:18:22 +02:00
4 changed files with 283 additions and 110 deletions
+204 -108
View File
@@ -17,15 +17,16 @@ import random
import re import re
import shutil import shutil
import sys import sys
import uuid
import threading import threading
import uuid
from datetime import datetime from datetime import datetime
from logging import handlers from logging import handlers
from pathlib import Path, PurePath from pathlib import Path, PurePath
from platform import uname from platform import uname
from queue import Empty
from sys import platform from sys import platform
from typing import List, Optional, TypedDict from typing import List, Optional, TypedDict
from queue import Queue, Empty
# *==============Imported libraries # *==============Imported libraries
import discord import discord
import eyed3 import eyed3
@@ -43,11 +44,9 @@ import yt_dlp
from spotify_dl import spotify from spotify_dl import spotify
from spotify_dl import youtube as youtube_download from spotify_dl import youtube as youtube_download
from flask import Flask, jsonify, request from communication_subroutine import comm_subroutine, IN_COMM_Q, OUT_COMM_Q
from waitress import serve
COMM_Q = Queue()
Music_Config = TypedDict( Music_Config = TypedDict(
"Music_Config", "Music_Config",
{ {
@@ -56,13 +55,19 @@ Music_Config = TypedDict(
"requester": List[str], "requester": List[str],
}, },
) )
class QueryControl():
def __init__(self, query_author, query_uuid, query_content, uplogger) -> None:
class QueryControl:
def __init__(self, query_author, query_uuid, query_content, uplogger, ctx) -> None:
self.author = query_author self.author = query_author
self.uuid = query_uuid self.uuid = query_uuid
self.content = query_content self.content = query_content
self.logger = uplogger self.logger = uplogger
self.logger.info(f"Created Query control for {self.author}, {self.uuid}: {self.content}") self.stop = False
self.ctx = ctx
self.logger.info(
f"Created Query control for {self.author}, {self.uuid}: {self.content}"
)
self.replies = [] self.replies = []
@@ -92,8 +97,8 @@ LIBRARIAN_SERVICE_ADDRESS = "http://192.168.1.192:5001"
SEND_QUERY = "/query" SEND_QUERY = "/query"
TIME_BETWEEN_CALLS = 100000 TIME_BETWEEN_CALLS = 100000
LAST_SPONTANEOUS_CALL = datetime.now() LAST_SPONTANEOUS_CALL = datetime.now()
HOST_ADDRESS = "http://192.168.1.192" HOST_ADDRESS = "192.168.1.191"
PORT_ADDRESS = "5000" PORT_ADDRESS = 5000
# *=========================================== Platform Specific Predefines # *=========================================== Platform Specific Predefines
@@ -283,8 +288,9 @@ logger.info("Creating discord bot")
client = commands.Bot(intents=intents, command_prefix="$") client = commands.Bot(intents=intents, command_prefix="$")
logger.info("Done") logger.info("Done")
logger.info("Creating flask app") logger.info("Creating flask app")
app = Flask(__name__)
logger.info("Done") logger.info("Done")
# *=========================================== Define Events # *=========================================== Define Events
@client.event @client.event
async def on_ready(): async def on_ready():
@@ -292,7 +298,8 @@ async def on_ready():
logger.debug("%s has connected to Discord!", client.user) logger.debug("%s has connected to Discord!", client.user)
await client.change_presence(activity=discord.Game(name="Axe Throwing Darts")) await client.change_presence(activity=discord.Game(name="Axe Throwing Darts"))
await client.tree.sync() await client.tree.sync()
check_data.start() check_self.start()
check_data_q.start()
@client.event @client.event
@@ -406,36 +413,59 @@ async def on_message(message):
logger.debug("Wywolanie obrazka: %s", message.content) logger.debug("Wywolanie obrazka: %s", message.content)
try: try:
response = await openAIClient.images.generate( response = await openAIClient.images.generate(
model="dall-e-3", model="dall-e-3",
prompt=message.content, prompt=message.content,
size="1024x1024", size="1024x1024",
quality="standard", quality="standard",
n=1, n=1,
) )
except openai.APITimeoutError as e: except openai.APITimeoutError as e:
#Handle timeout error, e.g. retry or log # Handle timeout error, e.g. retry or log
await message.reply (f"*Kondziu patrzy na terminal, czeka, czeka, czeka,.... Jeszcze chwile czeka Przypierdala w niego pięścią....* Nie mogę się połączyć z Openai spróbuj od nowa. *Na ekranie pojawia się*: {e}") await message.reply(
f"*Kondziu patrzy na terminal, czeka, czeka, czeka,.... Jeszcze chwile czeka Przypierdala w niego pięścią....* Nie mogę się połączyć z Openai spróbuj od nowa. *Na ekranie pojawia się*: {e}"
)
except openai.APIConnectionError as e: except openai.APIConnectionError as e:
await message.reply(f"*Kondziu patrzy na terminal, chwile się zastanawia. Przypierdala w niego pięścią....* Nie mogę się połączyć z Openai. *Na ekranie pojawia się*: {e}") await message.reply(
f"*Kondziu patrzy na terminal, chwile się zastanawia. Przypierdala w niego pięścią....* Nie mogę się połączyć z Openai. *Na ekranie pojawia się*: {e}"
)
except openai.BadRequestError as e: except openai.BadRequestError as e:
#Handle invalid request error, e.g. validate parameters or log # Handle invalid request error, e.g. validate parameters or log
if message.author.nick: if message.author.nick:
username = message.author.nick username = message.author.nick
else: else:
username = message.author.name username = message.author.name
resp, _ = await handle_response(f"Wytlumacz jakie sa zasady dotyczące treści które możesz generować używając Dalle. Wytłumacz błąd {e} prostym językiem. Przeproś za nadmierną cenzurę. Wytłumacz co mogło być nie tak w prompcie '{message.content}'",True,True,MESSAGE_TABLE,username,"RANDOM") resp, _ = await handle_response(
await message.reply(f"Sorki, cenzura: {resp}. Jak chcesz to są kanały na nudle #sexy-foteczky i #kanal-do-fapania *Na ekranie pojawia się: {e}") f"Wytlumacz jakie sa zasady dotyczące treści które możesz generować używając Dalle. Wytłumacz błąd {e} prostym językiem. Przeproś za nadmierną cenzurę. Wytłumacz co mogło być nie tak w prompcie '{message.content}'",
True,
True,
MESSAGE_TABLE,
username,
"RANDOM",
)
await message.reply(
f"Sorki, cenzura: {resp}. Jak chcesz to są kanały na nudle #sexy-foteczky i #kanal-do-fapania *Na ekranie pojawia się: {e}"
)
except openai.AuthenticationError as e: except openai.AuthenticationError as e:
#Handle authentication error, e.g. check credentials or log # Handle authentication error, e.g. check credentials or log
await message.reply(f"*Kondziu patrzy na terminal, chwile się zastanawia. Przypierdala w niego pięścią....* Wołaj szefa - coś się z hasłem zjebało. *Na terminalu pojawia się:* {e}") await message.reply(
f"*Kondziu patrzy na terminal, chwile się zastanawia. Przypierdala w niego pięścią....* Wołaj szefa - coś się z hasłem zjebało. *Na terminalu pojawia się:* {e}"
)
except openai.PermissionDeniedError as e: except openai.PermissionDeniedError as e:
#Handle permission error, e.g. check scope or log # Handle permission error, e.g. check scope or log
await message.reply((f"*Kondziu patrzy na terminal, chwile się zastanawia. Przypierdala w niego pięścią....* Wołaj szefa - coś się z uprawnieniami zjebało. *Na terminalu pojawia się:* {e}")) await message.reply(
(
f"*Kondziu patrzy na terminal, chwile się zastanawia. Przypierdala w niego pięścią....* Wołaj szefa - coś się z uprawnieniami zjebało. *Na terminalu pojawia się:* {e}"
)
)
except openai.RateLimitError as e: except openai.RateLimitError as e:
await message.reply(f"*Kondziu patrzy na terminal* Wołaj szefa. Zapłacić rachunki za AI trzeba. Jak chcesz to się na #zebranie dorzuć. {e}") await message.reply(
f"*Kondziu patrzy na terminal* Wołaj szefa. Zapłacić rachunki za AI trzeba. Jak chcesz to się na #zebranie dorzuć. {e}"
)
except openai.APIError as e: except openai.APIError as e:
#Handle API error, e.g. retry or log # Handle API error, e.g. retry or log
await message.reply(f"*Kondziu nurkuje za bar, terminal wybucha. Przed tobą ląduje pergamin zapisany pięknym gotykiem a na nim*: {e}") await message.reply(
f"*Kondziu nurkuje za bar, terminal wybucha. Przed tobą ląduje pergamin zapisany pięknym gotykiem a na nim*: {e}"
)
if response: if response:
logger.info(response) logger.info(response)
image_url = response.data[0].url image_url = response.data[0].url
@@ -452,7 +482,7 @@ async def on_message(message):
fnord = discord.File( fnord = discord.File(
temp_file_name, spoiler=False, description=message.content temp_file_name, spoiler=False, description=message.content
) )
await message.reply(f"{image_desc}",file=fnord) await message.reply(f"{image_desc}", file=fnord)
# *=========================================== Define Functions # *=========================================== Define Functions
@@ -649,16 +679,25 @@ async def check_music():
await play(MUZYKA["ctx"], MUZYKA["requester"]) await play(MUZYKA["ctx"], MUZYKA["requester"])
await asyncio.sleep(2) await asyncio.sleep(2)
@tasks.loop(seconds=3)
# trunk-ignore(pylint/R0915)
async def check_data_q():
channel = client.get_channel(1062047367337095268)
try:
data = IN_COMM_Q.get(block=False)
await channel.send(f"O. A tak będzie wyglądało coś ciekawego w przyszłości: {data}")
except Empty:
pass
@tasks.loop(seconds=120) @tasks.loop(seconds=120)
# trunk-ignore(pylint/R0915) # trunk-ignore(pylint/R0915)
async def check_data(): async def check_self():
""" """
The function `check_data` periodically checks for conditions to send messages and manage log files The function `check_data` periodically checks for conditions to send messages and manage log files
in a Discord channel. in a Discord channel.
""" """
# trunk-ignore(codespell/misspelled) # trunk-ignore(codespell/misspelled)
#logger.info("Heartbeat of cleanup proc") # logger.info("Heartbeat of cleanup proc")
channel = client.get_channel(1062047367337095268) channel = client.get_channel(1062047367337095268)
messages = [message async for message in channel.history(limit=1)] messages = [message async for message in channel.history(limit=1)]
for mess in messages: for mess in messages:
@@ -680,7 +719,6 @@ async def check_data():
"*Conjurer porządkuje bar, wypala szklanki do czysta miotaczem płomieni ze swojej zbroi i ogólnie wygląda na zajętego....*" "*Conjurer porządkuje bar, wypala szklanki do czysta miotaczem płomieni ze swojej zbroi i ogólnie wygląda na zajętego....*"
) )
async with channel.typing(): async with channel.typing():
#TODO: Tu jest błąd. Ścieżka MEMORY_FIVE_MUZYKA jest absolutna a nie względna
path_newfile = f"{LOGSTORE}pamiec_muzyki{datetime.now()}.json" path_newfile = f"{LOGSTORE}pamiec_muzyki{datetime.now()}.json"
logger.info(path_newfile) logger.info(path_newfile)
with open(MEMORY_FIVE_MUZYKA, "r+", encoding=ENCODING) as file_music_memory: with open(MEMORY_FIVE_MUZYKA, "r+", encoding=ENCODING) as file_music_memory:
@@ -700,8 +738,7 @@ async def check_data():
"*Przeciąga się za barem* No dobra - porobione to można dalej pi... *Zauważa spojrzenie Hammera* ...sać powieści o naszym wspaniałym barze SZEFIE!" "*Przeciąga się za barem* No dobra - porobione to można dalej pi... *Zauważa spojrzenie Hammera* ...sać powieści o naszym wspaniałym barze SZEFIE!"
) )
if os.path.getsize(MEMORY_FIVE_SIARA) > 3000000: if os.path.getsize(MEMORY_FIVE_SIARA) > 3000000:
#TODO: Tu jest błąd. Ścieżka MEMORY_FIVE_MUZYKA jest absolutna a nie względna path_newfile = f"{LOGSTORE}pamiec_rozmow{datetime.now()}.json"
path_newfile = "{LOGSTORE}pamiec_rozmow{datetime.now()}.json"
logger.info(path_newfile) logger.info(path_newfile)
await channel.send( await channel.send(
"*Conjurer porządkuje bar, ścina lekkim laserem pulsacyjnym powierzchnie baru o grubości kilku mikronów i ogólnie wygląda na zajętego....*" "*Conjurer porządkuje bar, ścina lekkim laserem pulsacyjnym powierzchnie baru o grubości kilku mikronów i ogólnie wygląda na zajętego....*"
@@ -910,33 +947,46 @@ async def handle_response(
model=algorithm, messages=history model=algorithm, messages=history
) )
except openai.APITimeoutError as e: except openai.APITimeoutError as e:
#Handle timeout error, e.g. retry or log # Handle timeout error, e.g. retry or log
result = f"*Kondziu patrzy na terminal, czeka, czeka, czeka,.... Jeszcze chwile czeka Przypierdala w niego pięścią....* Nie mogę się połączyć z Openai spróbuj od nowa. *Na ekranie pojawia się*: {e}" result = f"*Kondziu patrzy na terminal, czeka, czeka, czeka,.... Jeszcze chwile czeka Przypierdala w niego pięścią....* Nie mogę się połączyć z Openai spróbuj od nowa. *Na ekranie pojawia się*: {e}"
except openai.APIConnectionError as e: except openai.APIConnectionError as e:
result = f"*Kondziu patrzy na terminal, chwile się zastanawia. Przypierdala w niego pięścią....* Nie mogę się połączyć z Openai. *Na ekranie pojawia się*: {e}" result = f"*Kondziu patrzy na terminal, chwile się zastanawia. Przypierdala w niego pięścią....* Nie mogę się połączyć z Openai. *Na ekranie pojawia się*: {e}"
except openai.BadRequestError as e: except openai.BadRequestError as e:
#Handle invalid request error, e.g. validate parameters or log # Handle invalid request error, e.g. validate parameters or log
resp, _ = await handle_response(f"Wytlumacz jakie sa zasady dotyczące treści które możesz generować używając Dalle. Wytłumacz błąd {e} prostym językiem. Przeproś za nadmierną cenzurę. Wytłumacz co mogło być nie tak w prompcie 'prompt'",True,True,MESSAGE_TABLE,username,"RANDOM") resp, _ = await handle_response(
f"Wytlumacz jakie sa zasady dotyczące treści które możesz generować używając Dalle. Wytłumacz błąd {e} prostym językiem. Przeproś za nadmierną cenzurę. Wytłumacz co mogło być nie tak w prompcie 'prompt'",
True,
True,
MESSAGE_TABLE,
username,
"RANDOM",
)
result = f"Sorki, cenzura: {resp}. Jak chcesz to są kanały na nudle #sexy-foteczky i #kanal-do-fapania *Na ekranie pojawia się: {e}" result = f"Sorki, cenzura: {resp}. Jak chcesz to są kanały na nudle #sexy-foteczky i #kanal-do-fapania *Na ekranie pojawia się: {e}"
except openai.APIResponseValidationError as e: except openai.APIResponseValidationError as e:
#Handle invalid request error, e.g. validate parameters or log # Handle invalid request error, e.g. validate parameters or log
resp, _ = await handle_response(f"Wytlumacz jakie sa zasady dotyczące treści które możesz generować używając Dalle. Wytłumacz błąd {e} prostym językiem. Przeproś za nadmierną cenzurę. Wytłumacz co mogło być nie tak w prompcie 'prompt'",True,True,MESSAGE_TABLE,username,"RANDOM") resp, _ = await handle_response(
f"Wytlumacz jakie sa zasady dotyczące treści które możesz generować używając Dalle. Wytłumacz błąd {e} prostym językiem. Przeproś za nadmierną cenzurę. Wytłumacz co mogło być nie tak w prompcie 'prompt'",
True,
True,
MESSAGE_TABLE,
username,
"RANDOM",
)
result = f"Sorki, cenzura: {resp}. Jak chcesz to są kanały na nudle #sexy-foteczky i #kanal-do-fapania *Na ekranie pojawia się: {e}" result = f"Sorki, cenzura: {resp}. Jak chcesz to są kanały na nudle #sexy-foteczky i #kanal-do-fapania *Na ekranie pojawia się: {e}"
except openai.AuthenticationError as e: except openai.AuthenticationError as e:
#Handle authentication error, e.g. check credentials or log # Handle authentication error, e.g. check credentials or log
result = f"*Kondziu patrzy na terminal, chwile się zastanawia. Przypierdala w niego pięścią....* Wołaj szefa - coś się z hasłem zjebało. *Na terminalu pojawia się:* {e}" result = f"*Kondziu patrzy na terminal, chwile się zastanawia. Przypierdala w niego pięścią....* Wołaj szefa - coś się z hasłem zjebało. *Na terminalu pojawia się:* {e}"
except openai.PermissionDeniedError as e: except openai.PermissionDeniedError as e:
#Handle permission error, e.g. check scope or log # Handle permission error, e.g. check scope or log
result = f"*Kondziu patrzy na terminal, chwile się zastanawia. Przypierdala w niego pięścią....* Wołaj szefa - coś się z uprawnieniami zjebało. *Na terminalu pojawia się:* {e}" result = f"*Kondziu patrzy na terminal, chwile się zastanawia. Przypierdala w niego pięścią....* Wołaj szefa - coś się z uprawnieniami zjebało. *Na terminalu pojawia się:* {e}"
except openai.RateLimitError as e: except openai.RateLimitError as e:
result = f"*Kondziu patrzy na terminal* Wołaj szefa. Zapłacić rachunki za AI trzeba. Jak chcesz to się na #zebranie dorzuć. {e}" result = f"*Kondziu patrzy na terminal* Wołaj szefa. Zapłacić rachunki za AI trzeba. Jak chcesz to się na #zebranie dorzuć. {e}"
except openai.UnprocessableEntityError as e: except openai.UnprocessableEntityError as e:
result = f"*Kondziu patrzy na terminal. Potem na to co każesz mu wysłać....* Ja wiem że jesteśmy w barze BDSM - ale nie da się włożyć TEGO w TO. *Za jego plecami na terminalu pojawia się:* {e}" result = f"*Kondziu patrzy na terminal. Potem na to co każesz mu wysłać....* Ja wiem że jesteśmy w barze BDSM - ale nie da się włożyć TEGO w TO. *Za jego plecami na terminalu pojawia się:* {e}"
except openai.APIError as e: except openai.APIError as e:
#Handle API error, e.g. retry or log # Handle API error, e.g. retry or log
result = f"*Kondziu nurkuje za bar, terminal wybucha. Przed tobą ląduje pergamin zapisany pięknym gotykiem a na nim*: {e}" result = f"*Kondziu nurkuje za bar, terminal wybucha. Przed tobą ląduje pergamin zapisany pięknym gotykiem a na nim*: {e}"
logger.info("Historia wysłana:") logger.info("Historia wysłana:")
logger.info(history) logger.info(history)
await asyncio.sleep(15) await asyncio.sleep(15)
@@ -1008,7 +1058,8 @@ async def get_file(ctx, source, link):
url_dict["songs"] = file_list url_dict["songs"] = file_list
url_data["urls"].append(url_dict.copy()) url_data["urls"].append(url_dict.copy())
file_name_f = youtube_download.default_filename file_name_f = youtube_download.default_filename
coro = asyncio.to_thread(youtube_download.download_songs, coro = asyncio.to_thread(
youtube_download.download_songs,
songs=url_data, songs=url_data,
output_dir=MUSIC_FOLDER, output_dir=MUSIC_FOLDER,
format_str="bestaudio/best", format_str="bestaudio/best",
@@ -1131,6 +1182,7 @@ async def get_file(ctx, source, link):
file_list.append("wiadomo co wiadomo gdzie") file_list.append("wiadomo co wiadomo gdzie")
return dir_path, file_list return dir_path, file_list
# define an asynchronous generator # define an asynchronous generator
async def async_iterator_generator(range_of_iterable): async def async_iterator_generator(range_of_iterable):
""" """
@@ -1212,8 +1264,17 @@ async def wyszukaj(ctx, how_many=0, slowa_kluczowe=None):
else: else:
word_list = ctx.message.content.split() word_list = ctx.message.content.split()
logger.info("Wyszukuje") logger.info("Wyszukuje")
jrequest = {"lista_slow" : word_list, "dlugosc_plejlisty" : how_many, "UUID": str(uuid.uuid4())} jrequest = {
coroutine = asyncio.to_thread(requests.post, f"{FILE_SERVICE_ADDRESS}{GET_PLAYLIST}", json=jrequest, timeout=360) "lista_slow": word_list,
"dlugosc_plejlisty": how_many,
"UUID": str(uuid.uuid4()),
}
coroutine = asyncio.to_thread(
requests.post,
f"{FILE_SERVICE_ADDRESS}{GET_PLAYLIST}",
json=jrequest,
timeout=360,
)
return_data = await coroutine return_data = await coroutine
if not return_data.status_code == 200: if not return_data.status_code == 200:
await ctx.send("Wołaj szefa - coś się wyjebało") await ctx.send("Wołaj szefa - coś się wyjebało")
@@ -1221,6 +1282,7 @@ async def wyszukaj(ctx, how_many=0, slowa_kluczowe=None):
logger.info(return_data.json()["data"]) logger.info(return_data.json()["data"])
return return_data.json()["data"] return return_data.json()["data"]
async def remove_characters(string, character): async def remove_characters(string, character):
""" """
The `remove_characters` function removes all occurrences of a specified character from a given The `remove_characters` function removes all occurrences of a specified character from a given
@@ -1852,6 +1914,7 @@ async def get_image_stable_diffusion(ctx):
if ctx: if ctx:
pass pass
@client.hybrid_command( @client.hybrid_command(
name="zagraj_muzyke_mego_ludu", name="zagraj_muzyke_mego_ludu",
description="Gra muzyke wyszukana na bazie tematow konwersacji na kanale NZ", description="Gra muzyke wyszukana na bazie tematow konwersacji na kanale NZ",
@@ -1890,7 +1953,9 @@ async def zagraj_muzyke_mego_ludu(ctx):
final_key_words.extend(key_words[-MUZYKA_MOJEGO_LUDU_SLOWA_KLUCZOWE:]) final_key_words.extend(key_words[-MUZYKA_MOJEGO_LUDU_SLOWA_KLUCZOWE:])
reply = "Wygenerowana plejlista:\n" reply = "Wygenerowana plejlista:\n"
async with ctx.typing(): async with ctx.typing():
logger.info("Zagraj muzyke mego ludu:Zaczynam szukać timestamp %s", datetime.now()) logger.info(
"Zagraj muzyke mego ludu:Zaczynam szukać timestamp %s", datetime.now()
)
search_time_glob = datetime.now() search_time_glob = datetime.now()
file = await wyszukaj( file = await wyszukaj(
ctx=ctx, ctx=ctx,
@@ -1999,31 +2064,43 @@ async def parametry_muzyki_mego_ludu(
ctx.send("Spierdalaj") ctx.send("Spierdalaj")
logger.info(exce) logger.info(exce)
class DoSearchView(discord.ui.View): class DoSearchView(discord.ui.View):
def __init__(self, uuid, result_list, *args, **kwargs) -> None: def __init__(self, uuid, result_list, *args, **kwargs) -> None:
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.uuid = uuid self.uuid = uuid
self.result_list = result_list self.result_list = result_list
@discord.ui.button(label="Nastepna strona", style=discord.ButtonStyle.primary, row=0)
@discord.ui.button(
label="Nastepna strona", style=discord.ButtonStyle.primary, row=0
)
async def next_callback(self, interaction, button): async def next_callback(self, interaction, button):
#emoji = await ctx.guild.fetch_emoji(id) # emoji = await ctx.guild.fetch_emoji(id)
#button.emoji=1102174413887111189 # button.emoji=1102174413887111189
logger.info("Pressed") logger.info("Pressed")
await interaction.response.edit_message(content = "You clicked the button!") # Send a message when the button is clicked await interaction.response.edit_message(
content="You clicked the button!"
) # Send a message when the button is clicked
@discord.ui.button(label="Wyszukaj wiecej", style=discord.ButtonStyle.danger, row=0) @discord.ui.button(label="Wyszukaj wiecej", style=discord.ButtonStyle.danger, row=0)
async def reset_callback(self, interaction, button): async def reset_callback(self, interaction, button):
#emoji = await ctx.guild.fetch_emoji(id) # emoji = await ctx.guild.fetch_emoji(id)
#button.emoji=1102174413887111189 # button.emoji=1102174413887111189
logger.info("Pressed") logger.info("Pressed")
await interaction.response.edit_message(content = "You clicked the button!") # Send a message when the button is clicked await interaction.response.edit_message(
content="You clicked the button!"
) # Send a message when the button is clicked
@discord.ui.button(label="Poprzednia Strona", style=discord.ButtonStyle.primary, row=0) @discord.ui.button(
label="Poprzednia Strona", style=discord.ButtonStyle.primary, row=0
)
async def perv_callback(self, interaction, button): async def perv_callback(self, interaction, button):
#emoji = await ctx.guild.fetch_emoji(id) # emoji = await ctx.guild.fetch_emoji(id)
#button.emoji=1102174413887111189 # button.emoji=1102174413887111189
logger.info("Pressed") logger.info("Pressed")
await interaction.response.edit_message(content = "You clicked the button!") # Send a message when the button is clicked await interaction.response.edit_message(
content="You clicked the button!"
) # Send a message when the button is clicked
@client.hybrid_command( @client.hybrid_command(
@@ -2034,22 +2111,49 @@ class DoSearchView(discord.ui.View):
async def wyszukaj_linki_do_dokumentow(ctx): async def wyszukaj_linki_do_dokumentow(ctx):
query = ctx.message.content query = ctx.message.content
query_uuid = uuid.uuid4() query_uuid = uuid.uuid4()
#query_uuid = "test" # query_uuid = "test"
#3 wyslij Librariana # 3 wyslij Librariana
json_query = {"UUID" : str(query_uuid), "query" : str(query)[30:], "page" : 1} json_query = {"UUID": str(query_uuid), "query": str(query)[30:], "page": 1}
coroutine = asyncio.to_thread(requests.post, f"{LIBRARIAN_SERVICE_ADDRESS}{SEND_QUERY}", json=json_query, timeout=360) coroutine = asyncio.to_thread(
#query_response = await requests.post(f"{LIBRARIAN_SERVICE_ADDRESS}{SEND_QUERY}", json=json_query, timeout=360) requests.post,
f"{LIBRARIAN_SERVICE_ADDRESS}{SEND_QUERY}",
json=json_query,
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 te 3/4 stacji."+
" A przecież pół stacji to browar, motelik dla zabaw cielesnych i ten Bar. Więc te 12/8 stacji teraz będzie ciężko pracować"
)
query_response = await coroutine 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: if not query_response.status_code == 200:
await ctx.send("Wołaj szefa - coś się 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 return
#4 zwroc 4 wyniki od librariana
#5 przyciski przy każdym wierszu pozwalają sprawdzić czy plik istnieje na scihubie - jeśli tak podaje link do sciagniecia query, query_uuid, queue_size = (
#6 ostatni wiersz to dalej, wróć, skasuj, zaciagnij kolejne wyniki (jeśli jest ich więcej niż 1000) query_response.json()["data"][0],
result_view = DoSearchView(uuid=str(query_uuid), result_list=query_response.json()["data"]) query_response.json()["data"][1],
query_response.json()["data"][2],
)
if ctx.message.author.nick:
username = ctx.message.author.nick
else:
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.")
'''
async def wyswietl_wyniki_wyszukiwania(ctx):
# 4 zwroc 4 wyniki od librariana
# 5 przyciski przy każdym wierszu pozwalają sprawdzić czy plik istnieje na scihubie - jeśli tak podaje link do sciagniecia
# 6 ostatni wiersz to dalej, wróć, skasuj, zaciagnij kolejne wyniki (jeśli jest ich więcej niż 1000)
result_view = DoSearchView(
uuid=str(query_uuid), result_list=query_response.json()["data"]
)
resulttab = [] resulttab = []
resultlink = [] resultlink = []
hit, fetched, total, _ = query_response.json()["data"][0] hit, fetched, total, _ = query_response.json()["data"][0]
@@ -2060,7 +2164,7 @@ async def wyszukaj_linki_do_dokumentow(ctx):
item_link = "https://sci-hub.se/" + str(item["DOI"]) item_link = "https://sci-hub.se/" + str(item["DOI"])
resultlink.append(item_link) resultlink.append(item_link)
logger.info(len(resulttab)) logger.info(len(resulttab))
for i in range(0, min(4,len(resulttab))): for i in range(0, min(4, len(resulttab))):
logger.info(i) logger.info(i)
logger.info(resulttab[i]) logger.info(resulttab[i])
logger.info(resultlink[i]) logger.info(resultlink[i])
@@ -2068,10 +2172,19 @@ async def wyszukaj_linki_do_dokumentow(ctx):
logger.info(url) logger.info(url)
temp_label = str(resulttab[i]) temp_label = str(resulttab[i])
temp_label = temp_label.strip("[']") temp_label = temp_label.strip("[']")
result_view.add_item(discord.ui.Button(label = str(temp_label[0:79]), row = i+1,url=url)) result_view.add_item(
discord.ui.Button(label=str(temp_label[0:79]), row=i + 1, url=url)
)
labelka = "Wyniki wyszukiwania dla: " + str(query)[30:] + f'\nWszystkich {total} sprawdzonych: {fetched} znalezionych: {hit} '# ile znaleziono artykułów w ogóle, ile zostało po refine labelka = (
await ctx.send(labelka, view=result_view) # Send a message with our View class that contains the button "Wyniki wyszukiwania dla: "
+ str(query)[30:]
+ f"\nWszystkich {total} sprawdzonych: {fetched} znalezionych: {hit} "
) # ile znaleziono artykułów w ogóle, ile zostało po refine
await ctx.send(
labelka, view=result_view
) # Send a message with our View class that contains the button
'''
@client.hybrid_command( @client.hybrid_command(
name="krecimy_pornola", name="krecimy_pornola",
@@ -2106,49 +2219,32 @@ async def krecimy_pornola(ctx):
else: else:
ctx.reply("Jak ładnie szefa poprosisz.") 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 # *================================== Run
if __name__ == "__main__": if __name__ == "__main__":
#TODO: wpakowac kondzia w wąteki odpalic asynchronicznie rownolegle z flaskiem do sterowania nim # TODO: wpakowac kondzia w wątki odpalic asynchronicznie rownolegle z flaskiem do sterowania nim
logger.info("Starting discord bot") logger.info("Starting discord bot")
threads = [] threads = []
logger.info("Starting discord bot: Creating threads")
threads.append(threading.Thread(target=client.run, args=(TOKEN,))) threads.append(threading.Thread(target=client.run, args=(TOKEN,)))
threads.append(threading.Thread(target=comm_subroutine, args=(logger,)))
logger.info("Starting discord bot: Starting threads")
i = 0
for worker in threads: for worker in threads:
i+=1
logger.info("Starting discord bot: Starting thread {i}")
worker.start() worker.start()
logger.info("Starting discord bot: Joining threads")
i=0
for worker in threads: for worker in threads:
i+=1
logger.info("Starting discord bot: Joining thread {i}")
worker.join() worker.join()
#widok - generuje się 5 stron po 4 linki # widok - generuje się 5 stron po 4 linki
# odśwież - zamienić na "dalej" - zaciąga kolejne 20 rezultatów # 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 # 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 # 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." # 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 # OPCJONALNIE: Dosyłamy znalezione wyniki na bieżąco - wtedy wkładamy do queue dla UUID wyniki
+76
View File
@@ -0,0 +1,76 @@
import logging
import threading
import json
from queue import Queue, Empty
from flask import Flask, jsonify, request
from waitress import serve
HOST_ADDRESS = "192.168.1.191"
PORT_ADDRESS = 5000
OUT_COMM_Q = Queue()
IN_COMM_Q = Queue()
internal_q = Queue()
app = Flask(__name__)
@app.route("/conjurer", methods=["POST"])
def answer_external_command():
record = json.loads(request.data)
app.logger.info(record)
app.logger.info("DATA RECEIVED")
while True:
try:
q_data = internal_q.get(block=False)
except Empty:
break
if q_data.uuid in record:
pass
return jsonify("SUCCESS")
@app.route("/conjurer", methods=["GET"])
def check_alive():
return jsonify("ALIVE")
def flask_debug(_logger):
"""
The `flask_debug` function starts a Flask application in debug mode without using the reloader.
Do not use for production for fucks sake.
"""
_logger.info("Attempt debug")
# trunk-ignore(bandit/B201)
app.run(debug=True, use_reloader=False, host=HOST_ADDRESS, port=PORT_ADDRESS)
def waitress_run(_logger):
"""
The `waitress_run` function serves the `app` on host "0.0.0.0"
and port 5000 using the Waitress WSGI server.
"""
_logger.info("Attempt waitress")
serve(app, host=HOST_ADDRESS, port=PORT_ADDRESS)
def scan_queue(_logger):
while True:
data = OUT_COMM_Q.get()
_logger.info(data)
internal_q.put(data)
query_list.append(data)
def comm_subroutine(logger):
#logger.setLevel(logging.DEBUG)
logger.info("Started")
threads = []
threads.append(threading.Thread(target=flask_debug, args=(logger,)))
#threads.append(threading.Thread(target=waitress_run, args=(logger,)))
threads.append(threading.Thread(target=scan_queue,args=(logger,)))
for worker in threads:
worker.start()
for worker in threads:
worker.join()
if __name__ == "__main__":
logging_client = logging.getLogger(__name__)
comm_subroutine(logging_client)
-1
View File
@@ -266,7 +266,6 @@ if __name__ == "__main__":
threads = [] threads = []
threads.append(threading.Thread(target=waitress_run)) threads.append(threading.Thread(target=waitress_run))
threads.append(threading.Thread(target=thread_rescan)) threads.append(threading.Thread(target=thread_rescan))
#threads.append(threading.Thread(target=flask_debug))
for worker in threads: for worker in threads:
worker.start() worker.start()
+3 -1
View File
@@ -10,4 +10,6 @@ PyPDF2
requests requests
spotipy spotipy
tiktoken tiktoken
PyNaCl PyNaCl
flask
waitress