Compare commits
	
		
			33 Commits
		
	
	
		
			dev
			...
			9622232c33
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 9622232c33 | |||
| d09a13f0ee | |||
| 3360baad6c | |||
| 0de8b9b41d | |||
| 0e647fabe7 | |||
| 76787cb180 | |||
| 15b2e22642 | |||
| f520f4e7ec | |||
| 959cf33272 | |||
| be174cf970 | |||
| 934e0e1423 | |||
| 0c3e298562 | |||
| 42eeb068e3 | |||
| 89199004c4 | |||
| 8f26835d72 | |||
| 4c1de9e20b | |||
| 9c5760e0f9 | |||
| dd6b609094 | |||
| 3810dec927 | |||
| a87380f6f8 | |||
| 98ac7835b6 | |||
| 0a76068604 | |||
| f9caf59180 | |||
| 284318bb10 | |||
| 6130cac6fe | |||
| 3a64c51600 | |||
| 90fce5a79a | |||
| d448ad7707 | |||
| 19791ff9d8 | |||
| 3cba8de675 | |||
| b7ff070676 | |||
| c88e07d743 | |||
| f5b978b231 | 
| @@ -6,18 +6,16 @@ on: | ||||
|       - dev | ||||
|  | ||||
| jobs: | ||||
|   pre-build: | ||||
|   on-push-deploy_sh-edraft: | ||||
|     runs-on: [ dobby.sh-edraft.de, ubuntu-latest ] | ||||
|     container: git.sh-edraft.de/sh-edraft.de/act-runner:latest | ||||
|     container: catthehacker/ubuntu:act-latest | ||||
|     steps: | ||||
|       - name: Shutdown stack | ||||
|         run: docker stack rm sdb_dev | ||||
|       - name: Setup Python 3.10 | ||||
|         uses: actions/setup-python@v3 | ||||
|         with: | ||||
|           python-version: "3.10.12" | ||||
|       - run: python -v | ||||
|  | ||||
|   build-bot: | ||||
|     needs: pre-build | ||||
|     runs-on: [ dobby.sh-edraft.de, ubuntu-latest ] | ||||
|     container: git.sh-edraft.de/sh-edraft.de/act-runner:latest | ||||
|     steps: | ||||
|       - name: Setup docker | ||||
|         uses: https://github.com/papodaca/install-docker-action@main | ||||
|       - run: docker -v | ||||
| @@ -28,45 +26,20 @@ jobs: | ||||
|           token: ${{ secrets.CI_ACCESS_TOKEN }} | ||||
|           submodules: true | ||||
|  | ||||
|       - name: Shutdown stack | ||||
|         run: docker stack rm sdb_staging | ||||
|  | ||||
|       - name: Prepare bot build | ||||
|         run: | | ||||
|           python3.10 -m pip install --extra-index-url https://pip.sh-edraft.de cpl-cli | ||||
|           cd bot | ||||
|           pip install --extra-index-url https://pip.sh-edraft.de cpl-cli | ||||
|           cpl i | ||||
|  | ||||
|       - name: Build docker bot | ||||
|         run: | | ||||
|           cd bot | ||||
|           docker image prune -f | ||||
|           cpl build | ||||
|           docker build -t git.sh-edraft.de/sh-edraft.de/sdb-bot:$(cpl gv)-dev . | ||||
|  | ||||
|       - name: Login to registry git.sh-edraft.de | ||||
|         uses: https://github.com/docker/login-action@v1 | ||||
|         with: | ||||
|           registry: git.sh-edraft.de | ||||
|           username: ${{ secrets.CI_USERNAME }} | ||||
|           password: ${{ secrets.CI_ACCESS_TOKEN }} | ||||
|  | ||||
|       - name: Push image | ||||
|         run: | | ||||
|           cd bot | ||||
|           docker push git.sh-edraft.de/sh-edraft.de/sdb-bot:$(cpl gv)-dev | ||||
|  | ||||
|   build-web: | ||||
|     needs: pre-build | ||||
|     runs-on: [ dobby.sh-edraft.de, ubuntu-latest ] | ||||
|     container: git.sh-edraft.de/sh-edraft.de/act-runner:latest | ||||
|     steps: | ||||
|       - name: Setup docker | ||||
|         uses: https://github.com/papodaca/install-docker-action@main | ||||
|       - run: docker -v | ||||
|  | ||||
|       - name: Clone Repository | ||||
|         uses: https://github.com/actions/checkout@v3 | ||||
|         with: | ||||
|           token: ${{ secrets.CI_ACCESS_TOKEN }} | ||||
|           submodules: true | ||||
|           cpl docker-build | ||||
|  | ||||
|       - name: Setup node | ||||
|         uses: https://github.com/actions/setup-node@v3 | ||||
| @@ -75,47 +48,13 @@ jobs: | ||||
|         run: | | ||||
|           cd web | ||||
|           npm install -g ts-node | ||||
|           npm ci | ||||
|           npm i | ||||
|  | ||||
|       - name: Build docker web | ||||
|         run: | | ||||
|           cd web | ||||
|           docker image prune -f | ||||
|           cp src/favicon.dev.ico src/favicon.ico | ||||
|           npm run build | ||||
|           docker build -t git.sh-edraft.de/sh-edraft.de/sdb-web:$(npm run -s gv)-dev . | ||||
|  | ||||
|       - name: Login to registry git.sh-edraft.de | ||||
|         uses: https://github.com/docker/login-action@v1 | ||||
|         with: | ||||
|           registry: git.sh-edraft.de | ||||
|           username: ${{ secrets.CI_USERNAME }} | ||||
|           password: ${{ secrets.CI_ACCESS_TOKEN }} | ||||
|  | ||||
|       - name: Push image | ||||
|         run: | | ||||
|           cd web | ||||
|           docker push git.sh-edraft.de/sh-edraft.de/sdb-web:$(npm run -s gv)-dev | ||||
|  | ||||
|   deploy: | ||||
|     needs: [ build-bot, build-web ] | ||||
|     runs-on: [ dobby.sh-edraft.de, ubuntu-latest ] | ||||
|     container: git.sh-edraft.de/sh-edraft.de/act-runner:latest | ||||
|     steps: | ||||
|       - name: Clone Repository | ||||
|         uses: https://github.com/actions/checkout@v3 | ||||
|         with: | ||||
|           token: ${{ secrets.CI_ACCESS_TOKEN }} | ||||
|           submodules: true | ||||
|  | ||||
|       - name: Install cpl | ||||
|         run: python3.10 -m pip install --extra-index-url https://pip.sh-edraft.de cpl-cli | ||||
|  | ||||
|       - name: Set version | ||||
|         run: | | ||||
|           cd bot/docker | ||||
|           chmod +x ./set-docker-compose-image-version.sh | ||||
|           ./set-docker-compose-image-version.sh git.sh-edraft.de/sh-edraft.de/sdb-bot:$(cd ../; cpl gv)-dev git.sh-edraft.de/sh-edraft.de/sdb-web:$(cd ../../web; npm run -s gv;)-dev | ||||
|           npm run docker-build | ||||
|  | ||||
|       - name: Deploy Stack to sh-edraft.de | ||||
|         uses: https://github.com/kgierke/portainer-stack-deployment@v1 | ||||
| @@ -124,6 +63,6 @@ jobs: | ||||
|           portainer-username: "gitea_job" | ||||
|           portainer-password: "${{ secrets.docker_job }}" | ||||
|           portainer-endpoint: 2 | ||||
|           name: sdb_dev | ||||
|           file: bot/docker/docker-compose.dev.yml | ||||
|           name: sdb_staging | ||||
|           file: bot/docker/docker-compose.staging.yml | ||||
|           variables: '{}' | ||||
|   | ||||
| @@ -1,72 +1,42 @@ | ||||
| name: Deploy prod on push | ||||
| run-name: Deploy prod on push | ||||
| name: Deploy dev on push | ||||
| run-name: Deploy dev on push | ||||
| on: | ||||
|   push: | ||||
|     branches: | ||||
|       - master | ||||
|  | ||||
| jobs: | ||||
|   pre-build: | ||||
|   on-push-deploy_sh-edraft: | ||||
|     runs-on: [ dobby.sh-edraft.de, ubuntu-latest ] | ||||
|     container: git.sh-edraft.de/sh-edraft.de/act-runner:latest | ||||
|     container: catthehacker/ubuntu:act-latest | ||||
|     steps: | ||||
|       - name: Shutdown stack | ||||
|         run: docker stack rm sdb_prod | ||||
|       - name: Setup Python 3.10 | ||||
|         uses: actions/setup-python@v3 | ||||
|         with: | ||||
|           python-version: "3.10.12" | ||||
|       - run: python -v | ||||
|  | ||||
|   build-bot: | ||||
|     needs: pre-build | ||||
|     runs-on: [ dobby.sh-edraft.de, ubuntu-latest ] | ||||
|     container: git.sh-edraft.de/sh-edraft.de/act-runner:latest | ||||
|     steps: | ||||
|       - name: Setup docker | ||||
|         uses: https://github.com/papodaca/install-docker-action@main | ||||
|       - run: docker -v | ||||
|  | ||||
|       - name: Clone Repository | ||||
|         uses: https://github.com/actions/checkout@v3 | ||||
|         with: | ||||
|           token: ${{ secrets.CI_ACCESS_TOKEN }} | ||||
|           submodules: true | ||||
|  | ||||
|       - name: Shutdown stack | ||||
|         run: docker stack rm sdb_prod | ||||
|  | ||||
|       - name: Prepare bot build | ||||
|         run: | | ||||
|           python3.10 -m pip install --extra-index-url https://pip.sh-edraft.de cpl-cli | ||||
|           cd bot | ||||
|           pip install --extra-index-url https://pip.sh-edraft.de cpl-cli | ||||
|           cpl i | ||||
|  | ||||
|       - name: Build docker bot | ||||
|         run: | | ||||
|           cd bot | ||||
|           docker image prune -f | ||||
|           cpl build | ||||
|           docker build -t git.sh-edraft.de/sh-edraft.de/sdb-bot:$(cpl gv) . | ||||
|  | ||||
|       - name: Login to registry git.sh-edraft.de | ||||
|         uses: https://github.com/docker/login-action@v1 | ||||
|         with: | ||||
|           registry: git.sh-edraft.de | ||||
|           username: ${{ secrets.CI_USERNAME }} | ||||
|           password: ${{ secrets.CI_ACCESS_TOKEN }} | ||||
|  | ||||
|       - name: Push image | ||||
|         run: | | ||||
|           cd bot | ||||
|           docker push git.sh-edraft.de/sh-edraft.de/sdb-bot:$(cpl gv) | ||||
|  | ||||
|   build-web: | ||||
|     needs: pre-build | ||||
|     runs-on: [ dobby.sh-edraft.de, ubuntu-latest ] | ||||
|     container: git.sh-edraft.de/sh-edraft.de/act-runner:latest | ||||
|     steps: | ||||
|       - name: Setup docker | ||||
|         uses: https://github.com/papodaca/install-docker-action@main | ||||
|       - run: docker -v | ||||
|  | ||||
|       - name: Clone Repository | ||||
|         uses: https://github.com/actions/checkout@v3 | ||||
|         with: | ||||
|           token: ${{ secrets.CI_ACCESS_TOKEN }} | ||||
|           submodules: true | ||||
|           cpl docker-build | ||||
|  | ||||
|       - name: Setup node | ||||
|         uses: https://github.com/actions/setup-node@v3 | ||||
| @@ -75,47 +45,13 @@ jobs: | ||||
|         run: | | ||||
|           cd web | ||||
|           npm install -g ts-node | ||||
|           npm ci | ||||
|           npm i | ||||
|  | ||||
|       - name: Build docker web | ||||
|         run: | | ||||
|           cd web | ||||
|           docker image prune -f | ||||
|           cp src/favicon.ico src/favicon.ico | ||||
|           npm run build | ||||
|           docker build -t git.sh-edraft.de/sh-edraft.de/sdb-web:$(npm run -s gv) . | ||||
|  | ||||
|       - name: Login to registry git.sh-edraft.de | ||||
|         uses: https://github.com/docker/login-action@v1 | ||||
|         with: | ||||
|           registry: git.sh-edraft.de | ||||
|           username: ${{ secrets.CI_USERNAME }} | ||||
|           password: ${{ secrets.CI_ACCESS_TOKEN }} | ||||
|  | ||||
|       - name: Push image | ||||
|         run: | | ||||
|           cd web | ||||
|           docker push git.sh-edraft.de/sh-edraft.de/sdb-web:$(npm run -s gv) | ||||
|  | ||||
|   deploy: | ||||
|     needs: [ build-bot, build-web ] | ||||
|     runs-on: [ dobby.sh-edraft.de, ubuntu-latest ] | ||||
|     container: git.sh-edraft.de/sh-edraft.de/act-runner:latest | ||||
|     steps: | ||||
|       - name: Clone Repository | ||||
|         uses: https://github.com/actions/checkout@v3 | ||||
|         with: | ||||
|           token: ${{ secrets.CI_ACCESS_TOKEN }} | ||||
|           submodules: true | ||||
|  | ||||
|       - name: Install cpl | ||||
|         run: python3.10 -m pip install --extra-index-url https://pip.sh-edraft.de cpl-cli | ||||
|  | ||||
|       - name: Set version | ||||
|         run: | | ||||
|           cd bot/docker | ||||
|           chmod +x ./set-docker-compose-image-version.sh | ||||
|           ./set-docker-compose-image-version.sh git.sh-edraft.de/sh-edraft.de/sdb-bot:$(cd ../; cpl gv) git.sh-edraft.de/sh-edraft.de/sdb-web:$(cd ../../web; npm run -s gv;) | ||||
|           npm run docker-build | ||||
|  | ||||
|       - name: Deploy Stack to sh-edraft.de | ||||
|         uses: https://github.com/kgierke/portainer-stack-deployment@v1 | ||||
| @@ -125,5 +61,5 @@ jobs: | ||||
|           portainer-password: "${{ secrets.docker_job }}" | ||||
|           portainer-endpoint: 2 | ||||
|           name: sdb_prod | ||||
|           file: bot/docker/docker-compose.yml | ||||
|           file: ./docker-compose.yml | ||||
|           variables: '{}' | ||||
|   | ||||
| @@ -1,129 +0,0 @@ | ||||
| name: Deploy staging on push | ||||
| run-name: Deploy staging on push | ||||
| on: | ||||
|   push: | ||||
|     branches: | ||||
|       - staging | ||||
|  | ||||
| jobs: | ||||
|   pre-build: | ||||
|     runs-on: [ dobby.sh-edraft.de, ubuntu-latest ] | ||||
|     container: git.sh-edraft.de/sh-edraft.de/act-runner:latest | ||||
|     steps: | ||||
|       - name: Shutdown stack | ||||
|         run: docker stack rm sdb_staging | ||||
|  | ||||
|   build-bot: | ||||
|     needs: pre-build | ||||
|     runs-on: [ dobby.sh-edraft.de, ubuntu-latest ] | ||||
|     container: git.sh-edraft.de/sh-edraft.de/act-runner:latest | ||||
|     steps: | ||||
|       - name: Setup docker | ||||
|         uses: https://github.com/papodaca/install-docker-action@main | ||||
|       - run: docker -v | ||||
|  | ||||
|       - name: Clone Repository | ||||
|         uses: https://github.com/actions/checkout@v3 | ||||
|         with: | ||||
|           token: ${{ secrets.CI_ACCESS_TOKEN }} | ||||
|           submodules: true | ||||
|  | ||||
|       - name: Prepare bot build | ||||
|         run: | | ||||
|           python3.10 -m pip install --extra-index-url https://pip.sh-edraft.de cpl-cli | ||||
|           cd bot | ||||
|           cpl i | ||||
|  | ||||
|       - name: Build docker bot | ||||
|         run: | | ||||
|           cd bot | ||||
|           docker image prune -f | ||||
|           cpl build | ||||
|           docker build -t git.sh-edraft.de/sh-edraft.de/sdb-bot:$(cpl gv)-staging . | ||||
|  | ||||
|       - name: Login to registry git.sh-edraft.de | ||||
|         uses: https://github.com/docker/login-action@v1 | ||||
|         with: | ||||
|           registry: git.sh-edraft.de | ||||
|           username: ${{ secrets.CI_USERNAME }} | ||||
|           password: ${{ secrets.CI_ACCESS_TOKEN }} | ||||
|  | ||||
|       - name: Push image | ||||
|         run: | | ||||
|           cd bot | ||||
|           docker push git.sh-edraft.de/sh-edraft.de/sdb-bot:$(cpl gv)-staging | ||||
|  | ||||
|   build-web: | ||||
|     needs: pre-build | ||||
|     runs-on: [ dobby.sh-edraft.de, ubuntu-latest ] | ||||
|     container: git.sh-edraft.de/sh-edraft.de/act-runner:latest | ||||
|     steps: | ||||
|       - name: Setup docker | ||||
|         uses: https://github.com/papodaca/install-docker-action@main | ||||
|       - run: docker -v | ||||
|  | ||||
|       - name: Clone Repository | ||||
|         uses: https://github.com/actions/checkout@v3 | ||||
|         with: | ||||
|           token: ${{ secrets.CI_ACCESS_TOKEN }} | ||||
|           submodules: true | ||||
|  | ||||
|       - name: Setup node | ||||
|         uses: https://github.com/actions/setup-node@v3 | ||||
|  | ||||
|       - name: Prepare web build | ||||
|         run: | | ||||
|           cd web | ||||
|           npm install -g ts-node | ||||
|           npm ci | ||||
|  | ||||
|       - name: Build docker web | ||||
|         run: | | ||||
|           cd web | ||||
|           docker image prune -f | ||||
|           cp src/favicon.staging.ico src/favicon.ico | ||||
|           npm run build | ||||
|           docker build -t git.sh-edraft.de/sh-edraft.de/sdb-web:$(npm run -s gv)-staging . | ||||
|  | ||||
|       - name: Login to registry git.sh-edraft.de | ||||
|         uses: https://github.com/docker/login-action@v1 | ||||
|         with: | ||||
|           registry: git.sh-edraft.de | ||||
|           username: ${{ secrets.CI_USERNAME }} | ||||
|           password: ${{ secrets.CI_ACCESS_TOKEN }} | ||||
|  | ||||
|       - name: Push image | ||||
|         run: | | ||||
|           cd web | ||||
|           docker push git.sh-edraft.de/sh-edraft.de/sdb-web:$(npm run -s gv)-staging | ||||
|  | ||||
|   deploy: | ||||
|     needs: [ build-bot, build-web ] | ||||
|     runs-on: [ dobby.sh-edraft.de, ubuntu-latest ] | ||||
|     container: git.sh-edraft.de/sh-edraft.de/act-runner:latest | ||||
|     steps: | ||||
|       - name: Clone Repository | ||||
|         uses: https://github.com/actions/checkout@v3 | ||||
|         with: | ||||
|           token: ${{ secrets.CI_ACCESS_TOKEN }} | ||||
|           submodules: true | ||||
|  | ||||
|       - name: Install cpl | ||||
|         run: python3.10 -m pip install --extra-index-url https://pip.sh-edraft.de cpl-cli | ||||
|  | ||||
|       - name: Set version | ||||
|         run: | | ||||
|           cd bot/docker | ||||
|           chmod +x ./set-docker-compose-image-version.sh | ||||
|           ./set-docker-compose-image-version.sh git.sh-edraft.de/sh-edraft.de/sdb-bot:$(cd ../; cpl gv)-staging git.sh-edraft.de/sh-edraft.de/sdb-web:$(cd ../../web; npm run -s gv;)-staging | ||||
|  | ||||
|       - name: Deploy Stack to sh-edraft.de | ||||
|         uses: https://github.com/kgierke/portainer-stack-deployment@v1 | ||||
|         with: | ||||
|           portainer-url: "https://docker.sh-edraft.de" | ||||
|           portainer-username: "gitea_job" | ||||
|           portainer-password: "${{ secrets.docker_job }}" | ||||
|           portainer-endpoint: 2 | ||||
|           name: sdb_staging | ||||
|           file: bot/docker/docker-compose.staging.yml | ||||
|           variables: '{}' | ||||
| @@ -14,14 +14,14 @@ | ||||
|       "config": "src/modules/config/config.json", | ||||
|       "database": "src/modules/database/database.json", | ||||
|       "level": "src/modules/level/level.json", | ||||
|       "permission": "src/modules/permission/permission.json", | ||||
|       "technician": "src/modules/technician/technician.json", | ||||
|       "short-role-name": "src/modules/short_role_name/short-role-name.json", | ||||
|       "special-offers": "src/modules/special_offers/special-offers.json", | ||||
|       "checks": "tools/checks/checks.json", | ||||
|       "get-version": "tools/get_version/get-version.json", | ||||
|       "post-build": "tools/post_build/post-build.json", | ||||
|       "set-version": "tools/set_version/set-version.json", | ||||
|       "migration-to-sql": "tools/migration_to_sql/migration-to-sql.json" | ||||
|       "set-version": "tools/set_version/set-version.json" | ||||
|     }, | ||||
|     "Scripts": { | ||||
|       "format": "black ./", | ||||
|   | ||||
 Submodule bot/docker updated: 36ed43055d...91461d3ce3
									
								
							| @@ -15,7 +15,7 @@ __title__ = "bot" | ||||
| __author__ = "Sven Heidemann" | ||||
| __license__ = "MIT" | ||||
| __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" | ||||
| __version__ = "1.2.3" | ||||
| __version__ = "1.2.0" | ||||
|  | ||||
| from collections import namedtuple | ||||
|  | ||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | ||||
| # imports: | ||||
|  | ||||
| VersionInfo = namedtuple("VersionInfo", "major minor micro") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="3") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="0") | ||||
|   | ||||
| @@ -11,7 +11,6 @@ from bot_api.api_thread import ApiThread | ||||
| from bot_core.abc.task_abc import TaskABC | ||||
| from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum | ||||
| from bot_core.configuration.feature_flags_settings import FeatureFlagsSettings | ||||
| from bot_core.environment_variables import MAINTENANCE | ||||
| from bot_core.service.data_integrity_service import DataIntegrityService | ||||
|  | ||||
|  | ||||
| @@ -59,7 +58,6 @@ class Application(DiscordBotApplicationABC): | ||||
|                 return | ||||
|  | ||||
|             self._logger.info(__name__, f"Try to start {DiscordBotService.__name__}") | ||||
|             if not self._config.get_configuration(MAINTENANCE): | ||||
|             for task in self._tasks: | ||||
|                 await self._bot.add_cog(task) | ||||
|  | ||||
|   | ||||
							
								
								
									
										0
									
								
								bot/src/bot/bot
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								bot/src/bot/bot
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							| @@ -4,7 +4,7 @@ | ||||
|     "Version": { | ||||
|       "Major": "1", | ||||
|       "Minor": "2", | ||||
|       "Micro": "3" | ||||
|       "Micro": "0" | ||||
|     }, | ||||
|     "Author": "Sven Heidemann", | ||||
|     "AuthorEmail": "sven.heidemann@sh-edraft.de", | ||||
| @@ -16,7 +16,7 @@ | ||||
|     "LicenseName": "MIT", | ||||
|     "LicenseDescription": "MIT, see LICENSE for more details.", | ||||
|     "Dependencies": [ | ||||
|       "cpl-core==2023.10.1", | ||||
|       "cpl-core==2023.10.0", | ||||
|       "cpl-translation==2023.4.0.post1", | ||||
|       "cpl-query==2023.10.0", | ||||
|       "cpl-discord==2023.10.0.post1", | ||||
| @@ -33,13 +33,11 @@ | ||||
|       "cryptography==41.0.4", | ||||
|       "discord==2.3.2", | ||||
|       "bs4==0.0.1", | ||||
|       "lxml==4.9.3", | ||||
|       "python-valve==0.2.1" | ||||
|       "lxml==4.9.3" | ||||
|     ], | ||||
|     "DevDependencies": [ | ||||
|       "cpl-cli==2023.4.0.post3", | ||||
|       "pygount==1.6.1", | ||||
|       "black==23.10.1" | ||||
|       "pygount==1.6.1" | ||||
|     ], | ||||
|     "PythonVersion": ">=3.10.4", | ||||
|     "PythonPath": {}, | ||||
| @@ -71,6 +69,7 @@ | ||||
|       "../modules/config/config.json", | ||||
|       "../modules/database/database.json", | ||||
|       "../modules/level/level.json", | ||||
|       "../modules/permission/permission.json", | ||||
|       "../modules/short_role_name/short-role-name.json", | ||||
|       "../modules/special_offers/special-offers.json", | ||||
|       "../modules/technician/technician.json" | ||||
|   | ||||
 Submodule bot/src/bot/config updated: be5b15f227...6f4414ce9d
									
								
							| @@ -15,7 +15,7 @@ __title__ = "bot.extension" | ||||
| __author__ = "Sven Heidemann" | ||||
| __license__ = "MIT" | ||||
| __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" | ||||
| __version__ = "1.2.3" | ||||
| __version__ = "1.2.0" | ||||
|  | ||||
| from collections import namedtuple | ||||
|  | ||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | ||||
| # imports: | ||||
|  | ||||
| VersionInfo = namedtuple("VersionInfo", "major minor micro") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="3") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="0") | ||||
|   | ||||
| @@ -1,22 +0,0 @@ | ||||
| import os | ||||
| import shutil | ||||
| from datetime import datetime | ||||
|  | ||||
| from cpl_core.application.application_extension_abc import ApplicationExtensionABC | ||||
| from cpl_core.configuration import ConfigurationABC | ||||
| from cpl_core.dependency_injection import ServiceProviderABC | ||||
| from cpl_query.extension import List | ||||
|  | ||||
|  | ||||
| class CleanLogsExtension(ApplicationExtensionABC): | ||||
|     def __init__(self): | ||||
|         pass | ||||
|  | ||||
|     async def run(self, config: ConfigurationABC, services: ServiceProviderABC): | ||||
|         ( | ||||
|             List(str, os.listdir("logs/")) | ||||
|             .where(lambda x: os.path.isdir(f"logs/{x}")) | ||||
|             .order_by() | ||||
|             .where(lambda x: (datetime.now() - datetime.strptime(x, "%Y-%m-%d")).days >= 7) | ||||
|             .for_each(lambda x: shutil.rmtree(f"logs/{x}")) | ||||
|         ) | ||||
| @@ -6,11 +6,10 @@ from cpl_core.application import ApplicationBuilder | ||||
| from cpl_core.console import Console | ||||
|  | ||||
| from bot.application import Application | ||||
| from bot.extension.clean_logs_extension import CleanLogsExtension | ||||
| from bot.extension.init_bot_extension import InitBotExtension | ||||
| from bot.startup import Startup | ||||
| from bot.startup_discord_extension import StartupDiscordExtension | ||||
| from bot_data.startup_migration_extension import StartupMigrationExtension | ||||
| from bot.startup_migration_extension import StartupMigrationExtension | ||||
| from bot.startup_module_extension import StartupModuleExtension | ||||
| from bot.startup_settings_extension import StartupSettingsExtension | ||||
| from bot_api.app_api_extension import AppApiExtension | ||||
| @@ -32,7 +31,6 @@ class Program: | ||||
|             .use_extension(StartupDiscordExtension) | ||||
|             .use_extension(StartupModuleExtension) | ||||
|             .use_extension(StartupMigrationExtension) | ||||
|             .use_extension(CleanLogsExtension) | ||||
|             .use_extension(DatabaseExtension) | ||||
|             .use_extension(ConfigExtension) | ||||
|             .use_extension(InitBotExtension) | ||||
|   | ||||
| @@ -12,6 +12,7 @@ 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.level.level_module import LevelModule | ||||
| from modules.permission.permission_module import PermissionModule | ||||
| from modules.short_role_name.short_role_name_module import ShortRoleNameModule | ||||
| from modules.special_offers.special_offers_module import SteamSpecialOffersModule | ||||
| from modules.technician.technician_module import TechnicianModule | ||||
| @@ -29,6 +30,7 @@ class ModuleList: | ||||
|                 ConfigModule,  # has to be before db check | ||||
|                 DatabaseModule, | ||||
|                 GraphQLModule, | ||||
|                 PermissionModule, | ||||
|                 AutoRoleModule, | ||||
|                 BaseModule, | ||||
|                 LevelModule, | ||||
|   | ||||
| @@ -15,7 +15,6 @@ from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum | ||||
| from bot_core.configuration.feature_flags_settings import FeatureFlagsSettings | ||||
| from bot_core.logging.command_logger import CommandLogger | ||||
| from bot_core.logging.database_logger import DatabaseLogger | ||||
| from bot_core.logging.event_logger import EventLogger | ||||
| from bot_core.logging.message_logger import MessageLogger | ||||
| from bot_core.logging.task_logger import TaskLogger | ||||
| from bot_data.db_context import DBContext | ||||
| @@ -46,7 +45,6 @@ class Startup(StartupABC): | ||||
|             services.add_singleton(CustomFileLoggerABC, DatabaseLogger) | ||||
|             services.add_singleton(CustomFileLoggerABC, MessageLogger) | ||||
|             services.add_singleton(CustomFileLoggerABC, TaskLogger) | ||||
|             services.add_singleton(CustomFileLoggerABC, EventLogger) | ||||
|  | ||||
|         if self._feature_flags.get_flag(FeatureFlagsEnum.api_module): | ||||
|             services.add_singleton(CustomFileLoggerABC, ApiLogger) | ||||
|   | ||||
							
								
								
									
										70
									
								
								bot/src/bot/startup_migration_extension.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								bot/src/bot/startup_migration_extension.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,70 @@ | ||||
| from cpl_core.application import StartupExtensionABC | ||||
| from cpl_core.configuration import ConfigurationABC | ||||
| from cpl_core.dependency_injection import ServiceCollectionABC | ||||
| from cpl_core.environment import ApplicationEnvironmentABC | ||||
|  | ||||
| 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_migration import ApiMigration | ||||
| from bot_data.migration.auto_role_fix1_migration import AutoRoleFix1Migration | ||||
| from bot_data.migration.auto_role_migration import AutoRoleMigration | ||||
| from bot_data.migration.birthday_migration import BirthdayMigration | ||||
| 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.default_role_migration import DefaultRoleMigration | ||||
| from bot_data.migration.fix_updates_migration import FixUpdatesMigration | ||||
| from bot_data.migration.fix_user_history_migration import FixUserHistoryMigration | ||||
| from bot_data.migration.initial_migration import InitialMigration | ||||
| from bot_data.migration.level_migration import LevelMigration | ||||
| from bot_data.migration.remove_stats_migration import RemoveStatsMigration | ||||
| from bot_data.migration.short_role_name_migration import ShortRoleNameMigration | ||||
| from bot_data.migration.short_role_name_only_highest_migration import ( | ||||
|     ShortRoleNameOnlyHighestMigration, | ||||
| ) | ||||
| from bot_data.migration.stats_migration import StatsMigration | ||||
| from bot_data.migration.steam_special_offer_migration import SteamSpecialOfferMigration | ||||
| from bot_data.migration.user_joined_game_server_migration import ( | ||||
|     UserJoinedGameServerMigration, | ||||
| ) | ||||
| from bot_data.migration.user_message_count_per_hour_migration import ( | ||||
|     UserMessageCountPerHourMigration, | ||||
| ) | ||||
| from bot_data.migration.user_warning_migration import UserWarningMigration | ||||
| from bot_data.service.migration_service import MigrationService | ||||
|  | ||||
|  | ||||
| class StartupMigrationExtension(StartupExtensionABC): | ||||
|     def __init__(self): | ||||
|         pass | ||||
|  | ||||
|     def configure_configuration(self, config: ConfigurationABC, env: ApplicationEnvironmentABC): | ||||
|         pass | ||||
|  | ||||
|     def configure_services(self, services: ServiceCollectionABC, env: ApplicationEnvironmentABC): | ||||
|         services.add_transient(MigrationService) | ||||
|         services.add_transient(MigrationABC, InitialMigration) | ||||
|         services.add_transient(MigrationABC, AutoRoleMigration)  # 03.10.2022 #54 - 0.2.2 | ||||
|         services.add_transient(MigrationABC, ApiMigration)  # 15.10.2022 #70 - 0.3.0 | ||||
|         services.add_transient(MigrationABC, LevelMigration)  # 06.11.2022 #25 - 0.3.0 | ||||
|         services.add_transient(MigrationABC, StatsMigration)  # 09.11.2022 #46 - 0.3.0 | ||||
|         services.add_transient(MigrationABC, AutoRoleFix1Migration)  # 30.12.2022 #151 - 0.3.0 | ||||
|         services.add_transient(MigrationABC, UserMessageCountPerHourMigration)  # 11.01.2023 #168 - 0.3.1 | ||||
|         services.add_transient(MigrationABC, ApiKeyMigration)  # 09.02.2023 #162 - 1.0.0 | ||||
|         services.add_transient(MigrationABC, UserJoinedGameServerMigration)  # 12.02.2023 #181 - 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, 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 | ||||
|         services.add_transient(MigrationABC, DefaultRoleMigration)  # 24.09.2023 #360 - 1.1.3 | ||||
|         services.add_transient(MigrationABC, ShortRoleNameMigration)  # 28.09.2023 #378 - 1.1.7 | ||||
|         services.add_transient(MigrationABC, FixUpdatesMigration)  # 28.09.2023 #378 - 1.1.7 | ||||
|         services.add_transient(MigrationABC, ShortRoleNameOnlyHighestMigration)  # 02.10.2023 #391 - 1.1.9 | ||||
|         services.add_transient(MigrationABC, FixUserHistoryMigration)  # 10.10.2023 #401 - 1.2.0 | ||||
|         services.add_transient(MigrationABC, BirthdayMigration)  # 10.10.2023 #401 - 1.2.0 | ||||
|         services.add_transient(MigrationABC, SteamSpecialOfferMigration)  # 10.10.2023 #188 - 1.2.0 | ||||
| @@ -8,7 +8,6 @@ from cpl_core.dependency_injection import ServiceCollectionABC | ||||
| from cpl_core.environment import ApplicationEnvironmentABC | ||||
|  | ||||
| from bot_core.configuration.bot_logging_settings import BotLoggingSettings | ||||
| from bot_core.environment_variables import MAINTENANCE, MIGRATION_ONLY | ||||
|  | ||||
|  | ||||
| class StartupSettingsExtension(StartupExtensionABC): | ||||
| @@ -20,12 +19,6 @@ class StartupSettingsExtension(StartupExtensionABC): | ||||
|         environment.set_working_directory(os.path.dirname(os.path.realpath(__file__))) | ||||
|         configuration.add_environment_variables("SDB_") | ||||
|         configuration.add_environment_variables("DISCORD_") | ||||
|         configuration.add_configuration( | ||||
|             MAINTENANCE, configuration.get_configuration(MAINTENANCE) in [True, "true", "True"] | ||||
|         ) | ||||
|         configuration.add_configuration( | ||||
|             MIGRATION_ONLY, configuration.get_configuration(MIGRATION_ONLY) in [True, "true", "True"] | ||||
|         ) | ||||
|  | ||||
|         configuration.add_json_file(f"config/appsettings.json", optional=False) | ||||
|         configuration.add_json_file(f"config/appsettings.{environment.environment_name}.json", optional=True) | ||||
|   | ||||
| @@ -90,8 +90,7 @@ | ||||
|       "booting": "Ich fahre gerade hoch...", | ||||
|       "restart": "Muss neue Kekse holen...", | ||||
|       "running": "Ich esse Kekse :D", | ||||
|       "shutdown": "Ich werde bestimmt wieder kommen...", | ||||
|       "maintenance": "In Wartung!" | ||||
|       "shutdown": "Ich werde bestimmt wieder kommen..." | ||||
|     } | ||||
|   }, | ||||
|   "modules": { | ||||
|   | ||||
| @@ -15,7 +15,7 @@ __title__ = "bot_api" | ||||
| __author__ = "Sven Heidemann" | ||||
| __license__ = "MIT" | ||||
| __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" | ||||
| __version__ = "1.2.3" | ||||
| __version__ = "1.2.0" | ||||
|  | ||||
| from collections import namedtuple | ||||
|  | ||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | ||||
| # imports: | ||||
|  | ||||
| VersionInfo = namedtuple("VersionInfo", "major minor micro") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="3") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="0") | ||||
|   | ||||
| @@ -15,7 +15,7 @@ __title__ = "bot_api.abc" | ||||
| __author__ = "Sven Heidemann" | ||||
| __license__ = "MIT" | ||||
| __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" | ||||
| __version__ = "1.2.3" | ||||
| __version__ = "1.2.0" | ||||
|  | ||||
| from collections import namedtuple | ||||
|  | ||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | ||||
| # imports: | ||||
|  | ||||
| VersionInfo = namedtuple("VersionInfo", "major minor micro") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="3") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="0") | ||||
|   | ||||
| @@ -4,7 +4,7 @@ | ||||
|     "Version": { | ||||
|       "Major": "1", | ||||
|       "Minor": "2", | ||||
|       "Micro": "3" | ||||
|       "Micro": "0" | ||||
|     }, | ||||
|     "Author": "", | ||||
|     "AuthorEmail": "", | ||||
|   | ||||
 Submodule bot/src/bot_api/config updated: 521951b8ab...b6ffed4da1
									
								
							| @@ -15,7 +15,7 @@ __title__ = "bot_api.configuration" | ||||
| __author__ = "Sven Heidemann" | ||||
| __license__ = "MIT" | ||||
| __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" | ||||
| __version__ = "1.2.3" | ||||
| __version__ = "1.2.0" | ||||
|  | ||||
| from collections import namedtuple | ||||
|  | ||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | ||||
| # imports | ||||
|  | ||||
| VersionInfo = namedtuple("VersionInfo", "major minor micro") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="3") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="0") | ||||
|   | ||||
| @@ -15,7 +15,7 @@ __title__ = "bot_api.controller" | ||||
| __author__ = "Sven Heidemann" | ||||
| __license__ = "MIT" | ||||
| __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" | ||||
| __version__ = "1.2.3" | ||||
| __version__ = "1.2.0" | ||||
|  | ||||
| from collections import namedtuple | ||||
|  | ||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | ||||
| # imports: | ||||
|  | ||||
| VersionInfo = namedtuple("VersionInfo", "major minor micro") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="3") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="0") | ||||
|   | ||||
| @@ -14,10 +14,7 @@ from bot_api.model.reset_password_dto import ResetPasswordDTO | ||||
| from bot_api.model.token_dto import TokenDTO | ||||
| from bot_api.model.update_auth_user_dto import UpdateAuthUserDTO | ||||
| from bot_api.route.route import Route | ||||
| from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum | ||||
| from bot_core.configuration.feature_flags_settings import FeatureFlagsSettings | ||||
| from bot_data.model.auth_role_enum import AuthRoleEnum | ||||
| from bot_data.model.technician_config import TechnicianConfig | ||||
|  | ||||
|  | ||||
| class AuthController: | ||||
| @@ -33,7 +30,6 @@ class AuthController: | ||||
|         mail_settings: EMailClientSettings, | ||||
|         mailer: EMailClientABC, | ||||
|         auth_service: AuthServiceABC, | ||||
|         technician_config: TechnicianConfig, | ||||
|     ): | ||||
|         self._config = config | ||||
|         self._env = env | ||||
| @@ -43,7 +39,6 @@ class AuthController: | ||||
|         self._mail_settings = mail_settings | ||||
|         self._mailer = mailer | ||||
|         self._auth_service = auth_service | ||||
|         self._technician_config = technician_config | ||||
|  | ||||
|     @Route.get(f"{BasePath}/users") | ||||
|     @Route.authorize(role=AuthRoleEnum.admin) | ||||
| @@ -75,32 +70,17 @@ class AuthController: | ||||
|  | ||||
|     @Route.post(f"{BasePath}/register") | ||||
|     async def register(self): | ||||
|         if not FeatureFlagsSettings.get_flag_from_dict( | ||||
|             self._technician_config.feature_flags, FeatureFlagsEnum.basic_registration | ||||
|         ): | ||||
|             return | ||||
|  | ||||
|         dto: AuthUserDTO = JSONProcessor.process(AuthUserDTO, request.get_json(force=True, silent=True)) | ||||
|         self._auth_service.add_auth_user(dto) | ||||
|         return "", 200 | ||||
|  | ||||
|     @Route.post(f"{BasePath}/register-by-id/<id>") | ||||
|     async def register_id(self, id: str): | ||||
|         if not FeatureFlagsSettings.get_flag_from_dict( | ||||
|             self._technician_config.feature_flags, FeatureFlagsEnum.basic_registration | ||||
|         ): | ||||
|             return | ||||
|  | ||||
|         result = await self._auth_service.confirm_email_async(id) | ||||
|         return jsonify(result) | ||||
|  | ||||
|     @Route.post(f"{BasePath}/login") | ||||
|     async def login(self) -> Response: | ||||
|         if not FeatureFlagsSettings.get_flag_from_dict( | ||||
|             self._technician_config.feature_flags, FeatureFlagsEnum.basic_login | ||||
|         ): | ||||
|             return jsonify({}) | ||||
|  | ||||
|         dto: AuthUserDTO = JSONProcessor.process(AuthUserDTO, request.get_json(force=True, silent=True)) | ||||
|         result = await self._auth_service.login_async(dto) | ||||
|         return jsonify(result.to_dict()) | ||||
| @@ -120,11 +100,6 @@ class AuthController: | ||||
|  | ||||
|     @Route.post(f"{BasePath}/forgot-password/<email>") | ||||
|     async def forgot_password(self, email: str): | ||||
|         if not FeatureFlagsSettings.get_flag_from_dict( | ||||
|             self._technician_config.feature_flags, FeatureFlagsEnum.basic_login | ||||
|         ): | ||||
|             return "", 409 | ||||
|  | ||||
|         await self._auth_service.forgot_password_async(email) | ||||
|         return "", 200 | ||||
|  | ||||
| @@ -135,11 +110,6 @@ class AuthController: | ||||
|  | ||||
|     @Route.post(f"{BasePath}/reset-password") | ||||
|     async def reset_password(self): | ||||
|         if not FeatureFlagsSettings.get_flag_from_dict( | ||||
|             self._technician_config.feature_flags, FeatureFlagsEnum.basic_login | ||||
|         ): | ||||
|             return "", 409 | ||||
|  | ||||
|         dto: ResetPasswordDTO = JSONProcessor.process(ResetPasswordDTO, request.get_json(force=True, silent=True)) | ||||
|         await self._auth_service.reset_password_async(dto) | ||||
|         return "", 200 | ||||
|   | ||||
| @@ -12,9 +12,6 @@ from bot_api.logging.api_logger import ApiLogger | ||||
| from bot_api.model.settings_dto import SettingsDTO | ||||
| from bot_api.model.version_dto import VersionDTO | ||||
| from bot_api.route.route import Route | ||||
| from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum | ||||
| from bot_core.configuration.feature_flags_settings import FeatureFlagsSettings | ||||
| from bot_data.model.technician_config import TechnicianConfig | ||||
|  | ||||
|  | ||||
| class GuiController: | ||||
| @@ -85,11 +82,3 @@ class GuiController: | ||||
|         ) | ||||
|         self._mailer.send_mail(mail) | ||||
|         return "", 200 | ||||
|  | ||||
|     @Route.get(f"{BasePath}/has-feature-flag/<flag>") | ||||
|     async def has_feature_flag(self, flag: str): | ||||
|         settings: TechnicianConfig = self._config.get_configuration(TechnicianConfig) | ||||
|         return { | ||||
|             "key": flag, | ||||
|             "value": FeatureFlagsSettings.get_flag_from_dict(settings.feature_flags, FeatureFlagsEnum(flag)), | ||||
|         } | ||||
|   | ||||
| @@ -15,7 +15,7 @@ __title__ = "bot_api.event" | ||||
| __author__ = "Sven Heidemann" | ||||
| __license__ = "MIT" | ||||
| __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" | ||||
| __version__ = "1.2.3" | ||||
| __version__ = "1.2.0" | ||||
|  | ||||
| from collections import namedtuple | ||||
|  | ||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | ||||
| # imports: | ||||
|  | ||||
| VersionInfo = namedtuple("VersionInfo", "major minor micro") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="3") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="0") | ||||
|   | ||||
| @@ -15,7 +15,7 @@ __title__ = "bot_api.exception" | ||||
| __author__ = "Sven Heidemann" | ||||
| __license__ = "MIT" | ||||
| __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" | ||||
| __version__ = "1.2.3" | ||||
| __version__ = "1.2.0" | ||||
|  | ||||
| from collections import namedtuple | ||||
|  | ||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | ||||
| # imports: | ||||
|  | ||||
| VersionInfo = namedtuple("VersionInfo", "major minor micro") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="3") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="0") | ||||
|   | ||||
| @@ -15,7 +15,7 @@ __title__ = "bot_api.filter" | ||||
| __author__ = "Sven Heidemann" | ||||
| __license__ = "MIT" | ||||
| __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" | ||||
| __version__ = "1.2.3" | ||||
| __version__ = "1.2.0" | ||||
|  | ||||
| from collections import namedtuple | ||||
|  | ||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | ||||
| # imports: | ||||
|  | ||||
| VersionInfo = namedtuple("VersionInfo", "major minor micro") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="3") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="0") | ||||
|   | ||||
| @@ -15,7 +15,7 @@ __title__ = "bot_api.filter.discord" | ||||
| __author__ = "Sven Heidemann" | ||||
| __license__ = "MIT" | ||||
| __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" | ||||
| __version__ = "1.2.3" | ||||
| __version__ = "1.2.0" | ||||
|  | ||||
| from collections import namedtuple | ||||
|  | ||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | ||||
| # imports: | ||||
|  | ||||
| VersionInfo = namedtuple("VersionInfo", "major minor micro") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="3") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="0") | ||||
|   | ||||
| @@ -15,7 +15,7 @@ __title__ = "bot_api.logging" | ||||
| __author__ = "Sven Heidemann" | ||||
| __license__ = "MIT" | ||||
| __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" | ||||
| __version__ = "1.2.3" | ||||
| __version__ = "1.2.0" | ||||
|  | ||||
| from collections import namedtuple | ||||
|  | ||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | ||||
| # imports: | ||||
|  | ||||
| VersionInfo = namedtuple("VersionInfo", "major minor micro") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="3") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="0") | ||||
|   | ||||
| @@ -15,7 +15,7 @@ __title__ = "bot_api.model" | ||||
| __author__ = "Sven Heidemann" | ||||
| __license__ = "MIT" | ||||
| __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" | ||||
| __version__ = "1.2.3" | ||||
| __version__ = "1.2.0" | ||||
|  | ||||
| from collections import namedtuple | ||||
|  | ||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | ||||
| # imports: | ||||
|  | ||||
| VersionInfo = namedtuple("VersionInfo", "major minor micro") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="3") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="0") | ||||
|   | ||||
| @@ -15,7 +15,7 @@ __title__ = "bot_api.model.discord" | ||||
| __author__ = "Sven Heidemann" | ||||
| __license__ = "MIT" | ||||
| __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" | ||||
| __version__ = "1.2.3" | ||||
| __version__ = "1.2.0" | ||||
|  | ||||
| from collections import namedtuple | ||||
|  | ||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | ||||
| # imports: | ||||
|  | ||||
| VersionInfo = namedtuple("VersionInfo", "major minor micro") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="3") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="0") | ||||
|   | ||||
| @@ -15,7 +15,7 @@ __title__ = "bot_api.route" | ||||
| __author__ = "Sven Heidemann" | ||||
| __license__ = "MIT" | ||||
| __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" | ||||
| __version__ = "1.2.3" | ||||
| __version__ = "1.2.0" | ||||
|  | ||||
| from collections import namedtuple | ||||
|  | ||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | ||||
| # imports: | ||||
|  | ||||
| VersionInfo = namedtuple("VersionInfo", "major minor micro") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="3") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="0") | ||||
|   | ||||
| @@ -15,7 +15,7 @@ __title__ = "bot_api.service" | ||||
| __author__ = "Sven Heidemann" | ||||
| __license__ = "MIT" | ||||
| __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" | ||||
| __version__ = "1.2.3" | ||||
| __version__ = "1.2.0" | ||||
|  | ||||
| from collections import namedtuple | ||||
|  | ||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | ||||
| # imports | ||||
|  | ||||
| VersionInfo = namedtuple("VersionInfo", "major minor micro") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="3") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="0") | ||||
|   | ||||
| @@ -15,7 +15,7 @@ __title__ = "bot_api.transformer" | ||||
| __author__ = "Sven Heidemann" | ||||
| __license__ = "MIT" | ||||
| __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" | ||||
| __version__ = "1.2.3" | ||||
| __version__ = "1.2.0" | ||||
|  | ||||
| from collections import namedtuple | ||||
|  | ||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | ||||
| # imports: | ||||
|  | ||||
| VersionInfo = namedtuple("VersionInfo", "major minor micro") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="3") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="0") | ||||
|   | ||||
| @@ -10,7 +10,7 @@ from bot_api.model.user_dto import UserDTO | ||||
| from bot_data.model.auth_role_enum import AuthRoleEnum | ||||
| from bot_data.model.auth_user import AuthUser | ||||
| from bot_data.model.user import User | ||||
| from bot_core.abc.permission_service_abc import PermissionServiceABC | ||||
| from modules.permission.abc.permission_service_abc import PermissionServiceABC | ||||
|  | ||||
|  | ||||
| class AuthUserTransformer(TransformerABC): | ||||
|   | ||||
| @@ -15,7 +15,7 @@ __title__ = "bot_core" | ||||
| __author__ = "Sven Heidemann" | ||||
| __license__ = "MIT" | ||||
| __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" | ||||
| __version__ = "1.2.3" | ||||
| __version__ = "1.2.0" | ||||
|  | ||||
| from collections import namedtuple | ||||
|  | ||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | ||||
| # imports | ||||
|  | ||||
| VersionInfo = namedtuple("VersionInfo", "major minor micro") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="3") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="0") | ||||
|   | ||||
| @@ -15,7 +15,7 @@ __title__ = "bot_core.abc" | ||||
| __author__ = "Sven Heidemann" | ||||
| __license__ = "MIT" | ||||
| __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" | ||||
| __version__ = "1.2.3" | ||||
| __version__ = "1.2.0" | ||||
|  | ||||
| from collections import namedtuple | ||||
|  | ||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | ||||
| # imports: | ||||
|  | ||||
| VersionInfo = namedtuple("VersionInfo", "major minor micro") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="3") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="0") | ||||
|   | ||||
| @@ -48,16 +48,6 @@ class ClientUtilsABC(ABC): | ||||
|     def get_auto_complete_list(self, _l: List, current: str, select: Callable = None) -> List: | ||||
|         pass | ||||
|  | ||||
|     @abstractmethod | ||||
|     def update_user_message_xp_count_by_hour( | ||||
|         self, | ||||
|         created_at: datetime, | ||||
|         user: User, | ||||
|         settings: ServerConfig, | ||||
|         is_reaction: bool = False, | ||||
|     ): | ||||
|         pass | ||||
|  | ||||
|     @abstractmethod | ||||
|     def is_message_xp_count_by_hour_higher_that_max_message_count_per_hour( | ||||
|         self, | ||||
| @@ -85,7 +75,3 @@ class ClientUtilsABC(ABC): | ||||
|     @abstractmethod | ||||
|     async def check_default_role(self, member: Union[discord.User, discord.Member]): | ||||
|         pass | ||||
|  | ||||
|     @abstractmethod | ||||
|     async def set_maintenance_mode(self, state: bool): | ||||
|         pass | ||||
|   | ||||
| @@ -6,7 +6,6 @@ from cpl_core.dependency_injection import ServiceProviderABC | ||||
| from cpl_discord.service import DiscordBotServiceABC | ||||
| from discord.ext import commands | ||||
|  | ||||
| from bot_core.environment_variables import MAINTENANCE | ||||
| from bot_core.logging.task_logger import TaskLogger | ||||
|  | ||||
|  | ||||
| @@ -15,18 +14,14 @@ class TaskABC(commands.Cog): | ||||
|     def __init__(self): | ||||
|         commands.Cog.__init__(self) | ||||
|  | ||||
|     @ServiceProviderABC.inject | ||||
|     def _is_maintenance(self, config: ConfigurationABC) -> bool: | ||||
|         return config.get_configuration(MAINTENANCE) is True | ||||
|  | ||||
|     @ServiceProviderABC.inject | ||||
|     async def _wait_until_ready(self, config: ConfigurationABC, logger: TaskLogger, bot: DiscordBotServiceABC): | ||||
|         logger.debug(__name__, f"Waiting before ready {type(self).__name__}") | ||||
|         logger.debug(__name__, f"Waiting before {type(self).__name__}") | ||||
|         await bot.wait_until_ready() | ||||
|  | ||||
|         async def wait(): | ||||
|             is_ready = config.get_configuration("IS_READY") is True | ||||
|             if not is_ready: | ||||
|             is_ready = config.get_configuration("IS_READY") | ||||
|             if is_ready != "true": | ||||
|                 await asyncio.sleep(1) | ||||
|                 await wait() | ||||
|  | ||||
|   | ||||
| @@ -4,7 +4,7 @@ | ||||
|     "Version": { | ||||
|       "Major": "1", | ||||
|       "Minor": "2", | ||||
|       "Micro": "3" | ||||
|       "Micro": "0" | ||||
|     }, | ||||
|     "Author": "Sven Heidemann", | ||||
|     "AuthorEmail": "sven.heidemann@sh-edraft.de", | ||||
|   | ||||
| @@ -15,7 +15,7 @@ __title__ = "bot_core.configuration" | ||||
| __author__ = "Sven Heidemann" | ||||
| __license__ = "MIT" | ||||
| __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" | ||||
| __version__ = "1.2.3" | ||||
| __version__ = "1.2.0" | ||||
|  | ||||
| from collections import namedtuple | ||||
|  | ||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | ||||
| # imports: | ||||
|  | ||||
| VersionInfo = namedtuple("VersionInfo", "major minor micro") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="3") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="0") | ||||
|   | ||||
| @@ -15,6 +15,7 @@ class FeatureFlagsEnum(Enum): | ||||
|     database_module = "DatabaseModule" | ||||
|     level_module = "LevelModule" | ||||
|     moderator_module = "ModeratorModule" | ||||
|     permission_module = "PermissionModule" | ||||
|     short_role_name_module = "ShortRoleNameModule" | ||||
|     steam_special_offers_module = "SteamSpecialOffersModule" | ||||
|     # features | ||||
| @@ -26,6 +27,3 @@ class FeatureFlagsEnum(Enum): | ||||
|     short_role_name = "ShortRoleName" | ||||
|     technician_full_access = "TechnicianFullAccess" | ||||
|     steam_special_offers = "SteamSpecialOffers" | ||||
|     scheduled_events = "ScheduledEvents" | ||||
|     basic_registration = "BasicRegistration" | ||||
|     basic_login = "BasicLogin" | ||||
|   | ||||
| @@ -16,6 +16,7 @@ class FeatureFlagsSettings(ConfigurationModelABC): | ||||
|         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 | ||||
|         FeatureFlagsEnum.short_role_name_module.value: True,  # 28.09.2023 #378 | ||||
|         FeatureFlagsEnum.steam_special_offers_module.value: True,  # 11.10.2023 #188 | ||||
| @@ -28,9 +29,6 @@ class FeatureFlagsSettings(ConfigurationModelABC): | ||||
|         FeatureFlagsEnum.short_role_name.value: False,  # 28.09.2023 #378 | ||||
|         FeatureFlagsEnum.technician_full_access.value: False,  # 03.10.2023 #393 | ||||
|         FeatureFlagsEnum.steam_special_offers.value: False,  # 11.10.2023 #188 | ||||
|         FeatureFlagsEnum.scheduled_events.value: False,  # 14.11.2023 #410 | ||||
|         FeatureFlagsEnum.basic_registration.value: False,  # 19.11.2023 #440 | ||||
|         FeatureFlagsEnum.basic_login.value: False,  # 19.11.2023 #440 | ||||
|     } | ||||
|  | ||||
|     def __init__(self, **kwargs: dict): | ||||
|   | ||||
| @@ -15,7 +15,7 @@ __title__ = "bot_core.core_extension" | ||||
| __author__ = "Sven Heidemann" | ||||
| __license__ = "MIT" | ||||
| __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" | ||||
| __version__ = "1.2.3" | ||||
| __version__ = "1.2.0" | ||||
|  | ||||
| from collections import namedtuple | ||||
|  | ||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | ||||
| # imports: | ||||
|  | ||||
| VersionInfo = namedtuple("VersionInfo", "major minor micro") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="3") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="0") | ||||
|   | ||||
| @@ -9,7 +9,7 @@ from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum | ||||
| from bot_core.configuration.feature_flags_settings import FeatureFlagsSettings | ||||
| from bot_core.helper.command_checks import CommandChecks | ||||
| from bot_core.helper.event_checks import EventChecks | ||||
| from bot_core.abc.permission_service_abc import PermissionServiceABC | ||||
| from modules.permission.abc.permission_service_abc import PermissionServiceABC | ||||
|  | ||||
|  | ||||
| class CoreExtension(ApplicationExtensionABC): | ||||
|   | ||||
| @@ -1,25 +1,23 @@ | ||||
| from cpl_core.configuration import ConfigurationABC | ||||
| import asyncio | ||||
|  | ||||
| from cpl_core.logging import LoggerABC | ||||
| from cpl_discord.events import OnReadyABC | ||||
| from cpl_discord.service import DiscordBotServiceABC | ||||
| from cpl_translation import TranslatePipe | ||||
|  | ||||
| from bot_core.abc.client_utils_abc import ClientUtilsABC | ||||
| from bot_core.environment_variables import MAINTENANCE | ||||
| from bot_core.logging.event_logger import EventLogger | ||||
|  | ||||
|  | ||||
| class CoreExtensionOnReadyEvent(OnReadyABC): | ||||
|     def __init__( | ||||
|         self, | ||||
|         config: ConfigurationABC, | ||||
|         logger: EventLogger, | ||||
|         logger: LoggerABC, | ||||
|         bot: DiscordBotServiceABC, | ||||
|         client_utils: ClientUtilsABC, | ||||
|         t: TranslatePipe, | ||||
|     ): | ||||
|         OnReadyABC.__init__(self) | ||||
|  | ||||
|         self._config = config | ||||
|         self._logger = logger | ||||
|         self._bot = bot | ||||
|         self._client_utils = client_utils | ||||
| @@ -29,5 +27,5 @@ class CoreExtensionOnReadyEvent(OnReadyABC): | ||||
|  | ||||
|     async def on_ready(self): | ||||
|         self._logger.debug(__name__, f"Module {type(self)} started") | ||||
|         await self._client_utils.set_maintenance_mode(self._config.get_configuration(MAINTENANCE)) | ||||
|         await self._client_utils.presence_game("common.presence.running") | ||||
|         self._logger.trace(__name__, f"Module {type(self)} stopped") | ||||
|   | ||||
| @@ -7,7 +7,6 @@ from cpl_discord.service.discord_collection_abc import DiscordCollectionABC | ||||
| from bot_core.abc.client_utils_abc import ClientUtilsABC | ||||
| from bot_core.abc.message_service_abc import MessageServiceABC | ||||
| from bot_core.abc.module_abc import ModuleABC | ||||
| from bot_core.abc.permission_service_abc import PermissionServiceABC | ||||
| from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum | ||||
| from bot_core.events.core_on_ready_event import CoreOnReadyEvent | ||||
| from bot_core.pipes.date_time_offset_pipe import DateTimeOffsetPipe | ||||
| @@ -15,7 +14,6 @@ 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.permission_service import PermissionService | ||||
|  | ||||
|  | ||||
| class CoreModule(ModuleABC): | ||||
| @@ -30,7 +28,6 @@ class CoreModule(ModuleABC): | ||||
|         services.add_transient(MessageServiceABC, MessageService) | ||||
|         services.add_transient(ClientUtilsABC, ClientUtilsService) | ||||
|         services.add_transient(DataIntegrityService) | ||||
|         services.add_singleton(PermissionServiceABC, PermissionService) | ||||
|  | ||||
|         # pipes | ||||
|         services.add_transient(DateTimeOffsetPipe) | ||||
|   | ||||
| @@ -1,2 +0,0 @@ | ||||
| MIGRATION_ONLY = "MIGRATION_ONLY" | ||||
| MAINTENANCE = "MAINTENANCE" | ||||
| @@ -15,7 +15,7 @@ __title__ = "bot_core.events" | ||||
| __author__ = "Sven Heidemann" | ||||
| __license__ = "MIT" | ||||
| __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" | ||||
| __version__ = "1.2.3" | ||||
| __version__ = "1.2.0" | ||||
|  | ||||
| from collections import namedtuple | ||||
|  | ||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | ||||
| # imports: | ||||
|  | ||||
| VersionInfo = namedtuple("VersionInfo", "major minor micro") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="3") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="0") | ||||
|   | ||||
| @@ -1,15 +1,15 @@ | ||||
| from cpl_core.logging import LoggerABC | ||||
| from cpl_discord.events import OnReadyABC | ||||
| from cpl_discord.service import DiscordBotServiceABC | ||||
| from cpl_translation import TranslatePipe | ||||
|  | ||||
| from bot_core.abc.client_utils_abc import ClientUtilsABC | ||||
| from bot_core.logging.event_logger import EventLogger | ||||
|  | ||||
|  | ||||
| class CoreOnReadyEvent(OnReadyABC): | ||||
|     def __init__( | ||||
|         self, | ||||
|         logger: EventLogger, | ||||
|         logger: LoggerABC, | ||||
|         bot: DiscordBotServiceABC, | ||||
|         client_utils: ClientUtilsABC, | ||||
|         t: TranslatePipe, | ||||
|   | ||||
| @@ -15,7 +15,7 @@ __title__ = "bot_core.exception" | ||||
| __author__ = "Sven Heidemann" | ||||
| __license__ = "MIT" | ||||
| __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" | ||||
| __version__ = "1.2.3" | ||||
| __version__ = "1.2.0" | ||||
|  | ||||
| from collections import namedtuple | ||||
|  | ||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | ||||
| # imports: | ||||
|  | ||||
| VersionInfo = namedtuple("VersionInfo", "major minor micro") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="3") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="0") | ||||
|   | ||||
| @@ -15,7 +15,7 @@ __title__ = "bot_core.helper" | ||||
| __author__ = "Sven Heidemann" | ||||
| __license__ = "MIT" | ||||
| __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" | ||||
| __version__ = "1.2.3" | ||||
| __version__ = "1.2.0" | ||||
|  | ||||
| from collections import namedtuple | ||||
|  | ||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | ||||
| # imports: | ||||
|  | ||||
| VersionInfo = namedtuple("VersionInfo", "major minor micro") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="3") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="0") | ||||
|   | ||||
| @@ -7,7 +7,7 @@ from discord.ext.commands import Context | ||||
| from bot_core.abc.client_utils_abc import ClientUtilsABC | ||||
| from bot_core.abc.message_service_abc import MessageServiceABC | ||||
| from bot_core.exception.check_error import CheckError | ||||
| from bot_core.abc.permission_service_abc import PermissionServiceABC | ||||
| from modules.permission.abc.permission_service_abc import PermissionServiceABC | ||||
|  | ||||
|  | ||||
| class CommandChecks: | ||||
|   | ||||
| @@ -1,4 +1,3 @@ | ||||
| import inspect | ||||
| from typing import Optional | ||||
|  | ||||
| from discord.ext import commands | ||||
| @@ -18,18 +17,11 @@ class EventChecks: | ||||
|         cls._client_utils = client_utils | ||||
|  | ||||
|     @classmethod | ||||
|     def check_is_ready(cls, func): | ||||
|         async def check_if_bot_is_ready(*args, **kwargs): | ||||
|     def check_is_ready(cls): | ||||
|         async def check_if_bot_is_ready() -> bool: | ||||
|             result = await cls._client_utils.check_if_bot_is_ready_yet() | ||||
|             if not result: | ||||
|                 raise CheckError(f"Bot is not ready") | ||||
|             return result | ||||
|  | ||||
|                 def empty(*args, **kwargs): | ||||
|                     return | ||||
|  | ||||
|                 return empty | ||||
|             return await func(*args, **kwargs) | ||||
|  | ||||
|         check_if_bot_is_ready.__name__ = func.__name__ | ||||
|         sig = inspect.signature(func) | ||||
|         check_if_bot_is_ready.__signature__ = sig.replace(parameters=tuple(sig.parameters.values())[1:]) | ||||
|         return check_if_bot_is_ready | ||||
|         return commands.check(check_if_bot_is_ready) | ||||
|   | ||||
| @@ -15,7 +15,7 @@ __title__ = "bot_core.logging" | ||||
| __author__ = "Sven Heidemann" | ||||
| __license__ = "MIT" | ||||
| __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" | ||||
| __version__ = "1.2.3" | ||||
| __version__ = "1.2.0" | ||||
|  | ||||
| from collections import namedtuple | ||||
|  | ||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | ||||
| # imports | ||||
|  | ||||
| VersionInfo = namedtuple("VersionInfo", "major minor micro") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="3") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="0") | ||||
|   | ||||
| @@ -1,15 +0,0 @@ | ||||
| from cpl_core.configuration import ConfigurationABC | ||||
| from cpl_core.environment import ApplicationEnvironmentABC | ||||
| from cpl_core.time import TimeFormatSettings | ||||
|  | ||||
| from bot_core.abc.custom_file_logger_abc import CustomFileLoggerABC | ||||
|  | ||||
|  | ||||
| class EventLogger(CustomFileLoggerABC): | ||||
|     def __init__( | ||||
|         self, | ||||
|         config: ConfigurationABC, | ||||
|         time_format: TimeFormatSettings, | ||||
|         env: ApplicationEnvironmentABC, | ||||
|     ): | ||||
|         CustomFileLoggerABC.__init__(self, "Event", config, time_format, env) | ||||
| @@ -15,7 +15,7 @@ __title__ = "bot_core.pipes" | ||||
| __author__ = "Sven Heidemann" | ||||
| __license__ = "MIT" | ||||
| __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" | ||||
| __version__ = "1.2.3" | ||||
| __version__ = "1.2.0" | ||||
|  | ||||
| from collections import namedtuple | ||||
|  | ||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | ||||
| # imports | ||||
|  | ||||
| VersionInfo = namedtuple("VersionInfo", "major minor micro") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="3") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="0") | ||||
|   | ||||
| @@ -15,7 +15,7 @@ __title__ = "bot_core.service" | ||||
| __author__ = "Sven Heidemann" | ||||
| __license__ = "MIT" | ||||
| __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" | ||||
| __version__ = "1.2.3" | ||||
| __version__ = "1.2.0" | ||||
|  | ||||
| from collections import namedtuple | ||||
|  | ||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | ||||
| # imports: | ||||
|  | ||||
| VersionInfo = namedtuple("VersionInfo", "major minor micro") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="3") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="0") | ||||
|   | ||||
| @@ -16,7 +16,6 @@ from bot_core.abc.client_utils_abc import ClientUtilsABC | ||||
| from bot_core.abc.message_service_abc import MessageServiceABC | ||||
| from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum | ||||
| from bot_core.configuration.feature_flags_settings import FeatureFlagsSettings | ||||
| from bot_core.environment_variables import MAINTENANCE | ||||
| from bot_data.abc.client_repository_abc import ClientRepositoryABC | ||||
| from bot_data.abc.server_repository_abc import ServerRepositoryABC | ||||
| from bot_data.abc.user_joined_voice_channel_repository_abc import ( | ||||
| @@ -88,14 +87,7 @@ class ClientUtilsService(ClientUtilsABC): | ||||
|         return client | ||||
|  | ||||
|     async def check_if_bot_is_ready_yet(self) -> bool: | ||||
|         if self._config.get_configuration(MAINTENANCE): | ||||
|             self._logger.warn( | ||||
|                 __name__, | ||||
|                 f"Bot is in maintenance mode", | ||||
|             ) | ||||
|             return False | ||||
|  | ||||
|         if self._config.get_configuration("IS_READY") is True: | ||||
|         if self._config.get_configuration("IS_READY") == "true": | ||||
|             return True | ||||
|  | ||||
|         self._logger.debug( | ||||
| @@ -143,13 +135,14 @@ class ClientUtilsService(ClientUtilsABC): | ||||
|  | ||||
|         return _l.take(25) | ||||
|  | ||||
|     def update_user_message_xp_count_by_hour( | ||||
|     def is_message_xp_count_by_hour_higher_that_max_message_count_per_hour( | ||||
|         self, | ||||
|         created_at: datetime, | ||||
|         user: User, | ||||
|         settings: ServerConfig, | ||||
|         is_reaction: bool = False, | ||||
|     ): | ||||
|     ) -> bool: | ||||
|         umcph = None | ||||
|         try: | ||||
|             umcph = self._umcphs.find_user_message_count_per_hour_by_user_id_and_date(user.id, created_at) | ||||
|             if umcph is None: | ||||
| @@ -161,50 +154,44 @@ class ClientUtilsService(ClientUtilsABC): | ||||
|                         user, | ||||
|                     ) | ||||
|                 ) | ||||
|                 self._db.save_changes() | ||||
|                 umcph = self._umcphs.get_user_message_count_per_hour_by_user_id_and_date(user.id, created_at) | ||||
|  | ||||
|             umcph.xp_count += settings.xp_per_reaction if is_reaction else settings.xp_per_message | ||||
|                 self._db.save_changes() | ||||
|  | ||||
|                 umcph = self._umcphs.get_user_message_count_per_hour_by_user_id_and_date(user.id, created_at) | ||||
|         except Exception as e: | ||||
|             self._logger.error( | ||||
|                 __name__, | ||||
|                 f"Cannot add user message count per hour with id {umcph.id}", | ||||
|                 e, | ||||
|             ) | ||||
|             return False | ||||
|  | ||||
|         try: | ||||
|             if is_reaction: | ||||
|                 umcph.xp_count += settings.xp_per_reaction | ||||
|             else: | ||||
|                 umcph.xp_count += settings.xp_per_message | ||||
|  | ||||
|             self._umcphs.update_user_message_count_per_hour(umcph) | ||||
|             self._db.save_changes() | ||||
|         except Exception as e: | ||||
|             self._logger.error( | ||||
|                 __name__, | ||||
|                 f"Cannot update user message count per hour {created_at}", | ||||
|                 f"Cannot update user message count per hour with id {umcph.id}", | ||||
|                 e, | ||||
|             ) | ||||
|             return False | ||||
|  | ||||
|     def is_message_xp_count_by_hour_higher_that_max_message_count_per_hour( | ||||
|         self, | ||||
|         created_at: datetime, | ||||
|         user: User, | ||||
|         settings: ServerConfig, | ||||
|         is_reaction: bool = False, | ||||
|     ) -> bool: | ||||
|         try: | ||||
|             umcph = self._umcphs.find_user_message_count_per_hour_by_user_id_and_date(user.id, created_at) | ||||
|             if umcph is None or umcph.xp_count is None: | ||||
|         if umcph.xp_count is None: | ||||
|             return False | ||||
|  | ||||
|         return umcph.xp_count > settings.max_message_xp_per_hour | ||||
|         except Exception as e: | ||||
|             self._logger.error( | ||||
|                 __name__, | ||||
|                 f"Cannot add user message count per hour with", | ||||
|                 e, | ||||
|             ) | ||||
|             return False | ||||
|  | ||||
|     def get_ontime_for_user(self, user: User) -> float: | ||||
|         return round( | ||||
|             sum( | ||||
|                 [ | ||||
|                     (join.leaved_on - join.joined_on).total_seconds() / 3600 | ||||
|                     for join in self._user_joined_voice_channel.get_user_joined_voice_channels_by_user_id(user.id) | ||||
|                     if join.leaved_on is not None and join.joined_on is not None | ||||
|                 ] | ||||
|             ), | ||||
|             self._user_joined_voice_channel.get_user_joined_voice_channels_by_user_id(user.id) | ||||
|             .where(lambda x: x.leaved_on is not None and x.joined_on is not None) | ||||
|             .sum(lambda join: (join.leaved_on - join.joined_on).total_seconds() / 3600), | ||||
|             2, | ||||
|         ) | ||||
|  | ||||
| @@ -219,7 +206,7 @@ class ClientUtilsService(ClientUtilsABC): | ||||
|             guild: Guild = self._bot.guilds.where(lambda g: g == guild).single() | ||||
|             channel = guild.get_channel(discord_channel_id) | ||||
|             message = await channel.fetch_message(discord_message_id) | ||||
|             emoji = List(discord.Emoji, [x for x in guild.emojis if x.name == rule.emoji_name]).single() | ||||
|             emoji = List(discord.Emoji, guild.emojis).where(lambda x: x.name == rule.emoji_name).single() | ||||
|  | ||||
|             if emoji is None: | ||||
|                 self._logger.debug(__name__, f"Emoji {rule.emoji_name} not found") | ||||
| @@ -252,10 +239,3 @@ class ClientUtilsService(ClientUtilsABC): | ||||
|  | ||||
|         except Exception as e: | ||||
|             self._logger.error(__name__, f"Cannot check for default role for member {member.id}", e) | ||||
|  | ||||
|     async def set_maintenance_mode(self, state: bool): | ||||
|         self._config.add_configuration(MAINTENANCE, state) | ||||
|         if state: | ||||
|             await self.presence_game("common.presence.maintenance") | ||||
|         else: | ||||
|             await self.presence_game("common.presence.running") | ||||
|   | ||||
| @@ -7,7 +7,6 @@ from bot_data.abc.technician_config_repository_abc import TechnicianConfigReposi | ||||
| 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 | ||||
|  | ||||
|  | ||||
| class ConfigService: | ||||
| @@ -17,24 +16,17 @@ class ConfigService: | ||||
|         services: ServiceProviderABC, | ||||
|         technician_config_repo: TechnicianConfigRepositoryABC, | ||||
|         server_config_repo: ServerConfigRepositoryABC, | ||||
|         technician_seeder: TechnicianConfigSeeder, | ||||
|         server_seeder: ServerConfigSeeder, | ||||
|     ): | ||||
|         self._config = config | ||||
|         self._services = services | ||||
|         self._technician_config_repo = technician_config_repo | ||||
|         self._technician_seeder = technician_seeder | ||||
|         self._server_config_repo = server_config_repo | ||||
|  | ||||
|         self._server_seeder = server_seeder | ||||
|  | ||||
|     async def reload_technician_config(self): | ||||
|         try: | ||||
|     def reload_technician_config(self): | ||||
|         technician_config = self._technician_config_repo.get_technician_config() | ||||
|         except Exception as e: | ||||
|             await self._technician_seeder.seed() | ||||
|             technician_config = self._technician_config_repo.get_technician_config() | ||||
|  | ||||
|         self._config.add_configuration(TechnicianConfig, technician_config) | ||||
|         self._config.add_configuration( | ||||
|             FeatureFlagsSettings, | ||||
|   | ||||
| @@ -1,8 +1,9 @@ | ||||
| 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.container import Member, Guild | ||||
| from cpl_discord.service import DiscordBotServiceABC | ||||
|  | ||||
| from bot_core.abc.client_utils_abc import ClientUtilsABC | ||||
| @@ -65,76 +66,74 @@ class DataIntegrityService: | ||||
|  | ||||
|         self._is_for_shutdown = False | ||||
|  | ||||
|     async def check_data_integrity(self, is_for_shutdown=False): | ||||
|         self._logger.info(__name__, f"Data integrity service started") | ||||
|         if is_for_shutdown != self._is_for_shutdown: | ||||
|             self._is_for_shutdown = is_for_shutdown | ||||
|  | ||||
|     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: | ||||
|             for g in self._bot.guilds: | ||||
|                 self._logger.debug(__name__, f"Start check for server: {g.id}") | ||||
|                 s = self._get_or_create_server(g) | ||||
|                 self._logger.debug(__name__, f"Start check for clients") | ||||
|                 self._check_clients(g.id, s) | ||||
|  | ||||
|                 for m in [m for m in g.members if not m.bot]: | ||||
|                     await self._check_default_role(m) | ||||
|                     self._check_known_user(m.id) | ||||
|  | ||||
|                     self._logger.debug(__name__, f"Start check for member: {g.id}@{m.id}") | ||||
|                     u = self._get_or_create_user(s, m.id) | ||||
|  | ||||
|                     self._logger.debug(__name__, f"Start check for user joined server: {g.id}@{m.id}") | ||||
|                     self._check_user_join(g, m, u) | ||||
|  | ||||
|                     self._logger.debug(__name__, f"Start check for user joined voice channels: {g.id}@{m.id}") | ||||
|                     self._check_user_joined_vc(g.id, m, u) | ||||
|  | ||||
|                     self._logger.debug(__name__, f"Start check for user joined game servers: {g.id}@{m.id}") | ||||
|                     self._check_user_joined_gs(g.id, m.id, u) | ||||
|  | ||||
|                     self._logger.debug(__name__, f"Start check for user got achievements: {g.id}@{m.id}") | ||||
|                     await self._check_for_user_achievements(u) | ||||
|  | ||||
|                 for m in [m for m in g.members if m.bot]: | ||||
|                     u = self._users.find_user_by_discord_id_and_server_id(m.id, s.id) | ||||
|                     if u is None: | ||||
|                 if u.bot: | ||||
|                     self._logger.trace(__name__, f"User {u.id} is ignored, because its a bot") | ||||
|                     continue | ||||
|  | ||||
|                     self._remove_bot(u) | ||||
|             self._logger.info(__name__, f"Data integrity service finished") | ||||
|         except Exception as e: | ||||
|             self._logger.fatal(__name__, f"Checking data integrity failed", e) | ||||
|                 user = self._known_users.find_user_by_discord_id(u.id) | ||||
|                 if user is not None: | ||||
|                     continue | ||||
|  | ||||
|     def _get_or_create_server(self, guild: Guild) -> Server: | ||||
|         try: | ||||
|             server = self._servers.find_server_by_discord_id(guild.id) | ||||
|             if server is not None: | ||||
|                 return server | ||||
|  | ||||
|             self._logger.warn(__name__, f"Server not found in database: {guild.id}") | ||||
|             self._logger.debug(__name__, f"Add server: {guild.id}") | ||||
|             self._servers.add_server(Server(guild.id)) | ||||
|                 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() | ||||
|  | ||||
|             server = self._servers.find_server_by_discord_id(guild.id) | ||||
|             if server is None: | ||||
|                 self._logger.fatal(__name__, f"Cannot add server: {guild.id}") | ||||
|                 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.trace(__name__, f"Added server: {guild.id}") | ||||
|             return server | ||||
|                 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) | ||||
|  | ||||
|     def _check_clients(self, guild_id: int, server: Server): | ||||
|         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: | ||||
|                 return | ||||
|                     continue | ||||
|  | ||||
|                 self._logger.warn( | ||||
|                     __name__, | ||||
|                 f"Client for server {guild_id} not found in database: {self._bot.user.id}", | ||||
|                     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)) | ||||
| @@ -144,10 +143,10 @@ class DataIntegrityService: | ||||
|                 if client is None: | ||||
|                     self._logger.fatal( | ||||
|                         __name__, | ||||
|                     f"Cannot add client {self._bot.user.id} for server {guild_id}", | ||||
|                         f"Cannot add client {self._bot.user.id} for server {g.id}", | ||||
|                     ) | ||||
|  | ||||
|             self._logger.trace(__name__, f"Added client: {guild_id}") | ||||
|                 self._logger.debug(__name__, f"Added client: {g.id}") | ||||
|             except Exception as e: | ||||
|                 self._logger.error(__name__, f"Cannot get client", e) | ||||
|  | ||||
| @@ -155,37 +154,32 @@ class DataIntegrityService: | ||||
|         if results is None or len(results) == 0: | ||||
|             self._logger.error(__name__, f"Table Servers is empty!") | ||||
|  | ||||
|     def _check_known_user(self, member_id: int): | ||||
|     def _check_users(self): | ||||
|         self._logger.debug(__name__, f"Start checking Users table") | ||||
|         for g in self._bot.guilds: | ||||
|             g: discord.Guild = g | ||||
|  | ||||
|             try: | ||||
|             if self._known_users.find_user_by_discord_id(member_id) is not None: | ||||
|                 return | ||||
|                 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}") | ||||
|  | ||||
|             self._logger.warn(__name__, f"Unknown user: {member_id}") | ||||
|             self._logger.trace(__name__, f"Add known user: {member_id}") | ||||
|             self._known_users.add_user(KnownUser(member_id)) | ||||
|             self._db_context.save_changes() | ||||
|                 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._known_users.find_user_by_discord_id(member_id) | ||||
|             if user is None: | ||||
|                 self._logger.fatal(__name__, f"Cannot add user: {member_id}") | ||||
|  | ||||
|             self._logger.trace(__name__, f"Added known user: {member_id}") | ||||
|         except Exception as e: | ||||
|             self._logger.error(__name__, f"Cannot get user", e) | ||||
|  | ||||
|     def _get_or_create_user(self, server: Server, member_id: int) -> User: | ||||
|         try: | ||||
|             user = self._users.find_user_by_discord_id_and_server_id(member_id, server.id) | ||||
|                     user = self._users.find_user_by_discord_id_and_server_id(u.id, server.id) | ||||
|                     if user is not None: | ||||
|                 return user | ||||
|                         continue | ||||
|  | ||||
|             self._logger.warn(__name__, f"User not found in database: {member_id}") | ||||
|             self._logger.debug(__name__, f"Add user: {member_id}") | ||||
|             self._users.add_user(User(member_id, 0, 0, 0, None, server)) | ||||
|                     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, None, server)) | ||||
|                     self._db_context.save_changes() | ||||
|  | ||||
|             self._logger.trace(__name__, f"Added User: {member_id}") | ||||
|             return self._users.get_user_by_discord_id_and_server_id(member_id, server.id) | ||||
|                     self._logger.debug(__name__, f"Added User: {u.id}") | ||||
|             except Exception as e: | ||||
|                 self._logger.error(__name__, f"Cannot get User", e) | ||||
|  | ||||
| @@ -193,34 +187,63 @@ class DataIntegrityService: | ||||
|             if results is None or len(results) == 0: | ||||
|                 self._logger.error(__name__, f"Table Users is empty!") | ||||
|  | ||||
|     def _check_user_join(self, guild: Guild, member: Member, user: User): | ||||
|     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: | ||||
|                 return | ||||
|                         continue | ||||
|  | ||||
|                     m: discord.Member = u | ||||
|                     self._logger.warn( | ||||
|                         __name__, | ||||
|                 f"Active UserJoinedServer not found in database: {guild.id}:{member.id}@{member.joined_at}", | ||||
|                         f"Active UserJoinedServer not found in database: {guild.id}:{u.id}@{m.joined_at}", | ||||
|                     ) | ||||
|                     self._logger.debug( | ||||
|                         __name__, | ||||
|                 f"Add UserJoinedServer: {guild.id}:{member.id}@{member.joined_at}", | ||||
|                         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._user_joins.add_user_joined_server(UserJoinedServer(user, self._dtp.transform(member.joined_at), None)) | ||||
|                     self._db_context.save_changes() | ||||
|  | ||||
|             self._logger.trace(__name__, f"Added UserJoinedServer: {member.id}") | ||||
|                     self._logger.debug(__name__, f"Added UserJoinedServer: {u.id}") | ||||
|             except Exception as e: | ||||
|                 self._logger.error(__name__, f"Cannot get UserJoinedServer", e) | ||||
|  | ||||
|         try: | ||||
|             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 [x for x in joins if x.user.server.discord_id == guild.id and x.leaved_on is None]: | ||||
|                 dc_user = guild.get_member(join.user.discord_id) | ||||
|                 if dc_user is not None: | ||||
|             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.", | ||||
| @@ -229,26 +252,42 @@ class DataIntegrityService: | ||||
|                     self._user_joins.update_user_joined_server(join) | ||||
|  | ||||
|             self._db_context.save_changes() | ||||
|         except Exception as e: | ||||
|             self._logger.error(__name__, f"Cannot update UserJoinedServer", e) | ||||
|  | ||||
|     def _check_user_joined_vc(self, guild_id: int, member: Member, user: User): | ||||
|         settings: ServerConfig = self._config.get_configuration(f"ServerConfig_{guild_id}") | ||||
|     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: | ||||
|                 return | ||||
|                         continue | ||||
|  | ||||
|                     for join in joins: | ||||
|                         self._logger.warn( | ||||
|                             __name__, | ||||
|                     f"Active UserJoinedVoiceChannel found in database: {guild_id}:{member.id}@{join.joined_on}", | ||||
|                             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: | ||||
|                         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) | ||||
| @@ -262,30 +301,59 @@ class DataIntegrityService: | ||||
|                             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: | ||||
|                 return | ||||
|                         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, guild_id: int, member_id: int, user: User): | ||||
|     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: | ||||
|                 return | ||||
|                         continue | ||||
|  | ||||
|                     for join in joins: | ||||
|                         self._logger.warn( | ||||
|                             __name__, | ||||
|                     f"Active UserJoinedGameServer found in database: {guild_id}:{member_id}@{join.joined_on}", | ||||
|                             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}") | ||||
|                         settings: ServerConfig = self._config.get_configuration(f"ServerConfig_{guild.id}") | ||||
|  | ||||
|                 if join.time > settings.max_voice_state_hours: | ||||
|                         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) | ||||
| @@ -297,23 +365,40 @@ class DataIntegrityService: | ||||
|             except Exception as e: | ||||
|                 self._logger.error(__name__, f"Cannot get UserJoinedGameServer", e) | ||||
|  | ||||
|     async def _check_for_user_achievements(self, user: User): | ||||
|         try: | ||||
|             await self._achievements.validate_achievements_for_user(user) | ||||
|         except Exception as e: | ||||
|             self._logger.error(__name__, f"Cannot check UserGotAchievement for {user.id}", e) | ||||
|     async def _check_for_user_achievements(self): | ||||
|         self._logger.debug(__name__, f"Start checking UserGotAchievement table") | ||||
|  | ||||
|     async def _check_default_role(self, member: Member): | ||||
|         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_default_role(self): | ||||
|         for guild in self._bot.guilds: | ||||
|             for member in guild.members: | ||||
|                 await self._client_utils.check_default_role(member) | ||||
|  | ||||
|     def _remove_bot(self, user: User): | ||||
|         known_user = self._known_users.find_user_by_discord_id(user.discord_id) | ||||
|         if known_user is not None: | ||||
|             self._known_users.delete_user(known_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 | ||||
|  | ||||
|         for join in self._user_joins.get_user_joined_servers_by_user_id(user.id): | ||||
|             self._user_joins.delete_user_joined_server(join) | ||||
|  | ||||
|         self._user_joins_vc.delete_user_joined_voice_channel_by_user_id(user.id) | ||||
|         self._users.delete_user(user) | ||||
|         self._db_context.save_changes() | ||||
|         await self._check_default_role() | ||||
|         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() | ||||
|   | ||||
| @@ -1,114 +0,0 @@ | ||||
| from typing import Optional | ||||
|  | ||||
| import discord | ||||
| from cpl_core.configuration import ConfigurationABC | ||||
| from cpl_core.logging import LoggerABC | ||||
| from cpl_discord.service import DiscordBotServiceABC | ||||
|  | ||||
| from bot_data.abc.server_config_repository_abc import ServerConfigRepositoryABC | ||||
| from bot_data.abc.server_repository_abc import ServerRepositoryABC | ||||
| from bot_data.abc.technician_config_repository_abc import TechnicianConfigRepositoryABC | ||||
| from bot_data.model.team_member_type_enum import TeamMemberTypeEnum | ||||
| from bot_core.abc.permission_service_abc import PermissionServiceABC | ||||
|  | ||||
|  | ||||
| class PermissionService(PermissionServiceABC): | ||||
|     def __init__( | ||||
|         self, | ||||
|         logger: LoggerABC, | ||||
|         bot: DiscordBotServiceABC, | ||||
|         config: ConfigurationABC, | ||||
|         servers: ServerRepositoryABC, | ||||
|         server_configs: ServerConfigRepositoryABC, | ||||
|         technician_configs: TechnicianConfigRepositoryABC, | ||||
|     ): | ||||
|         PermissionServiceABC.__init__(self) | ||||
|         self._logger = logger | ||||
|         self._bot = bot | ||||
|         self._config = config | ||||
|         self._servers = servers | ||||
|         self._server_configs = server_configs | ||||
|         self._technician_configs = technician_configs | ||||
|  | ||||
|         # member_id: {team_member_type: {guild_id: bool}} | ||||
|         self._cache: dict[int, dict[TeamMemberTypeEnum, dict[int, bool]]] = {} | ||||
|  | ||||
|     def reset_cache(self): | ||||
|         self._cache = {} | ||||
|  | ||||
|     def get_cached_permission( | ||||
|         self, member_id: int, team_member_type: TeamMemberTypeEnum, guild_id: int = None | ||||
|     ) -> Optional[bool]: | ||||
|         if member_id not in self._cache: | ||||
|             self._cache[member_id] = {} | ||||
|  | ||||
|         if team_member_type not in self._cache[member_id]: | ||||
|             self._cache[member_id][team_member_type] = {} | ||||
|             return None | ||||
|  | ||||
|         if guild_id not in self._cache[member_id][team_member_type]: | ||||
|             return None | ||||
|  | ||||
|         return self._cache[member_id][team_member_type][guild_id] | ||||
|  | ||||
|     def set_cached_permission( | ||||
|         self, value: bool, member_id: int, team_member_type: TeamMemberTypeEnum, guild_id: int = None | ||||
|     ): | ||||
|         if member_id not in self._cache: | ||||
|             self._cache[member_id] = {} | ||||
|  | ||||
|         if team_member_type not in self._cache[member_id]: | ||||
|             self._cache[member_id][team_member_type] = {} | ||||
|  | ||||
|         self._cache[member_id][team_member_type][guild_id] = value | ||||
|  | ||||
|     def _has_member_role(self, member: discord.Member, team_member_type: TeamMemberTypeEnum) -> bool: | ||||
|         if member is None or member.guild is None: | ||||
|             return False | ||||
|  | ||||
|         try: | ||||
|             has_permission_cached = self.get_cached_permission(member.id, team_member_type, member.guild.id) | ||||
|             if has_permission_cached is not None: | ||||
|                 return has_permission_cached | ||||
|  | ||||
|             self._logger.debug(__name__, f"Checking is member {member.name} {team_member_type.value}") | ||||
|  | ||||
|             has_permission = True in [ | ||||
|                 member.guild.get_role(x.role_id) in member.roles | ||||
|                 for x in self._server_configs.get_server_config_by_server( | ||||
|                     self._servers.get_server_by_discord_id(member.guild.id).id | ||||
|                 ).team_role_ids | ||||
|                 if x.team_member_type == team_member_type | ||||
|             ] | ||||
|             self.set_cached_permission(has_permission, member.id, team_member_type, member.guild.id) | ||||
|             return has_permission | ||||
|         except Exception as e: | ||||
|             self._logger.error(__name__, "Permission check failed", e) | ||||
|  | ||||
|         return False | ||||
|  | ||||
|     def is_member_admin(self, member: discord.Member) -> bool: | ||||
|         return self._has_member_role(member, TeamMemberTypeEnum.admin) | ||||
|  | ||||
|     def is_member_moderator(self, member: discord.Member) -> bool: | ||||
|         return self._has_member_role(member, TeamMemberTypeEnum.moderator) or self._has_member_role( | ||||
|             member, TeamMemberTypeEnum.admin | ||||
|         ) | ||||
|  | ||||
|     def is_member_technician(self, member: discord.Member) -> bool: | ||||
|         if member is None or member.guild is None: | ||||
|             return False | ||||
|  | ||||
|         has_permission_cached = self.get_cached_permission(member.id, TeamMemberTypeEnum.technician) | ||||
|         if has_permission_cached is not None: | ||||
|             return has_permission_cached | ||||
|  | ||||
|         self._logger.debug(__name__, f"Checking is member {member.name} technician") | ||||
|  | ||||
|         try: | ||||
|             has_permission = member.id in self._technician_configs.get_technician_config().technician_ids | ||||
|             self.set_cached_permission(has_permission, member.id, TeamMemberTypeEnum.technician) | ||||
|             return has_permission | ||||
|         except Exception as e: | ||||
|             self._logger.error(__name__, "Permission check failed", e) | ||||
|             return False | ||||
| @@ -15,7 +15,7 @@ __title__ = "bot_data" | ||||
| __author__ = "Sven Heidemann" | ||||
| __license__ = "MIT" | ||||
| __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" | ||||
| __version__ = "1.2.3" | ||||
| __version__ = "1.2.0" | ||||
|  | ||||
| from collections import namedtuple | ||||
|  | ||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | ||||
| # imports | ||||
|  | ||||
| VersionInfo = namedtuple("VersionInfo", "major minor micro") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="3") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="0") | ||||
|   | ||||
| @@ -15,7 +15,7 @@ __title__ = "bot_data.abc" | ||||
| __author__ = "Sven Heidemann" | ||||
| __license__ = "MIT" | ||||
| __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" | ||||
| __version__ = "1.2.3" | ||||
| __version__ = "1.2.0" | ||||
|  | ||||
| from collections import namedtuple | ||||
|  | ||||
| @@ -23,4 +23,4 @@ from collections import namedtuple | ||||
| # imports | ||||
|  | ||||
| VersionInfo = namedtuple("VersionInfo", "major minor micro") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="3") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="0") | ||||
|   | ||||
| @@ -1,35 +0,0 @@ | ||||
| from abc import ABC, abstractmethod | ||||
|  | ||||
| from cpl_query.extension import List | ||||
|  | ||||
| from bot_data.model.scheduled_event import ScheduledEvent | ||||
|  | ||||
|  | ||||
| class ScheduledEventRepositoryABC(ABC): | ||||
|     @abstractmethod | ||||
|     def __init__(self): | ||||
|         pass | ||||
|  | ||||
|     @abstractmethod | ||||
|     def get_scheduled_events(self) -> List[ScheduledEvent]: | ||||
|         pass | ||||
|  | ||||
|     @abstractmethod | ||||
|     def get_scheduled_event_by_id(self, id: int) -> ScheduledEvent: | ||||
|         pass | ||||
|  | ||||
|     @abstractmethod | ||||
|     def get_scheduled_events_by_server_id(self, id: int) -> List[ScheduledEvent]: | ||||
|         pass | ||||
|  | ||||
|     @abstractmethod | ||||
|     def add_scheduled_event(self, scheduled_event: ScheduledEvent): | ||||
|         pass | ||||
|  | ||||
|     @abstractmethod | ||||
|     def update_scheduled_event(self, scheduled_event: ScheduledEvent): | ||||
|         pass | ||||
|  | ||||
|     @abstractmethod | ||||
|     def delete_scheduled_event(self, scheduled_event: ScheduledEvent): | ||||
|         pass | ||||
| @@ -19,6 +19,10 @@ class UserJoinedServerRepositoryABC(ABC): | ||||
|     def get_user_joined_server_by_id(self, id: int) -> UserJoinedServer: | ||||
|         pass | ||||
|  | ||||
|     @abstractmethod | ||||
|     def get_user_joined_server_by_server_id(self, server_id: int) -> UserJoinedServer: | ||||
|         pass | ||||
|  | ||||
|     @abstractmethod | ||||
|     def get_user_joined_servers_by_user_id(self, user_id: int) -> list[UserJoinedServer]: | ||||
|         pass | ||||
|   | ||||
| @@ -31,10 +31,6 @@ class UserRepositoryABC(ABC): | ||||
|     def get_users_by_server_id(self, server_id: int) -> List[User]: | ||||
|         pass | ||||
|  | ||||
|     @abstractmethod | ||||
|     def get_users_with_activity_by_server_id(self, server_id: int) -> List[User]: | ||||
|         pass | ||||
|  | ||||
|     @abstractmethod | ||||
|     def get_user_by_discord_id_and_server_id(self, discord_id: int, server_id: int) -> User: | ||||
|         pass | ||||
|   | ||||
| @@ -4,7 +4,7 @@ | ||||
|     "Version": { | ||||
|       "Major": "1", | ||||
|       "Minor": "2", | ||||
|       "Micro": "3" | ||||
|       "Micro": "0" | ||||
|     }, | ||||
|     "Author": "Sven Heidemann", | ||||
|     "AuthorEmail": "sven.heidemann@sh-edraft.de", | ||||
|   | ||||
| @@ -14,7 +14,6 @@ from bot_data.abc.data_seeder_abc import DataSeederABC | ||||
| from bot_data.abc.game_server_repository_abc import GameServerRepositoryABC | ||||
| from bot_data.abc.known_user_repository_abc import KnownUserRepositoryABC | ||||
| from bot_data.abc.level_repository_abc import LevelRepositoryABC | ||||
| from bot_data.abc.scheduled_event_repository_abc import ScheduledEventRepositoryABC | ||||
| from bot_data.abc.server_config_repository_abc import ServerConfigRepositoryABC | ||||
| from bot_data.abc.server_repository_abc import ServerRepositoryABC | ||||
| from bot_data.abc.short_role_name_repository_abc import ShortRoleNameRepositoryABC | ||||
| @@ -46,7 +45,6 @@ from bot_data.service.client_repository_service import ClientRepositoryService | ||||
| from bot_data.service.game_server_repository_service import GameServerRepositoryService | ||||
| from bot_data.service.known_user_repository_service import KnownUserRepositoryService | ||||
| from bot_data.service.level_repository_service import LevelRepositoryService | ||||
| from bot_data.service.scheduled_event_repository_service import ScheduledEventRepositoryService | ||||
| from bot_data.service.seeder_service import SeederService | ||||
| from bot_data.service.server_config_repository_service import ( | ||||
|     ServerConfigRepositoryService, | ||||
| @@ -117,7 +115,6 @@ class DataModule(ModuleABC): | ||||
|         services.add_transient(ServerConfigRepositoryABC, ServerConfigRepositoryService) | ||||
|         services.add_transient(ShortRoleNameRepositoryABC, ShortRoleNameRepositoryService) | ||||
|         services.add_transient(SteamSpecialOfferRepositoryABC, SteamSpecialOfferRepositoryService) | ||||
|         services.add_transient(ScheduledEventRepositoryABC, ScheduledEventRepositoryService) | ||||
|  | ||||
|         services.add_transient(SeederService) | ||||
|         services.add_transient(DataSeederABC, TechnicianConfigSeeder) | ||||
|   | ||||
							
								
								
									
										26
									
								
								bot/src/bot_data/migration/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								bot/src/bot_data/migration/__init__.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| # -*- coding: utf-8 -*- | ||||
|  | ||||
| """ | ||||
| bot sh-edraft.de Discord bot | ||||
| ~~~~~~~~~~~~~~~~~~~ | ||||
|  | ||||
| Discord bot for customers of sh-edraft.de | ||||
|  | ||||
| :copyright: (c) 2022 - 2023 sh-edraft.de | ||||
| :license: MIT, see LICENSE for more details. | ||||
|  | ||||
| """ | ||||
|  | ||||
| __title__ = "bot_data.migration" | ||||
| __author__ = "Sven Heidemann" | ||||
| __license__ = "MIT" | ||||
| __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" | ||||
| __version__ = "1.2.0" | ||||
|  | ||||
| from collections import namedtuple | ||||
|  | ||||
|  | ||||
| # imports | ||||
|  | ||||
| VersionInfo = namedtuple("VersionInfo", "major minor micro") | ||||
| version_info = VersionInfo(major="1", minor="2", micro="0") | ||||
							
								
								
									
										127
									
								
								bot/src/bot_data/migration/achievements_migration.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										127
									
								
								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;""")) | ||||
							
								
								
									
										38
									
								
								bot/src/bot_data/migration/api_key_migration.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								bot/src/bot_data/migration/api_key_migration.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | ||||
| from bot_core.logging.database_logger import DatabaseLogger | ||||
| from bot_data.abc.migration_abc import MigrationABC | ||||
| from bot_data.db_context import DBContext | ||||
|  | ||||
|  | ||||
| class ApiKeyMigration(MigrationABC): | ||||
|     name = "1.0.0_ApiKeyMigration" | ||||
|  | ||||
|     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 `ApiKeys` ( | ||||
|                 `Id` BIGINT NOT NULL AUTO_INCREMENT, | ||||
|                 `Identifier` VARCHAR(255) NOT NULL, | ||||
|                 `Key` VARCHAR(255) NOT NULL, | ||||
|                 `CreatorId` BIGINT NULL, | ||||
|                 `CreatedAt` DATETIME(6), | ||||
|                 `LastModifiedAt` DATETIME(6), | ||||
|                 PRIMARY KEY(`Id`), | ||||
|                 FOREIGN KEY (`CreatorId`) REFERENCES `Users`(`UserId`), | ||||
|                 CONSTRAINT UC_Identifier_Key UNIQUE (`Identifier`,`Key`), | ||||
|                 CONSTRAINT UC_Key UNIQUE (`Key`) | ||||
|             ); | ||||
|             """ | ||||
|             ) | ||||
|         ) | ||||
|  | ||||
|     def downgrade(self): | ||||
|         self._cursor.execute("DROP TABLE `ApiKeys`;") | ||||
							
								
								
									
										61
									
								
								bot/src/bot_data/migration/api_migration.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								bot/src/bot_data/migration/api_migration.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,61 @@ | ||||
| from bot_core.logging.database_logger import DatabaseLogger | ||||
| from bot_data.abc.migration_abc import MigrationABC | ||||
| from bot_data.db_context import DBContext | ||||
|  | ||||
|  | ||||
| class ApiMigration(MigrationABC): | ||||
|     name = "0.3_ApiMigration" | ||||
|  | ||||
|     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 `AuthUsers` ( | ||||
|                 `Id` BIGINT NOT NULL AUTO_INCREMENT, | ||||
|                 `FirstName` VARCHAR(255), | ||||
|                 `LastName` VARCHAR(255), | ||||
|                 `EMail` VARCHAR(255), | ||||
|                 `Password` VARCHAR(255), | ||||
|                 `PasswordSalt` VARCHAR(255), | ||||
|                 `RefreshToken` VARCHAR(255), | ||||
|                 `ConfirmationId` VARCHAR(255) DEFAULT NULL, | ||||
|                 `ForgotPasswordId` VARCHAR(255) DEFAULT NULL, | ||||
|                 `OAuthId` VARCHAR(255) DEFAULT NULL, | ||||
|                 `RefreshTokenExpiryTime` DATETIME(6) NOT NULL, | ||||
|                 `AuthRole` INT NOT NULL DEFAULT 0, | ||||
|                 `CreatedAt` DATETIME(6) NOT NULL, | ||||
|                 `LastModifiedAt` DATETIME(6) NOT NULL, | ||||
|                 PRIMARY KEY(`Id`) | ||||
|             ); | ||||
|             """ | ||||
|             ) | ||||
|         ) | ||||
|  | ||||
|         self._cursor.execute( | ||||
|             str( | ||||
|                 f""" | ||||
|             CREATE TABLE IF NOT EXISTS `AuthUserUsersRelations`( | ||||
|                 `Id` BIGINT NOT NULL AUTO_INCREMENT, | ||||
|                 `AuthUserId` BIGINT DEFAULT NULL, | ||||
|                 `UserId` BIGINT DEFAULT NULL, | ||||
|                 `CreatedAt` DATETIME(6) NOT NULL, | ||||
|                 `LastModifiedAt` DATETIME(6) NOT NULL, | ||||
|                 PRIMARY KEY(`Id`), | ||||
|                 FOREIGN KEY (`AuthUserId`) REFERENCES `AuthUsers`(`Id`), | ||||
|                 FOREIGN KEY (`UserId`) REFERENCES `Users`(`UserId`) | ||||
|             ); | ||||
|             """ | ||||
|             ) | ||||
|         ) | ||||
|  | ||||
|     def downgrade(self): | ||||
|         self._cursor.execute("DROP TABLE `AuthUsers`;") | ||||
|         self._cursor.execute("DROP TABLE `AuthUserUsersRelations`;") | ||||
							
								
								
									
										33
									
								
								bot/src/bot_data/migration/auto_role_fix1_migration.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								bot/src/bot_data/migration/auto_role_fix1_migration.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | ||||
| from bot_core.logging.database_logger import DatabaseLogger | ||||
| from bot_data.abc.migration_abc import MigrationABC | ||||
| from bot_data.db_context import DBContext | ||||
|  | ||||
|  | ||||
| class AutoRoleFix1Migration(MigrationABC): | ||||
|     name = "0.3.0_AutoRoleFixMigration" | ||||
|  | ||||
|     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""" | ||||
|             ALTER TABLE AutoRoles ADD DiscordChannelId BIGINT NOT NULL AFTER ServerId; | ||||
|             """ | ||||
|             ) | ||||
|         ) | ||||
|  | ||||
|     def downgrade(self): | ||||
|         self._cursor.execute( | ||||
|             str( | ||||
|                 f""" | ||||
|             ALTER TABLE AutoRoles DROP COLUMN DiscordChannelId; | ||||
|             """ | ||||
|             ) | ||||
|         ) | ||||
							
								
								
									
										53
									
								
								bot/src/bot_data/migration/auto_role_migration.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								bot/src/bot_data/migration/auto_role_migration.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,53 @@ | ||||
| from bot_core.logging.database_logger import DatabaseLogger | ||||
| from bot_data.abc.migration_abc import MigrationABC | ||||
| from bot_data.db_context import DBContext | ||||
|  | ||||
|  | ||||
| class AutoRoleMigration(MigrationABC): | ||||
|     name = "0.2.1_AutoRoleMigration" | ||||
|  | ||||
|     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 `AutoRoles` ( | ||||
|                 `AutoRoleId` BIGINT NOT NULL AUTO_INCREMENT, | ||||
|                 `ServerId` BIGINT, | ||||
|                 `DiscordMessageId` BIGINT NOT NULL, | ||||
|                 `CreatedAt` DATETIME(6), | ||||
|                 `LastModifiedAt` DATETIME(6), | ||||
|                 PRIMARY KEY(`AutoRoleId`), | ||||
|                 FOREIGN KEY (`ServerId`) REFERENCES `Servers`(`ServerId`) | ||||
|             ); | ||||
|             """ | ||||
|             ) | ||||
|         ) | ||||
|  | ||||
|         self._cursor.execute( | ||||
|             str( | ||||
|                 f""" | ||||
|             CREATE TABLE IF NOT EXISTS `AutoRoleRules` ( | ||||
|                 `AutoRoleRuleId` BIGINT NOT NULL AUTO_INCREMENT, | ||||
|                 `AutoRoleId` BIGINT, | ||||
|                 `DiscordEmojiName` VARCHAR(64), | ||||
|                 `DiscordRoleId` BIGINT NOT NULL, | ||||
|                 `CreatedAt` DATETIME(6), | ||||
|                 `LastModifiedAt` DATETIME(6), | ||||
|                 PRIMARY KEY(`AutoRoleRuleId`), | ||||
|                 FOREIGN KEY (`AutoRoleId`) REFERENCES `AutoRoles`(`AutoRoleId`) | ||||
|             ); | ||||
|             """ | ||||
|             ) | ||||
|         ) | ||||
|  | ||||
|     def downgrade(self): | ||||
|         self._cursor.execute("DROP TABLE `AutoRole`;") | ||||
|         self._cursor.execute("DROP TABLE `AutoRoleRules`;") | ||||
							
								
								
									
										84
									
								
								bot/src/bot_data/migration/birthday_migration.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								bot/src/bot_data/migration/birthday_migration.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,84 @@ | ||||
| from bot_core.logging.database_logger import DatabaseLogger | ||||
| from bot_data.abc.migration_abc import MigrationABC | ||||
| from bot_data.db_context import DBContext | ||||
|  | ||||
|  | ||||
| class BirthdayMigration(MigrationABC): | ||||
|     name = "1.2.0_BirthdayMigration" | ||||
|  | ||||
|     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""" | ||||
|                     ALTER TABLE Users | ||||
|                     ADD Birthday DATE NULL AFTER MessageCount; | ||||
|                 """ | ||||
|             ) | ||||
|         ) | ||||
|  | ||||
|         self._cursor.execute( | ||||
|             str( | ||||
|                 f""" | ||||
|                     ALTER TABLE UsersHistory | ||||
|                     ADD Birthday DATE NULL AFTER MessageCount; | ||||
|                 """ | ||||
|             ) | ||||
|         ) | ||||
|         self._exec(__file__, "users.sql") | ||||
|  | ||||
|         self._cursor.execute( | ||||
|             str( | ||||
|                 f""" | ||||
|                     ALTER TABLE CFG_Server | ||||
|                     ADD XpForBirthday BIGINT(20) NOT NULL DEFAULT 0 AFTER XpPerAchievement; | ||||
|                 """ | ||||
|             ) | ||||
|         ) | ||||
|  | ||||
|         self._cursor.execute( | ||||
|             str( | ||||
|                 f""" | ||||
|                     ALTER TABLE CFG_ServerHistory | ||||
|                     ADD XpForBirthday BIGINT(20) NOT NULL DEFAULT 0 AFTER XpPerAchievement; | ||||
|                 """ | ||||
|             ) | ||||
|         ) | ||||
|         self._exec(__file__, "config/server.sql") | ||||
|  | ||||
|     def downgrade(self): | ||||
|         self._cursor.execute( | ||||
|             str( | ||||
|                 f""" | ||||
|                     ALTER TABLE Users DROP COLUMN Birthday; | ||||
|                 """ | ||||
|             ) | ||||
|         ) | ||||
|         self._cursor.execute( | ||||
|             str( | ||||
|                 f""" | ||||
|                     ALTER TABLE UsersHistory DROP COLUMN Birthday; | ||||
|                 """ | ||||
|             ) | ||||
|         ) | ||||
|         self._cursor.execute( | ||||
|             str( | ||||
|                 f""" | ||||
|                     ALTER TABLE CFG_Server DROP COLUMN XpForBirthday; | ||||
|                 """ | ||||
|             ) | ||||
|         ) | ||||
|         self._cursor.execute( | ||||
|             str( | ||||
|                 f""" | ||||
|                     ALTER TABLE CFG_ServerHistory DROP COLUMN XpForBirthday; | ||||
|                 """ | ||||
|             ) | ||||
|         ) | ||||
							
								
								
									
										29
									
								
								bot/src/bot_data/migration/config_feature_flags_migration.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								bot/src/bot_data/migration/config_feature_flags_migration.py
									
									
									
									
									
										Normal file
									
								
							| @@ -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;") | ||||
							
								
								
									
										145
									
								
								bot/src/bot_data/migration/config_migration.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										145
									
								
								bot/src/bot_data/migration/config_migration.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,145 @@ | ||||
| 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 | ||||
|  | ||||
|     def upgrade(self): | ||||
|         self._logger.debug(__name__, "Running upgrade") | ||||
|         self._server_upgrade() | ||||
|         self._technician_upgrade() | ||||
|  | ||||
|         self._exec(__file__, "config/server.sql") | ||||
|         self._exec(__file__, "config/server_afk_channels.sql") | ||||
|         self._exec(__file__, "config/server_team_roles.sql") | ||||
|         self._exec(__file__, "config/technician.sql") | ||||
|         self._exec(__file__, "config/technician_ids.sql") | ||||
|         self._exec(__file__, "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`;") | ||||
							
								
								
									
										56
									
								
								bot/src/bot_data/migration/db_history_migration.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								bot/src/bot_data/migration/db_history_migration.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,56 @@ | ||||
| from bot_core.logging.database_logger import DatabaseLogger | ||||
| from bot_data.abc.migration_abc import MigrationABC | ||||
| from bot_data.db_context import DBContext | ||||
|  | ||||
|  | ||||
| class DBHistoryMigration(MigrationABC): | ||||
|     name = "1.0.0_DBHistoryMigration" | ||||
|     prio = 1 | ||||
|  | ||||
|     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._exec(__file__, "api_keys.sql") | ||||
|         self._exec(__file__, "auth_users.sql") | ||||
|         self._exec(__file__, "auth_user_users_relation.sql") | ||||
|         self._exec(__file__, "auto_role_rules.sql") | ||||
|         self._exec(__file__, "auto_roles.sql") | ||||
|         self._exec(__file__, "clients.sql") | ||||
|         self._exec(__file__, "game_servers.sql") | ||||
|         self._exec(__file__, "known_users.sql") | ||||
|         self._exec(__file__, "levels.sql") | ||||
|         self._exec(__file__, "servers.sql") | ||||
|         self._exec(__file__, "user_game_idents.sql") | ||||
|         self._exec(__file__, "user_joined_game_servers.sql") | ||||
|         self._exec(__file__, "user_joined_servers.sql") | ||||
|         self._exec(__file__, "user_joined_voice_channel.sql") | ||||
|         self._exec(__file__, "user_message_count_per_hour.sql") | ||||
|         self._exec(__file__, "users.sql") | ||||
|         self._exec(__file__, "user_warnings.sql") | ||||
|  | ||||
|         self._logger.debug(__name__, "Finished history upgrade") | ||||
|  | ||||
|     def downgrade(self): | ||||
|         self._cursor.execute("DROP TABLE `ApiKeysHistory`;") | ||||
|         self._cursor.execute("DROP TABLE `AuthUsersHistory`;") | ||||
|         self._cursor.execute("DROP TABLE `AuthUserUsersRelationsHistory`;") | ||||
|         self._cursor.execute("DROP TABLE `AutoRoleRulesHistory`;") | ||||
|         self._cursor.execute("DROP TABLE `AutoRolesHistory`;") | ||||
|         self._cursor.execute("DROP TABLE `ClientsHistory`;") | ||||
|         self._cursor.execute("DROP TABLE `GameServersHistory`;") | ||||
|         self._cursor.execute("DROP TABLE `KnownUsersHistory`;") | ||||
|         self._cursor.execute("DROP TABLE `LevelsHistory`;") | ||||
|         self._cursor.execute("DROP TABLE `ServersHistory`;") | ||||
|         self._cursor.execute("DROP TABLE `UserGameIdentsHistory`;") | ||||
|         self._cursor.execute("DROP TABLE `UserJoinedGameServerHistory`;") | ||||
|         self._cursor.execute("DROP TABLE `UserJoinedServersHistory`;") | ||||
|         self._cursor.execute("DROP TABLE `UserJoinedVoiceChannelHistory`;") | ||||
|         self._cursor.execute("DROP TABLE `UserMessageCountPerHourHistory`;") | ||||
|         self._cursor.execute("DROP TABLE `UsersHistory`;") | ||||
|         self._cursor.execute("DROP TABLE `UserWarningsHistory`;") | ||||
							
								
								
									
										46
									
								
								bot/src/bot_data/migration/db_history_scripts/api_keys.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								bot/src/bot_data/migration/db_history_scripts/api_keys.sql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | ||||
| ALTER TABLE `ApiKeys` | ||||
|     CHANGE `CreatedAt` `CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6); | ||||
|  | ||||
| ALTER TABLE `ApiKeys` | ||||
|     CHANGE `LastModifiedAt` `LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6); | ||||
|  | ||||
| CREATE TABLE IF NOT EXISTS `ApiKeysHistory` | ||||
| ( | ||||
|     `Id`         BIGINT(20)   NOT NULL, | ||||
|     `Identifier` VARCHAR(255) NOT NULL, | ||||
|     `Key`        VARCHAR(255) NOT NULL, | ||||
|     `CreatorId`  BIGINT(20) DEFAULT NULL, | ||||
|     `Deleted`    BOOL       DEFAULT FALSE, | ||||
|     `DateFrom`   DATETIME(6)  NOT NULL, | ||||
|     `DateTo`     DATETIME(6)  NOT NULL | ||||
| ); | ||||
|  | ||||
| DROP TRIGGER IF EXISTS `TR_ApiKeysUpdate`; | ||||
|  | ||||
| CREATE TRIGGER `TR_ApiKeysUpdate` | ||||
|     AFTER UPDATE | ||||
|     ON `ApiKeys` | ||||
|     FOR EACH ROW | ||||
| BEGIN | ||||
|     INSERT INTO `ApiKeysHistory` ( | ||||
|         `Id`, `Identifier`, `Key`, `CreatorId`, `DateFrom`, `DateTo` | ||||
|     ) | ||||
|     VALUES ( | ||||
|         OLD.Id, OLD.Identifier, OLD.Key, OLD.CreatorId, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6) | ||||
|     ); | ||||
| END; | ||||
|  | ||||
| DROP TRIGGER IF EXISTS `TR_ApiKeysDelete`; | ||||
|  | ||||
| CREATE TRIGGER `TR_ApiKeysDelete` | ||||
|     AFTER DELETE | ||||
|     ON `ApiKeys` | ||||
|     FOR EACH ROW | ||||
| BEGIN | ||||
|     INSERT INTO `ApiKeysHistory` ( | ||||
|         `Id`, `Identifier`, `Key`, `CreatorId`, `Deleted`, `DateFrom`, `DateTo` | ||||
|     ) | ||||
|     VALUES ( | ||||
|         OLD.Id, OLD.Identifier, OLD.Key, OLD.CreatorId, TRUE, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6) | ||||
|     ); | ||||
| END; | ||||
| @@ -0,0 +1,46 @@ | ||||
| ALTER TABLE `AuthUserUsersRelations` | ||||
|     CHANGE `CreatedAt` `CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6); | ||||
|  | ||||
| ALTER TABLE `AuthUserUsersRelations` | ||||
|     CHANGE `LastModifiedAt` `LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6); | ||||
|  | ||||
|  | ||||
| CREATE TABLE IF NOT EXISTS `AuthUserUsersRelationsHistory` | ||||
| ( | ||||
|     `Id`         BIGINT(20)  NOT NULL, | ||||
|     `AuthUserId` BIGINT(20) DEFAULT NULL, | ||||
|     `UserId`     BIGINT(20) DEFAULT NULL, | ||||
|     `Deleted`    BOOL       DEFAULT FALSE, | ||||
|     `DateFrom`   DATETIME(6) NOT NULL, | ||||
|     `DateTo`     DATETIME(6) NOT NULL | ||||
| ); | ||||
|  | ||||
| DROP TRIGGER IF EXISTS `TR_AuthUserUsersRelationsUpdate`; | ||||
|  | ||||
| CREATE TRIGGER `TR_AuthUserUsersRelationsUpdate` | ||||
|     AFTER UPDATE | ||||
|     ON `AuthUserUsersRelations` | ||||
|     FOR EACH ROW | ||||
| BEGIN | ||||
|     INSERT INTO `AuthUserUsersRelationsHistory` ( | ||||
|         `Id`, `AuthUserId`, `UserId`, `DateFrom`, `DateTo` | ||||
|     ) | ||||
|     VALUES ( | ||||
|         OLD.Id, OLD.AuthUserId, OLD.UserId, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6) | ||||
|     ); | ||||
| END; | ||||
|  | ||||
| DROP TRIGGER IF EXISTS `TR_AuthUserUsersRelationsDelete`; | ||||
|  | ||||
| CREATE TRIGGER `TR_AuthUserUsersRelationsDelete` | ||||
|     AFTER DELETE | ||||
|     ON `AuthUserUsersRelations` | ||||
|     FOR EACH ROW | ||||
| BEGIN | ||||
|     INSERT INTO `AuthUserUsersRelationsHistory` ( | ||||
|         `Id`, `AuthUserId`, `UserId`, `Deleted`, `DateFrom`, `DateTo` | ||||
|     ) | ||||
|     VALUES ( | ||||
|         OLD.Id, OLD.AuthUserId, OLD.UserId, TRUE, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6) | ||||
|     ); | ||||
| END; | ||||
							
								
								
									
										62
									
								
								bot/src/bot_data/migration/db_history_scripts/auth_users.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								bot/src/bot_data/migration/db_history_scripts/auth_users.sql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,62 @@ | ||||
| ALTER TABLE `AuthUsers` | ||||
|     CHANGE `CreatedAt` `CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6); | ||||
|  | ||||
| ALTER TABLE `AuthUsers` | ||||
|     CHANGE `LastModifiedAt` `LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6); | ||||
|  | ||||
| CREATE TABLE IF NOT EXISTS `AuthUsersHistory` | ||||
| ( | ||||
|     `Id`                     BIGINT(20)  NOT NULL, | ||||
|     `FirstName`              VARCHAR(255)         DEFAULT NULL, | ||||
|     `LastName`               VARCHAR(255)         DEFAULT NULL, | ||||
|     `EMail`                  VARCHAR(255)         DEFAULT NULL, | ||||
|     `Password`               VARCHAR(255)         DEFAULT NULL, | ||||
|     `PasswordSalt`           VARCHAR(255)         DEFAULT NULL, | ||||
|     `RefreshToken`           VARCHAR(255)         DEFAULT NULL, | ||||
|     `ConfirmationId`         VARCHAR(255)         DEFAULT NULL, | ||||
|     `ForgotPasswordId`       VARCHAR(255)         DEFAULT NULL, | ||||
|     `OAuthId`                VARCHAR(255)         DEFAULT NULL, | ||||
|     `RefreshTokenExpiryTime` DATETIME(6) NOT NULL, | ||||
|     `AuthRole`               BIGINT(11)  NOT NULL DEFAULT 0, | ||||
|     `Deleted`                BOOL                 DEFAULT FALSE, | ||||
|     `DateFrom`               DATETIME(6) NOT NULL, | ||||
|     `DateTo`                 DATETIME(6) NOT NULL | ||||
| ); | ||||
|  | ||||
| DROP TRIGGER IF EXISTS `TR_AuthUsersUpdate`; | ||||
|  | ||||
| CREATE TRIGGER `TR_AuthUsersUpdate` | ||||
|     AFTER UPDATE | ||||
|     ON `AuthUsers` | ||||
|     FOR EACH ROW | ||||
| BEGIN | ||||
|     INSERT INTO `AuthUsersHistory` ( | ||||
|         `Id`, `FirstName`, `LastName`, `EMail`, `Password`, `PasswordSalt`, | ||||
|         `RefreshToken`, `ConfirmationId`, `ForgotPasswordId`, `OAuthId`, | ||||
|         `RefreshTokenExpiryTime`, `AuthRole`, `DateFrom`, `DateTo` | ||||
|     ) | ||||
|     VALUES ( | ||||
|         OLD.Id, OLD.FirstName, OLD.LastName, OLD.EMail, OLD.Password, OLD.PasswordSalt, OLD.RefreshToken, | ||||
|         OLD.ConfirmationId, OLD.ForgotPasswordId, OLD.OAuthId, OLD.RefreshTokenExpiryTime, OLD.AuthRole, | ||||
|         OLD.LastModifiedAt, CURRENT_TIMESTAMP(6) | ||||
|     ); | ||||
| END; | ||||
|  | ||||
| DROP TRIGGER IF EXISTS `TR_AuthUsersDelete`; | ||||
|  | ||||
| CREATE TRIGGER `TR_AuthUsersDelete` | ||||
|     AFTER DELETE | ||||
|     ON `AuthUsers` | ||||
|     FOR EACH ROW | ||||
| BEGIN | ||||
|     INSERT INTO `AuthUsersHistory` ( | ||||
|         `Id`, `FirstName`, `LastName`, `EMail`, `Password`, `PasswordSalt`, `RefreshToken`, | ||||
|         `ConfirmationId`, `ForgotPasswordId`, `OAuthId`, `RefreshTokenExpiryTime`, | ||||
|         `AuthRole`, `Deleted`, `DateFrom`, `DateTo` | ||||
|     ) | ||||
|     VALUES ( | ||||
|         OLD.Id, OLD.FirstName, OLD.LastName, OLD.EMail, OLD.Password, OLD.PasswordSalt, OLD.RefreshToken, | ||||
|         OLD.ConfirmationId, OLD.ForgotPasswordId, OLD.OAuthId, OLD.RefreshTokenExpiryTime, OLD.AuthRole, TRUE, | ||||
|         OLD.LastModifiedAt, CURRENT_TIMESTAMP(6) | ||||
|     ); | ||||
| END; | ||||
| @@ -0,0 +1,46 @@ | ||||
| ALTER TABLE `AutoRoleRules` | ||||
|     CHANGE `CreatedAt` `CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6); | ||||
|  | ||||
| ALTER TABLE `AutoRoleRules` | ||||
|     CHANGE `LastModifiedAt` `LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6); | ||||
|  | ||||
| CREATE TABLE IF NOT EXISTS `AutoRoleRulesHistory` | ||||
| ( | ||||
|     `Id`   BIGINT(20)  NOT NULL, | ||||
|     `AutoRoleId`       BIGINT(20)  DEFAULT NULL, | ||||
|     `DiscordEmojiName` VARCHAR(64) DEFAULT NULL, | ||||
|     `DiscordRoleId`    BIGINT(20)  NOT NULL, | ||||
|     `Deleted`          BOOL        DEFAULT FALSE, | ||||
|     `DateFrom`         DATETIME(6) NOT NULL, | ||||
|     `DateTo`           DATETIME(6) NOT NULL | ||||
| ); | ||||
|  | ||||
| DROP TRIGGER IF EXISTS `TR_AutoRoleRulesUpdate`; | ||||
|  | ||||
| CREATE TRIGGER `TR_AutoRoleRulesUpdate` | ||||
|     AFTER UPDATE | ||||
|     ON `AutoRoleRules` | ||||
|     FOR EACH ROW | ||||
| BEGIN | ||||
|     INSERT INTO `AutoRoleRulesHistory` ( | ||||
|         `Id`, `AutoRoleId`, `DiscordEmojiName`, `DiscordRoleId`, `DateFrom`, `DateTo` | ||||
|     ) | ||||
|     VALUES ( | ||||
|         OLD.AutoRoleRuleId, OLD.AutoRoleId, OLD.DiscordEmojiName, OLD.DiscordRoleId, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6) | ||||
|     ); | ||||
| END; | ||||
|  | ||||
| DROP TRIGGER IF EXISTS `TR_AutoRoleRulesDelete`; | ||||
|  | ||||
| CREATE TRIGGER `TR_AutoRoleRulesDelete` | ||||
|     AFTER DELETE | ||||
|     ON `AutoRoleRules` | ||||
|     FOR EACH ROW | ||||
| BEGIN | ||||
|     INSERT INTO `AutoRoleRulesHistory` ( | ||||
|         `Id`, `AutoRoleId`, `DiscordEmojiName`, `DiscordRoleId`, `Deleted`, `DateFrom`, `DateTo` | ||||
|     ) | ||||
|     VALUES ( | ||||
|         OLD.AutoRoleRuleId, OLD.AutoRoleId, OLD.DiscordEmojiName, OLD.DiscordRoleId, TRUE, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6) | ||||
|     ); | ||||
| END; | ||||
							
								
								
									
										48
									
								
								bot/src/bot_data/migration/db_history_scripts/auto_roles.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								bot/src/bot_data/migration/db_history_scripts/auto_roles.sql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,48 @@ | ||||
| ALTER TABLE `AutoRoles` | ||||
|     CHANGE `CreatedAt` `CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6); | ||||
|  | ||||
| ALTER TABLE `AutoRoles` | ||||
|     CHANGE `LastModifiedAt` `LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6); | ||||
|  | ||||
| CREATE TABLE IF NOT EXISTS `AutoRolesHistory` | ||||
| ( | ||||
|     `Id`       BIGINT(20)  NOT NULL, | ||||
|     `ServerId`         BIGINT(20) DEFAULT NULL, | ||||
|     `DiscordChannelId` BIGINT(20)  NOT NULL, | ||||
|     `DiscordMessageId` BIGINT(20)  NOT NULL, | ||||
|     `Deleted`          BOOL       DEFAULT FALSE, | ||||
|     `DateFrom`         DATETIME(6) NOT NULL, | ||||
|     `DateTo`           DATETIME(6) NOT NULL | ||||
| ); | ||||
|  | ||||
| DROP TRIGGER IF EXISTS `TR_AutoRolesUpdate`; | ||||
|  | ||||
| CREATE TRIGGER `TR_AutoRolesUpdate` | ||||
|     AFTER UPDATE | ||||
|     ON `AutoRoles` | ||||
|     FOR EACH ROW | ||||
| BEGIN | ||||
|     INSERT INTO `AutoRolesHistory` ( | ||||
|         `Id`, `ServerId`, `DiscordChannelId`, `DiscordMessageId`, `DateFrom`, `DateTo` | ||||
|     ) | ||||
|     VALUES ( | ||||
|         OLD.AutoRoleId, OLD.ServerId, OLD.DiscordChannelId, OLD.DiscordMessageId, OLD.LastModifiedAt, | ||||
|         CURRENT_TIMESTAMP(6) | ||||
|     ); | ||||
| END; | ||||
|  | ||||
| DROP TRIGGER IF EXISTS `TR_AutoRolesDelete`; | ||||
|  | ||||
| CREATE TRIGGER `TR_AutoRolesDelete` | ||||
|     AFTER DELETE | ||||
|     ON `AutoRoles` | ||||
|     FOR EACH ROW | ||||
| BEGIN | ||||
|     INSERT INTO `AutoRolesHistory` ( | ||||
|         `Id`, `ServerId`, `DiscordChannelId`, `DiscordMessageId`, `Deleted`, `DateFrom`, `DateTo` | ||||
|     ) | ||||
|     VALUES ( | ||||
|         OLD.AutoRoleId, OLD.ServerId, OLD.DiscordChannelId, OLD.DiscordMessageId, TRUE, OLD.LastModifiedAt, | ||||
|         CURRENT_TIMESTAMP(6) | ||||
|     ); | ||||
| END; | ||||
							
								
								
									
										54
									
								
								bot/src/bot_data/migration/db_history_scripts/clients.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								bot/src/bot_data/migration/db_history_scripts/clients.sql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,54 @@ | ||||
| ALTER TABLE `Clients` | ||||
|     CHANGE `CreatedAt` `CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6); | ||||
|  | ||||
| ALTER TABLE `Clients` | ||||
|     CHANGE `LastModifiedAt` `LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6); | ||||
|  | ||||
| CREATE TABLE IF NOT EXISTS `ClientsHistory` | ||||
| ( | ||||
|     `Id`              BIGINT(20)  NOT NULL, | ||||
|     `DiscordId`       BIGINT(20)  NOT NULL, | ||||
|     `SentMessageCount`      BIGINT(20)  NOT NULL DEFAULT 0, | ||||
|     `ReceivedMessageCount`  BIGINT(20)  NOT NULL DEFAULT 0, | ||||
|     `DeletedMessageCount`   BIGINT(20)  NOT NULL DEFAULT 0, | ||||
|     `ReceivedCommandsCount` BIGINT(20)  NOT NULL DEFAULT 0, | ||||
|     `MovedUsersCount`       BIGINT(20)  NOT NULL DEFAULT 0, | ||||
|     `ServerId`              BIGINT(20)           DEFAULT NULL, | ||||
|     `Deleted`               BOOL                 DEFAULT FALSE, | ||||
|     `DateFrom`              DATETIME(6) NOT NULL, | ||||
|     `DateTo`                DATETIME(6) NOT NULL | ||||
| ); | ||||
|  | ||||
| DROP TRIGGER IF EXISTS `TR_ClientsUpdate`; | ||||
|  | ||||
| CREATE TRIGGER `TR_ClientsUpdate` | ||||
|     AFTER UPDATE | ||||
|     ON `Clients` | ||||
|     FOR EACH ROW | ||||
| BEGIN | ||||
|     INSERT INTO `ClientsHistory` ( | ||||
|         `Id`, `DiscordId`, `SentMessageCount`, `ReceivedMessageCount`, `DeletedMessageCount`, | ||||
|         `ReceivedCommandsCount`, `MovedUsersCount`, `ServerId`, `DateFrom`, `DateTo` | ||||
|     ) | ||||
|     VALUES ( | ||||
|         OLD.ClientId, OLD.DiscordClientId, OLD.SentMessageCount, OLD.ReceivedMessageCount, OLD.DeletedMessageCount, | ||||
|         OLD.ReceivedCommandsCount, OLD.MovedUsersCount, OLD.ServerId, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6) | ||||
|     ); | ||||
| END; | ||||
|  | ||||
| DROP TRIGGER IF EXISTS `TR_ClientsDelete`; | ||||
|  | ||||
| CREATE TRIGGER `TR_ClientsDelete` | ||||
|     AFTER DELETE | ||||
|     ON `Clients` | ||||
|     FOR EACH ROW | ||||
| BEGIN | ||||
|     INSERT INTO `ClientsHistory` ( | ||||
|         `Id`, `DiscordId`, `SentMessageCount`, `ReceivedMessageCount`, `DeletedMessageCount`, | ||||
|         `ReceivedCommandsCount`, `MovedUsersCount`, `ServerId`, `Deleted`, `DateFrom`, `DateTo` | ||||
|     ) | ||||
|     VALUES ( | ||||
|         OLD.ClientId, OLD.DiscordClientId, OLD.SentMessageCount, OLD.ReceivedMessageCount, OLD.DeletedMessageCount, | ||||
|         OLD.ReceivedCommandsCount, OLD.MovedUsersCount, OLD.ServerId, TRUE, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6) | ||||
|     ); | ||||
| END; | ||||
| @@ -1,12 +1,29 @@ | ||||
| ALTER TABLE CFG_Server | ||||
|     ADD ShortRoleNameSetOnlyHighest BOOLEAN NOT NULL DEFAULT FALSE AFTER DefaultRoleId; | ||||
| 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, | ||||
|     `DefaultRoleId`               BIGINT      NULL, | ||||
|     `ShortRoleNameSetOnlyHighest` BOOLEAN     NOT NULL DEFAULT FALSE, | ||||
|     `FeatureFlags`                JSON        NULL     DEFAULT ('{}'), | ||||
|     `ServerId`                    BIGINT      NOT NULL, | ||||
|     `Deleted`                     BOOL                 DEFAULT FALSE, | ||||
|     `DateFrom`                    DATETIME(6) NOT NULL, | ||||
|     `DateTo`                      DATETIME(6) NOT NULL | ||||
| ); | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ALTER TABLE CFG_ServerHistory | ||||
|     ADD ShortRoleNameSetOnlyHighest BOOLEAN NOT NULL DEFAULT FALSE AFTER DefaultRoleId; | ||||
| 
 | ||||
| DROP TRIGGER IF EXISTS `TR_CFG_ServerUpdate`;; | ||||
| DROP TRIGGER IF EXISTS `TR_CFG_ServerUpdate`; | ||||
| 
 | ||||
| CREATE TRIGGER `TR_CFG_ServerUpdate` | ||||
|     AFTER UPDATE | ||||
| @@ -53,9 +70,9 @@ BEGIN | ||||
|             OLD.ServerId, | ||||
|             OLD.LastModifiedAt, | ||||
|             CURRENT_TIMESTAMP(6)); | ||||
| END;; | ||||
| END; | ||||
| 
 | ||||
| DROP TRIGGER IF EXISTS `TR_CFG_ServerDelete`;; | ||||
| DROP TRIGGER IF EXISTS `TR_CFG_ServerDelete`; | ||||
| 
 | ||||
| CREATE TRIGGER `TR_CFG_ServerDelete` | ||||
|     AFTER DELETE | ||||
| @@ -104,5 +121,4 @@ BEGIN | ||||
|             TRUE, | ||||
|             OLD.LastModifiedAt, | ||||
|             CURRENT_TIMESTAMP(6)); | ||||
| END;; | ||||
| 
 | ||||
| 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; | ||||
| @@ -1,12 +1,17 @@ | ||||
| ALTER TABLE CFG_Technician | ||||
|     ADD MaxSteamOfferCount BIGINT NOT NULL DEFAULT 250 AFTER CacheMaxMessages; | ||||
| 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, | ||||
|     `FeatureFlags`            JSON         NULL     DEFAULT ('{}'), | ||||
|     `Deleted`                 BOOL                  DEFAULT FALSE, | ||||
|     `DateFrom`                DATETIME(6)  NOT NULL, | ||||
|     `DateTo`                  DATETIME(6)  NOT NULL | ||||
| ); | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ALTER TABLE CFG_TechnicianHistory | ||||
|     ADD MaxSteamOfferCount BIGINT NOT NULL DEFAULT 250 AFTER CacheMaxMessages; | ||||
| 
 | ||||
| DROP TRIGGER IF EXISTS `TR_CFG_TechnicianUpdate`;; | ||||
| DROP TRIGGER IF EXISTS `TR_CFG_TechnicianUpdate`; | ||||
| 
 | ||||
| CREATE TRIGGER `TR_CFG_TechnicianUpdate` | ||||
|     AFTER UPDATE | ||||
| @@ -18,7 +23,6 @@ BEGIN | ||||
|                                          `WaitForRestart`, | ||||
|                                          `WaitForShutdown`, | ||||
|                                          `CacheMaxMessages`, | ||||
|                                          `MaxSteamOfferCount`, | ||||
|                                          `FeatureFlags`, | ||||
|                                          `DateFrom`, | ||||
|                                          `DateTo`) | ||||
| @@ -27,13 +31,12 @@ BEGIN | ||||
|             OLD.WaitForRestart, | ||||
|             OLD.WaitForShutdown, | ||||
|             OLD.CacheMaxMessages, | ||||
|             OLD.MaxSteamOfferCount, | ||||
|             OLD.FeatureFlags, | ||||
|             OLD.LastModifiedAt, | ||||
|             CURRENT_TIMESTAMP(6)); | ||||
| END;; | ||||
| END; | ||||
| 
 | ||||
| DROP TRIGGER IF EXISTS `TR_CFG_TechnicianDelete`;; | ||||
| DROP TRIGGER IF EXISTS `TR_CFG_TechnicianDelete`; | ||||
| 
 | ||||
| CREATE TRIGGER `TR_CFG_TechnicianDelete` | ||||
|     AFTER DELETE | ||||
| @@ -45,7 +48,6 @@ BEGIN | ||||
|                                          `WaitForRestart`, | ||||
|                                          `WaitForShutdown`, | ||||
|                                          `CacheMaxMessages`, | ||||
|                                          `MaxSteamOfferCount`, | ||||
|                                          `FeatureFlags`, | ||||
|                                          `Deleted`, | ||||
|                                          `DateFrom`, | ||||
| @@ -55,10 +57,8 @@ BEGIN | ||||
|             OLD.WaitForRestart, | ||||
|             OLD.WaitForShutdown, | ||||
|             OLD.CacheMaxMessages, | ||||
|             OLD.MaxSteamOfferCount, | ||||
|             OLD.FeatureFlags, | ||||
|             TRUE, | ||||
|             OLD.LastModifiedAt, | ||||
|             CURRENT_TIMESTAMP(6)); | ||||
| END;; | ||||
| 
 | ||||
| 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; | ||||
| @@ -0,0 +1,46 @@ | ||||
| ALTER TABLE `GameServers` | ||||
|     CHANGE `CreatedAt` `CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6); | ||||
|  | ||||
| ALTER TABLE `GameServers` | ||||
|     CHANGE `LastModifiedAt` `LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6); | ||||
|  | ||||
| CREATE TABLE IF NOT EXISTS `GameServersHistory` | ||||
| ( | ||||
|     `Id`       BIGINT(20)   NOT NULL, | ||||
|     `Name`     VARCHAR(255) NOT NULL, | ||||
|     `ServerId` BIGINT(20)   NOT NULL, | ||||
|     `ApiKeyId` BIGINT(20)   NOT NULL, | ||||
|     `Deleted`  BOOL DEFAULT FALSE, | ||||
|     `DateFrom` DATETIME(6)  NOT NULL, | ||||
|     `DateTo`   DATETIME(6)  NOT NULL | ||||
| ); | ||||
|  | ||||
| DROP TRIGGER IF EXISTS `TR_GameServersUpdate`; | ||||
|  | ||||
| CREATE TRIGGER `TR_GameServersUpdate` | ||||
|     AFTER UPDATE | ||||
|     ON `GameServers` | ||||
|     FOR EACH ROW | ||||
| BEGIN | ||||
|     INSERT INTO `GameServersHistory` ( | ||||
|         `Id`, `Name`, `ServerId`, `ApiKeyId`, `DateFrom`, `DateTo` | ||||
|     ) | ||||
|     VALUES ( | ||||
|         OLD.Id, OLD.Name, OLD.ServerId, OLD.ApiKeyId, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6) | ||||
|     ); | ||||
| END; | ||||
|  | ||||
| DROP TRIGGER IF EXISTS `TR_GameServersDelete`; | ||||
|  | ||||
| CREATE TRIGGER `TR_GameServersDelete` | ||||
|     AFTER DELETE | ||||
|     ON `GameServers` | ||||
|     FOR EACH ROW | ||||
| BEGIN | ||||
|     INSERT INTO `GameServersHistory` ( | ||||
|         `Id`, `Name`, `ServerId`, `ApiKeyId`, `Deleted`, `DateFrom`, `DateTo` | ||||
|     ) | ||||
|     VALUES ( | ||||
|         OLD.Id, OLD.Name, OLD.ServerId, OLD.ApiKeyId, TRUE, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6) | ||||
|     ); | ||||
| END; | ||||
| @@ -0,0 +1,44 @@ | ||||
| ALTER TABLE `KnownUsers` | ||||
|     CHANGE `CreatedAt` `CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6); | ||||
|  | ||||
| ALTER TABLE `KnownUsers` | ||||
|     CHANGE `LastModifiedAt` `LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6); | ||||
|  | ||||
| CREATE TABLE IF NOT EXISTS `KnownUsersHistory` | ||||
| ( | ||||
|     `Id` BIGINT(20)  NOT NULL, | ||||
|     `DiscordId`   BIGINT(20)  NOT NULL, | ||||
|     `Deleted`     BOOL DEFAULT FALSE, | ||||
|     `DateFrom`    DATETIME(6) NOT NULL, | ||||
|     `DateTo`      DATETIME(6) NOT NULL | ||||
| ); | ||||
|  | ||||
| DROP TRIGGER IF EXISTS `TR_KnownUsersUpdate`; | ||||
|  | ||||
| CREATE TRIGGER `TR_KnownUsersUpdate` | ||||
|     AFTER UPDATE | ||||
|     ON `KnownUsers` | ||||
|     FOR EACH ROW | ||||
| BEGIN | ||||
|     INSERT INTO `KnownUsersHistory` ( | ||||
|         `Id`, `DiscordId`, `DateFrom`, `DateTo` | ||||
|     ) | ||||
|     VALUES ( | ||||
|         OLD.KnownUserId, OLD.DiscordId, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6) | ||||
|     ); | ||||
| END; | ||||
|  | ||||
| DROP TRIGGER IF EXISTS `TR_KnownUsersDelete`; | ||||
|  | ||||
| CREATE TRIGGER `TR_KnownUsersDelete` | ||||
|     AFTER DELETE | ||||
|     ON `KnownUsers` | ||||
|     FOR EACH ROW | ||||
| BEGIN | ||||
|     INSERT INTO `KnownUsersHistory` ( | ||||
|         `Id`, `DiscordId`, `Deleted`, `DateFrom`, `DateTo` | ||||
|     ) | ||||
|     VALUES ( | ||||
|         OLD.KnownUserId, OLD.DiscordId, TRUE, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6) | ||||
|     ); | ||||
| END; | ||||
							
								
								
									
										50
									
								
								bot/src/bot_data/migration/db_history_scripts/levels.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								bot/src/bot_data/migration/db_history_scripts/levels.sql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,50 @@ | ||||
| ALTER TABLE `Levels` | ||||
|     CHANGE `CreatedAt` `CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6); | ||||
|  | ||||
| ALTER TABLE `Levels` | ||||
|     CHANGE `LastModifiedAt` `LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6); | ||||
|  | ||||
| CREATE TABLE IF NOT EXISTS `LevelsHistory` | ||||
| ( | ||||
|     `Id`            BIGINT(20)   NOT NULL, | ||||
|     `Name`          VARCHAR(255) NOT NULL, | ||||
|     `Color`         VARCHAR(8)   NOT NULL, | ||||
|     `MinXp`         BIGINT(20)   NOT NULL, | ||||
|     `PermissionInt` BIGINT(20)   NOT NULL, | ||||
|     `ServerId`      BIGINT(20) DEFAULT NULL, | ||||
|     `Deleted`       BOOL       DEFAULT FALSE, | ||||
|     `DateFrom`      DATETIME(6)  NOT NULL, | ||||
|     `DateTo`        DATETIME(6)  NOT NULL | ||||
| ); | ||||
|  | ||||
| DROP TRIGGER IF EXISTS `TR_LevelsUpdate`; | ||||
|  | ||||
| CREATE TRIGGER `TR_LevelsUpdate` | ||||
|     AFTER UPDATE | ||||
|     ON `Levels` | ||||
|     FOR EACH ROW | ||||
| BEGIN | ||||
|     INSERT INTO `LevelsHistory` ( | ||||
|         `Id`, `Name`, `Color`, `MinXp`, `PermissionInt`, `ServerId`, `DateFrom`, `DateTo` | ||||
|     ) | ||||
|     VALUES ( | ||||
|         OLD.Id, OLD.Name, OLD.Color, OLD.MinXp, OLD.PermissionInt, OLD.ServerId, OLD.LastModifiedAt, | ||||
|         CURRENT_TIMESTAMP(6) | ||||
|     ); | ||||
| END; | ||||
|  | ||||
| DROP TRIGGER IF EXISTS `TR_LevelsDelete`; | ||||
|  | ||||
| CREATE TRIGGER `TR_LevelsDelete` | ||||
|     AFTER DELETE | ||||
|     ON `Levels` | ||||
|     FOR EACH ROW | ||||
| BEGIN | ||||
|     INSERT INTO `LevelsHistory` ( | ||||
|         `Id`, `Name`, `Color`, `MinXp`, `PermissionInt`, `ServerId`, `Deleted`, `DateFrom`, `DateTo` | ||||
|     ) | ||||
|     VALUES ( | ||||
|         OLD.Id, OLD.Name, OLD.Color, OLD.MinXp, OLD.PermissionInt, OLD.ServerId, TRUE, OLD.LastModifiedAt, | ||||
|         CURRENT_TIMESTAMP(6) | ||||
|     ); | ||||
| END; | ||||
							
								
								
									
										44
									
								
								bot/src/bot_data/migration/db_history_scripts/servers.sql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								bot/src/bot_data/migration/db_history_scripts/servers.sql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,44 @@ | ||||
| ALTER TABLE `Servers` | ||||
|     CHANGE `CreatedAt` `CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6); | ||||
|  | ||||
| ALTER TABLE `Servers` | ||||
|     CHANGE `LastModifiedAt` `LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6); | ||||
|  | ||||
| CREATE TABLE IF NOT EXISTS `ServersHistory` | ||||
| ( | ||||
|     `Id`        BIGINT(20)  NOT NULL, | ||||
|     `DiscordId` BIGINT(20)  NOT NULL, | ||||
|     `Deleted`         BOOL DEFAULT FALSE, | ||||
|     `DateFrom`        DATETIME(6) NOT NULL, | ||||
|     `DateTo`          DATETIME(6) NOT NULL | ||||
| ); | ||||
|  | ||||
| DROP TRIGGER IF EXISTS `TR_ServersUpdate`; | ||||
|  | ||||
| CREATE TRIGGER `TR_ServersUpdate` | ||||
|     AFTER UPDATE | ||||
|     ON `Servers` | ||||
|     FOR EACH ROW | ||||
| BEGIN | ||||
|     INSERT INTO `ServersHistory` ( | ||||
|         `Id`, `DiscordId`, `DateFrom`, `DateTo` | ||||
|     ) | ||||
|     VALUES ( | ||||
|         OLD.ServerId, OLD.DiscordServerId, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6) | ||||
|     ); | ||||
| END; | ||||
|  | ||||
| DROP TRIGGER IF EXISTS `TR_ServersDelete`; | ||||
|  | ||||
| CREATE TRIGGER `TR_ServersDelete` | ||||
|     AFTER DELETE | ||||
|     ON `Servers` | ||||
|     FOR EACH ROW | ||||
| BEGIN | ||||
|     INSERT INTO `ServersHistory` ( | ||||
|         `Id`, `DiscordId`, `Deleted`, `DateFrom`, `DateTo` | ||||
|     ) | ||||
|     VALUES ( | ||||
|         OLD.ServerId, OLD.DiscordServerId, TRUE, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6) | ||||
|     ); | ||||
| END; | ||||
| @@ -1,17 +1,3 @@ | ||||
| CREATE TABLE IF NOT EXISTS `ShortRoleNames` | ||||
| ( | ||||
|     `Id`             BIGINT                   NOT NULL AUTO_INCREMENT, | ||||
|     `ShortName`      VARCHAR(255)             NOT NULL, | ||||
|     `DiscordRoleId`  BIGINT                   NOT NULL, | ||||
|     `Position`       ENUM ('before', 'after') 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`) | ||||
| ); | ||||
| 
 | ||||
| 
 | ||||
| CREATE TABLE IF NOT EXISTS `ShortRoleNamesHistory` | ||||
| ( | ||||
|     `Id`            BIGINT(20)               NOT NULL, | ||||
| @@ -22,9 +8,9 @@ CREATE TABLE IF NOT EXISTS `ShortRoleNamesHistory` | ||||
|     `Deleted`       BOOL        DEFAULT FALSE, | ||||
|     `DateFrom`      DATETIME(6)              NOT NULL, | ||||
|     `DateTo`        DATETIME(6)              NOT NULL | ||||
| );; | ||||
| ); | ||||
| 
 | ||||
| DROP TRIGGER IF EXISTS `TR_ShortRoleNamesUpdate`;; | ||||
| DROP TRIGGER IF EXISTS `TR_ShortRoleNamesUpdate`; | ||||
| 
 | ||||
| CREATE TRIGGER `TR_ShortRoleNamesUpdate` | ||||
|     AFTER UPDATE | ||||
| @@ -35,9 +21,9 @@ BEGIN | ||||
|                                          `DateTo`) | ||||
|     VALUES (OLD.Id, OLD.ShortName, OLD.DiscordRoleId, OLD.Position, OLD.ServerId, OLD.LastModifiedAt, | ||||
|             CURRENT_TIMESTAMP(6)); | ||||
| END;; | ||||
| END; | ||||
| 
 | ||||
| DROP TRIGGER IF EXISTS `TR_ShortRoleNamesDelete`;; | ||||
| DROP TRIGGER IF EXISTS `TR_ShortRoleNamesDelete`; | ||||
| 
 | ||||
| CREATE TRIGGER `TR_ShortRoleNamesDelete` | ||||
|     AFTER DELETE | ||||
| @@ -49,5 +35,4 @@ BEGIN | ||||
|                                          `DateTo`) | ||||
|     VALUES (OLD.Id, OLD.ShortName, OLD.DiscordRoleId, OLD.Position, OLD.ServerId, TRUE, OLD.LastModifiedAt, | ||||
|             CURRENT_TIMESTAMP(6)); | ||||
| END;; | ||||
| 
 | ||||
| END; | ||||
| @@ -0,0 +1,46 @@ | ||||
| ALTER TABLE `UserGameIdents` | ||||
|     CHANGE `CreatedAt` `CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6); | ||||
|  | ||||
| ALTER TABLE `UserGameIdents` | ||||
|     CHANGE `LastModifiedAt` `LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6); | ||||
|  | ||||
| CREATE TABLE IF NOT EXISTS `UserGameIdentsHistory` | ||||
| ( | ||||
|     `Id`           BIGINT(20)   NOT NULL, | ||||
|     `UserId`       BIGINT(20)   NOT NULL, | ||||
|     `GameServerId` BIGINT(20)   NOT NULL, | ||||
|     `Ident`        VARCHAR(255) NOT NULL, | ||||
|     `Deleted`      BOOL DEFAULT FALSE, | ||||
|     `DateFrom`     DATETIME(6)  NOT NULL, | ||||
|     `DateTo`       DATETIME(6)  NOT NULL | ||||
| ); | ||||
|  | ||||
| DROP TRIGGER IF EXISTS `TR_UserGameIdentsUpdate`; | ||||
|  | ||||
| CREATE TRIGGER `TR_UserGameIdentsUpdate` | ||||
|     AFTER UPDATE | ||||
|     ON `UserGameIdents` | ||||
|     FOR EACH ROW | ||||
| BEGIN | ||||
|     INSERT INTO `UserGameIdentsHistory` ( | ||||
|         `Id`, `UserId`, `GameServerId`, `Ident`, `DateFrom`, `DateTo` | ||||
|     ) | ||||
|     VALUES ( | ||||
|         OLD.Id, OLD.UserId, OLD.GameServerId, OLD.Ident, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6) | ||||
|     ); | ||||
| END; | ||||
|  | ||||
| DROP TRIGGER IF EXISTS `TR_UserGameIdentsDelete`; | ||||
|  | ||||
| CREATE TRIGGER `TR_UserGameIdentsDelete` | ||||
|     AFTER DELETE | ||||
|     ON `UserGameIdents` | ||||
|     FOR EACH ROW | ||||
| BEGIN | ||||
|     INSERT INTO `UserGameIdentsHistory` ( | ||||
|         `Id`, `UserId`, `GameServerId`, `Ident`, `Deleted`, `DateFrom`, `DateTo` | ||||
|     ) | ||||
|     VALUES ( | ||||
|         OLD.Id, OLD.UserId, OLD.GameServerId, OLD.Ident, TRUE, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6) | ||||
|     ); | ||||
| END; | ||||
| @@ -0,0 +1,47 @@ | ||||
| ALTER TABLE `UserJoinedGameServer` | ||||
|     CHANGE `CreatedAt` `CreatedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6); | ||||
|  | ||||
| ALTER TABLE `UserJoinedGameServer` | ||||
|     CHANGE `LastModifiedAt` `LastModifiedAt` DATETIME(6) NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6); | ||||
|  | ||||
| CREATE TABLE IF NOT EXISTS `UserJoinedGameServerHistory` | ||||
| ( | ||||
|     `Id`           BIGINT(20)  NOT NULL, | ||||
|     `UserId`       BIGINT(20)  NOT NULL, | ||||
|     `GameServerId` BIGINT(20)  NOT NULL, | ||||
|     `JoinedOn`     DATETIME(6) NOT NULL, | ||||
|     `LeavedOn`     DATETIME(6) DEFAULT NULL, | ||||
|     `Deleted`      BOOL        DEFAULT FALSE, | ||||
|     `DateFrom`     DATETIME(6) NOT NULL, | ||||
|     `DateTo`       DATETIME(6) NOT NULL | ||||
| ); | ||||
|  | ||||
| DROP TRIGGER IF EXISTS `TR_UserJoinedGameServerUpdate`; | ||||
|  | ||||
| CREATE TRIGGER `TR_UserJoinedGameServerUpdate` | ||||
|     AFTER UPDATE | ||||
|     ON `UserJoinedGameServer` | ||||
|     FOR EACH ROW | ||||
| BEGIN | ||||
|     INSERT INTO `UserJoinedGameServerHistory` ( | ||||
|         `Id`, `UserId`, `GameServerId`, `JoinedOn`, `LeavedOn`, `DateFrom`, `DateTo` | ||||
|     ) | ||||
|     VALUES ( | ||||
|         OLD.Id, OLD.UserId, OLD.GameServerId, OLD.JoinedOn, OLD.LeavedOn, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6) | ||||
|     ); | ||||
| END; | ||||
|  | ||||
| DROP TRIGGER IF EXISTS `TR_UserJoinedGameServerDelete`; | ||||
|  | ||||
| CREATE TRIGGER `TR_UserJoinedGameServerDelete` | ||||
|     AFTER DELETE | ||||
|     ON `UserJoinedGameServer` | ||||
|     FOR EACH ROW | ||||
| BEGIN | ||||
|     INSERT INTO `UserJoinedGameServerHistory` ( | ||||
|         `Id`, `UserId`, `GameServerId`, `JoinedOn`, `LeavedOn`, `Deleted`, `DateFrom`, `DateTo` | ||||
|     ) | ||||
|     VALUES ( | ||||
|         OLD.Id, OLD.UserId, OLD.GameServerId, OLD.JoinedOn, OLD.LeavedOn, TRUE, OLD.LastModifiedAt, CURRENT_TIMESTAMP(6) | ||||
|     ); | ||||
| END; | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user