63 Commits

Author SHA1 Message Date
1f07a03186 Merge pull request '#127_config_in_wi' (#327) from #127_config_in_wi into 1.1.0
Reviewed-on: sh-edraft.de/kd_discord_bot#327
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
2023-08-14 19:08:21 +02:00
97e7f2f01e Added server config to frontend #127 2023-08-14 19:05:11 +02:00
45a96cf06e Added server config mutation #127 2023-08-14 19:05:11 +02:00
f9d99697db Added translations #127 2023-08-14 19:05:11 +02:00
d771243217 Added logic to edit technician config in WI #127 2023-08-14 19:05:11 +02:00
55f23d703b Added technician config to frontend #127 2023-08-14 19:05:08 +02:00
3ff767a545 Added technician config mutation #127 2023-08-14 19:04:48 +02:00
a8a48709c6 Added technician config queries #127 2023-08-14 19:04:48 +02:00
f41515a739 Removed old settings #127 2023-08-14 19:04:48 +02:00
52787d0fb5 Changed config loading from file to db #127 2023-08-14 19:04:47 +02:00
09d63e7418 Added technician config seeder #127 2023-08-14 19:04:47 +02:00
fc3bf73986 Improved technician config repo #127 2023-08-14 19:04:47 +02:00
9450020d94 Added technician config repo #127 2023-08-14 19:04:47 +02:00
4d4941ef68 Added sql for cfg in wi migration #127 2023-08-14 19:04:47 +02:00
2c7a617ac8 Added config migration #127 2023-08-14 19:04:47 +02:00
2a435bc71c Removed from_dict from settings stuff #127 2023-08-14 19:04:47 +02:00
8585606347 Added migration for config in wi #127 2023-08-14 19:04:47 +02:00
d146777b65 Merge pull request 'Moved version settings to version.json #294' (#329) from #294_frontend_version into 1.1.0
Reviewed-on: sh-edraft.de/kd_discord_bot#329
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
2023-08-14 19:03:38 +02:00
a3229848ef Moved version settings to version.json #294 2023-08-14 19:01:10 +02:00
a869ee4780 Merge pull request '#293_complaints' (#326) from #293_complaints into 1.1.0
Reviewed-on: sh-edraft.de/kd_discord_bot#326
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
2023-08-14 09:37:08 +02:00
5776854494 Merge branch '1.1.0' into #293_complaints 2023-08-14 09:36:27 +02:00
5c820214a1 Merge pull request '#268_achievements' (#325) from #268_achievements into 1.1.0
Reviewed-on: sh-edraft.de/kd_discord_bot#325
Reviewed-by: edraft-dev <dev.sven.heidemann@sh-edraft.de>
2023-08-14 09:36:20 +02:00
f11d9af6c7 Fixed workspace #268_achievements 2023-08-14 09:35:46 +02:00
bff435d51e Added bug report #293_complaints 2023-07-18 11:43:50 +02:00
0f67bf467a Improved complaint command #293_complaints 2023-07-18 11:30:05 +02:00
2c7e5edbd7 [UNTESTED] Added complaint command #293_complaints 2023-07-18 11:15:20 +02:00
0846bbb29b Added achievements to data integrity service #268_achievements 2023-07-18 11:14:29 +02:00
926323252a Add xp for achievement #268_achievements 2023-07-18 11:06:12 +02:00
fedf2f4b8b Added description to achievements #268_achievements 2023-07-18 11:06:12 +02:00
4d4320dbcd Added history for achievements to frontend #268_achievements 2023-07-18 11:06:12 +02:00
c0b7e0913c Fixed achievements in user profile #268_achievements 2023-07-18 11:06:12 +02:00
9dcb75109f Added achievements to user profile #268_achievements 2023-07-18 11:06:12 +02:00
67baf350fa Added last_single_ontime_hours achievement logic #268_achievements 2023-07-18 11:06:12 +02:00
642a4d4dac Added played_on_game_server achievement logic #268_achievements 2023-07-18 11:06:12 +02:00
6b86cc3ca8 Improved generic achievement logic #268_achievements 2023-07-18 11:06:11 +02:00
fd10614b20 Improved internal achievement checks #268_achievements 2023-07-18 11:06:11 +02:00
0ec67d41e2 Added logic to make achievement config more generic #268_achievements 2023-07-18 11:06:11 +02:00
51928dcb4d Fixed config #268_achievements 2023-07-18 11:06:11 +02:00
e36f0b8c76 Improved achievement logic #268_achievements 2023-07-18 11:06:11 +02:00
2578c47c44 Improved achievement endpoint #268_achievements 2023-07-18 11:06:11 +02:00
dda2e2f5f6 Improved achievement component #268_achievements 2023-07-18 11:06:11 +02:00
8aa96482c1 Fixed server cache & improved frontend implementation #268_achievements 2023-07-18 11:06:11 +02:00
109bbf3729 First step to add achievements to frontend #268_achievements 2023-07-18 11:06:11 +02:00
3db548fb86 Fixed achievement query #268_achievements 2023-07-18 11:06:11 +02:00
0e5ec588fc Fixed achievement query #268_achievements 2023-07-18 11:06:11 +02:00
2c9434396d Added achievement gql endpoint [UNTESTED] #268_achievements 2023-07-18 11:06:11 +02:00
a49188b412 Fixed models #268_achievements 2023-07-18 11:06:11 +02:00
9e9879497a Added achievement data model #268_achievements 2023-07-18 11:06:11 +02:00
95e766d023 Merge pull request '#292_shutdown_procedure' (#321) from #292_shutdown_procedure into 1.1.0
Reviewed-on: sh-edraft.de/kd_discord_bot#321
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
Closes #292
2023-07-18 11:03:16 +02:00
e25c29b2a6 Merge branch '1.1.0' into #292_shutdown_procedure 2023-07-18 11:03:00 +02:00
1dd6db4c85 Merge pull request 'Fixed gql playground' (#322) from 1.1.0_fix_playground into 1.1.0
Reviewed-on: sh-edraft.de/kd_discord_bot#322
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
2023-06-26 10:27:51 +02:00
9a51e51235 Fixed gql playground 2023-06-18 18:51:36 +02:00
fe5f3ced39 Merge branch '1.1.0' into #292_shutdown_procedure 2023-06-16 10:40:18 +02:00
c1ec7dd97b Merge pull request 'Updated packages #297_cpl_update' (#320) from #297_cpl_update into 1.1.0
Reviewed-on: sh-edraft.de/kd_discord_bot#320
Reviewed-by: Ebola-Chan <nick.jungmann@gmail.com>
2023-06-16 10:39:33 +02:00
09771ac2a3 Ensure bot shutdown before data checks #292_shutdown_procedure 2023-06-14 11:48:49 +02:00
6f27ce7bbc Improved open voice state check #292_shutdown_procedure 2023-06-14 09:34:31 +02:00
806144d9d3 Added data integrity check to shutdown #292_shutdown_procedure 2023-06-14 09:29:07 +02:00
877af6b945 Moved data integrity check #292_shutdown_procedure 2023-06-14 09:25:54 +02:00
979e0a0e6f Removed comments #297_cpl_update 2023-06-14 09:00:19 +02:00
fdf10f2728 Updated cpl-discord #297_cpl_update 2023-06-13 16:24:38 +02:00
f7ffd78dcc Updated stuff #297_cpl_update 2023-06-13 16:16:52 +02:00
8ddb9f087a Updated packages #297_cpl_update 2023-06-12 20:52:01 +02:00
0ca3be478b Merge pull request 'Added reaction channel null check #318' (#319) from #318 into 1.1.0
Reviewed-on: sh-edraft.de/kd_discord_bot#319
2023-06-08 08:48:31 +02:00
330 changed files with 1475 additions and 6597 deletions

View File

@@ -1,17 +0,0 @@
#### Beschreibung
Als Produktmanager muss ich nun dieses Ticket ausfüllen.
#### Aktuelles Verhalten
* Was macht die Software aktuell?
#### Gewünschtes Verhalten
* Was soll die Software anders machen?
#### Akzeptanzkriterien
* Was muss erfüllt sein, damit das Ticket als abgeschlossen angesehen werden kann?
#### Anmerkungen

View File

@@ -1,7 +0,0 @@
#### Ticket Referenz:
#1
#### Gibt es etwas beim Review zu beachten?
Nein

View File

@@ -1,65 +0,0 @@
name: Deploy dev on push
run-name: Deploy dev on push
on:
push:
branches:
- dev
jobs:
on-push-deploy_sh-edraft:
runs-on: [ dobby.sh-edraft.de, ubuntu-latest ]
container: catthehacker/ubuntu:act-latest
steps:
- name: Setup Python 3.10
uses: actions/setup-python@v3
with:
python-version: "3.10.12"
- run: python -v
- 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
- name: Shutdown stack
run: docker stack rm kdb_staging
- name: Prepare bot build
run: |
cd kdb-bot
pip install --extra-index-url https://pip.sh-edraft.de cpl-cli
cpl i
- name: Build docker bot
run: |
cd kdb-bot
docker image prune -f
cpl docker-build
- name: Setup node
uses: https://github.com/actions/setup-node@v3
- name: Prepare web build
run: |
cd kdb-web
npm install -g ts-node
npm i
- name: Build docker web
run: |
cd kdb-web
docker image prune -f
npm run docker-build
- 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: kdb_staging
file: ./docker-compose.staging.yml
variables: '{}'

View File

@@ -1,65 +0,0 @@
name: Deploy dev on push
run-name: Deploy dev on push
on:
push:
branches:
- master
jobs:
on-push-deploy_sh-edraft:
runs-on: [ dobby.sh-edraft.de, ubuntu-latest ]
container: catthehacker/ubuntu:act-latest
steps:
- name: Setup Python 3.10
uses: actions/setup-python@v3
with:
python-version: "3.10.12"
- run: python -v
- 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
- name: Shutdown stack
run: docker stack rm kdb_prod
- name: Prepare bot build
run: |
cd kdb-bot
pip install --extra-index-url https://pip.sh-edraft.de cpl-cli
cpl i
- name: Build docker bot
run: |
cd kdb-bot
docker image prune -f
cpl docker-build
- name: Setup node
uses: https://github.com/actions/setup-node@v3
- name: Prepare web build
run: |
cd kdb-web
npm install -g ts-node
npm i
- name: Build docker web
run: |
cd kdb-web
docker image prune -f
npm run docker-build
- 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: kdb_prod
file: ./docker-compose.yml
variables: '{}'

View File

@@ -1,87 +0,0 @@
version: "3.9"
volumes:
kdb_db_staging_1:
services:
kdb_bot_staging_1:
image: sh-edraft.de/kdb-bot:1.1.9
restart: unless-stopped
depends_on:
- kdb_db_staging_1
networks:
- kdb_test
- reverse_proxy
volumes:
- /opt/kdb/staging/bot/config:/app/bot/config
- /opt/kdb/staging/bot/api_config:/app/bot_api/config
- /opt/kdb/staging/bot/logs:/app/bot/logs
environment:
KDB_ENVIRONMENT: "staging"
KDB_TOKEN: "OTk4MTU5ODAyMzkzOTY0NTk0.G-csct.b2Y-HxvLz0SfFLl5HpukROv2GaiWhcMABbMzYE"
KDB_PREFIX: "!kt "
command: bash /app/bot/bot -stage
deploy:
mode: replicated
replicas: 1
placement:
constraints: [node.role == manager]
resources:
reservations:
cpus: "0.5"
memory: 1024M
kdb_web_staging_1:
image: sh-edraft.de/kdb-web:1.1.9
depends_on:
- kdb_bot_staging_1
networks:
- kdb_test
- reverse_proxy
volumes:
- /opt/kdb/staging/web/config.json:/usr/share/nginx/html/assets/config.json
environment:
BOT_CONTAINER_NAME: "kdb_bot_staging_1"
deploy:
mode: replicated
replicas: 1
placement:
constraints: [node.role == manager]
resources:
limits:
cpus: "0.4"
memory: 400M
reservations:
cpus: "0.1"
memory: 20M
kdb_db_staging_1:
image: mysql:latest
command: mysqld --default-authentication-plugin=mysql_native_password --log_bin_trust_function_creators=1
networks:
- kdb_test
environment:
MYSQL_ROOT_PASSWORD: "kd_kdb"
MYSQL_USER: "kd_kdb"
MYSQL_PASSWORD: "~qELxjvtjJ3r7yg4PZr5!,V}d.{TC4rg"
MYSQL_DATABASE: "kd_kdb"
ports:
- "3308:3306"
volumes:
- kdb_db_staging_1:/var/lib/mysql
deploy:
mode: replicated
replicas: 1
placement:
constraints: [node.role == manager]
resources:
reservations:
cpus: "0.1"
memory: 150M
networks:
reverse_proxy:
external: true
kdb_test:
driver: overlay
attachable: true

View File

@@ -1,87 +0,0 @@
version: "3.9"
volumes:
kdb_db_prod_1:
services:
kdb_bot_prod_1:
image: sh-edraft.de/kdb-bot:1.1.9
restart: unless-stopped
depends_on:
- kdb_db_prod_1
networks:
- kdb_prod
- reverse_proxy
volumes:
- /opt/kdb/production/bot/config:/app/bot/config
- /opt/kdb/production/bot/api_config:/app/bot_api/config
- /opt/kdb/production/bot/logs:/app/bot/logs
environment:
KDB_ENVIRONMENT: "production"
KDB_TOKEN: "OTk4MTU5NTEyNDYyNzA4Nzg2.Gx0hSB.Ouq2dfRKxLBJvHfEq8OrFBHVUF24AQrVf55coM"
KDB_PREFIX: "!k "
deploy:
mode: replicated
replicas: 1
placement:
constraints: [node.role == manager]
resources:
reservations:
cpus: "0.5"
memory: 1024M
kdb_web_prod_1:
image: sh-edraft.de/kdb-web:1.1.9
depends_on:
- kdb_bot_prod_1
networks:
- kdb_prod
- reverse_proxy
volumes:
- /opt/kdb/production/web/config.json:/usr/share/nginx/html/assets/config.json
environment:
BOT_CONTAINER_NAME: "kdb_bot_prod_1"
deploy:
mode: replicated
replicas: 1
placement:
constraints: [node.role == manager]
resources:
limits:
cpus: "0.4"
memory: 400M
reservations:
cpus: "0.1"
memory: 20M
kdb_db_prod_1:
image: mysql:latest
command: mysqld --default-authentication-plugin=mysql_native_password --log_bin_trust_function_creators=1
networks:
- kdb_prod
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: "kd_kdb"
MYSQL_USER: "kd_kdb"
MYSQL_PASSWORD: ",2#MzfN4J=7r(q,Tz3npDkCR§>VE&}7T"
MYSQL_DATABASE: "kd_kdb"
ports:
- "3307:3306"
volumes:
- kdb_db_prod_1:/var/lib/mysql
deploy:
mode: replicated
replicas: 1
placement:
constraints: [node.role == manager]
resources:
reservations:
cpus: "0.1"
memory: 150M
networks:
reverse_proxy:
external: true
kdb_prod:
driver: overlay
attachable: true

View File

@@ -11,12 +11,11 @@
"auto-role": "src/modules/auto_role/auto-role.json", "auto-role": "src/modules/auto_role/auto-role.json",
"base": "src/modules/base/base.json", "base": "src/modules/base/base.json",
"boot-log": "src/modules/boot_log/boot-log.json", "boot-log": "src/modules/boot_log/boot-log.json",
"config": "src/modules/config/config.json", "config": "src/modules/config/modules/config.json",
"database": "src/modules/database/database.json", "database": "src/modules/database/database.json",
"level": "src/modules/level/level.json", "level": "src/modules/level/level.json",
"permission": "src/modules/permission/permission.json", "permission": "src/modules/permission/permission.json",
"technician": "src/modules/technician/technician.json", "technician": "src/modules/technician/technician.json",
"short-role-name": "src/modules/short_role_name/short-role-name.json",
"checks": "tools/checks/checks.json", "checks": "tools/checks/checks.json",
"get-version": "tools/get_version/get-version.json", "get-version": "tools/get_version/get-version.json",
"post-build": "tools/post_build/post-build.json", "post-build": "tools/post_build/post-build.json",
@@ -36,7 +35,7 @@
"stage": "export KDB_ENVIRONMENT=staging; export KDB_NAME=KDB-Stage; cpl start;", "stage": "export KDB_ENVIRONMENT=staging; export KDB_NAME=KDB-Stage; cpl start;",
"pre-dev": "cpl build", "pre-dev": "cpl build",
"dev": "export KDB_ENVIRONMENT=development; export KDB_NAME=KDB-Dev; cpl start;", "dev": "export KDB_ENVIRONMENT=development; export KDB_NAME=KDB-Dev; cpl start;",
"docker-build": "cpl build $ARGS; docker build -t sh-edraft.de/kdb-bot:$(cpl gv) .;", "docker-build": "cpl build $ARGS; docker build -t kdb-bot/kdb-bot:$(cpl gv) .;",
"dc-up": "docker-compose up -d", "dc-up": "docker-compose up -d",
"dc-down": "docker-compose down", "dc-down": "docker-compose down",
"docker": "cpl dc-down; cpl docker-build; cpl dc-up;" "docker": "cpl dc-down; cpl docker-build; cpl dc-up;"

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" """
bot sh-edraft.de Discord bot bot Keksdose bot
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de Discord bot for the Keksdose discord Server
:copyright: (c) 2022 - 2023 sh-edraft.de :copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details. :license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.9" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports: # imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="9") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -71,7 +71,7 @@ class Application(DiscordBotApplicationABC):
self._api.stop() self._api.stop()
await self._bot.close() await self._bot.close()
await self._data_integrity.check_data_integrity(is_for_shutdown=True) self._data_integrity.check_data_integrity(is_for_shutdown=True)
self._logger.info(__name__, f"Stopped {DiscordBotService.__name__}") self._logger.info(__name__, f"Stopped {DiscordBotService.__name__}")
except Exception as e: except Exception as e:
self._logger.error(__name__, "stop failed", e) self._logger.error(__name__, "stop failed", e)

View File

@@ -3,13 +3,13 @@
"Name": "bot", "Name": "bot",
"Version": { "Version": {
"Major": "1", "Major": "1",
"Minor": "1", "Minor": "0",
"Micro": "9" "Micro": "7"
}, },
"Author": "Sven Heidemann", "Author": "Sven Heidemann",
"AuthorEmail": "sven.heidemann@sh-edraft.de", "AuthorEmail": "sven.heidemann@sh-edraft.de",
"Description": "sh-edraft.de Discord bot", "Description": "Keksdose bot",
"LongDescription": "Discord bot for customers of sh-edraft.de", "LongDescription": "Discord bot for the Keksdose discord Server",
"URL": "https://www.sh-edraft.de", "URL": "https://www.sh-edraft.de",
"CopyrightDate": "2022 - 2023", "CopyrightDate": "2022 - 2023",
"CopyrightName": "sh-edraft.de", "CopyrightName": "sh-edraft.de",
@@ -30,8 +30,7 @@
"requests-oauthlib==1.3.1", "requests-oauthlib==1.3.1",
"icmplib==3.0.3", "icmplib==3.0.3",
"ariadne==0.20.1", "ariadne==0.20.1",
"cryptography==41.0.2", "cryptography==41.0.2"
"discord>=2.3.2"
], ],
"DevDependencies": [ "DevDependencies": [
"cpl-cli==2023.4.0.post3", "cpl-cli==2023.4.0.post3",
@@ -60,15 +59,12 @@
"../bot_core/bot-core.json", "../bot_core/bot-core.json",
"../bot_data/bot-data.json", "../bot_data/bot-data.json",
"../bot_graphql/bot-graphql.json", "../bot_graphql/bot-graphql.json",
"../modules/achievements/achievements.json",
"../modules/auto_role/auto-role.json", "../modules/auto_role/auto-role.json",
"../modules/base/base.json", "../modules/base/base.json",
"../modules/boot_log/boot-log.json", "../modules/boot_log/boot-log.json",
"../modules/config/config.json",
"../modules/database/database.json", "../modules/database/database.json",
"../modules/level/level.json", "../modules/level/level.json",
"../modules/permission/permission.json", "../modules/permission/permission.json",
"../modules/short_role_name/short-role-name.json",
"../modules/technician/technician.json" "../modules/technician/technician.json"
] ]
} }

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" """
bot sh-edraft.de Discord bot bot Keksdose bot
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de Discord bot for the Keksdose discord Server
:copyright: (c) 2022 - 2023 sh-edraft.de :copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details. :license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot.extension"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.9" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports: # imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="9") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -31,10 +31,10 @@ class Program:
.use_extension(StartupDiscordExtension) .use_extension(StartupDiscordExtension)
.use_extension(StartupModuleExtension) .use_extension(StartupModuleExtension)
.use_extension(StartupMigrationExtension) .use_extension(StartupMigrationExtension)
.use_extension(DatabaseExtension)
.use_extension(ConfigExtension) .use_extension(ConfigExtension)
.use_extension(InitBotExtension) .use_extension(InitBotExtension)
.use_extension(BootLogExtension) .use_extension(BootLogExtension)
.use_extension(DatabaseExtension)
.use_extension(AppApiExtension) .use_extension(AppApiExtension)
.use_extension(CoreExtension) .use_extension(CoreExtension)
.use_startup(Startup) .use_startup(Startup)

View File

@@ -13,7 +13,6 @@ from modules.config.config_module import ConfigModule
from modules.database.database_module import DatabaseModule from modules.database.database_module import DatabaseModule
from modules.level.level_module import LevelModule from modules.level.level_module import LevelModule
from modules.permission.permission_module import PermissionModule from modules.permission.permission_module import PermissionModule
from modules.short_role_name.short_role_name_module import ShortRoleNameModule
from modules.technician.technician_module import TechnicianModule from modules.technician.technician_module import TechnicianModule
@@ -26,8 +25,8 @@ class ModuleList:
[ [
CoreModule, # has to be first! CoreModule, # has to be first!
DataModule, DataModule,
ConfigModule, # has to be before db check
DatabaseModule, DatabaseModule,
ConfigModule, # has be to after db check
GraphQLModule, GraphQLModule,
PermissionModule, PermissionModule,
AutoRoleModule, AutoRoleModule,
@@ -36,7 +35,6 @@ class ModuleList:
ApiModule, ApiModule,
TechnicianModule, TechnicianModule,
AchievementsModule, AchievementsModule,
ShortRoleNameModule,
# has to be last! # has to be last!
BootLogModule, BootLogModule,
CoreExtensionModule, CoreExtensionModule,

View File

@@ -9,16 +9,11 @@ from bot_data.migration.api_key_migration import ApiKeyMigration
from bot_data.migration.api_migration import ApiMigration from bot_data.migration.api_migration import ApiMigration
from bot_data.migration.auto_role_fix1_migration import AutoRoleFix1Migration from bot_data.migration.auto_role_fix1_migration import AutoRoleFix1Migration
from bot_data.migration.auto_role_migration import AutoRoleMigration from bot_data.migration.auto_role_migration import AutoRoleMigration
from bot_data.migration.config_feature_flags_migration import ConfigFeatureFlagsMigration
from bot_data.migration.config_migration import ConfigMigration from bot_data.migration.config_migration import ConfigMigration
from bot_data.migration.db_history_migration import DBHistoryMigration from bot_data.migration.db_history_migration import DBHistoryMigration
from bot_data.migration.default_role_migration import DefaultRoleMigration
from bot_data.migration.fix_updates_migration import FixUpdatesMigration
from bot_data.migration.initial_migration import InitialMigration from bot_data.migration.initial_migration import InitialMigration
from bot_data.migration.level_migration import LevelMigration from bot_data.migration.level_migration import LevelMigration
from bot_data.migration.remove_stats_migration import RemoveStatsMigration 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.stats_migration import StatsMigration
from bot_data.migration.user_joined_game_server_migration import UserJoinedGameServerMigration from bot_data.migration.user_joined_game_server_migration import UserJoinedGameServerMigration
from bot_data.migration.user_message_count_per_hour_migration import ( from bot_data.migration.user_message_count_per_hour_migration import (
@@ -51,8 +46,3 @@ class StartupMigrationExtension(StartupExtensionABC):
services.add_transient(MigrationABC, DBHistoryMigration) # 06.03.2023 #246 - 1.0.0 services.add_transient(MigrationABC, DBHistoryMigration) # 06.03.2023 #246 - 1.0.0
services.add_transient(MigrationABC, AchievementsMigration) # 14.06.2023 #268 - 1.1.0 services.add_transient(MigrationABC, AchievementsMigration) # 14.06.2023 #268 - 1.1.0
services.add_transient(MigrationABC, ConfigMigration) # 19.07.2023 #127 - 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

View File

@@ -82,7 +82,6 @@
"unexpected_quote_error": "Fehler: Unerwarteter Fehler beim Anführungszeichen!", "unexpected_quote_error": "Fehler: Unerwarteter Fehler beim Anführungszeichen!",
"user_input_error": "Fehler: Eingabefehler!" "user_input_error": "Fehler: Eingabefehler!"
}, },
"feature_not_activated": "Diese Funktion ist deaktiviert",
"hello_world": "Hallo Welt", "hello_world": "Hallo Welt",
"no_permission_message": "Nein!\nIch höre nicht auf dich ¯\\_(ツ)_/¯", "no_permission_message": "Nein!\nIch höre nicht auf dich ¯\\_(ツ)_/¯",
"not_implemented_yet": "Ey Alter, das kann ich noch nicht...", "not_implemented_yet": "Ey Alter, das kann ich noch nicht...",
@@ -95,10 +94,10 @@
}, },
"modules": { "modules": {
"achievements": { "achievements": {
"got_new_achievement": "{} hat die Errungenschaft {} freigeschaltet :D",
"commands": { "commands": {
"check": "Alles klar, ich schaue eben nach... nom nom" "check": "Alles klar, ich schaue eben nach... nom nom"
}, }
"got_new_achievement": "{} hat die Errungenschaft {} freigeschaltet :D"
}, },
"auto_role": { "auto_role": {
"add": { "add": {
@@ -123,9 +122,6 @@
}, },
"success": "auto-role {} wurde entfernt :D" "success": "auto-role {} wurde entfernt :D"
}, },
"react": {
"success": "Alle Reaktionen wurden hinzugefügt"
},
"rule": { "rule": {
"add": { "add": {
"error": { "error": {
@@ -155,37 +151,32 @@
} }
}, },
"base": { "base": {
"afk_command_channel_missing_message": "Zu unfähig einem Sprachkanal beizutreten?",
"afk_command_move_message": "Ich verschiebe dich ja schon... (◔_◔)",
"bug": {
"label": "Bug",
"message": "{} meldet einen Bug:\n{}",
"response": "Danke für dein Feedback :D",
"title": "Bug melden"
},
"complaints": { "complaints": {
"title": "Beschwerde einreichen",
"label": "Beschwerde", "label": "Beschwerde",
"message": "{} hat eine Beschwerde eingereicht:\n{}", "message": "{} hat eine Beschwerde eingereicht:\n{}",
"response": "Danke für deine Beschwerde", "response": "Danke für deine Beschwerde"
"title": "Beschwerde einreichen"
}, },
"bug": {
"title": "Bug melden",
"label": "Bug",
"message": "{} meldet einen Bug:\n{}",
"response": "Danke für dein Feedback :D"
},
"afk_command_channel_missing_message": "Zu unfähig einem Sprachkanal beizutreten?",
"afk_command_move_message": "Ich verschiebe dich ja schon... (◔_◔)",
"game_server": { "game_server": {
"add": {
"success": "Gameserver {} wurde hinzugefügt :)"
},
"error": { "error": {
"nothing_found": "Keine Gameserver gefunden." "nothing_found": "Keine Gameserver gefunden."
}, },
"list": { "list": {
"api_key": "API Key", "title": "Gameserver",
"description": "Konfigurierte Gameserver:", "description": "Konfigurierte Gameserver:",
"name": "Name", "name": "Name",
"title": "Gameserver" "api_key": "API Key"
}, },
"list_members": { "add": {
"description": "Konfigurierte Mitglieder:", "success": "Gameserver {} wurde hinzugefügt :)"
"title": "Mitglieder",
"users": "Mitglieder"
}, },
"remove": { "remove": {
"success": "Gameserver wurde entfernt :D" "success": "Gameserver wurde entfernt :D"
@@ -212,7 +203,6 @@
"moved": "Alle Personen aus {} wurden nach {} verschoben." "moved": "Alle Personen aus {} wurden nach {} verschoben."
}, },
"member_joined_help_voice_channel": "{} braucht Hilfe, bitte kümmere dich drum :D", "member_joined_help_voice_channel": "{} braucht Hilfe, bitte kümmere dich drum :D",
"member_left_message": "{} hat uns leider verlassen :(",
"pong": "Pong", "pong": "Pong",
"presence": { "presence": {
"changed": "Presence wurde geändert.", "changed": "Presence wurde geändert.",
@@ -349,9 +339,6 @@
"moderator": { "moderator": {
"purge_message": "Na gut..., ich lösche alle Nachrichten wenns sein muss." "purge_message": "Na gut..., ich lösche alle Nachrichten wenns sein muss."
}, },
"short_role_name": {
"checked_message": "Die Rollen Kürzel wurden überprüft"
},
"technician": { "technician": {
"api_key": { "api_key": {
"add": { "add": {
@@ -365,8 +352,7 @@
}, },
"log_message": "Hier sind deine Logdateien! :)", "log_message": "Hier sind deine Logdateien! :)",
"restart_message": "Bin gleich wieder da :D", "restart_message": "Bin gleich wieder da :D",
"shutdown_message": "Trauert nicht um mich, es war eine logische Entscheidung. Das Wohl von Vielen, es wiegt schwerer als das Wohl von Wenigen oder eines Einzelnen. Ich war es und ich werde es immer sein, euer Freund. Lebt lange und in Frieden :)", "shutdown_message": "Trauert nicht um mich, es war eine logische Entscheidung. Das Wohl von Vielen, es wiegt schwerer als das Wohl von Wenigen oder eines Einzelnen. Ich war es und ich werde es immer sein, euer Freund. Lebt lange und in Frieden :)"
"synced_message": "Der Sync wurde abgeschlossen."
} }
} }
} }

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" """
bot sh-edraft.de Discord bot bot Keksdose bot
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de Discord bot for the Keksdose discord Server
:copyright: (c) 2022 - 2023 sh-edraft.de :copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details. :license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_api"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.9" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports: # imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="9") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" """
bot sh-edraft.de Discord bot bot Keksdose bot
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de Discord bot for the Keksdose discord Server
:copyright: (c) 2022 - 2023 sh-edraft.de :copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details. :license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_api.abc"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.9" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports: # imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="9") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -3,8 +3,8 @@
"Name": "bot-api", "Name": "bot-api",
"Version": { "Version": {
"Major": "1", "Major": "1",
"Minor": "1", "Minor": "0",
"Micro": "9" "Micro": "7"
}, },
"Author": "", "Author": "",
"AuthorEmail": "", "AuthorEmail": "",

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" """
bot sh-edraft.de Discord bot bot Keksdose bot
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de Discord bot for the Keksdose discord Server
:copyright: (c) 2022 - 2023 sh-edraft.de :copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details. :license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_api.configuration"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.9" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports # imports
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="9") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" """
bot sh-edraft.de Discord bot bot Keksdose bot
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de Discord bot for the Keksdose discord Server
:copyright: (c) 2022 - 2023 sh-edraft.de :copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details. :license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_api.controller"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.9" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports: # imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="9") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" """
bot sh-edraft.de Discord bot bot Keksdose bot
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de Discord bot for the Keksdose discord Server
:copyright: (c) 2022 - 2023 sh-edraft.de :copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details. :license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_api.event"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.9" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports: # imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="9") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" """
bot sh-edraft.de Discord bot bot Keksdose bot
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de Discord bot for the Keksdose discord Server
:copyright: (c) 2022 - 2023 sh-edraft.de :copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details. :license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_api.exception"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.9" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports: # imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="9") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" """
bot sh-edraft.de Discord bot bot Keksdose bot
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de Discord bot for the Keksdose discord Server
:copyright: (c) 2022 - 2023 sh-edraft.de :copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details. :license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_api.filter"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.9" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports: # imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="9") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" """
bot sh-edraft.de Discord bot bot Keksdose bot
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de Discord bot for the Keksdose discord Server
:copyright: (c) 2022 - 2023 sh-edraft.de :copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details. :license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_api.filter.discord"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.9" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports: # imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="9") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" """
bot sh-edraft.de Discord bot bot Keksdose bot
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de Discord bot for the Keksdose discord Server
:copyright: (c) 2022 - 2023 sh-edraft.de :copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details. :license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_api.logging"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.9" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports: # imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="9") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" """
bot sh-edraft.de Discord bot bot Keksdose bot
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de Discord bot for the Keksdose discord Server
:copyright: (c) 2022 - 2023 sh-edraft.de :copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details. :license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_api.model"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.9" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports: # imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="9") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" """
bot sh-edraft.de Discord bot bot Keksdose bot
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de Discord bot for the Keksdose discord Server
:copyright: (c) 2022 - 2023 sh-edraft.de :copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details. :license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_api.model.discord"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.9" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports: # imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="9") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" """
bot sh-edraft.de Discord bot bot Keksdose bot
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de Discord bot for the Keksdose discord Server
:copyright: (c) 2022 - 2023 sh-edraft.de :copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details. :license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_api.route"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.9" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports: # imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="9") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" """
bot sh-edraft.de Discord bot bot Keksdose bot
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de Discord bot for the Keksdose discord Server
:copyright: (c) 2022 - 2023 sh-edraft.de :copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details. :license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_api.service"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.9" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports # imports
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="9") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -494,13 +494,8 @@ class AuthService(AuthServiceABC):
added_user = True added_user = True
db_user = self._auth_users.get_auth_user_by_email(user_dto.email) db_user = self._auth_users.get_auth_user_by_email(user_dto.email)
user_ids = db_user.users.select(lambda x: x.id) if db_user.users.count() == 0:
members.for_each(lambda x: self._auth_users.add_auth_user_user_rel(AuthUserUsersRelation(db_user, x)))
for user in self._users.get_users_by_discord_id(dc_id):
if user.id in user_ids:
continue
self._auth_users.add_auth_user_user_rel(AuthUserUsersRelation(db_user, user))
if db_user.confirmation_id is not None and not added_user: if db_user.confirmation_id is not None and not added_user:
raise ServiceException(ServiceErrorCode.Forbidden, "E-Mail not verified") raise ServiceException(ServiceErrorCode.Forbidden, "E-Mail not verified")

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" """
bot sh-edraft.de Discord bot bot Keksdose bot
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de Discord bot for the Keksdose discord Server
:copyright: (c) 2022 - 2023 sh-edraft.de :copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details. :license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_api.transformer"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.9" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports: # imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="9") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" """
bot sh-edraft.de Discord bot bot Keksdose bot
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de Discord bot for the Keksdose discord Server
:copyright: (c) 2022 - 2023 sh-edraft.de :copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details. :license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_core"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.9" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports # imports
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="9") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" """
bot sh-edraft.de Discord bot bot Keksdose bot
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de Discord bot for the Keksdose discord Server
:copyright: (c) 2022 - 2023 sh-edraft.de :copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details. :license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_core.abc"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.9" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports: # imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="9") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -1,6 +1,6 @@
from abc import ABC, abstractmethod from abc import ABC, abstractmethod
from datetime import datetime from datetime import datetime
from typing import Callable, Union from typing import Callable
import discord import discord
from cpl_query.extension import List from cpl_query.extension import List
@@ -67,7 +67,3 @@ class ClientUtilsABC(ABC):
self, discord_channel_id: int, discord_message_id: int, rule: AutoRoleRule, guild: discord.Guild self, discord_channel_id: int, discord_message_id: int, rule: AutoRoleRule, guild: discord.Guild
): ):
pass pass
@abstractmethod
async def check_default_role(self, member: Union[discord.User, discord.Member]):
pass

View File

@@ -3,8 +3,8 @@
"Name": "bot-core", "Name": "bot-core",
"Version": { "Version": {
"Major": "1", "Major": "1",
"Minor": "1", "Minor": "0",
"Micro": "9" "Micro": "7"
}, },
"Author": "Sven Heidemann", "Author": "Sven Heidemann",
"AuthorEmail": "sven.heidemann@sh-edraft.de", "AuthorEmail": "sven.heidemann@sh-edraft.de",

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" """
bot sh-edraft.de Discord bot bot Keksdose bot
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de Discord bot for the Keksdose discord Server
:copyright: (c) 2022 - 2023 sh-edraft.de :copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details. :license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_core.configuration"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.9" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports: # imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="9") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -5,22 +5,19 @@ class FeatureFlagsEnum(Enum):
# modules # modules
achievements_module = "AchievementsModule" achievements_module = "AchievementsModule"
api_module = "ApiModule" api_module = "ApiModule"
admin_module = "AdminModule"
auto_role_module = "AutoRoleModule" auto_role_module = "AutoRoleModule"
base_module = "BaseModule" base_module = "BaseModule"
boot_log_module = "BootLogModule" boot_log_module = "BootLogModule"
core_module = "CoreModule" core_module = "CoreModule"
core_extension_module = "CoreExtensionModule" core_extension_module = "CoreExtensionModule"
config_module = "ConfigModule"
data_module = "DataModule" data_module = "DataModule"
database_module = "DatabaseModule" database_module = "DatabaseModule"
level_module = "LevelModule" level_module = "LevelModule"
moderator_module = "ModeratorModule" moderator_module = "ModeratorModule"
permission_module = "PermissionModule" permission_module = "PermissionModule"
short_role_name_module = "ShortRoleNameModule" config_module = "ConfigModule"
# features # features
api_only = "ApiOnly" api_only = "ApiOnly"
presence = "Presence" presence = "Presence"
version_in_presence = "VersionInPresence" version_in_presence = "VersionInPresence"
game_server = "GameServer"
sync_xp = "SyncXp"
short_role_name = "ShortRoleName"

View File

@@ -8,7 +8,8 @@ class FeatureFlagsSettings(ConfigurationModelABC):
# modules # modules
FeatureFlagsEnum.achievements_module.value: False, # 14.06.2023 #268 FeatureFlagsEnum.achievements_module.value: False, # 14.06.2023 #268
FeatureFlagsEnum.api_module.value: False, # 13.10.2022 #70 FeatureFlagsEnum.api_module.value: False, # 13.10.2022 #70
FeatureFlagsEnum.auto_role_module.value: False, # 03.10.2022 #54 FeatureFlagsEnum.admin_module.value: False, # 02.10.2022 #48
FeatureFlagsEnum.auto_role_module.value: True, # 03.10.2022 #54
FeatureFlagsEnum.base_module.value: True, # 02.10.2022 #48 FeatureFlagsEnum.base_module.value: True, # 02.10.2022 #48
FeatureFlagsEnum.boot_log_module.value: True, # 02.10.2022 #48 FeatureFlagsEnum.boot_log_module.value: True, # 02.10.2022 #48
FeatureFlagsEnum.core_module.value: True, # 03.10.2022 #56 FeatureFlagsEnum.core_module.value: True, # 03.10.2022 #56
@@ -18,14 +19,10 @@ class FeatureFlagsSettings(ConfigurationModelABC):
FeatureFlagsEnum.moderator_module.value: False, # 02.10.2022 #48 FeatureFlagsEnum.moderator_module.value: False, # 02.10.2022 #48
FeatureFlagsEnum.permission_module.value: True, # 02.10.2022 #48 FeatureFlagsEnum.permission_module.value: True, # 02.10.2022 #48
FeatureFlagsEnum.config_module.value: True, # 19.07.2023 #127 FeatureFlagsEnum.config_module.value: True, # 19.07.2023 #127
FeatureFlagsEnum.short_role_name_module.value: True, # 28.09.2023 #378
# features # features
FeatureFlagsEnum.api_only.value: False, # 13.10.2022 #70 FeatureFlagsEnum.api_only.value: False, # 13.10.2022 #70
FeatureFlagsEnum.presence.value: True, # 03.10.2022 #56 FeatureFlagsEnum.presence.value: True, # 03.10.2022 #56
FeatureFlagsEnum.version_in_presence.value: False, # 21.03.2023 #253 FeatureFlagsEnum.version_in_presence.value: False, # 21.03.2023 #253
FeatureFlagsEnum.game_server.value: False, # 25.09.2023 #366
FeatureFlagsEnum.sync_xp.value: False, # 25.09.2023 #366
FeatureFlagsEnum.short_role_name.value: False, # 28.09.2023 #378
} }
def __init__(self, **kwargs: dict): def __init__(self, **kwargs: dict):
@@ -37,17 +34,6 @@ class FeatureFlagsSettings(ConfigurationModelABC):
for flag in [f.value for f in FeatureFlagsEnum]: for flag in [f.value for f in FeatureFlagsEnum]:
self._load_flag(kwargs, FeatureFlagsEnum(flag)) self._load_flag(kwargs, FeatureFlagsEnum(flag))
@classmethod
def get_flag_from_dict(cls, flags: dict, key: FeatureFlagsEnum) -> bool:
def get_flag():
if key.value not in cls._flags:
return False
return cls._flags[key.value]
if key.value not in flags:
return get_flag()
return flags[key.value]
def get_flag(self, key: FeatureFlagsEnum) -> bool: def get_flag(self, key: FeatureFlagsEnum) -> bool:
if key.value not in self._flags: if key.value not in self._flags:
return False return False

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" """
bot sh-edraft.de Discord bot bot Keksdose bot
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de Discord bot for the Keksdose discord Server
:copyright: (c) 2022 - 2023 sh-edraft.de :copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details. :license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_core.core_extension"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.9" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports: # imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="9") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -11,7 +11,6 @@ from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
from bot_core.events.core_on_ready_event import CoreOnReadyEvent from bot_core.events.core_on_ready_event import CoreOnReadyEvent
from bot_core.pipes.date_time_offset_pipe import DateTimeOffsetPipe from bot_core.pipes.date_time_offset_pipe import DateTimeOffsetPipe
from bot_core.service.client_utils_service import ClientUtilsService from bot_core.service.client_utils_service import ClientUtilsService
from bot_core.service.config_service import ConfigService
from bot_core.service.data_integrity_service import DataIntegrityService from bot_core.service.data_integrity_service import DataIntegrityService
from bot_core.service.message_service import MessageService from bot_core.service.message_service import MessageService
@@ -24,7 +23,6 @@ class CoreModule(ModuleABC):
pass pass
def configure_services(self, services: ServiceCollectionABC, env: ApplicationEnvironmentABC): def configure_services(self, services: ServiceCollectionABC, env: ApplicationEnvironmentABC):
services.add_transient(ConfigService)
services.add_transient(MessageServiceABC, MessageService) services.add_transient(MessageServiceABC, MessageService)
services.add_transient(ClientUtilsABC, ClientUtilsService) services.add_transient(ClientUtilsABC, ClientUtilsService)
services.add_transient(DataIntegrityService) services.add_transient(DataIntegrityService)

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" """
bot sh-edraft.de Discord bot bot Keksdose bot
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de Discord bot for the Keksdose discord Server
:copyright: (c) 2022 - 2023 sh-edraft.de :copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details. :license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_core.events"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.9" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports: # imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="9") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" """
bot sh-edraft.de Discord bot bot Keksdose bot
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de Discord bot for the Keksdose discord Server
:copyright: (c) 2022 - 2023 sh-edraft.de :copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details. :license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_core.exception"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.9" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports: # imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="9") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" """
bot sh-edraft.de Discord bot bot Keksdose bot
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de Discord bot for the Keksdose discord Server
:copyright: (c) 2022 - 2023 sh-edraft.de :copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details. :license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_core.helper"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.9" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports: # imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="9") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" """
bot sh-edraft.de Discord bot bot Keksdose bot
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de Discord bot for the Keksdose discord Server
:copyright: (c) 2022 - 2023 sh-edraft.de :copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details. :license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_core.logging"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.9" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports # imports
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="9") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" """
bot sh-edraft.de Discord bot bot Keksdose bot
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de Discord bot for the Keksdose discord Server
:copyright: (c) 2022 - 2023 sh-edraft.de :copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details. :license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_core.pipes"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.9" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports # imports
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="9") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" """
bot sh-edraft.de Discord bot bot Keksdose bot
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de Discord bot for the Keksdose discord Server
:copyright: (c) 2022 - 2023 sh-edraft.de :copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details. :license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_core.service"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.9" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports: # imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="9") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -1,5 +1,5 @@
from datetime import datetime from datetime import datetime
from typing import Callable, Union from typing import Callable
import discord import discord
from cpl_core.configuration import ConfigurationABC from cpl_core.configuration import ConfigurationABC
@@ -218,20 +218,3 @@ class ClientUtilsService(ClientUtilsABC):
f"Cannot add reaction {rule.emoji_name} to message: {discord_message_id}", f"Cannot add reaction {rule.emoji_name} to message: {discord_message_id}",
e, e,
) )
async def check_default_role(self, member: Union[discord.User, discord.Member]):
try:
server = self._servers.get_server_by_discord_id(member.guild.id)
settings: ServerConfig = self._config.get_configuration(f"ServerConfig_{server.discord_id}")
if settings.default_role_id is None:
return
default_role = member.guild.get_role(settings.default_role_id)
if default_role is None or default_role in member.roles:
return
await member.add_roles(default_role)
except Exception as e:
self._logger.error(__name__, f"Cannot check for default role for member {member.id}", e)

View File

@@ -1,50 +0,0 @@
from cpl_core.configuration import ConfigurationABC
from cpl_core.dependency_injection import ServiceProviderABC
from bot_core.configuration.feature_flags_settings import FeatureFlagsSettings
from bot_data.abc.server_config_repository_abc import ServerConfigRepositoryABC
from bot_data.abc.technician_config_repository_abc import TechnicianConfigRepositoryABC
from bot_data.model.server import Server
from bot_data.model.technician_config import TechnicianConfig
from bot_data.service.server_config_seeder import ServerConfigSeeder
from bot_data.service.technician_config_seeder import TechnicianConfigSeeder
from modules.permission.abc.permission_service_abc import PermissionServiceABC
class ConfigService:
def __init__(
self,
config: ConfigurationABC,
services: ServiceProviderABC,
technician_config_repo: TechnicianConfigRepositoryABC,
server_config_repo: ServerConfigRepositoryABC,
tech_seeder: TechnicianConfigSeeder,
server_seeder: ServerConfigSeeder,
):
self._config = config
self._services = services
self._technician_config_repo = technician_config_repo
self._server_config_repo = server_config_repo
self._tech_seeder = tech_seeder
self._server_seeder = server_seeder
async def reload_technician_config(self):
if not self._technician_config_repo.does_technician_config_exists():
await self._tech_seeder.seed()
technician_config = self._technician_config_repo.get_technician_config()
self._config.add_configuration(TechnicianConfig, technician_config)
self._config.add_configuration(FeatureFlagsSettings, FeatureFlagsSettings(**technician_config.feature_flags))
async def reload_server_config(self, server: Server):
if not self._server_config_repo.does_server_config_exists(server.id):
await self._server_seeder.seed()
server_config = self._server_config_repo.get_server_config_by_server(server.id)
self._config.add_configuration(
f"{type(server_config).__name__}_{server_config.server.discord_id}", server_config
)
permissions: PermissionServiceABC = self._services.get_service(PermissionServiceABC)
permissions.on_ready()

View File

@@ -6,7 +6,6 @@ from cpl_core.configuration import ConfigurationABC
from cpl_core.database.context import DatabaseContextABC from cpl_core.database.context import DatabaseContextABC
from cpl_discord.service import DiscordBotServiceABC from cpl_discord.service import DiscordBotServiceABC
from bot_core.abc.client_utils_abc import ClientUtilsABC
from bot_core.logging.database_logger import DatabaseLogger from bot_core.logging.database_logger import DatabaseLogger
from bot_core.pipes.date_time_offset_pipe import DateTimeOffsetPipe from bot_core.pipes.date_time_offset_pipe import DateTimeOffsetPipe
from bot_data.abc.client_repository_abc import ClientRepositoryABC from bot_data.abc.client_repository_abc import ClientRepositoryABC
@@ -24,6 +23,7 @@ from bot_data.model.server_config import ServerConfig
from bot_data.model.user import User from bot_data.model.user import User
from bot_data.model.user_joined_server import UserJoinedServer from bot_data.model.user_joined_server import UserJoinedServer
from bot_data.model.user_joined_voice_channel import UserJoinedVoiceChannel from bot_data.model.user_joined_voice_channel import UserJoinedVoiceChannel
from bot_data.service.seeder_service import SeederService
from bot_data.service.user_repository_service import ServerRepositoryABC from bot_data.service.user_repository_service import ServerRepositoryABC
from modules.achievements.achievement_service import AchievementService from modules.achievements.achievement_service import AchievementService
@@ -33,6 +33,7 @@ class DataIntegrityService:
self, self,
config: ConfigurationABC, config: ConfigurationABC,
logger: DatabaseLogger, logger: DatabaseLogger,
seeder: SeederService,
bot: DiscordBotServiceABC, bot: DiscordBotServiceABC,
db_context: DatabaseContextABC, db_context: DatabaseContextABC,
server_repo: ServerRepositoryABC, server_repo: ServerRepositoryABC,
@@ -43,12 +44,12 @@ class DataIntegrityService:
user_joins_vc: UserJoinedVoiceChannelRepositoryABC, user_joins_vc: UserJoinedVoiceChannelRepositoryABC,
user_joined_gs: UserJoinedGameServerRepositoryABC, user_joined_gs: UserJoinedGameServerRepositoryABC,
achievement_service: AchievementService, achievement_service: AchievementService,
client_utils: ClientUtilsABC,
dtp: DateTimeOffsetPipe, dtp: DateTimeOffsetPipe,
): ):
self._config = config self._config = config
self._logger = logger self._logger = logger
self._seeder = seeder
self._bot = bot self._bot = bot
self._db_context = db_context self._db_context = db_context
self._servers = server_repo self._servers = server_repo
@@ -59,7 +60,6 @@ class DataIntegrityService:
self._user_joins_vc = user_joins_vc self._user_joins_vc = user_joins_vc
self._user_joined_gs = user_joined_gs self._user_joined_gs = user_joined_gs
self._achievements = achievement_service self._achievements = achievement_service
self._client_utils = client_utils
self._dtp = dtp self._dtp = dtp
self._is_for_shutdown = False self._is_for_shutdown = False
@@ -291,7 +291,7 @@ class DataIntegrityService:
self._user_joins_vc.update_user_joined_voice_channel(join) self._user_joins_vc.update_user_joined_voice_channel(join)
if self._is_for_shutdown: if self._is_for_shutdown:
user.xp += round(join.time * settings.xp_per_ontime_hour) user.xp = round(join.time * settings.xp_per_ontime_hour)
self._users.update_user(user) self._users.update_user(user)
self._db_context.save_changes() self._db_context.save_changes()
@@ -356,14 +356,14 @@ class DataIntegrityService:
self._user_joined_gs.update_user_joined_game_server(join) self._user_joined_gs.update_user_joined_game_server(join)
if self._is_for_shutdown: if self._is_for_shutdown:
user.xp += round(join.time * settings.xp_per_ontime_hour) user.xp = round(join.time * settings.xp_per_ontime_hour)
self._users.update_user(user) self._users.update_user(user)
self._db_context.save_changes() self._db_context.save_changes()
except Exception as e: except Exception as e:
self._logger.error(__name__, f"Cannot get UserJoinedGameServer", e) self._logger.error(__name__, f"Cannot get UserJoinedGameServer", e)
async def _check_for_user_achievements(self): def _check_for_user_achievements(self):
self._logger.debug(__name__, f"Start checking UserGotAchievement table") self._logger.debug(__name__, f"Start checking UserGotAchievement table")
for guild in self._bot.guilds: for guild in self._bot.guilds:
@@ -380,18 +380,12 @@ class DataIntegrityService:
if user is None: if user is None:
self._logger.fatal(__name__, f"User not found in database: {member.id}") self._logger.fatal(__name__, f"User not found in database: {member.id}")
await self._achievements.validate_achievements_for_user(user) self._bot.loop.create_task(self._achievements.validate_achievements_for_user(user))
async def _check_default_role(self): def check_data_integrity(self, is_for_shutdown=False):
for guild in self._bot.guilds:
for member in guild.members:
await self._client_utils.check_default_role(member)
async def check_data_integrity(self, is_for_shutdown=False):
if is_for_shutdown != self._is_for_shutdown: if is_for_shutdown != self._is_for_shutdown:
self._is_for_shutdown = is_for_shutdown self._is_for_shutdown = is_for_shutdown
await self._check_default_role()
self._check_known_users() self._check_known_users()
self._check_servers() self._check_servers()
self._check_clients() self._check_clients()
@@ -399,4 +393,4 @@ class DataIntegrityService:
self._check_user_joins() self._check_user_joins()
self._check_user_joins_vc() self._check_user_joins_vc()
self._check_user_joined_gs() self._check_user_joined_gs()
await self._check_for_user_achievements() self._check_for_user_achievements()

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" """
bot sh-edraft.de Discord bot bot Keksdose bot
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de Discord bot for the Keksdose discord Server
:copyright: (c) 2022 - 2023 sh-edraft.de :copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details. :license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_data"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.9" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports # imports
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="9") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" """
bot sh-edraft.de Discord bot bot Keksdose bot
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de Discord bot for the Keksdose discord Server
:copyright: (c) 2022 - 2023 sh-edraft.de :copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details. :license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_data.abc"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.9" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports # imports
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="9") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -14,10 +14,6 @@ class AuthUserRepositoryABC(ABC):
def __init__(self): def __init__(self):
pass pass
@abstractmethod
def get_auth_user_relation_ids(self, auth_user: AuthUser) -> List[int]:
pass
@abstractmethod @abstractmethod
def get_all_auth_users(self) -> List[AuthUser]: def get_all_auth_users(self) -> List[AuthUser]:
pass pass

View File

@@ -23,7 +23,7 @@ class GameServerRepositoryABC(ABC):
pass pass
@abstractmethod @abstractmethod
def get_game_servers_by_api_key_id(self, id: int) -> List[GameServer]: def get_game_server_by_api_key_id(self, id: int) -> GameServer:
pass pass
@abstractmethod @abstractmethod

View File

@@ -1,20 +1,13 @@
import os
from abc import ABC, abstractmethod from abc import ABC, abstractmethod
from cpl_core.dependency_injection import ServiceProviderABC
from mysql.connector.cursor import MySQLCursorBuffered
from bot_data.db_context import DBContext
class MigrationABC(ABC): class MigrationABC(ABC):
name = None name = None
prio = 0 prio = 0
@abstractmethod @abstractmethod
@ServiceProviderABC.inject def __init__(self):
def __init__(self, db: DBContext): pass
self._cursor: MySQLCursorBuffered = db.cursor
@abstractmethod @abstractmethod
def upgrade(self): def upgrade(self):
@@ -23,10 +16,3 @@ class MigrationABC(ABC):
@abstractmethod @abstractmethod
def downgrade(self): def downgrade(self):
pass pass
def _exec(self, self_file: str, file: str):
path = f"{os.path.dirname(os.path.realpath(self_file))}/db_history_scripts"
sql = open(f"{path}/{file}").read()
for statement in sql.split("\n\n"):
self._cursor.execute(statement + ";")

View File

@@ -1,39 +0,0 @@
from abc import ABC, abstractmethod
from cpl_query.extension import List
from bot_data.model.short_role_name import ShortRoleName
class ShortRoleNameRepositoryABC(ABC):
@abstractmethod
def __init__(self):
pass
@abstractmethod
def get_short_role_names(self) -> List[ShortRoleName]:
pass
@abstractmethod
def get_short_role_name_by_id(self, id: int) -> ShortRoleName:
pass
@abstractmethod
def find_short_role_names_by_role_id(self, role_id: int) -> List[ShortRoleName]:
pass
@abstractmethod
def get_short_role_names_by_server_id(self, id: int) -> List[ShortRoleName]:
pass
@abstractmethod
def add_short_role_name(self, short_role_name: ShortRoleName):
pass
@abstractmethod
def update_short_role_name(self, short_role_name: ShortRoleName):
pass
@abstractmethod
def delete_short_role_name(self, short_role_name: ShortRoleName):
pass

View File

@@ -14,10 +14,6 @@ class UserGameIdentRepositoryABC(ABC):
def get_user_game_idents(self) -> List[UserGameIdent]: def get_user_game_idents(self) -> List[UserGameIdent]:
pass pass
@abstractmethod
def get_user_game_idents_by_game_server_id(self, id: int) -> List[UserGameIdent]:
pass
@abstractmethod @abstractmethod
def get_user_game_ident_by_id(self, id: int) -> UserGameIdent: def get_user_game_ident_by_id(self, id: int) -> UserGameIdent:
pass pass

View File

@@ -3,8 +3,8 @@
"Name": "bot-data", "Name": "bot-data",
"Version": { "Version": {
"Major": "1", "Major": "1",
"Minor": "1", "Minor": "0",
"Micro": "9" "Micro": "7"
}, },
"Author": "Sven Heidemann", "Author": "Sven Heidemann",
"AuthorEmail": "sven.heidemann@sh-edraft.de", "AuthorEmail": "sven.heidemann@sh-edraft.de",

View File

@@ -16,7 +16,6 @@ from bot_data.abc.known_user_repository_abc import KnownUserRepositoryABC
from bot_data.abc.level_repository_abc import LevelRepositoryABC from bot_data.abc.level_repository_abc import LevelRepositoryABC
from bot_data.abc.server_config_repository_abc import ServerConfigRepositoryABC from bot_data.abc.server_config_repository_abc import ServerConfigRepositoryABC
from bot_data.abc.server_repository_abc import ServerRepositoryABC from bot_data.abc.server_repository_abc import ServerRepositoryABC
from bot_data.abc.short_role_name_repository_abc import ShortRoleNameRepositoryABC
from bot_data.abc.technician_config_repository_abc import TechnicianConfigRepositoryABC from bot_data.abc.technician_config_repository_abc import TechnicianConfigRepositoryABC
from bot_data.abc.user_game_ident_repository_abc import UserGameIdentRepositoryABC from bot_data.abc.user_game_ident_repository_abc import UserGameIdentRepositoryABC
from bot_data.abc.user_joined_game_server_repository_abc import UserJoinedGameServerRepositoryABC from bot_data.abc.user_joined_game_server_repository_abc import UserJoinedGameServerRepositoryABC
@@ -42,7 +41,6 @@ from bot_data.service.seeder_service import SeederService
from bot_data.service.server_config_repository_service import ServerConfigRepositoryService from bot_data.service.server_config_repository_service import ServerConfigRepositoryService
from bot_data.service.server_config_seeder import ServerConfigSeeder from bot_data.service.server_config_seeder import ServerConfigSeeder
from bot_data.service.server_repository_service import ServerRepositoryService from bot_data.service.server_repository_service import ServerRepositoryService
from bot_data.service.short_role_name_repository_service import ShortRoleNameRepositoryService
from bot_data.service.technician_config_repository_service import TechnicianConfigRepositoryService from bot_data.service.technician_config_repository_service import TechnicianConfigRepositoryService
from bot_data.service.technician_config_seeder import TechnicianConfigSeeder from bot_data.service.technician_config_seeder import TechnicianConfigSeeder
from bot_data.service.user_game_ident_repository_service import UserGameIdentRepositoryService from bot_data.service.user_game_ident_repository_service import UserGameIdentRepositoryService
@@ -91,7 +89,6 @@ class DataModule(ModuleABC):
services.add_transient(AchievementRepositoryABC, AchievementRepositoryService) services.add_transient(AchievementRepositoryABC, AchievementRepositoryService)
services.add_transient(TechnicianConfigRepositoryABC, TechnicianConfigRepositoryService) services.add_transient(TechnicianConfigRepositoryABC, TechnicianConfigRepositoryService)
services.add_transient(ServerConfigRepositoryABC, ServerConfigRepositoryService) services.add_transient(ServerConfigRepositoryABC, ServerConfigRepositoryService)
services.add_transient(ShortRoleNameRepositoryABC, ShortRoleNameRepositoryService)
services.add_transient(SeederService) services.add_transient(SeederService)
services.add_transient(DataSeederABC, TechnicianConfigSeeder) services.add_transient(DataSeederABC, TechnicianConfigSeeder)

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" """
bot sh-edraft.de Discord bot bot Keksdose bot
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de Discord bot for the Keksdose discord Server
:copyright: (c) 2022 - 2023 sh-edraft.de :copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details. :license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_data.migration"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.9" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports # imports
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="9") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -1,29 +0,0 @@
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;")

View File

@@ -1,3 +1,5 @@
import os
from bot_core.logging.database_logger import DatabaseLogger from bot_core.logging.database_logger import DatabaseLogger
from bot_data.abc.migration_abc import MigrationABC from bot_data.abc.migration_abc import MigrationABC
from bot_data.db_context import DBContext from bot_data.db_context import DBContext
@@ -10,18 +12,26 @@ class ConfigMigration(MigrationABC):
MigrationABC.__init__(self) MigrationABC.__init__(self)
self._logger = logger self._logger = logger
self._db = db self._db = db
self._cursor = db.cursor
def _exec(self, file: str):
path = f"{os.path.dirname(os.path.realpath(__file__))}/db_history_scripts"
sql = open(f"{path}/{file}").read()
for statement in sql.split("\n\n"):
self._cursor.execute(statement + ";")
def upgrade(self): def upgrade(self):
self._logger.debug(__name__, "Running upgrade") self._logger.debug(__name__, "Running upgrade")
self._server_upgrade() self._server_upgrade()
self._technician_upgrade() self._technician_upgrade()
self._exec(__file__, "config/server.sql") self._exec("config/server.sql")
self._exec(__file__, "config/server_afk_channels.sql") self._exec("config/server_afk_channels.sql")
self._exec(__file__, "config/server_team_roles.sql") self._exec("config/server_team_roles.sql")
self._exec(__file__, "config/technician.sql") self._exec("config/technician.sql")
self._exec(__file__, "config/technician_ids.sql") self._exec("config/technician_ids.sql")
self._exec(__file__, "config/technician_ping_urls.sql") self._exec("config/technician_ping_urls.sql")
def _server_upgrade(self): def _server_upgrade(self):
self._cursor.execute( self._cursor.execute(
@@ -133,8 +143,6 @@ class ConfigMigration(MigrationABC):
def downgrade(self): def downgrade(self):
self._logger.debug(__name__, "Running downgrade") self._logger.debug(__name__, "Running downgrade")
self._server_downgrade()
self._technician_downgrade()
def _server_downgrade(self): def _server_downgrade(self):
self._cursor.execute("DROP TABLE `CFG_Server`;") self._cursor.execute("DROP TABLE `CFG_Server`;")

View File

@@ -1,3 +1,5 @@
import os
from bot_core.logging.database_logger import DatabaseLogger from bot_core.logging.database_logger import DatabaseLogger
from bot_data.abc.migration_abc import MigrationABC from bot_data.abc.migration_abc import MigrationABC
from bot_data.db_context import DBContext from bot_data.db_context import DBContext
@@ -13,26 +15,33 @@ class DBHistoryMigration(MigrationABC):
self._db = db self._db = db
self._cursor = db.cursor self._cursor = db.cursor
def _exec(self, file: str):
path = f"{os.path.dirname(os.path.realpath(__file__))}/db_history_scripts"
sql = open(f"{path}/{file}").read()
for statement in sql.split("\n\n"):
self._cursor.execute(statement + ";")
def upgrade(self): def upgrade(self):
self._logger.debug(__name__, "Running upgrade") self._logger.debug(__name__, "Running upgrade")
self._exec(__file__, "api_keys.sql") self._exec("api_keys.sql")
self._exec(__file__, "auth_users.sql") self._exec("auth_users.sql")
self._exec(__file__, "auth_user_users_relation.sql") self._exec("auth_user_users_relation.sql")
self._exec(__file__, "auto_role_rules.sql") self._exec("auto_role_rules.sql")
self._exec(__file__, "auto_roles.sql") self._exec("auto_roles.sql")
self._exec(__file__, "clients.sql") self._exec("clients.sql")
self._exec(__file__, "game_servers.sql") self._exec("game_servers.sql")
self._exec(__file__, "known_users.sql") self._exec("known_users.sql")
self._exec(__file__, "levels.sql") self._exec("levels.sql")
self._exec(__file__, "servers.sql") self._exec("servers.sql")
self._exec(__file__, "user_game_idents.sql") self._exec("user_game_idents.sql")
self._exec(__file__, "user_joined_game_servers.sql") self._exec("user_joined_game_servers.sql")
self._exec(__file__, "user_joined_servers.sql") self._exec("user_joined_servers.sql")
self._exec(__file__, "user_joined_voice_channel.sql") self._exec("user_joined_voice_channel.sql")
self._exec(__file__, "user_message_count_per_hour.sql") self._exec("user_message_count_per_hour.sql")
self._exec(__file__, "users.sql") self._exec("users.sql")
self._exec(__file__, "user_warnings.sql") self._exec("user_warnings.sql")
self._logger.debug(__name__, "Finished history upgrade") self._logger.debug(__name__, "Finished history upgrade")

View File

@@ -1,26 +1,23 @@
CREATE TABLE IF NOT EXISTS `CFG_ServerHistory` CREATE TABLE IF NOT EXISTS `CFG_ServerHistory`
( (
`Id` BIGINT(20) NOT NULL, `Id` BIGINT(20) NOT NULL,
`MessageDeleteTimer` BIGINT NOT NULL DEFAULT 6, `MessageDeleteTimer` BIGINT NOT NULL DEFAULT 6,
`NotificationChatId` BIGINT NOT NULL, `NotificationChatId` BIGINT NOT NULL,
`MaxVoiceStateHours` BIGINT NOT NULL DEFAULT 6, `MaxVoiceStateHours` BIGINT NOT NULL DEFAULT 6,
`XpPerMessage` BIGINT NOT NULL DEFAULT 1, `XpPerMessage` BIGINT NOT NULL DEFAULT 1,
`XpPerReaction` BIGINT NOT NULL DEFAULT 1, `XpPerReaction` BIGINT NOT NULL DEFAULT 1,
`MaxMessageXpPerHour` BIGINT NOT NULL DEFAULT 20, `MaxMessageXpPerHour` BIGINT NOT NULL DEFAULT 20,
`XpPerOntimeHour` BIGINT NOT NULL DEFAULT 10, `XpPerOntimeHour` BIGINT NOT NULL DEFAULT 10,
`XpPerEventParticipation` BIGINT NOT NULL DEFAULT 10, `XpPerEventParticipation` BIGINT NOT NULL DEFAULT 10,
`XpPerAchievement` BIGINT NOT NULL DEFAULT 10, `XpPerAchievement` BIGINT NOT NULL DEFAULT 10,
`AFKCommandChannelId` BIGINT NOT NULL, `AFKCommandChannelId` BIGINT NOT NULL,
`HelpVoiceChannelId` BIGINT NOT NULL, `HelpVoiceChannelId` BIGINT NOT NULL,
`TeamChannelId` BIGINT NOT NULL, `TeamChannelId` BIGINT NOT NULL,
`LoginMessageChannelId` BIGINT NOT NULL, `LoginMessageChannelId` BIGINT NOT NULL,
`DefaultRoleId` BIGINT NULL, `ServerId` BIGINT NOT NULL,
`ShortRoleNameSetOnlyHighest` BOOLEAN NOT NULL DEFAULT FALSE, `Deleted` BOOL DEFAULT FALSE,
`FeatureFlags` JSON NULL DEFAULT ('{}'), `DateFrom` DATETIME(6) NOT NULL,
`ServerId` BIGINT NOT NULL, `DateTo` DATETIME(6) NOT NULL
`Deleted` BOOL DEFAULT FALSE,
`DateFrom` DATETIME(6) NOT NULL,
`DateTo` DATETIME(6) NOT NULL
); );
DROP TRIGGER IF EXISTS `TR_CFG_ServerUpdate`; DROP TRIGGER IF EXISTS `TR_CFG_ServerUpdate`;
@@ -30,46 +27,44 @@ CREATE TRIGGER `TR_CFG_ServerUpdate`
ON `CFG_Server` ON `CFG_Server`
FOR EACH ROW FOR EACH ROW
BEGIN BEGIN
INSERT INTO `CFG_ServerHistory` (`Id`, INSERT INTO `CFG_ServerHistory` (
`MessageDeleteTimer`, `Id`,
`NotificationChatId`, `MessageDeleteTimer`,
`MaxVoiceStateHours`, `NotificationChatId`,
`XpPerMessage`, `MaxVoiceStateHours`,
`XpPerReaction`, `XpPerMessage`,
`MaxMessageXpPerHour`, `XpPerReaction`,
`XpPerOntimeHour`, `MaxMessageXpPerHour`,
`XpPerEventParticipation`, `XpPerOntimeHour`,
`XpPerAchievement`, `XpPerEventParticipation`,
`AFKCommandChannelId`, `XpPerAchievement`,
`HelpVoiceChannelId`, `AFKCommandChannelId`,
`TeamChannelId`, `HelpVoiceChannelId`,
`LoginMessageChannelId`, `TeamChannelId`,
`DefaultRoleId`, `LoginMessageChannelId`,
`ShortRoleNameSetOnlyHighest`, `ServerId`,
`FeatureFlags`, `DateFrom`,
`ServerId`, `DateTo`
`DateFrom`, )
`DateTo`) VALUES (
VALUES (OLD.Id, OLD.Id,
OLD.MessageDeleteTimer, OLD.MessageDeleteTimer,
OLD.NotificationChatId, OLD.NotificationChatId,
OLD.MaxVoiceStateHours, OLD.MaxVoiceStateHours,
OLD.XpPerMessage, OLD.XpPerMessage,
OLD.XpPerReaction, OLD.XpPerReaction,
OLD.MaxMessageXpPerHour, OLD.MaxMessageXpPerHour,
OLD.XpPerOntimeHour, OLD.XpPerOntimeHour,
OLD.XpPerEventParticipation, OLD.XpPerEventParticipation,
OLD.XpPerAchievement, OLD.XpPerAchievement,
OLD.AFKCommandChannelId, OLD.AFKCommandChannelId,
OLD.HelpVoiceChannelId, OLD.HelpVoiceChannelId,
OLD.TeamChannelId, OLD.TeamChannelId,
OLD.LoginMessageChannelId, OLD.LoginMessageChannelId,
OLD.DefaultRoleId, OLD.ServerId,
OLD.ShortRoleNameSetOnlyHighest, OLD.LastModifiedAt,
OLD.FeatureFlags, CURRENT_TIMESTAMP(6)
OLD.ServerId, );
OLD.LastModifiedAt,
CURRENT_TIMESTAMP(6));
END; END;
DROP TRIGGER IF EXISTS `TR_CFG_ServerDelete`; DROP TRIGGER IF EXISTS `TR_CFG_ServerDelete`;
@@ -79,46 +74,44 @@ CREATE TRIGGER `TR_CFG_ServerDelete`
ON `CFG_Server` ON `CFG_Server`
FOR EACH ROW FOR EACH ROW
BEGIN BEGIN
INSERT INTO `CFG_ServerHistory` (`Id`, INSERT INTO `CFG_ServerHistory` (
`MessageDeleteTimer`, `Id`,
`NotificationChatId`, `MessageDeleteTimer`,
`MaxVoiceStateHours`, `NotificationChatId`,
`XpPerMessage`, `MaxVoiceStateHours`,
`XpPerReaction`, `XpPerMessage`,
`MaxMessageXpPerHour`, `XpPerReaction`,
`XpPerOntimeHour`, `MaxMessageXpPerHour`,
`XpPerEventParticipation`, `XpPerOntimeHour`,
`XpPerAchievement`, `XpPerEventParticipation`,
`AFKCommandChannelId`, `XpPerAchievement`,
`HelpVoiceChannelId`, `AFKCommandChannelId`,
`TeamChannelId`, `HelpVoiceChannelId`,
`LoginMessageChannelId`, `TeamChannelId`,
`DefaultRoleId`, `LoginMessageChannelId`,
`ShortRoleNameSetOnlyHighest`, `ServerId`,
`ServerId`, `Deleted`,
`FeatureFlags`, `DateFrom`,
`Deleted`, `DateTo`
`DateFrom`, )
`DateTo`) VALUES (
VALUES (OLD.Id, OLD.Id,
OLD.MessageDeleteTimer, OLD.MessageDeleteTimer,
OLD.NotificationChatId, OLD.NotificationChatId,
OLD.MaxVoiceStateHours, OLD.MaxVoiceStateHours,
OLD.XpPerMessage, OLD.XpPerMessage,
OLD.XpPerReaction, OLD.XpPerReaction,
OLD.MaxMessageXpPerHour, OLD.MaxMessageXpPerHour,
OLD.XpPerOntimeHour, OLD.XpPerOntimeHour,
OLD.XpPerEventParticipation, OLD.XpPerEventParticipation,
OLD.XpPerAchievement, OLD.XpPerAchievement,
OLD.AFKCommandChannelId, OLD.AFKCommandChannelId,
OLD.HelpVoiceChannelId, OLD.HelpVoiceChannelId,
OLD.TeamChannelId, OLD.TeamChannelId,
OLD.LoginMessageChannelId, OLD.LoginMessageChannelId,
OLD.DefaultRoleId, OLD.ServerId,
OLD.ShortRoleNameSetOnlyHighest, TRUE,
OLD.FeatureFlags, OLD.LastModifiedAt,
OLD.ServerId, CURRENT_TIMESTAMP(6)
TRUE, );
OLD.LastModifiedAt,
CURRENT_TIMESTAMP(6));
END; END;

View File

@@ -1,14 +1,13 @@
CREATE TABLE IF NOT EXISTS `CFG_TechnicianHistory` CREATE TABLE IF NOT EXISTS `CFG_TechnicianHistory`
( (
`Id` BIGINT(20) NOT NULL, `Id` BIGINT(20) NOT NULL,
`HelpCommandReferenceUrl` VARCHAR(255) NOT NULL, `HelpCommandReferenceUrl` VARCHAR(255) NOT NULL,
`WaitForRestart` BIGINT NOT NULL DEFAULT 8, `WaitForRestart` BIGINT NOT NULL DEFAULT 8,
`WaitForShutdown` BIGINT NOT NULL DEFAULT 8, `WaitForShutdown` BIGINT NOT NULL DEFAULT 8,
`CacheMaxMessages` BIGINT NOT NULL DEFAULT 1000000, `CacheMaxMessages` BIGINT NOT NULL DEFAULT 1000000,
`FeatureFlags` JSON NULL DEFAULT ('{}'), `Deleted` BOOL DEFAULT FALSE,
`Deleted` BOOL DEFAULT FALSE, `DateFrom` DATETIME(6) NOT NULL,
`DateFrom` DATETIME(6) NOT NULL, `DateTo` DATETIME(6) NOT NULL
`DateTo` DATETIME(6) NOT NULL
); );
DROP TRIGGER IF EXISTS `TR_CFG_TechnicianUpdate`; DROP TRIGGER IF EXISTS `TR_CFG_TechnicianUpdate`;
@@ -18,22 +17,24 @@ CREATE TRIGGER `TR_CFG_TechnicianUpdate`
ON `CFG_Technician` ON `CFG_Technician`
FOR EACH ROW FOR EACH ROW
BEGIN BEGIN
INSERT INTO `CFG_TechnicianHistory` (`Id`, INSERT INTO `CFG_TechnicianHistory` (
`HelpCommandReferenceUrl`, `Id`,
`WaitForRestart`, `HelpCommandReferenceUrl`,
`WaitForShutdown`, `WaitForRestart`,
`CacheMaxMessages`, `WaitForShutdown`,
`FeatureFlags`, `CacheMaxMessages`,
`DateFrom`, `DateFrom`,
`DateTo`) `DateTo`
VALUES (OLD.Id, )
OLD.HelpCommandReferenceUrl, VALUES (
OLD.WaitForRestart, OLD.Id,
OLD.WaitForShutdown, OLD.HelpCommandReferenceUrl,
OLD.CacheMaxMessages, OLD.WaitForRestart,
OLD.FeatureFlags, OLD.WaitForShutdown,
OLD.LastModifiedAt, OLD.CacheMaxMessages,
CURRENT_TIMESTAMP(6)); OLD.LastModifiedAt,
CURRENT_TIMESTAMP(6)
);
END; END;
DROP TRIGGER IF EXISTS `TR_CFG_TechnicianDelete`; DROP TRIGGER IF EXISTS `TR_CFG_TechnicianDelete`;
@@ -43,22 +44,24 @@ CREATE TRIGGER `TR_CFG_TechnicianDelete`
ON `CFG_Technician` ON `CFG_Technician`
FOR EACH ROW FOR EACH ROW
BEGIN BEGIN
INSERT INTO `CFG_TechnicianHistory` (`Id`, INSERT INTO `CFG_TechnicianHistory` (
`HelpCommandReferenceUrl`, `Id`,
`WaitForRestart`, `HelpCommandReferenceUrl`,
`WaitForShutdown`, `WaitForRestart`,
`CacheMaxMessages`, `WaitForShutdown`,
`FeatureFlags`, `CacheMaxMessages`,
`Deleted`, `Deleted`,
`DateFrom`, `DateFrom`,
`DateTo`) `DateTo`
VALUES (OLD.Id, )
OLD.HelpCommandReferenceUrl, VALUES (
OLD.WaitForRestart, OLD.Id,
OLD.WaitForShutdown, OLD.HelpCommandReferenceUrl,
OLD.CacheMaxMessages, OLD.WaitForRestart,
OLD.FeatureFlags, OLD.WaitForShutdown,
TRUE, OLD.CacheMaxMessages,
OLD.LastModifiedAt, TRUE,
CURRENT_TIMESTAMP(6)); OLD.LastModifiedAt,
CURRENT_TIMESTAMP(6)
);
END; END;

View File

@@ -1,38 +0,0 @@
CREATE TABLE IF NOT EXISTS `ShortRoleNamesHistory`
(
`Id` BIGINT(20) NOT NULL,
`ShortName` VARCHAR(64) DEFAULT NULL,
`DiscordRoleId` BIGINT(20) NOT NULL,
`Position` ENUM ('Before', 'After') 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_ShortRoleNamesUpdate`;
CREATE TRIGGER `TR_ShortRoleNamesUpdate`
AFTER UPDATE
ON `ShortRoleNames`
FOR EACH ROW
BEGIN
INSERT INTO `ShortRoleNamesHistory` (`Id`, `ShortName`, `DiscordRoleId`, `Position`, `ServerId`, `DateFrom`,
`DateTo`)
VALUES (OLD.Id, OLD.ShortName, OLD.DiscordRoleId, OLD.Position, OLD.ServerId, OLD.LastModifiedAt,
CURRENT_TIMESTAMP(6));
END;
DROP TRIGGER IF EXISTS `TR_ShortRoleNamesDelete`;
CREATE TRIGGER `TR_ShortRoleNamesDelete`
AFTER DELETE
ON `ShortRoleNames`
FOR EACH ROW
BEGIN
INSERT INTO `ShortRoleNamesHistory` (`Id`, `ShortName`, `DiscordRoleId`, `Position`, `ServerId`, `Deleted`,
`DateFrom`,
`DateTo`)
VALUES (OLD.Id, OLD.ShortName, OLD.DiscordRoleId, OLD.Position, OLD.ServerId, TRUE, OLD.LastModifiedAt,
CURRENT_TIMESTAMP(6));
END;

View File

@@ -1,34 +0,0 @@
from bot_core.logging.database_logger import DatabaseLogger
from bot_data.abc.migration_abc import MigrationABC
from bot_data.db_context import DBContext
class DefaultRoleMigration(MigrationABC):
name = "1.1.3_DefaultRoleMigration"
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 CFG_Server
ADD DefaultRoleId BIGINT NULL AFTER LoginMessageChannelId;
"""
)
)
def downgrade(self):
self._cursor.execute(
str(
f"""
ALTER TABLE CFG_Server DROP COLUMN DefaultRoleId;
"""
)
)

View File

@@ -1,51 +0,0 @@
from bot_core.logging.database_logger import DatabaseLogger
from bot_data.abc.migration_abc import MigrationABC
from bot_data.db_context import DBContext
class FixUpdatesMigration(MigrationABC):
name = "1.1.7_FixUpdatesMigration"
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 CFG_ServerHistory
ADD DefaultRoleId BIGINT NULL AFTER LoginMessageChannelId;
"""
)
)
self._cursor.execute(
str(
"""ALTER TABLE CFG_TechnicianHistory ADD FeatureFlags JSON NULL DEFAULT ('{}') AFTER CacheMaxMessages;"""
)
)
self._cursor.execute(
str(
"""ALTER TABLE CFG_ServerHistory ADD FeatureFlags JSON NULL DEFAULT ('{}') AFTER LoginMessageChannelId;"""
)
)
self._exec(__file__, "config/server.sql")
self._exec(__file__, "config/technician.sql")
def downgrade(self):
self._cursor.execute(
str(
f"""
ALTER TABLE CFG_ServerHistory DROP COLUMN DefaultRoleId;
"""
)
)
self._cursor.execute("ALTER TABLE CFG_TechnicianHistory DROP COLUMN FeatureFlags;")
self._cursor.execute("ALTER TABLE CFG_ServerHistory DROP COLUMN FeatureFlags;")

View File

@@ -1,40 +0,0 @@
from bot_core.logging.database_logger import DatabaseLogger
from bot_data.abc.migration_abc import MigrationABC
from bot_data.db_context import DBContext
class ShortRoleNameMigration(MigrationABC):
name = "1.1.7_ShortRoleNameMigration"
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 `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`)
);
"""
)
)
self._exec(__file__, "short_rule_names.sql")
def downgrade(self):
self._cursor.execute("DROP TABLE `ShortRoleNames`;")
self._cursor.execute("DROP TABLE `ShortRoleNamesHistory`;")

View File

@@ -1,51 +0,0 @@
from bot_core.logging.database_logger import DatabaseLogger
from bot_data.abc.migration_abc import MigrationABC
from bot_data.db_context import DBContext
class ShortRoleNameOnlyHighestMigration(MigrationABC):
name = "1.1.9_ShortRoleNameOnlyHighestMigration"
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 CFG_Server
ADD ShortRoleNameSetOnlyHighest BOOLEAN NOT NULL DEFAULT FALSE AFTER DefaultRoleId;
"""
)
)
self._cursor.execute(
str(
f"""
ALTER TABLE CFG_ServerHistory
ADD ShortRoleNameSetOnlyHighest BOOLEAN NOT NULL DEFAULT FALSE AFTER DefaultRoleId;
"""
)
)
self._exec(__file__, "config/server.sql")
def downgrade(self):
self._cursor.execute(
str(
f"""
ALTER TABLE CFG_Server DROP COLUMN ShortRoleNameSetOnlyHighest;
"""
)
)
self._cursor.execute(
str(
f"""
ALTER TABLE CFG_ServerHistory DROP COLUMN ShortRoleNameSetOnlyHighest;
"""
)
)

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" """
bot sh-edraft.de Discord bot bot Keksdose bot
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de Discord bot for the Keksdose discord Server
:copyright: (c) 2022 - 2023 sh-edraft.de :copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details. :license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_data.model"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.9" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports # imports
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="9") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -108,15 +108,6 @@ class Achievement(TableABC):
""" """
) )
@staticmethod
def get_select_by_server_id_string(id: int) -> str:
return str(
f"""
SELECT * FROM `Achievements`
WHERE `ServerId` = {id};
"""
)
@property @property
def insert_string(self) -> str: def insert_string(self) -> str:
return str( return str(

View File

@@ -1,13 +1,9 @@
import json
from datetime import datetime from datetime import datetime
from typing import Optional
from cpl_core.configuration import ConfigurationModelABC from cpl_core.configuration import ConfigurationModelABC
from cpl_core.database import TableABC from cpl_core.database import TableABC
from cpl_query.extension import List from cpl_query.extension import List
from discord import Guild
from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
from bot_data.model.server import Server from bot_data.model.server import Server
from bot_data.model.server_team_role_ids_config import ServerTeamRoleIdsConfig from bot_data.model.server_team_role_ids_config import ServerTeamRoleIdsConfig
@@ -28,9 +24,6 @@ class ServerConfig(TableABC, ConfigurationModelABC):
help_voice_channel_id: int, help_voice_channel_id: int,
team_channel_id: int, team_channel_id: int,
login_message_channel_id: int, login_message_channel_id: int,
default_role_id: Optional[int],
short_role_name_only_set_highest_role: bool,
feature_flags: dict[FeatureFlagsEnum],
server: Server, server: Server,
afk_channel_ids: List[int], afk_channel_ids: List[int],
team_role_ids: List[ServerTeamRoleIdsConfig], team_role_ids: List[ServerTeamRoleIdsConfig],
@@ -52,10 +45,6 @@ class ServerConfig(TableABC, ConfigurationModelABC):
self._help_voice_channel_id = help_voice_channel_id self._help_voice_channel_id = help_voice_channel_id
self._team_channel_id = team_channel_id self._team_channel_id = team_channel_id
self._login_message_channel_id = login_message_channel_id self._login_message_channel_id = login_message_channel_id
self._default_role_id = default_role_id
self._short_role_name_only_set_highest_role = short_role_name_only_set_highest_role
self._feature_flags = feature_flags
self._server = server self._server = server
self._afk_channel_ids = afk_channel_ids self._afk_channel_ids = afk_channel_ids
self._team_role_ids = team_role_ids self._team_role_ids = team_role_ids
@@ -64,30 +53,6 @@ class ServerConfig(TableABC, ConfigurationModelABC):
self._created_at = created_at if created_at is not None else self._created_at self._created_at = created_at if created_at is not None else self._created_at
self._modified_at = modified_at if modified_at is not None else self._modified_at self._modified_at = modified_at if modified_at is not None else self._modified_at
@staticmethod
def new(guild: Guild, server: Server) -> "ServerConfig":
return ServerConfig(
6,
guild.system_channel.id,
6,
1,
1,
20,
10,
10,
10,
guild.system_channel.id,
guild.system_channel.id,
guild.system_channel.id,
guild.system_channel.id,
None,
False,
{},
server,
List(int),
List(int),
)
@property @property
def id(self) -> int: def id(self) -> int:
return self._id return self._id
@@ -196,30 +161,6 @@ class ServerConfig(TableABC, ConfigurationModelABC):
def login_message_channel_id(self, value: int): def login_message_channel_id(self, value: int):
self._login_message_channel_id = value self._login_message_channel_id = value
@property
def default_role_id(self) -> int:
return self._default_role_id
@default_role_id.setter
def default_role_id(self, value: int):
self._default_role_id = value
@property
def short_role_name_only_set_highest_role(self) -> bool:
return self._short_role_name_only_set_highest_role
@short_role_name_only_set_highest_role.setter
def short_role_name_only_set_highest_role(self, value: bool):
self._short_role_name_only_set_highest_role = value
@property
def feature_flags(self) -> dict[FeatureFlagsEnum]:
return self._feature_flags
@feature_flags.setter
def feature_flags(self, value: dict[FeatureFlagsEnum]):
self._feature_flags = value
@property @property
def afk_channel_ids(self) -> List[int]: def afk_channel_ids(self) -> List[int]:
return self._afk_channel_ids return self._afk_channel_ids
@@ -284,9 +225,6 @@ class ServerConfig(TableABC, ConfigurationModelABC):
`HelpVoiceChannelId`, `HelpVoiceChannelId`,
`TeamChannelId`, `TeamChannelId`,
`LoginMessageChannelId`, `LoginMessageChannelId`,
`DefaultRoleId`,
`ShortRoleNameSetOnlyHighest`,
`FeatureFlags`,
`ServerId` `ServerId`
) VALUES ( ) VALUES (
{self._message_delete_timer}, {self._message_delete_timer},
@@ -302,9 +240,6 @@ class ServerConfig(TableABC, ConfigurationModelABC):
{self._help_voice_channel_id}, {self._help_voice_channel_id},
{self._team_channel_id}, {self._team_channel_id},
{self._login_message_channel_id}, {self._login_message_channel_id},
{"NULL" if self._default_role_id is None else self._default_role_id},
{self._short_role_name_only_set_highest_role},
'{json.dumps(self._feature_flags)}',
{self._server.id} {self._server.id}
); );
""" """
@@ -328,9 +263,6 @@ class ServerConfig(TableABC, ConfigurationModelABC):
`HelpVoiceChannelId` = {self._help_voice_channel_id}, `HelpVoiceChannelId` = {self._help_voice_channel_id},
`TeamChannelId` = {self._team_channel_id}, `TeamChannelId` = {self._team_channel_id},
`LoginMessageChannelId` = {self._login_message_channel_id}, `LoginMessageChannelId` = {self._login_message_channel_id},
`DefaultRoleId` = {"NULL" if self._default_role_id is None else self._default_role_id},
`ShortRoleNameSetOnlyHighest` = {self._short_role_name_only_set_highest_role},
`FeatureFlags` = '{json.dumps(self._feature_flags)}',
`ServerId` = {self._server.id} `ServerId` = {self._server.id}
WHERE `Id` = {self._id}; WHERE `Id` = {self._id};
""" """

View File

@@ -17,9 +17,6 @@ class ServerConfigHistory(HistoryTableABC):
help_voice_channel_id: int, help_voice_channel_id: int,
team_channel_id: int, team_channel_id: int,
login_message_channel_id: int, login_message_channel_id: int,
default_role_id: int,
short_role_name_only_set_highest_role: bool,
feature_flags: dict[str],
server_id: int, server_id: int,
deleted: bool, deleted: bool,
date_from: str, date_from: str,
@@ -42,10 +39,6 @@ class ServerConfigHistory(HistoryTableABC):
self._help_voice_channel_id = help_voice_channel_id self._help_voice_channel_id = help_voice_channel_id
self._team_channel_id = team_channel_id self._team_channel_id = team_channel_id
self._login_message_channel_id = login_message_channel_id self._login_message_channel_id = login_message_channel_id
self._default_role_id = default_role_id
self._short_role_name_only_set_highest_role = short_role_name_only_set_highest_role
self._feature_flags = feature_flags
self._server_id = server_id self._server_id = server_id
self._deleted = deleted self._deleted = deleted
@@ -104,18 +97,6 @@ class ServerConfigHistory(HistoryTableABC):
def login_message_channel_id(self) -> int: def login_message_channel_id(self) -> int:
return self._login_message_channel_id return self._login_message_channel_id
@property
def default_role_id(self) -> int:
return self._default_role_id
@property
def short_role_name_only_set_highest_role(self) -> bool:
return self._short_role_name_only_set_highest_role
@property
def feature_flags(self) -> dict[str]:
return self._feature_flags
@property @property
def server_id(self) -> int: def server_id(self) -> int:
return self._server_id return self._server_id

View File

@@ -1,140 +0,0 @@
from datetime import datetime
from cpl_core.database import TableABC
from cpl_core.dependency_injection import ServiceProviderABC
from cpl_discord.service import DiscordBotServiceABC
from bot_data.model.server import Server
from bot_data.model.short_role_name_position_enum import ShortRoleNamePositionEnum
class ShortRoleName(TableABC):
def __init__(
self,
short_name: str,
discord_role_id: int,
position: ShortRoleNamePositionEnum,
server: Server,
created_at: datetime = None,
modified_at: datetime = None,
id=0,
):
self._id = id
self._short_name = short_name
self._discord_role_id = discord_role_id
self._position = position
self._server = server
TableABC.__init__(self)
self._created_at = created_at if created_at is not None else self._created_at
self._modified_at = modified_at if modified_at is not None else self._modified_at
@property
def id(self) -> int:
return self._id
@property
def short_name(self) -> str:
return self._short_name
@short_name.setter
def short_name(self, value: str):
self._short_name = value
@property
def role_id(self) -> int:
return self._discord_role_id
@role_id.setter
def role_id(self, value: int):
self._discord_role_id = value
@property
@ServiceProviderABC.inject
def role_name(self, bot: DiscordBotServiceABC) -> str:
guild = bot.get_guild(self._server.discord_id)
return guild.get_role(self.role_id).name
@property
def position(self) -> ShortRoleNamePositionEnum:
return self._position
@position.setter
def position(self, value: ShortRoleNamePositionEnum):
self._position = value
@property
def server(self) -> Server:
return self._server
@staticmethod
def get_select_all_string() -> str:
return str(
f"""
SELECT * FROM `ShortRoleNames`;
"""
)
@staticmethod
def get_select_by_id_string(id: int) -> str:
return str(
f"""
SELECT * FROM `ShortRoleNames`
WHERE `Id` = {id};
"""
)
@staticmethod
def get_select_by_role_id_string(id: int) -> str:
return str(
f"""
SELECT * FROM `ShortRoleNames`
WHERE `DiscordRoleId` = {id};
"""
)
@staticmethod
def get_select_by_server_id_string(id: int) -> str:
return str(
f"""
SELECT * FROM `ShortRoleNames`
WHERE `ServerId` = {id};
"""
)
@property
def insert_string(self) -> str:
return str(
f"""
INSERT INTO `ShortRoleNames` (
`ShortName`, `DiscordRoleId`, `Position`, `ServerId`
) VALUES (
'{self._short_name}',
{self._discord_role_id},
'{self._position}',
{self._server.id}
);
"""
)
@property
def udpate_string(self) -> str:
return str(
f"""
UPDATE `ShortRoleNames`
SET `ShortName` = '{self._short_name}',
`DiscordRoleId` = {self._discord_role_id},
`Position` = '{self._position}',
`ServerId` = {self._server.id}
WHERE `Id` = {self._id};
"""
)
@property
def delete_string(self) -> str:
return str(
f"""
DELETE FROM `ShortRoleNames`
WHERE `Id` = {self._id};
"""
)

View File

@@ -1,56 +0,0 @@
from cpl_core.dependency_injection import ServiceProviderABC
from cpl_discord.service import DiscordBotServiceABC
from bot_data.abc.history_table_abc import HistoryTableABC
class ShortRoleNameHistory(HistoryTableABC):
def __init__(
self,
name: str,
discord_role_id: int,
server: int,
deleted: bool,
date_from: str,
date_to: str,
id=0,
):
HistoryTableABC.__init__(self)
self._id = id
self._name = name
self._discord_role_id = discord_role_id
self._server = server
self._deleted = deleted
self._date_from = date_from
self._date_to = date_to
@property
def id(self) -> int:
return self._id
@property
def name(self) -> str:
return self._name
@name.setter
def name(self, value: str):
self._name = value
@property
def role_id(self) -> int:
return self._discord_role_id
@role_id.setter
def role_id(self, value: int):
self._discord_role_id = value
@property
@ServiceProviderABC.inject
def role_name(self, bot: DiscordBotServiceABC) -> str:
guild = bot.get_guild(self._server.discord_id)
return guild.get_role(self.role_id).name
@property
def server(self) -> int:
return self._server

View File

@@ -1,6 +0,0 @@
from enum import Enum
class ShortRoleNamePositionEnum(Enum):
before = "before"
after = "after"

View File

@@ -1,12 +1,9 @@
import json
from datetime import datetime from datetime import datetime
from cpl_core.configuration import ConfigurationModelABC from cpl_core.configuration import ConfigurationModelABC
from cpl_core.database import TableABC from cpl_core.database import TableABC
from cpl_query.extension import List from cpl_query.extension import List
from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
class TechnicianConfig(TableABC, ConfigurationModelABC): class TechnicianConfig(TableABC, ConfigurationModelABC):
def __init__( def __init__(
@@ -15,7 +12,6 @@ class TechnicianConfig(TableABC, ConfigurationModelABC):
wait_for_restart: int, wait_for_restart: int,
wait_for_shutdown: int, wait_for_shutdown: int,
cache_max_messages: int, cache_max_messages: int,
feature_flags: dict[FeatureFlagsEnum],
technician_ids: List[int], technician_ids: List[int],
ping_urls: List[str], ping_urls: List[str],
created_at: datetime = None, created_at: datetime = None,
@@ -27,7 +23,6 @@ class TechnicianConfig(TableABC, ConfigurationModelABC):
self._wait_for_restart = wait_for_restart self._wait_for_restart = wait_for_restart
self._wait_for_shutdown = wait_for_shutdown self._wait_for_shutdown = wait_for_shutdown
self._cache_max_messages = cache_max_messages self._cache_max_messages = cache_max_messages
self._feature_flags = feature_flags
self._technician_ids = technician_ids self._technician_ids = technician_ids
self._ping_urls = ping_urls self._ping_urls = ping_urls
@@ -71,14 +66,6 @@ class TechnicianConfig(TableABC, ConfigurationModelABC):
def cache_max_messages(self, value: int): def cache_max_messages(self, value: int):
self._cache_max_messages = value self._cache_max_messages = value
@property
def feature_flags(self) -> dict[FeatureFlagsEnum]:
return self._feature_flags
@feature_flags.setter
def feature_flags(self, value: dict[FeatureFlagsEnum]):
self._feature_flags = value
@property @property
def technician_ids(self) -> List[int]: def technician_ids(self) -> List[int]:
return self._technician_ids return self._technician_ids
@@ -117,13 +104,12 @@ class TechnicianConfig(TableABC, ConfigurationModelABC):
return str( return str(
f""" f"""
INSERT INTO `CFG_Technician` ( INSERT INTO `CFG_Technician` (
`HelpCommandReferenceUrl`, `WaitForRestart`, `WaitForShutdown`, `CacheMaxMessages`, `FeatureFlags` `HelpCommandReferenceUrl`, `WaitForRestart`, `WaitForShutdown`, `CacheMaxMessages`
) VALUES ( ) VALUES (
'{self._help_command_reference_url}', '{self._help_command_reference_url}',
{self._wait_for_restart}, {self._wait_for_restart},
{self._wait_for_shutdown}, {self._wait_for_shutdown},
{self._cache_max_messages}, {self._cache_max_messages}
'{json.dumps(self._feature_flags)}'
); );
""" """
) )
@@ -136,8 +122,7 @@ class TechnicianConfig(TableABC, ConfigurationModelABC):
SET `HelpCommandReferenceUrl` = '{self._help_command_reference_url}', SET `HelpCommandReferenceUrl` = '{self._help_command_reference_url}',
`WaitForRestart` = {self._wait_for_restart}, `WaitForRestart` = {self._wait_for_restart},
`WaitForShutdown` = {self._wait_for_shutdown}, `WaitForShutdown` = {self._wait_for_shutdown},
`CacheMaxMessages` = {self._cache_max_messages}, `CacheMaxMessages` = {self._cache_max_messages}
`FeatureFlags` = '{json.dumps(self._feature_flags)}'
WHERE `Id` = {self._id}; WHERE `Id` = {self._id};
""" """
) )

View File

@@ -15,8 +15,8 @@ class User(TableABC):
self, self,
dc_id: int, dc_id: int,
xp: int, xp: int,
reaction_count: int,
message_count: int, message_count: int,
reaction_count: int,
server: Optional[Server], server: Optional[Server],
created_at: datetime = None, created_at: datetime = None,
modified_at: datetime = None, modified_at: datetime = None,
@@ -25,8 +25,8 @@ class User(TableABC):
self._user_id = id self._user_id = id
self._discord_id = dc_id self._discord_id = dc_id
self._xp = xp self._xp = xp
self._reaction_count = reaction_count
self._message_count = message_count self._message_count = message_count
self._reaction_count = reaction_count
self._server = server self._server = server
TableABC.__init__(self) TableABC.__init__(self)

View File

@@ -49,15 +49,6 @@ class UserGameIdent(TableABC):
""" """
) )
@staticmethod
def get_select_by_game_server_id_string(id: int) -> str:
return str(
f"""
SELECT * FROM `UserGameIdents`
WHERE `GameServerId` = {id};
"""
)
@staticmethod @staticmethod
def get_select_by_id_string(id: int) -> str: def get_select_by_id_string(id: int) -> str:
return str( return str(

View File

@@ -39,10 +39,7 @@ class UserJoinedVoiceChannel(TableABC):
@property @property
@ServiceProviderABC.inject @ServiceProviderABC.inject
def channel_name(self, bot: DiscordBotServiceABC) -> str: def channel_name(self, bot: DiscordBotServiceABC) -> str:
channel = bot.get_channel(self.channel_id) return bot.get_channel(self.channel_id).name
if channel is None:
return ""
return channel.name
@property @property
def user(self) -> User: def user(self) -> User:

View File

@@ -41,10 +41,7 @@ class UserJoinedVoiceChannelHistory(HistoryTableABC):
@property @property
@ServiceProviderABC.inject @ServiceProviderABC.inject
def channel_name(self, bot: DiscordBotServiceABC) -> str: def channel_name(self, bot: DiscordBotServiceABC) -> str:
channel = bot.get_channel(self.channel_id) return bot.get_channel(self.channel_id).name
if channel is None:
return ""
return channel.name
@property @property
def user(self) -> int: def user(self) -> int:

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" """
bot sh-edraft.de Discord bot bot Keksdose bot
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de Discord bot for the Keksdose discord Server
:copyright: (c) 2022 - 2023 sh-edraft.de :copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details. :license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_data.service"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.9" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports # imports
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="9") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -65,8 +65,8 @@ class AchievementRepositoryService(AchievementRepositoryABC):
def get_achievements_by_server_id(self, server_id: int) -> List[Achievement]: def get_achievements_by_server_id(self, server_id: int) -> List[Achievement]:
achievements = List(Achievement) achievements = List(Achievement)
self._logger.trace(__name__, f"Send SQL command: {Achievement.get_select_by_server_id_string(server_id)}") self._logger.trace(__name__, f"Send SQL command: {Achievement.get_select_by_id_string(server_id)}")
results = self._context.select(Achievement.get_select_by_server_id_string(server_id)) results = self._context.select(Achievement.get_select_all_string())
for result in results: for result in results:
self._logger.trace(__name__, f"Get user with id {result[0]}") self._logger.trace(__name__, f"Get user with id {result[0]}")
achievements.append(self._from_result(result)) achievements.append(self._from_result(result))

View File

@@ -1,4 +1,3 @@
from enum import Enum
from typing import Optional from typing import Optional
from cpl_core.database.context import DatabaseContextABC from cpl_core.database.context import DatabaseContextABC
@@ -50,7 +49,13 @@ class AuthUserRepositoryService(AuthUserRepositoryABC):
auth_user_id=self._get_value_from_result(au_result[0]), auth_user_id=self._get_value_from_result(au_result[0]),
) )
for user_id in self.get_auth_user_relation_ids(auth_user): self._logger.trace(
__name__,
f"Send SQL command: {auth_user.get_select_user_id_from_relations()}",
)
results = self._context.select(auth_user.get_select_user_id_from_relations())
for result in results:
user_id = self._get_value_from_result(result[0])
if user_id is None: if user_id is None:
continue continue
@@ -59,19 +64,6 @@ class AuthUserRepositoryService(AuthUserRepositoryABC):
return auth_user return auth_user
def get_auth_user_relation_ids(self, auth_user: AuthUser) -> List[int]:
self._logger.trace(
__name__,
f"Send SQL command: {auth_user.get_select_user_id_from_relations()}",
)
relation_ids = List(int)
results = self._context.select(auth_user.get_select_user_id_from_relations())
for result in results:
self._logger.trace(__name__, f"Got auth user relation with id {result[0]}")
relation_ids.append(result[0])
return relation_ids
def get_all_auth_users(self) -> List[AuthUser]: def get_all_auth_users(self) -> List[AuthUser]:
users = List(AuthUser) users = List(AuthUser)
self._logger.trace(__name__, f"Send SQL command: {AuthUser.get_select_all_string()}") self._logger.trace(__name__, f"Send SQL command: {AuthUser.get_select_all_string()}")
@@ -108,17 +100,9 @@ class AuthUserRepositoryService(AuthUserRepositoryABC):
): ):
crit_sort_direction = criteria.sort_direction.lower() crit_sort_direction = criteria.sort_direction.lower()
if crit_sort_direction == "desc" or crit_sort_direction == "descending": if crit_sort_direction == "desc" or crit_sort_direction == "descending":
query = query.order_by_descending( query = query.order_by_descending(lambda x: getattr(x, criteria.sort_column))
lambda x: getattr(x, criteria.sort_column)
if not isinstance(getattr(x, criteria.sort_column), Enum)
else getattr(x, criteria.sort_column).value
)
else: else:
query = query.order_by( query = query.order_by(lambda x: getattr(x, criteria.sort_column))
lambda x: getattr(x, criteria.sort_column)
if not isinstance(getattr(x, criteria.sort_column), Enum)
else getattr(x, criteria.sort_column).value
)
result = FilteredResult() result = FilteredResult()
result.total_count = query.count() result.total_count = query.count()

View File

@@ -68,16 +68,13 @@ class GameServerRepositoryService(GameServerRepositoryABC):
result = self._context.select(GameServer.get_select_by_id_string(id))[0] result = self._context.select(GameServer.get_select_by_id_string(id))[0]
return self._from_result(result) return self._from_result(result)
def get_game_servers_by_api_key_id(self, id: int) -> List[GameServer]: def get_game_server_by_api_key_id(self, id: int) -> GameServer:
self._logger.trace( self._logger.trace(
__name__, __name__,
f"Send SQL command: {GameServer.get_select_by_api_key_id_string(id)}", f"Send SQL command: {GameServer.get_select_by_api_key_id_string(id)}",
) )
game_servers = List(GameServer) result = self._context.select(GameServer.get_select_by_api_key_id_string(id))[0]
results = self._context.select(GameServer.get_select_by_api_key_id_string(id)) return self._from_result(result)
for result in results:
game_servers.append(self._from_result(result))
return game_servers
def add_game_server(self, game_server: GameServer): def add_game_server(self, game_server: GameServer):
self._logger.trace(__name__, f"Send SQL command: {game_server.insert_string}") self._logger.trace(__name__, f"Send SQL command: {game_server.insert_string}")

View File

@@ -1,5 +1,3 @@
import json
from cpl_core.database.context import DatabaseContextABC from cpl_core.database.context import DatabaseContextABC
from cpl_query.extension import List from cpl_query.extension import List
@@ -64,26 +62,23 @@ class ServerConfigRepositoryService(ServerConfigRepositoryABC):
result[11], result[11],
result[12], result[12],
result[13], result[13],
result[14], self._servers.get_server_by_id(result[14]),
self._get_afk_channel_ids(result[14]),
self._get_team_role_ids(result[14]),
result[15], result[15],
json.loads(result[16]), result[16],
self._servers.get_server_by_id(result[17]),
self._get_afk_channel_ids(result[17]),
self._get_team_role_ids(result[17]),
result[18],
result[19],
id=result[0], id=result[0],
) )
def does_server_config_exists(self, server_id: int) -> bool: def does_server_config_exists(self, server_id: int) -> bool:
self._logger.trace(__name__, f"Send SQL command: {ServerConfig.get_select_by_server_id_string(server_id)}") self._logger.trace(__name__, f"Send SQL command: {ServerConfig.get_select_by_id_string(server_id)}")
result = self._context.select(ServerConfig.get_select_by_server_id_string(server_id)) result = self._context.select(ServerConfig.get_select_by_id_string(server_id))
return len(result) > 0 return len(result) > 0
def get_server_config_by_server(self, server_id: int) -> ServerConfig: def get_server_config_by_server(self, server_id: int) -> ServerConfig:
self._logger.trace(__name__, f"Send SQL command: {ServerConfig.get_select_by_server_id_string(server_id)}") self._logger.trace(__name__, f"Send SQL command: {ServerConfig.get_select_by_id_string(server_id)}")
result = self._context.select(ServerConfig.get_select_by_server_id_string(server_id))[0] result = self._context.select(ServerConfig.get_select_by_id_string(server_id))[0]
return self._from_result(result) return self._from_result(result)

View File

@@ -34,12 +34,29 @@ class ServerConfigSeeder(DataSeederABC):
if self._server_config.does_server_config_exists(server.id): if self._server_config.does_server_config_exists(server.id):
continue continue
config = ServerConfig.new(guild, server) config = ServerConfig(
6,
guild.system_channel.id,
6,
1,
1,
20,
10,
10,
10,
guild.system_channel.id,
guild.system_channel.id,
guild.system_channel.id,
guild.system_channel.id,
server,
[],
[],
)
self._server_config.add_server_config(config) self._server_config.add_server_config(config)
self._db.save_changes() self._db.save_changes()
self._logger.debug(__name__, "Seeded server config") self._logger.debug(__name__, "Seeded technician config")
except Exception as e: except Exception as e:
self._logger.error(__name__, f"Seeding server config failed", e) self._logger.error(__name__, f"Seeding technician config failed", e)

View File

@@ -1,95 +0,0 @@
from typing import Optional
from cpl_core.database.context import DatabaseContextABC
from cpl_query.extension import List
from bot_core.logging.database_logger import DatabaseLogger
from bot_data.abc.server_repository_abc import ServerRepositoryABC
from bot_data.abc.short_role_name_repository_abc import ShortRoleNameRepositoryABC
from bot_data.model.short_role_name import ShortRoleName
from bot_data.model.short_role_name_position_enum import ShortRoleNamePositionEnum
class ShortRoleNameRepositoryService(ShortRoleNameRepositoryABC):
def __init__(
self,
logger: DatabaseLogger,
db_context: DatabaseContextABC,
servers: ServerRepositoryABC,
):
self._logger = logger
self._context = db_context
self._servers = servers
ShortRoleNameRepositoryABC.__init__(self)
@staticmethod
def _get_value_from_result(value: any) -> Optional[any]:
if isinstance(value, str) and "NULL" in value:
return None
return value
def _short_role_name_from_result(self, sql_result: tuple) -> ShortRoleName:
return ShortRoleName(
self._get_value_from_result(sql_result[1]), # name
int(self._get_value_from_result(sql_result[2])), # role_id
ShortRoleNamePositionEnum(self._get_value_from_result(sql_result[3])), # position
self._servers.get_server_by_id(sql_result[4]), # server
self._get_value_from_result(sql_result[5]), # created_at
self._get_value_from_result(sql_result[6]), # modified_at
id=self._get_value_from_result(sql_result[0]), # id
)
def get_short_role_names(self) -> List[ShortRoleName]:
short_role_names = List(ShortRoleName)
self._logger.trace(__name__, f"Send SQL command: {ShortRoleName.get_select_all_string()}")
results = self._context.select(ShortRoleName.get_select_all_string())
for result in results:
self._logger.trace(__name__, f"Get short_role_name with id {result[0]}")
short_role_names.append(self._short_role_name_from_result(result))
return short_role_names
def get_short_role_name_by_id(self, id: int) -> ShortRoleName:
self._logger.trace(__name__, f"Send SQL command: {ShortRoleName.get_select_by_id_string(id)}")
result = self._context.select(ShortRoleName.get_select_by_id_string(id))[0]
return self._short_role_name_from_result(result)
def find_short_role_names_by_role_id(self, role_id: int) -> List[ShortRoleName]:
short_role_names = List(ShortRoleName)
self._logger.trace(__name__, f"Send SQL command: {ShortRoleName.get_select_by_role_id_string(role_id)}")
results = self._context.select(ShortRoleName.get_select_by_role_id_string(role_id))
for result in results:
self._logger.trace(__name__, f"Get short_role_name with id {result[0]}")
short_role_names.append(self._short_role_name_from_result(result))
return short_role_names
def get_short_role_names_by_server_id(self, server_id: int) -> List[ShortRoleName]:
short_role_names = List(ShortRoleName)
self._logger.trace(
__name__,
f"Send SQL command: {ShortRoleName.get_select_by_server_id_string(server_id)}",
)
results = self._context.select(ShortRoleName.get_select_by_server_id_string(server_id))
for result in results:
self._logger.trace(__name__, f"Get short_role_name with id {result[0]}")
short_role_names.append(self._short_role_name_from_result(result))
return short_role_names
def add_short_role_name(self, short_role_name: ShortRoleName):
self._logger.trace(__name__, f"Send SQL command: {short_role_name.insert_string}")
self._context.cursor.execute(short_role_name.insert_string)
def update_short_role_name(self, short_role_name: ShortRoleName):
self._logger.trace(__name__, f"Send SQL command: {short_role_name.udpate_string}")
self._context.cursor.execute(short_role_name.udpate_string)
def delete_short_role_name(self, short_role_name: ShortRoleName):
self._logger.trace(__name__, f"Send SQL command: {short_role_name.delete_string}")
self._context.cursor.execute(short_role_name.delete_string)

View File

@@ -1,5 +1,3 @@
import json
from cpl_core.database.context import DatabaseContextABC from cpl_core.database.context import DatabaseContextABC
from cpl_query.extension import List from cpl_query.extension import List
@@ -43,11 +41,10 @@ class TechnicianConfigRepositoryService(TechnicianConfigRepositoryABC):
result[2], result[2],
result[3], result[3],
result[4], result[4],
json.loads(result[5]),
self._get_technician_ids(), self._get_technician_ids(),
self._get_technician_ping_urls(), self._get_technician_ping_urls(),
result[5],
result[6], result[6],
result[7],
id=result[0], id=result[0],
) )

View File

@@ -32,7 +32,6 @@ class TechnicianConfigSeeder(DataSeederABC):
8, 8,
8, 8,
1000000, 1000000,
{},
List(int, [240160344557879316]), List(int, [240160344557879316]),
List(str, ["www.google.com", "www.sh-edraft.de", "www.keksdose-gaming.de"]), List(str, ["www.google.com", "www.sh-edraft.de", "www.keksdose-gaming.de"]),
) )

View File

@@ -51,19 +51,6 @@ class UserGameIdentRepositoryService(UserGameIdentRepositoryABC):
return joins return joins
def get_user_game_idents_by_game_server_id(self, game_server_id: int) -> List[UserGameIdent]:
joins = List(UserGameIdent)
self._logger.trace(
__name__,
f"Send SQL command: {UserGameIdent.get_select_by_game_server_id_string(game_server_id)}",
)
results = self._context.select(UserGameIdent.get_select_by_game_server_id_string(game_server_id))
for result in results:
self._logger.trace(__name__, f"Get UserGameIdent with id {result[0]}")
joins.append(self._from_result(result))
return joins
def get_user_game_ident_by_id(self, id: int) -> UserGameIdent: def get_user_game_ident_by_id(self, id: int) -> UserGameIdent:
self._logger.trace( self._logger.trace(
__name__, __name__,

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" """
bot sh-edraft.de Discord bot bot Keksdose bot
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de Discord bot for the Keksdose discord Server
:copyright: (c) 2022 - 2023 sh-edraft.de :copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details. :license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_graphql"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.9" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports # imports
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="9") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" """
bot sh-edraft.de Discord bot bot Keksdose bot
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de Discord bot for the Keksdose discord Server
:copyright: (c) 2022 - 2023 sh-edraft.de :copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details. :license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_graphql.abc"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.9" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports: # imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="9") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -2,15 +2,12 @@ from typing import Callable
from ariadne import ObjectType from ariadne import ObjectType
from cpl_core.dependency_injection import ServiceProviderABC from cpl_core.dependency_injection import ServiceProviderABC
from cpl_core.type import T
from cpl_discord.service import DiscordBotServiceABC from cpl_discord.service import DiscordBotServiceABC
from cpl_query.extension import List from cpl_query.extension import List
from bot_api.exception.service_error_code_enum import ServiceErrorCode from bot_api.exception.service_error_code_enum import ServiceErrorCode
from bot_api.exception.service_exception import ServiceException from bot_api.exception.service_exception import ServiceException
from bot_api.route.route import Route from bot_api.route.route import Route
from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
from bot_data.model.achievement import Achievement
from bot_data.model.auth_role_enum import AuthRoleEnum from bot_data.model.auth_role_enum import AuthRoleEnum
from bot_data.model.auth_user import AuthUser from bot_data.model.auth_user import AuthUser
from bot_data.model.auto_role import AutoRole from bot_data.model.auto_role import AutoRole
@@ -19,8 +16,6 @@ from bot_data.model.client import Client
from bot_data.model.known_user import KnownUser from bot_data.model.known_user import KnownUser
from bot_data.model.level import Level from bot_data.model.level import Level
from bot_data.model.server import Server from bot_data.model.server import Server
from bot_data.model.server_config import ServerConfig
from bot_data.model.short_role_name import ShortRoleName
from bot_data.model.user import User from bot_data.model.user import User
from bot_data.model.user_joined_game_server import UserJoinedGameServer from bot_data.model.user_joined_game_server import UserJoinedGameServer
from bot_data.model.user_joined_server import UserJoinedServer from bot_data.model.user_joined_server import UserJoinedServer
@@ -70,35 +65,13 @@ class QueryABC(ObjectType):
self.set_field(f"{name}s", wrapper) self.set_field(f"{name}s", wrapper)
self.set_field(f"{name}Count", lambda *args: wrapper(*args).count()) self.set_field(f"{name}Count", lambda *args: wrapper(*args).count())
def _can_user_see_element(self, user: AuthUser, element: T) -> bool: @ServiceProviderABC.inject
@ServiceProviderABC.inject def _can_user_see_element(self, user: AuthUser, element, services: ServiceProviderABC) -> bool:
def get_services(services: ServiceProviderABC) -> ServiceProviderABC:
return services
services = get_services()
permissions: PermissionService = services.get_service(PermissionService) permissions: PermissionService = services.get_service(PermissionService)
bot: DiscordBotServiceABC = services.get_service(DiscordBotServiceABC) bot: DiscordBotServiceABC = services.get_service(DiscordBotServiceABC)
if user.auth_role == AuthRoleEnum.admin:
return True
for u in user.users:
guild = bot.get_guild(u.server.discord_id)
if permissions.is_member_technician(guild.get_member(u.discord_id)):
return True
access = False access = False
if type(element) == Achievement: if type(element) == AutoRole:
element: Achievement = element
for u in user.users:
u: User = u
guild = bot.get_guild(u.server.discord_id)
member = guild.get_member(u.discord_id)
if permissions.is_member_moderator(member) and u.server.id == element.server.id:
access = True
break
elif type(element) == AutoRole:
element: AutoRole = element element: AutoRole = element
for u in user.users: for u in user.users:
u: User = u u: User = u
@@ -109,12 +82,12 @@ class QueryABC(ObjectType):
break break
elif type(element) == AutoRoleRule: elif type(element) == AutoRoleRule:
element: AutoRoleRule = element element: AutoRole = element
for u in user.users: for u in user.users:
u: User = u u: User = u
guild = bot.get_guild(u.server.discord_id) guild = bot.get_guild(u.server.discord_id)
member = guild.get_member(u.discord_id) member = guild.get_member(u.discord_id)
if permissions.is_member_moderator(member) and u.server.id == element.auto_role.server.id: if permissions.is_member_moderator(member) and u.server.id == element.server.id:
access = True access = True
break break
@@ -184,34 +157,6 @@ class QueryABC(ObjectType):
access = True access = True
break break
elif type(element) == ServerConfig:
for u in user.users:
u: User = u
guild = bot.get_guild(u.server.discord_id)
member = guild.get_member(u.discord_id)
if permissions.is_member_technician(member):
access = True
break
elif type(element) == ShortRoleName:
element: ShortRoleName = element
for u in user.users:
u: User = u
guild = bot.get_guild(u.server.discord_id)
member = guild.get_member(u.discord_id)
if permissions.is_member_moderator(member) and u.server.id == element.server.id:
access = True
break
elif type(element) == dict and "key" in element and element["key"] in [e.value for e in FeatureFlagsEnum]:
for u in user.users:
u: User = u
guild = bot.get_guild(u.server.discord_id)
member = guild.get_member(u.discord_id)
if permissions.is_member_technician(member):
access = True
break
return access return access
@ServiceProviderABC.inject @ServiceProviderABC.inject

View File

@@ -3,8 +3,8 @@
"Name": "bot-data", "Name": "bot-data",
"Version": { "Version": {
"Major": "1", "Major": "1",
"Minor": "1", "Minor": "0",
"Micro": "9" "Micro": "7"
}, },
"Author": "Sven Heidemann", "Author": "Sven Heidemann",
"AuthorEmail": "sven.heidemann@sh-edraft.de", "AuthorEmail": "sven.heidemann@sh-edraft.de",

View File

@@ -1,10 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
""" """
bot sh-edraft.de Discord bot bot Keksdose bot
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
Discord bot for customers of sh-edraft.de Discord bot for the Keksdose discord Server
:copyright: (c) 2022 - 2023 sh-edraft.de :copyright: (c) 2022 - 2023 sh-edraft.de
:license: MIT, see LICENSE for more details. :license: MIT, see LICENSE for more details.
@@ -15,7 +15,7 @@ __title__ = "bot_graphql.filter"
__author__ = "Sven Heidemann" __author__ = "Sven Heidemann"
__license__ = "MIT" __license__ = "MIT"
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de" __copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
__version__ = "1.1.9" __version__ = "1.0.7"
from collections import namedtuple from collections import namedtuple
@@ -23,4 +23,4 @@ from collections import namedtuple
# imports: # imports:
VersionInfo = namedtuple("VersionInfo", "major minor micro") VersionInfo = namedtuple("VersionInfo", "major minor micro")
version_info = VersionInfo(major="1", minor="1", micro="9") version_info = VersionInfo(major="1", minor="0", micro="7")

View File

@@ -1,70 +0,0 @@
from cpl_discord.service import DiscordBotServiceABC
from cpl_query.extension import List
from bot_data.model.short_role_name import ShortRoleName
from bot_data.model.short_role_name_position_enum import ShortRoleNamePositionEnum
from bot_data.model.user import User
from bot_graphql.abc.filter_abc import FilterABC
class ShortRoleNameFilter(FilterABC):
def __init__(self, bot: DiscordBotServiceABC):
FilterABC.__init__(self)
self._bot = bot
self._id = None
self._short_name = None
self._role_id = None
self._role_name = None
self._position = None
self._server = None
def from_dict(self, values: dict):
if "id" in values:
self._id = int(values["id"])
if "shortName" in values:
self._short_name = values["shortName"]
if "roleId" in values:
self._role_id = int(values["roleId"])
if "roleName" in values:
self._role_name = values["roleName"]
if "position" in values:
self._position = ShortRoleNamePositionEnum(values["position"])
if "server" in values:
from bot_graphql.filter.server_filter import ServerFilter
self._server: ServerFilter = self._services.get_service(ServerFilter)
self._server.from_dict(values["server"])
def filter(self, query: List[User]) -> List[User]:
if self._id is not None:
query = query.where(lambda x: x.id == self._id)
if self._short_name is not None:
query = query.where(lambda x: x.short_name == self._short_name or self._short_name in x.short_name)
if self._role_id is not None:
query = query.where(lambda x: x.role_id == self._role_id)
if self._role_name is not None and self._role_id is not None:
def get_role_name(x: ShortRoleName):
guild = self._bot.get_guild(x.server.discord_id)
name = guild.get_role(x.role_id).name
return name == self._role_name or self._role_name in name
query = query.where(get_role_name)
if self._position is not None:
query = query.where(lambda x: x.position.value == self._position.value)
if self._server is not None:
servers = self._server.filter(query.select(lambda x: x.server)).select(lambda x: x.id)
query = query.where(lambda x: x.server.id in servers)
return query

Some files were not shown because too many files have changed in this diff Show More