Compare commits
	
		
			23 Commits
		
	
	
		
			#139
			...
			6273ce9cba
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 6273ce9cba | |||
| 5c923d8bd8 | |||
| 6c6169f7ee | |||
| ffd5105154 | |||
| 9040ab6fca | |||
| 9d89135b4c | |||
| 71899346b2 | |||
| d197a6e158 | |||
| 40e53de3f2 | |||
| 1b9553e63b | |||
| 5447d502cc | |||
| 5a4c2901f5 | |||
| bcf71a26f0 | |||
| b25b75e382 | |||
| f21b4f9881 | |||
| 8705904882 | |||
| cf610b770b | |||
| ec30069ff5 | |||
| 7026b3abac | |||
| 31464df3f6 | |||
| eb9f5b83d5 | |||
| fdd8357729 | |||
| 7c744f0e65 | 
@@ -16,22 +16,22 @@
 | 
				
			|||||||
    "LicenseName": "MIT",
 | 
					    "LicenseName": "MIT",
 | 
				
			||||||
    "LicenseDescription": "MIT, see LICENSE for more details.",
 | 
					    "LicenseDescription": "MIT, see LICENSE for more details.",
 | 
				
			||||||
    "Dependencies": [
 | 
					    "Dependencies": [
 | 
				
			||||||
      "cpl-core==2022.10.0.post9",
 | 
					      "cpl-core==2022.12.0",
 | 
				
			||||||
      "cpl-translation==2022.10.0.post2",
 | 
					      "cpl-translation==2022.10.0.post2",
 | 
				
			||||||
      "cpl-query==2022.10.0.post2",
 | 
					      "cpl-query==2022.12.2",
 | 
				
			||||||
      "cpl-discord==2022.10.0.post6",
 | 
					      "cpl-discord==2022.12.0",
 | 
				
			||||||
      "Flask==2.2.2",
 | 
					      "Flask==2.2.2",
 | 
				
			||||||
      "Flask-Classful==0.14.2",
 | 
					      "Flask-Classful==0.14.2",
 | 
				
			||||||
      "Flask-Cors==3.0.10",
 | 
					      "Flask-Cors==3.0.10",
 | 
				
			||||||
      "PyJWT==2.6.0",
 | 
					      "PyJWT==2.6.0",
 | 
				
			||||||
      "waitress==2.1.2",
 | 
					      "waitress==2.1.2",
 | 
				
			||||||
      "Flask-SocketIO==5.3.1",
 | 
					      "Flask-SocketIO==5.3.2",
 | 
				
			||||||
      "eventlet==0.33.1",
 | 
					      "eventlet==0.33.2",
 | 
				
			||||||
      "requests-oauthlib==1.3.1",
 | 
					      "requests-oauthlib==1.3.1",
 | 
				
			||||||
      "icmplib==3.0.3"
 | 
					      "icmplib==3.0.3"
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    "DevDependencies": [
 | 
					    "DevDependencies": [
 | 
				
			||||||
      "cpl-cli==2022.10.0"
 | 
					      "cpl-cli==2022.12.0"
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    "PythonVersion": ">=3.10.4",
 | 
					    "PythonVersion": ">=3.10.4",
 | 
				
			||||||
    "PythonPath": {},
 | 
					    "PythonPath": {},
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -160,8 +160,8 @@
 | 
				
			|||||||
        "removed": "Presence wurde entfernt.",
 | 
					        "removed": "Presence wurde entfernt.",
 | 
				
			||||||
        "max_char_count_exceeded": "Der Text darf nicht mehr als 128 Zeichen lang sein!"
 | 
					        "max_char_count_exceeded": "Der Text darf nicht mehr als 128 Zeichen lang sein!"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "user_info": {
 | 
					      "user": {
 | 
				
			||||||
        "fields": {
 | 
					        "atr": {
 | 
				
			||||||
          "id": "Id",
 | 
					          "id": "Id",
 | 
				
			||||||
          "name": "Name",
 | 
					          "name": "Name",
 | 
				
			||||||
          "discord_join": "Discord beigetreten am",
 | 
					          "discord_join": "Discord beigetreten am",
 | 
				
			||||||
@@ -173,7 +173,27 @@
 | 
				
			|||||||
          "lefts": "Abgänge",
 | 
					          "lefts": "Abgänge",
 | 
				
			||||||
          "warnings": "Verwarnungen"
 | 
					          "warnings": "Verwarnungen"
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 | 
					        "info": {
 | 
				
			||||||
          "footer": ""
 | 
					          "footer": ""
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "get": {
 | 
				
			||||||
 | 
					          "xp": "{} hat {} xp",
 | 
				
			||||||
 | 
					          "ontime": "{} war insgesamt {} Stunden aktiv in einem Sprachkanal"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "set": {
 | 
				
			||||||
 | 
					          "xp": "{} hat nun {} xp",
 | 
				
			||||||
 | 
					          "error": {
 | 
				
			||||||
 | 
					            "value_type_not_numeric": "Der angegebende Wert ist keine Ganzzahl! :(",
 | 
				
			||||||
 | 
					            "type_error": "Der angegebene Wert konnte nicht als eine Ganzzahl interpretiert werden :("
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "remove": {
 | 
				
			||||||
 | 
					          "xp": "Die {} von {} wurden entfernt",
 | 
				
			||||||
 | 
					          "ontime": "Die {} von {} wurden entfernt"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "error": {
 | 
				
			||||||
 | 
					          "atr_not_found": "Das Attribut {} konnte nicht gefunden werden :("
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "boot_log": {
 | 
					    "boot_log": {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,10 +16,10 @@
 | 
				
			|||||||
    "LicenseName": "",
 | 
					    "LicenseName": "",
 | 
				
			||||||
    "LicenseDescription": "",
 | 
					    "LicenseDescription": "",
 | 
				
			||||||
    "Dependencies": [
 | 
					    "Dependencies": [
 | 
				
			||||||
      "cpl-core==2022.10.0.post7"
 | 
					      "cpl-core==2022.12.0"
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    "DevDependencies": [
 | 
					    "DevDependencies": [
 | 
				
			||||||
      "cpl-cli==2022.10.0"
 | 
					      "cpl-cli==2022.12.0"
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    "PythonVersion": ">=3.10.4",
 | 
					    "PythonVersion": ">=3.10.4",
 | 
				
			||||||
    "PythonPath": {},
 | 
					    "PythonPath": {},
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -46,14 +46,14 @@ class AuthController:
 | 
				
			|||||||
    @Route.authorize(role=AuthRoleEnum.admin)
 | 
					    @Route.authorize(role=AuthRoleEnum.admin)
 | 
				
			||||||
    async def get_all_users(self) -> Response:
 | 
					    async def get_all_users(self) -> Response:
 | 
				
			||||||
        result = await self._auth_service.get_all_auth_users_async()
 | 
					        result = await self._auth_service.get_all_auth_users_async()
 | 
				
			||||||
        return jsonify(result.select(lambda x: x.to_dict()))
 | 
					        return jsonify(result.select(lambda x: x.to_dict()).to_list())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Route.post(f'{BasePath}/users/get/filtered')
 | 
					    @Route.post(f'{BasePath}/users/get/filtered')
 | 
				
			||||||
    @Route.authorize(role=AuthRoleEnum.admin)
 | 
					    @Route.authorize(role=AuthRoleEnum.admin)
 | 
				
			||||||
    async def get_filtered_users(self) -> Response:
 | 
					    async def get_filtered_users(self) -> Response:
 | 
				
			||||||
        dto: AuthUserSelectCriteria = JSONProcessor.process(AuthUserSelectCriteria, request.get_json(force=True, silent=True))
 | 
					        dto: AuthUserSelectCriteria = JSONProcessor.process(AuthUserSelectCriteria, request.get_json(force=True, silent=True))
 | 
				
			||||||
        result = await self._auth_service.get_filtered_auth_users_async(dto)
 | 
					        result = await self._auth_service.get_filtered_auth_users_async(dto)
 | 
				
			||||||
        result.result = result.result.select(lambda x: x.to_dict())
 | 
					        result.result = result.result.select(lambda x: x.to_dict()).to_list()
 | 
				
			||||||
        return jsonify(result.to_dict())
 | 
					        return jsonify(result.to_dict())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Route.get(f'{BasePath}/users/get/<email>')
 | 
					    @Route.get(f'{BasePath}/users/get/<email>')
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -40,14 +40,14 @@ class ServerController:
 | 
				
			|||||||
    @Route.authorize(role=AuthRoleEnum.admin)
 | 
					    @Route.authorize(role=AuthRoleEnum.admin)
 | 
				
			||||||
    async def get_all_servers(self) -> Response:
 | 
					    async def get_all_servers(self) -> Response:
 | 
				
			||||||
        result = await self._discord_service.get_all_servers()
 | 
					        result = await self._discord_service.get_all_servers()
 | 
				
			||||||
        result = result.select(lambda x: x.to_dict())
 | 
					        result = result.select(lambda x: x.to_dict()).to_list()
 | 
				
			||||||
        return jsonify(result)
 | 
					        return jsonify(result)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Route.get(f'{BasePath}/get/servers-by-user')
 | 
					    @Route.get(f'{BasePath}/get/servers-by-user')
 | 
				
			||||||
    @Route.authorize
 | 
					    @Route.authorize
 | 
				
			||||||
    async def get_all_servers_by_user(self) -> Response:
 | 
					    async def get_all_servers_by_user(self) -> Response:
 | 
				
			||||||
        result = await self._discord_service.get_all_servers_by_user()
 | 
					        result = await self._discord_service.get_all_servers_by_user()
 | 
				
			||||||
        result = result.select(lambda x: x.to_dict())
 | 
					        result = result.select(lambda x: x.to_dict()).to_list()
 | 
				
			||||||
        return jsonify(result)
 | 
					        return jsonify(result)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Route.post(f'{BasePath}/get/filtered')
 | 
					    @Route.post(f'{BasePath}/get/filtered')
 | 
				
			||||||
@@ -55,11 +55,11 @@ class ServerController:
 | 
				
			|||||||
    async def get_filtered_servers(self) -> Response:
 | 
					    async def get_filtered_servers(self) -> Response:
 | 
				
			||||||
        dto: ServerSelectCriteria = JSONProcessor.process(ServerSelectCriteria, request.get_json(force=True, silent=True))
 | 
					        dto: ServerSelectCriteria = JSONProcessor.process(ServerSelectCriteria, request.get_json(force=True, silent=True))
 | 
				
			||||||
        result = await self._discord_service.get_filtered_servers_async(dto)
 | 
					        result = await self._discord_service.get_filtered_servers_async(dto)
 | 
				
			||||||
        result.result = result.result.select(lambda x: x.to_dict())
 | 
					        result.result = result.result.select(lambda x: x.to_dict()).to_list()
 | 
				
			||||||
        return jsonify(result.to_dict())
 | 
					        return jsonify(result.to_dict())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Route.get(f'{BasePath}/get/<id>')
 | 
					    @Route.get(f'{BasePath}/get/<id>')
 | 
				
			||||||
    @Route.authorize
 | 
					    @Route.authorize
 | 
				
			||||||
    async def get_server_by_id(self, id: int) -> Response:
 | 
					    async def get_server_by_id(self, id: int) -> Response:
 | 
				
			||||||
        result = await self._discord_service.get_server_by_id_async(id)
 | 
					        result = await self._discord_service.get_server_by_id_async(id).to_list()
 | 
				
			||||||
        return jsonify(result.to_dict())
 | 
					        return jsonify(result.to_dict())
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,10 +16,10 @@
 | 
				
			|||||||
    "LicenseName": "MIT",
 | 
					    "LicenseName": "MIT",
 | 
				
			||||||
    "LicenseDescription": "MIT, see LICENSE for more details.",
 | 
					    "LicenseDescription": "MIT, see LICENSE for more details.",
 | 
				
			||||||
    "Dependencies": [
 | 
					    "Dependencies": [
 | 
				
			||||||
      "cpl-core>=0.3.dev70"
 | 
					      "cpl-core==2022.12.0"
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    "DevDependencies": [
 | 
					    "DevDependencies": [
 | 
				
			||||||
      "cpl-cli==2022.10.0"
 | 
					      "cpl-cli==2022.12.0"
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    "PythonVersion": ">=3.10.4",
 | 
					    "PythonVersion": ">=3.10.4",
 | 
				
			||||||
    "PythonPath": {},
 | 
					    "PythonPath": {},
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -35,3 +35,6 @@ class UserJoinedVoiceChannelRepositoryABC(ABC):
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    @abstractmethod
 | 
					    @abstractmethod
 | 
				
			||||||
    def delete_user_joined_voice_channel(self, user_joined_voice_channel: UserJoinedVoiceChannel): pass
 | 
					    def delete_user_joined_voice_channel(self, user_joined_voice_channel: UserJoinedVoiceChannel): pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @abstractmethod
 | 
				
			||||||
 | 
					    def delete_user_joined_voice_channel_by_user_id(self, user_id: int): pass
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,10 +16,10 @@
 | 
				
			|||||||
    "LicenseName": "MIT",
 | 
					    "LicenseName": "MIT",
 | 
				
			||||||
    "LicenseDescription": "MIT, see LICENSE for more details.",
 | 
					    "LicenseDescription": "MIT, see LICENSE for more details.",
 | 
				
			||||||
    "Dependencies": [
 | 
					    "Dependencies": [
 | 
				
			||||||
      "cpl-core>=0.3.dev70"
 | 
					      "cpl-core==2022.12.0"
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    "DevDependencies": [
 | 
					    "DevDependencies": [
 | 
				
			||||||
      "cpl-cli==2022.10.0"
 | 
					      "cpl-cli==2022.12.0"
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    "PythonVersion": ">=3.10.4",
 | 
					    "PythonVersion": ">=3.10.4",
 | 
				
			||||||
    "PythonPath": {},
 | 
					    "PythonPath": {},
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -119,3 +119,10 @@ class UserJoinedVoiceChannel(TableABC):
 | 
				
			|||||||
            DELETE FROM `UserJoinedVoiceChannel`
 | 
					            DELETE FROM `UserJoinedVoiceChannel`
 | 
				
			||||||
            WHERE `JoinId` = {self._join_id};
 | 
					            WHERE `JoinId` = {self._join_id};
 | 
				
			||||||
        """)
 | 
					        """)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def delete_by_user_id_string(id: int) -> str:
 | 
				
			||||||
 | 
					        return str(f"""
 | 
				
			||||||
 | 
					            DELETE FROM `UserJoinedVoiceChannel`
 | 
				
			||||||
 | 
					            WHERE `UserId` = {id}
 | 
				
			||||||
 | 
					    """)
 | 
				
			||||||
@@ -121,3 +121,7 @@ class UserJoinedVoiceChannelRepositoryService(UserJoinedVoiceChannelRepositoryAB
 | 
				
			|||||||
    def delete_user_joined_voice_channel(self, user_joined_voice_channel: UserJoinedVoiceChannel):
 | 
					    def delete_user_joined_voice_channel(self, user_joined_voice_channel: UserJoinedVoiceChannel):
 | 
				
			||||||
        self._logger.trace(__name__, f'Send SQL command: {user_joined_voice_channel.delete_string}')
 | 
					        self._logger.trace(__name__, f'Send SQL command: {user_joined_voice_channel.delete_string}')
 | 
				
			||||||
        self._context.cursor.execute(user_joined_voice_channel.delete_string)
 | 
					        self._context.cursor.execute(user_joined_voice_channel.delete_string)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def delete_user_joined_voice_channel_by_user_id(self, user_id: int):
 | 
				
			||||||
 | 
					        self._logger.trace(__name__, f'Send SQL command: {UserJoinedVoiceChannel.delete_by_user_id_string}')
 | 
				
			||||||
 | 
					        self._context.cursor.execute(UserJoinedVoiceChannel.delete_by_user_id_string(user_id))
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,10 +16,10 @@
 | 
				
			|||||||
    "LicenseName": "",
 | 
					    "LicenseName": "",
 | 
				
			||||||
    "LicenseDescription": "",
 | 
					    "LicenseDescription": "",
 | 
				
			||||||
    "Dependencies": [
 | 
					    "Dependencies": [
 | 
				
			||||||
      "cpl-core>=2022.10.0.post5"
 | 
					      "cpl-core==2022.12.0"
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    "DevDependencies": [
 | 
					    "DevDependencies": [
 | 
				
			||||||
      "cpl-cli==2022.10.0"
 | 
					      "cpl-cli==2022.12.0"
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    "PythonVersion": ">=3.10.4",
 | 
					    "PythonVersion": ">=3.10.4",
 | 
				
			||||||
    "PythonPath": {},
 | 
					    "PythonPath": {},
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,10 +16,10 @@
 | 
				
			|||||||
    "LicenseName": "",
 | 
					    "LicenseName": "",
 | 
				
			||||||
    "LicenseDescription": "",
 | 
					    "LicenseDescription": "",
 | 
				
			||||||
    "Dependencies": [
 | 
					    "Dependencies": [
 | 
				
			||||||
      "cpl-core>=2022.10.0.post2"
 | 
					      "cpl-core==2022.12.0"
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    "DevDependencies": [
 | 
					    "DevDependencies": [
 | 
				
			||||||
      "cpl-cli==2022.10.0"
 | 
					      "cpl-cli==2022.12.0"
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    "PythonVersion": ">=3.10.4",
 | 
					    "PythonVersion": ">=3.10.4",
 | 
				
			||||||
    "PythonPath": {},
 | 
					    "PythonPath": {},
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,12 +1,15 @@
 | 
				
			|||||||
from typing import Optional
 | 
					from typing import Optional, List
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import discord
 | 
					import discord
 | 
				
			||||||
from cpl_core.configuration import ConfigurationABC
 | 
					from cpl_core.configuration import ConfigurationABC
 | 
				
			||||||
 | 
					from cpl_core.database.context import DatabaseContextABC
 | 
				
			||||||
from cpl_discord.command import DiscordCommandABC
 | 
					from cpl_discord.command import DiscordCommandABC
 | 
				
			||||||
from cpl_discord.service import DiscordBotServiceABC
 | 
					from cpl_discord.service import DiscordBotServiceABC
 | 
				
			||||||
from cpl_translation import TranslatePipe
 | 
					from cpl_translation import TranslatePipe
 | 
				
			||||||
 | 
					from discord import app_commands
 | 
				
			||||||
from discord.ext import commands
 | 
					from discord.ext import commands
 | 
				
			||||||
from discord.ext.commands import Context
 | 
					from discord.ext.commands import Context
 | 
				
			||||||
 | 
					from mysql.connector.errors import DatabaseError
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from bot_core.abc.client_utils_service_abc import ClientUtilsServiceABC
 | 
					from bot_core.abc.client_utils_service_abc import ClientUtilsServiceABC
 | 
				
			||||||
from bot_core.abc.message_service_abc import MessageServiceABC
 | 
					from bot_core.abc.message_service_abc import MessageServiceABC
 | 
				
			||||||
@@ -17,6 +20,7 @@ from bot_data.abc.server_repository_abc import ServerRepositoryABC
 | 
				
			|||||||
from bot_data.abc.user_joined_server_repository_abc import UserJoinedServerRepositoryABC
 | 
					from bot_data.abc.user_joined_server_repository_abc import UserJoinedServerRepositoryABC
 | 
				
			||||||
from bot_data.abc.user_joined_voice_channel_abc import UserJoinedVoiceChannelRepositoryABC
 | 
					from bot_data.abc.user_joined_voice_channel_abc import UserJoinedVoiceChannelRepositoryABC
 | 
				
			||||||
from bot_data.abc.user_repository_abc import UserRepositoryABC
 | 
					from bot_data.abc.user_repository_abc import UserRepositoryABC
 | 
				
			||||||
 | 
					from modules.level.service.level_service import LevelService
 | 
				
			||||||
from modules.permission.abc.permission_service_abc import PermissionServiceABC
 | 
					from modules.permission.abc.permission_service_abc import PermissionServiceABC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -31,11 +35,13 @@ class UserGroup(DiscordCommandABC):
 | 
				
			|||||||
            client_utils: ClientUtilsServiceABC,
 | 
					            client_utils: ClientUtilsServiceABC,
 | 
				
			||||||
            permissions: PermissionServiceABC,
 | 
					            permissions: PermissionServiceABC,
 | 
				
			||||||
            servers: ServerRepositoryABC,
 | 
					            servers: ServerRepositoryABC,
 | 
				
			||||||
 | 
					            db: DatabaseContextABC,
 | 
				
			||||||
            users: UserRepositoryABC,
 | 
					            users: UserRepositoryABC,
 | 
				
			||||||
            user_joined_servers: UserJoinedServerRepositoryABC,
 | 
					            user_joined_servers: UserJoinedServerRepositoryABC,
 | 
				
			||||||
            user_joined_voice_channel: UserJoinedVoiceChannelRepositoryABC,
 | 
					            user_joined_voice_channel: UserJoinedVoiceChannelRepositoryABC,
 | 
				
			||||||
            translate: TranslatePipe,
 | 
					            translate: TranslatePipe,
 | 
				
			||||||
            date: DateTimeOffsetPipe
 | 
					            date: DateTimeOffsetPipe,
 | 
				
			||||||
 | 
					            level: LevelService
 | 
				
			||||||
    ):
 | 
					    ):
 | 
				
			||||||
        DiscordCommandABC.__init__(self)
 | 
					        DiscordCommandABC.__init__(self)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -46,14 +52,21 @@ class UserGroup(DiscordCommandABC):
 | 
				
			|||||||
        self._client_utils = client_utils
 | 
					        self._client_utils = client_utils
 | 
				
			||||||
        self._permissions = permissions
 | 
					        self._permissions = permissions
 | 
				
			||||||
        self._servers = servers
 | 
					        self._servers = servers
 | 
				
			||||||
 | 
					        self._db = db
 | 
				
			||||||
        self._users = users
 | 
					        self._users = users
 | 
				
			||||||
        self._user_joined_servers = user_joined_servers
 | 
					        self._user_joined_servers = user_joined_servers
 | 
				
			||||||
        self._user_joined_voice_channel = user_joined_voice_channel
 | 
					        self._user_joined_voice_channel = user_joined_voice_channel
 | 
				
			||||||
        self._t = translate
 | 
					        self._t = translate
 | 
				
			||||||
        self._date = date
 | 
					        self._date = date
 | 
				
			||||||
 | 
					        self._level = level
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self._logger.trace(__name__, f'Loaded command service: {type(self).__name__}')
 | 
					        self._logger.trace(__name__, f'Loaded command service: {type(self).__name__}')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self._atr_dict = {
 | 
				
			||||||
 | 
					            "xp": self._t.transform('modules.base.user.atr.xp'),
 | 
				
			||||||
 | 
					            'ontime': self._t.transform('modules.base.user.atr.ontime')
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @commands.hybrid_group()
 | 
					    @commands.hybrid_group()
 | 
				
			||||||
    @commands.guild_only()
 | 
					    @commands.guild_only()
 | 
				
			||||||
    async def user(self, ctx: Context):
 | 
					    async def user(self, ctx: Context):
 | 
				
			||||||
@@ -83,26 +96,28 @@ class UserGroup(DiscordCommandABC):
 | 
				
			|||||||
            color=int('ef9d0d', 16)
 | 
					            color=int('ef9d0d', 16)
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ujvs = self._user_joined_voice_channel.get_user_joined_voice_channels_by_user_id(user.user_id)
 | 
					        ontime = self._user_joined_voice_channel.get_user_joined_voice_channels_by_user_id(user.user_id).sum(
 | 
				
			||||||
        ontime = ujvs.sum(lambda join: round((join.leaved_on - join.joined_on).total_seconds() / 3600, 2))
 | 
					            lambda join: round((join.leaved_on - join.joined_on).total_seconds() / 3600, 2))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        embed.add_field(name=self._t.transform('modules.base.user_info.fields.id'), value=member.id)
 | 
					        embed.add_field(name=self._t.transform('modules.base.user.atr.id'), value=member.id)
 | 
				
			||||||
        embed.add_field(name=self._t.transform('modules.base.user_info.fields.name'), value=member.name)
 | 
					        embed.add_field(name=self._t.transform('modules.base.user.atr.name'), value=member.name)
 | 
				
			||||||
        embed.add_field(name=self._t.transform('modules.base.user_info.fields.discord_join'), value=self._date.transform(member.created_at), inline=False)
 | 
					        embed.add_field(name=self._t.transform('modules.base.user.atr.discord_join'),
 | 
				
			||||||
        embed.add_field(name=self._t.transform('modules.base.user_info.fields.last_join'), value=self._date.transform(member.joined_at), inline=False)
 | 
					                        value=self._date.transform(member.created_at), inline=False)
 | 
				
			||||||
        embed.add_field(name=self._t.transform('modules.base.user_info.fields.xp'), value=str(user.xp))
 | 
					        embed.add_field(name=self._t.transform('modules.base.user.atr.last_join'),
 | 
				
			||||||
        embed.add_field(name=self._t.transform('modules.base.user_info.fields.ontime'), value=str(ontime))
 | 
					                        value=self._date.transform(member.joined_at), inline=False)
 | 
				
			||||||
 | 
					        embed.add_field(name=self._t.transform('modules.base.user.atr.xp'), value=str(user.xp))
 | 
				
			||||||
 | 
					        embed.add_field(name=self._t.transform('modules.base.user.atr.ontime'), value=str(ontime))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        roles = ''
 | 
					        roles = ''
 | 
				
			||||||
        for role in member.roles:
 | 
					        for role in member.roles:
 | 
				
			||||||
            roles += f'{role.name}\n'
 | 
					            roles += f'{role.name}\n'
 | 
				
			||||||
        embed.add_field(name=self._t.transform('modules.base.user_info.fields.roles'), value=roles, inline=False)
 | 
					        embed.add_field(name=self._t.transform('modules.base.user.atr.roles'), value=roles, inline=False)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if is_mod or member == ctx.author:
 | 
					        if is_mod or member == ctx.author:
 | 
				
			||||||
            joins_string = ''
 | 
					            joins_string = ''
 | 
				
			||||||
            for join in joins:
 | 
					            for join in joins:
 | 
				
			||||||
                joins_string += f'{self._date.transform(join.joined_on)}\n'
 | 
					                joins_string += f'{self._date.transform(join.joined_on)}\n'
 | 
				
			||||||
            embed.add_field(name=self._t.transform('modules.base.user_info.fields.joins'), value=joins_string)
 | 
					            embed.add_field(name=self._t.transform('modules.base.user.atr.joins'), value=joins_string)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if is_mod or member == ctx.author:
 | 
					        if is_mod or member == ctx.author:
 | 
				
			||||||
            lefts_string = ''
 | 
					            lefts_string = ''
 | 
				
			||||||
@@ -113,11 +128,130 @@ class UserGroup(DiscordCommandABC):
 | 
				
			|||||||
                    continue
 | 
					                    continue
 | 
				
			||||||
                lefts_string += f'{self._date.transform(join.leaved_on)}\n'
 | 
					                lefts_string += f'{self._date.transform(join.leaved_on)}\n'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            embed.add_field(name=self._t.transform('modules.base.user_info.fields.lefts'), value=lefts_string)
 | 
					            embed.add_field(name=self._t.transform('modules.base.user.atr.lefts'), value=lefts_string)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if is_mod or member == ctx.author:
 | 
					        if is_mod or member == ctx.author:
 | 
				
			||||||
            embed.add_field(name=self._t.transform('modules.base.user_info.fields.warnings'), value=self._t.transform('common.not_implemented_yet'), inline=False)
 | 
					            embed.add_field(name=self._t.transform('modules.base.user.atr.warnings'),
 | 
				
			||||||
 | 
					                            value=self._t.transform('common.not_implemented_yet'), inline=False)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # send to interaction because of sensitive data
 | 
					        # send to interaction because of sensitive data
 | 
				
			||||||
        await self._message_service.send_interaction_msg(ctx.interaction, embed, wait_before_delete=wait)
 | 
					        await self._message_service.send_interaction_msg(ctx.interaction, embed, wait_before_delete=wait)
 | 
				
			||||||
        self._logger.trace(__name__, f'Finished user-info command')
 | 
					        self._logger.trace(__name__, f'Finished user-info command')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @user.command()
 | 
				
			||||||
 | 
					    @commands.guild_only()
 | 
				
			||||||
 | 
					    @CommandChecks.check_is_ready()
 | 
				
			||||||
 | 
					    async def get(self, ctx: Context, atr: str, member: discord.Member = None):
 | 
				
			||||||
 | 
					        self._logger.debug(__name__, f'Received command user-get {ctx}:{member}')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        is_mod = self._permissions.is_member_moderator(ctx.author)
 | 
				
			||||||
 | 
					        if member is not None and not is_mod:
 | 
				
			||||||
 | 
					            await self._message_service.send_ctx_msg(ctx, self._t.transform('common.no_permission_message'))
 | 
				
			||||||
 | 
					            return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if member is None or not isinstance(member, discord.Member):
 | 
				
			||||||
 | 
					            member = ctx.author
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        server = self._servers.find_server_by_discord_id(ctx.guild.id)
 | 
				
			||||||
 | 
					        user = self._users.find_user_by_discord_id_and_server_id(member.id, server.server_id)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if atr == self._atr_dict["xp"]:
 | 
				
			||||||
 | 
					            value = str(user.xp)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        elif atr == self._atr_dict["ontime"]:
 | 
				
			||||||
 | 
					            value = str(round(
 | 
				
			||||||
 | 
					                self._user_joined_voice_channel.get_user_joined_voice_channels_by_user_id(user.user_id)
 | 
				
			||||||
 | 
					                .sum(lambda join: (join.leaved_on - join.joined_on).total_seconds() / 3600),
 | 
				
			||||||
 | 
					                2
 | 
				
			||||||
 | 
					            ))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            await self._message_service.send_interaction_msg(ctx.interaction, self._t.transform('modules.base.user.error.atr_not_found').format(atr))
 | 
				
			||||||
 | 
					            return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        await self._message_service.send_interaction_msg(
 | 
				
			||||||
 | 
					            ctx.interaction,
 | 
				
			||||||
 | 
					            self._t.transform(f'modules.base.user.get.{atr}').format(member.mention, value)
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @get.autocomplete('atr')
 | 
				
			||||||
 | 
					    async def get_autocomplete(self, interaction: discord.Interaction, current: str) -> List[app_commands.Choice[str]]:
 | 
				
			||||||
 | 
					        atr_list = [self._atr_dict["xp"], self._atr_dict["ontime"]]
 | 
				
			||||||
 | 
					        return [app_commands.Choice(name=atr, value=atr) for atr in atr_list]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @user.command()
 | 
				
			||||||
 | 
					    @commands.guild_only()
 | 
				
			||||||
 | 
					    @CommandChecks.check_is_ready()
 | 
				
			||||||
 | 
					    @CommandChecks.check_is_member_moderator()
 | 
				
			||||||
 | 
					    async def set(self, ctx: Context, atr: str, value: str, member: discord.Member = None):
 | 
				
			||||||
 | 
					        self._logger.debug(__name__, f'Received command user-set {ctx}:{member}')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if member is None or not isinstance(member, discord.Member):
 | 
				
			||||||
 | 
					            member = ctx.author
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        server = self._servers.find_server_by_discord_id(ctx.guild.id)
 | 
				
			||||||
 | 
					        user = self._users.find_user_by_discord_id_and_server_id(member.id, server.server_id)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if atr == self._atr_dict["xp"]:
 | 
				
			||||||
 | 
					            if not value.isnumeric():
 | 
				
			||||||
 | 
					                await self._message_service.send_interaction_msg(ctx.interaction, self._t.transform('modules.base.user.set.error.value_type_not_numeric'))
 | 
				
			||||||
 | 
					                return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            try:
 | 
				
			||||||
 | 
					                user.xp = int(value)
 | 
				
			||||||
 | 
					            except TypeError as te:
 | 
				
			||||||
 | 
					                self._logger.error(__name__, f'String value couldn\'t be converted to int', te)
 | 
				
			||||||
 | 
					                await self._message_service.send_interaction_msg(ctx.interaction, self._t.transform('modules.base.user.set.error.type_error'))
 | 
				
			||||||
 | 
					                return
 | 
				
			||||||
 | 
					            else:
 | 
				
			||||||
 | 
					                self._users.update_user(user)
 | 
				
			||||||
 | 
					                self._db.save_changes()
 | 
				
			||||||
 | 
					                await self._level.check_level(member)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            await self._message_service.send_interaction_msg(ctx.interaction, self._t.transform('modules.base.user.error.atr_not_found').format(atr))
 | 
				
			||||||
 | 
					            return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        await self._message_service.send_interaction_msg(ctx.interaction,self._t.transform(f'modules.base.user.set.{atr}').format(member.mention, value))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @set.autocomplete('atr')
 | 
				
			||||||
 | 
					    async def set_autocomplete(self, interaction: discord.Interaction, current: str) -> List[app_commands.Choice[str]]:
 | 
				
			||||||
 | 
					        atr_list = [self._atr_dict["xp"]]
 | 
				
			||||||
 | 
					        return [app_commands.Choice(name=atr, value=atr) for atr in atr_list]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @user.command()
 | 
				
			||||||
 | 
					    @commands.guild_only()
 | 
				
			||||||
 | 
					    @CommandChecks.check_is_ready()
 | 
				
			||||||
 | 
					    @CommandChecks.check_is_member_moderator()
 | 
				
			||||||
 | 
					    async def remove(self, ctx: Context, atr: str, member: discord.Member = None):
 | 
				
			||||||
 | 
					        self._logger.debug(__name__, f'Received command user-remove {ctx}:{member}')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if member is None or not isinstance(member, discord.Member):
 | 
				
			||||||
 | 
					            member = ctx.author
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        server = self._servers.find_server_by_discord_id(ctx.guild.id)
 | 
				
			||||||
 | 
					        user = self._users.find_user_by_discord_id_and_server_id(member.id, server.server_id)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if atr == self._atr_dict["xp"]:
 | 
				
			||||||
 | 
					            user.xp = 0
 | 
				
			||||||
 | 
					            self._users.update_user(user)
 | 
				
			||||||
 | 
					            self._db.save_changes()
 | 
				
			||||||
 | 
					            await self._level.check_level(member)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        elif atr == self._atr_dict["ontime"]:
 | 
				
			||||||
 | 
					            self._user_joined_voice_channel.delete_user_joined_voice_channel_by_user_id(user.user_id)
 | 
				
			||||||
 | 
					            self._db.save_changes()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            await self._message_service.send_interaction_msg(ctx.interaction, self._t.transform('modules.base.user.error.atr_not_found').format(atr))
 | 
				
			||||||
 | 
					            return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        await self._message_service.send_interaction_msg(
 | 
				
			||||||
 | 
					            ctx.interaction,
 | 
				
			||||||
 | 
					            self._t.transform(f'modules.base.user.remove.{atr}').format(atr, member.mention)
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @remove.autocomplete('atr')
 | 
				
			||||||
 | 
					    async def remove_autocomplete(self, interaction: discord.Interaction, current: str) -> List[app_commands.Choice[str]]:
 | 
				
			||||||
 | 
					        atr_list = [self._atr_dict["xp"], self._atr_dict["ontime"]]
 | 
				
			||||||
 | 
					        return [app_commands.Choice(name=atr, value=atr) for atr in atr_list]
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,10 +16,10 @@
 | 
				
			|||||||
    "LicenseName": "",
 | 
					    "LicenseName": "",
 | 
				
			||||||
    "LicenseDescription": "",
 | 
					    "LicenseDescription": "",
 | 
				
			||||||
    "Dependencies": [
 | 
					    "Dependencies": [
 | 
				
			||||||
      "cpl-core>=2022.10.0.post2"
 | 
					      "cpl-core==2022.12.0"
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    "DevDependencies": [
 | 
					    "DevDependencies": [
 | 
				
			||||||
      "cpl-cli==2022.10.0"
 | 
					      "cpl-cli==2022.12.0"
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    "PythonVersion": ">=3.10.4",
 | 
					    "PythonVersion": ">=3.10.4",
 | 
				
			||||||
    "PythonPath": {},
 | 
					    "PythonPath": {},
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,10 +16,10 @@
 | 
				
			|||||||
    "LicenseName": "MIT",
 | 
					    "LicenseName": "MIT",
 | 
				
			||||||
    "LicenseDescription": "MIT, see LICENSE for more details.",
 | 
					    "LicenseDescription": "MIT, see LICENSE for more details.",
 | 
				
			||||||
    "Dependencies": [
 | 
					    "Dependencies": [
 | 
				
			||||||
      "cpl-core>=2022.10.0.post2"
 | 
					      "cpl-core==2022.12.0"
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    "DevDependencies": [
 | 
					    "DevDependencies": [
 | 
				
			||||||
      "cpl-cli==2022.10.0"
 | 
					      "cpl-cli==2022.12.0"
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    "PythonVersion": ">=3.10.4",
 | 
					    "PythonVersion": ">=3.10.4",
 | 
				
			||||||
    "PythonPath": {},
 | 
					    "PythonPath": {},
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,10 +16,10 @@
 | 
				
			|||||||
    "LicenseName": "",
 | 
					    "LicenseName": "",
 | 
				
			||||||
    "LicenseDescription": "",
 | 
					    "LicenseDescription": "",
 | 
				
			||||||
    "Dependencies": [
 | 
					    "Dependencies": [
 | 
				
			||||||
      "cpl-core>=2022.10.0.post7"
 | 
					      "cpl-core==2022.12.0"
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    "DevDependencies": [
 | 
					    "DevDependencies": [
 | 
				
			||||||
      "cpl-cli>=2022.10.1"
 | 
					      "cpl-cli==2022.12.0"
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    "PythonVersion": ">=3.10.4",
 | 
					    "PythonVersion": ">=3.10.4",
 | 
				
			||||||
    "PythonPath": {},
 | 
					    "PythonPath": {},
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -88,7 +88,7 @@ class LevelSeeder(DataSeederABC):
 | 
				
			|||||||
                if levels.where(lambda l: l.name == role.name).count() == 0:
 | 
					                if levels.where(lambda l: l.name == role.name).count() == 0:
 | 
				
			||||||
                    continue
 | 
					                    continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                new_position = position_above_levels - (levels.index(levels.where(lambda l: l.name == role.name).single()) + 1)
 | 
					                new_position = position_above_levels - (levels.index_of(levels.where(lambda l: l.name == role.name).single()) + 1)
 | 
				
			||||||
                if new_position <= 0:
 | 
					                if new_position <= 0:
 | 
				
			||||||
                    new_position = 1
 | 
					                    new_position = 1
 | 
				
			||||||
                try:
 | 
					                try:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,10 +16,10 @@
 | 
				
			|||||||
    "LicenseName": "",
 | 
					    "LicenseName": "",
 | 
				
			||||||
    "LicenseDescription": "",
 | 
					    "LicenseDescription": "",
 | 
				
			||||||
    "Dependencies": [
 | 
					    "Dependencies": [
 | 
				
			||||||
      "cpl-core>=2022.10.0.post2"
 | 
					      "cpl-core==2022.12.0"
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    "DevDependencies": [
 | 
					    "DevDependencies": [
 | 
				
			||||||
      "cpl-cli==2022.10.0"
 | 
					      "cpl-cli==2022.12.0"
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    "PythonVersion": ">=3.10.4",
 | 
					    "PythonVersion": ">=3.10.4",
 | 
				
			||||||
    "PythonPath": {},
 | 
					    "PythonPath": {},
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,10 +16,10 @@
 | 
				
			|||||||
    "LicenseName": "",
 | 
					    "LicenseName": "",
 | 
				
			||||||
    "LicenseDescription": "",
 | 
					    "LicenseDescription": "",
 | 
				
			||||||
    "Dependencies": [
 | 
					    "Dependencies": [
 | 
				
			||||||
      "cpl-core>=2022.10.0.post7"
 | 
					      "cpl-core==2022.12.0"
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    "DevDependencies": [
 | 
					    "DevDependencies": [
 | 
				
			||||||
      "cpl-cli>=2022.10.1"
 | 
					      "cpl-cli==2022.12.0"
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    "PythonVersion": ">=3.10.4",
 | 
					    "PythonVersion": ">=3.10.4",
 | 
				
			||||||
    "PythonPath": {},
 | 
					    "PythonPath": {},
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,10 +16,10 @@
 | 
				
			|||||||
    "LicenseName": "",
 | 
					    "LicenseName": "",
 | 
				
			||||||
    "LicenseDescription": "",
 | 
					    "LicenseDescription": "",
 | 
				
			||||||
    "Dependencies": [
 | 
					    "Dependencies": [
 | 
				
			||||||
      "cpl-core>=2022.10.0.post7"
 | 
					      "cpl-core==2022.12.0"
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    "DevDependencies": [
 | 
					    "DevDependencies": [
 | 
				
			||||||
      "cpl-cli>=2022.10.0"
 | 
					      "cpl-cli==2022.12.0"
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    "PythonVersion": ">=3.10.6",
 | 
					    "PythonVersion": ">=3.10.6",
 | 
				
			||||||
    "PythonPath": {},
 | 
					    "PythonPath": {},
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,10 +16,10 @@
 | 
				
			|||||||
    "LicenseName": "MIT",
 | 
					    "LicenseName": "MIT",
 | 
				
			||||||
    "LicenseDescription": "MIT, see LICENSE for more details.",
 | 
					    "LicenseDescription": "MIT, see LICENSE for more details.",
 | 
				
			||||||
    "Dependencies": [
 | 
					    "Dependencies": [
 | 
				
			||||||
      "cpl-core==2022.10.0.post7"
 | 
					      "cpl-core==2022.12.0"
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    "DevDependencies": [
 | 
					    "DevDependencies": [
 | 
				
			||||||
      "cpl-cli==2022.10.0"
 | 
					      "cpl-cli==2022.12.0"
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    "PythonVersion": ">=3.10.4",
 | 
					    "PythonVersion": ">=3.10.4",
 | 
				
			||||||
    "PythonPath": {},
 | 
					    "PythonPath": {},
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,10 +16,10 @@
 | 
				
			|||||||
    "LicenseName": "MIT",
 | 
					    "LicenseName": "MIT",
 | 
				
			||||||
    "LicenseDescription": "MIT, see LICENSE for more details.",
 | 
					    "LicenseDescription": "MIT, see LICENSE for more details.",
 | 
				
			||||||
    "Dependencies": [
 | 
					    "Dependencies": [
 | 
				
			||||||
      "cpl-core>=2022.10.0.post7"
 | 
					      "cpl-core==2022.12.0"
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    "DevDependencies": [
 | 
					    "DevDependencies": [
 | 
				
			||||||
      "cpl-cli>=2022.10.0"
 | 
					      "cpl-cli==2022.12.0"
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    "PythonVersion": ">=3.10.4",
 | 
					    "PythonVersion": ">=3.10.4",
 | 
				
			||||||
    "PythonPath": {},
 | 
					    "PythonPath": {},
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,11 +16,11 @@
 | 
				
			|||||||
    "LicenseName": "MIT",
 | 
					    "LicenseName": "MIT",
 | 
				
			||||||
    "LicenseDescription": "MIT, see LICENSE for more details.",
 | 
					    "LicenseDescription": "MIT, see LICENSE for more details.",
 | 
				
			||||||
    "Dependencies": [
 | 
					    "Dependencies": [
 | 
				
			||||||
      "cpl-core==2022.10.0.post7",
 | 
					      "cpl-core==2022.12.0"
 | 
				
			||||||
      "GitPython==3.1.27"
 | 
					      "GitPython==3.1.27"
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    "DevDependencies": [
 | 
					    "DevDependencies": [
 | 
				
			||||||
      "cpl-cli==2022.10.0"
 | 
					      "cpl-cli==2022.12.0"
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    "PythonVersion": ">=3.10.4",
 | 
					    "PythonVersion": ">=3.10.4",
 | 
				
			||||||
    "PythonPath": {},
 | 
					    "PythonPath": {},
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,13 +0,0 @@
 | 
				
			|||||||
import { NgModule } from "@angular/core";
 | 
					 | 
				
			||||||
import { RouterModule, Routes } from "@angular/router";
 | 
					 | 
				
			||||||
import { MembersComponent } from "./component/members/members.component";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const routes: Routes = [
 | 
					 | 
				
			||||||
  { path: '', component: MembersComponent },
 | 
					 | 
				
			||||||
];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@NgModule({
 | 
					 | 
				
			||||||
  imports: [RouterModule.forChild(routes)],
 | 
					 | 
				
			||||||
  exports: [RouterModule]
 | 
					 | 
				
			||||||
})
 | 
					 | 
				
			||||||
export class MembersRoutingModule { }
 | 
					 | 
				
			||||||
@@ -1,11 +1,9 @@
 | 
				
			|||||||
import { NgModule } from '@angular/core';
 | 
					import { NgModule } from "@angular/core";
 | 
				
			||||||
import { RouterModule, Routes } from '@angular/router';
 | 
					import { RouterModule, Routes } from "@angular/router";
 | 
				
			||||||
import { ServerDashboardComponent } from './server-dashboard/server-dashboard.component';
 | 
					import { ServerDashboardComponent } from "./server-dashboard/server-dashboard.component";
 | 
				
			||||||
import { AuthGuard } from "../../shared/guards/auth/auth.guard";
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
const routes: Routes = [
 | 
					const routes: Routes = [
 | 
				
			||||||
  { path: '', component: ServerDashboardComponent },
 | 
					  { path: '', component: ServerDashboardComponent },
 | 
				
			||||||
  { path: 'members', loadChildren: () => import('./members/members.module').then(m => m.MembersModule), canActivate: [AuthGuard] },
 | 
					 | 
				
			||||||
];
 | 
					];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@NgModule({
 | 
					@NgModule({
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user