Verwarnungssystem #35 #235
@@ -207,6 +207,14 @@
 | 
			
		||||
      },
 | 
			
		||||
      "unregister": {
 | 
			
		||||
        "success": "Verlinkung wurde entfernt :D"
 | 
			
		||||
      },
 | 
			
		||||
      "warnings": {
 | 
			
		||||
        "message": "Du wurdest verwarnt. Der Grund ist: {}",
 | 
			
		||||
        "messages": {
 | 
			
		||||
          "first": "Bei der nächsten verwarnung, wirst du auf das vorherige Level zurückgesetzt!",
 | 
			
		||||
          "second": "Bei der nächsten verwarnung, wirst du auf das erste Level zurückgesetzt!",
 | 
			
		||||
          "third": "Bei der nächsten verwarnung, wirst du gekickt und zurückgesetzt!"
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "boot_log": {
 | 
			
		||||
 
 | 
			
		||||
@@ -12,6 +12,7 @@ class UserWarnings(TableABC):
 | 
			
		||||
        self,
 | 
			
		||||
        description: str,
 | 
			
		||||
        user: Optional[User],
 | 
			
		||||
        author: Optional[User],
 | 
			
		||||
        created_at: datetime = None,
 | 
			
		||||
        modified_at: datetime = None,
 | 
			
		||||
        id=0,
 | 
			
		||||
@@ -19,7 +20,7 @@ class UserWarnings(TableABC):
 | 
			
		||||
        self._id = id
 | 
			
		||||
        self._description = description
 | 
			
		||||
        self._user = user
 | 
			
		||||
        self._author = user
 | 
			
		||||
        self._author = author
 | 
			
		||||
 | 
			
		||||
        TableABC.__init__(self)
 | 
			
		||||
        self._created_at = created_at if created_at is not None else self._created_at
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										98
									
								
								kdb-bot/src/modules/base/service/user_warnings_service.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								kdb-bot/src/modules/base/service/user_warnings_service.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,98 @@
 | 
			
		||||
from cpl_core.database.context import DatabaseContextABC
 | 
			
		||||
from cpl_core.logging import LoggerABC
 | 
			
		||||
from cpl_discord.service import DiscordBotServiceABC
 | 
			
		||||
from cpl_translation import TranslatePipe
 | 
			
		||||
 | 
			
		||||
from bot_core.abc.message_service_abc import MessageServiceABC
 | 
			
		||||
from bot_data.abc.level_repository_abc import LevelRepositoryABC
 | 
			
		||||
from bot_data.abc.server_repository_abc import ServerRepositoryABC
 | 
			
		||||
from bot_data.abc.user_repository_abc import UserRepositoryABC
 | 
			
		||||
from bot_data.abc.user_warning_repository_abc import UserWarningsRepositoryABC
 | 
			
		||||
from bot_data.model.user_warnings import UserWarnings
 | 
			
		||||
from modules.level.service.level_service import LevelService
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class UserWarningsService:
 | 
			
		||||
    def __init__(
 | 
			
		||||
        self,
 | 
			
		||||
        logger: LoggerABC,
 | 
			
		||||
        db: DatabaseContextABC,
 | 
			
		||||
        bot: DiscordBotServiceABC,
 | 
			
		||||
        warnings: UserWarningsRepositoryABC,
 | 
			
		||||
        users: UserRepositoryABC,
 | 
			
		||||
        servers: ServerRepositoryABC,
 | 
			
		||||
        levels: LevelRepositoryABC,
 | 
			
		||||
        level_service: LevelService,
 | 
			
		||||
        message_service: MessageServiceABC,
 | 
			
		||||
        t: TranslatePipe,
 | 
			
		||||
    ):
 | 
			
		||||
        self._logger = logger
 | 
			
		||||
        self._db = db
 | 
			
		||||
        self._bot = bot
 | 
			
		||||
        self._warnings = warnings
 | 
			
		||||
        self._users = users
 | 
			
		||||
        self._servers = servers
 | 
			
		||||
        self._levels = levels
 | 
			
		||||
        self._level_service = level_service
 | 
			
		||||
        self._message_service = message_service
 | 
			
		||||
        self._t = t
 | 
			
		||||
 | 
			
		||||
    async def add_warnings(self, guild_id: int, member_id: int, description: str, author_id: int = None):
 | 
			
		||||
        server = self._servers.get_server_by_discord_id(guild_id)
 | 
			
		||||
        user = self._users.get_user_by_discord_id_and_server_id(member_id, server.id)
 | 
			
		||||
 | 
			
		||||
        guild = self._bot.get_guild(guild_id)
 | 
			
		||||
        member = guild.get_member(member_id)
 | 
			
		||||
 | 
			
		||||
        author = None
 | 
			
		||||
        if author_id is not None:
 | 
			
		||||
            author = self._users.get_user_by_discord_id_and_server_id(author_id, server.id)
 | 
			
		||||
 | 
			
		||||
        warning = UserWarnings(description, user, author)
 | 
			
		||||
        self._warnings.add_user_warnings(warning)
 | 
			
		||||
        self._db.save_changes()
 | 
			
		||||
 | 
			
		||||
        existing_warnings = self._warnings.get_user_warnings_by_user_id(user.id)
 | 
			
		||||
        await self._message_service.send_dm_message(
 | 
			
		||||
            self._t.transform("modules.base.warnings.message").format(warning.description), member
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        match existing_warnings.count():
 | 
			
		||||
            case 1:
 | 
			
		||||
                await self._message_service.send_dm_message(
 | 
			
		||||
                    self._t.transform("modules.base.warnings.messages.first"), member
 | 
			
		||||
                )
 | 
			
		||||
            case 2:
 | 
			
		||||
                server = self._servers.get_server_by_discord_id(guild_id)
 | 
			
		||||
                user = self._users.get_user_by_discord_id_and_server_id(member_id, server.id)
 | 
			
		||||
                level = self._level_service.get_level(user)
 | 
			
		||||
                levels = self._levels.get_levels_by_server_id(server.id).order_by(lambda l: l.min_xp)
 | 
			
		||||
 | 
			
		||||
                new_level = levels.where(lambda l: l.min_xp < level.min_xp).last()
 | 
			
		||||
                user.xp = new_level.min_xp
 | 
			
		||||
                self._users.update_user(user)
 | 
			
		||||
                self._db.save_changes()
 | 
			
		||||
                await self._message_service.send_dm_message(
 | 
			
		||||
                    self._t.transform("modules.base.warnings.messages.second"), member
 | 
			
		||||
                )
 | 
			
		||||
            case 3:
 | 
			
		||||
                server = self._servers.get_server_by_discord_id(guild_id)
 | 
			
		||||
                user = self._users.get_user_by_discord_id_and_server_id(member_id, server.id)
 | 
			
		||||
                levels = self._levels.get_levels_by_server_id(server.id)
 | 
			
		||||
 | 
			
		||||
                new_level = levels.where(lambda l: l.min_xp > 0).order_by(lambda l: l.min_xp).last()
 | 
			
		||||
                user.xp = new_level.min_xp
 | 
			
		||||
                self._users.update_user(user)
 | 
			
		||||
                self._db.save_changes()
 | 
			
		||||
                await self._message_service.send_dm_message(
 | 
			
		||||
                    self._t.transform("modules.base.warnings.messages.third"), member
 | 
			
		||||
                )
 | 
			
		||||
            case 4:
 | 
			
		||||
                user.xp = 0
 | 
			
		||||
                self._users.update_user(user)
 | 
			
		||||
                self._db.save_changes()
 | 
			
		||||
                await member.kick()
 | 
			
		||||
 | 
			
		||||
    def remove_warnings(self, id: int):
 | 
			
		||||
        warning = self._warnings.get_user_warnings_by_id(id)
 | 
			
		||||
        self._warnings.delete_user_warnings(warning)
 | 
			
		||||
		Reference in New Issue
	
	Block a user