diff --git a/classes/holo_user.py b/classes/holo_user.py index 1d57392..6403786 100644 --- a/classes/holo_user.py +++ b/classes/holo_user.py @@ -3,25 +3,20 @@ from typing import Any, Union import discord import discord.member +from libbot import config_get from modules.database import col_users, col_warnings -from modules.utils import config_get logger = logging.getLogger(__name__) -class NotEnoughMoneyError(Exception): - """User does not have enough money to do that""" - - pass - - class UserNotFoundError(Exception): """HoloUser could not find user with such an ID in database""" def __init__(self, user, user_id): self.user = user self.user_id = user_id + super().__init__( f"User of type {type(self.user)} with id {self.user_id} was not found" ) @@ -63,10 +58,8 @@ class HoloUser: * `int`: Number of warnings """ warns = col_warnings.find_one({"user": self.id}) - if warns == None: - return 0 - else: - return warns["warns"] + + return 0 if warns is None else warns["warns"] def warn(self, count=1, reason: str = "Not provided") -> None: """Warn and add count to warns number @@ -75,13 +68,15 @@ class HoloUser: * `count` (int, optional): Count of warnings to be added. Defaults to 1. """ warns = col_warnings.find_one({"user": self.id}) - if warns != None: + + if warns is not None: col_warnings.update_one( filter={"_id": self.db_id}, update={"$set": {"warns": warns["warns"] + count}}, ) else: col_warnings.insert_one(document={"user": self.id, "warns": count}) + logger.info(f"User {self.id} was warned {count} times due to: {reason}") def set(self, key: str, value: Any) -> None: @@ -93,10 +88,12 @@ class HoloUser: """ if not hasattr(self, key): raise AttributeError() + setattr(self, key, value) col_users.update_one( filter={"_id": self.db_id}, update={"$set": {key: value}}, upsert=True ) + logger.info(f"Set attribute {key} of user {self.id} to {value}") async def is_moderator( @@ -112,11 +109,14 @@ class HoloUser: """ if isinstance(member, discord.User): return False + moderator_role = await config_get("moderators", "roles") council_role = await config_get("council", "roles") + for role in member.roles: if role.id == moderator_role or role.id == council_role: return True + return False async def is_council( @@ -132,10 +132,13 @@ class HoloUser: """ if isinstance(member, discord.User): return False + council_role = await config_get("council", "roles") + for role in member.roles: if role.id == council_role: return True + return False # def purge(self) -> None: diff --git a/cogs/admin.py b/cogs/admin.py index 4e3a778..71c714c 100644 --- a/cogs/admin.py +++ b/cogs/admin.py @@ -4,12 +4,13 @@ import sys from discord import ApplicationContext, Embed, User, option, slash_command from discord import utils as ds_utils from discord.ext import commands +from libbot import config_get from libbot.pycord.classes import PycordBot +from libbot.sync import config_get as sync_config_get from enums.colors import Color from modules.scheduled import scheduler -from modules.utils import config_get -from modules.utils_sync import config_get_sync, guild_name +from modules.utils_sync import guild_name logger = logging.getLogger(__name__) @@ -106,7 +107,7 @@ class Admin(commands.Cog): @slash_command( name="clear", description="Видалити деяку кількість повідомлень в каналі", - guild_ids=[config_get_sync("guild")], + guild_ids=[sync_config_get("guild")], ) @option("amount", description="Кількість") @option("user", description="Користувач", default=None) @@ -170,7 +171,7 @@ class Admin(commands.Cog): @slash_command( name="reboot", description="Перезапустити бота", - guild_ids=[config_get_sync("guild")], + guild_ids=[sync_config_get("guild")], ) async def reboot_cmd(self, ctx: ApplicationContext): await ctx.defer(ephemeral=True) diff --git a/cogs/custom_channels.py b/cogs/custom_channels.py index 7006ca0..2e20e2f 100644 --- a/cogs/custom_channels.py +++ b/cogs/custom_channels.py @@ -3,13 +3,14 @@ from discord import utils as ds_utils from discord.abc import GuildChannel from discord.commands import SlashCommandGroup from discord.ext import commands +from libbot import config_get from libbot.pycord.classes import PycordBot +from libbot.sync import config_get as sync_config_get from classes.holo_user import HoloUser from enums.colors import Color from modules.database import col_users -from modules.utils import config_get -from modules.utils_sync import config_get_sync, guild_name +from modules.utils_sync import guild_name class CustomChannels(commands.Cog): @@ -27,7 +28,7 @@ class CustomChannels(commands.Cog): @customchannel.command( name="get", description="Отримати персональний текстовий канал", - guild_ids=[config_get_sync("guild")], + guild_ids=[sync_config_get("guild")], ) @option("name", description="Назва каналу") @option("reactions", description="Дозволити реакції") @@ -97,7 +98,7 @@ class CustomChannels(commands.Cog): @customchannel.command( name="edit", description="Змінити параметри особистого каналу", - guild_ids=[config_get_sync("guild")], + guild_ids=[sync_config_get("guild")], ) @option("name", description="Назва каналу") @option("reactions", description="Дозволити реакції") @@ -142,7 +143,7 @@ class CustomChannels(commands.Cog): @customchannel.command( name="remove", description="Відібрати канал, знищуючи його, та частково повернути кошти", - guild_ids=[config_get_sync("guild")], + guild_ids=[sync_config_get("guild")], ) @option("confirm", description="Підтвердження операції") async def customchannel_remove_cmd( diff --git a/cogs/data.py b/cogs/data.py index 98fe97d..d45f38b 100644 --- a/cogs/data.py +++ b/cogs/data.py @@ -7,13 +7,15 @@ from discord import ApplicationContext, Embed, File, option from discord import utils as ds_utils from discord.commands import SlashCommandGroup from discord.ext import commands +from libbot import config_get from libbot.pycord.classes import PycordBot +from libbot.sync import config_get as sync_config_get +from libbot.sync import json_write as sync_json_write from classes.holo_user import HoloUser from enums.colors import Color from modules.database import col_users -from modules.utils import config_get -from modules.utils_sync import config_get_sync, guild_name, json_write_sync +from modules.utils_sync import guild_name logger = logging.getLogger(__name__) @@ -27,7 +29,7 @@ class Data(commands.Cog): @data.command( name="export", description="Експортувати дані", - guild_ids=[config_get_sync("guild")], + guild_ids=[sync_config_get("guild")], ) @option( "kind", description="Тип даних, які треба експортувати", choices=["Користувачі"] @@ -91,16 +93,14 @@ class Data(commands.Cog): } ) - json_write_sync(users, str(Path(f"tmp/{uuid}"))) + sync_json_write(users, Path(f"tmp/{uuid}")) - await ctx.respond( - file=File(str(Path(f"tmp/{uuid}")), filename="users.json") - ) + await ctx.respond(file=File(Path(f"tmp/{uuid}"), filename="users.json")) @data.command( name="migrate", description="Мігрувати всіх користувачів до бази", - guild_ids=[config_get_sync("guild")], + guild_ids=[sync_config_get("guild")], ) @option( "kind", description="Тип даних, які треба експортувати", choices=["Користувачі"] diff --git a/cogs/fun.py b/cogs/fun.py index c539b09..d2140b8 100644 --- a/cogs/fun.py +++ b/cogs/fun.py @@ -1,12 +1,13 @@ import logging +from WaifuPicsPython import WaifuAsync from discord import ApplicationContext, Embed, User, option, slash_command from discord.ext import commands +from libbot import config_get from libbot.pycord.classes import PycordBot -from WaifuPicsPython import WaifuAsync +from libbot.sync import config_get as sync_config_get -from modules.utils import config_get -from modules.utils_sync import config_get_sync, guild_name +from modules.utils_sync import guild_name logger = logging.getLogger(__name__) @@ -20,12 +21,12 @@ class Fun(commands.Cog): @slash_command( name="action", description="Провести над користувачем РП дію", - guild_ids=[config_get_sync("guild")], + guild_ids=[sync_config_get("guild")], ) @option( "type", description="Тип дії, яку хочете провести з користувачем", - choices=config_get_sync("actions").keys(), + choices=sync_config_get("actions").keys(), ) @option("user", description="Користувач") async def action_cmd(self, ctx: ApplicationContext, type: str, user: User): diff --git a/cogs/logger.py b/cogs/logger.py index ab62b3a..c45c131 100644 --- a/cogs/logger.py +++ b/cogs/logger.py @@ -1,10 +1,10 @@ from discord import Member, Message from discord import utils as ds_utils from discord.ext import commands +from libbot import config_get from libbot.pycord.classes import PycordBot from modules.database import col_users -from modules.utils import config_get class Logger(commands.Cog): diff --git a/main.py b/main.py index 28da765..5dcf3a2 100644 --- a/main.py +++ b/main.py @@ -1,11 +1,11 @@ import logging from discord import Activity, ActivityType +from libbot import config_get +from libbot.sync import config_get as sync_config_get from modules.client import client from modules.scheduled import scheduler -from modules.utils import config_get -from modules.utils_sync import config_get_sync logging.basicConfig( level=logging.INFO, @@ -67,7 +67,7 @@ def main(): try: scheduler.start() - client.run(config_get_sync("bot_token", "bot")) + client.run(sync_config_get("bot_token", "bot")) except KeyboardInterrupt: scheduler.shutdown() exit() diff --git a/modules/utils.py b/modules/utils.py deleted file mode 100644 index 8a4f34a..0000000 --- a/modules/utils.py +++ /dev/null @@ -1,38 +0,0 @@ -from typing import Any - -import aiofiles -from ujson import dumps, loads - - -async def json_read(path: str) -> Any: - async with aiofiles.open(path, mode="r", encoding="utf-8") as f: - data = await f.read() - return loads(data) - - -async def json_write(data: Any, path: str) -> None: - async with aiofiles.open(path, mode="w", encoding="utf-8") as f: - await f.write( - dumps(data, ensure_ascii=False, escape_forward_slashes=False, indent=4) - ) - - -async def config_get(key: str, *path: str) -> Any: - this_key = await json_read("config.json") - for dict_key in path: - this_key = this_key[dict_key] - return this_key[key] - - -async def config_set(key: str, value: Any, *path: str) -> None: - this_dict = await json_read("config.json") - string = "this_dict" - for arg in path: - string += f'["{arg}"]' - if type(value) in [str]: - string += f'["{key}"] = "{value}"' - else: - string += f'["{key}"] = {value}' - exec(string) - await json_write(this_dict, "config.json") - return diff --git a/modules/utils_sync.py b/modules/utils_sync.py index 3f80df6..b5690f3 100644 --- a/modules/utils_sync.py +++ b/modules/utils_sync.py @@ -1,45 +1,10 @@ -from typing import Any, Union +from typing import Union from discord import Member, User -from ujson import dumps, loads - - -def json_read_sync(path: str) -> Any: - with open(path, mode="r", encoding="utf-8") as f: - data = f.read() - return loads(data) - - -def json_write_sync(data: Any, path: str) -> None: - with open(path, mode="w", encoding="utf-8") as f: - f.write(dumps(data, ensure_ascii=False, escape_forward_slashes=False, indent=4)) - - -def config_get_sync(key: str, *path: str) -> Any: - this_key = json_read_sync("config.json") - for dict_key in path: - this_key = this_key[dict_key] - return this_key[key] - - -def config_set_sync(key: str, value: Any, *path: str) -> None: - this_dict = json_read_sync("config.json") - string = "this_dict" - for arg in path: - string += f'["{arg}"]' - if type(value) in [str]: - string += f'["{key}"] = "{value}"' - else: - string += f'["{key}"] = {value}' - exec(string) - json_write_sync(this_dict, "config.json") - return def guild_name(member: Union[Member, User]) -> str: if isinstance(member, User): return member.name - if member.nick == None: - return member.name - else: - return member.nick + + return member.name if member.nick is None else member.nick