changed from creating new settings instance into using a shared one

This commit is contained in:
ctih1 2025-07-23 15:42:13 +03:00
parent 7e21a10dde
commit ade9d88086
18 changed files with 252 additions and 43 deletions

View file

@ -4,9 +4,8 @@ from discord.ext import commands
import logging import logging
from typing import Literal, get_args, cast from typing import Literal, get_args, cast
from modules.permission import requires_admin from modules.permission import requires_admin
from modules.settings import Settings as SettingsManager from modules.settings import instance as settings_manager
settings_manager = SettingsManager()
settings = settings_manager.settings settings = settings_manager.settings

View file

@ -7,10 +7,9 @@ import discord.ext.commands
import modules.keys as k import modules.keys as k
from modules.permission import requires_admin from modules.permission import requires_admin
from modules.sentenceprocessing import send_message from modules.sentenceprocessing import send_message
from modules.settings import Settings as SettingsManager from modules.settings import instance as settings_manager
import requests import requests
settings_manager = SettingsManager()
settings = settings_manager.settings settings = settings_manager.settings
@ -159,13 +158,11 @@ class BaseCommands(commands.Cog):
response = requests.post( response = requests.post(
"https://litterbox.catbox.moe/resources/internals/api.php", "https://litterbox.catbox.moe/resources/internals/api.php",
data={"reqtype": "fileupload", "time": "1h", "fileToUpload": data}, data={"reqtype": "fileupload", "time": "1h"},
files={"fileToUpload": data},
) )
print(response.text) await send_message(ctx, response.text)
print(response.status_code)
# await send_message(ctx, memorylitter.stdout.strip())
async def setup(bot: discord.ext.commands.Bot): async def setup(bot: discord.ext.commands.Bot):

View file

@ -3,9 +3,9 @@ from discord.ext import commands
import discord.ext import discord.ext
import discord.ext.commands import discord.ext.commands
from modules.permission import requires_admin from modules.permission import requires_admin
from modules.settings import Settings as SettingsManager from modules.settings import instance as settings_manager
from modules.globalvars import available_cogs
settings_manager = SettingsManager()
settings = settings_manager.settings settings = settings_manager.settings
@ -23,6 +23,15 @@ class CogManager(commands.Cog):
await self.bot.load_extension(COG_PREFIX + cog_name) await self.bot.load_extension(COG_PREFIX + cog_name)
await ctx.send(f"Loaded cog `{cog_name}` successfully.") await ctx.send(f"Loaded cog `{cog_name}` successfully.")
settings["bot"]["enabled_cogs"].append(cog_name) settings["bot"]["enabled_cogs"].append(cog_name)
settings_manager.add_admin_log_event(
{
"action": "add",
"author": ctx.author.id,
"change": "enabled_cogs",
"messageId": ctx.message.id,
"target": cog_name,
}
)
settings_manager.commit() settings_manager.commit()
except Exception as e: except Exception as e:
@ -69,6 +78,15 @@ class CogManager(commands.Cog):
await self.bot.unload_extension(COG_PREFIX + cog_name) await self.bot.unload_extension(COG_PREFIX + cog_name)
await ctx.send(f"Unloaded cog `{cog_name}` successfully.") await ctx.send(f"Unloaded cog `{cog_name}` successfully.")
settings["bot"]["enabled_cogs"].remove(cog_name) settings["bot"]["enabled_cogs"].remove(cog_name)
settings_manager.add_admin_log_event(
{
"action": "del",
"author": ctx.author.id,
"change": "enabled_cogs",
"messageId": ctx.message.id,
"target": cog_name,
}
)
settings_manager.commit() settings_manager.commit()
except Exception as e: except Exception as e:
await ctx.send(f"Error unloading cog `{cog_name}`: {e}") await ctx.send(f"Error unloading cog `{cog_name}`: {e}")
@ -102,7 +120,8 @@ class CogManager(commands.Cog):
title="Loaded Cogs", title="Loaded Cogs",
description="Here is a list of all currently loaded cogs:", description="Here is a list of all currently loaded cogs:",
) )
embed.add_field(name="Cogs", value="\n".join(cogs), inline=False) embed.add_field(name="Loaded cogs", value="\n".join(cogs), inline=False)
embed.add_field(name="Available cogs", value="\n".join(available_cogs()))
await ctx.send(embed=embed) await ctx.send(embed=embed)

View file

@ -24,9 +24,8 @@ import markovify
logger = logging.getLogger("goober") logger = logging.getLogger("goober")
from modules.settings import Settings as SettingsManager from modules.settings import instance as settings_manager
settings_manager = SettingsManager()
settings = settings_manager.settings settings = settings_manager.settings

View file

@ -0,0 +1,118 @@
import discord
from discord.ext import commands
from modules.permission import requires_admin
from modules.settings import instance as settings_manager
settings = settings_manager.settings
class PermissionManager(commands.Cog):
def __init__(self, bot):
self.bot = bot
@requires_admin()
@commands.command()
async def add_owner(self, ctx: commands.Context, member: discord.Member):
settings["bot"]["owner_ids"].append(member.id)
settings_manager.add_admin_log_event(
{
"action": "add",
"author": ctx.author.id,
"change": "owner_ids",
"messageId": ctx.message.id,
"target": member.id,
}
)
settings_manager.commit()
embed = discord.Embed(
title="Permissions",
description=f"Set {member.name} as an owner",
color=discord.Color.blue(),
)
await ctx.send(embed=embed)
@requires_admin()
@commands.command()
async def remove_owner(self, ctx: commands.Context, member: discord.Member):
try:
settings["bot"]["owner_ids"].remove(member.id)
settings_manager.add_admin_log_event(
{
"action": "del",
"author": ctx.author.id,
"change": "owner_ids",
"messageId": ctx.message.id,
"target": member.id,
}
)
settings_manager.commit()
except ValueError:
await ctx.send("User is not an owner!")
return
embed = discord.Embed(
title="Permissions",
description=f"Removed {member.name} from being an owner",
color=discord.Color.blue(),
)
await ctx.send(embed=embed)
@requires_admin()
@commands.command()
async def blacklist_user(self, ctx: commands.Context, member: discord.Member):
settings["bot"]["blacklisted_users"].append(member.id)
settings_manager.add_admin_log_event(
{
"action": "add",
"author": ctx.author.id,
"change": "blacklisted_users",
"messageId": ctx.message.id,
"target": member.id,
}
)
settings_manager.commit()
embed = discord.Embed(
title="Blacklist",
description=f"Added {member.name} to the blacklist",
color=discord.Color.blue(),
)
await ctx.send(embed=embed)
@requires_admin()
@commands.command()
async def unblacklist_user(self, ctx: commands.Context, member: discord.Member):
try:
settings["bot"]["blacklisted_users"].remove(member.id)
settings_manager.add_admin_log_event(
{
"action": "del",
"author": ctx.author.id,
"change": "blacklisted_users",
"messageId": ctx.message.id,
"target": member.id,
}
)
settings_manager.commit()
except ValueError:
await ctx.send("User is not on the blacklist!")
return
embed = discord.Embed(
title="Blacklist",
description=f"Removed {member.name} from blacklist",
color=discord.Color.blue(),
)
await ctx.send(embed=embed)
async def setup(bot):
await bot.add_cog(PermissionManager(bot))

View file

@ -3,9 +3,8 @@ import discord
from collections import defaultdict, Counter from collections import defaultdict, Counter
import datetime import datetime
from modules.permission import requires_admin from modules.permission import requires_admin
from modules.settings import Settings as SettingsManager from modules.settings import instance as settings_manager
settings_manager = SettingsManager()
settings = settings_manager.settings settings = settings_manager.settings

View file

@ -3,6 +3,8 @@ from discord.ext import commands
from modules.globalvars import RED, GREEN, RESET, LOCAL_VERSION_FILE from modules.globalvars import RED, GREEN, RESET, LOCAL_VERSION_FILE
import os import os
from modules.permission import requires_admin
class songchange(commands.Cog): class songchange(commands.Cog):
def __init__(self, bot): def __init__(self, bot):
@ -17,15 +19,10 @@ class songchange(commands.Cog):
global local_version global local_version
local_version = get_local_version() local_version = get_local_version()
@requires_admin()
@commands.command() @commands.command()
async def changesong(self, ctx): async def changesong(self, ctx, song: str):
if LOCAL_VERSION_FILE > "0.11.8": await ctx.send(f"Changed song to {song}")
await ctx.send(
f"Goober is too old! you must have version 0.11.8 you have {local_version}"
)
return
await ctx.send("Check the terminal! (this does not persist across restarts)")
song = input("\nEnter a song:\n")
try: try:
await self.bot.change_presence( await self.bot.change_presence(
activity=discord.Activity( activity=discord.Activity(

View file

@ -6,9 +6,8 @@ import json
import asyncio import asyncio
from urllib.parse import urljoin from urllib.parse import urljoin
from modules.permission import requires_admin from modules.permission import requires_admin
from modules.settings import Settings as SettingsManager from modules.settings import instance as settings_manager
settings_manager = SettingsManager()
settings = settings_manager.settings settings = settings_manager.settings

View file

@ -73,5 +73,5 @@
"command_stats_embed_field2name": "Version", "command_stats_embed_field2name": "Version",
"command_stats_embed_field2value": "Version local: {local_version} \nUltima version: {latest_version}", "command_stats_embed_field2value": "Version local: {local_version} \nUltima version: {latest_version}",
"command_stats_embed_field3name": "informacion sobre las variables", "command_stats_embed_field3name": "informacion sobre las variables",
"command_stats_embed_field3value": "Nombre: {NAME} \nPrefijo: {PREFIX} \nID del propietario: {ownerid}\nLinea de ping: {PING_LINE} \nCompartir memoria habilitada: {showmemenabled} \nEntrenamiento de usuario habilitado: {USERTRAIN_ENABLED} \nCancion: {song} \nTexto de bienvenida: ```{splashtext}```" "command_stats_embed_field3value": "Nombre: {NAME} \nPrefijo: {PREFIX} \nID del propietario: {ownerid}\nLinea de ping: {PING_LINE} \nCompartir memoria habilitada: {showmemenabled} \nEntrenamiento de usuario habilitado: {USERTRAIN_ENABLED} \nCancion: {song} \nTexto de bienvenida: ```{splashtext}```"
} }

13
bot.py
View file

@ -31,8 +31,9 @@ from modules import key_compiler
import logging import logging
from watchdog.observers import Observer from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler from watchdog.events import FileSystemEventHandler
from modules.settings import Settings as SettingsManager from modules.settings import instance as settings_manager
from modules.permission import requires_admin from modules.permission import requires_admin
import threading
def build_keys(): def build_keys():
@ -61,11 +62,11 @@ file_handler.setFormatter(GooberFormatter(colors=False))
logger.addHandler(console_handler) logger.addHandler(console_handler)
logger.addHandler(file_handler) logger.addHandler(file_handler)
settings_manager = SettingsManager()
settings = settings_manager.settings settings = settings_manager.settings
splash_text: str = "" splash_text: str = ""
with open(settings["splash_text_loc"], "r", encoding="UTF-8") as f: with open(settings["splash_text_loc"], "r", encoding="UTF-8") as f:
splash_text = "".join(f.readlines()) splash_text = "".join(f.readlines())
print(splash_text) print(splash_text)
@ -160,8 +161,8 @@ async def on_ready() -> None:
if launched: if launched:
return return
await load_cogs_from_folder(bot)
await load_cogs_from_folder(bot, "assets/cogs/internal") await load_cogs_from_folder(bot, "assets/cogs/internal")
await load_cogs_from_folder(bot)
try: try:
synced: List[discord.app_commands.AppCommand] = await bot.tree.sync() synced: List[discord.app_commands.AppCommand] = await bot.tree.sync()
@ -281,7 +282,7 @@ async def on_message(message: discord.Message) -> None:
if message.author.bot: if message.author.bot:
return return
if str(message.author.id) in settings["bot"]["blacklisted_users"]: if message.author.id in settings["bot"]["blacklisted_users"]:
return return
commands = [ commands = [
@ -405,6 +406,10 @@ class Handler(FileSystemEventHandler):
build_keys() build_keys()
observer = Observer()
observer.schedule(Handler(), "assets/locales")
observer.start()
# Start the bot # Start the bot
if __name__ == "__main__": if __name__ == "__main__":
bot.run(os.environ.get("DISCORD_BOT_TOKEN", "")) bot.run(os.environ.get("DISCORD_BOT_TOKEN", ""))

View file

@ -1,5 +1,6 @@
import os import os
import platform import platform
from typing import Callable, List
from dotenv import load_dotenv from dotenv import load_dotenv
import pathlib import pathlib
import subprocess import subprocess
@ -22,6 +23,10 @@ def get_git_branch():
env_path = pathlib.Path(__file__).parent.parent / ".env" env_path = pathlib.Path(__file__).parent.parent / ".env"
load_dotenv(dotenv_path=env_path) load_dotenv(dotenv_path=env_path)
available_cogs: Callable[[], List[str]] = lambda: [
file[:-3] for file in os.listdir("assets/cogs") if file.endswith(".py")
]
ANSI = "\033[" ANSI = "\033["
RED = f"{ANSI}31m" RED = f"{ANSI}31m"
GREEN = f"{ANSI}32m" GREEN = f"{ANSI}32m"

View file

@ -5,9 +5,8 @@ import pickle
from modules.globalvars import * from modules.globalvars import *
import logging import logging
import modules.keys as k import modules.keys as k
from modules.settings import Settings as SettingsManager from modules.settings import instance as settings_manager
settings_manager = SettingsManager()
settings = settings_manager.settings settings = settings_manager.settings

View file

@ -4,12 +4,11 @@ import discord
import discord.ext import discord.ext
import discord.ext.commands import discord.ext.commands
from modules.settings import Settings as SettingsManager from modules.settings import instance as settings_manager
import logging import logging
logger = logging.getLogger("goober") logger = logging.getLogger("goober")
settings_manager = SettingsManager()
settings = settings_manager.settings settings = settings_manager.settings

View file

@ -11,9 +11,8 @@ from spacy.util import is_package
import importlib.metadata import importlib.metadata
import logging import logging
import modules.keys as k import modules.keys as k
from modules.settings import Settings as SettingsManager from modules.settings import instance as settings_manager
settings_manager = SettingsManager()
settings = settings_manager.settings settings = settings_manager.settings

View file

@ -1,6 +1,6 @@
import json import json
import os import os
from typing import List, Mapping, Any, TypedDict from typing import List, Literal, Mapping, Any, NotRequired, TypedDict
from modules.keys import Language from modules.keys import Language
import logging import logging
import copy import copy
@ -36,8 +36,19 @@ class SettingsType(TypedDict):
splash_text_loc: str splash_text_loc: str
class AdminLogEvent(TypedDict):
messageId: int
author: int
target: str | int
action: Literal["del", "add", "set"]
change: Literal["owner_ids", "blacklisted_users", "enabled_cogs"]
class Settings: class Settings:
def __init__(self) -> None: def __init__(self) -> None:
global instance
instance = self
self.path: str = os.path.join(".", "settings", "settings.json") self.path: str = os.path.join(".", "settings", "settings.json")
if not os.path.exists(self.path): if not os.path.exists(self.path):
@ -52,11 +63,37 @@ class Settings:
self.settings = SettingsType(self.__kv_store) # type: ignore self.settings = SettingsType(self.__kv_store) # type: ignore
self.original_settings = copy.deepcopy(self.settings) self.original_settings = copy.deepcopy(self.settings)
self.log_path: str = os.path.join(".", "settings", "admin_logs.json")
def reload_settings(self) -> None:
with open(self.path, "r") as f:
self.__kv_store: dict = json.load(f)
self.settings = SettingsType(self.__kv_store) # type: ignore
self.original_settings = copy.deepcopy(self.settings)
def commit(self) -> None: def commit(self) -> None:
with open(self.path, "w") as f: with open(self.path, "w") as f:
json.dump(self.settings, f, indent=4) json.dump(self.settings, f, ensure_ascii=False, indent=4)
self.original_settings = self.settings self.original_settings = self.settings
def discard(self) -> None: def discard(self) -> None:
self.settings = self.original_settings self.settings = self.original_settings
def add_admin_log_event(self, event: AdminLogEvent):
if not os.path.exists(self.log_path):
logger.warning("Admin log doesn't exist!")
with open(self.log_path, "w") as f:
json.dump([], f)
with open(self.log_path, "r") as f:
logs: List[AdminLogEvent] = json.load(f)
logs.append(event)
with open(self.log_path, "w") as f:
json.dump(logs, f, ensure_ascii=False, indent=4)
instance: Settings = Settings()

View file

@ -1,12 +1,11 @@
import sys import sys
import traceback import traceback
import os import os
from modules.settings import Settings as SettingsManager from modules.settings import instance as settings_manager
import logging import logging
from modules.globalvars import RED, RESET from modules.globalvars import RED, RESET
import modules.keys as k import modules.keys as k
settings_manager = SettingsManager()
settings = settings_manager.settings settings = settings_manager.settings
logger = logging.getLogger("goober") logger = logging.getLogger("goober")

37
settings/admin_logs.json Normal file
View file

@ -0,0 +1,37 @@
[
{
"action": "add",
"author": 642441889181728810,
"change": "enabled_cogs",
"messageId": 1397556082225844234,
"target": "whoami"
},
{
"action": "add",
"author": 642441889181728810,
"change": "owner_ids",
"messageId": 1397556184818384996,
"target": 1167661372809683048
},
{
"action": "del",
"author": 642441889181728810,
"change": "owner_ids",
"messageId": 1397556247313780829,
"target": 1167661372809683048
},
{
"action": "add",
"author": 642441889181728810,
"change": "enabled_cogs",
"messageId": 1397558663559909399,
"target": "fuckup"
},
{
"action": "add",
"author": 642441889181728810,
"change": "enabled_cogs",
"messageId": 1397558837644365935,
"target": "songchanger"
}
]

View file

@ -1,8 +1,8 @@
{ {
"bot": { "bot": {
"prefix": "\u00e4.", "prefix": "ä.",
"owner_ids": [ "owner_ids": [
642441889181728810
], ],
"blacklisted_users": [], "blacklisted_users": [],
"user_training": true, "user_training": true,
@ -16,6 +16,8 @@
}, },
"active_memory": "memory.json", "active_memory": "memory.json",
"enabled_cogs": [ "enabled_cogs": [
"fuckup",
"songchanger"
] ]
}, },
"locale": "fi", "locale": "fi",