Compare commits
	
		
			161 Commits
		
	
	
		
			4da87ae3cb
			...
			1.1.1
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 9ec65689ba | |||
| 44f5de32a5 | |||
| c016d5fc84 | |||
| 306ce2664c | |||
| 3ce5471ef4 | |||
| 4cdd6c05bf | |||
| d364ea1b4c | |||
| 6fa08ea828 | |||
| 296c6e8044 | |||
| 0541f3dfde | |||
| 052e0f976a | |||
| f41dfc9be2 | |||
| 74437fdc20 | |||
| df2b660b75 | |||
| 12f231aa41 | |||
| 2f3ae229c9 | |||
| 5bbed854a4 | |||
| 2321c12bc9 | |||
| 1cdfd1291f | |||
| 223946ad76 | |||
| 4ea1b5b94c | |||
| 919970d199 | |||
| 19ed164845 | |||
| 92001a45be | |||
| 78b761a672 | |||
| 7bfa39f459 | |||
| d586cca672 | |||
| efce172c01 | |||
| 0974325148 | |||
| 206754919f | |||
| b49512e28d | |||
| fa71759a20 | |||
| 9338e35504 | |||
| 2956dcb9c2 | |||
| 762bebf416 | |||
| f3b5cef253 | |||
| 6869c5a671 | |||
| 352b44be0f | |||
| 5912708d3a | |||
| 45a3127696 | |||
| 10c20621a8 | |||
| 49e0e44461 | |||
| ec6b080ba6 | |||
| 28944755ac | |||
| 7318239b2d | |||
| cf66d246a9 | |||
| 41fe6faa52 | |||
| 685c96bb38 | |||
| 2c3e5268e4 | |||
| 2d5ce58612 | |||
| fe3d67eff5 | |||
| 4cea31fce5 | |||
| aa2c80ec12 | |||
| e283a18def | |||
| f5b2bec356 | |||
| c2b32996fd | |||
| 195566a2b6 | |||
| 073c318671 | |||
| caeec47b7c | |||
| 44f6b36347 | |||
| 4e32414f48 | |||
| 573c9c999e | |||
| 825fcff82d | |||
| a95bf7bc6c | |||
| 0bc3bff58e | |||
| c3b86fab6b | |||
| 906602134e | |||
| 30791f7529 | |||
| 456d939b47 | |||
| 1f47636e8d | |||
| f4acc2669d | |||
| 46b5757fd1 | |||
| 1cd75cd78f | |||
| f7f3fea7a7 | |||
| 5dd2000f10 | |||
| 1b2bb85b37 | |||
| 113b188a40 | |||
| e549341196 | |||
| 8a0d939147 | |||
| 4b57d7f102 | |||
| 02e0c72a80 | |||
| bfc9979961 | |||
| 8d76f79732 | |||
| 4add293186 | |||
| 1fc5ef76a6 | |||
| e6c9959381 | |||
| 9db00516c3 | |||
| 44e225c273 | |||
| 99e75ba325 | |||
| 3a078271ff | |||
| 1f9991eeda | |||
| bfe72668dc | |||
| 51d95c81c1 | |||
| 6c39cd1ae1 | |||
| 5d36f1188a | |||
| 4c42949516 | |||
| 8922524f44 | |||
| eac367c611 | |||
| f02acd7f94 | |||
| 05ddfb3de3 | |||
| 5c2c89ca45 | |||
| ec1ce4adef | |||
| 71f1f972c9 | |||
| 23757bc841 | |||
| 9671090385 | |||
| a03ddf3fc2 | |||
| da3538a836 | |||
| c782c11b6d | |||
| 05a2ea9b18 | |||
| a482c72a56 | |||
| 22bdf13835 | |||
| 0a3affc5d0 | |||
| d642322985 | |||
| 9f63a9c6dd | |||
| 11a4874bfb | |||
| d4dd55944a | |||
| 23d6216029 | |||
| f7297ddf78 | |||
| eb3715d00b | |||
| aae6472e11 | |||
| a71e3e4720 | |||
| 189128f0d3 | |||
| 3fb951a748 | |||
| 2293849d94 | |||
| cd5b3b6523 | |||
| c8a2ed290b | |||
| 184d241695 | |||
| cab65477b0 | |||
| 3507623c92 | |||
| b99dd1bded | |||
| a0d38bec49 | |||
| f312a2d776 | |||
| bfb816dd17 | |||
| d6854d44b7 | |||
| fdbba1b89c | |||
| 7f197a0ea7 | |||
| 2c9569b75f | |||
| 607b7d8aee | |||
| 00db6ac10f | |||
| f034413e35 | |||
| ff16eae477 | |||
| dbd82930d4 | |||
| 2e9cf0bd97 | |||
| 8a2edc7228 | |||
| 6d14ba9d79 | |||
| ba5f83f3d0 | |||
| 9f614e8a31 | |||
| 6e0d4a5144 | |||
| bd8bd40863 | |||
| c7a1069c0c | |||
| dc0c6ca6a0 | |||
| ff009ffb61 | |||
| 074b03eecf | |||
| 9201cbf357 | |||
| 5ea698ef97 | |||
| 400e54a501 | |||
| 3c0233e8b3 | |||
| 8d2ae38d85 | |||
| 2b866b5ab1 | |||
| b8320c83fe | |||
| 1792359e68 | 
							
								
								
									
										100
									
								
								kdb-bot/.cpl/schematic_db_table.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								kdb-bot/.cpl/schematic_db_table.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,100 @@
 | 
				
			|||||||
 | 
					from cpl_cli.abc.generate_schematic_abc import GenerateSchematicABC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class DBTable(GenerateSchematicABC):
 | 
				
			||||||
 | 
					    def __init__(self, *args: str):
 | 
				
			||||||
 | 
					        GenerateSchematicABC.__init__(self, *args)
 | 
				
			||||||
 | 
					        self._name = self._name.replace("_db_table", "")
 | 
				
			||||||
 | 
					        self._class_name = self._class_name.split("Db_table")[0]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def get_code(self) -> str:
 | 
				
			||||||
 | 
					        import textwrap
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        code = textwrap.dedent(
 | 
				
			||||||
 | 
					            """\
 | 
				
			||||||
 | 
					                from datetime import datetime
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                from cpl_core.database import TableABC
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					                class $ClassName(TableABC):
 | 
				
			||||||
 | 
					                    def __init__(
 | 
				
			||||||
 | 
					                        self,
 | 
				
			||||||
 | 
					                        value: str,
 | 
				
			||||||
 | 
					                        created_at: datetime = None,
 | 
				
			||||||
 | 
					                        modified_at: datetime = None,
 | 
				
			||||||
 | 
					                        id=0,
 | 
				
			||||||
 | 
					                    ):
 | 
				
			||||||
 | 
					                        self._id = id
 | 
				
			||||||
 | 
					                        self._value = value
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					                        TableABC.__init__(self)
 | 
				
			||||||
 | 
					                        self._created_at = created_at if created_at is not None else self._created_at
 | 
				
			||||||
 | 
					                        self._modified_at = modified_at if modified_at is not None else self._modified_at
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					                    @property
 | 
				
			||||||
 | 
					                    def value(self) -> str:
 | 
				
			||||||
 | 
					                        return self._value
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					                    @value.setter
 | 
				
			||||||
 | 
					                    def value(self, value: str):
 | 
				
			||||||
 | 
					                        self._value = value
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					                    @staticmethod
 | 
				
			||||||
 | 
					                    def get_select_all_string() -> str:
 | 
				
			||||||
 | 
					                        return str(
 | 
				
			||||||
 | 
					                            f\"""
 | 
				
			||||||
 | 
					                                SELECT * FROM `$TableName`;
 | 
				
			||||||
 | 
					                            \"""
 | 
				
			||||||
 | 
					                        )
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					                    @staticmethod
 | 
				
			||||||
 | 
					                    def get_select_by_id_string(id: int) -> str:
 | 
				
			||||||
 | 
					                        return str(
 | 
				
			||||||
 | 
					                            f\"""
 | 
				
			||||||
 | 
					                                SELECT * FROM `$TableName`
 | 
				
			||||||
 | 
					                                WHERE `Id` = {id};
 | 
				
			||||||
 | 
					                            \"""
 | 
				
			||||||
 | 
					                        )
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					                    @property
 | 
				
			||||||
 | 
					                    def insert_string(self) -> str:
 | 
				
			||||||
 | 
					                        return str(
 | 
				
			||||||
 | 
					                            f\"""
 | 
				
			||||||
 | 
					                                INSERT INTO `$TableName` (
 | 
				
			||||||
 | 
					                                    `Value`
 | 
				
			||||||
 | 
					                                ) VALUES (
 | 
				
			||||||
 | 
					                                    {self._value}
 | 
				
			||||||
 | 
					                                );
 | 
				
			||||||
 | 
					                            \"""
 | 
				
			||||||
 | 
					                        )
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					                    @property
 | 
				
			||||||
 | 
					                    def udpate_string(self) -> str:
 | 
				
			||||||
 | 
					                        return str(
 | 
				
			||||||
 | 
					                            f\"""
 | 
				
			||||||
 | 
					                                UPDATE `$TableName`
 | 
				
			||||||
 | 
					                                SET `Value` = {self._value}
 | 
				
			||||||
 | 
					                                WHERE `Id` = {self._id};
 | 
				
			||||||
 | 
					                            \"""
 | 
				
			||||||
 | 
					                        )
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					                    @property
 | 
				
			||||||
 | 
					                    def delete_string(self) -> str:
 | 
				
			||||||
 | 
					                        return str(
 | 
				
			||||||
 | 
					                            f\"""
 | 
				
			||||||
 | 
					                                DELETE FROM `$TableName`
 | 
				
			||||||
 | 
					                                WHERE `Id` = {self._id};
 | 
				
			||||||
 | 
					                            \"""
 | 
				
			||||||
 | 
					                        )
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        return self.build_code_str(
 | 
				
			||||||
 | 
					            code,
 | 
				
			||||||
 | 
					            ClassName=self._class_name,
 | 
				
			||||||
 | 
					            TableName=self._class_name,
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @classmethod
 | 
				
			||||||
 | 
					    def register(cls):
 | 
				
			||||||
 | 
					        GenerateSchematicABC.register(cls, "db-table", [])
 | 
				
			||||||
							
								
								
									
										55
									
								
								kdb-bot/.cpl/schematic_migration.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								kdb-bot/.cpl/schematic_migration.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,55 @@
 | 
				
			|||||||
 | 
					from cpl_cli.abc.generate_schematic_abc import GenerateSchematicABC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Migration(GenerateSchematicABC):
 | 
				
			||||||
 | 
					    def __init__(self, *args: str):
 | 
				
			||||||
 | 
					        GenerateSchematicABC.__init__(self, *args)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def get_code(self) -> str:
 | 
				
			||||||
 | 
					        import textwrap
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        code = textwrap.dedent(
 | 
				
			||||||
 | 
					            """\
 | 
				
			||||||
 | 
					                from bot_core.logging.database_logger import DatabaseLogger
 | 
				
			||||||
 | 
					                from bot_data.abc.migration_abc import MigrationABC
 | 
				
			||||||
 | 
					                from bot_data.db_context import DBContext
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					                class $ClassName(MigrationABC):
 | 
				
			||||||
 | 
					                    name = "1.0_$ClassName"
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					                    def __init__(self, logger: DatabaseLogger, db: DBContext):
 | 
				
			||||||
 | 
					                        MigrationABC.__init__(self)
 | 
				
			||||||
 | 
					                        self._logger = logger
 | 
				
			||||||
 | 
					                        self._db = db
 | 
				
			||||||
 | 
					                        self._cursor = db.cursor
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					                    def upgrade(self):
 | 
				
			||||||
 | 
					                        self._logger.debug(__name__, "Running upgrade")
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					                        self._cursor.execute(
 | 
				
			||||||
 | 
					                            str(
 | 
				
			||||||
 | 
					                                f\"""
 | 
				
			||||||
 | 
					                                    CREATE TABLE IF NOT EXISTS `$TableName` (
 | 
				
			||||||
 | 
					                                        `Id` BIGINT NOT NULL AUTO_INCREMENT,
 | 
				
			||||||
 | 
					                                        `CreatedAt` DATETIME(6),
 | 
				
			||||||
 | 
					                                        `LastModifiedAt` DATETIME(6),
 | 
				
			||||||
 | 
					                                        PRIMARY KEY(`Id`)
 | 
				
			||||||
 | 
					                                    );
 | 
				
			||||||
 | 
					                                \"""
 | 
				
			||||||
 | 
					                            )
 | 
				
			||||||
 | 
					                        )
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					                    def downgrade(self):
 | 
				
			||||||
 | 
					                        self._cursor.execute("DROP TABLE `$TableName`;")
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        return self.build_code_str(
 | 
				
			||||||
 | 
					            code,
 | 
				
			||||||
 | 
					            ClassName=self._class_name,
 | 
				
			||||||
 | 
					            TableName=self._class_name.split("Migration")[0],
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @classmethod
 | 
				
			||||||
 | 
					    def register(cls):
 | 
				
			||||||
 | 
					        GenerateSchematicABC.register(cls, "migration", [])
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
from cpl_cli.abc.generate_schematic_abc import GenerateSchematicABC
 | 
					from cpl_cli.abc.generate_schematic_abc import GenerateSchematicABC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class query(GenerateSchematicABC):
 | 
					class Query(GenerateSchematicABC):
 | 
				
			||||||
    def __init__(self, *args: str):
 | 
					    def __init__(self, *args: str):
 | 
				
			||||||
        GenerateSchematicABC.__init__(self, *args)
 | 
					        GenerateSchematicABC.__init__(self, *args)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,9 +7,11 @@
 | 
				
			|||||||
      "bot-core": "src/bot_core/bot-core.json",
 | 
					      "bot-core": "src/bot_core/bot-core.json",
 | 
				
			||||||
      "bot-data": "src/bot_data/bot-data.json",
 | 
					      "bot-data": "src/bot_data/bot-data.json",
 | 
				
			||||||
      "bot-graphql": "src/bot_graphql/bot-graphql.json",
 | 
					      "bot-graphql": "src/bot_graphql/bot-graphql.json",
 | 
				
			||||||
 | 
					      "achievements": "src/modules/achievements/achievements.json",
 | 
				
			||||||
      "auto-role": "src/modules/auto_role/auto-role.json",
 | 
					      "auto-role": "src/modules/auto_role/auto-role.json",
 | 
				
			||||||
      "base": "src/modules/base/base.json",
 | 
					      "base": "src/modules/base/base.json",
 | 
				
			||||||
      "boot-log": "src/modules/boot_log/boot-log.json",
 | 
					      "boot-log": "src/modules/boot_log/boot-log.json",
 | 
				
			||||||
 | 
					      "config": "src/modules/config/config.json",
 | 
				
			||||||
      "database": "src/modules/database/database.json",
 | 
					      "database": "src/modules/database/database.json",
 | 
				
			||||||
      "level": "src/modules/level/level.json",
 | 
					      "level": "src/modules/level/level.json",
 | 
				
			||||||
      "permission": "src/modules/permission/permission.json",
 | 
					      "permission": "src/modules/permission/permission.json",
 | 
				
			||||||
@@ -21,25 +23,18 @@
 | 
				
			|||||||
    },
 | 
					    },
 | 
				
			||||||
    "Scripts": {
 | 
					    "Scripts": {
 | 
				
			||||||
      "format": "black ./",
 | 
					      "format": "black ./",
 | 
				
			||||||
 | 
					 | 
				
			||||||
      "sv": "cpl set-version $ARGS",
 | 
					      "sv": "cpl set-version $ARGS",
 | 
				
			||||||
      "set-version": "cpl run set-version $ARGS --dev; echo '';",
 | 
					      "set-version": "cpl run set-version $ARGS --dev; echo '';",
 | 
				
			||||||
 | 
					 | 
				
			||||||
      "gv": "cpl get-version",
 | 
					      "gv": "cpl get-version",
 | 
				
			||||||
      "get-version": "export VERSION=$(cpl run get-version --dev); echo $VERSION;",
 | 
					      "get-version": "export VERSION=$(cpl run get-version --dev); echo $VERSION;",
 | 
				
			||||||
 | 
					 | 
				
			||||||
      "pre-build": "cpl set-version $ARGS; black ./;",
 | 
					      "pre-build": "cpl set-version $ARGS; black ./;",
 | 
				
			||||||
      "post-build": "cpl run post-build --dev; black ./;",
 | 
					      "post-build": "cpl run post-build --dev; black ./;",
 | 
				
			||||||
 | 
					 | 
				
			||||||
      "pre-prod": "cpl build",
 | 
					      "pre-prod": "cpl build",
 | 
				
			||||||
      "prod": "export KDB_ENVIRONMENT=production; export KDB_NAME=KDB-Prod; cpl start;",
 | 
					      "prod": "export KDB_ENVIRONMENT=production; export KDB_NAME=KDB-Prod; cpl start;",
 | 
				
			||||||
 | 
					 | 
				
			||||||
      "pre-stage": "cpl build",
 | 
					      "pre-stage": "cpl build",
 | 
				
			||||||
      "stage": "export KDB_ENVIRONMENT=staging; export KDB_NAME=KDB-Stage; cpl start;",
 | 
					      "stage": "export KDB_ENVIRONMENT=staging; export KDB_NAME=KDB-Stage; cpl start;",
 | 
				
			||||||
 | 
					 | 
				
			||||||
      "pre-dev": "cpl build",
 | 
					      "pre-dev": "cpl build",
 | 
				
			||||||
      "dev": "export KDB_ENVIRONMENT=development; export KDB_NAME=KDB-Dev; cpl start;",
 | 
					      "dev": "export KDB_ENVIRONMENT=development; export KDB_NAME=KDB-Dev; cpl start;",
 | 
				
			||||||
 | 
					 | 
				
			||||||
      "docker-build": "cpl build $ARGS; docker build -t kdb-bot/kdb-bot:$(cpl gv) .;",
 | 
					      "docker-build": "cpl build $ARGS; docker build -t kdb-bot/kdb-bot:$(cpl gv) .;",
 | 
				
			||||||
      "dc-up": "docker-compose up -d",
 | 
					      "dc-up": "docker-compose up -d",
 | 
				
			||||||
      "dc-down": "docker-compose down",
 | 
					      "dc-down": "docker-compose down",
 | 
				
			||||||
 
 | 
				
			|||||||
 Submodule kdb-bot/docker updated: 62475d6546...3107817939
									
								
							@@ -15,7 +15,7 @@ __title__ = "bot"
 | 
				
			|||||||
__author__ = "Sven Heidemann"
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
__license__ = "MIT"
 | 
					__license__ = "MIT"
 | 
				
			||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
					__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
				
			||||||
__version__ = "1.0.6"
 | 
					__version__ = "1.1.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -23,4 +23,4 @@ from collections import namedtuple
 | 
				
			|||||||
# imports:
 | 
					# imports:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="1", minor="0", micro="6")
 | 
					version_info = VersionInfo(major="1", minor="1", micro="1")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,6 +10,7 @@ from cpl_translation import TranslatePipe, TranslationServiceABC, TranslationSet
 | 
				
			|||||||
from bot_api.api_thread import ApiThread
 | 
					from bot_api.api_thread import ApiThread
 | 
				
			||||||
from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
 | 
					from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
 | 
				
			||||||
from bot_core.configuration.feature_flags_settings import FeatureFlagsSettings
 | 
					from bot_core.configuration.feature_flags_settings import FeatureFlagsSettings
 | 
				
			||||||
 | 
					from bot_core.service.data_integrity_service import DataIntegrityService
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Application(DiscordBotApplicationABC):
 | 
					class Application(DiscordBotApplicationABC):
 | 
				
			||||||
@@ -21,6 +22,7 @@ class Application(DiscordBotApplicationABC):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        # cpl-core
 | 
					        # cpl-core
 | 
				
			||||||
        self._logger: LoggerABC = services.get_service(LoggerABC)
 | 
					        self._logger: LoggerABC = services.get_service(LoggerABC)
 | 
				
			||||||
 | 
					        self._data_integrity: DataIntegrityService = services.get_service(DataIntegrityService)
 | 
				
			||||||
        # cpl-discord
 | 
					        # cpl-discord
 | 
				
			||||||
        self._bot: DiscordBotServiceABC = services.get_service(DiscordBotServiceABC)
 | 
					        self._bot: DiscordBotServiceABC = services.get_service(DiscordBotServiceABC)
 | 
				
			||||||
        self._bot_settings: DiscordBotSettings = config.get_configuration(DiscordBotSettings)
 | 
					        self._bot_settings: DiscordBotSettings = config.get_configuration(DiscordBotSettings)
 | 
				
			||||||
@@ -69,6 +71,7 @@ class Application(DiscordBotApplicationABC):
 | 
				
			|||||||
                self._api.stop()
 | 
					                self._api.stop()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            await self._bot.close()
 | 
					            await self._bot.close()
 | 
				
			||||||
 | 
					            await self._data_integrity.check_data_integrity(is_for_shutdown=True)
 | 
				
			||||||
            self._logger.info(__name__, f"Stopped {DiscordBotService.__name__}")
 | 
					            self._logger.info(__name__, f"Stopped {DiscordBotService.__name__}")
 | 
				
			||||||
        except Exception as e:
 | 
					        except Exception as e:
 | 
				
			||||||
            self._logger.error(__name__, "stop failed", e)
 | 
					            self._logger.error(__name__, "stop failed", e)
 | 
				
			||||||
@@ -76,4 +79,4 @@ class Application(DiscordBotApplicationABC):
 | 
				
			|||||||
        Console.write_line()
 | 
					        Console.write_line()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def is_restart(self):
 | 
					    def is_restart(self):
 | 
				
			||||||
        return True if self._configuration.get_configuration("IS_RESTART") == "true" else False  #
 | 
					        return True if self._configuration.get_configuration("IS_RESTART") == "true" else False
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,8 +3,8 @@
 | 
				
			|||||||
    "Name": "bot",
 | 
					    "Name": "bot",
 | 
				
			||||||
    "Version": {
 | 
					    "Version": {
 | 
				
			||||||
      "Major": "1",
 | 
					      "Major": "1",
 | 
				
			||||||
      "Minor": "0",
 | 
					      "Minor": "1",
 | 
				
			||||||
      "Micro": "6"
 | 
					      "Micro": "1"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "Author": "Sven Heidemann",
 | 
					    "Author": "Sven Heidemann",
 | 
				
			||||||
    "AuthorEmail": "sven.heidemann@sh-edraft.de",
 | 
					    "AuthorEmail": "sven.heidemann@sh-edraft.de",
 | 
				
			||||||
@@ -16,24 +16,26 @@
 | 
				
			|||||||
    "LicenseName": "MIT",
 | 
					    "LicenseName": "MIT",
 | 
				
			||||||
    "LicenseDescription": "MIT, see LICENSE for more details.",
 | 
					    "LicenseDescription": "MIT, see LICENSE for more details.",
 | 
				
			||||||
    "Dependencies": [
 | 
					    "Dependencies": [
 | 
				
			||||||
      "cpl-core==2022.12.1.post3",
 | 
					      "cpl-core==2023.4.0.post5",
 | 
				
			||||||
      "cpl-translation==2022.12.1",
 | 
					      "cpl-translation==2023.4.0.post1",
 | 
				
			||||||
      "cpl-query==2022.12.2.post2",
 | 
					      "cpl-query==2023.4.0.post1",
 | 
				
			||||||
      "cpl-discord==2022.12.2.post1",
 | 
					      "cpl-discord==2023.4.0.post3",
 | 
				
			||||||
      "Flask==2.2.2",
 | 
					      "Flask==2.3.2",
 | 
				
			||||||
      "Flask-Classful==0.14.2",
 | 
					      "Flask-Classful==0.14.2",
 | 
				
			||||||
      "Flask-Cors==3.0.10",
 | 
					      "Flask-Cors==4.0.0",
 | 
				
			||||||
      "PyJWT==2.6.0",
 | 
					      "PyJWT==2.8.0",
 | 
				
			||||||
      "waitress==2.1.2",
 | 
					      "waitress==2.1.2",
 | 
				
			||||||
      "Flask-SocketIO==5.3.2",
 | 
					      "Flask-SocketIO==5.3.4",
 | 
				
			||||||
      "eventlet==0.33.3",
 | 
					      "eventlet==0.33.3",
 | 
				
			||||||
      "requests-oauthlib==1.3.1",
 | 
					      "requests-oauthlib==1.3.1",
 | 
				
			||||||
      "icmplib==3.0.3",
 | 
					      "icmplib==3.0.3",
 | 
				
			||||||
      "ariadne==0.17.1"
 | 
					      "ariadne==0.20.1",
 | 
				
			||||||
 | 
					      "cryptography==41.0.2",
 | 
				
			||||||
 | 
					      "discord>=2.3.2"
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    "DevDependencies": [
 | 
					    "DevDependencies": [
 | 
				
			||||||
      "cpl-cli==2022.12.1.post3",
 | 
					      "cpl-cli==2023.4.0.post3",
 | 
				
			||||||
      "pygount==1.5.1"
 | 
					      "pygount==1.6.1"
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    "PythonVersion": ">=3.10.4",
 | 
					    "PythonVersion": ">=3.10.4",
 | 
				
			||||||
    "PythonPath": {},
 | 
					    "PythonPath": {},
 | 
				
			||||||
@@ -58,9 +60,11 @@
 | 
				
			|||||||
      "../bot_core/bot-core.json",
 | 
					      "../bot_core/bot-core.json",
 | 
				
			||||||
      "../bot_data/bot-data.json",
 | 
					      "../bot_data/bot-data.json",
 | 
				
			||||||
      "../bot_graphql/bot-graphql.json",
 | 
					      "../bot_graphql/bot-graphql.json",
 | 
				
			||||||
 | 
					      "../modules/achievements/achievements.json",
 | 
				
			||||||
      "../modules/auto_role/auto-role.json",
 | 
					      "../modules/auto_role/auto-role.json",
 | 
				
			||||||
      "../modules/base/base.json",
 | 
					      "../modules/base/base.json",
 | 
				
			||||||
      "../modules/boot_log/boot-log.json",
 | 
					      "../modules/boot_log/boot-log.json",
 | 
				
			||||||
 | 
					      "../modules/config/config.json",
 | 
				
			||||||
      "../modules/database/database.json",
 | 
					      "../modules/database/database.json",
 | 
				
			||||||
      "../modules/level/level.json",
 | 
					      "../modules/level/level.json",
 | 
				
			||||||
      "../modules/permission/permission.json",
 | 
					      "../modules/permission/permission.json",
 | 
				
			||||||
 
 | 
				
			|||||||
 Submodule kdb-bot/src/bot/config updated: 0c94637537...23eafb2e21
									
								
							@@ -15,7 +15,7 @@ __title__ = "bot.extension"
 | 
				
			|||||||
__author__ = "Sven Heidemann"
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
__license__ = "MIT"
 | 
					__license__ = "MIT"
 | 
				
			||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
					__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
				
			||||||
__version__ = "1.0.6"
 | 
					__version__ = "1.1.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -23,4 +23,4 @@ from collections import namedtuple
 | 
				
			|||||||
# imports:
 | 
					# imports:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="1", minor="0", micro="6")
 | 
					version_info = VersionInfo(major="1", minor="1", micro="1")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,7 +3,7 @@ from cpl_core.configuration import ConfigurationABC
 | 
				
			|||||||
from cpl_core.dependency_injection import ServiceProviderABC
 | 
					from cpl_core.dependency_injection import ServiceProviderABC
 | 
				
			||||||
from cpl_discord.service import DiscordBotServiceABC
 | 
					from cpl_discord.service import DiscordBotServiceABC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from bot_core.configuration.bot_settings import BotSettings
 | 
					from bot_data.model.technician_config import TechnicianConfig
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class InitBotExtension(ApplicationExtensionABC):
 | 
					class InitBotExtension(ApplicationExtensionABC):
 | 
				
			||||||
@@ -11,6 +11,6 @@ class InitBotExtension(ApplicationExtensionABC):
 | 
				
			|||||||
        ApplicationExtensionABC.__init__(self)
 | 
					        ApplicationExtensionABC.__init__(self)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    async def run(self, config: ConfigurationABC, services: ServiceProviderABC):
 | 
					    async def run(self, config: ConfigurationABC, services: ServiceProviderABC):
 | 
				
			||||||
        settings = config.get_configuration(BotSettings)
 | 
					        settings = config.get_configuration(TechnicianConfig)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        bot: DiscordBotServiceABC = services.get_service(DiscordBotServiceABC, max_messages=settings.cache_max_messages)
 | 
					        bot: DiscordBotServiceABC = services.get_service(DiscordBotServiceABC, max_messages=settings.cache_max_messages)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,6 +15,7 @@ from bot.startup_settings_extension import StartupSettingsExtension
 | 
				
			|||||||
from bot_api.app_api_extension import AppApiExtension
 | 
					from bot_api.app_api_extension import AppApiExtension
 | 
				
			||||||
from bot_core.core_extension.core_extension import CoreExtension
 | 
					from bot_core.core_extension.core_extension import CoreExtension
 | 
				
			||||||
from modules.boot_log.boot_log_extension import BootLogExtension
 | 
					from modules.boot_log.boot_log_extension import BootLogExtension
 | 
				
			||||||
 | 
					from modules.config.config_extension import ConfigExtension
 | 
				
			||||||
from modules.database.database_extension import DatabaseExtension
 | 
					from modules.database.database_extension import DatabaseExtension
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -30,9 +31,10 @@ class Program:
 | 
				
			|||||||
            .use_extension(StartupDiscordExtension)
 | 
					            .use_extension(StartupDiscordExtension)
 | 
				
			||||||
            .use_extension(StartupModuleExtension)
 | 
					            .use_extension(StartupModuleExtension)
 | 
				
			||||||
            .use_extension(StartupMigrationExtension)
 | 
					            .use_extension(StartupMigrationExtension)
 | 
				
			||||||
 | 
					            .use_extension(DatabaseExtension)
 | 
				
			||||||
 | 
					            .use_extension(ConfigExtension)
 | 
				
			||||||
            .use_extension(InitBotExtension)
 | 
					            .use_extension(InitBotExtension)
 | 
				
			||||||
            .use_extension(BootLogExtension)
 | 
					            .use_extension(BootLogExtension)
 | 
				
			||||||
            .use_extension(DatabaseExtension)
 | 
					 | 
				
			||||||
            .use_extension(AppApiExtension)
 | 
					            .use_extension(AppApiExtension)
 | 
				
			||||||
            .use_extension(CoreExtension)
 | 
					            .use_extension(CoreExtension)
 | 
				
			||||||
            .use_startup(Startup)
 | 
					            .use_startup(Startup)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,9 +5,11 @@ from bot_core.core_extension.core_extension_module import CoreExtensionModule
 | 
				
			|||||||
from bot_core.core_module import CoreModule
 | 
					from bot_core.core_module import CoreModule
 | 
				
			||||||
from bot_data.data_module import DataModule
 | 
					from bot_data.data_module import DataModule
 | 
				
			||||||
from bot_graphql.graphql_module import GraphQLModule
 | 
					from bot_graphql.graphql_module import GraphQLModule
 | 
				
			||||||
 | 
					from modules.achievements.achievements_module import AchievementsModule
 | 
				
			||||||
from modules.auto_role.auto_role_module import AutoRoleModule
 | 
					from modules.auto_role.auto_role_module import AutoRoleModule
 | 
				
			||||||
from modules.base.base_module import BaseModule
 | 
					from modules.base.base_module import BaseModule
 | 
				
			||||||
from modules.boot_log.boot_log_module import BootLogModule
 | 
					from modules.boot_log.boot_log_module import BootLogModule
 | 
				
			||||||
 | 
					from modules.config.config_module import ConfigModule
 | 
				
			||||||
from modules.database.database_module import DatabaseModule
 | 
					from modules.database.database_module import DatabaseModule
 | 
				
			||||||
from modules.level.level_module import LevelModule
 | 
					from modules.level.level_module import LevelModule
 | 
				
			||||||
from modules.permission.permission_module import PermissionModule
 | 
					from modules.permission.permission_module import PermissionModule
 | 
				
			||||||
@@ -23,14 +25,16 @@ class ModuleList:
 | 
				
			|||||||
            [
 | 
					            [
 | 
				
			||||||
                CoreModule,  # has to be first!
 | 
					                CoreModule,  # has to be first!
 | 
				
			||||||
                DataModule,
 | 
					                DataModule,
 | 
				
			||||||
 | 
					                ConfigModule,  # has to be before db check
 | 
				
			||||||
 | 
					                DatabaseModule,
 | 
				
			||||||
                GraphQLModule,
 | 
					                GraphQLModule,
 | 
				
			||||||
                PermissionModule,
 | 
					                PermissionModule,
 | 
				
			||||||
                DatabaseModule,
 | 
					 | 
				
			||||||
                AutoRoleModule,
 | 
					                AutoRoleModule,
 | 
				
			||||||
                BaseModule,
 | 
					                BaseModule,
 | 
				
			||||||
                LevelModule,
 | 
					                LevelModule,
 | 
				
			||||||
                ApiModule,
 | 
					                ApiModule,
 | 
				
			||||||
                TechnicianModule,
 | 
					                TechnicianModule,
 | 
				
			||||||
 | 
					                AchievementsModule,
 | 
				
			||||||
                # has to be last!
 | 
					                # has to be last!
 | 
				
			||||||
                BootLogModule,
 | 
					                BootLogModule,
 | 
				
			||||||
                CoreExtensionModule,
 | 
					                CoreExtensionModule,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,10 +4,13 @@ from cpl_core.dependency_injection import ServiceCollectionABC
 | 
				
			|||||||
from cpl_core.environment import ApplicationEnvironmentABC
 | 
					from cpl_core.environment import ApplicationEnvironmentABC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from bot_data.abc.migration_abc import MigrationABC
 | 
					from bot_data.abc.migration_abc import MigrationABC
 | 
				
			||||||
 | 
					from bot_data.migration.achievements_migration import AchievementsMigration
 | 
				
			||||||
from bot_data.migration.api_key_migration import ApiKeyMigration
 | 
					from bot_data.migration.api_key_migration import ApiKeyMigration
 | 
				
			||||||
from bot_data.migration.api_migration import ApiMigration
 | 
					from bot_data.migration.api_migration import ApiMigration
 | 
				
			||||||
from bot_data.migration.auto_role_fix1_migration import AutoRoleFix1Migration
 | 
					from bot_data.migration.auto_role_fix1_migration import AutoRoleFix1Migration
 | 
				
			||||||
from bot_data.migration.auto_role_migration import AutoRoleMigration
 | 
					from bot_data.migration.auto_role_migration import AutoRoleMigration
 | 
				
			||||||
 | 
					from bot_data.migration.config_feature_flags_migration import ConfigFeatureFlagsMigration
 | 
				
			||||||
 | 
					from bot_data.migration.config_migration import ConfigMigration
 | 
				
			||||||
from bot_data.migration.db_history_migration import DBHistoryMigration
 | 
					from bot_data.migration.db_history_migration import DBHistoryMigration
 | 
				
			||||||
from bot_data.migration.initial_migration import InitialMigration
 | 
					from bot_data.migration.initial_migration import InitialMigration
 | 
				
			||||||
from bot_data.migration.level_migration import LevelMigration
 | 
					from bot_data.migration.level_migration import LevelMigration
 | 
				
			||||||
@@ -42,3 +45,6 @@ class StartupMigrationExtension(StartupExtensionABC):
 | 
				
			|||||||
        services.add_transient(MigrationABC, RemoveStatsMigration)  # 19.02.2023 #190 - 1.0.0
 | 
					        services.add_transient(MigrationABC, RemoveStatsMigration)  # 19.02.2023 #190 - 1.0.0
 | 
				
			||||||
        services.add_transient(MigrationABC, UserWarningMigration)  # 21.02.2023 #35 - 1.0.0
 | 
					        services.add_transient(MigrationABC, UserWarningMigration)  # 21.02.2023 #35 - 1.0.0
 | 
				
			||||||
        services.add_transient(MigrationABC, DBHistoryMigration)  # 06.03.2023 #246 - 1.0.0
 | 
					        services.add_transient(MigrationABC, DBHistoryMigration)  # 06.03.2023 #246 - 1.0.0
 | 
				
			||||||
 | 
					        services.add_transient(MigrationABC, AchievementsMigration)  # 14.06.2023 #268 - 1.1.0
 | 
				
			||||||
 | 
					        services.add_transient(MigrationABC, ConfigMigration)  # 19.07.2023 #127 - 1.1.0
 | 
				
			||||||
 | 
					        services.add_transient(MigrationABC, ConfigFeatureFlagsMigration)  # 15.08.2023 #334 - 1.1.0
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
import os
 | 
					import os
 | 
				
			||||||
from datetime import datetime
 | 
					from datetime import datetime
 | 
				
			||||||
from typing import Callable, Type, Optional
 | 
					from typing import Optional, Type, Callable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from cpl_core.application import StartupExtensionABC
 | 
					from cpl_core.application import StartupExtensionABC
 | 
				
			||||||
from cpl_core.configuration import ConfigurationABC
 | 
					from cpl_core.configuration import ConfigurationABC
 | 
				
			||||||
@@ -8,11 +8,6 @@ from cpl_core.dependency_injection import ServiceCollectionABC
 | 
				
			|||||||
from cpl_core.environment import ApplicationEnvironmentABC
 | 
					from cpl_core.environment import ApplicationEnvironmentABC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from bot_core.configuration.bot_logging_settings import BotLoggingSettings
 | 
					from bot_core.configuration.bot_logging_settings import BotLoggingSettings
 | 
				
			||||||
from bot_core.configuration.bot_settings import BotSettings
 | 
					 | 
				
			||||||
from modules.base.configuration.base_settings import BaseSettings
 | 
					 | 
				
			||||||
from modules.boot_log.configuration.boot_log_settings import BootLogSettings
 | 
					 | 
				
			||||||
from modules.level.configuration.level_settings import LevelSettings
 | 
					 | 
				
			||||||
from modules.permission.configuration.permission_settings import PermissionSettings
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class StartupSettingsExtension(StartupExtensionABC):
 | 
					class StartupSettingsExtension(StartupExtensionABC):
 | 
				
			||||||
@@ -34,13 +29,6 @@ class StartupSettingsExtension(StartupExtensionABC):
 | 
				
			|||||||
        configuration.add_json_file(f"config/feature-flags.{environment.host_name}.json", optional=True)
 | 
					        configuration.add_json_file(f"config/feature-flags.{environment.host_name}.json", optional=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        configuration.add_configuration("Startup_StartTime", str(self._start_time))
 | 
					        configuration.add_configuration("Startup_StartTime", str(self._start_time))
 | 
				
			||||||
        self._configure_settings_with_sub_settings(configuration, BotSettings, lambda x: x.servers, lambda x: x.id)
 | 
					 | 
				
			||||||
        self._configure_settings_with_sub_settings(configuration, BaseSettings, lambda x: x.servers, lambda x: x.id)
 | 
					 | 
				
			||||||
        self._configure_settings_with_sub_settings(configuration, BootLogSettings, lambda x: x.servers, lambda x: x.id)
 | 
					 | 
				
			||||||
        self._configure_settings_with_sub_settings(configuration, LevelSettings, lambda x: x.servers, lambda x: x.id)
 | 
					 | 
				
			||||||
        self._configure_settings_with_sub_settings(
 | 
					 | 
				
			||||||
            configuration, PermissionSettings, lambda x: x.servers, lambda x: x.id
 | 
					 | 
				
			||||||
        )
 | 
					 | 
				
			||||||
        self._configure_settings_with_sub_settings(
 | 
					        self._configure_settings_with_sub_settings(
 | 
				
			||||||
            configuration, BotLoggingSettings, lambda x: x.files, lambda x: x.key
 | 
					            configuration, BotLoggingSettings, lambda x: x.files, lambda x: x.key
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
@@ -50,9 +38,9 @@ class StartupSettingsExtension(StartupExtensionABC):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    @staticmethod
 | 
					    @staticmethod
 | 
				
			||||||
    def _configure_settings_with_sub_settings(
 | 
					    def _configure_settings_with_sub_settings(
 | 
				
			||||||
        config: ConfigurationABC, settings: Type, list_atr: Callable, atr: Callable
 | 
					        config: ConfigurationABC, settings_type: Type, list_atr: Callable, atr: Callable
 | 
				
			||||||
    ):
 | 
					    ):
 | 
				
			||||||
        settings: Optional[settings] = config.get_configuration(settings)
 | 
					        settings: Optional[settings_type] = config.get_configuration(settings_type)
 | 
				
			||||||
        if settings is None:
 | 
					        if settings is None:
 | 
				
			||||||
            return
 | 
					            return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -93,6 +93,12 @@
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "modules": {
 | 
					  "modules": {
 | 
				
			||||||
 | 
					    "achievements": {
 | 
				
			||||||
 | 
					      "got_new_achievement": "{} hat die Errungenschaft {} freigeschaltet :D",
 | 
				
			||||||
 | 
					      "commands": {
 | 
				
			||||||
 | 
					        "check": "Alles klar, ich schaue eben nach... nom nom"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "auto_role": {
 | 
					    "auto_role": {
 | 
				
			||||||
      "add": {
 | 
					      "add": {
 | 
				
			||||||
        "error": {
 | 
					        "error": {
 | 
				
			||||||
@@ -145,6 +151,19 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "base": {
 | 
					    "base": {
 | 
				
			||||||
 | 
					      "member_left_message": "{} hat uns leider verlassen :(",
 | 
				
			||||||
 | 
					      "complaints": {
 | 
				
			||||||
 | 
					        "title": "Beschwerde einreichen",
 | 
				
			||||||
 | 
					        "label": "Beschwerde",
 | 
				
			||||||
 | 
					        "message": "{} hat eine Beschwerde eingereicht:\n{}",
 | 
				
			||||||
 | 
					        "response": "Danke für deine Beschwerde"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "bug": {
 | 
				
			||||||
 | 
					        "title": "Bug melden",
 | 
				
			||||||
 | 
					        "label": "Bug",
 | 
				
			||||||
 | 
					        "message": "{} meldet einen Bug:\n{}",
 | 
				
			||||||
 | 
					        "response": "Danke für dein Feedback :D"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
      "afk_command_channel_missing_message": "Zu unfähig einem Sprachkanal beizutreten?",
 | 
					      "afk_command_channel_missing_message": "Zu unfähig einem Sprachkanal beizutreten?",
 | 
				
			||||||
      "afk_command_move_message": "Ich verschiebe dich ja schon... (◔_◔)",
 | 
					      "afk_command_move_message": "Ich verschiebe dich ja schon... (◔_◔)",
 | 
				
			||||||
      "game_server": {
 | 
					      "game_server": {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@ __title__ = "bot_api"
 | 
				
			|||||||
__author__ = "Sven Heidemann"
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
__license__ = "MIT"
 | 
					__license__ = "MIT"
 | 
				
			||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
					__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
				
			||||||
__version__ = "1.0.6"
 | 
					__version__ = "1.1.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -23,4 +23,4 @@ from collections import namedtuple
 | 
				
			|||||||
# imports:
 | 
					# imports:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="1", minor="0", micro="6")
 | 
					version_info = VersionInfo(major="1", minor="1", micro="1")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@ __title__ = "bot_api.abc"
 | 
				
			|||||||
__author__ = "Sven Heidemann"
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
__license__ = "MIT"
 | 
					__license__ = "MIT"
 | 
				
			||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
					__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
				
			||||||
__version__ = "1.0.6"
 | 
					__version__ = "1.1.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -23,4 +23,4 @@ from collections import namedtuple
 | 
				
			|||||||
# imports:
 | 
					# imports:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="1", minor="0", micro="6")
 | 
					version_info = VersionInfo(major="1", minor="1", micro="1")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,8 +3,8 @@
 | 
				
			|||||||
    "Name": "bot-api",
 | 
					    "Name": "bot-api",
 | 
				
			||||||
    "Version": {
 | 
					    "Version": {
 | 
				
			||||||
      "Major": "1",
 | 
					      "Major": "1",
 | 
				
			||||||
      "Minor": "0",
 | 
					      "Minor": "1",
 | 
				
			||||||
      "Micro": "6"
 | 
					      "Micro": "1"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "Author": "",
 | 
					    "Author": "",
 | 
				
			||||||
    "AuthorEmail": "",
 | 
					    "AuthorEmail": "",
 | 
				
			||||||
 
 | 
				
			|||||||
 Submodule kdb-bot/src/bot_api/config updated: c712f856eb...3d81c81c9e
									
								
							@@ -15,7 +15,7 @@ __title__ = "bot_api.configuration"
 | 
				
			|||||||
__author__ = "Sven Heidemann"
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
__license__ = "MIT"
 | 
					__license__ = "MIT"
 | 
				
			||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
					__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
				
			||||||
__version__ = "1.0.6"
 | 
					__version__ = "1.1.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -23,4 +23,4 @@ from collections import namedtuple
 | 
				
			|||||||
# imports
 | 
					# imports
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="1", minor="0", micro="6")
 | 
					version_info = VersionInfo(major="1", minor="1", micro="1")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,16 +1,13 @@
 | 
				
			|||||||
import traceback
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC
 | 
					from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC
 | 
				
			||||||
from cpl_core.console import Console
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ApiSettings(ConfigurationModelABC):
 | 
					class ApiSettings(ConfigurationModelABC):
 | 
				
			||||||
    def __init__(self):
 | 
					    def __init__(self, port: int = None, host: str = None, redirect_uri: bool = None):
 | 
				
			||||||
        ConfigurationModelABC.__init__(self)
 | 
					        ConfigurationModelABC.__init__(self)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self._port = 80
 | 
					        self._port = 80 if port is None else port
 | 
				
			||||||
        self._host = ""
 | 
					        self._host = "" if host is None else host
 | 
				
			||||||
        self._redirect_to_https = False
 | 
					        self._redirect_to_https = False if redirect_uri is None else redirect_uri
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def port(self) -> int:
 | 
					    def port(self) -> int:
 | 
				
			||||||
@@ -23,12 +20,3 @@ class ApiSettings(ConfigurationModelABC):
 | 
				
			|||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def redirect_to_https(self) -> bool:
 | 
					    def redirect_to_https(self) -> bool:
 | 
				
			||||||
        return self._redirect_to_https
 | 
					        return self._redirect_to_https
 | 
				
			||||||
 | 
					 | 
				
			||||||
    def from_dict(self, settings: dict):
 | 
					 | 
				
			||||||
        try:
 | 
					 | 
				
			||||||
            self._port = int(settings["Port"])
 | 
					 | 
				
			||||||
            self._host = settings["Host"]
 | 
					 | 
				
			||||||
            self._redirect_to_https = bool(settings["RedirectToHTTPS"])
 | 
					 | 
				
			||||||
        except Exception as e:
 | 
					 | 
				
			||||||
            Console.error(f"[ ERROR ] [ {__name__} ]: Reading error in {type(self).__name__} settings")
 | 
					 | 
				
			||||||
            Console.error(f"[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}")
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,19 +1,22 @@
 | 
				
			|||||||
import traceback
 | 
					 | 
				
			||||||
from datetime import datetime
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC
 | 
					from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC
 | 
				
			||||||
from cpl_core.console import Console
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class AuthenticationSettings(ConfigurationModelABC):
 | 
					class AuthenticationSettings(ConfigurationModelABC):
 | 
				
			||||||
    def __init__(self):
 | 
					    def __init__(
 | 
				
			||||||
 | 
					        self,
 | 
				
			||||||
 | 
					        secret_key: str = None,
 | 
				
			||||||
 | 
					        issuer: str = None,
 | 
				
			||||||
 | 
					        audience: str = None,
 | 
				
			||||||
 | 
					        token_expire_time: int = None,
 | 
				
			||||||
 | 
					        refresh_token_expire_time: int = None,
 | 
				
			||||||
 | 
					    ):
 | 
				
			||||||
        ConfigurationModelABC.__init__(self)
 | 
					        ConfigurationModelABC.__init__(self)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self._secret_key = ""
 | 
					        self._secret_key = "" if secret_key is None else secret_key
 | 
				
			||||||
        self._issuer = ""
 | 
					        self._issuer = "" if issuer is None else issuer
 | 
				
			||||||
        self._audience = ""
 | 
					        self._audience = "" if audience is None else audience
 | 
				
			||||||
        self._token_expire_time = 0
 | 
					        self._token_expire_time = 0 if token_expire_time is None else token_expire_time
 | 
				
			||||||
        self._refresh_token_expire_time = 0
 | 
					        self._refresh_token_expire_time = 0 if refresh_token_expire_time is None else refresh_token_expire_time
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def secret_key(self) -> str:
 | 
					    def secret_key(self) -> str:
 | 
				
			||||||
@@ -34,14 +37,3 @@ class AuthenticationSettings(ConfigurationModelABC):
 | 
				
			|||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def refresh_token_expire_time(self) -> int:
 | 
					    def refresh_token_expire_time(self) -> int:
 | 
				
			||||||
        return self._refresh_token_expire_time
 | 
					        return self._refresh_token_expire_time
 | 
				
			||||||
 | 
					 | 
				
			||||||
    def from_dict(self, settings: dict):
 | 
					 | 
				
			||||||
        try:
 | 
					 | 
				
			||||||
            self._secret_key = settings["SecretKey"]
 | 
					 | 
				
			||||||
            self._issuer = settings["Issuer"]
 | 
					 | 
				
			||||||
            self._audience = settings["Audience"]
 | 
					 | 
				
			||||||
            self._token_expire_time = int(settings["TokenExpireTime"])
 | 
					 | 
				
			||||||
            self._refresh_token_expire_time = int(settings["RefreshTokenExpireTime"])
 | 
					 | 
				
			||||||
        except Exception as e:
 | 
					 | 
				
			||||||
            Console.error(f"[ ERROR ] [ {__name__} ]: Reading error in {type(self).__name__} settings")
 | 
					 | 
				
			||||||
            Console.error(f"[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}")
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,19 +1,23 @@
 | 
				
			|||||||
import traceback
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC
 | 
					from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC
 | 
				
			||||||
from cpl_core.console import Console
 | 
					 | 
				
			||||||
from cpl_query.extension import List
 | 
					from cpl_query.extension import List
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class DiscordAuthenticationSettings(ConfigurationModelABC):
 | 
					class DiscordAuthenticationSettings(ConfigurationModelABC):
 | 
				
			||||||
    def __init__(self):
 | 
					    def __init__(
 | 
				
			||||||
 | 
					        self,
 | 
				
			||||||
 | 
					        client_secret: str = None,
 | 
				
			||||||
 | 
					        redirect_uri: str = None,
 | 
				
			||||||
 | 
					        scope: list = None,
 | 
				
			||||||
 | 
					        token_url: str = None,
 | 
				
			||||||
 | 
					        auth_url: str = None,
 | 
				
			||||||
 | 
					    ):
 | 
				
			||||||
        ConfigurationModelABC.__init__(self)
 | 
					        ConfigurationModelABC.__init__(self)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self._client_secret = ""
 | 
					        self._client_secret = "" if client_secret is None else client_secret
 | 
				
			||||||
        self._redirect_url = ""
 | 
					        self._redirect_url = "" if redirect_uri is None else redirect_uri
 | 
				
			||||||
        self._scope = List()
 | 
					        self._scope = List() if scope is None else List(str, scope)
 | 
				
			||||||
        self._token_url = ""
 | 
					        self._token_url = "" if token_url is None else token_url
 | 
				
			||||||
        self._auth_url = ""
 | 
					        self._auth_url = "" if auth_url is None else auth_url
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def client_secret(self) -> str:
 | 
					    def client_secret(self) -> str:
 | 
				
			||||||
@@ -34,14 +38,3 @@ class DiscordAuthenticationSettings(ConfigurationModelABC):
 | 
				
			|||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def auth_url(self) -> str:
 | 
					    def auth_url(self) -> str:
 | 
				
			||||||
        return self._auth_url
 | 
					        return self._auth_url
 | 
				
			||||||
 | 
					 | 
				
			||||||
    def from_dict(self, settings: dict):
 | 
					 | 
				
			||||||
        try:
 | 
					 | 
				
			||||||
            self._client_secret = settings["ClientSecret"]
 | 
					 | 
				
			||||||
            self._redirect_url = settings["RedirectURL"]
 | 
					 | 
				
			||||||
            self._scope = List(str, settings["Scope"])
 | 
					 | 
				
			||||||
            self._token_url = settings["TokenURL"]
 | 
					 | 
				
			||||||
            self._auth_url = settings["AuthURL"]
 | 
					 | 
				
			||||||
        except Exception as e:
 | 
					 | 
				
			||||||
            Console.error(f"[ ERROR ] [ {__name__} ]: Reading error in {type(self).__name__} settings")
 | 
					 | 
				
			||||||
            Console.error(f"[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}")
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,22 +1,12 @@
 | 
				
			|||||||
import traceback
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC
 | 
					from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC
 | 
				
			||||||
from cpl_core.console import Console
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class FrontendSettings(ConfigurationModelABC):
 | 
					class FrontendSettings(ConfigurationModelABC):
 | 
				
			||||||
    def __init__(self):
 | 
					    def __init__(self, url: str = None):
 | 
				
			||||||
        ConfigurationModelABC.__init__(self)
 | 
					        ConfigurationModelABC.__init__(self)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self._url = ""
 | 
					        self._url = "" if url is None else url
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def url(self) -> str:
 | 
					    def url(self) -> str:
 | 
				
			||||||
        return self._url
 | 
					        return self._url
 | 
				
			||||||
 | 
					 | 
				
			||||||
    def from_dict(self, settings: dict):
 | 
					 | 
				
			||||||
        try:
 | 
					 | 
				
			||||||
            self._url = settings["URL"]
 | 
					 | 
				
			||||||
        except Exception as e:
 | 
					 | 
				
			||||||
            Console.error(f"[ ERROR ] [ {__name__} ]: Reading error in {type(self).__name__} settings")
 | 
					 | 
				
			||||||
            Console.error(f"[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}")
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,49 +0,0 @@
 | 
				
			|||||||
from typing import Optional
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC
 | 
					 | 
				
			||||||
from cpl_cli.configuration.version_settings_name_enum import VersionSettingsNameEnum
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class VersionSettings(ConfigurationModelABC):
 | 
					 | 
				
			||||||
    def __init__(self, major: str = None, minor: str = None, micro: str = None):
 | 
					 | 
				
			||||||
        ConfigurationModelABC.__init__(self)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        self._major: Optional[str] = major
 | 
					 | 
				
			||||||
        self._minor: Optional[str] = minor
 | 
					 | 
				
			||||||
        self._micro: Optional[str] = micro
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @property
 | 
					 | 
				
			||||||
    def major(self) -> str:
 | 
					 | 
				
			||||||
        return self._major
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @property
 | 
					 | 
				
			||||||
    def minor(self) -> str:
 | 
					 | 
				
			||||||
        return self._minor
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @property
 | 
					 | 
				
			||||||
    def micro(self) -> str:
 | 
					 | 
				
			||||||
        return self._micro
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def to_str(self) -> str:
 | 
					 | 
				
			||||||
        if self._micro is None:
 | 
					 | 
				
			||||||
            return f"{self._major}.{self._minor}"
 | 
					 | 
				
			||||||
        else:
 | 
					 | 
				
			||||||
            return f"{self._major}.{self._minor}.{self._micro}"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def from_dict(self, settings: dict):
 | 
					 | 
				
			||||||
        self._major = settings[VersionSettingsNameEnum.major.value]
 | 
					 | 
				
			||||||
        self._minor = settings[VersionSettingsNameEnum.minor.value]
 | 
					 | 
				
			||||||
        micro = settings[VersionSettingsNameEnum.micro.value]
 | 
					 | 
				
			||||||
        if micro != "":
 | 
					 | 
				
			||||||
            self._micro = micro
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def to_dict(self) -> dict:
 | 
					 | 
				
			||||||
        version = {
 | 
					 | 
				
			||||||
            VersionSettingsNameEnum.major.value: self._major,
 | 
					 | 
				
			||||||
            VersionSettingsNameEnum.minor.value: self._minor,
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if self._micro is not None:
 | 
					 | 
				
			||||||
            version[VersionSettingsNameEnum.micro.value] = self._micro
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        return version
 | 
					 | 
				
			||||||
@@ -15,7 +15,7 @@ __title__ = "bot_api.controller"
 | 
				
			|||||||
__author__ = "Sven Heidemann"
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
__license__ = "MIT"
 | 
					__license__ = "MIT"
 | 
				
			||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
					__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
				
			||||||
__version__ = "1.0.6"
 | 
					__version__ = "1.1.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -23,4 +23,4 @@ from collections import namedtuple
 | 
				
			|||||||
# imports:
 | 
					# imports:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="1", minor="0", micro="6")
 | 
					version_info = VersionInfo(major="1", minor="1", micro="1")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
from ariadne import graphql_sync
 | 
					from ariadne import graphql_sync
 | 
				
			||||||
from ariadne.constants import PLAYGROUND_HTML
 | 
					from ariadne.explorer import ExplorerPlayground
 | 
				
			||||||
from cpl_core.configuration import ConfigurationABC
 | 
					from cpl_core.configuration import ConfigurationABC
 | 
				
			||||||
from cpl_core.environment import ApplicationEnvironmentABC
 | 
					from cpl_core.environment import ApplicationEnvironmentABC
 | 
				
			||||||
from flask import request, jsonify
 | 
					from flask import request, jsonify
 | 
				
			||||||
@@ -30,7 +30,7 @@ class GraphQLController:
 | 
				
			|||||||
        if self._env.environment_name != "development":
 | 
					        if self._env.environment_name != "development":
 | 
				
			||||||
            return "", 403
 | 
					            return "", 403
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return PLAYGROUND_HTML, 200
 | 
					        return ExplorerPlayground().html(None), 200
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Route.post(f"{BasePath}")
 | 
					    @Route.post(f"{BasePath}")
 | 
				
			||||||
    @Route.authorize(by_api_key=True)
 | 
					    @Route.authorize(by_api_key=True)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@ __title__ = "bot_api.event"
 | 
				
			|||||||
__author__ = "Sven Heidemann"
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
__license__ = "MIT"
 | 
					__license__ = "MIT"
 | 
				
			||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
					__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
				
			||||||
__version__ = "1.0.6"
 | 
					__version__ = "1.1.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -23,4 +23,4 @@ from collections import namedtuple
 | 
				
			|||||||
# imports:
 | 
					# imports:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="1", minor="0", micro="6")
 | 
					version_info = VersionInfo(major="1", minor="1", micro="1")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@ __title__ = "bot_api.exception"
 | 
				
			|||||||
__author__ = "Sven Heidemann"
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
__license__ = "MIT"
 | 
					__license__ = "MIT"
 | 
				
			||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
					__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
				
			||||||
__version__ = "1.0.6"
 | 
					__version__ = "1.1.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -23,4 +23,4 @@ from collections import namedtuple
 | 
				
			|||||||
# imports:
 | 
					# imports:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="1", minor="0", micro="6")
 | 
					version_info = VersionInfo(major="1", minor="1", micro="1")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@ __title__ = "bot_api.filter"
 | 
				
			|||||||
__author__ = "Sven Heidemann"
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
__license__ = "MIT"
 | 
					__license__ = "MIT"
 | 
				
			||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
					__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
				
			||||||
__version__ = "1.0.6"
 | 
					__version__ = "1.1.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -23,4 +23,4 @@ from collections import namedtuple
 | 
				
			|||||||
# imports:
 | 
					# imports:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="1", minor="0", micro="6")
 | 
					version_info = VersionInfo(major="1", minor="1", micro="1")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@ __title__ = "bot_api.filter.discord"
 | 
				
			|||||||
__author__ = "Sven Heidemann"
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
__license__ = "MIT"
 | 
					__license__ = "MIT"
 | 
				
			||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
					__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
				
			||||||
__version__ = "1.0.6"
 | 
					__version__ = "1.1.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -23,4 +23,4 @@ from collections import namedtuple
 | 
				
			|||||||
# imports:
 | 
					# imports:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="1", minor="0", micro="6")
 | 
					version_info = VersionInfo(major="1", minor="1", micro="1")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@ __title__ = "bot_api.logging"
 | 
				
			|||||||
__author__ = "Sven Heidemann"
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
__license__ = "MIT"
 | 
					__license__ = "MIT"
 | 
				
			||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
					__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
				
			||||||
__version__ = "1.0.6"
 | 
					__version__ = "1.1.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -23,4 +23,4 @@ from collections import namedtuple
 | 
				
			|||||||
# imports:
 | 
					# imports:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="1", minor="0", micro="6")
 | 
					version_info = VersionInfo(major="1", minor="1", micro="1")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@ __title__ = "bot_api.model"
 | 
				
			|||||||
__author__ = "Sven Heidemann"
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
__license__ = "MIT"
 | 
					__license__ = "MIT"
 | 
				
			||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
					__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
				
			||||||
__version__ = "1.0.6"
 | 
					__version__ = "1.1.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -23,4 +23,4 @@ from collections import namedtuple
 | 
				
			|||||||
# imports:
 | 
					# imports:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="1", minor="0", micro="6")
 | 
					version_info = VersionInfo(major="1", minor="1", micro="1")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@ __title__ = "bot_api.model.discord"
 | 
				
			|||||||
__author__ = "Sven Heidemann"
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
__license__ = "MIT"
 | 
					__license__ = "MIT"
 | 
				
			||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
					__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
				
			||||||
__version__ = "1.0.6"
 | 
					__version__ = "1.1.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -23,4 +23,4 @@ from collections import namedtuple
 | 
				
			|||||||
# imports:
 | 
					# imports:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="1", minor="0", micro="6")
 | 
					version_info = VersionInfo(major="1", minor="1", micro="1")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@ __title__ = "bot_api.route"
 | 
				
			|||||||
__author__ = "Sven Heidemann"
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
__license__ = "MIT"
 | 
					__license__ = "MIT"
 | 
				
			||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
					__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
				
			||||||
__version__ = "1.0.6"
 | 
					__version__ = "1.1.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -23,4 +23,4 @@ from collections import namedtuple
 | 
				
			|||||||
# imports:
 | 
					# imports:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="1", minor="0", micro="6")
 | 
					version_info = VersionInfo(major="1", minor="1", micro="1")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@ __title__ = "bot_api.service"
 | 
				
			|||||||
__author__ = "Sven Heidemann"
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
__license__ = "MIT"
 | 
					__license__ = "MIT"
 | 
				
			||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
					__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
				
			||||||
__version__ = "1.0.6"
 | 
					__version__ = "1.1.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -23,4 +23,4 @@ from collections import namedtuple
 | 
				
			|||||||
# imports
 | 
					# imports
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="1", minor="0", micro="6")
 | 
					version_info = VersionInfo(major="1", minor="1", micro="1")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@ __title__ = "bot_api.transformer"
 | 
				
			|||||||
__author__ = "Sven Heidemann"
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
__license__ = "MIT"
 | 
					__license__ = "MIT"
 | 
				
			||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
					__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
				
			||||||
__version__ = "1.0.6"
 | 
					__version__ = "1.1.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -23,4 +23,4 @@ from collections import namedtuple
 | 
				
			|||||||
# imports:
 | 
					# imports:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="1", minor="0", micro="6")
 | 
					version_info = VersionInfo(major="1", minor="1", micro="1")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@ __title__ = "bot_core"
 | 
				
			|||||||
__author__ = "Sven Heidemann"
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
__license__ = "MIT"
 | 
					__license__ = "MIT"
 | 
				
			||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
					__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
				
			||||||
__version__ = "1.0.6"
 | 
					__version__ = "1.1.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -23,4 +23,4 @@ from collections import namedtuple
 | 
				
			|||||||
# imports
 | 
					# imports
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="1", minor="0", micro="6")
 | 
					version_info = VersionInfo(major="1", minor="1", micro="1")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@ __title__ = "bot_core.abc"
 | 
				
			|||||||
__author__ = "Sven Heidemann"
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
__license__ = "MIT"
 | 
					__license__ = "MIT"
 | 
				
			||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
					__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
				
			||||||
__version__ = "1.0.6"
 | 
					__version__ = "1.1.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -23,4 +23,4 @@ from collections import namedtuple
 | 
				
			|||||||
# imports:
 | 
					# imports:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="1", minor="0", micro="6")
 | 
					version_info = VersionInfo(major="1", minor="1", micro="1")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,8 +7,8 @@ from cpl_query.extension import List
 | 
				
			|||||||
from discord.ext.commands import Context
 | 
					from discord.ext.commands import Context
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from bot_data.model.auto_role_rule import AutoRoleRule
 | 
					from bot_data.model.auto_role_rule import AutoRoleRule
 | 
				
			||||||
 | 
					from bot_data.model.server_config import ServerConfig
 | 
				
			||||||
from bot_data.model.user import User
 | 
					from bot_data.model.user import User
 | 
				
			||||||
from modules.base.configuration.base_server_settings import BaseServerSettings
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ClientUtilsABC(ABC):
 | 
					class ClientUtilsABC(ABC):
 | 
				
			||||||
@@ -53,7 +53,7 @@ class ClientUtilsABC(ABC):
 | 
				
			|||||||
        self,
 | 
					        self,
 | 
				
			||||||
        created_at: datetime,
 | 
					        created_at: datetime,
 | 
				
			||||||
        user: User,
 | 
					        user: User,
 | 
				
			||||||
        settings: BaseServerSettings,
 | 
					        settings: ServerConfig,
 | 
				
			||||||
        is_reaction: bool = False,
 | 
					        is_reaction: bool = False,
 | 
				
			||||||
    ) -> bool:
 | 
					    ) -> bool:
 | 
				
			||||||
        pass
 | 
					        pass
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,8 +3,8 @@
 | 
				
			|||||||
    "Name": "bot-core",
 | 
					    "Name": "bot-core",
 | 
				
			||||||
    "Version": {
 | 
					    "Version": {
 | 
				
			||||||
      "Major": "1",
 | 
					      "Major": "1",
 | 
				
			||||||
      "Minor": "0",
 | 
					      "Minor": "1",
 | 
				
			||||||
      "Micro": "6"
 | 
					      "Micro": "1"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "Author": "Sven Heidemann",
 | 
					    "Author": "Sven Heidemann",
 | 
				
			||||||
    "AuthorEmail": "sven.heidemann@sh-edraft.de",
 | 
					    "AuthorEmail": "sven.heidemann@sh-edraft.de",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@ __title__ = "bot_core.configuration"
 | 
				
			|||||||
__author__ = "Sven Heidemann"
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
__license__ = "MIT"
 | 
					__license__ = "MIT"
 | 
				
			||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
					__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
				
			||||||
__version__ = "1.0.6"
 | 
					__version__ = "1.1.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -23,4 +23,4 @@ from collections import namedtuple
 | 
				
			|||||||
# imports:
 | 
					# imports:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="1", minor="0", micro="6")
 | 
					version_info = VersionInfo(major="1", minor="1", micro="1")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,32 +1,25 @@
 | 
				
			|||||||
import traceback
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC
 | 
					from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC
 | 
				
			||||||
from cpl_core.console import Console, ForegroundColorEnum
 | 
					from cpl_core.utils.json_processor import JSONProcessor
 | 
				
			||||||
from cpl_query.extension import List
 | 
					from cpl_query.extension import List
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from bot_core.configuration.file_logging_settings import FileLoggingSettings
 | 
					from bot_core.configuration.file_logging_settings import FileLoggingSettings
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class BotLoggingSettings(ConfigurationModelABC):
 | 
					class BotLoggingSettings(ConfigurationModelABC):
 | 
				
			||||||
    def __init__(self):
 | 
					    def __init__(self, **kwargs: dict):
 | 
				
			||||||
        ConfigurationModelABC.__init__(self)
 | 
					        ConfigurationModelABC.__init__(self)
 | 
				
			||||||
        self._files: List[FileLoggingSettings] = List(FileLoggingSettings)
 | 
					        self._files: List[FileLoggingSettings] = List(FileLoggingSettings)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if kwargs is not None:
 | 
				
			||||||
 | 
					            self._files_from_dict(kwargs)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def files(self) -> List[FileLoggingSettings]:
 | 
					    def files(self) -> List[FileLoggingSettings]:
 | 
				
			||||||
        return self._files
 | 
					        return self._files
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def from_dict(self, settings: dict):
 | 
					    def _files_from_dict(self, settings: dict):
 | 
				
			||||||
        try:
 | 
					        files = List(FileLoggingSettings)
 | 
				
			||||||
            files = List(FileLoggingSettings)
 | 
					        for s in settings:
 | 
				
			||||||
            for s in settings:
 | 
					            settings[s]["Key"] = s
 | 
				
			||||||
                st = FileLoggingSettings()
 | 
					            files.append(JSONProcessor.process(FileLoggingSettings, settings[s]))
 | 
				
			||||||
                settings[s]["Key"] = s
 | 
					        self._files = files
 | 
				
			||||||
                st.from_dict(settings[s])
 | 
					 | 
				
			||||||
                files.append(st)
 | 
					 | 
				
			||||||
            self._files = files
 | 
					 | 
				
			||||||
        except Exception as e:
 | 
					 | 
				
			||||||
            Console.set_foreground_color(ForegroundColorEnum.red)
 | 
					 | 
				
			||||||
            Console.write_line(f"[ ERROR ] [ {__name__} ]: Reading error in {type(self).__name__} settings")
 | 
					 | 
				
			||||||
            Console.write_line(f"[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}")
 | 
					 | 
				
			||||||
            Console.set_foreground_color(ForegroundColorEnum.default)
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,62 +0,0 @@
 | 
				
			|||||||
import traceback
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
from cpl_core.configuration import ConfigurationModelABC
 | 
					 | 
				
			||||||
from cpl_core.console import Console
 | 
					 | 
				
			||||||
from cpl_query.extension import List
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
from bot_core.configuration.server_settings import ServerSettings
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class BotSettings(ConfigurationModelABC):
 | 
					 | 
				
			||||||
    def __init__(self):
 | 
					 | 
				
			||||||
        ConfigurationModelABC.__init__(self)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        self._servers: List[ServerSettings] = List(ServerSettings)
 | 
					 | 
				
			||||||
        self._technicians: List[int] = List(int)
 | 
					 | 
				
			||||||
        self._wait_for_restart = 2
 | 
					 | 
				
			||||||
        self._wait_for_shutdown = 2
 | 
					 | 
				
			||||||
        self._cache_max_messages = 1000
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @property
 | 
					 | 
				
			||||||
    def servers(self) -> List[ServerSettings]:
 | 
					 | 
				
			||||||
        return self._servers
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @property
 | 
					 | 
				
			||||||
    def technicians(self) -> List[int]:
 | 
					 | 
				
			||||||
        return self._technicians
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @property
 | 
					 | 
				
			||||||
    def wait_for_restart(self) -> int:
 | 
					 | 
				
			||||||
        return self._wait_for_restart
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @property
 | 
					 | 
				
			||||||
    def wait_for_shutdown(self) -> int:
 | 
					 | 
				
			||||||
        return self._wait_for_shutdown
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @property
 | 
					 | 
				
			||||||
    def cache_max_messages(self) -> int:
 | 
					 | 
				
			||||||
        return self._cache_max_messages
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def from_dict(self, settings: dict):
 | 
					 | 
				
			||||||
        try:
 | 
					 | 
				
			||||||
            self._technicians = settings["Technicians"]
 | 
					 | 
				
			||||||
            self._wait_for_restart = settings["WaitForRestart"]
 | 
					 | 
				
			||||||
            self._wait_for_shutdown = settings["WaitForShutdown"]
 | 
					 | 
				
			||||||
            settings.pop("Technicians")
 | 
					 | 
				
			||||||
            settings.pop("WaitForRestart")
 | 
					 | 
				
			||||||
            settings.pop("WaitForShutdown")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            if "CacheMaxMessages" in settings:
 | 
					 | 
				
			||||||
                self._cache_max_messages = settings["CacheMaxMessages"]
 | 
					 | 
				
			||||||
                settings.pop("CacheMaxMessages")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            servers = List(ServerSettings)
 | 
					 | 
				
			||||||
            for s in settings:
 | 
					 | 
				
			||||||
                st = ServerSettings()
 | 
					 | 
				
			||||||
                settings[s]["Id"] = s
 | 
					 | 
				
			||||||
                st.from_dict(settings[s])
 | 
					 | 
				
			||||||
                servers.append(st)
 | 
					 | 
				
			||||||
            self._servers = servers
 | 
					 | 
				
			||||||
        except Exception as e:
 | 
					 | 
				
			||||||
            Console.error(f"[ ERROR ] [ {__name__} ]: Reading error in {type(self).__name__} settings")
 | 
					 | 
				
			||||||
            Console.error(f"[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}")
 | 
					 | 
				
			||||||
@@ -3,13 +3,14 @@ from enum import Enum
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
class FeatureFlagsEnum(Enum):
 | 
					class FeatureFlagsEnum(Enum):
 | 
				
			||||||
    # modules
 | 
					    # modules
 | 
				
			||||||
 | 
					    achievements_module = "AchievementsModule"
 | 
				
			||||||
    api_module = "ApiModule"
 | 
					    api_module = "ApiModule"
 | 
				
			||||||
    admin_module = "AdminModule"
 | 
					 | 
				
			||||||
    auto_role_module = "AutoRoleModule"
 | 
					    auto_role_module = "AutoRoleModule"
 | 
				
			||||||
    base_module = "BaseModule"
 | 
					    base_module = "BaseModule"
 | 
				
			||||||
    boot_log_module = "BootLogModule"
 | 
					    boot_log_module = "BootLogModule"
 | 
				
			||||||
    core_module = "CoreModule"
 | 
					    core_module = "CoreModule"
 | 
				
			||||||
    core_extension_module = "CoreExtensionModule"
 | 
					    core_extension_module = "CoreExtensionModule"
 | 
				
			||||||
 | 
					    config_module = "ConfigModule"
 | 
				
			||||||
    data_module = "DataModule"
 | 
					    data_module = "DataModule"
 | 
				
			||||||
    database_module = "DatabaseModule"
 | 
					    database_module = "DatabaseModule"
 | 
				
			||||||
    level_module = "LevelModule"
 | 
					    level_module = "LevelModule"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,33 +1,48 @@
 | 
				
			|||||||
import traceback
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC
 | 
					from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC
 | 
				
			||||||
from cpl_core.console import Console
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
 | 
					from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class FeatureFlagsSettings(ConfigurationModelABC):
 | 
					class FeatureFlagsSettings(ConfigurationModelABC):
 | 
				
			||||||
    def __init__(self):
 | 
					    _flags = {
 | 
				
			||||||
 | 
					        # modules
 | 
				
			||||||
 | 
					        FeatureFlagsEnum.achievements_module.value: False,  # 14.06.2023 #268
 | 
				
			||||||
 | 
					        FeatureFlagsEnum.api_module.value: False,  # 13.10.2022 #70
 | 
				
			||||||
 | 
					        FeatureFlagsEnum.auto_role_module.value: False,  # 03.10.2022 #54
 | 
				
			||||||
 | 
					        FeatureFlagsEnum.base_module.value: True,  # 02.10.2022 #48
 | 
				
			||||||
 | 
					        FeatureFlagsEnum.boot_log_module.value: True,  # 02.10.2022 #48
 | 
				
			||||||
 | 
					        FeatureFlagsEnum.core_module.value: True,  # 03.10.2022 #56
 | 
				
			||||||
 | 
					        FeatureFlagsEnum.core_extension_module.value: True,  # 03.10.2022 #56
 | 
				
			||||||
 | 
					        FeatureFlagsEnum.data_module.value: True,  # 03.10.2022 #56
 | 
				
			||||||
 | 
					        FeatureFlagsEnum.database_module.value: True,  # 02.10.2022 #48
 | 
				
			||||||
 | 
					        FeatureFlagsEnum.moderator_module.value: False,  # 02.10.2022 #48
 | 
				
			||||||
 | 
					        FeatureFlagsEnum.permission_module.value: True,  # 02.10.2022 #48
 | 
				
			||||||
 | 
					        FeatureFlagsEnum.config_module.value: True,  # 19.07.2023 #127
 | 
				
			||||||
 | 
					        # features
 | 
				
			||||||
 | 
					        FeatureFlagsEnum.api_only.value: False,  # 13.10.2022 #70
 | 
				
			||||||
 | 
					        FeatureFlagsEnum.presence.value: True,  # 03.10.2022 #56
 | 
				
			||||||
 | 
					        FeatureFlagsEnum.version_in_presence.value: False,  # 21.03.2023 #253
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __init__(self, **kwargs: dict):
 | 
				
			||||||
        ConfigurationModelABC.__init__(self)
 | 
					        ConfigurationModelABC.__init__(self)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self._flags = {
 | 
					        if len(kwargs.keys()) == 0:
 | 
				
			||||||
            # modules
 | 
					            return
 | 
				
			||||||
            FeatureFlagsEnum.api_module.value: False,  # 13.10.2022 #70
 | 
					
 | 
				
			||||||
            FeatureFlagsEnum.admin_module.value: False,  # 02.10.2022 #48
 | 
					        for flag in [f.value for f in FeatureFlagsEnum]:
 | 
				
			||||||
            FeatureFlagsEnum.auto_role_module.value: True,  # 03.10.2022 #54
 | 
					            self._load_flag(kwargs, FeatureFlagsEnum(flag))
 | 
				
			||||||
            FeatureFlagsEnum.base_module.value: True,  # 02.10.2022 #48
 | 
					
 | 
				
			||||||
            FeatureFlagsEnum.boot_log_module.value: True,  # 02.10.2022 #48
 | 
					    @classmethod
 | 
				
			||||||
            FeatureFlagsEnum.core_module.value: True,  # 03.10.2022 #56
 | 
					    def get_flag_from_dict(cls, flags: dict, key: FeatureFlagsEnum) -> bool:
 | 
				
			||||||
            FeatureFlagsEnum.core_extension_module.value: True,  # 03.10.2022 #56
 | 
					        def get_flag():
 | 
				
			||||||
            FeatureFlagsEnum.data_module.value: True,  # 03.10.2022 #56
 | 
					            if key.value not in cls._flags:
 | 
				
			||||||
            FeatureFlagsEnum.database_module.value: True,  # 02.10.2022 #48
 | 
					                return False
 | 
				
			||||||
            FeatureFlagsEnum.moderator_module.value: False,  # 02.10.2022 #48
 | 
					            return cls._flags[key.value]
 | 
				
			||||||
            FeatureFlagsEnum.permission_module.value: True,  # 02.10.2022 #48
 | 
					
 | 
				
			||||||
            # features
 | 
					        if key.value not in flags:
 | 
				
			||||||
            FeatureFlagsEnum.api_only.value: False,  # 13.10.2022 #70
 | 
					            return get_flag()
 | 
				
			||||||
            FeatureFlagsEnum.presence.value: True,  # 03.10.2022 #56
 | 
					        return flags[key.value]
 | 
				
			||||||
            FeatureFlagsEnum.version_in_presence.value: False,  # 21.03.2023 #253
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def get_flag(self, key: FeatureFlagsEnum) -> bool:
 | 
					    def get_flag(self, key: FeatureFlagsEnum) -> bool:
 | 
				
			||||||
        if key.value not in self._flags:
 | 
					        if key.value not in self._flags:
 | 
				
			||||||
@@ -39,11 +54,3 @@ class FeatureFlagsSettings(ConfigurationModelABC):
 | 
				
			|||||||
            return
 | 
					            return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self._flags[key.value] = bool(settings[key.value])
 | 
					        self._flags[key.value] = bool(settings[key.value])
 | 
				
			||||||
 | 
					 | 
				
			||||||
    def from_dict(self, settings: dict):
 | 
					 | 
				
			||||||
        try:
 | 
					 | 
				
			||||||
            for flag in [f.value for f in FeatureFlagsEnum]:
 | 
					 | 
				
			||||||
                self._load_flag(settings, FeatureFlagsEnum(flag))
 | 
					 | 
				
			||||||
        except Exception as e:
 | 
					 | 
				
			||||||
            Console.error(f"[ ERROR ] [ {__name__} ]: Reading error in {type(self).__name__} settings")
 | 
					 | 
				
			||||||
            Console.error(f"[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}")
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,23 +1,19 @@
 | 
				
			|||||||
import traceback
 | 
					from cpl_core.logging import LoggingSettings, LoggingLevelEnum
 | 
				
			||||||
 | 
					 | 
				
			||||||
from cpl_core.console import Console
 | 
					 | 
				
			||||||
from cpl_core.logging import LoggingSettings
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class FileLoggingSettings(LoggingSettings):
 | 
					class FileLoggingSettings(LoggingSettings):
 | 
				
			||||||
    def __init__(self):
 | 
					    def __init__(
 | 
				
			||||||
        LoggingSettings.__init__(self)
 | 
					        self,
 | 
				
			||||||
 | 
					        key: str,
 | 
				
			||||||
 | 
					        path: str = None,
 | 
				
			||||||
 | 
					        filename: str = None,
 | 
				
			||||||
 | 
					        console_log_level: LoggingLevelEnum = None,
 | 
				
			||||||
 | 
					        file_log_level: LoggingLevelEnum = None,
 | 
				
			||||||
 | 
					    ):
 | 
				
			||||||
 | 
					        LoggingSettings.__init__(self, path, filename, console_log_level, file_log_level)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self._key = ""
 | 
					        self._key = key
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def key(self) -> str:
 | 
					    def key(self) -> str:
 | 
				
			||||||
        return self._key
 | 
					        return self._key
 | 
				
			||||||
 | 
					 | 
				
			||||||
    def from_dict(self, settings: dict):
 | 
					 | 
				
			||||||
        try:
 | 
					 | 
				
			||||||
            self._key = settings["Key"]
 | 
					 | 
				
			||||||
            super().from_dict(settings)
 | 
					 | 
				
			||||||
        except Exception as e:
 | 
					 | 
				
			||||||
            Console.error(f"[ ERROR ] [ {__name__} ]: Reading error in {type(self).__name__} settings")
 | 
					 | 
				
			||||||
            Console.error(f"[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}")
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,28 +0,0 @@
 | 
				
			|||||||
import traceback
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC
 | 
					 | 
				
			||||||
from cpl_core.console import Console
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class ServerSettings(ConfigurationModelABC):
 | 
					 | 
				
			||||||
    def __init__(self):
 | 
					 | 
				
			||||||
        ConfigurationModelABC.__init__(self)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        self._id: int = 0
 | 
					 | 
				
			||||||
        self._message_delete_timer: int = 0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @property
 | 
					 | 
				
			||||||
    def id(self) -> int:
 | 
					 | 
				
			||||||
        return self._id
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @property
 | 
					 | 
				
			||||||
    def message_delete_timer(self) -> int:
 | 
					 | 
				
			||||||
        return self._message_delete_timer
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def from_dict(self, settings: dict):
 | 
					 | 
				
			||||||
        try:
 | 
					 | 
				
			||||||
            self._id = int(settings["Id"])
 | 
					 | 
				
			||||||
            self._message_delete_timer = int(settings["MessageDeleteTimer"])
 | 
					 | 
				
			||||||
        except Exception as e:
 | 
					 | 
				
			||||||
            Console.error(f"[ ERROR ] [ {__name__} ]: Reading error in settings")
 | 
					 | 
				
			||||||
            Console.error(f"[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}")
 | 
					 | 
				
			||||||
@@ -15,7 +15,7 @@ __title__ = "bot_core.core_extension"
 | 
				
			|||||||
__author__ = "Sven Heidemann"
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
__license__ = "MIT"
 | 
					__license__ = "MIT"
 | 
				
			||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
					__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
				
			||||||
__version__ = "1.0.6"
 | 
					__version__ = "1.1.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -23,4 +23,4 @@ from collections import namedtuple
 | 
				
			|||||||
# imports:
 | 
					# imports:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="1", minor="0", micro="6")
 | 
					version_info = VersionInfo(major="1", minor="1", micro="1")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,6 +11,8 @@ from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
 | 
				
			|||||||
from bot_core.events.core_on_ready_event import CoreOnReadyEvent
 | 
					from bot_core.events.core_on_ready_event import CoreOnReadyEvent
 | 
				
			||||||
from bot_core.pipes.date_time_offset_pipe import DateTimeOffsetPipe
 | 
					from bot_core.pipes.date_time_offset_pipe import DateTimeOffsetPipe
 | 
				
			||||||
from bot_core.service.client_utils_service import ClientUtilsService
 | 
					from bot_core.service.client_utils_service import ClientUtilsService
 | 
				
			||||||
 | 
					from bot_core.service.config_service import ConfigService
 | 
				
			||||||
 | 
					from bot_core.service.data_integrity_service import DataIntegrityService
 | 
				
			||||||
from bot_core.service.message_service import MessageService
 | 
					from bot_core.service.message_service import MessageService
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -22,8 +24,10 @@ class CoreModule(ModuleABC):
 | 
				
			|||||||
        pass
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def configure_services(self, services: ServiceCollectionABC, env: ApplicationEnvironmentABC):
 | 
					    def configure_services(self, services: ServiceCollectionABC, env: ApplicationEnvironmentABC):
 | 
				
			||||||
 | 
					        services.add_transient(ConfigService)
 | 
				
			||||||
        services.add_transient(MessageServiceABC, MessageService)
 | 
					        services.add_transient(MessageServiceABC, MessageService)
 | 
				
			||||||
        services.add_transient(ClientUtilsABC, ClientUtilsService)
 | 
					        services.add_transient(ClientUtilsABC, ClientUtilsService)
 | 
				
			||||||
 | 
					        services.add_transient(DataIntegrityService)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # pipes
 | 
					        # pipes
 | 
				
			||||||
        services.add_transient(DateTimeOffsetPipe)
 | 
					        services.add_transient(DateTimeOffsetPipe)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@ __title__ = "bot_core.events"
 | 
				
			|||||||
__author__ = "Sven Heidemann"
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
__license__ = "MIT"
 | 
					__license__ = "MIT"
 | 
				
			||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
					__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
				
			||||||
__version__ = "1.0.6"
 | 
					__version__ = "1.1.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -23,4 +23,4 @@ from collections import namedtuple
 | 
				
			|||||||
# imports:
 | 
					# imports:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="1", minor="0", micro="6")
 | 
					version_info = VersionInfo(major="1", minor="1", micro="1")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@ __title__ = "bot_core.exception"
 | 
				
			|||||||
__author__ = "Sven Heidemann"
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
__license__ = "MIT"
 | 
					__license__ = "MIT"
 | 
				
			||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
					__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
				
			||||||
__version__ = "1.0.6"
 | 
					__version__ = "1.1.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -23,4 +23,4 @@ from collections import namedtuple
 | 
				
			|||||||
# imports:
 | 
					# imports:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="1", minor="0", micro="6")
 | 
					version_info = VersionInfo(major="1", minor="1", micro="1")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@ __title__ = "bot_core.helper"
 | 
				
			|||||||
__author__ = "Sven Heidemann"
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
__license__ = "MIT"
 | 
					__license__ = "MIT"
 | 
				
			||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
					__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
				
			||||||
__version__ = "1.0.6"
 | 
					__version__ = "1.1.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -23,4 +23,4 @@ from collections import namedtuple
 | 
				
			|||||||
# imports:
 | 
					# imports:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="1", minor="0", micro="6")
 | 
					version_info = VersionInfo(major="1", minor="1", micro="1")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@ __title__ = "bot_core.logging"
 | 
				
			|||||||
__author__ = "Sven Heidemann"
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
__license__ = "MIT"
 | 
					__license__ = "MIT"
 | 
				
			||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
					__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
				
			||||||
__version__ = "1.0.6"
 | 
					__version__ = "1.1.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -23,4 +23,4 @@ from collections import namedtuple
 | 
				
			|||||||
# imports
 | 
					# imports
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="1", minor="0", micro="6")
 | 
					version_info = VersionInfo(major="1", minor="1", micro="1")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@ __title__ = "bot_core.pipes"
 | 
				
			|||||||
__author__ = "Sven Heidemann"
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
__license__ = "MIT"
 | 
					__license__ = "MIT"
 | 
				
			||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
					__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
				
			||||||
__version__ = "1.0.6"
 | 
					__version__ = "1.1.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -23,4 +23,4 @@ from collections import namedtuple
 | 
				
			|||||||
# imports
 | 
					# imports
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="1", minor="0", micro="6")
 | 
					version_info = VersionInfo(major="1", minor="1", micro="1")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@ __title__ = "bot_core.service"
 | 
				
			|||||||
__author__ = "Sven Heidemann"
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
__license__ = "MIT"
 | 
					__license__ = "MIT"
 | 
				
			||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
					__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
				
			||||||
__version__ = "1.0.6"
 | 
					__version__ = "1.1.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -23,4 +23,4 @@ from collections import namedtuple
 | 
				
			|||||||
# imports:
 | 
					# imports:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="1", minor="0", micro="6")
 | 
					version_info = VersionInfo(major="1", minor="1", micro="1")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,9 +25,9 @@ from bot_data.abc.user_message_count_per_hour_repository_abc import (
 | 
				
			|||||||
    UserMessageCountPerHourRepositoryABC,
 | 
					    UserMessageCountPerHourRepositoryABC,
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
from bot_data.model.auto_role_rule import AutoRoleRule
 | 
					from bot_data.model.auto_role_rule import AutoRoleRule
 | 
				
			||||||
 | 
					from bot_data.model.server_config import ServerConfig
 | 
				
			||||||
from bot_data.model.user import User
 | 
					from bot_data.model.user import User
 | 
				
			||||||
from bot_data.model.user_message_count_per_hour import UserMessageCountPerHour
 | 
					from bot_data.model.user_message_count_per_hour import UserMessageCountPerHour
 | 
				
			||||||
from modules.base.configuration.base_server_settings import BaseServerSettings
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ClientUtilsService(ClientUtilsABC):
 | 
					class ClientUtilsService(ClientUtilsABC):
 | 
				
			||||||
@@ -139,7 +139,7 @@ class ClientUtilsService(ClientUtilsABC):
 | 
				
			|||||||
        self,
 | 
					        self,
 | 
				
			||||||
        created_at: datetime,
 | 
					        created_at: datetime,
 | 
				
			||||||
        user: User,
 | 
					        user: User,
 | 
				
			||||||
        settings: BaseServerSettings,
 | 
					        settings: ServerConfig,
 | 
				
			||||||
        is_reaction: bool = False,
 | 
					        is_reaction: bool = False,
 | 
				
			||||||
    ) -> bool:
 | 
					    ) -> bool:
 | 
				
			||||||
        umcph = None
 | 
					        umcph = None
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										50
									
								
								kdb-bot/src/bot_core/service/config_service.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								kdb-bot/src/bot_core/service/config_service.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,50 @@
 | 
				
			|||||||
 | 
					from cpl_core.configuration import ConfigurationABC
 | 
				
			||||||
 | 
					from cpl_core.dependency_injection import ServiceProviderABC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from bot_core.configuration.feature_flags_settings import FeatureFlagsSettings
 | 
				
			||||||
 | 
					from bot_data.abc.server_config_repository_abc import ServerConfigRepositoryABC
 | 
				
			||||||
 | 
					from bot_data.abc.technician_config_repository_abc import TechnicianConfigRepositoryABC
 | 
				
			||||||
 | 
					from bot_data.model.server import Server
 | 
				
			||||||
 | 
					from bot_data.model.technician_config import TechnicianConfig
 | 
				
			||||||
 | 
					from bot_data.service.server_config_seeder import ServerConfigSeeder
 | 
				
			||||||
 | 
					from bot_data.service.technician_config_seeder import TechnicianConfigSeeder
 | 
				
			||||||
 | 
					from modules.permission.abc.permission_service_abc import PermissionServiceABC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ConfigService:
 | 
				
			||||||
 | 
					    def __init__(
 | 
				
			||||||
 | 
					        self,
 | 
				
			||||||
 | 
					        config: ConfigurationABC,
 | 
				
			||||||
 | 
					        services: ServiceProviderABC,
 | 
				
			||||||
 | 
					        technician_config_repo: TechnicianConfigRepositoryABC,
 | 
				
			||||||
 | 
					        server_config_repo: ServerConfigRepositoryABC,
 | 
				
			||||||
 | 
					        tech_seeder: TechnicianConfigSeeder,
 | 
				
			||||||
 | 
					        server_seeder: ServerConfigSeeder,
 | 
				
			||||||
 | 
					    ):
 | 
				
			||||||
 | 
					        self._config = config
 | 
				
			||||||
 | 
					        self._services = services
 | 
				
			||||||
 | 
					        self._technician_config_repo = technician_config_repo
 | 
				
			||||||
 | 
					        self._server_config_repo = server_config_repo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self._tech_seeder = tech_seeder
 | 
				
			||||||
 | 
					        self._server_seeder = server_seeder
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    async def reload_technician_config(self):
 | 
				
			||||||
 | 
					        if not self._technician_config_repo.does_technician_config_exists():
 | 
				
			||||||
 | 
					            await self._tech_seeder.seed()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        technician_config = self._technician_config_repo.get_technician_config()
 | 
				
			||||||
 | 
					        self._config.add_configuration(TechnicianConfig, technician_config)
 | 
				
			||||||
 | 
					        self._config.add_configuration(FeatureFlagsSettings, FeatureFlagsSettings(**technician_config.feature_flags))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    async def reload_server_config(self, server: Server):
 | 
				
			||||||
 | 
					        if not self._server_config_repo.does_server_config_exists(server.id):
 | 
				
			||||||
 | 
					            await self._server_seeder.seed()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        server_config = self._server_config_repo.get_server_config_by_server(server.id)
 | 
				
			||||||
 | 
					        self._config.add_configuration(
 | 
				
			||||||
 | 
					            f"{type(server_config).__name__}_{server_config.server.discord_id}", server_config
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        permissions: PermissionServiceABC = self._services.get_service(PermissionServiceABC)
 | 
				
			||||||
 | 
					        permissions.on_ready()
 | 
				
			||||||
							
								
								
									
										396
									
								
								kdb-bot/src/bot_core/service/data_integrity_service.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										396
									
								
								kdb-bot/src/bot_core/service/data_integrity_service.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,396 @@
 | 
				
			|||||||
 | 
					from datetime import datetime, timedelta
 | 
				
			||||||
 | 
					from typing import Union
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import discord
 | 
				
			||||||
 | 
					from cpl_core.configuration import ConfigurationABC
 | 
				
			||||||
 | 
					from cpl_core.database.context import DatabaseContextABC
 | 
				
			||||||
 | 
					from cpl_discord.service import DiscordBotServiceABC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from bot_core.logging.database_logger import DatabaseLogger
 | 
				
			||||||
 | 
					from bot_core.pipes.date_time_offset_pipe import DateTimeOffsetPipe
 | 
				
			||||||
 | 
					from bot_data.abc.client_repository_abc import ClientRepositoryABC
 | 
				
			||||||
 | 
					from bot_data.abc.known_user_repository_abc import KnownUserRepositoryABC
 | 
				
			||||||
 | 
					from bot_data.abc.user_joined_game_server_repository_abc import UserJoinedGameServerRepositoryABC
 | 
				
			||||||
 | 
					from bot_data.abc.user_joined_server_repository_abc import UserJoinedServerRepositoryABC
 | 
				
			||||||
 | 
					from bot_data.abc.user_joined_voice_channel_repository_abc import (
 | 
				
			||||||
 | 
					    UserJoinedVoiceChannelRepositoryABC,
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					from bot_data.abc.user_repository_abc import UserRepositoryABC
 | 
				
			||||||
 | 
					from bot_data.model.client import Client
 | 
				
			||||||
 | 
					from bot_data.model.known_user import KnownUser
 | 
				
			||||||
 | 
					from bot_data.model.server import Server
 | 
				
			||||||
 | 
					from bot_data.model.server_config import ServerConfig
 | 
				
			||||||
 | 
					from bot_data.model.user import User
 | 
				
			||||||
 | 
					from bot_data.model.user_joined_server import UserJoinedServer
 | 
				
			||||||
 | 
					from bot_data.model.user_joined_voice_channel import UserJoinedVoiceChannel
 | 
				
			||||||
 | 
					from bot_data.service.seeder_service import SeederService
 | 
				
			||||||
 | 
					from bot_data.service.user_repository_service import ServerRepositoryABC
 | 
				
			||||||
 | 
					from modules.achievements.achievement_service import AchievementService
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class DataIntegrityService:
 | 
				
			||||||
 | 
					    def __init__(
 | 
				
			||||||
 | 
					        self,
 | 
				
			||||||
 | 
					        config: ConfigurationABC,
 | 
				
			||||||
 | 
					        logger: DatabaseLogger,
 | 
				
			||||||
 | 
					        seeder: SeederService,
 | 
				
			||||||
 | 
					        bot: DiscordBotServiceABC,
 | 
				
			||||||
 | 
					        db_context: DatabaseContextABC,
 | 
				
			||||||
 | 
					        server_repo: ServerRepositoryABC,
 | 
				
			||||||
 | 
					        user_repo: UserRepositoryABC,
 | 
				
			||||||
 | 
					        client_repo: ClientRepositoryABC,
 | 
				
			||||||
 | 
					        known_users: KnownUserRepositoryABC,
 | 
				
			||||||
 | 
					        user_joins: UserJoinedServerRepositoryABC,
 | 
				
			||||||
 | 
					        user_joins_vc: UserJoinedVoiceChannelRepositoryABC,
 | 
				
			||||||
 | 
					        user_joined_gs: UserJoinedGameServerRepositoryABC,
 | 
				
			||||||
 | 
					        achievement_service: AchievementService,
 | 
				
			||||||
 | 
					        dtp: DateTimeOffsetPipe,
 | 
				
			||||||
 | 
					    ):
 | 
				
			||||||
 | 
					        self._config = config
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self._logger = logger
 | 
				
			||||||
 | 
					        self._seeder = seeder
 | 
				
			||||||
 | 
					        self._bot = bot
 | 
				
			||||||
 | 
					        self._db_context = db_context
 | 
				
			||||||
 | 
					        self._servers = server_repo
 | 
				
			||||||
 | 
					        self._users = user_repo
 | 
				
			||||||
 | 
					        self._clients = client_repo
 | 
				
			||||||
 | 
					        self._known_users = known_users
 | 
				
			||||||
 | 
					        self._user_joins = user_joins
 | 
				
			||||||
 | 
					        self._user_joins_vc = user_joins_vc
 | 
				
			||||||
 | 
					        self._user_joined_gs = user_joined_gs
 | 
				
			||||||
 | 
					        self._achievements = achievement_service
 | 
				
			||||||
 | 
					        self._dtp = dtp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self._is_for_shutdown = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def _check_known_users(self):
 | 
				
			||||||
 | 
					        self._logger.debug(__name__, f"Start checking KnownUsers table, {len(self._bot.users)}")
 | 
				
			||||||
 | 
					        for u in self._bot.users:
 | 
				
			||||||
 | 
					            u: discord.User = u
 | 
				
			||||||
 | 
					            try:
 | 
				
			||||||
 | 
					                if u.bot:
 | 
				
			||||||
 | 
					                    self._logger.trace(__name__, f"User {u.id} is ignored, because its a bot")
 | 
				
			||||||
 | 
					                    continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                user = self._known_users.find_user_by_discord_id(u.id)
 | 
				
			||||||
 | 
					                if user is not None:
 | 
				
			||||||
 | 
					                    continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                self._logger.warn(__name__, f"Unknown user: {u.id}")
 | 
				
			||||||
 | 
					                self._logger.debug(__name__, f"Add user: {u.id}")
 | 
				
			||||||
 | 
					                self._known_users.add_user(KnownUser(u.id))
 | 
				
			||||||
 | 
					                self._db_context.save_changes()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                user = self._known_users.find_user_by_discord_id(u.id)
 | 
				
			||||||
 | 
					                if user is None:
 | 
				
			||||||
 | 
					                    self._logger.fatal(__name__, f"Cannot add user: {u.id}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                self._logger.debug(__name__, f"Added user: {u.id}")
 | 
				
			||||||
 | 
					            except Exception as e:
 | 
				
			||||||
 | 
					                self._logger.error(__name__, f"Cannot get user", e)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def _check_servers(self):
 | 
				
			||||||
 | 
					        self._logger.debug(__name__, f"Start checking Servers table")
 | 
				
			||||||
 | 
					        for g in self._bot.guilds:
 | 
				
			||||||
 | 
					            g: discord.Guild = g
 | 
				
			||||||
 | 
					            try:
 | 
				
			||||||
 | 
					                server = self._servers.find_server_by_discord_id(g.id)
 | 
				
			||||||
 | 
					                if server is not None:
 | 
				
			||||||
 | 
					                    continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                self._logger.warn(__name__, f"Server not found in database: {g.id}")
 | 
				
			||||||
 | 
					                self._logger.debug(__name__, f"Add server: {g.id}")
 | 
				
			||||||
 | 
					                self._servers.add_server(Server(g.id))
 | 
				
			||||||
 | 
					                self._db_context.save_changes()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                server = self._servers.find_server_by_discord_id(g.id)
 | 
				
			||||||
 | 
					                if server is None:
 | 
				
			||||||
 | 
					                    self._logger.fatal(__name__, f"Cannot add server: {g.id}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                self._logger.debug(__name__, f"Added server: {g.id}")
 | 
				
			||||||
 | 
					            except Exception as e:
 | 
				
			||||||
 | 
					                self._logger.error(__name__, f"Cannot get server", e)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        results = self._servers.get_servers()
 | 
				
			||||||
 | 
					        if results is None or len(results) == 0:
 | 
				
			||||||
 | 
					            self._logger.error(__name__, f"Table Servers is empty!")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def _check_clients(self):
 | 
				
			||||||
 | 
					        self._logger.debug(__name__, f"Start checking Clients table")
 | 
				
			||||||
 | 
					        for g in self._bot.guilds:
 | 
				
			||||||
 | 
					            g: discord.Guild = g
 | 
				
			||||||
 | 
					            try:
 | 
				
			||||||
 | 
					                server: Server = self._servers.find_server_by_discord_id(g.id)
 | 
				
			||||||
 | 
					                if server is None:
 | 
				
			||||||
 | 
					                    self._logger.fatal(__name__, f"Server not found in database: {g.id}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                client = self._clients.find_client_by_server_id(server.id)
 | 
				
			||||||
 | 
					                if client is not None:
 | 
				
			||||||
 | 
					                    continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                self._logger.warn(
 | 
				
			||||||
 | 
					                    __name__,
 | 
				
			||||||
 | 
					                    f"Client for server {g.id} not found in database: {self._bot.user.id}",
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
 | 
					                self._logger.debug(__name__, f"Add client: {self._bot.user.id}")
 | 
				
			||||||
 | 
					                self._clients.add_client(Client(self._bot.user.id, 0, 0, 0, 0, 0, server))
 | 
				
			||||||
 | 
					                self._db_context.save_changes()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                client = self._clients.find_client_by_server_id(server.id)
 | 
				
			||||||
 | 
					                if client is None:
 | 
				
			||||||
 | 
					                    self._logger.fatal(
 | 
				
			||||||
 | 
					                        __name__,
 | 
				
			||||||
 | 
					                        f"Cannot add client {self._bot.user.id} for server {g.id}",
 | 
				
			||||||
 | 
					                    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                self._logger.debug(__name__, f"Added client: {g.id}")
 | 
				
			||||||
 | 
					            except Exception as e:
 | 
				
			||||||
 | 
					                self._logger.error(__name__, f"Cannot get client", e)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        results = self._servers.get_servers()
 | 
				
			||||||
 | 
					        if results is None or len(results) == 0:
 | 
				
			||||||
 | 
					            self._logger.error(__name__, f"Table Servers is empty!")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def _check_users(self):
 | 
				
			||||||
 | 
					        self._logger.debug(__name__, f"Start checking Users table")
 | 
				
			||||||
 | 
					        for g in self._bot.guilds:
 | 
				
			||||||
 | 
					            g: discord.Guild = g
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            try:
 | 
				
			||||||
 | 
					                server = self._servers.find_server_by_discord_id(g.id)
 | 
				
			||||||
 | 
					                if server is None:
 | 
				
			||||||
 | 
					                    self._logger.fatal(__name__, f"Server not found in database: {g.id}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                for u in g.members:
 | 
				
			||||||
 | 
					                    u: Union[discord.Member, discord.User] = u
 | 
				
			||||||
 | 
					                    if u.bot:
 | 
				
			||||||
 | 
					                        self._logger.trace(__name__, f"User {u.id} is ignored, because its a bot")
 | 
				
			||||||
 | 
					                        continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    user = self._users.find_user_by_discord_id_and_server_id(u.id, server.id)
 | 
				
			||||||
 | 
					                    if user is not None:
 | 
				
			||||||
 | 
					                        continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    self._logger.warn(__name__, f"User not found in database: {u.id}")
 | 
				
			||||||
 | 
					                    self._logger.debug(__name__, f"Add user: {u.id}")
 | 
				
			||||||
 | 
					                    self._users.add_user(User(u.id, 0, 0, 0, server))
 | 
				
			||||||
 | 
					                    self._db_context.save_changes()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    self._logger.debug(__name__, f"Added User: {u.id}")
 | 
				
			||||||
 | 
					            except Exception as e:
 | 
				
			||||||
 | 
					                self._logger.error(__name__, f"Cannot get User", e)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            results = self._users.get_users()
 | 
				
			||||||
 | 
					            if results is None or len(results) == 0:
 | 
				
			||||||
 | 
					                self._logger.error(__name__, f"Table Users is empty!")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def _check_user_joins(self):
 | 
				
			||||||
 | 
					        self._logger.debug(__name__, f"Start checking UserJoinedServers table")
 | 
				
			||||||
 | 
					        for guild in self._bot.guilds:
 | 
				
			||||||
 | 
					            guild: discord.Guild = guild
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            server = self._servers.find_server_by_discord_id(guild.id)
 | 
				
			||||||
 | 
					            if server is None:
 | 
				
			||||||
 | 
					                self._logger.fatal(__name__, f"Server not found in database: {guild.id}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            try:
 | 
				
			||||||
 | 
					                for u in guild.members:
 | 
				
			||||||
 | 
					                    u: discord.User = u
 | 
				
			||||||
 | 
					                    if u.bot:
 | 
				
			||||||
 | 
					                        self._logger.trace(__name__, f"User {u.id} is ignored, because its a bot")
 | 
				
			||||||
 | 
					                        continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    user = self._users.find_user_by_discord_id_and_server_id(u.id, server.id)
 | 
				
			||||||
 | 
					                    if user is None:
 | 
				
			||||||
 | 
					                        self._logger.fatal(__name__, f"User not found in database: {u.id}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    join = self._user_joins.find_active_user_joined_server_by_user_id(user.id)
 | 
				
			||||||
 | 
					                    if join is not None:
 | 
				
			||||||
 | 
					                        continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    m: discord.Member = u
 | 
				
			||||||
 | 
					                    self._logger.warn(
 | 
				
			||||||
 | 
					                        __name__,
 | 
				
			||||||
 | 
					                        f"Active UserJoinedServer not found in database: {guild.id}:{u.id}@{m.joined_at}",
 | 
				
			||||||
 | 
					                    )
 | 
				
			||||||
 | 
					                    self._logger.debug(
 | 
				
			||||||
 | 
					                        __name__,
 | 
				
			||||||
 | 
					                        f"Add UserJoinedServer: {guild.id}:{u.id}@{m.joined_at}",
 | 
				
			||||||
 | 
					                    )
 | 
				
			||||||
 | 
					                    self._user_joins.add_user_joined_server(
 | 
				
			||||||
 | 
					                        UserJoinedServer(user, self._dtp.transform(m.joined_at), None)
 | 
				
			||||||
 | 
					                    )
 | 
				
			||||||
 | 
					                    self._db_context.save_changes()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    self._logger.debug(__name__, f"Added UserJoinedServer: {u.id}")
 | 
				
			||||||
 | 
					            except Exception as e:
 | 
				
			||||||
 | 
					                self._logger.error(__name__, f"Cannot get UserJoinedServer", e)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            results = self._users.get_users()
 | 
				
			||||||
 | 
					            if results is None or len(results) == 0:
 | 
				
			||||||
 | 
					                self._logger.error(__name__, f"Table Users is empty!")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            joins = self._user_joins.get_user_joined_servers()
 | 
				
			||||||
 | 
					            for join in joins:
 | 
				
			||||||
 | 
					                join: UserJoinedServer = join
 | 
				
			||||||
 | 
					                if join.user.server.discord_id != guild.id:
 | 
				
			||||||
 | 
					                    continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if join.leaved_on is not None:
 | 
				
			||||||
 | 
					                    continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                dc_user = guild.get_member(join.user.discord_id)
 | 
				
			||||||
 | 
					                if dc_user is None:
 | 
				
			||||||
 | 
					                    self._logger.warn(
 | 
				
			||||||
 | 
					                        __name__,
 | 
				
			||||||
 | 
					                        f"User {join.user.discord_id} already left the server.",
 | 
				
			||||||
 | 
					                    )
 | 
				
			||||||
 | 
					                    join.leaved_on = datetime.now()
 | 
				
			||||||
 | 
					                    self._user_joins.update_user_joined_server(join)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            self._db_context.save_changes()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def _check_user_joins_vc(self):
 | 
				
			||||||
 | 
					        self._logger.debug(__name__, f"Start checking UserJoinedVoiceChannel table")
 | 
				
			||||||
 | 
					        for guild in self._bot.guilds:
 | 
				
			||||||
 | 
					            guild: discord.Guild = guild
 | 
				
			||||||
 | 
					            settings: ServerConfig = self._config.get_configuration(f"ServerConfig_{guild.id}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            server = self._servers.find_server_by_discord_id(guild.id)
 | 
				
			||||||
 | 
					            if server is None:
 | 
				
			||||||
 | 
					                self._logger.fatal(__name__, f"Server not found in database: {guild.id}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            try:
 | 
				
			||||||
 | 
					                # close open voice states
 | 
				
			||||||
 | 
					                for member in guild.members:
 | 
				
			||||||
 | 
					                    if member.bot:
 | 
				
			||||||
 | 
					                        self._logger.trace(__name__, f"User {member.id} is ignored, because its a bot")
 | 
				
			||||||
 | 
					                        continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    user = self._users.find_user_by_discord_id_and_server_id(member.id, server.id)
 | 
				
			||||||
 | 
					                    if user is None:
 | 
				
			||||||
 | 
					                        self._logger.fatal(__name__, f"User not found in database: {member.id}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    joins = self._user_joins_vc.find_active_user_joined_voice_channels_by_user_id(user.id)
 | 
				
			||||||
 | 
					                    if joins is None or len(joins) == 0:
 | 
				
			||||||
 | 
					                        continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    for join in joins:
 | 
				
			||||||
 | 
					                        self._logger.warn(
 | 
				
			||||||
 | 
					                            __name__,
 | 
				
			||||||
 | 
					                            f"Active UserJoinedVoiceChannel found in database: {guild.id}:{member.id}@{join.joined_on}",
 | 
				
			||||||
 | 
					                        )
 | 
				
			||||||
 | 
					                        join.leaved_on = datetime.now()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        if (
 | 
				
			||||||
 | 
					                            (join.leaved_on - join.joined_on).total_seconds() / 60 / 60
 | 
				
			||||||
 | 
					                        ) > settings.max_voice_state_hours:
 | 
				
			||||||
 | 
					                            join.leaved_on = join.joined_on + timedelta(hours=settings.max_voice_state_hours)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        self._user_joins_vc.update_user_joined_voice_channel(join)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        if self._is_for_shutdown:
 | 
				
			||||||
 | 
					                            user.xp += round(join.time * settings.xp_per_ontime_hour)
 | 
				
			||||||
 | 
					                            self._users.update_user(user)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        self._db_context.save_changes()
 | 
				
			||||||
 | 
					                        if self._is_for_shutdown:
 | 
				
			||||||
 | 
					                            return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                # add open voice states
 | 
				
			||||||
 | 
					                for member in guild.members:
 | 
				
			||||||
 | 
					                    if member.bot:
 | 
				
			||||||
 | 
					                        self._logger.trace(__name__, f"User {member.id} is ignored, because its a bot")
 | 
				
			||||||
 | 
					                        continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if member.voice is None or member.voice.channel.id in settings.afk_channel_ids:
 | 
				
			||||||
 | 
					                        continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    user = self._users.find_user_by_discord_id_and_server_id(member.id, server.id)
 | 
				
			||||||
 | 
					                    if user is None:
 | 
				
			||||||
 | 
					                        self._logger.fatal(__name__, f"User not found in database: {member.id}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    join = UserJoinedVoiceChannel(user, member.voice.channel.id, datetime.now())
 | 
				
			||||||
 | 
					                    self._user_joins_vc.add_user_joined_voice_channel(join)
 | 
				
			||||||
 | 
					                    self._db_context.save_changes()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            except Exception as e:
 | 
				
			||||||
 | 
					                self._logger.error(__name__, f"Cannot get UserJoinedVoiceChannel", e)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def _check_user_joined_gs(self):
 | 
				
			||||||
 | 
					        self._logger.debug(__name__, f"Start checking UserJoinedGameServer table")
 | 
				
			||||||
 | 
					        for guild in self._bot.guilds:
 | 
				
			||||||
 | 
					            guild: discord.Guild = guild
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            server = self._servers.find_server_by_discord_id(guild.id)
 | 
				
			||||||
 | 
					            if server is None:
 | 
				
			||||||
 | 
					                self._logger.fatal(__name__, f"Server not found in database: {guild.id}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            try:
 | 
				
			||||||
 | 
					                for member in guild.members:
 | 
				
			||||||
 | 
					                    if member.bot:
 | 
				
			||||||
 | 
					                        self._logger.trace(__name__, f"User {member.id} is ignored, because its a bot")
 | 
				
			||||||
 | 
					                        continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    user = self._users.find_user_by_discord_id_and_server_id(member.id, server.id)
 | 
				
			||||||
 | 
					                    if user is None:
 | 
				
			||||||
 | 
					                        self._logger.fatal(__name__, f"User not found in database: {member.id}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    joins = self._user_joined_gs.find_active_user_joined_game_servers_by_user_id(user.id)
 | 
				
			||||||
 | 
					                    if joins is None or len(joins) == 0:
 | 
				
			||||||
 | 
					                        continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    for join in joins:
 | 
				
			||||||
 | 
					                        self._logger.warn(
 | 
				
			||||||
 | 
					                            __name__,
 | 
				
			||||||
 | 
					                            f"Active UserJoinedGameServer found in database: {guild.id}:{member.id}@{join.joined_on}",
 | 
				
			||||||
 | 
					                        )
 | 
				
			||||||
 | 
					                        join.leaved_on = datetime.now()
 | 
				
			||||||
 | 
					                        settings: ServerConfig = self._config.get_configuration(f"ServerConfig_{guild.id}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        if (
 | 
				
			||||||
 | 
					                            (join.leaved_on - join.joined_on).total_seconds() / 60 / 60
 | 
				
			||||||
 | 
					                        ) > settings.max_voice_state_hours:
 | 
				
			||||||
 | 
					                            join.leaved_on = join.joined_on + timedelta(hours=settings.max_voice_state_hours)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        self._user_joined_gs.update_user_joined_game_server(join)
 | 
				
			||||||
 | 
					                        if self._is_for_shutdown:
 | 
				
			||||||
 | 
					                            user.xp += round(join.time * settings.xp_per_ontime_hour)
 | 
				
			||||||
 | 
					                            self._users.update_user(user)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        self._db_context.save_changes()
 | 
				
			||||||
 | 
					            except Exception as e:
 | 
				
			||||||
 | 
					                self._logger.error(__name__, f"Cannot get UserJoinedGameServer", e)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    async def _check_for_user_achievements(self):
 | 
				
			||||||
 | 
					        self._logger.debug(__name__, f"Start checking UserGotAchievement table")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for guild in self._bot.guilds:
 | 
				
			||||||
 | 
					            server = self._servers.find_server_by_discord_id(guild.id)
 | 
				
			||||||
 | 
					            if server is None:
 | 
				
			||||||
 | 
					                self._logger.fatal(__name__, f"Server not found in database: {guild.id}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            for member in guild.members:
 | 
				
			||||||
 | 
					                if member.bot:
 | 
				
			||||||
 | 
					                    self._logger.trace(__name__, f"User {member.id} is ignored, because its a bot")
 | 
				
			||||||
 | 
					                    continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                user = self._users.find_user_by_discord_id_and_server_id(member.id, server.id)
 | 
				
			||||||
 | 
					                if user is None:
 | 
				
			||||||
 | 
					                    self._logger.fatal(__name__, f"User not found in database: {member.id}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                await self._achievements.validate_achievements_for_user(user)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    async def check_data_integrity(self, is_for_shutdown=False):
 | 
				
			||||||
 | 
					        if is_for_shutdown != self._is_for_shutdown:
 | 
				
			||||||
 | 
					            self._is_for_shutdown = is_for_shutdown
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self._check_known_users()
 | 
				
			||||||
 | 
					        self._check_servers()
 | 
				
			||||||
 | 
					        self._check_clients()
 | 
				
			||||||
 | 
					        self._check_users()
 | 
				
			||||||
 | 
					        self._check_user_joins()
 | 
				
			||||||
 | 
					        self._check_user_joins_vc()
 | 
				
			||||||
 | 
					        self._check_user_joined_gs()
 | 
				
			||||||
 | 
					        await self._check_for_user_achievements()
 | 
				
			||||||
@@ -10,10 +10,10 @@ from discord import Interaction
 | 
				
			|||||||
from discord.ext.commands import Context
 | 
					from discord.ext.commands import Context
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from bot_core.abc.message_service_abc import MessageServiceABC
 | 
					from bot_core.abc.message_service_abc import MessageServiceABC
 | 
				
			||||||
from bot_core.configuration.server_settings import ServerSettings
 | 
					 | 
				
			||||||
from bot_core.helper.log_message_helper import LogMessageHelper
 | 
					from bot_core.helper.log_message_helper import LogMessageHelper
 | 
				
			||||||
from bot_core.logging.message_logger import MessageLogger
 | 
					from bot_core.logging.message_logger import MessageLogger
 | 
				
			||||||
from bot_data.abc.client_repository_abc import ClientRepositoryABC
 | 
					from bot_data.abc.client_repository_abc import ClientRepositoryABC
 | 
				
			||||||
 | 
					from bot_data.model.server_config import ServerConfig
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class MessageService(MessageServiceABC):
 | 
					class MessageService(MessageServiceABC):
 | 
				
			||||||
@@ -33,7 +33,7 @@ class MessageService(MessageServiceABC):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    async def delete_messages(self, messages: List[discord.Message], guild_id: int, without_tracking=False):
 | 
					    async def delete_messages(self, messages: List[discord.Message], guild_id: int, without_tracking=False):
 | 
				
			||||||
        self._logger.debug(__name__, f"Try to delete {messages.count()} messages")
 | 
					        self._logger.debug(__name__, f"Try to delete {messages.count()} messages")
 | 
				
			||||||
        server_st: ServerSettings = self._config.get_configuration(f"ServerSettings_{guild_id}")
 | 
					        server_st: ServerConfig = self._config.get_configuration(f"ServerConfig_{guild_id}")
 | 
				
			||||||
        await asyncio.sleep(server_st.message_delete_timer)
 | 
					        await asyncio.sleep(server_st.message_delete_timer)
 | 
				
			||||||
        for message in messages:
 | 
					        for message in messages:
 | 
				
			||||||
            await self.delete_message(message, mass_delete=True, without_tracking=without_tracking)
 | 
					            await self.delete_message(message, mass_delete=True, without_tracking=without_tracking)
 | 
				
			||||||
@@ -50,7 +50,7 @@ class MessageService(MessageServiceABC):
 | 
				
			|||||||
            else None
 | 
					            else None
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        server_st: ServerSettings = self._config.get_configuration(f"ServerSettings_{guild_id}")
 | 
					        server_st: ServerConfig = self._config.get_configuration(f"ServerConfig_{guild_id}")
 | 
				
			||||||
        if not mass_delete:
 | 
					        if not mass_delete:
 | 
				
			||||||
            await asyncio.sleep(server_st.message_delete_timer)
 | 
					            await asyncio.sleep(server_st.message_delete_timer)
 | 
				
			||||||
        self._logger.debug(
 | 
					        self._logger.debug(
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@ __title__ = "bot_data"
 | 
				
			|||||||
__author__ = "Sven Heidemann"
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
__license__ = "MIT"
 | 
					__license__ = "MIT"
 | 
				
			||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
					__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
				
			||||||
__version__ = "1.0.6"
 | 
					__version__ = "1.1.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -23,4 +23,4 @@ from collections import namedtuple
 | 
				
			|||||||
# imports
 | 
					# imports
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="1", minor="0", micro="6")
 | 
					version_info = VersionInfo(major="1", minor="1", micro="1")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@ __title__ = "bot_data.abc"
 | 
				
			|||||||
__author__ = "Sven Heidemann"
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
__license__ = "MIT"
 | 
					__license__ = "MIT"
 | 
				
			||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
					__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
				
			||||||
__version__ = "1.0.6"
 | 
					__version__ = "1.1.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -23,4 +23,4 @@ from collections import namedtuple
 | 
				
			|||||||
# imports
 | 
					# imports
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="1", minor="0", micro="6")
 | 
					version_info = VersionInfo(major="1", minor="1", micro="1")
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										52
									
								
								kdb-bot/src/bot_data/abc/achievement_repository_abc.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								kdb-bot/src/bot_data/abc/achievement_repository_abc.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,52 @@
 | 
				
			|||||||
 | 
					from abc import ABC, abstractmethod
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from cpl_query.extension import List
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from bot_data.model.achievement import Achievement
 | 
				
			||||||
 | 
					from bot_data.model.user_got_achievement import UserGotAchievement
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class AchievementRepositoryABC(ABC):
 | 
				
			||||||
 | 
					    @abstractmethod
 | 
				
			||||||
 | 
					    def __init__(self):
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @abstractmethod
 | 
				
			||||||
 | 
					    def get_achievements(self) -> List[Achievement]:
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @abstractmethod
 | 
				
			||||||
 | 
					    def get_achievement_by_id(self, id: int) -> Achievement:
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @abstractmethod
 | 
				
			||||||
 | 
					    def get_achievements_by_server_id(self, server_id: int) -> List[Achievement]:
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @abstractmethod
 | 
				
			||||||
 | 
					    def get_achievements_by_user_id(self, user_id: int) -> List[Achievement]:
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @abstractmethod
 | 
				
			||||||
 | 
					    def get_user_got_achievements_by_achievement_id(self, achievement_id: int) -> List[Achievement]:
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @abstractmethod
 | 
				
			||||||
 | 
					    def add_achievement(self, achievement: Achievement):
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @abstractmethod
 | 
				
			||||||
 | 
					    def update_achievement(self, achievement: Achievement):
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @abstractmethod
 | 
				
			||||||
 | 
					    def delete_achievement(self, achievement: Achievement):
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @abstractmethod
 | 
				
			||||||
 | 
					    def add_user_got_achievement(self, join: UserGotAchievement):
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @abstractmethod
 | 
				
			||||||
 | 
					    def delete_user_got_achievement(self, join: UserGotAchievement):
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
@@ -7,5 +7,5 @@ class DataSeederABC(ABC):
 | 
				
			|||||||
        pass
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @abstractmethod
 | 
					    @abstractmethod
 | 
				
			||||||
    def seed(self):
 | 
					    async def seed(self):
 | 
				
			||||||
        pass
 | 
					        pass
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										59
									
								
								kdb-bot/src/bot_data/abc/server_config_repository_abc.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								kdb-bot/src/bot_data/abc/server_config_repository_abc.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,59 @@
 | 
				
			|||||||
 | 
					from abc import ABC, abstractmethod
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from bot_data.model.server_afk_channel_ids_config import ServerAFKChannelIdsConfig
 | 
				
			||||||
 | 
					from bot_data.model.server_config import ServerConfig
 | 
				
			||||||
 | 
					from bot_data.model.server_team_role_ids_config import ServerTeamRoleIdsConfig
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ServerConfigRepositoryABC(ABC):
 | 
				
			||||||
 | 
					    @abstractmethod
 | 
				
			||||||
 | 
					    def __init__(self):
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @abstractmethod
 | 
				
			||||||
 | 
					    def does_server_config_exists(self, server_id: int) -> bool:
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @abstractmethod
 | 
				
			||||||
 | 
					    def get_server_config_by_server(self, server_id: int) -> ServerConfig:
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @abstractmethod
 | 
				
			||||||
 | 
					    def get_server_config_by_id(self, config_id: int) -> ServerConfig:
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @abstractmethod
 | 
				
			||||||
 | 
					    def add_server_config(self, server_config: ServerConfig):
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @abstractmethod
 | 
				
			||||||
 | 
					    def update_server_config(self, server_config: ServerConfig):
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @abstractmethod
 | 
				
			||||||
 | 
					    def delete_server_config(self, server_config: ServerConfig):
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @abstractmethod
 | 
				
			||||||
 | 
					    def add_server_team_role_id_config(self, server_team_role_id: ServerTeamRoleIdsConfig):
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @abstractmethod
 | 
				
			||||||
 | 
					    def update_server_team_role_id_config(self, server_team_role_id: ServerTeamRoleIdsConfig):
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @abstractmethod
 | 
				
			||||||
 | 
					    def delete_server_team_role_id_config(self, server_team_role_id: ServerTeamRoleIdsConfig):
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @abstractmethod
 | 
				
			||||||
 | 
					    def add_server_afk_channel_config(self, server_afk_channel: ServerAFKChannelIdsConfig):
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @abstractmethod
 | 
				
			||||||
 | 
					    def update_server_afk_channel_config(self, server_afk_channel: ServerAFKChannelIdsConfig):
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @abstractmethod
 | 
				
			||||||
 | 
					    def delete_server_afk_channel_config(self, server_afk_channel: ServerAFKChannelIdsConfig):
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
							
								
								
									
										55
									
								
								kdb-bot/src/bot_data/abc/technician_config_repository_abc.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								kdb-bot/src/bot_data/abc/technician_config_repository_abc.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,55 @@
 | 
				
			|||||||
 | 
					from abc import ABC, abstractmethod
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from bot_data.model.technician_config import TechnicianConfig
 | 
				
			||||||
 | 
					from bot_data.model.technician_id_config import TechnicianIdConfig
 | 
				
			||||||
 | 
					from bot_data.model.technician_ping_url_config import TechnicianPingUrlConfig
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class TechnicianConfigRepositoryABC(ABC):
 | 
				
			||||||
 | 
					    @abstractmethod
 | 
				
			||||||
 | 
					    def __init__(self):
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @abstractmethod
 | 
				
			||||||
 | 
					    def does_technician_config_exists(self) -> bool:
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @abstractmethod
 | 
				
			||||||
 | 
					    def get_technician_config(self) -> TechnicianConfig:
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @abstractmethod
 | 
				
			||||||
 | 
					    def add_technician_config(self, technician_config: TechnicianConfig):
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @abstractmethod
 | 
				
			||||||
 | 
					    def update_technician_config(self, technician_config: TechnicianConfig):
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @abstractmethod
 | 
				
			||||||
 | 
					    def delete_technician_config(self, technician_config: TechnicianConfig):
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @abstractmethod
 | 
				
			||||||
 | 
					    def add_technician_id_config(self, technician_id: TechnicianIdConfig):
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @abstractmethod
 | 
				
			||||||
 | 
					    def update_technician_id_config(self, technician_id: TechnicianIdConfig):
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @abstractmethod
 | 
				
			||||||
 | 
					    def delete_technician_id_config(self, technician_id: TechnicianIdConfig):
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @abstractmethod
 | 
				
			||||||
 | 
					    def add_technician_ping_url_config(self, technician_ping_url: TechnicianPingUrlConfig):
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @abstractmethod
 | 
				
			||||||
 | 
					    def update_technician_ping_url_config(self, technician_ping_url: TechnicianPingUrlConfig):
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @abstractmethod
 | 
				
			||||||
 | 
					    def delete_technician_ping_url_config(self, technician_ping_url: TechnicianPingUrlConfig):
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
@@ -3,8 +3,8 @@
 | 
				
			|||||||
    "Name": "bot-data",
 | 
					    "Name": "bot-data",
 | 
				
			||||||
    "Version": {
 | 
					    "Version": {
 | 
				
			||||||
      "Major": "1",
 | 
					      "Major": "1",
 | 
				
			||||||
      "Minor": "0",
 | 
					      "Minor": "1",
 | 
				
			||||||
      "Micro": "6"
 | 
					      "Micro": "1"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "Author": "Sven Heidemann",
 | 
					    "Author": "Sven Heidemann",
 | 
				
			||||||
    "AuthorEmail": "sven.heidemann@sh-edraft.de",
 | 
					    "AuthorEmail": "sven.heidemann@sh-edraft.de",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,14 +5,18 @@ from cpl_discord.service.discord_collection_abc import DiscordCollectionABC
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
from bot_core.abc.module_abc import ModuleABC
 | 
					from bot_core.abc.module_abc import ModuleABC
 | 
				
			||||||
from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
 | 
					from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
 | 
				
			||||||
 | 
					from bot_data.abc.achievement_repository_abc import AchievementRepositoryABC
 | 
				
			||||||
from bot_data.abc.api_key_repository_abc import ApiKeyRepositoryABC
 | 
					from bot_data.abc.api_key_repository_abc import ApiKeyRepositoryABC
 | 
				
			||||||
from bot_data.abc.auth_user_repository_abc import AuthUserRepositoryABC
 | 
					from bot_data.abc.auth_user_repository_abc import AuthUserRepositoryABC
 | 
				
			||||||
from bot_data.abc.auto_role_repository_abc import AutoRoleRepositoryABC
 | 
					from bot_data.abc.auto_role_repository_abc import AutoRoleRepositoryABC
 | 
				
			||||||
from bot_data.abc.client_repository_abc import ClientRepositoryABC
 | 
					from bot_data.abc.client_repository_abc import ClientRepositoryABC
 | 
				
			||||||
 | 
					from bot_data.abc.data_seeder_abc import DataSeederABC
 | 
				
			||||||
from bot_data.abc.game_server_repository_abc import GameServerRepositoryABC
 | 
					from bot_data.abc.game_server_repository_abc import GameServerRepositoryABC
 | 
				
			||||||
from bot_data.abc.known_user_repository_abc import KnownUserRepositoryABC
 | 
					from bot_data.abc.known_user_repository_abc import KnownUserRepositoryABC
 | 
				
			||||||
from bot_data.abc.level_repository_abc import LevelRepositoryABC
 | 
					from bot_data.abc.level_repository_abc import LevelRepositoryABC
 | 
				
			||||||
 | 
					from bot_data.abc.server_config_repository_abc import ServerConfigRepositoryABC
 | 
				
			||||||
from bot_data.abc.server_repository_abc import ServerRepositoryABC
 | 
					from bot_data.abc.server_repository_abc import ServerRepositoryABC
 | 
				
			||||||
 | 
					from bot_data.abc.technician_config_repository_abc import TechnicianConfigRepositoryABC
 | 
				
			||||||
from bot_data.abc.user_game_ident_repository_abc import UserGameIdentRepositoryABC
 | 
					from bot_data.abc.user_game_ident_repository_abc import UserGameIdentRepositoryABC
 | 
				
			||||||
from bot_data.abc.user_joined_game_server_repository_abc import UserJoinedGameServerRepositoryABC
 | 
					from bot_data.abc.user_joined_game_server_repository_abc import UserJoinedGameServerRepositoryABC
 | 
				
			||||||
from bot_data.abc.user_joined_server_repository_abc import UserJoinedServerRepositoryABC
 | 
					from bot_data.abc.user_joined_server_repository_abc import UserJoinedServerRepositoryABC
 | 
				
			||||||
@@ -24,6 +28,7 @@ from bot_data.abc.user_message_count_per_hour_repository_abc import (
 | 
				
			|||||||
)
 | 
					)
 | 
				
			||||||
from bot_data.abc.user_repository_abc import UserRepositoryABC
 | 
					from bot_data.abc.user_repository_abc import UserRepositoryABC
 | 
				
			||||||
from bot_data.abc.user_warnings_repository_abc import UserWarningsRepositoryABC
 | 
					from bot_data.abc.user_warnings_repository_abc import UserWarningsRepositoryABC
 | 
				
			||||||
 | 
					from bot_data.service.achievements_repository_service import AchievementRepositoryService
 | 
				
			||||||
from bot_data.service.api_key_repository_service import ApiKeyRepositoryService
 | 
					from bot_data.service.api_key_repository_service import ApiKeyRepositoryService
 | 
				
			||||||
from bot_data.service.auth_user_repository_service import AuthUserRepositoryService
 | 
					from bot_data.service.auth_user_repository_service import AuthUserRepositoryService
 | 
				
			||||||
from bot_data.service.auto_role_repository_service import AutoRoleRepositoryService
 | 
					from bot_data.service.auto_role_repository_service import AutoRoleRepositoryService
 | 
				
			||||||
@@ -33,7 +38,11 @@ from bot_data.service.game_server_repository_service import GameServerRepository
 | 
				
			|||||||
from bot_data.service.known_user_repository_service import KnownUserRepositoryService
 | 
					from bot_data.service.known_user_repository_service import KnownUserRepositoryService
 | 
				
			||||||
from bot_data.service.level_repository_service import LevelRepositoryService
 | 
					from bot_data.service.level_repository_service import LevelRepositoryService
 | 
				
			||||||
from bot_data.service.seeder_service import SeederService
 | 
					from bot_data.service.seeder_service import SeederService
 | 
				
			||||||
 | 
					from bot_data.service.server_config_repository_service import ServerConfigRepositoryService
 | 
				
			||||||
 | 
					from bot_data.service.server_config_seeder import ServerConfigSeeder
 | 
				
			||||||
from bot_data.service.server_repository_service import ServerRepositoryService
 | 
					from bot_data.service.server_repository_service import ServerRepositoryService
 | 
				
			||||||
 | 
					from bot_data.service.technician_config_repository_service import TechnicianConfigRepositoryService
 | 
				
			||||||
 | 
					from bot_data.service.technician_config_seeder import TechnicianConfigSeeder
 | 
				
			||||||
from bot_data.service.user_game_ident_repository_service import UserGameIdentRepositoryService
 | 
					from bot_data.service.user_game_ident_repository_service import UserGameIdentRepositoryService
 | 
				
			||||||
from bot_data.service.user_joined_game_server_repository_service import UserJoinedGameServerRepositoryService
 | 
					from bot_data.service.user_joined_game_server_repository_service import UserJoinedGameServerRepositoryService
 | 
				
			||||||
from bot_data.service.user_joined_server_repository_service import (
 | 
					from bot_data.service.user_joined_server_repository_service import (
 | 
				
			||||||
@@ -77,5 +86,10 @@ class DataModule(ModuleABC):
 | 
				
			|||||||
        )
 | 
					        )
 | 
				
			||||||
        services.add_transient(GameServerRepositoryABC, GameServerRepositoryService)
 | 
					        services.add_transient(GameServerRepositoryABC, GameServerRepositoryService)
 | 
				
			||||||
        services.add_transient(UserGameIdentRepositoryABC, UserGameIdentRepositoryService)
 | 
					        services.add_transient(UserGameIdentRepositoryABC, UserGameIdentRepositoryService)
 | 
				
			||||||
 | 
					        services.add_transient(AchievementRepositoryABC, AchievementRepositoryService)
 | 
				
			||||||
 | 
					        services.add_transient(TechnicianConfigRepositoryABC, TechnicianConfigRepositoryService)
 | 
				
			||||||
 | 
					        services.add_transient(ServerConfigRepositoryABC, ServerConfigRepositoryService)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        services.add_transient(SeederService)
 | 
					        services.add_transient(SeederService)
 | 
				
			||||||
 | 
					        services.add_transient(DataSeederABC, TechnicianConfigSeeder)
 | 
				
			||||||
 | 
					        services.add_transient(DataSeederABC, ServerConfigSeeder)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,6 +11,7 @@ class DBContext(DatabaseContext):
 | 
				
			|||||||
        self._logger = logger
 | 
					        self._logger = logger
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        DatabaseContext.__init__(self)
 | 
					        DatabaseContext.__init__(self)
 | 
				
			||||||
 | 
					        self._fails = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def connect(self, database_settings: DatabaseSettings):
 | 
					    def connect(self, database_settings: DatabaseSettings):
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
@@ -32,7 +33,11 @@ class DBContext(DatabaseContext):
 | 
				
			|||||||
        try:
 | 
					        try:
 | 
				
			||||||
            return super(DBContext, self).select(statement)
 | 
					            return super(DBContext, self).select(statement)
 | 
				
			||||||
        except Exception as e:
 | 
					        except Exception as e:
 | 
				
			||||||
 | 
					            if self._fails >= 3:
 | 
				
			||||||
 | 
					                self._logger.fatal(__name__, f"Database error caused by {statement}", e)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            self._logger.error(__name__, f"Database error caused by {statement}", e)
 | 
					            self._logger.error(__name__, f"Database error caused by {statement}", e)
 | 
				
			||||||
 | 
					            self._fails += 1
 | 
				
			||||||
            try:
 | 
					            try:
 | 
				
			||||||
                time.sleep(0.5)
 | 
					                time.sleep(0.5)
 | 
				
			||||||
                return self.select(statement)
 | 
					                return self.select(statement)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@ __title__ = "bot_data.migration"
 | 
				
			|||||||
__author__ = "Sven Heidemann"
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
__license__ = "MIT"
 | 
					__license__ = "MIT"
 | 
				
			||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
					__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
				
			||||||
__version__ = "1.0.6"
 | 
					__version__ = "1.1.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -23,4 +23,4 @@ from collections import namedtuple
 | 
				
			|||||||
# imports
 | 
					# imports
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="1", minor="0", micro="6")
 | 
					version_info = VersionInfo(major="1", minor="1", micro="1")
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										127
									
								
								kdb-bot/src/bot_data/migration/achievements_migration.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										127
									
								
								kdb-bot/src/bot_data/migration/achievements_migration.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,127 @@
 | 
				
			|||||||
 | 
					from bot_core.logging.database_logger import DatabaseLogger
 | 
				
			||||||
 | 
					from bot_data.abc.migration_abc import MigrationABC
 | 
				
			||||||
 | 
					from bot_data.db_context import DBContext
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class AchievementsMigration(MigrationABC):
 | 
				
			||||||
 | 
					    name = "1.1.0_AchievementsMigration"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __init__(self, logger: DatabaseLogger, db: DBContext):
 | 
				
			||||||
 | 
					        MigrationABC.__init__(self)
 | 
				
			||||||
 | 
					        self._logger = logger
 | 
				
			||||||
 | 
					        self._db = db
 | 
				
			||||||
 | 
					        self._cursor = db.cursor
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def upgrade(self):
 | 
				
			||||||
 | 
					        self._logger.debug(__name__, "Running upgrade")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self._cursor.execute(
 | 
				
			||||||
 | 
					            str(
 | 
				
			||||||
 | 
					                f"""
 | 
				
			||||||
 | 
					                    CREATE TABLE IF NOT EXISTS `Achievements` (
 | 
				
			||||||
 | 
					                        `Id` BIGINT NOT NULL AUTO_INCREMENT,
 | 
				
			||||||
 | 
					                        `Name` VARCHAR(255) NOT NULL,
 | 
				
			||||||
 | 
					                        `Description` VARCHAR(255) NOT NULL,
 | 
				
			||||||
 | 
					                        `Attribute` VARCHAR(255) NOT NULL,
 | 
				
			||||||
 | 
					                        `Operator` VARCHAR(255) NOT NULL,
 | 
				
			||||||
 | 
					                        `Value` VARCHAR(255) NOT NULL,
 | 
				
			||||||
 | 
					                        `ServerId` BIGINT,
 | 
				
			||||||
 | 
					                        `CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6),
 | 
				
			||||||
 | 
					                        `LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
 | 
				
			||||||
 | 
					                        PRIMARY KEY(`Id`),
 | 
				
			||||||
 | 
					                        FOREIGN KEY (`ServerId`) REFERENCES `Servers`(`ServerId`)
 | 
				
			||||||
 | 
					                    );
 | 
				
			||||||
 | 
					                """
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self._cursor.execute(
 | 
				
			||||||
 | 
					            str(
 | 
				
			||||||
 | 
					                f"""
 | 
				
			||||||
 | 
					                    CREATE TABLE IF NOT EXISTS `AchievementsHistory`
 | 
				
			||||||
 | 
					                    (
 | 
				
			||||||
 | 
					                        `Id`    BIGINT(20)  NOT NULL,
 | 
				
			||||||
 | 
					                        `Name` VARCHAR(255) NOT NULL,
 | 
				
			||||||
 | 
					                        `Description` VARCHAR(255) NOT NULL,
 | 
				
			||||||
 | 
					                        `Attribute` VARCHAR(255) NOT NULL,
 | 
				
			||||||
 | 
					                        `Operator` VARCHAR(255) NOT NULL,
 | 
				
			||||||
 | 
					                        `Value` VARCHAR(255) NOT NULL,
 | 
				
			||||||
 | 
					                        `ServerId` BIGINT,
 | 
				
			||||||
 | 
					                        `Deleted`   BOOL DEFAULT FALSE,
 | 
				
			||||||
 | 
					                        `DateFrom`  DATETIME(6) NOT NULL,
 | 
				
			||||||
 | 
					                        `DateTo`    DATETIME(6) NOT NULL
 | 
				
			||||||
 | 
					                    );
 | 
				
			||||||
 | 
					                """
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self._cursor.execute(
 | 
				
			||||||
 | 
					            str(
 | 
				
			||||||
 | 
					                f"""
 | 
				
			||||||
 | 
					                    CREATE TABLE IF NOT EXISTS `UserGotAchievements` (
 | 
				
			||||||
 | 
					                        `Id` BIGINT NOT NULL AUTO_INCREMENT,
 | 
				
			||||||
 | 
					                        `UserId` BIGINT,
 | 
				
			||||||
 | 
					                        `AchievementId` BIGINT,
 | 
				
			||||||
 | 
					                        `CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6),
 | 
				
			||||||
 | 
					                        `LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
 | 
				
			||||||
 | 
					                        PRIMARY KEY(`Id`),
 | 
				
			||||||
 | 
					                        FOREIGN KEY (`UserId`) REFERENCES `Users`(`UserId`),
 | 
				
			||||||
 | 
					                        FOREIGN KEY (`AchievementId`) REFERENCES `Achievements`(`Id`)
 | 
				
			||||||
 | 
					                    );
 | 
				
			||||||
 | 
					                """
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # A join table history between users and achievements is not necessary.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self._cursor.execute(str(f"""ALTER TABLE Users ADD MessageCount BIGINT NOT NULL DEFAULT 0 AFTER XP;"""))
 | 
				
			||||||
 | 
					        self._cursor.execute(str(f"""ALTER TABLE Users ADD ReactionCount BIGINT NOT NULL DEFAULT 0 AFTER XP;"""))
 | 
				
			||||||
 | 
					        self._cursor.execute(str(f"""ALTER TABLE UsersHistory ADD MessageCount BIGINT NOT NULL DEFAULT 0 AFTER XP;"""))
 | 
				
			||||||
 | 
					        self._cursor.execute(str(f"""ALTER TABLE UsersHistory ADD ReactionCount BIGINT NOT NULL DEFAULT 0 AFTER XP;"""))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self._cursor.execute(str(f"""DROP TRIGGER IF EXISTS `TR_AchievementsUpdate`;"""))
 | 
				
			||||||
 | 
					        self._cursor.execute(
 | 
				
			||||||
 | 
					            str(
 | 
				
			||||||
 | 
					                f"""
 | 
				
			||||||
 | 
					                    CREATE TRIGGER `TR_AchievementsUpdate`
 | 
				
			||||||
 | 
					                        AFTER UPDATE
 | 
				
			||||||
 | 
					                        ON `Achievements`
 | 
				
			||||||
 | 
					                        FOR EACH ROW
 | 
				
			||||||
 | 
					                    BEGIN
 | 
				
			||||||
 | 
					                        INSERT INTO `AchievementsHistory` (
 | 
				
			||||||
 | 
					                            `Id`, `Name`, `Description`, `Attribute`, `Operator`, `Value`, `ServerId`, `DateFrom`, `DateTo`
 | 
				
			||||||
 | 
					                        )
 | 
				
			||||||
 | 
					                        VALUES (
 | 
				
			||||||
 | 
					                            OLD.Id, OLD.Name, OLD.Description, OLD.Attribute, OLD.Operator, OLD.Value, OLD.ServerId, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6)
 | 
				
			||||||
 | 
					                        );
 | 
				
			||||||
 | 
					                    END;
 | 
				
			||||||
 | 
					                """
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self._cursor.execute(str(f"""DROP TRIGGER IF EXISTS `TR_AchievementsDelete`;"""))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self._cursor.execute(
 | 
				
			||||||
 | 
					            str(
 | 
				
			||||||
 | 
					                f"""
 | 
				
			||||||
 | 
					                    CREATE TRIGGER `TR_AchievementsDelete`
 | 
				
			||||||
 | 
					                        AFTER DELETE
 | 
				
			||||||
 | 
					                        ON `Achievements`
 | 
				
			||||||
 | 
					                        FOR EACH ROW
 | 
				
			||||||
 | 
					                    BEGIN
 | 
				
			||||||
 | 
					                        INSERT INTO `AchievementsHistory` (
 | 
				
			||||||
 | 
					                            `Id`, `Name`, `Description`, `Attribute`, `Operator`, `Value`, `ServerId`, `Deleted`, `DateFrom`, `DateTo`
 | 
				
			||||||
 | 
					                        )
 | 
				
			||||||
 | 
					                        VALUES (
 | 
				
			||||||
 | 
					                            OLD.Id, OLD.Name, OLD.Description, OLD.Attribute, OLD.Operator, OLD.Value, OLD.ServerId, TRUE, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6)
 | 
				
			||||||
 | 
					                        );
 | 
				
			||||||
 | 
					                    END;
 | 
				
			||||||
 | 
					                """
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def downgrade(self):
 | 
				
			||||||
 | 
					        self._cursor.execute("DROP TABLE `Achievements`;")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self._cursor.execute(str(f"""ALTER TABLE Users DROP COLUMN MessageCount;"""))
 | 
				
			||||||
 | 
					        self._cursor.execute(str(f"""ALTER TABLE Users DROP COLUMN ReactionCount;"""))
 | 
				
			||||||
@@ -0,0 +1,29 @@
 | 
				
			|||||||
 | 
					from bot_core.logging.database_logger import DatabaseLogger
 | 
				
			||||||
 | 
					from bot_data.abc.migration_abc import MigrationABC
 | 
				
			||||||
 | 
					from bot_data.db_context import DBContext
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ConfigFeatureFlagsMigration(MigrationABC):
 | 
				
			||||||
 | 
					    name = "1.1.0_ConfigFeatureFlagsMigration"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __init__(self, logger: DatabaseLogger, db: DBContext):
 | 
				
			||||||
 | 
					        MigrationABC.__init__(self)
 | 
				
			||||||
 | 
					        self._logger = logger
 | 
				
			||||||
 | 
					        self._db = db
 | 
				
			||||||
 | 
					        self._cursor = db.cursor
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def upgrade(self):
 | 
				
			||||||
 | 
					        self._logger.debug(__name__, "Running upgrade")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self._cursor.execute(
 | 
				
			||||||
 | 
					            str("""ALTER TABLE CFG_Technician ADD FeatureFlags JSON NULL DEFAULT ('{}') AFTER CacheMaxMessages;""")
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self._cursor.execute(
 | 
				
			||||||
 | 
					            str("""ALTER TABLE CFG_Server ADD FeatureFlags JSON NULL DEFAULT ('{}') AFTER LoginMessageChannelId;""")
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def downgrade(self):
 | 
				
			||||||
 | 
					        self._logger.debug(__name__, "Running downgrade")
 | 
				
			||||||
 | 
					        self._cursor.execute("ALTER TABLE CFG_Technician DROP COLUMN FeatureFlags;")
 | 
				
			||||||
 | 
					        self._cursor.execute("ALTER TABLE CFG_Server DROP COLUMN FeatureFlags;")
 | 
				
			||||||
							
								
								
									
										155
									
								
								kdb-bot/src/bot_data/migration/config_migration.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										155
									
								
								kdb-bot/src/bot_data/migration/config_migration.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,155 @@
 | 
				
			|||||||
 | 
					import os
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from bot_core.logging.database_logger import DatabaseLogger
 | 
				
			||||||
 | 
					from bot_data.abc.migration_abc import MigrationABC
 | 
				
			||||||
 | 
					from bot_data.db_context import DBContext
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ConfigMigration(MigrationABC):
 | 
				
			||||||
 | 
					    name = "1.1.0_ConfigMigration"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __init__(self, logger: DatabaseLogger, db: DBContext):
 | 
				
			||||||
 | 
					        MigrationABC.__init__(self)
 | 
				
			||||||
 | 
					        self._logger = logger
 | 
				
			||||||
 | 
					        self._db = db
 | 
				
			||||||
 | 
					        self._cursor = db.cursor
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def _exec(self, file: str):
 | 
				
			||||||
 | 
					        path = f"{os.path.dirname(os.path.realpath(__file__))}/db_history_scripts"
 | 
				
			||||||
 | 
					        sql = open(f"{path}/{file}").read()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for statement in sql.split("\n\n"):
 | 
				
			||||||
 | 
					            self._cursor.execute(statement + ";")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def upgrade(self):
 | 
				
			||||||
 | 
					        self._logger.debug(__name__, "Running upgrade")
 | 
				
			||||||
 | 
					        self._server_upgrade()
 | 
				
			||||||
 | 
					        self._technician_upgrade()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self._exec("config/server.sql")
 | 
				
			||||||
 | 
					        self._exec("config/server_afk_channels.sql")
 | 
				
			||||||
 | 
					        self._exec("config/server_team_roles.sql")
 | 
				
			||||||
 | 
					        self._exec("config/technician.sql")
 | 
				
			||||||
 | 
					        self._exec("config/technician_ids.sql")
 | 
				
			||||||
 | 
					        self._exec("config/technician_ping_urls.sql")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def _server_upgrade(self):
 | 
				
			||||||
 | 
					        self._cursor.execute(
 | 
				
			||||||
 | 
					            str(
 | 
				
			||||||
 | 
					                f"""
 | 
				
			||||||
 | 
					                    CREATE TABLE IF NOT EXISTS `CFG_Server` (
 | 
				
			||||||
 | 
					                        `Id` BIGINT NOT NULL AUTO_INCREMENT,
 | 
				
			||||||
 | 
					                        `MessageDeleteTimer` BIGINT NOT NULL DEFAULT 6,
 | 
				
			||||||
 | 
					                        `NotificationChatId` BIGINT NOT NULL,
 | 
				
			||||||
 | 
					                        `MaxVoiceStateHours` BIGINT NOT NULL DEFAULT 6,
 | 
				
			||||||
 | 
					                        `XpPerMessage` BIGINT NOT NULL DEFAULT 1,
 | 
				
			||||||
 | 
					                        `XpPerReaction` BIGINT NOT NULL DEFAULT 1,
 | 
				
			||||||
 | 
					                        `MaxMessageXpPerHour` BIGINT NOT NULL DEFAULT 20,
 | 
				
			||||||
 | 
					                        `XpPerOntimeHour` BIGINT NOT NULL DEFAULT 10,
 | 
				
			||||||
 | 
					                        `XpPerEventParticipation` BIGINT NOT NULL DEFAULT 10,
 | 
				
			||||||
 | 
					                        `XpPerAchievement` BIGINT NOT NULL DEFAULT 10,
 | 
				
			||||||
 | 
					                        `AFKCommandChannelId` BIGINT NOT NULL,
 | 
				
			||||||
 | 
					                        `HelpVoiceChannelId` BIGINT NOT NULL,
 | 
				
			||||||
 | 
					                        `TeamChannelId` BIGINT NOT NULL,
 | 
				
			||||||
 | 
					                        `LoginMessageChannelId` BIGINT NOT NULL,
 | 
				
			||||||
 | 
					                        `ServerId` BIGINT NOT NULL,
 | 
				
			||||||
 | 
					                        `CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6),
 | 
				
			||||||
 | 
					                        `LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
 | 
				
			||||||
 | 
					                        PRIMARY KEY(`Id`),
 | 
				
			||||||
 | 
					                        FOREIGN KEY (`ServerId`) REFERENCES `Servers`(`ServerId`)
 | 
				
			||||||
 | 
					                    );
 | 
				
			||||||
 | 
					                """
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self._cursor.execute(
 | 
				
			||||||
 | 
					            str(
 | 
				
			||||||
 | 
					                f"""
 | 
				
			||||||
 | 
					                    CREATE TABLE IF NOT EXISTS `CFG_ServerAFKChannelIds` (
 | 
				
			||||||
 | 
					                        `Id` BIGINT NOT NULL AUTO_INCREMENT,
 | 
				
			||||||
 | 
					                        `ChannelId` BIGINT NOT NULL,
 | 
				
			||||||
 | 
					                        `ServerId` BIGINT NOT NULL,
 | 
				
			||||||
 | 
					                        `CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6),
 | 
				
			||||||
 | 
					                        `LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
 | 
				
			||||||
 | 
					                        PRIMARY KEY(`Id`),
 | 
				
			||||||
 | 
					                        FOREIGN KEY (`ServerId`) REFERENCES `Servers`(`ServerId`)
 | 
				
			||||||
 | 
					                    );
 | 
				
			||||||
 | 
					                """
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self._cursor.execute(
 | 
				
			||||||
 | 
					            str(
 | 
				
			||||||
 | 
					                f"""
 | 
				
			||||||
 | 
					                    CREATE TABLE IF NOT EXISTS `CFG_ServerTeamRoleIds` (
 | 
				
			||||||
 | 
					                        `Id` BIGINT NOT NULL AUTO_INCREMENT,
 | 
				
			||||||
 | 
					                        `RoleId` BIGINT NOT NULL,
 | 
				
			||||||
 | 
					                        `TeamMemberType` ENUM('Moderator', 'Admin') NOT NULL,
 | 
				
			||||||
 | 
					                        `ServerId` BIGINT NOT NULL,
 | 
				
			||||||
 | 
					                        `CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6),
 | 
				
			||||||
 | 
					                        `LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
 | 
				
			||||||
 | 
					                        PRIMARY KEY(`Id`),
 | 
				
			||||||
 | 
					                        FOREIGN KEY (`ServerId`) REFERENCES `Servers`(`ServerId`)
 | 
				
			||||||
 | 
					                    );
 | 
				
			||||||
 | 
					                """
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def _technician_upgrade(self):
 | 
				
			||||||
 | 
					        self._cursor.execute(
 | 
				
			||||||
 | 
					            str(
 | 
				
			||||||
 | 
					                f"""
 | 
				
			||||||
 | 
					                    CREATE TABLE IF NOT EXISTS `CFG_Technician` (
 | 
				
			||||||
 | 
					                        `Id` BIGINT NOT NULL AUTO_INCREMENT,
 | 
				
			||||||
 | 
					                        `HelpCommandReferenceUrl` VARCHAR(255) NOT NULL,
 | 
				
			||||||
 | 
					                        `WaitForRestart` BIGINT NOT NULL DEFAULT 8,
 | 
				
			||||||
 | 
					                        `WaitForShutdown` BIGINT NOT NULL DEFAULT 8,
 | 
				
			||||||
 | 
					                        `CacheMaxMessages` BIGINT NOT NULL DEFAULT 1000000,
 | 
				
			||||||
 | 
					                        `CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6),
 | 
				
			||||||
 | 
					                        `LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
 | 
				
			||||||
 | 
					                        PRIMARY KEY(`Id`)
 | 
				
			||||||
 | 
					                    );
 | 
				
			||||||
 | 
					                """
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self._cursor.execute(
 | 
				
			||||||
 | 
					            str(
 | 
				
			||||||
 | 
					                f"""
 | 
				
			||||||
 | 
					                    CREATE TABLE IF NOT EXISTS `CFG_TechnicianPingUrls` (
 | 
				
			||||||
 | 
					                        `Id` BIGINT NOT NULL AUTO_INCREMENT,
 | 
				
			||||||
 | 
					                        `URL` VARCHAR(255) NOT NULL,
 | 
				
			||||||
 | 
					                        `CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6),
 | 
				
			||||||
 | 
					                        `LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
 | 
				
			||||||
 | 
					                        PRIMARY KEY(`Id`)
 | 
				
			||||||
 | 
					                    );
 | 
				
			||||||
 | 
					                """
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self._cursor.execute(
 | 
				
			||||||
 | 
					            str(
 | 
				
			||||||
 | 
					                f"""
 | 
				
			||||||
 | 
					                    CREATE TABLE IF NOT EXISTS `CFG_TechnicianIds` (
 | 
				
			||||||
 | 
					                        `Id` BIGINT NOT NULL AUTO_INCREMENT,
 | 
				
			||||||
 | 
					                        `TechnicianId` BIGINT NOT NULL,
 | 
				
			||||||
 | 
					                        `CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6),
 | 
				
			||||||
 | 
					                        `LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
 | 
				
			||||||
 | 
					                        PRIMARY KEY(`Id`)
 | 
				
			||||||
 | 
					                    );
 | 
				
			||||||
 | 
					                """
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def downgrade(self):
 | 
				
			||||||
 | 
					        self._logger.debug(__name__, "Running downgrade")
 | 
				
			||||||
 | 
					        self._server_downgrade()
 | 
				
			||||||
 | 
					        self._technician_downgrade()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def _server_downgrade(self):
 | 
				
			||||||
 | 
					        self._cursor.execute("DROP TABLE `CFG_Server`;")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def _technician_downgrade(self):
 | 
				
			||||||
 | 
					        self._cursor.execute("DROP TABLE `CFG_Technician`;")
 | 
				
			||||||
 | 
					        self._cursor.execute("DROP TABLE `CFG_TechnicianPingUrls`;")
 | 
				
			||||||
 | 
					        self._cursor.execute("DROP TABLE `CFG_TechnicianIds`;")
 | 
				
			||||||
@@ -0,0 +1,117 @@
 | 
				
			|||||||
 | 
					CREATE TABLE IF NOT EXISTS `CFG_ServerHistory`
 | 
				
			||||||
 | 
					(
 | 
				
			||||||
 | 
					    `Id`    BIGINT(20)  NOT NULL,
 | 
				
			||||||
 | 
					    `MessageDeleteTimer` BIGINT NOT NULL DEFAULT 6,
 | 
				
			||||||
 | 
					    `NotificationChatId` BIGINT NOT NULL,
 | 
				
			||||||
 | 
					    `MaxVoiceStateHours` BIGINT NOT NULL DEFAULT 6,
 | 
				
			||||||
 | 
					    `XpPerMessage` BIGINT NOT NULL DEFAULT 1,
 | 
				
			||||||
 | 
					    `XpPerReaction` BIGINT NOT NULL DEFAULT 1,
 | 
				
			||||||
 | 
					    `MaxMessageXpPerHour` BIGINT NOT NULL DEFAULT 20,
 | 
				
			||||||
 | 
					    `XpPerOntimeHour` BIGINT NOT NULL DEFAULT 10,
 | 
				
			||||||
 | 
					    `XpPerEventParticipation` BIGINT NOT NULL DEFAULT 10,
 | 
				
			||||||
 | 
					    `XpPerAchievement` BIGINT NOT NULL DEFAULT 10,
 | 
				
			||||||
 | 
					    `AFKCommandChannelId` BIGINT NOT NULL,
 | 
				
			||||||
 | 
					    `HelpVoiceChannelId` BIGINT NOT NULL,
 | 
				
			||||||
 | 
					    `TeamChannelId` BIGINT NOT NULL,
 | 
				
			||||||
 | 
					    `LoginMessageChannelId` BIGINT NOT NULL,
 | 
				
			||||||
 | 
					    `ServerId` BIGINT NOT NULL,
 | 
				
			||||||
 | 
					    `Deleted` BOOL DEFAULT FALSE,
 | 
				
			||||||
 | 
					    `DateFrom` DATETIME(6) NOT NULL,
 | 
				
			||||||
 | 
					    `DateTo` DATETIME(6) NOT NULL
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DROP TRIGGER IF EXISTS `TR_CFG_ServerUpdate`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TRIGGER `TR_CFG_ServerUpdate`
 | 
				
			||||||
 | 
					    AFTER UPDATE
 | 
				
			||||||
 | 
					    ON `CFG_Server`
 | 
				
			||||||
 | 
					    FOR EACH ROW
 | 
				
			||||||
 | 
					BEGIN
 | 
				
			||||||
 | 
					    INSERT INTO `CFG_ServerHistory` (
 | 
				
			||||||
 | 
					        `Id`,
 | 
				
			||||||
 | 
					        `MessageDeleteTimer`,
 | 
				
			||||||
 | 
					        `NotificationChatId`,
 | 
				
			||||||
 | 
					        `MaxVoiceStateHours`,
 | 
				
			||||||
 | 
					        `XpPerMessage`,
 | 
				
			||||||
 | 
					        `XpPerReaction`,
 | 
				
			||||||
 | 
					        `MaxMessageXpPerHour`,
 | 
				
			||||||
 | 
					        `XpPerOntimeHour`,
 | 
				
			||||||
 | 
					        `XpPerEventParticipation`,
 | 
				
			||||||
 | 
					        `XpPerAchievement`,
 | 
				
			||||||
 | 
					        `AFKCommandChannelId`,
 | 
				
			||||||
 | 
					        `HelpVoiceChannelId`,
 | 
				
			||||||
 | 
					        `TeamChannelId`,
 | 
				
			||||||
 | 
					        `LoginMessageChannelId`,
 | 
				
			||||||
 | 
					        `ServerId`,
 | 
				
			||||||
 | 
					        `DateFrom`,
 | 
				
			||||||
 | 
					        `DateTo`
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    VALUES (
 | 
				
			||||||
 | 
					        OLD.Id,
 | 
				
			||||||
 | 
					        OLD.MessageDeleteTimer,
 | 
				
			||||||
 | 
					        OLD.NotificationChatId,
 | 
				
			||||||
 | 
					        OLD.MaxVoiceStateHours,
 | 
				
			||||||
 | 
					        OLD.XpPerMessage,
 | 
				
			||||||
 | 
					        OLD.XpPerReaction,
 | 
				
			||||||
 | 
					        OLD.MaxMessageXpPerHour,
 | 
				
			||||||
 | 
					        OLD.XpPerOntimeHour,
 | 
				
			||||||
 | 
					        OLD.XpPerEventParticipation,
 | 
				
			||||||
 | 
					        OLD.XpPerAchievement,
 | 
				
			||||||
 | 
					        OLD.AFKCommandChannelId,
 | 
				
			||||||
 | 
					        OLD.HelpVoiceChannelId,
 | 
				
			||||||
 | 
					        OLD.TeamChannelId,
 | 
				
			||||||
 | 
					        OLD.LoginMessageChannelId,
 | 
				
			||||||
 | 
					        OLD.ServerId,
 | 
				
			||||||
 | 
					        OLD.LastModifiedAt,
 | 
				
			||||||
 | 
					        CURRENT_TIMESTAMP(6)
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					END;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DROP TRIGGER IF EXISTS `TR_CFG_ServerDelete`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TRIGGER `TR_CFG_ServerDelete`
 | 
				
			||||||
 | 
					    AFTER DELETE
 | 
				
			||||||
 | 
					    ON `CFG_Server`
 | 
				
			||||||
 | 
					    FOR EACH ROW
 | 
				
			||||||
 | 
					BEGIN
 | 
				
			||||||
 | 
					    INSERT INTO `CFG_ServerHistory` (
 | 
				
			||||||
 | 
					        `Id`,
 | 
				
			||||||
 | 
					        `MessageDeleteTimer`,
 | 
				
			||||||
 | 
					        `NotificationChatId`,
 | 
				
			||||||
 | 
					        `MaxVoiceStateHours`,
 | 
				
			||||||
 | 
					        `XpPerMessage`,
 | 
				
			||||||
 | 
					        `XpPerReaction`,
 | 
				
			||||||
 | 
					        `MaxMessageXpPerHour`,
 | 
				
			||||||
 | 
					        `XpPerOntimeHour`,
 | 
				
			||||||
 | 
					        `XpPerEventParticipation`,
 | 
				
			||||||
 | 
					        `XpPerAchievement`,
 | 
				
			||||||
 | 
					        `AFKCommandChannelId`,
 | 
				
			||||||
 | 
					        `HelpVoiceChannelId`,
 | 
				
			||||||
 | 
					        `TeamChannelId`,
 | 
				
			||||||
 | 
					        `LoginMessageChannelId`,
 | 
				
			||||||
 | 
					        `ServerId`,
 | 
				
			||||||
 | 
					        `Deleted`,
 | 
				
			||||||
 | 
					        `DateFrom`,
 | 
				
			||||||
 | 
					        `DateTo`
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    VALUES (
 | 
				
			||||||
 | 
					        OLD.Id,
 | 
				
			||||||
 | 
					        OLD.MessageDeleteTimer,
 | 
				
			||||||
 | 
					        OLD.NotificationChatId,
 | 
				
			||||||
 | 
					        OLD.MaxVoiceStateHours,
 | 
				
			||||||
 | 
					        OLD.XpPerMessage,
 | 
				
			||||||
 | 
					        OLD.XpPerReaction,
 | 
				
			||||||
 | 
					        OLD.MaxMessageXpPerHour,
 | 
				
			||||||
 | 
					        OLD.XpPerOntimeHour,
 | 
				
			||||||
 | 
					        OLD.XpPerEventParticipation,
 | 
				
			||||||
 | 
					        OLD.XpPerAchievement,
 | 
				
			||||||
 | 
					        OLD.AFKCommandChannelId,
 | 
				
			||||||
 | 
					        OLD.HelpVoiceChannelId,
 | 
				
			||||||
 | 
					        OLD.TeamChannelId,
 | 
				
			||||||
 | 
					        OLD.LoginMessageChannelId,
 | 
				
			||||||
 | 
					        OLD.ServerId,
 | 
				
			||||||
 | 
					        TRUE,
 | 
				
			||||||
 | 
					        OLD.LastModifiedAt,
 | 
				
			||||||
 | 
					        CURRENT_TIMESTAMP(6)
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					END;
 | 
				
			||||||
@@ -0,0 +1,57 @@
 | 
				
			|||||||
 | 
					CREATE TABLE IF NOT EXISTS `CFG_ServerAFKChannelIdsHistory`
 | 
				
			||||||
 | 
					(
 | 
				
			||||||
 | 
					    `Id`    BIGINT(20)  NOT NULL,
 | 
				
			||||||
 | 
					    `ChannelId` BIGINT NOT NULL,
 | 
				
			||||||
 | 
					    `ServerId` BIGINT NOT NULL,
 | 
				
			||||||
 | 
					    `Deleted` BOOL DEFAULT FALSE,
 | 
				
			||||||
 | 
					    `DateFrom` DATETIME(6) NOT NULL,
 | 
				
			||||||
 | 
					    `DateTo` DATETIME(6) NOT NULL
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DROP TRIGGER IF EXISTS `TR_CFG_ServerAFKChannelIdsUpdate`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TRIGGER `TR_CFG_ServerAFKChannelIdsUpdate`
 | 
				
			||||||
 | 
					    AFTER UPDATE
 | 
				
			||||||
 | 
					    ON `CFG_ServerAFKChannelIds`
 | 
				
			||||||
 | 
					    FOR EACH ROW
 | 
				
			||||||
 | 
					BEGIN
 | 
				
			||||||
 | 
					    INSERT INTO `CFG_ServerAFKChannelIdsHistory` (
 | 
				
			||||||
 | 
					        `Id`,
 | 
				
			||||||
 | 
					        `ChannelId`,
 | 
				
			||||||
 | 
					        `ServerId`,
 | 
				
			||||||
 | 
					        `DateFrom`,
 | 
				
			||||||
 | 
					        `DateTo`
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    VALUES (
 | 
				
			||||||
 | 
					        OLD.Id,
 | 
				
			||||||
 | 
					        OLD.ChannelId,
 | 
				
			||||||
 | 
					        OLD.ServerId,
 | 
				
			||||||
 | 
					        OLD.LastModifiedAt,
 | 
				
			||||||
 | 
					        CURRENT_TIMESTAMP(6)
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					END;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DROP TRIGGER IF EXISTS `TR_CFG_ServerAFKChannelIdsDelete`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TRIGGER `TR_CFG_ServerAFKChannelIdsDelete`
 | 
				
			||||||
 | 
					    AFTER DELETE
 | 
				
			||||||
 | 
					    ON `CFG_ServerAFKChannelIds`
 | 
				
			||||||
 | 
					    FOR EACH ROW
 | 
				
			||||||
 | 
					BEGIN
 | 
				
			||||||
 | 
					    INSERT INTO `CFG_ServerAFKChannelIdsHistory` (
 | 
				
			||||||
 | 
					        `Id`,
 | 
				
			||||||
 | 
					        `ChannelId`,
 | 
				
			||||||
 | 
					        `ServerId`,
 | 
				
			||||||
 | 
					        `Deleted`,
 | 
				
			||||||
 | 
					        `DateFrom`,
 | 
				
			||||||
 | 
					        `DateTo`
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    VALUES (
 | 
				
			||||||
 | 
					        OLD.Id,
 | 
				
			||||||
 | 
					        OLD.ChannelId,
 | 
				
			||||||
 | 
					        OLD.ServerId,
 | 
				
			||||||
 | 
					        TRUE,
 | 
				
			||||||
 | 
					        OLD.LastModifiedAt,
 | 
				
			||||||
 | 
					        CURRENT_TIMESTAMP(6)
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					END;
 | 
				
			||||||
@@ -0,0 +1,62 @@
 | 
				
			|||||||
 | 
					CREATE TABLE IF NOT EXISTS `CFG_ServerTeamRoleIdsHistory`
 | 
				
			||||||
 | 
					(
 | 
				
			||||||
 | 
					    `Id`    BIGINT(20)  NOT NULL,
 | 
				
			||||||
 | 
					    `RoleId` BIGINT NOT NULL,
 | 
				
			||||||
 | 
					    `TeamMemberType` ENUM('Moderator', 'Admin') NOT NULL,
 | 
				
			||||||
 | 
					    `ServerId` BIGINT NOT NULL,
 | 
				
			||||||
 | 
					    `Deleted` BOOL DEFAULT FALSE,
 | 
				
			||||||
 | 
					    `DateFrom` DATETIME(6) NOT NULL,
 | 
				
			||||||
 | 
					    `DateTo` DATETIME(6) NOT NULL
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DROP TRIGGER IF EXISTS `TR_CFG_ServerTeamRoleIdsUpdate`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TRIGGER `TR_CFG_ServerTeamRoleIdsUpdate`
 | 
				
			||||||
 | 
					    AFTER UPDATE
 | 
				
			||||||
 | 
					    ON `CFG_ServerTeamRoleIds`
 | 
				
			||||||
 | 
					    FOR EACH ROW
 | 
				
			||||||
 | 
					BEGIN
 | 
				
			||||||
 | 
					    INSERT INTO `CFG_ServerTeamRoleIdsHistory` (
 | 
				
			||||||
 | 
					        `Id`,
 | 
				
			||||||
 | 
					        `RoleId`,
 | 
				
			||||||
 | 
					        `TeamMemberType`,
 | 
				
			||||||
 | 
					        `ServerId`,
 | 
				
			||||||
 | 
					        `DateFrom`,
 | 
				
			||||||
 | 
					        `DateTo`
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    VALUES (
 | 
				
			||||||
 | 
					        OLD.Id,
 | 
				
			||||||
 | 
					        OLD.RoleId,
 | 
				
			||||||
 | 
					        OLD.TeamMemberType,
 | 
				
			||||||
 | 
					        OLD.ServerId,
 | 
				
			||||||
 | 
					        OLD.LastModifiedAt,
 | 
				
			||||||
 | 
					        CURRENT_TIMESTAMP(6)
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					END;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DROP TRIGGER IF EXISTS `TR_CFG_ServerTeamRoleIdsDelete`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TRIGGER `TR_CFG_ServerTeamRoleIdsDelete`
 | 
				
			||||||
 | 
					    AFTER DELETE
 | 
				
			||||||
 | 
					    ON `CFG_ServerTeamRoleIds`
 | 
				
			||||||
 | 
					    FOR EACH ROW
 | 
				
			||||||
 | 
					BEGIN
 | 
				
			||||||
 | 
					    INSERT INTO `CFG_ServerTeamRoleIdsHistory` (
 | 
				
			||||||
 | 
					        `Id`,
 | 
				
			||||||
 | 
					        `RoleId`,
 | 
				
			||||||
 | 
					        `TeamMemberType`,
 | 
				
			||||||
 | 
					        `ServerId`,
 | 
				
			||||||
 | 
					        `Deleted`,
 | 
				
			||||||
 | 
					        `DateFrom`,
 | 
				
			||||||
 | 
					        `DateTo`
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    VALUES (
 | 
				
			||||||
 | 
					        OLD.Id,
 | 
				
			||||||
 | 
					        OLD.RoleId,
 | 
				
			||||||
 | 
					        OLD.TeamMemberType,
 | 
				
			||||||
 | 
					        OLD.ServerId,
 | 
				
			||||||
 | 
					        TRUE,
 | 
				
			||||||
 | 
					        OLD.LastModifiedAt,
 | 
				
			||||||
 | 
					        CURRENT_TIMESTAMP(6)
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					END;
 | 
				
			||||||
@@ -0,0 +1,67 @@
 | 
				
			|||||||
 | 
					CREATE TABLE IF NOT EXISTS `CFG_TechnicianHistory`
 | 
				
			||||||
 | 
					(
 | 
				
			||||||
 | 
					    `Id`    BIGINT(20)  NOT NULL,
 | 
				
			||||||
 | 
					    `HelpCommandReferenceUrl` VARCHAR(255) NOT NULL,
 | 
				
			||||||
 | 
					    `WaitForRestart` BIGINT NOT NULL DEFAULT 8,
 | 
				
			||||||
 | 
					    `WaitForShutdown` BIGINT NOT NULL DEFAULT 8,
 | 
				
			||||||
 | 
					    `CacheMaxMessages` BIGINT NOT NULL DEFAULT 1000000,
 | 
				
			||||||
 | 
					    `Deleted` BOOL DEFAULT FALSE,
 | 
				
			||||||
 | 
					    `DateFrom` DATETIME(6) NOT NULL,
 | 
				
			||||||
 | 
					    `DateTo` DATETIME(6) NOT NULL
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DROP TRIGGER IF EXISTS `TR_CFG_TechnicianUpdate`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TRIGGER `TR_CFG_TechnicianUpdate`
 | 
				
			||||||
 | 
					    AFTER UPDATE
 | 
				
			||||||
 | 
					    ON `CFG_Technician`
 | 
				
			||||||
 | 
					    FOR EACH ROW
 | 
				
			||||||
 | 
					BEGIN
 | 
				
			||||||
 | 
					    INSERT INTO `CFG_TechnicianHistory` (
 | 
				
			||||||
 | 
					        `Id`,
 | 
				
			||||||
 | 
					        `HelpCommandReferenceUrl`,
 | 
				
			||||||
 | 
					        `WaitForRestart`,
 | 
				
			||||||
 | 
					        `WaitForShutdown`,
 | 
				
			||||||
 | 
					        `CacheMaxMessages`,
 | 
				
			||||||
 | 
					        `DateFrom`,
 | 
				
			||||||
 | 
					        `DateTo`
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    VALUES (
 | 
				
			||||||
 | 
					        OLD.Id,
 | 
				
			||||||
 | 
					        OLD.HelpCommandReferenceUrl,
 | 
				
			||||||
 | 
					        OLD.WaitForRestart,
 | 
				
			||||||
 | 
					        OLD.WaitForShutdown,
 | 
				
			||||||
 | 
					        OLD.CacheMaxMessages,
 | 
				
			||||||
 | 
					        OLD.LastModifiedAt,
 | 
				
			||||||
 | 
					        CURRENT_TIMESTAMP(6)
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					END;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DROP TRIGGER IF EXISTS `TR_CFG_TechnicianDelete`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TRIGGER `TR_CFG_TechnicianDelete`
 | 
				
			||||||
 | 
					    AFTER DELETE
 | 
				
			||||||
 | 
					    ON `CFG_Technician`
 | 
				
			||||||
 | 
					    FOR EACH ROW
 | 
				
			||||||
 | 
					BEGIN
 | 
				
			||||||
 | 
					    INSERT INTO `CFG_TechnicianHistory` (
 | 
				
			||||||
 | 
					        `Id`,
 | 
				
			||||||
 | 
					        `HelpCommandReferenceUrl`,
 | 
				
			||||||
 | 
					        `WaitForRestart`,
 | 
				
			||||||
 | 
					        `WaitForShutdown`,
 | 
				
			||||||
 | 
					        `CacheMaxMessages`,
 | 
				
			||||||
 | 
					        `Deleted`,
 | 
				
			||||||
 | 
					        `DateFrom`,
 | 
				
			||||||
 | 
					        `DateTo`
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    VALUES (
 | 
				
			||||||
 | 
					        OLD.Id,
 | 
				
			||||||
 | 
					        OLD.HelpCommandReferenceUrl,
 | 
				
			||||||
 | 
					        OLD.WaitForRestart,
 | 
				
			||||||
 | 
					        OLD.WaitForShutdown,
 | 
				
			||||||
 | 
					        OLD.CacheMaxMessages,
 | 
				
			||||||
 | 
					        TRUE,
 | 
				
			||||||
 | 
					        OLD.LastModifiedAt,
 | 
				
			||||||
 | 
					        CURRENT_TIMESTAMP(6)
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					END;
 | 
				
			||||||
@@ -0,0 +1,52 @@
 | 
				
			|||||||
 | 
					CREATE TABLE IF NOT EXISTS `CFG_TechnicianIdsHistory`
 | 
				
			||||||
 | 
					(
 | 
				
			||||||
 | 
					    `Id`    BIGINT(20)  NOT NULL,
 | 
				
			||||||
 | 
					    `TechnicianId` BIGINT NOT NULL,
 | 
				
			||||||
 | 
					    `Deleted` BOOL DEFAULT FALSE,
 | 
				
			||||||
 | 
					    `DateFrom` DATETIME(6) NOT NULL,
 | 
				
			||||||
 | 
					    `DateTo` DATETIME(6) NOT NULL
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DROP TRIGGER IF EXISTS `TR_CFG_TechnicianIdsUpdate`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TRIGGER `TR_CFG_TechnicianIdsUpdate`
 | 
				
			||||||
 | 
					    AFTER UPDATE
 | 
				
			||||||
 | 
					    ON `CFG_TechnicianIds`
 | 
				
			||||||
 | 
					    FOR EACH ROW
 | 
				
			||||||
 | 
					BEGIN
 | 
				
			||||||
 | 
					    INSERT INTO `CFG_TechnicianIdsHistory` (
 | 
				
			||||||
 | 
					        `Id`,
 | 
				
			||||||
 | 
					        `TechnicianId`,
 | 
				
			||||||
 | 
					        `DateFrom`,
 | 
				
			||||||
 | 
					        `DateTo`
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    VALUES (
 | 
				
			||||||
 | 
					        OLD.Id,
 | 
				
			||||||
 | 
					        OLD.TechnicianId,
 | 
				
			||||||
 | 
					        OLD.LastModifiedAt,
 | 
				
			||||||
 | 
					        CURRENT_TIMESTAMP(6)
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					END;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DROP TRIGGER IF EXISTS `TR_CFG_TechnicianIdsDelete`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TRIGGER `TR_CFG_TechnicianIdsDelete`
 | 
				
			||||||
 | 
					    AFTER DELETE
 | 
				
			||||||
 | 
					    ON `CFG_TechnicianIds`
 | 
				
			||||||
 | 
					    FOR EACH ROW
 | 
				
			||||||
 | 
					BEGIN
 | 
				
			||||||
 | 
					    INSERT INTO `CFG_TechnicianIdsHistory` (
 | 
				
			||||||
 | 
					        `Id`,
 | 
				
			||||||
 | 
					        `TechnicianId`,
 | 
				
			||||||
 | 
					        `Deleted`,
 | 
				
			||||||
 | 
					        `DateFrom`,
 | 
				
			||||||
 | 
					        `DateTo`
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    VALUES (
 | 
				
			||||||
 | 
					        OLD.Id,
 | 
				
			||||||
 | 
					        OLD.TechnicianId,
 | 
				
			||||||
 | 
					        TRUE,
 | 
				
			||||||
 | 
					        OLD.LastModifiedAt,
 | 
				
			||||||
 | 
					        CURRENT_TIMESTAMP(6)
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					END;
 | 
				
			||||||
@@ -0,0 +1,52 @@
 | 
				
			|||||||
 | 
					CREATE TABLE IF NOT EXISTS `CFG_TechnicianPingUrlsHistory`
 | 
				
			||||||
 | 
					(
 | 
				
			||||||
 | 
					    `Id`    BIGINT(20)  NOT NULL,
 | 
				
			||||||
 | 
					    `URL` VARCHAR(255) NOT NULL,
 | 
				
			||||||
 | 
					    `Deleted` BOOL DEFAULT FALSE,
 | 
				
			||||||
 | 
					    `DateFrom` DATETIME(6) NOT NULL,
 | 
				
			||||||
 | 
					    `DateTo` DATETIME(6) NOT NULL
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DROP TRIGGER IF EXISTS `TR_CFG_TechnicianPingUrlsUpdate`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TRIGGER `TR_CFG_TechnicianPingUrlsUpdate`
 | 
				
			||||||
 | 
					    AFTER UPDATE
 | 
				
			||||||
 | 
					    ON `CFG_TechnicianPingUrls`
 | 
				
			||||||
 | 
					    FOR EACH ROW
 | 
				
			||||||
 | 
					BEGIN
 | 
				
			||||||
 | 
					    INSERT INTO `CFG_TechnicianPingUrlsHistory` (
 | 
				
			||||||
 | 
					        `Id`,
 | 
				
			||||||
 | 
					        `URL`,
 | 
				
			||||||
 | 
					        `DateFrom`,
 | 
				
			||||||
 | 
					        `DateTo`
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    VALUES (
 | 
				
			||||||
 | 
					        OLD.Id,
 | 
				
			||||||
 | 
					        OLD.URL,
 | 
				
			||||||
 | 
					        OLD.LastModifiedAt,
 | 
				
			||||||
 | 
					        CURRENT_TIMESTAMP(6)
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					END;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DROP TRIGGER IF EXISTS `TR_CFG_TechnicianPingUrlsDelete`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CREATE TRIGGER `TR_CFG_TechnicianPingUrlsDelete`
 | 
				
			||||||
 | 
					    AFTER DELETE
 | 
				
			||||||
 | 
					    ON `CFG_TechnicianPingUrls`
 | 
				
			||||||
 | 
					    FOR EACH ROW
 | 
				
			||||||
 | 
					BEGIN
 | 
				
			||||||
 | 
					    INSERT INTO `CFG_TechnicianPingUrlsHistory` (
 | 
				
			||||||
 | 
					        `Id`,
 | 
				
			||||||
 | 
					        `URL`,
 | 
				
			||||||
 | 
					        `Deleted`,
 | 
				
			||||||
 | 
					        `DateFrom`,
 | 
				
			||||||
 | 
					        `DateTo`
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    VALUES (
 | 
				
			||||||
 | 
					        OLD.Id,
 | 
				
			||||||
 | 
					        OLD.URL,
 | 
				
			||||||
 | 
					        TRUE,
 | 
				
			||||||
 | 
					        OLD.LastModifiedAt,
 | 
				
			||||||
 | 
					        CURRENT_TIMESTAMP(6)
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					END;
 | 
				
			||||||
@@ -15,7 +15,7 @@ __title__ = "bot_data.model"
 | 
				
			|||||||
__author__ = "Sven Heidemann"
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
__license__ = "MIT"
 | 
					__license__ = "MIT"
 | 
				
			||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
					__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
				
			||||||
__version__ = "1.0.6"
 | 
					__version__ = "1.1.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -23,4 +23,4 @@ from collections import namedtuple
 | 
				
			|||||||
# imports
 | 
					# imports
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="1", minor="0", micro="6")
 | 
					version_info = VersionInfo(major="1", minor="1", micro="1")
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										158
									
								
								kdb-bot/src/bot_data/model/achievement.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										158
									
								
								kdb-bot/src/bot_data/model/achievement.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,158 @@
 | 
				
			|||||||
 | 
					from datetime import datetime
 | 
				
			||||||
 | 
					from typing import Optional
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from cpl_core.database import TableABC
 | 
				
			||||||
 | 
					from cpl_core.dependency_injection import ServiceProviderABC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from bot_data.model.server import Server
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Achievement(TableABC):
 | 
				
			||||||
 | 
					    def __init__(
 | 
				
			||||||
 | 
					        self,
 | 
				
			||||||
 | 
					        name: str,
 | 
				
			||||||
 | 
					        description: str,
 | 
				
			||||||
 | 
					        attribute: str,
 | 
				
			||||||
 | 
					        operator: str,
 | 
				
			||||||
 | 
					        value: str,
 | 
				
			||||||
 | 
					        server: Optional[Server],
 | 
				
			||||||
 | 
					        created_at: datetime = None,
 | 
				
			||||||
 | 
					        modified_at: datetime = None,
 | 
				
			||||||
 | 
					        id=0,
 | 
				
			||||||
 | 
					    ):
 | 
				
			||||||
 | 
					        self._id = id
 | 
				
			||||||
 | 
					        self._name = name
 | 
				
			||||||
 | 
					        self._description = description
 | 
				
			||||||
 | 
					        self._attribute = attribute
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if self._is_operator_valid(operator):
 | 
				
			||||||
 | 
					            raise ValueError("Operator invalid")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self._operator = operator
 | 
				
			||||||
 | 
					        self._value = value
 | 
				
			||||||
 | 
					        self._server = server
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        TableABC.__init__(self)
 | 
				
			||||||
 | 
					        self._created_at = created_at if created_at is not None else self._created_at
 | 
				
			||||||
 | 
					        self._modified_at = modified_at if modified_at is not None else self._modified_at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @ServiceProviderABC.inject
 | 
				
			||||||
 | 
					    def _is_operator_valid(self, operator, service: ServiceProviderABC) -> bool:
 | 
				
			||||||
 | 
					        from modules.achievements.achievement_service import AchievementService
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        achievements: AchievementService = service.get_service(AchievementService)
 | 
				
			||||||
 | 
					        return operator not in achievements.get_operators()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def id(self) -> int:
 | 
				
			||||||
 | 
					        return self._id
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def name(self) -> str:
 | 
				
			||||||
 | 
					        return self._name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @name.setter
 | 
				
			||||||
 | 
					    def name(self, value: str):
 | 
				
			||||||
 | 
					        self._name = value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def description(self) -> str:
 | 
				
			||||||
 | 
					        return self._description
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @description.setter
 | 
				
			||||||
 | 
					    def description(self, value: str):
 | 
				
			||||||
 | 
					        self._description = value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def attribute(self) -> str:
 | 
				
			||||||
 | 
					        return self._attribute
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @attribute.setter
 | 
				
			||||||
 | 
					    def attribute(self, value: str):
 | 
				
			||||||
 | 
					        self._attribute = value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def operator(self) -> str:
 | 
				
			||||||
 | 
					        return self._operator
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @operator.setter
 | 
				
			||||||
 | 
					    def operator(self, value: str):
 | 
				
			||||||
 | 
					        self._operator = value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def value(self) -> str:
 | 
				
			||||||
 | 
					        return self._value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @value.setter
 | 
				
			||||||
 | 
					    def value(self, value: str):
 | 
				
			||||||
 | 
					        self._value = value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def server(self) -> Server:
 | 
				
			||||||
 | 
					        return self._server
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def get_select_all_string() -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					            SELECT * FROM `Achievements`;
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def get_select_by_id_string(id: int) -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					            SELECT * FROM `Achievements`
 | 
				
			||||||
 | 
					            WHERE `Id` = {id};
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def get_select_by_server_id_string(id: int) -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					            SELECT * FROM `Achievements`
 | 
				
			||||||
 | 
					            WHERE `ServerId` = {id};
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def insert_string(self) -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					            INSERT INTO `Achievements` (
 | 
				
			||||||
 | 
					                `Name`, `Description`, `Attribute`, `Operator`, `Value`, `ServerId`
 | 
				
			||||||
 | 
					            ) VALUES (
 | 
				
			||||||
 | 
					                '{self._name}',
 | 
				
			||||||
 | 
					                '{self._description}',
 | 
				
			||||||
 | 
					                '{self._attribute}',
 | 
				
			||||||
 | 
					                '{self._operator}',
 | 
				
			||||||
 | 
					                '{self._value}',
 | 
				
			||||||
 | 
					                {self._server.id}
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def udpate_string(self) -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					                    UPDATE `Achievements`
 | 
				
			||||||
 | 
					                    SET `Name` = '{self._name}',
 | 
				
			||||||
 | 
					                    `Description` = '{self._description}',
 | 
				
			||||||
 | 
					                    `Attribute` = '{self._attribute}',
 | 
				
			||||||
 | 
					                    `Operator` = '{self._operator}',
 | 
				
			||||||
 | 
					                    `Value` = '{self._value}'
 | 
				
			||||||
 | 
					                    WHERE `Id` = {self._id};
 | 
				
			||||||
 | 
					                """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def delete_string(self) -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					            DELETE FROM `Achievements`
 | 
				
			||||||
 | 
					            WHERE `Id` = {self._id};
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
							
								
								
									
										58
									
								
								kdb-bot/src/bot_data/model/achievement_history.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								kdb-bot/src/bot_data/model/achievement_history.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,58 @@
 | 
				
			|||||||
 | 
					from bot_data.abc.history_table_abc import HistoryTableABC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class AchievementHistory(HistoryTableABC):
 | 
				
			||||||
 | 
					    def __init__(
 | 
				
			||||||
 | 
					        self,
 | 
				
			||||||
 | 
					        name: str,
 | 
				
			||||||
 | 
					        description: str,
 | 
				
			||||||
 | 
					        attribute: str,
 | 
				
			||||||
 | 
					        operator: str,
 | 
				
			||||||
 | 
					        value: str,
 | 
				
			||||||
 | 
					        server: int,
 | 
				
			||||||
 | 
					        deleted: bool,
 | 
				
			||||||
 | 
					        date_from: str,
 | 
				
			||||||
 | 
					        date_to: str,
 | 
				
			||||||
 | 
					        id=0,
 | 
				
			||||||
 | 
					    ):
 | 
				
			||||||
 | 
					        HistoryTableABC.__init__(self)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self._id = id
 | 
				
			||||||
 | 
					        self._name = name
 | 
				
			||||||
 | 
					        self._description = description
 | 
				
			||||||
 | 
					        self._attribute = attribute
 | 
				
			||||||
 | 
					        self._operator = operator
 | 
				
			||||||
 | 
					        self._value = value
 | 
				
			||||||
 | 
					        self._server = server
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self._deleted = deleted
 | 
				
			||||||
 | 
					        self._date_from = date_from
 | 
				
			||||||
 | 
					        self._date_to = date_to
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def id(self) -> int:
 | 
				
			||||||
 | 
					        return self._id
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def name(self) -> str:
 | 
				
			||||||
 | 
					        return self._name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def description(self) -> str:
 | 
				
			||||||
 | 
					        return self._description
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def attribute(self) -> str:
 | 
				
			||||||
 | 
					        return self._attribute
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def operator(self) -> str:
 | 
				
			||||||
 | 
					        return self._operator
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def value(self) -> str:
 | 
				
			||||||
 | 
					        return self._value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def server(self) -> int:
 | 
				
			||||||
 | 
					        return self._server
 | 
				
			||||||
							
								
								
									
										85
									
								
								kdb-bot/src/bot_data/model/server_afk_channel_ids_config.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								kdb-bot/src/bot_data/model/server_afk_channel_ids_config.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,85 @@
 | 
				
			|||||||
 | 
					from datetime import datetime
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from cpl_core.database import TableABC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ServerAFKChannelIdsConfig(TableABC):
 | 
				
			||||||
 | 
					    def __init__(
 | 
				
			||||||
 | 
					        self,
 | 
				
			||||||
 | 
					        channel_id: int,
 | 
				
			||||||
 | 
					        server_id: int,
 | 
				
			||||||
 | 
					        created_at: datetime = None,
 | 
				
			||||||
 | 
					        modified_at: datetime = None,
 | 
				
			||||||
 | 
					        id=0,
 | 
				
			||||||
 | 
					    ):
 | 
				
			||||||
 | 
					        self._id = id
 | 
				
			||||||
 | 
					        self._channel_id = channel_id
 | 
				
			||||||
 | 
					        self._server_id = server_id
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        TableABC.__init__(self)
 | 
				
			||||||
 | 
					        self._created_at = created_at if created_at is not None else self._created_at
 | 
				
			||||||
 | 
					        self._modified_at = modified_at if modified_at is not None else self._modified_at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def channel_id(self) -> int:
 | 
				
			||||||
 | 
					        return self._channel_id
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def get_select_all_string() -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					                SELECT * FROM `CFG_ServerAFKChannelIds`;
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def get_select_by_id_string(id: int) -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					                SELECT * FROM `CFG_ServerAFKChannelIds`
 | 
				
			||||||
 | 
					                WHERE `Id` = {id};
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def get_select_by_server_id_string(server_id: int) -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					                SELECT * FROM `CFG_ServerAFKChannelIds`
 | 
				
			||||||
 | 
					                WHERE `ServerId` = {server_id};
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def insert_string(self) -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					                INSERT INTO `CFG_ServerAFKChannelIds` (
 | 
				
			||||||
 | 
					                    `ChannelId`,
 | 
				
			||||||
 | 
					                    `ServerId`
 | 
				
			||||||
 | 
					                ) VALUES (
 | 
				
			||||||
 | 
					                    {self._channel_id},
 | 
				
			||||||
 | 
					                    {self._server_id}
 | 
				
			||||||
 | 
					                );
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def udpate_string(self) -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					                UPDATE `CFG_ServerAFKChannelIds`
 | 
				
			||||||
 | 
					                SET `ChannelId` = {self._channel_id},
 | 
				
			||||||
 | 
					                `ServerId` = {self._server_id}
 | 
				
			||||||
 | 
					                WHERE `Id` = {self._id};
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def delete_string(self) -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					                DELETE FROM `CFG_ServerAFKChannelIds`
 | 
				
			||||||
 | 
					                WHERE `ChannelId` = {self._channel_id};
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
							
								
								
									
										293
									
								
								kdb-bot/src/bot_data/model/server_config.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										293
									
								
								kdb-bot/src/bot_data/model/server_config.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,293 @@
 | 
				
			|||||||
 | 
					import json
 | 
				
			||||||
 | 
					from datetime import datetime
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from cpl_core.configuration import ConfigurationModelABC
 | 
				
			||||||
 | 
					from cpl_core.database import TableABC
 | 
				
			||||||
 | 
					from cpl_query.extension import List
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
 | 
				
			||||||
 | 
					from bot_data.model.server import Server
 | 
				
			||||||
 | 
					from bot_data.model.server_team_role_ids_config import ServerTeamRoleIdsConfig
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ServerConfig(TableABC, ConfigurationModelABC):
 | 
				
			||||||
 | 
					    def __init__(
 | 
				
			||||||
 | 
					        self,
 | 
				
			||||||
 | 
					        message_delete_timer: int,
 | 
				
			||||||
 | 
					        notification_chat_id: int,
 | 
				
			||||||
 | 
					        max_voice_state_hours: int,
 | 
				
			||||||
 | 
					        xp_per_message: int,
 | 
				
			||||||
 | 
					        xp_per_reaction: int,
 | 
				
			||||||
 | 
					        max_message_xp_per_hour: int,
 | 
				
			||||||
 | 
					        xp_per_ontime_hour: int,
 | 
				
			||||||
 | 
					        xp_per_event_participation: int,
 | 
				
			||||||
 | 
					        xp_per_achievement: int,
 | 
				
			||||||
 | 
					        afk_command_channel_id: int,
 | 
				
			||||||
 | 
					        help_voice_channel_id: int,
 | 
				
			||||||
 | 
					        team_channel_id: int,
 | 
				
			||||||
 | 
					        login_message_channel_id: int,
 | 
				
			||||||
 | 
					        feature_flags: dict[FeatureFlagsEnum],
 | 
				
			||||||
 | 
					        server: Server,
 | 
				
			||||||
 | 
					        afk_channel_ids: List[int],
 | 
				
			||||||
 | 
					        team_role_ids: List[ServerTeamRoleIdsConfig],
 | 
				
			||||||
 | 
					        created_at: datetime = None,
 | 
				
			||||||
 | 
					        modified_at: datetime = None,
 | 
				
			||||||
 | 
					        id=0,
 | 
				
			||||||
 | 
					    ):
 | 
				
			||||||
 | 
					        self._id = id
 | 
				
			||||||
 | 
					        self._message_delete_timer = message_delete_timer
 | 
				
			||||||
 | 
					        self._notification_chat_id = notification_chat_id
 | 
				
			||||||
 | 
					        self._max_voice_state_hours = max_voice_state_hours
 | 
				
			||||||
 | 
					        self._xp_per_message = xp_per_message
 | 
				
			||||||
 | 
					        self._xp_per_reaction = xp_per_reaction
 | 
				
			||||||
 | 
					        self._max_message_xp_per_hour = max_message_xp_per_hour
 | 
				
			||||||
 | 
					        self._xp_per_ontime_hour = xp_per_ontime_hour
 | 
				
			||||||
 | 
					        self._xp_per_event_participation = xp_per_event_participation
 | 
				
			||||||
 | 
					        self._xp_per_achievement = xp_per_achievement
 | 
				
			||||||
 | 
					        self._afk_command_channel_id = afk_command_channel_id
 | 
				
			||||||
 | 
					        self._help_voice_channel_id = help_voice_channel_id
 | 
				
			||||||
 | 
					        self._team_channel_id = team_channel_id
 | 
				
			||||||
 | 
					        self._login_message_channel_id = login_message_channel_id
 | 
				
			||||||
 | 
					        self._feature_flags = feature_flags
 | 
				
			||||||
 | 
					        self._server = server
 | 
				
			||||||
 | 
					        self._afk_channel_ids = afk_channel_ids
 | 
				
			||||||
 | 
					        self._team_role_ids = team_role_ids
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        TableABC.__init__(self)
 | 
				
			||||||
 | 
					        self._created_at = created_at if created_at is not None else self._created_at
 | 
				
			||||||
 | 
					        self._modified_at = modified_at if modified_at is not None else self._modified_at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def id(self) -> int:
 | 
				
			||||||
 | 
					        return self._id
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def message_delete_timer(self) -> int:
 | 
				
			||||||
 | 
					        return self._message_delete_timer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @message_delete_timer.setter
 | 
				
			||||||
 | 
					    def message_delete_timer(self, value: int):
 | 
				
			||||||
 | 
					        self._message_delete_timer = value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def notification_chat_id(self) -> int:
 | 
				
			||||||
 | 
					        return self._notification_chat_id
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @notification_chat_id.setter
 | 
				
			||||||
 | 
					    def notification_chat_id(self, value: int):
 | 
				
			||||||
 | 
					        self._notification_chat_id = value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def max_voice_state_hours(self) -> int:
 | 
				
			||||||
 | 
					        return self._max_voice_state_hours
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @max_voice_state_hours.setter
 | 
				
			||||||
 | 
					    def max_voice_state_hours(self, value: int):
 | 
				
			||||||
 | 
					        self._max_voice_state_hours = value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def xp_per_message(self) -> int:
 | 
				
			||||||
 | 
					        return self._xp_per_message
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @xp_per_message.setter
 | 
				
			||||||
 | 
					    def xp_per_message(self, value: int):
 | 
				
			||||||
 | 
					        self._xp_per_message = value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def xp_per_reaction(self) -> int:
 | 
				
			||||||
 | 
					        return self._xp_per_reaction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @xp_per_reaction.setter
 | 
				
			||||||
 | 
					    def xp_per_reaction(self, value: int):
 | 
				
			||||||
 | 
					        self._xp_per_reaction = value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def max_message_xp_per_hour(self) -> int:
 | 
				
			||||||
 | 
					        return self._max_message_xp_per_hour
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @max_message_xp_per_hour.setter
 | 
				
			||||||
 | 
					    def max_message_xp_per_hour(self, value: int):
 | 
				
			||||||
 | 
					        self._max_message_xp_per_hour = value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def xp_per_ontime_hour(self) -> int:
 | 
				
			||||||
 | 
					        return self._xp_per_ontime_hour
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @xp_per_ontime_hour.setter
 | 
				
			||||||
 | 
					    def xp_per_ontime_hour(self, value: int):
 | 
				
			||||||
 | 
					        self._xp_per_ontime_hour = value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def xp_per_event_participation(self) -> int:
 | 
				
			||||||
 | 
					        return self._xp_per_event_participation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @xp_per_event_participation.setter
 | 
				
			||||||
 | 
					    def xp_per_event_participation(self, value: int):
 | 
				
			||||||
 | 
					        self._xp_per_event_participation = value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def xp_per_achievement(self) -> int:
 | 
				
			||||||
 | 
					        return self._xp_per_achievement
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @xp_per_achievement.setter
 | 
				
			||||||
 | 
					    def xp_per_achievement(self, value: int):
 | 
				
			||||||
 | 
					        self._xp_per_achievement = value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def afk_command_channel_id(self) -> int:
 | 
				
			||||||
 | 
					        return self._afk_command_channel_id
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @afk_command_channel_id.setter
 | 
				
			||||||
 | 
					    def afk_command_channel_id(self, value: int):
 | 
				
			||||||
 | 
					        self._afk_command_channel_id = value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def help_voice_channel_id(self) -> int:
 | 
				
			||||||
 | 
					        return self._help_voice_channel_id
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @help_voice_channel_id.setter
 | 
				
			||||||
 | 
					    def help_voice_channel_id(self, value: int):
 | 
				
			||||||
 | 
					        self._help_voice_channel_id = value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def team_channel_id(self) -> int:
 | 
				
			||||||
 | 
					        return self._team_channel_id
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @team_channel_id.setter
 | 
				
			||||||
 | 
					    def team_channel_id(self, value: int):
 | 
				
			||||||
 | 
					        self._team_channel_id = value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def login_message_channel_id(self) -> int:
 | 
				
			||||||
 | 
					        return self._login_message_channel_id
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @login_message_channel_id.setter
 | 
				
			||||||
 | 
					    def login_message_channel_id(self, value: int):
 | 
				
			||||||
 | 
					        self._login_message_channel_id = value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def feature_flags(self) -> dict[FeatureFlagsEnum]:
 | 
				
			||||||
 | 
					        return self._feature_flags
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @feature_flags.setter
 | 
				
			||||||
 | 
					    def feature_flags(self, value: dict[FeatureFlagsEnum]):
 | 
				
			||||||
 | 
					        self._feature_flags = value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def afk_channel_ids(self) -> List[int]:
 | 
				
			||||||
 | 
					        return self._afk_channel_ids
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @afk_channel_ids.setter
 | 
				
			||||||
 | 
					    def afk_channel_ids(self, value: List[int]):
 | 
				
			||||||
 | 
					        self._afk_channel_ids = value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def team_role_ids(self) -> List[ServerTeamRoleIdsConfig]:
 | 
				
			||||||
 | 
					        return self._team_role_ids
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @team_role_ids.setter
 | 
				
			||||||
 | 
					    def team_role_ids(self, value: List[ServerTeamRoleIdsConfig]):
 | 
				
			||||||
 | 
					        self._team_role_ids = value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def server(self) -> Server:
 | 
				
			||||||
 | 
					        return self._server
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def get_select_all_string() -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					                SELECT * FROM `CFG_Server`;
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def get_select_by_id_string(id: int) -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					                SELECT * FROM `CFG_Server`
 | 
				
			||||||
 | 
					                WHERE `Id` = {id};
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def get_select_by_server_id_string(server_id: int) -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					                SELECT * FROM `CFG_Server`
 | 
				
			||||||
 | 
					                WHERE `ServerId` = {server_id};
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def insert_string(self) -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					                INSERT INTO `CFG_Server` (
 | 
				
			||||||
 | 
					                    `MessageDeleteTimer`,
 | 
				
			||||||
 | 
					                    `NotificationChatId`,
 | 
				
			||||||
 | 
					                    `MaxVoiceStateHours`,
 | 
				
			||||||
 | 
					                    `XpPerMessage`,
 | 
				
			||||||
 | 
					                    `XpPerReaction`,
 | 
				
			||||||
 | 
					                    `MaxMessageXpPerHour`,
 | 
				
			||||||
 | 
					                    `XpPerOntimeHour`,
 | 
				
			||||||
 | 
					                    `XpPerEventParticipation`,
 | 
				
			||||||
 | 
					                    `XpPerAchievement`,
 | 
				
			||||||
 | 
					                    `AFKCommandChannelId`,
 | 
				
			||||||
 | 
					                    `HelpVoiceChannelId`,
 | 
				
			||||||
 | 
					                    `TeamChannelId`,
 | 
				
			||||||
 | 
					                    `LoginMessageChannelId`,
 | 
				
			||||||
 | 
					                    `FeatureFlags`,
 | 
				
			||||||
 | 
					                    `ServerId`
 | 
				
			||||||
 | 
					                ) VALUES (
 | 
				
			||||||
 | 
					                    {self._message_delete_timer},
 | 
				
			||||||
 | 
					                    {self._notification_chat_id},
 | 
				
			||||||
 | 
					                    {self._max_voice_state_hours},
 | 
				
			||||||
 | 
					                    {self._xp_per_message},
 | 
				
			||||||
 | 
					                    {self._xp_per_reaction},
 | 
				
			||||||
 | 
					                    {self._max_message_xp_per_hour},
 | 
				
			||||||
 | 
					                    {self._xp_per_ontime_hour},
 | 
				
			||||||
 | 
					                    {self._xp_per_event_participation},
 | 
				
			||||||
 | 
					                    {self._xp_per_achievement},
 | 
				
			||||||
 | 
					                    {self._afk_command_channel_id},
 | 
				
			||||||
 | 
					                    {self._help_voice_channel_id},
 | 
				
			||||||
 | 
					                    {self._team_channel_id},
 | 
				
			||||||
 | 
					                    {self._login_message_channel_id},
 | 
				
			||||||
 | 
					                    '{json.dumps(self._feature_flags)}',
 | 
				
			||||||
 | 
					                    {self._server.id}
 | 
				
			||||||
 | 
					                );
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def udpate_string(self) -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					                UPDATE `CFG_Server`
 | 
				
			||||||
 | 
					                SET `MessageDeleteTimer` = {self._message_delete_timer},
 | 
				
			||||||
 | 
					                `NotificationChatId` = {self._notification_chat_id},
 | 
				
			||||||
 | 
					                `MaxVoiceStateHours` = {self._max_voice_state_hours},
 | 
				
			||||||
 | 
					                `XpPerMessage` = {self._xp_per_message},
 | 
				
			||||||
 | 
					                `XpPerReaction` = {self._xp_per_reaction},
 | 
				
			||||||
 | 
					                `MaxMessageXpPerHour` = {self._max_message_xp_per_hour},
 | 
				
			||||||
 | 
					                `XpPerOntimeHour` = {self._xp_per_ontime_hour},
 | 
				
			||||||
 | 
					                `XpPerEventParticipation` = {self._xp_per_event_participation},
 | 
				
			||||||
 | 
					                `XpPerAchievement` = {self._xp_per_achievement},
 | 
				
			||||||
 | 
					                `AFKCommandChannelId` = {self._afk_command_channel_id},
 | 
				
			||||||
 | 
					                `HelpVoiceChannelId` = {self._help_voice_channel_id},
 | 
				
			||||||
 | 
					                `TeamChannelId` = {self._team_channel_id},
 | 
				
			||||||
 | 
					                `LoginMessageChannelId` = {self._login_message_channel_id},
 | 
				
			||||||
 | 
					                `FeatureFlags` = '{json.dumps(self._feature_flags)}',
 | 
				
			||||||
 | 
					                `ServerId` = {self._server.id}
 | 
				
			||||||
 | 
					                WHERE `Id` = {self._id};
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def delete_string(self) -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					                DELETE FROM `CFG_Server`
 | 
				
			||||||
 | 
					                WHERE `Id` = {self._id};
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
							
								
								
									
										108
									
								
								kdb-bot/src/bot_data/model/server_config_history.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								kdb-bot/src/bot_data/model/server_config_history.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,108 @@
 | 
				
			|||||||
 | 
					from bot_data.abc.history_table_abc import HistoryTableABC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ServerConfigHistory(HistoryTableABC):
 | 
				
			||||||
 | 
					    def __init__(
 | 
				
			||||||
 | 
					        self,
 | 
				
			||||||
 | 
					        message_delete_timer: int,
 | 
				
			||||||
 | 
					        notification_chat_id: int,
 | 
				
			||||||
 | 
					        max_voice_state_hours: int,
 | 
				
			||||||
 | 
					        xp_per_message: int,
 | 
				
			||||||
 | 
					        xp_per_reaction: int,
 | 
				
			||||||
 | 
					        max_message_xp_per_hour: int,
 | 
				
			||||||
 | 
					        xp_per_ontime_hour: int,
 | 
				
			||||||
 | 
					        xp_per_event_participation: int,
 | 
				
			||||||
 | 
					        xp_per_achievement: int,
 | 
				
			||||||
 | 
					        afk_command_channel_id: int,
 | 
				
			||||||
 | 
					        help_voice_channel_id: int,
 | 
				
			||||||
 | 
					        team_channel_id: int,
 | 
				
			||||||
 | 
					        login_message_channel_id: int,
 | 
				
			||||||
 | 
					        feature_flags: dict[str],
 | 
				
			||||||
 | 
					        server_id: int,
 | 
				
			||||||
 | 
					        deleted: bool,
 | 
				
			||||||
 | 
					        date_from: str,
 | 
				
			||||||
 | 
					        date_to: str,
 | 
				
			||||||
 | 
					        id=0,
 | 
				
			||||||
 | 
					    ):
 | 
				
			||||||
 | 
					        HistoryTableABC.__init__(self)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self._id = id
 | 
				
			||||||
 | 
					        self._message_delete_timer = message_delete_timer
 | 
				
			||||||
 | 
					        self._notification_chat_id = notification_chat_id
 | 
				
			||||||
 | 
					        self._max_voice_state_hours = max_voice_state_hours
 | 
				
			||||||
 | 
					        self._xp_per_message = xp_per_message
 | 
				
			||||||
 | 
					        self._xp_per_reaction = xp_per_reaction
 | 
				
			||||||
 | 
					        self._max_message_xp_per_hour = max_message_xp_per_hour
 | 
				
			||||||
 | 
					        self._xp_per_ontime_hour = xp_per_ontime_hour
 | 
				
			||||||
 | 
					        self._xp_per_event_participation = xp_per_event_participation
 | 
				
			||||||
 | 
					        self._xp_per_achievement = xp_per_achievement
 | 
				
			||||||
 | 
					        self._afk_command_channel_id = afk_command_channel_id
 | 
				
			||||||
 | 
					        self._help_voice_channel_id = help_voice_channel_id
 | 
				
			||||||
 | 
					        self._team_channel_id = team_channel_id
 | 
				
			||||||
 | 
					        self._login_message_channel_id = login_message_channel_id
 | 
				
			||||||
 | 
					        self._feature_flags = feature_flags
 | 
				
			||||||
 | 
					        self._server_id = server_id
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self._deleted = deleted
 | 
				
			||||||
 | 
					        self._date_from = date_from
 | 
				
			||||||
 | 
					        self._date_to = date_to
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def message_delete_timer(self) -> int:
 | 
				
			||||||
 | 
					        return self._message_delete_timer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def notification_chat_id(self) -> int:
 | 
				
			||||||
 | 
					        return self._notification_chat_id
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def max_voice_state_hours(self) -> int:
 | 
				
			||||||
 | 
					        return self._max_voice_state_hours
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def xp_per_message(self) -> int:
 | 
				
			||||||
 | 
					        return self._xp_per_message
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def xp_per_reaction(self) -> int:
 | 
				
			||||||
 | 
					        return self._xp_per_reaction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def max_message_xp_per_hour(self) -> int:
 | 
				
			||||||
 | 
					        return self._max_message_xp_per_hour
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def xp_per_ontime_hour(self) -> int:
 | 
				
			||||||
 | 
					        return self._xp_per_ontime_hour
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def xp_per_event_participation(self) -> int:
 | 
				
			||||||
 | 
					        return self._xp_per_event_participation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def xp_per_achievement(self) -> int:
 | 
				
			||||||
 | 
					        return self._xp_per_achievement
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def afk_command_channel_id(self) -> int:
 | 
				
			||||||
 | 
					        return self._afk_command_channel_id
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def help_voice_channel_id(self) -> int:
 | 
				
			||||||
 | 
					        return self._help_voice_channel_id
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def team_channel_id(self) -> int:
 | 
				
			||||||
 | 
					        return self._team_channel_id
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def login_message_channel_id(self) -> int:
 | 
				
			||||||
 | 
					        return self._login_message_channel_id
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def feature_flags(self) -> dict[str]:
 | 
				
			||||||
 | 
					        return self._feature_flags
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def server_id(self) -> int:
 | 
				
			||||||
 | 
					        return self._server_id
 | 
				
			||||||
							
								
								
									
										100
									
								
								kdb-bot/src/bot_data/model/server_team_role_ids_config.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								kdb-bot/src/bot_data/model/server_team_role_ids_config.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,100 @@
 | 
				
			|||||||
 | 
					from datetime import datetime
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from cpl_core.database import TableABC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from bot_data.model.team_member_type_enum import TeamMemberTypeEnum
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ServerTeamRoleIdsConfig(TableABC):
 | 
				
			||||||
 | 
					    def __init__(
 | 
				
			||||||
 | 
					        self,
 | 
				
			||||||
 | 
					        role_id: int,
 | 
				
			||||||
 | 
					        team_member_type: TeamMemberTypeEnum,
 | 
				
			||||||
 | 
					        server_id: int,
 | 
				
			||||||
 | 
					        created_at: datetime = None,
 | 
				
			||||||
 | 
					        modified_at: datetime = None,
 | 
				
			||||||
 | 
					        id=0,
 | 
				
			||||||
 | 
					    ):
 | 
				
			||||||
 | 
					        self._id = id
 | 
				
			||||||
 | 
					        self._role_id = role_id
 | 
				
			||||||
 | 
					        self._team_member_type = team_member_type
 | 
				
			||||||
 | 
					        self._server_id = server_id
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        TableABC.__init__(self)
 | 
				
			||||||
 | 
					        self._created_at = created_at if created_at is not None else self._created_at
 | 
				
			||||||
 | 
					        self._modified_at = modified_at if modified_at is not None else self._modified_at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def id(self) -> int:
 | 
				
			||||||
 | 
					        return self._id
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def role_id(self) -> int:
 | 
				
			||||||
 | 
					        return self._role_id
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def team_member_type(self) -> TeamMemberTypeEnum:
 | 
				
			||||||
 | 
					        return self._team_member_type
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def get_select_all_string() -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					                SELECT * FROM `CFG_ServerTeamRoleIds`;
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def get_select_by_id_string(id: int) -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					                SELECT * FROM `CFG_ServerTeamRoleIds`
 | 
				
			||||||
 | 
					                WHERE `Id` = {id};
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def get_select_by_server_id_string(server_id: int) -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					                SELECT * FROM `CFG_ServerTeamRoleIds`
 | 
				
			||||||
 | 
					                WHERE `ServerId` = {server_id};
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def insert_string(self) -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					                INSERT INTO `CFG_ServerTeamRoleIds` (
 | 
				
			||||||
 | 
					                    `RoleId`,
 | 
				
			||||||
 | 
					                    `TeamMemberType`,
 | 
				
			||||||
 | 
					                    `ServerId`
 | 
				
			||||||
 | 
					                ) VALUES (
 | 
				
			||||||
 | 
					                    {self._role_id},
 | 
				
			||||||
 | 
					                    '{self._team_member_type.value}',
 | 
				
			||||||
 | 
					                    {self._server_id}
 | 
				
			||||||
 | 
					                );
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def udpate_string(self) -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					                UPDATE `CFG_ServerTeamRoleIds`
 | 
				
			||||||
 | 
					                SET `RoleId` = {self._role_id},
 | 
				
			||||||
 | 
					                `TeamMemberType` = '{self._team_member_type.value}',
 | 
				
			||||||
 | 
					                `ServerId` = {self._server_id}
 | 
				
			||||||
 | 
					                WHERE `Id` = {self._id};
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def delete_string(self) -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					                DELETE FROM `CFG_ServerTeamRoleIds`
 | 
				
			||||||
 | 
					                WHERE `RoleId` = {self._role_id};
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
							
								
								
									
										6
									
								
								kdb-bot/src/bot_data/model/team_member_type_enum.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								kdb-bot/src/bot_data/model/team_member_type_enum.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					from enum import Enum
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class TeamMemberTypeEnum(Enum):
 | 
				
			||||||
 | 
					    moderator = "Moderator"
 | 
				
			||||||
 | 
					    admin = "Admin"
 | 
				
			||||||
							
								
								
									
										152
									
								
								kdb-bot/src/bot_data/model/technician_config.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										152
									
								
								kdb-bot/src/bot_data/model/technician_config.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,152 @@
 | 
				
			|||||||
 | 
					import json
 | 
				
			||||||
 | 
					from datetime import datetime
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from cpl_core.configuration import ConfigurationModelABC
 | 
				
			||||||
 | 
					from cpl_core.database import TableABC
 | 
				
			||||||
 | 
					from cpl_query.extension import List
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class TechnicianConfig(TableABC, ConfigurationModelABC):
 | 
				
			||||||
 | 
					    def __init__(
 | 
				
			||||||
 | 
					        self,
 | 
				
			||||||
 | 
					        help_command_reference_url: str,
 | 
				
			||||||
 | 
					        wait_for_restart: int,
 | 
				
			||||||
 | 
					        wait_for_shutdown: int,
 | 
				
			||||||
 | 
					        cache_max_messages: int,
 | 
				
			||||||
 | 
					        feature_flags: dict[FeatureFlagsEnum],
 | 
				
			||||||
 | 
					        technician_ids: List[int],
 | 
				
			||||||
 | 
					        ping_urls: List[str],
 | 
				
			||||||
 | 
					        created_at: datetime = None,
 | 
				
			||||||
 | 
					        modified_at: datetime = None,
 | 
				
			||||||
 | 
					        id=0,
 | 
				
			||||||
 | 
					    ):
 | 
				
			||||||
 | 
					        self._id = id
 | 
				
			||||||
 | 
					        self._help_command_reference_url = help_command_reference_url
 | 
				
			||||||
 | 
					        self._wait_for_restart = wait_for_restart
 | 
				
			||||||
 | 
					        self._wait_for_shutdown = wait_for_shutdown
 | 
				
			||||||
 | 
					        self._cache_max_messages = cache_max_messages
 | 
				
			||||||
 | 
					        self._feature_flags = feature_flags
 | 
				
			||||||
 | 
					        self._technician_ids = technician_ids
 | 
				
			||||||
 | 
					        self._ping_urls = ping_urls
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        TableABC.__init__(self)
 | 
				
			||||||
 | 
					        self._created_at = created_at if created_at is not None else self._created_at
 | 
				
			||||||
 | 
					        self._modified_at = modified_at if modified_at is not None else self._modified_at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def id(self) -> int:
 | 
				
			||||||
 | 
					        return self._id
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def help_command_reference_url(self) -> str:
 | 
				
			||||||
 | 
					        return self._help_command_reference_url
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @help_command_reference_url.setter
 | 
				
			||||||
 | 
					    def help_command_reference_url(self, value: str):
 | 
				
			||||||
 | 
					        self._help_command_reference_url = value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def wait_for_restart(self) -> int:
 | 
				
			||||||
 | 
					        return self._wait_for_restart
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @wait_for_restart.setter
 | 
				
			||||||
 | 
					    def wait_for_restart(self, value: int):
 | 
				
			||||||
 | 
					        self._wait_for_restart = value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def wait_for_shutdown(self) -> int:
 | 
				
			||||||
 | 
					        return self._wait_for_shutdown
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @wait_for_shutdown.setter
 | 
				
			||||||
 | 
					    def wait_for_shutdown(self, value: int):
 | 
				
			||||||
 | 
					        self._wait_for_shutdown = value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def cache_max_messages(self) -> int:
 | 
				
			||||||
 | 
					        return self._cache_max_messages
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @cache_max_messages.setter
 | 
				
			||||||
 | 
					    def cache_max_messages(self, value: int):
 | 
				
			||||||
 | 
					        self._cache_max_messages = value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def feature_flags(self) -> dict[FeatureFlagsEnum]:
 | 
				
			||||||
 | 
					        return self._feature_flags
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @feature_flags.setter
 | 
				
			||||||
 | 
					    def feature_flags(self, value: dict[FeatureFlagsEnum]):
 | 
				
			||||||
 | 
					        self._feature_flags = value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def technician_ids(self) -> List[int]:
 | 
				
			||||||
 | 
					        return self._technician_ids
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @technician_ids.setter
 | 
				
			||||||
 | 
					    def technician_ids(self, value: List[int]):
 | 
				
			||||||
 | 
					        self._technician_ids = value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def ping_urls(self) -> List[str]:
 | 
				
			||||||
 | 
					        return self._ping_urls
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @ping_urls.setter
 | 
				
			||||||
 | 
					    def ping_urls(self, value: List[str]):
 | 
				
			||||||
 | 
					        self._ping_urls = value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def get_select_all_string() -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					                SELECT * FROM `CFG_Technician`;
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def get_select_by_id_string(id: int) -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					                SELECT * FROM `CFG_Technician`
 | 
				
			||||||
 | 
					                WHERE `Id` = {id};
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def insert_string(self) -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					                INSERT INTO `CFG_Technician` (
 | 
				
			||||||
 | 
					                    `HelpCommandReferenceUrl`, `WaitForRestart`, `WaitForShutdown`, `CacheMaxMessages`, `FeatureFlags`
 | 
				
			||||||
 | 
					                ) VALUES (
 | 
				
			||||||
 | 
					                    '{self._help_command_reference_url}',
 | 
				
			||||||
 | 
					                    {self._wait_for_restart},
 | 
				
			||||||
 | 
					                    {self._wait_for_shutdown},
 | 
				
			||||||
 | 
					                    {self._cache_max_messages},
 | 
				
			||||||
 | 
					                    '{json.dumps(self._feature_flags)}'
 | 
				
			||||||
 | 
					                );
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def udpate_string(self) -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					                UPDATE `CFG_Technician`
 | 
				
			||||||
 | 
					                SET `HelpCommandReferenceUrl` = '{self._help_command_reference_url}',
 | 
				
			||||||
 | 
					                `WaitForRestart` = {self._wait_for_restart},
 | 
				
			||||||
 | 
					                `WaitForShutdown` = {self._wait_for_shutdown},
 | 
				
			||||||
 | 
					                `CacheMaxMessages` = {self._cache_max_messages},
 | 
				
			||||||
 | 
					                `FeatureFlags` = '{json.dumps(self._feature_flags)}'
 | 
				
			||||||
 | 
					                WHERE `Id` = {self._id};
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def delete_string(self) -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					                DELETE FROM `CFG_Technician`
 | 
				
			||||||
 | 
					                WHERE `Id` = {self._id};
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
							
								
								
									
										58
									
								
								kdb-bot/src/bot_data/model/technician_config_history.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								kdb-bot/src/bot_data/model/technician_config_history.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,58 @@
 | 
				
			|||||||
 | 
					from bot_data.abc.history_table_abc import HistoryTableABC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class TechnicianConfigHistory(HistoryTableABC):
 | 
				
			||||||
 | 
					    def __init__(
 | 
				
			||||||
 | 
					        self,
 | 
				
			||||||
 | 
					        help_command_reference_url: str,
 | 
				
			||||||
 | 
					        wait_for_restart: int,
 | 
				
			||||||
 | 
					        wait_for_shutdown: int,
 | 
				
			||||||
 | 
					        cache_max_messages: int,
 | 
				
			||||||
 | 
					        deleted: bool,
 | 
				
			||||||
 | 
					        date_from: str,
 | 
				
			||||||
 | 
					        date_to: str,
 | 
				
			||||||
 | 
					        id=0,
 | 
				
			||||||
 | 
					    ):
 | 
				
			||||||
 | 
					        HistoryTableABC.__init__(self)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self._id = id
 | 
				
			||||||
 | 
					        self._help_command_reference_url = help_command_reference_url
 | 
				
			||||||
 | 
					        self._wait_for_restart = wait_for_restart
 | 
				
			||||||
 | 
					        self._wait_for_shutdown = wait_for_shutdown
 | 
				
			||||||
 | 
					        self._cache_max_messages = cache_max_messages
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self._deleted = deleted
 | 
				
			||||||
 | 
					        self._date_from = date_from
 | 
				
			||||||
 | 
					        self._date_to = date_to
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def help_command_reference_url(self) -> str:
 | 
				
			||||||
 | 
					        return self._help_command_reference_url
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @help_command_reference_url.setter
 | 
				
			||||||
 | 
					    def help_command_reference_url(self, value: str):
 | 
				
			||||||
 | 
					        self._help_command_reference_url = value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def wait_for_restart(self) -> int:
 | 
				
			||||||
 | 
					        return self._wait_for_restart
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @wait_for_restart.setter
 | 
				
			||||||
 | 
					    def wait_for_restart(self, value: int):
 | 
				
			||||||
 | 
					        self._wait_for_restart = value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def wait_for_shutdown(self) -> int:
 | 
				
			||||||
 | 
					        return self._wait_for_shutdown
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @wait_for_shutdown.setter
 | 
				
			||||||
 | 
					    def wait_for_shutdown(self, value: int):
 | 
				
			||||||
 | 
					        self._wait_for_shutdown = value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def cache_max_messages(self) -> int:
 | 
				
			||||||
 | 
					        return self._cache_max_messages
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @cache_max_messages.setter
 | 
				
			||||||
 | 
					    def cache_max_messages(self, value: int):
 | 
				
			||||||
 | 
					        self._cache_max_messages = value
 | 
				
			||||||
							
								
								
									
										79
									
								
								kdb-bot/src/bot_data/model/technician_id_config.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								kdb-bot/src/bot_data/model/technician_id_config.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,79 @@
 | 
				
			|||||||
 | 
					from datetime import datetime
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from cpl_core.database import TableABC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class TechnicianIdConfig(TableABC):
 | 
				
			||||||
 | 
					    def __init__(
 | 
				
			||||||
 | 
					        self,
 | 
				
			||||||
 | 
					        technician_id: str,
 | 
				
			||||||
 | 
					        created_at: datetime = None,
 | 
				
			||||||
 | 
					        modified_at: datetime = None,
 | 
				
			||||||
 | 
					        id=0,
 | 
				
			||||||
 | 
					    ):
 | 
				
			||||||
 | 
					        self._id = id
 | 
				
			||||||
 | 
					        self._technician_id = technician_id
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        TableABC.__init__(self)
 | 
				
			||||||
 | 
					        self._created_at = created_at if created_at is not None else self._created_at
 | 
				
			||||||
 | 
					        self._modified_at = modified_at if modified_at is not None else self._modified_at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def id(self) -> int:
 | 
				
			||||||
 | 
					        return self._id
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def technician_id(self) -> str:
 | 
				
			||||||
 | 
					        return self._technician_id
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @technician_id.setter
 | 
				
			||||||
 | 
					    def technician_id(self, value: str):
 | 
				
			||||||
 | 
					        self._technician_id = value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def get_select_all_string() -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					                SELECT * FROM `CFG_TechnicianIds`;
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def get_select_by_id_string(id: int) -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					                SELECT * FROM `CFG_TechnicianIds`
 | 
				
			||||||
 | 
					                WHERE `Id` = {id};
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def insert_string(self) -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					                INSERT INTO `CFG_TechnicianIds` (
 | 
				
			||||||
 | 
					                    `TechnicianId`
 | 
				
			||||||
 | 
					                ) VALUES (
 | 
				
			||||||
 | 
					                    '{self._technician_id}'
 | 
				
			||||||
 | 
					                );
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def udpate_string(self) -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					                UPDATE `CFG_TechnicianIds`
 | 
				
			||||||
 | 
					                SET `TechnicianId` = '{self._technician_id}'
 | 
				
			||||||
 | 
					                WHERE `Id` = {self._id};
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def delete_string(self) -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					                DELETE FROM `CFG_TechnicianIds`
 | 
				
			||||||
 | 
					                WHERE `TechnicianId` = {self._technician_id};
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
							
								
								
									
										28
									
								
								kdb-bot/src/bot_data/model/technician_id_config_history.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								kdb-bot/src/bot_data/model/technician_id_config_history.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,28 @@
 | 
				
			|||||||
 | 
					from bot_data.abc.history_table_abc import HistoryTableABC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class TechnicianIdConfigHistory(HistoryTableABC):
 | 
				
			||||||
 | 
					    def __init__(
 | 
				
			||||||
 | 
					        self,
 | 
				
			||||||
 | 
					        technician_id: int,
 | 
				
			||||||
 | 
					        deleted: bool,
 | 
				
			||||||
 | 
					        date_from: str,
 | 
				
			||||||
 | 
					        date_to: str,
 | 
				
			||||||
 | 
					        id=0,
 | 
				
			||||||
 | 
					    ):
 | 
				
			||||||
 | 
					        HistoryTableABC.__init__(self)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self._id = id
 | 
				
			||||||
 | 
					        self._technician_id = technician_id
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self._deleted = deleted
 | 
				
			||||||
 | 
					        self._date_from = date_from
 | 
				
			||||||
 | 
					        self._date_to = date_to
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def technician_id(self) -> int:
 | 
				
			||||||
 | 
					        return self._technician_id
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @technician_id.setter
 | 
				
			||||||
 | 
					    def technician_id(self, value: int):
 | 
				
			||||||
 | 
					        self._technician_id = value
 | 
				
			||||||
							
								
								
									
										79
									
								
								kdb-bot/src/bot_data/model/technician_ping_url_config.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								kdb-bot/src/bot_data/model/technician_ping_url_config.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,79 @@
 | 
				
			|||||||
 | 
					from datetime import datetime
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from cpl_core.database import TableABC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class TechnicianPingUrlConfig(TableABC):
 | 
				
			||||||
 | 
					    def __init__(
 | 
				
			||||||
 | 
					        self,
 | 
				
			||||||
 | 
					        ping_url: str,
 | 
				
			||||||
 | 
					        created_at: datetime = None,
 | 
				
			||||||
 | 
					        modified_at: datetime = None,
 | 
				
			||||||
 | 
					        id=0,
 | 
				
			||||||
 | 
					    ):
 | 
				
			||||||
 | 
					        self._id = id
 | 
				
			||||||
 | 
					        self._ping_url = ping_url
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        TableABC.__init__(self)
 | 
				
			||||||
 | 
					        self._created_at = created_at if created_at is not None else self._created_at
 | 
				
			||||||
 | 
					        self._modified_at = modified_at if modified_at is not None else self._modified_at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def id(self) -> int:
 | 
				
			||||||
 | 
					        return self._id
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def ping_url(self) -> str:
 | 
				
			||||||
 | 
					        return self._ping_url
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @ping_url.setter
 | 
				
			||||||
 | 
					    def ping_url(self, value: str):
 | 
				
			||||||
 | 
					        self._ping_url = value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def get_select_all_string() -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					                SELECT * FROM `CFG_TechnicianPingUrls`;
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def get_select_by_id_string(id: int) -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					                SELECT * FROM `CFG_TechnicianPingUrls`
 | 
				
			||||||
 | 
					                WHERE `Id` = {id};
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def insert_string(self) -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					                INSERT INTO `CFG_TechnicianPingUrls` (
 | 
				
			||||||
 | 
					                    `URL`
 | 
				
			||||||
 | 
					                ) VALUES (
 | 
				
			||||||
 | 
					                    '{self._ping_url}'
 | 
				
			||||||
 | 
					                );
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def udpate_string(self) -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					                UPDATE `CFG_TechnicianPingUrls`
 | 
				
			||||||
 | 
					                SET `URL` = '{self._ping_url}'
 | 
				
			||||||
 | 
					                WHERE `Id` = {self._id};
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def delete_string(self) -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					                DELETE FROM `CFG_TechnicianPingUrls`
 | 
				
			||||||
 | 
					                WHERE `URL` = '{self._ping_url}';
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
@@ -0,0 +1,28 @@
 | 
				
			|||||||
 | 
					from bot_data.abc.history_table_abc import HistoryTableABC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class TechnicianPingUrlConfigHistory(HistoryTableABC):
 | 
				
			||||||
 | 
					    def __init__(
 | 
				
			||||||
 | 
					        self,
 | 
				
			||||||
 | 
					        url: str,
 | 
				
			||||||
 | 
					        deleted: bool,
 | 
				
			||||||
 | 
					        date_from: str,
 | 
				
			||||||
 | 
					        date_to: str,
 | 
				
			||||||
 | 
					        id=0,
 | 
				
			||||||
 | 
					    ):
 | 
				
			||||||
 | 
					        HistoryTableABC.__init__(self)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self._id = id
 | 
				
			||||||
 | 
					        self._url = url
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self._deleted = deleted
 | 
				
			||||||
 | 
					        self._date_from = date_from
 | 
				
			||||||
 | 
					        self._date_to = date_to
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def url(self) -> str:
 | 
				
			||||||
 | 
					        return self._url
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @url.setter
 | 
				
			||||||
 | 
					    def url(self, value: str):
 | 
				
			||||||
 | 
					        self._url = value
 | 
				
			||||||
@@ -15,6 +15,8 @@ class User(TableABC):
 | 
				
			|||||||
        self,
 | 
					        self,
 | 
				
			||||||
        dc_id: int,
 | 
					        dc_id: int,
 | 
				
			||||||
        xp: int,
 | 
					        xp: int,
 | 
				
			||||||
 | 
					        reaction_count: int,
 | 
				
			||||||
 | 
					        message_count: int,
 | 
				
			||||||
        server: Optional[Server],
 | 
					        server: Optional[Server],
 | 
				
			||||||
        created_at: datetime = None,
 | 
					        created_at: datetime = None,
 | 
				
			||||||
        modified_at: datetime = None,
 | 
					        modified_at: datetime = None,
 | 
				
			||||||
@@ -23,6 +25,8 @@ class User(TableABC):
 | 
				
			|||||||
        self._user_id = id
 | 
					        self._user_id = id
 | 
				
			||||||
        self._discord_id = dc_id
 | 
					        self._discord_id = dc_id
 | 
				
			||||||
        self._xp = xp
 | 
					        self._xp = xp
 | 
				
			||||||
 | 
					        self._reaction_count = reaction_count
 | 
				
			||||||
 | 
					        self._message_count = message_count
 | 
				
			||||||
        self._server = server
 | 
					        self._server = server
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        TableABC.__init__(self)
 | 
					        TableABC.__init__(self)
 | 
				
			||||||
@@ -59,6 +63,22 @@ class User(TableABC):
 | 
				
			|||||||
    def xp(self, value: int):
 | 
					    def xp(self, value: int):
 | 
				
			||||||
        self._xp = value
 | 
					        self._xp = value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def message_count(self) -> int:
 | 
				
			||||||
 | 
					        return self._message_count
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @message_count.setter
 | 
				
			||||||
 | 
					    def message_count(self, value: int):
 | 
				
			||||||
 | 
					        self._message_count = value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def reaction_count(self) -> int:
 | 
				
			||||||
 | 
					        return self._reaction_count
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @reaction_count.setter
 | 
				
			||||||
 | 
					    def reaction_count(self, value: int):
 | 
				
			||||||
 | 
					        self._reaction_count = value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
    @ServiceProviderABC.inject
 | 
					    @ServiceProviderABC.inject
 | 
				
			||||||
    def ontime(self, services: ServiceProviderABC) -> float:
 | 
					    def ontime(self, services: ServiceProviderABC) -> float:
 | 
				
			||||||
@@ -151,10 +171,12 @@ class User(TableABC):
 | 
				
			|||||||
        return str(
 | 
					        return str(
 | 
				
			||||||
            f"""
 | 
					            f"""
 | 
				
			||||||
            INSERT INTO `Users` (
 | 
					            INSERT INTO `Users` (
 | 
				
			||||||
                `DiscordId`, `XP`, `ServerId`
 | 
					                `DiscordId`, `XP`, `MessageCount`, `ReactionCount`, `ServerId`
 | 
				
			||||||
            ) VALUES (
 | 
					            ) VALUES (
 | 
				
			||||||
                {self._discord_id},
 | 
					                {self._discord_id},
 | 
				
			||||||
                {self._xp},
 | 
					                {self._xp},
 | 
				
			||||||
 | 
					                {self._message_count},
 | 
				
			||||||
 | 
					                {self._reaction_count},
 | 
				
			||||||
                {self._server.id}
 | 
					                {self._server.id}
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
@@ -165,7 +187,9 @@ class User(TableABC):
 | 
				
			|||||||
        return str(
 | 
					        return str(
 | 
				
			||||||
            f"""
 | 
					            f"""
 | 
				
			||||||
            UPDATE `Users`
 | 
					            UPDATE `Users`
 | 
				
			||||||
            SET `XP` = {self._xp}
 | 
					            SET `XP` = {self._xp},
 | 
				
			||||||
 | 
					            `MessageCount` = {self._message_count},
 | 
				
			||||||
 | 
					            `ReactionCount` = {self._reaction_count}
 | 
				
			||||||
            WHERE `UserId` = {self._user_id};
 | 
					            WHERE `UserId` = {self._user_id};
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										105
									
								
								kdb-bot/src/bot_data/model/user_got_achievement.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								kdb-bot/src/bot_data/model/user_got_achievement.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,105 @@
 | 
				
			|||||||
 | 
					from datetime import datetime
 | 
				
			||||||
 | 
					from typing import Optional
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from cpl_core.database import TableABC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from bot_data.model.achievement import Achievement
 | 
				
			||||||
 | 
					from bot_data.model.user import User
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class UserGotAchievement(TableABC):
 | 
				
			||||||
 | 
					    def __init__(
 | 
				
			||||||
 | 
					        self,
 | 
				
			||||||
 | 
					        user: Optional[User],
 | 
				
			||||||
 | 
					        achievement: Optional[Achievement],
 | 
				
			||||||
 | 
					        created_at: datetime = None,
 | 
				
			||||||
 | 
					        modified_at: datetime = None,
 | 
				
			||||||
 | 
					        id=0,
 | 
				
			||||||
 | 
					    ):
 | 
				
			||||||
 | 
					        self._id = id
 | 
				
			||||||
 | 
					        self._user = user
 | 
				
			||||||
 | 
					        self._achievement = achievement
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        TableABC.__init__(self)
 | 
				
			||||||
 | 
					        self._created_at = created_at if created_at is not None else self._created_at
 | 
				
			||||||
 | 
					        self._modified_at = modified_at if modified_at is not None else self._modified_at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def id(self) -> int:
 | 
				
			||||||
 | 
					        return self._id
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def user(self) -> User:
 | 
				
			||||||
 | 
					        return self._user
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def achievement(self) -> Achievement:
 | 
				
			||||||
 | 
					        return self._achievement
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def get_select_all_string() -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					                SELECT * FROM `UserGotAchievements`;
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def get_select_by_id_string(id: int) -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					                SELECT * FROM `UserGotAchievements`
 | 
				
			||||||
 | 
					                WHERE `Id` = {id};
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def get_select_by_user_id_string(id: int) -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					                SELECT * FROM `UserGotAchievements`
 | 
				
			||||||
 | 
					                WHERE `UserId` = {id};
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def get_select_by_achievement_id_string(id: int) -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					                SELECT * FROM `UserGotAchievements`
 | 
				
			||||||
 | 
					                WHERE `AchievementId` = {id};
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def insert_string(self) -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					            INSERT INTO `UserGotAchievements` (
 | 
				
			||||||
 | 
					                `UserId`, `AchievementId`
 | 
				
			||||||
 | 
					            ) VALUES (
 | 
				
			||||||
 | 
					                {self._user.id},
 | 
				
			||||||
 | 
					                {self._achievement.id}
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def udpate_string(self) -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					                UPDATE `UserGotAchievements`
 | 
				
			||||||
 | 
					                SET `UserId` = '{self._user.id}',
 | 
				
			||||||
 | 
					                `AchievementId` = '{self._achievement.id}'
 | 
				
			||||||
 | 
					                WHERE `Id` = {self._id};
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def delete_string(self) -> str:
 | 
				
			||||||
 | 
					        return str(
 | 
				
			||||||
 | 
					            f"""
 | 
				
			||||||
 | 
					                DELETE FROM `UserGotAchievements`
 | 
				
			||||||
 | 
					                WHERE `Id` = {self._id};
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
@@ -9,6 +9,8 @@ class UserHistory(HistoryTableABC):
 | 
				
			|||||||
        self,
 | 
					        self,
 | 
				
			||||||
        dc_id: int,
 | 
					        dc_id: int,
 | 
				
			||||||
        xp: int,
 | 
					        xp: int,
 | 
				
			||||||
 | 
					        message_count: int,
 | 
				
			||||||
 | 
					        reaction_count: int,
 | 
				
			||||||
        server: int,
 | 
					        server: int,
 | 
				
			||||||
        deleted: bool,
 | 
					        deleted: bool,
 | 
				
			||||||
        date_from: str,
 | 
					        date_from: str,
 | 
				
			||||||
@@ -20,6 +22,8 @@ class UserHistory(HistoryTableABC):
 | 
				
			|||||||
        self._user_id = id
 | 
					        self._user_id = id
 | 
				
			||||||
        self._discord_id = dc_id
 | 
					        self._discord_id = dc_id
 | 
				
			||||||
        self._xp = xp
 | 
					        self._xp = xp
 | 
				
			||||||
 | 
					        self._message_count = message_count
 | 
				
			||||||
 | 
					        self._reaction_count = reaction_count
 | 
				
			||||||
        self._server = server
 | 
					        self._server = server
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self._deleted = deleted
 | 
					        self._deleted = deleted
 | 
				
			||||||
@@ -38,6 +42,14 @@ class UserHistory(HistoryTableABC):
 | 
				
			|||||||
    def xp(self) -> int:
 | 
					    def xp(self) -> int:
 | 
				
			||||||
        return self._xp
 | 
					        return self._xp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def message_count(self) -> int:
 | 
				
			||||||
 | 
					        return self._message_count
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def reaction_count(self) -> int:
 | 
				
			||||||
 | 
					        return self._reaction_count
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def server(self) -> int:
 | 
					    def server(self) -> int:
 | 
				
			||||||
        return self._server
 | 
					        return self._server
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@ __title__ = "bot_data.service"
 | 
				
			|||||||
__author__ = "Sven Heidemann"
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
__license__ = "MIT"
 | 
					__license__ = "MIT"
 | 
				
			||||||
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
					__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
 | 
				
			||||||
__version__ = "1.0.6"
 | 
					__version__ = "1.1.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -23,4 +23,4 @@ from collections import namedtuple
 | 
				
			|||||||
# imports
 | 
					# imports
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="1", minor="0", micro="6")
 | 
					version_info = VersionInfo(major="1", minor="1", micro="1")
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										123
									
								
								kdb-bot/src/bot_data/service/achievements_repository_service.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										123
									
								
								kdb-bot/src/bot_data/service/achievements_repository_service.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,123 @@
 | 
				
			|||||||
 | 
					from cpl_core.database.context import DatabaseContextABC
 | 
				
			||||||
 | 
					from cpl_query.extension import List
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from bot_core.logging.database_logger import DatabaseLogger
 | 
				
			||||||
 | 
					from bot_data.abc.achievement_repository_abc import AchievementRepositoryABC
 | 
				
			||||||
 | 
					from bot_data.abc.server_repository_abc import ServerRepositoryABC
 | 
				
			||||||
 | 
					from bot_data.abc.user_repository_abc import UserRepositoryABC
 | 
				
			||||||
 | 
					from bot_data.model.achievement import Achievement
 | 
				
			||||||
 | 
					from bot_data.model.user_got_achievement import UserGotAchievement
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class AchievementRepositoryService(AchievementRepositoryABC):
 | 
				
			||||||
 | 
					    def __init__(
 | 
				
			||||||
 | 
					        self,
 | 
				
			||||||
 | 
					        logger: DatabaseLogger,
 | 
				
			||||||
 | 
					        db_context: DatabaseContextABC,
 | 
				
			||||||
 | 
					        servers: ServerRepositoryABC,
 | 
				
			||||||
 | 
					        users: UserRepositoryABC,
 | 
				
			||||||
 | 
					    ):
 | 
				
			||||||
 | 
					        self._logger = logger
 | 
				
			||||||
 | 
					        self._context = db_context
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self._servers = servers
 | 
				
			||||||
 | 
					        self._users = users
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        AchievementRepositoryABC.__init__(self)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def _from_result(self, result: tuple):
 | 
				
			||||||
 | 
					        return Achievement(
 | 
				
			||||||
 | 
					            result[1],
 | 
				
			||||||
 | 
					            result[2],
 | 
				
			||||||
 | 
					            result[3],
 | 
				
			||||||
 | 
					            result[4],
 | 
				
			||||||
 | 
					            result[5],
 | 
				
			||||||
 | 
					            self._servers.get_server_by_id(result[6]),
 | 
				
			||||||
 | 
					            result[7],
 | 
				
			||||||
 | 
					            result[8],
 | 
				
			||||||
 | 
					            id=result[0],
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def _join_from_result(self, result: tuple):
 | 
				
			||||||
 | 
					        return UserGotAchievement(
 | 
				
			||||||
 | 
					            self._users.get_user_by_id(result[1]),
 | 
				
			||||||
 | 
					            self.get_achievement_by_id(result[2]),
 | 
				
			||||||
 | 
					            result[3],
 | 
				
			||||||
 | 
					            result[4],
 | 
				
			||||||
 | 
					            id=result[0],
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def get_achievements(self) -> List[Achievement]:
 | 
				
			||||||
 | 
					        achievements = List(Achievement)
 | 
				
			||||||
 | 
					        self._logger.trace(__name__, f"Send SQL command: {Achievement.get_select_all_string()}")
 | 
				
			||||||
 | 
					        results = self._context.select(Achievement.get_select_all_string())
 | 
				
			||||||
 | 
					        for result in results:
 | 
				
			||||||
 | 
					            self._logger.trace(__name__, f"Get user with id {result[0]}")
 | 
				
			||||||
 | 
					            achievements.append(self._from_result(result))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return achievements
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def get_achievement_by_id(self, id: int) -> Achievement:
 | 
				
			||||||
 | 
					        self._logger.trace(__name__, f"Send SQL command: {Achievement.get_select_by_id_string(id)}")
 | 
				
			||||||
 | 
					        result = self._context.select(Achievement.get_select_by_id_string(id))[0]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return self._from_result(result)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def get_achievements_by_server_id(self, server_id: int) -> List[Achievement]:
 | 
				
			||||||
 | 
					        achievements = List(Achievement)
 | 
				
			||||||
 | 
					        self._logger.trace(__name__, f"Send SQL command: {Achievement.get_select_by_server_id_string(server_id)}")
 | 
				
			||||||
 | 
					        results = self._context.select(Achievement.get_select_by_server_id_string(server_id))
 | 
				
			||||||
 | 
					        for result in results:
 | 
				
			||||||
 | 
					            self._logger.trace(__name__, f"Get user with id {result[0]}")
 | 
				
			||||||
 | 
					            achievements.append(self._from_result(result))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return achievements
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def get_achievements_by_user_id(self, user_id: int) -> List[Achievement]:
 | 
				
			||||||
 | 
					        achievements = List(Achievement)
 | 
				
			||||||
 | 
					        achievements_joins = List(UserGotAchievement)
 | 
				
			||||||
 | 
					        self._logger.trace(__name__, f"Send SQL command: {UserGotAchievement.get_select_by_user_id_string(user_id)}")
 | 
				
			||||||
 | 
					        results = self._context.select(UserGotAchievement.get_select_by_user_id_string(user_id))
 | 
				
			||||||
 | 
					        for result in results:
 | 
				
			||||||
 | 
					            self._logger.trace(__name__, f"Got UserGotAchievement with id {result[0]}")
 | 
				
			||||||
 | 
					            achievements_joins.append(self._join_from_result(result))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for achievements_join in achievements_joins:
 | 
				
			||||||
 | 
					            results = self._context.select(Achievement.get_select_by_id_string(achievements_join.achievement.id))
 | 
				
			||||||
 | 
					            for result in results:
 | 
				
			||||||
 | 
					                self._logger.trace(__name__, f"Got Achievement with id {result[0]}")
 | 
				
			||||||
 | 
					                achievements.append(self._from_result(result))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return achievements
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def get_user_got_achievements_by_achievement_id(self, achievement_id: int) -> List[Achievement]:
 | 
				
			||||||
 | 
					        achievements_joins = List(UserGotAchievement)
 | 
				
			||||||
 | 
					        self._logger.trace(
 | 
				
			||||||
 | 
					            __name__, f"Send SQL command: {UserGotAchievement.get_select_by_achievement_id_string(achievement_id)}"
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        results = self._context.select(UserGotAchievement.get_select_by_achievement_id_string(achievement_id))
 | 
				
			||||||
 | 
					        for result in results:
 | 
				
			||||||
 | 
					            self._logger.trace(__name__, f"Got UserGotAchievement with id {result[0]}")
 | 
				
			||||||
 | 
					            achievements_joins.append(self._join_from_result(result))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return achievements_joins
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def add_achievement(self, achievement: Achievement):
 | 
				
			||||||
 | 
					        self._logger.trace(__name__, f"Send SQL command: {achievement.insert_string}")
 | 
				
			||||||
 | 
					        self._context.cursor.execute(achievement.insert_string)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def update_achievement(self, achievement: Achievement):
 | 
				
			||||||
 | 
					        self._logger.trace(__name__, f"Send SQL command: {achievement.udpate_string}")
 | 
				
			||||||
 | 
					        self._context.cursor.execute(achievement.udpate_string)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def delete_achievement(self, achievement: Achievement):
 | 
				
			||||||
 | 
					        self._logger.trace(__name__, f"Send SQL command: {achievement.delete_string}")
 | 
				
			||||||
 | 
					        self._context.cursor.execute(achievement.delete_string)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def add_user_got_achievement(self, join: UserGotAchievement):
 | 
				
			||||||
 | 
					        self._logger.trace(__name__, f"Send SQL command: {join.insert_string}")
 | 
				
			||||||
 | 
					        self._context.cursor.execute(join.insert_string)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def delete_user_got_achievement(self, join: UserGotAchievement):
 | 
				
			||||||
 | 
					        self._logger.trace(__name__, f"Send SQL command: {join.delete_string}")
 | 
				
			||||||
 | 
					        self._context.cursor.execute(join.delete_string)
 | 
				
			||||||
@@ -1,3 +1,4 @@
 | 
				
			|||||||
 | 
					from enum import Enum
 | 
				
			||||||
from typing import Optional
 | 
					from typing import Optional
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from cpl_core.database.context import DatabaseContextABC
 | 
					from cpl_core.database.context import DatabaseContextABC
 | 
				
			||||||
@@ -100,9 +101,17 @@ class AuthUserRepositoryService(AuthUserRepositoryABC):
 | 
				
			|||||||
        ):
 | 
					        ):
 | 
				
			||||||
            crit_sort_direction = criteria.sort_direction.lower()
 | 
					            crit_sort_direction = criteria.sort_direction.lower()
 | 
				
			||||||
            if crit_sort_direction == "desc" or crit_sort_direction == "descending":
 | 
					            if crit_sort_direction == "desc" or crit_sort_direction == "descending":
 | 
				
			||||||
                query = query.order_by_descending(lambda x: getattr(x, criteria.sort_column))
 | 
					                query = query.order_by_descending(
 | 
				
			||||||
 | 
					                    lambda x: getattr(x, criteria.sort_column)
 | 
				
			||||||
 | 
					                    if not isinstance(getattr(x, criteria.sort_column), Enum)
 | 
				
			||||||
 | 
					                    else getattr(x, criteria.sort_column).value
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
                query = query.order_by(lambda x: getattr(x, criteria.sort_column))
 | 
					                query = query.order_by(
 | 
				
			||||||
 | 
					                    lambda x: getattr(x, criteria.sort_column)
 | 
				
			||||||
 | 
					                    if not isinstance(getattr(x, criteria.sort_column), Enum)
 | 
				
			||||||
 | 
					                    else getattr(x, criteria.sort_column).value
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        result = FilteredResult()
 | 
					        result = FilteredResult()
 | 
				
			||||||
        result.total_count = query.count()
 | 
					        result.total_count = query.count()
 | 
				
			||||||
 
 | 
				
			|||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user