Compare commits

..

29 Commits

Author SHA1 Message Date
gitea cf27b2f3f9 Finally fixed this bug. The AI can now play perfectly. 2025-01-31 20:08:38 +01:00
gitea 4aa442a802 Maybe fix 2025-01-31 20:00:05 +01:00
gitea 3964336370 Maybe this is the fix ? 2025-01-31 19:53:15 +01:00
gitea 625579ebbb another attempt to fix the bug 2025-01-31 19:49:01 +01:00
gitea ed71f7871d test 2025-01-31 19:44:49 +01:00
gitea ff8d1abf8a test 2025-01-31 19:42:21 +01:00
gitea a74b18f62a Maybe this will fix 2025-01-31 19:38:09 +01:00
gitea 323a1ac021 Fixing logging issues in music_functions.py and other_functions.py 2025-01-31 19:30:48 +01:00
gitea 993b303e2f Inside joke very boomer much wow 2025-01-21 21:51:26 +01:00
gitea 3b7248cb00 Fixit 2025-01-21 21:47:13 +01:00
gitea e35e028001 Fixc
Fixc
2025-01-21 21:36:07 +01:00
gitea 2c19e4565e Add comment 2025-01-21 16:53:09 +01:00
gitea 853e952128 Hej hoppsan! 2025-01-21 16:51:33 +01:00
gitea 041544917c Literowka 2025-01-21 15:44:43 +00:00
gitea 3ed4dcfbb4 add exception handling 2025-01-13 20:34:26 +00:00
gitea 276e814515 Fix old bug 2025-01-10 21:34:56 +01:00
gitea 5dd2aadd7c Arguments added to the utility. 2025-01-08 12:01:01 +01:00
gitea 19fbd27f3a FIXED! 2025-01-08 11:45:41 +01:00
gitea 8deea0584c LGFIX 2025-01-08 11:42:08 +01:00
gitea 9f0fadf908 Logs additional 2025-01-08 11:41:14 +01:00
gitea d176b762f7 Merge branch 'main' of https://github.com/migatu/conjurer 2025-01-08 11:35:01 +01:00
gitea 85d276f2d4 Function for idv3 and bugfix 2025-01-08 11:34:40 +01:00
gitea b031bd9fdc BGFX 2025-01-07 14:59:59 +00:00
gitea b3722deef2 Merge branch 'main' of https://github.com/migatu/conjurer 2025-01-07 14:54:47 +00:00
gitea 961ca74c14 BGFX 2025-01-07 14:54:38 +00:00
gitea 0f596cbdba Merge branch 'main' of https://github.com/migatu/conjurer 2025-01-05 22:09:53 +01:00
gitea 85be1ce9fc Small fix 2025-01-05 22:09:43 +01:00
gitea 5983439a5d Services 2025-01-05 20:40:42 +00:00
gitea fd4c066008 Status report script 2025-01-05 20:30:05 +00:00
12 changed files with 208 additions and 43 deletions
+1
View File
@@ -201,3 +201,4 @@ cr_results.json
not_in_db.json not_in_db.json
rr_results.json rr_results.json
s_results.json s_results.json
*.bak
+28 -15
View File
@@ -132,6 +132,7 @@ class Events(commands.Cog):
await discord_friendly_send(channel, message_txt) await discord_friendly_send(channel, message_txt)
await discord_friendly_reply(ctx, "Poszło") await discord_friendly_reply(ctx, "Poszło")
#TODO: NOT IMPLEMENTED YET
@commands.Cog.listener(name="dodaj_do_bazy_wiedzy") @commands.Cog.listener(name="dodaj_do_bazy_wiedzy")
async def dodaj_do_bazy_wiedzy(self, ctx): async def dodaj_do_bazy_wiedzy(self, ctx):
for superfryta in SPECJALNE_ZIEMNIACZKI.values(): for superfryta in SPECJALNE_ZIEMNIACZKI.values():
@@ -140,6 +141,7 @@ class Events(commands.Cog):
return return
await ctx.reply("Tylko członkowie Armii Hammera mogą używać. Nie jesteś jednym z nich") await ctx.reply("Tylko członkowie Armii Hammera mogą używać. Nie jesteś jednym z nich")
#TODO: NOT IMPLEMENTED YET
@commands.Cog.listener(name="listuj_baze_wiedzy") @commands.Cog.listener(name="listuj_baze_wiedzy")
async def listuj_baze_wiedzy(self, ctx): async def listuj_baze_wiedzy(self, ctx):
for superfryta in SPECJALNE_ZIEMNIACZKI.values(): for superfryta in SPECJALNE_ZIEMNIACZKI.values():
@@ -148,6 +150,7 @@ class Events(commands.Cog):
return return
await ctx.reply("Tylko członkowie Armii Hammera mogą używać. Nie jesteś jednym z nich") await ctx.reply("Tylko członkowie Armii Hammera mogą używać. Nie jesteś jednym z nich")
#TODO: NOT IMPLEMENTED YET
@commands.Cog.listener(name="usun_z_bazy_wiedzy") @commands.Cog.listener(name="usun_z_bazy_wiedzy")
async def usun_z_bazy_wiedzy(self, ctx): async def usun_z_bazy_wiedzy(self, ctx):
for superfryta in SPECJALNE_ZIEMNIACZKI.values(): for superfryta in SPECJALNE_ZIEMNIACZKI.values():
@@ -156,6 +159,7 @@ class Events(commands.Cog):
return return
await ctx.reply("Tylko członkowie Armii Hammera mogą używać. Nie jesteś jednym z nich") await ctx.reply("Tylko członkowie Armii Hammera mogą używać. Nie jesteś jednym z nich")
#TODO: NOT IMPLEMENTED YET
@commands.Cog.listener(name="przetworz_plik_linia_po_linii") @commands.Cog.listener(name="przetworz_plik_linia_po_linii")
async def przetworz_plik_linia_po_linii(self, ctx): async def przetworz_plik_linia_po_linii(self, ctx):
for superfryta in SPECJALNE_ZIEMNIACZKI.values(): for superfryta in SPECJALNE_ZIEMNIACZKI.values():
@@ -264,7 +268,7 @@ class Events(commands.Cog):
if kondziu_mentioned or "conjurer:" in message_content_lower: if kondziu_mentioned or "conjurer:" in message_content_lower:
async with channel.typing(): async with channel.typing():
self.logger.debug("Procedura chatu") self.logger.info("Procedura chatu")
message_content_lower = message_content_lower.replace("conjurer: ", "") message_content_lower = message_content_lower.replace("conjurer: ", "")
if message.author.nick: if message.author.nick:
@@ -293,12 +297,7 @@ class Events(commands.Cog):
"CONVERSATION", "CONVERSATION",
) )
if len(result) < 999: await discord_friendly_reply(message, result)
await message.reply(result)
else:
while len(result) > 999:
await message.reply(result[:999])
result = result[999:]
if "imaginuje sobie:" in message.content: if "imaginuje sobie:" in message.content:
async with channel.typing(): async with channel.typing():
self.logger.info("Poczatek procedury obrazkowej") self.logger.info("Poczatek procedury obrazkowej")
@@ -365,20 +364,34 @@ class Events(commands.Cog):
image_desc = response.data[0].revised_prompt image_desc = response.data[0].revised_prompt
self.logger.debug("Wynikowy obrazek pod url: %s", image_url) self.logger.debug("Wynikowy obrazek pod url: %s", image_url)
response = requests.get(image_url, timeout=360) response = requests.get(image_url, timeout=360)
temp_file_name = message.content + ".png" temp_file_name = message.content + ".png"
temp_file_name = GRAPHICS_PATH + message.content + ".png" temp_file_name = GRAPHICS_PATH + message.content + ".png"
num = 0 num = 0
while (Path(temp_file_name)).exists(): while (Path(temp_file_name)).exists():
temp_file_name = GRAPHICS_PATH + message.content + str(num) + ".png" temp_file_name = GRAPHICS_PATH + message.content + str(num) + ".png"
num += 1 num += 1
with open(temp_file_name, "wb") as dalle_file: try:
dalle_file.write(response.content) with open(temp_file_name, "wb") as dalle_file:
self.logger.info("Koniec procedury obrazkowej.") dalle_file.write(response.content)
fnord = discord.File( except OSError:
temp_file_name, spoiler=False, description=message.content temp_file_name = "/home/pi/oserror.png"
) with open(temp_file_name, "wb") as dalle_file:
dalle_file.write(response.content)
except FileNotFoundError:
temp_file_name = "/home/pi/fnferror.png"
with open(temp_file_name, "wb") as dalle_file:
dalle_file.write(response.content)
except Exception as e:
self.logger.error("Nieznany błąd: %s", e)
temp_file_name = "/home/pi/error.png"
with open(temp_file_name, "wb") as dalle_file:
dalle_file.write(response.content)
finally:
self.logger.info("Koniec procedury obrazkowej.")
fnord = discord.File(
temp_file_name, spoiler=False, description=message.content
)
#await message.reply(f"{image_desc}", file=fnord) #await message.reply(f"{image_desc}", file=fnord)
await discord_friendly_reply(message,f"{image_desc}", file = fnord) await discord_friendly_reply(message,f"{image_desc}", file = fnord)
# *=========================================== Define Functions # *=========================================== Define Functions
+1 -1
View File
@@ -39,7 +39,7 @@ MAIN_BOT_ADDRESS = "http://192.168.1.191:5000"
SEND_RESULTS = "/conjurer" SEND_RESULTS = "/conjurer"
BDSM_UUID_TEST = "96b7f85a-1142-4908-8986-62a2ea25a147" BDSM_UUID_TEST = "96b7f85a-1142-4908-8986-62a2ea25a147"
MAX_CR_RESULTS = 1000 MAX_CR_RESULTS = 500
#TEST PURPOSES ONLY! #TEST PURPOSES ONLY!
#MAX_CR_RESULTS = 5 #MAX_CR_RESULTS = 5
+1 -2
View File
@@ -104,9 +104,8 @@ def check_if_exists_brute_force(logger):
pass pass
if blocked: if blocked:
logger.info(item) logger.info(item)
logger.info(text)
logger.error("Got blocked. Fuck.") logger.error("Got blocked. Fuck.")
time.sleep(60 * 60 * 72) time.sleep(60 * 60)
# trunk-ignore(bandit/B311) # trunk-ignore(bandit/B311)
rand = random.randint(1, 60) rand = random.randint(1, 60)
logger.info(f"Sleeping for {2*rand} minutes") logger.info(f"Sleeping for {2*rand} minutes")
+5 -3
View File
@@ -11,7 +11,8 @@ import random
import re import re
import threading import threading
import time import time
from flask_autoindex import AutoIndex
# from flask_autoindex import AutoIndex
from datetime import datetime from datetime import datetime
from logging import handlers from logging import handlers
from pathlib import Path from pathlib import Path
@@ -182,7 +183,8 @@ def scan_tracks():
app = Flask(__name__) app = Flask(__name__)
#AutoIndex(app, browse_root="/") # AutoIndex(app, browse_root="/")
# TODO: Odpalić wyszukiwarki w wątkach i dopiero po wszystkim zsumować wyszukiwanie. # TODO: Odpalić wyszukiwarki w wątkach i dopiero po wszystkim zsumować wyszukiwanie.
def wyszukaj(word_list, how_many, _logger=None, return_to_bot=True): def wyszukaj(word_list, how_many, _logger=None, return_to_bot=True):
@@ -486,7 +488,7 @@ def create_priority_playlist():
return_data = wyszukaj( return_data = wyszukaj(
record["lista_slow"], record["dlugosc_plejlisty"], app.logger, False record["lista_slow"], record["dlugosc_plejlisty"], app.logger, False
) )
return_data = random.shuffle(return_data) random.shuffle(return_data)
with open("/home/pi/Conjurer/request.playlist", "a", encoding="utf-8") as s_file: with open("/home/pi/Conjurer/request.playlist", "a", encoding="utf-8") as s_file:
for item in return_data: for item in return_data:
s_file.write(item[1] + "\n") s_file.write(item[1] + "\n")
+74 -2
View File
@@ -2,9 +2,47 @@
"""This module contains utility scripts used by musi radiostation Conjurer""" """This module contains utility scripts used by musi radiostation Conjurer"""
import time import time
import re import re
import os
import argparse
from mutagen.easyid3 import EasyID3
from mutagen.mp3 import MP3
def update_metadata(folder_path):
for root, _, files in os.walk(folder_path):
for file in files:
if file.endswith(".mp3"):
file_path = os.path.join(root, file)
# Sample logic for guessing metadata from filename
# Assuming the filename format is "Artist - Title.mp3"
try:
artist, title = file.rsplit(" - ", 1)
title = title.replace(".mp3", "")
except ValueError:
# If file name doesn't fit the expected pattern, skip
print(f"Skipping file due to unexpected format: {file}")
continue
try:
# Load the mp3 file
audio = MP3(file_path, ID3=EasyID3)
# Update metadata
audio["artist"] = artist.strip()
audio["title"] = title.strip()
# Save changes
audio.save()
print(f"Updated metadata for: {file}")
except Exception as e:
print(f"Failed to update metadata for {file}: {e}")
NAME = "/home/pi/Conjurer/persistence.log" NAME = "/home/pi/Conjurer/persistence.log"
def print_top(): def print_top():
""" """
Prints the top 65 lines from a file specified by the NAME variable. Prints the top 65 lines from a file specified by the NAME variable.
@@ -13,7 +51,7 @@ def print_top():
line = "" line = ""
buffer = "" buffer = ""
with open(NAME, "r", encoding="utf-8") as f: with open(NAME, "r", encoding="utf-8") as f:
for _ in range (45): for _ in range(45):
line = f.readline() line = f.readline()
if re.match(".*mp3", line): if re.match(".*mp3", line):
buffer += line buffer += line
@@ -22,5 +60,39 @@ def print_top():
print("=====================================") print("=====================================")
time.sleep(180) time.sleep(180)
def main():
parser = argparse.ArgumentParser(
description="Perform operations on a directory of .mp3 files."
)
# Positional argument for choosing the function to execute
parser.add_argument(
"operation",
type=str,
choices=["update_metadata", "print_top"],
help="Operation to perform: update_metadata or print_top.",
default="print_top",
)
# Positional argument for folder path
parser.add_argument("folder", type=str, help="Path to the folder to operate on.")
args = parser.parse_args()
if args.operation == "update_metadata":
if args.folder:
folder_to_scan = args.folder
else:
print("Please provide a folder path to scan.")
raise ValueError("No folder path provided.")
if args.operation == "update_metadata" and os.path.isdir(folder_to_scan):
update_metadata(folder_to_scan)
elif args.operation == "print_top":
print_top()
else:
print(f"The specified path is not a directory: {folder_to_scan}")
if __name__ == "__main__": if __name__ == "__main__":
print_top() main()
+6 -4
View File
@@ -20,7 +20,6 @@ from constants import (
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
logger = logging.getLogger("discord")
class MusicFileList(object): class MusicFileList(object):
@@ -29,10 +28,11 @@ class MusicFileList(object):
file service or local directory and update the list with new items. file service or local directory and update the list with new items.
""" """
def __init__(self, uplogger,) -> None: def __init__(self, logger_name) -> None:
self.music_file_list = [] self.music_file_list = []
self.file_service_active = False self.file_service_active = False
self.logger = uplogger self.logger = logging.getLogger("discord")
self.logger.info("Created Playlist organizer class") self.logger.info("Created Playlist organizer class")
async def refresh_file_list(self, bot): async def refresh_file_list(self, bot):
@@ -100,7 +100,7 @@ class MusicFileList(object):
requests.post(f"{FILE_SERVICE_ADDRESS}{SEND_MP3}", json=post_data, timeout=360) requests.post(f"{FILE_SERVICE_ADDRESS}{SEND_MP3}", json=post_data, timeout=360)
MUSIC_FILE_LIST = MusicFileList(logger) MUSIC_FILE_LIST = MusicFileList("discord")
async def get_file(ctx, source, link): async def get_file(ctx, source, link):
@@ -118,6 +118,7 @@ async def get_file(ctx, source, link):
:param link: The "link" parameter is likely a string that represents a URL or file path to the :param link: The "link" parameter is likely a string that represents a URL or file path to the
location of the file that the function is trying to retrieve location of the file that the function is trying to retrieve
""" """
logger = logging.getLogger("discord")
item_id = None item_id = None
item_type = None item_type = None
file_list = [] file_list = []
@@ -288,6 +289,7 @@ async def search_music(ctx, how_many=0, slowa_kluczowe=None):
how_many, the function will return all search results, defaults to 0 (optional) how_many, the function will return all search results, defaults to 0 (optional)
""" """
# i sieć neuronową z możliwością wyrażenia opinii o dopasowaniu. # i sieć neuronową z możliwością wyrażenia opinii o dopasowaniu.
logger = logging.getLogger("discord")
if slowa_kluczowe: if slowa_kluczowe:
word_list = slowa_kluczowe word_list = slowa_kluczowe
else: else:
+14 -2
View File
@@ -1,4 +1,6 @@
import logging
# define an asynchronous generator # define an asynchronous generator
async def async_iterator_generator(range_of_iterable): async def async_iterator_generator(range_of_iterable):
""" """
Generate asynchronouse iterator. Generate asynchronouse iterator.
@@ -86,20 +88,30 @@ async def get_stats(client, ctx, history_limit):
yield name, how_many yield name, how_many
async def discord_friendly_reply(ctx, message_content, file=None): async def discord_friendly_reply(ctx, message_content, file=None):
logger = logging.getLogger("discord")
if len(message_content) < 999: if len(message_content) < 999:
logger.info("Answer reply - message below 999")
await ctx.reply(message_content) await ctx.reply(message_content)
else: else:
while len(message_content) > 999: logger.info("Answer reply - message above 999")
while len(message_content) > 0:
logger.info("Mesaage content: %s", message_content[:999])
await ctx.reply(message_content[:999]) await ctx.reply(message_content[:999])
message_content = message_content[999:] message_content = message_content[999:]
if file: if file:
await ctx.reply("Attachment:", file=file) await ctx.reply("Attachment:", file=file)
async def discord_friendly_send(ctx, message_content, file=None): async def discord_friendly_send(ctx, message_content, file=None):
logger = logging.getLogger("discord")
if len(message_content) < 999: if len(message_content) < 999:
logger.info("Answer send - message below 999")
await ctx.send(message_content) await ctx.send(message_content)
else: else:
while len(message_content) > 999: logger.info("Answer send - message above 999")
while len(message_content) > 0:
logger.info("Mesaage content: %s", message_content[:999])
await ctx.send(message_content[:999]) await ctx.send(message_content[:999])
message_content = message_content[999:] message_content = message_content[999:]
if file: if file:
+10
View File
@@ -0,0 +1,10 @@
[Unit]
Description=Check Raspberry Pi Parameters
After=network.target
[Service]
Type=oneshot
ExecStart=/bin/bash -c '/home/pi/conjurer/status_report.sh >> /home/pi/Conjurer/discord.log'
[Install]
WantedBy=multi-user.target
+38
View File
@@ -0,0 +1,38 @@
#!/bin/bash
# Script to check and display Raspberry Pi parameters using libgpiod
echo "=== Raspberry Pi System Information ==="
# General system information
echo "Hostname: $(hostname)"
echo "Model: $(cat /proc/device-tree/model | tr -d '\0')"
echo "CPU Temperature: $(vcgencmd measure_temp | cut -d '=' -f2)"
echo "CPU Frequency: $(vcgencmd measure_clock arm | awk -F= '{print $2}') Hz"
echo "GPU Frequency: $(vcgencmd measure_clock core | awk -F= '{print $2}') Hz"
echo "Voltage: $(vcgencmd measure_volts | cut -d '=' -f2)"
# Memory and disk usage
echo "Total Memory: $(free -h | grep Mem | awk '{print $2}')"
echo "Used Memory: $(free -h | grep Mem | awk '{print $3}')"
echo "Free Memory: $(free -h | grep Mem | awk '{print $4}')"
echo "Disk Usage:"
df -h | grep '^/dev/root'
# Network information
echo "IP Address: $(hostname -I | awk '{print $1}')"
echo "MAC Address: $(cat /sys/class/net/eth0/address 2>/dev/null || echo 'No Ethernet')"
# Uptime
echo "Uptime: $(uptime -p)"
echo "Last Boot: $(who -b | awk '{print $3, $4}')"
# GPIO Information using libgpiod
echo "GPIO Chip Info:"
if command -v gpioinfo &>/dev/null; then
gpioinfo
else
echo "gpiod tools not installed. Please install libgpiod using 'sudo apt install gpiod'."
fi
echo "=== End of Raspberry Pi System Information ==="
+9
View File
@@ -0,0 +1,9 @@
[Unit]
Description=Run Check Raspberry Pi Parameters Script Hourly
[Timer]
OnCalendar=hourly
Persistent=true
[Install]
WantedBy=timers.target
+21 -14
View File
@@ -18,6 +18,18 @@ from discord.ext import commands
from communication_subroutine import comm_subroutine from communication_subroutine import comm_subroutine
from constants import ENCODING, LOGFILE, TOKEN from constants import ENCODING, LOGFILE, TOKEN
logger = logging.getLogger("discord")
logger.setLevel(logging.INFO)
handler = handlers.RotatingFileHandler(
filename=LOGFILE,
encoding=ENCODING,
mode="a",
maxBytes=6 * 1024 * 1024,
backupCount=6,
)
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
handler.setFormatter(formatter)
logger.addHandler(handler)
# *=========================================== Initializations # *=========================================== Initializations
intents = discord.Intents.default() intents = discord.Intents.default()
@@ -32,18 +44,6 @@ intents.moderation = True
# on_member_ban - wyswietl na glownym kanale pieczatke "Niech spierdala" # on_member_ban - wyswietl na glownym kanale pieczatke "Niech spierdala"
# on_member_unban - "mam wyjebane" # on_member_unban - "mam wyjebane"
logger = logging.getLogger("discord")
logger.setLevel(logging.DEBUG)
handler = handlers.RotatingFileHandler(
filename=LOGFILE,
encoding=ENCODING,
mode="a",
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() random.seed()
client = commands.Bot(intents=intents, command_prefix="$") client = commands.Bot(intents=intents, command_prefix="$")
@@ -52,8 +52,12 @@ client = commands.Bot(intents=intents, command_prefix="$")
@client.event @client.event
async def on_ready(): async def on_ready():
"""Metoda wywoływana przy połączeniu do serwera.""" """Metoda wywoływana przy połączeniu do serwera."""
logger.debug("%s has connected to Discord!", client.user) logger = logging.getLogger("discord")
logger.debug("SAMPLE DEBUG LOG")
logger.info("%s has connected to Discord!", client.user)
# TODO: load vs reload # TODO: load vs reload
logger.info("Reactor: online")
await client.load_extension("administration_commands") await client.load_extension("administration_commands")
await client.load_extension("librarian_commands") await client.load_extension("librarian_commands")
@@ -64,13 +68,16 @@ async def on_ready():
await client.load_extension("other_commands") await client.load_extension("other_commands")
await client.load_extension("voice_recognition_commands") await client.load_extension("voice_recognition_commands")
logger.info("Sensors: online")
logger.info(client.cogs) logger.info(client.cogs)
await client.tree.sync() await client.tree.sync()
for com in client.commands: for com in client.commands:
logger.info("Command %s is awejleble", com.qualified_name) logger.info("Command %s is awejleble", com.qualified_name)
logger.info("Logged in as ---->", client.user) logger.info("Logged in as ---->", client.user)
logger.info("ID:", client.user.id) logger.info("ID:", client.user.id)
logger.info("All systems: operational")
# *================================== Run # *================================== Run
@@ -78,7 +85,7 @@ if __name__ == "__main__":
logger.info("Starting discord bot") logger.info("Starting discord bot")
threads = [] threads = []
logger.info("Starting discord bot: Creating 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,),kwargs={"log_handler":None}))
threads.append(threading.Thread(target=comm_subroutine)) threads.append(threading.Thread(target=comm_subroutine))
logger.info("Starting discord bot: Starting threads") logger.info("Starting discord bot: Starting threads")
WRK_CNT = 0 WRK_CNT = 0