Compare commits
116 Commits
ce73145dbb
...
0.3
Author | SHA1 | Date | |
---|---|---|---|
89ee16d1b5 | |||
4c577f6a7b | |||
f50a763539 | |||
9ff9cc672e | |||
9d4cf5a769 | |||
df1d62f569 | |||
4201510e9f | |||
394428a81a | |||
4733f84ec6 | |||
9c466733fb | |||
bd62618fdf | |||
a78d5f0fcb | |||
661630bb37 | |||
15f041a2da | |||
1ac5d982ed | |||
1337ef35dd | |||
986d7c4562 | |||
7fcb4084d2 | |||
fbac0d3d02 | |||
9626de2b27 | |||
1d74f5e67c | |||
6949db10f8 | |||
ba5d897662 | |||
47415af868 | |||
6353c7ca86 | |||
440689653d | |||
844a818aa0 | |||
33fb973f21 | |||
7646335d03 | |||
04c905d287 | |||
c7d8508173 | |||
f3eff97780 | |||
476db0ed33 | |||
9c369b911a | |||
6dfd476bce | |||
f669410b2a | |||
a46122243f | |||
3b7345b404 | |||
59d38f8f2a | |||
612430d3e0 | |||
e01290db9b | |||
6273ce9cba | |||
5c923d8bd8 | |||
6c6169f7ee | |||
ffd5105154 | |||
9040ab6fca | |||
9d89135b4c | |||
71899346b2 | |||
d197a6e158 | |||
40e53de3f2 | |||
1b9553e63b | |||
5447d502cc | |||
5a4c2901f5 | |||
bcf71a26f0 | |||
b25b75e382 | |||
f21b4f9881 | |||
8705904882 | |||
cf610b770b | |||
ec30069ff5 | |||
7026b3abac | |||
31464df3f6 | |||
eb9f5b83d5 | |||
fdd8357729 | |||
7c744f0e65 | |||
4a0f5c28c1 | |||
d2f99003ff | |||
9dd3fd4b8e | |||
d18500b96c | |||
91fdf34d32 | |||
12369cdbe3 | |||
25c698273a | |||
2868b1afe2 | |||
0d1c15b31d | |||
840da350e4 | |||
bd94c42eae | |||
c7a925b997 | |||
7fb6d22c3f | |||
c5b5297058 | |||
9ed66c2560 | |||
6e6157ccf2 | |||
f136d6164e | |||
9b5033b80e | |||
f5a71a8450 | |||
d3279eb7c7 | |||
ec7aeb8712 | |||
fd609eb923 | |||
a7dbc75d2e | |||
b0459567f4 | |||
25b7b18013 | |||
87350cba1a | |||
864d181de0 | |||
90011be760 | |||
47dd6fdc2d | |||
8445c23e7f | |||
e6fc41090a | |||
7c79c6f992 | |||
7b8dca64bf | |||
549b05087f | |||
83d18da58f | |||
18e4465b17 | |||
2e20bb12de | |||
4f4e80fb6b | |||
fd1245fb4f | |||
fdb358c45e | |||
c438a91b87 | |||
a46fbcd9fc | |||
91285540c6 | |||
ab2145d5df | |||
63fe566044 | |||
d45d787cea | |||
442170eca9 | |||
2c7f4647af | |||
53604706c2 | |||
42d8a16d05 | |||
d933cae73c | |||
49d9509255 |
@@ -13,19 +13,20 @@
|
|||||||
"level": "src/modules/level/level.json",
|
"level": "src/modules/level/level.json",
|
||||||
"permission": "src/modules/permission/permission.json",
|
"permission": "src/modules/permission/permission.json",
|
||||||
"stats": "src/modules/stats/stats.json",
|
"stats": "src/modules/stats/stats.json",
|
||||||
|
"technician": "src/modules/technician/technician.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",
|
||||||
"set-version": "tools/set_version/set-version.json"
|
"set-version": "tools/set_version/set-version.json"
|
||||||
},
|
},
|
||||||
"Scripts": {
|
"Scripts": {
|
||||||
"sv": "cpl set-version",
|
"sv": "cpl set-version $ARGS",
|
||||||
"set-version": "cpl run set-version $ARGS; echo '';",
|
"set-version": "cpl run set-version $ARGS --dev; echo '';",
|
||||||
|
|
||||||
"gv": "cpl get-version",
|
"gv": "cpl get-version",
|
||||||
"get-version": "export VERSION=$(cpl run get-version); echo $VERSION;",
|
"get-version": "export VERSION=$(cpl run get-version --dev); echo $VERSION;",
|
||||||
|
|
||||||
"pre-build": "cpl set-version $ARGS",
|
"pre-build": "cpl set-version $ARGS",
|
||||||
"post-build": "cpl run post-build",
|
"post-build": "cpl run post-build --dev",
|
||||||
|
|
||||||
"pre-prod": "cpl build",
|
"pre-prod": "cpl build",
|
||||||
"prod": "export KDB_ENVIRONMENT=production; export KDB_NAME=KDB-Prod; cpl start;",
|
"prod": "export KDB_ENVIRONMENT=production; export KDB_NAME=KDB-Prod; cpl start;",
|
||||||
@@ -36,9 +37,10 @@
|
|||||||
"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 b; docker-compose down; docker build -t kdb-bot/kdb-bot:$(cpl gv) .",
|
"docker-build": "cpl build $ARGS; docker build -t kdb-bot/kdb-bot:$(cpl gv) .;",
|
||||||
"docker-compose": "docker-compose up -d",
|
"dc-up": "docker-compose up -d",
|
||||||
"docker": "cpl docker-build; cpl docker-compose;"
|
"dc-down": "docker-compose down",
|
||||||
|
"docker": "cpl dc-down; cpl docker-build; cpl dc-up;"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Submodule kdb-bot/docker updated: b3d5e9feef...48c2683965
18
kdb-bot/dockerfile
Normal file
18
kdb-bot/dockerfile
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
# syntax=docker/dockerfile:1
|
||||||
|
FROM python:3.10.6-alpine
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
COPY ./dist/bot/build/kdb-bot/ .
|
||||||
|
COPY ./dist/bot/build/requirements.txt .
|
||||||
|
|
||||||
|
RUN python -m pip install --upgrade pip
|
||||||
|
|
||||||
|
RUN apk update
|
||||||
|
RUN apk add --update alpine-sdk linux-headers
|
||||||
|
RUN apk add bash
|
||||||
|
RUN apk add nano
|
||||||
|
|
||||||
|
RUN pip install -r requirements.txt --extra-index-url https://pip.sh-edraft.de
|
||||||
|
RUN pip install flask[async]
|
||||||
|
|
||||||
|
CMD [ "bash", "/app/bot/bot"]
|
@@ -15,7 +15,7 @@ __title__ = 'bot'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
@@ -4,7 +4,7 @@
|
|||||||
"Version": {
|
"Version": {
|
||||||
"Major": "0",
|
"Major": "0",
|
||||||
"Minor": "3",
|
"Minor": "3",
|
||||||
"Micro": "dev25"
|
"Micro": "0"
|
||||||
},
|
},
|
||||||
"Author": "Sven Heidemann",
|
"Author": "Sven Heidemann",
|
||||||
"AuthorEmail": "sven.heidemann@sh-edraft.de",
|
"AuthorEmail": "sven.heidemann@sh-edraft.de",
|
||||||
@@ -16,21 +16,22 @@
|
|||||||
"LicenseName": "MIT",
|
"LicenseName": "MIT",
|
||||||
"LicenseDescription": "MIT, see LICENSE for more details.",
|
"LicenseDescription": "MIT, see LICENSE for more details.",
|
||||||
"Dependencies": [
|
"Dependencies": [
|
||||||
"cpl-core==2022.10.0.post7",
|
"cpl-core==2022.12.0",
|
||||||
"cpl-translation==2022.10.0.post2",
|
"cpl-translation==2022.10.0.post2",
|
||||||
"cpl-query==2022.10.0.post2",
|
"cpl-query==2022.12.2",
|
||||||
"cpl-discord==2022.10.0.post6",
|
"cpl-discord==2022.12.0",
|
||||||
"Flask==2.2.2",
|
"Flask==2.2.2",
|
||||||
"Flask-Classful==0.14.2",
|
"Flask-Classful==0.14.2",
|
||||||
"Flask-Cors==3.0.10",
|
"Flask-Cors==3.0.10",
|
||||||
"PyJWT==2.6.0",
|
"PyJWT==2.6.0",
|
||||||
"waitress==2.1.2",
|
"waitress==2.1.2",
|
||||||
"Flask-SocketIO==5.3.1",
|
"Flask-SocketIO==5.3.2",
|
||||||
"eventlet==0.33.1",
|
"eventlet==0.33.2",
|
||||||
"requests-oauthlib==1.3.1"
|
"requests-oauthlib==1.3.1",
|
||||||
|
"icmplib==3.0.3"
|
||||||
],
|
],
|
||||||
"DevDependencies": [
|
"DevDependencies": [
|
||||||
"cpl-cli==2022.10.0"
|
"cpl-cli==2022.12.0"
|
||||||
],
|
],
|
||||||
"PythonVersion": ">=3.10.4",
|
"PythonVersion": ">=3.10.4",
|
||||||
"PythonPath": {},
|
"PythonPath": {},
|
||||||
@@ -59,9 +60,9 @@
|
|||||||
"../modules/boot_log/boot-log.json",
|
"../modules/boot_log/boot-log.json",
|
||||||
"../modules/database/database.json",
|
"../modules/database/database.json",
|
||||||
"../modules/level/level.json",
|
"../modules/level/level.json",
|
||||||
"../modules/permission/level.json",
|
|
||||||
"../modules/permission/permission.json",
|
"../modules/permission/permission.json",
|
||||||
"../modules/permission/stats.json"
|
"../modules/stats/stats.json",
|
||||||
|
"../modules/technician/technician.json"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
Submodule kdb-bot/src/bot/config updated: 6f63688fd9...e6faabbd8b
@@ -11,6 +11,7 @@ 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.stats.stats_module import StatsModule
|
from modules.stats.stats_module import StatsModule
|
||||||
|
from modules.technician.technician_module import TechnicianModule
|
||||||
|
|
||||||
|
|
||||||
class ModuleList:
|
class ModuleList:
|
||||||
@@ -21,13 +22,14 @@ class ModuleList:
|
|||||||
return List(type, [
|
return List(type, [
|
||||||
CoreModule, # has to be first!
|
CoreModule, # has to be first!
|
||||||
DataModule,
|
DataModule,
|
||||||
|
PermissionModule,
|
||||||
|
DatabaseModule,
|
||||||
AutoRoleModule,
|
AutoRoleModule,
|
||||||
BaseModule,
|
BaseModule,
|
||||||
DatabaseModule,
|
|
||||||
LevelModule,
|
LevelModule,
|
||||||
PermissionModule,
|
|
||||||
ApiModule,
|
ApiModule,
|
||||||
StatsModule,
|
StatsModule,
|
||||||
|
TechnicianModule,
|
||||||
# has to be last!
|
# has to be last!
|
||||||
BootLogModule,
|
BootLogModule,
|
||||||
CoreExtensionModule,
|
CoreExtensionModule,
|
||||||
|
@@ -5,6 +5,7 @@ from cpl_core.environment import ApplicationEnvironmentABC
|
|||||||
|
|
||||||
from bot_data.abc.migration_abc import MigrationABC
|
from bot_data.abc.migration_abc import MigrationABC
|
||||||
from bot_data.migration.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_migration import AutoRoleMigration
|
from bot_data.migration.auto_role_migration import AutoRoleMigration
|
||||||
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
|
||||||
@@ -27,3 +28,4 @@ class StartupMigrationExtension(StartupExtensionABC):
|
|||||||
services.add_transient(MigrationABC, ApiMigration) # 15.10.2022 #70 - 0.3.0
|
services.add_transient(MigrationABC, ApiMigration) # 15.10.2022 #70 - 0.3.0
|
||||||
services.add_transient(MigrationABC, LevelMigration) # 06.11.2022 #25 - 0.3.0
|
services.add_transient(MigrationABC, LevelMigration) # 06.11.2022 #25 - 0.3.0
|
||||||
services.add_transient(MigrationABC, StatsMigration) # 09.11.2022 #46 - 0.3.0
|
services.add_transient(MigrationABC, StatsMigration) # 09.11.2022 #46 - 0.3.0
|
||||||
|
services.add_transient(MigrationABC, AutoRoleFix1Migration) # 30.12.2022 #151 - 0.3.0
|
||||||
|
@@ -6,7 +6,7 @@
|
|||||||
"not_implemented_yet": "Ey Alter, das kann ich noch nicht...",
|
"not_implemented_yet": "Ey Alter, das kann ich noch nicht...",
|
||||||
"presence": {
|
"presence": {
|
||||||
"booting": "{} Ich fahre gerade hoch...",
|
"booting": "{} Ich fahre gerade hoch...",
|
||||||
"running": "{} Behalte Ruhe und iss Kekse :D",
|
"running": "{} Ich esse Kekse :D",
|
||||||
"restart": "{} Muss neue Kekse holen...",
|
"restart": "{} Muss neue Kekse holen...",
|
||||||
"shutdown": "{} Ich werde bestimmt wieder kommen..."
|
"shutdown": "{} Ich werde bestimmt wieder kommen..."
|
||||||
},
|
},
|
||||||
@@ -72,11 +72,6 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"modules": {
|
"modules": {
|
||||||
"admin": {
|
|
||||||
"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 :)",
|
|
||||||
"deploy_message": "Der neue Stand wurde hochgeladen."
|
|
||||||
},
|
|
||||||
"auto_role": {
|
"auto_role": {
|
||||||
"list": {
|
"list": {
|
||||||
"title": "Beobachtete Nachrichten:",
|
"title": "Beobachtete Nachrichten:",
|
||||||
@@ -113,7 +108,7 @@
|
|||||||
"error": {
|
"error": {
|
||||||
"not_found": "Regel für auto-role {} nicht gefunden!",
|
"not_found": "Regel für auto-role {} nicht gefunden!",
|
||||||
"emoji_not_found": "Emoji {} für auto-role Regel {} nicht gefunden!",
|
"emoji_not_found": "Emoji {} für auto-role Regel {} nicht gefunden!",
|
||||||
"rule_not_found": "Rolle {} für auto-role Regel {} nicht gefunden!",
|
"role_not_found": "Rolle {} für auto-role Regel {} nicht gefunden!",
|
||||||
"already_exists": "Regel für auto-role {} existiert bereits!"
|
"already_exists": "Regel für auto-role {} existiert bereits!"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -132,16 +127,17 @@
|
|||||||
"purge_message": "Na gut..., ich lösche alle Nachrichten wenns sein muss."
|
"purge_message": "Na gut..., ich lösche alle Nachrichten wenns sein muss."
|
||||||
},
|
},
|
||||||
"base": {
|
"base": {
|
||||||
"technician_error_message": "Es gab ein Fehler mit dem Event: {}\nDatum und Zeit: {}\nSchau bitte ins log für Details.UUID: {}",
|
"technician_error_message": "Es gab ein Fehler mit dem Event: {}\nDatum und Zeit: {}\nSchau bitte ins log für Details.\nUUID: {}",
|
||||||
"technician_command_error_message": "Es gab ein Fehler mit dem Befehl: {} ausgelöst von {} -> {}\nDatum und Zeit: {}\nSchau bitte ins log für Details.UUID: {}",
|
"technician_command_error_message": "Es gab ein Fehler mit dem Befehl: {} ausgelöst von {} -> {}\nDatum und Zeit: {}\nSchau bitte ins log für Details.\nUUID: {}",
|
||||||
"welcome_message": "Hello There!\nIch heiße dich bei {} herzlichst willkommen!",
|
"welcome_message": "Hello There!\nIch heiße dich bei {} herzlichst Willkommen!",
|
||||||
"welcome_message_for_team": "{} hat gerade das Irrenhaus betreten.",
|
"welcome_message_for_team": "{} hat gerade das Irrenhaus betreten.",
|
||||||
"goodbye_message": "Schade das du uns so schnell verlässt :(",
|
"goodbye_message": "Schade, dass du uns so schnell verlässt :(",
|
||||||
"afk_command_channel_missing_message": "Zu unfähig einem Sprachkanal beizutreten?",
|
"afk_command_channel_missing_message": "Zu unfähig einem Sprachkanal beizutreten?",
|
||||||
"afk_command_move_message": "Ich verschiebe dich ja schon... (◔_◔)",
|
"afk_command_move_message": "Ich verschiebe dich ja schon... (◔_◔)",
|
||||||
|
"member_joined_help_voice_channel": "{} braucht hilfe, bitte kümmer dich drum :D",
|
||||||
"pong": "Pong",
|
"pong": "Pong",
|
||||||
"info": {
|
"info": {
|
||||||
"title": "Gismo",
|
"title": "Krümmelmonster",
|
||||||
"description": "Informationen über mich",
|
"description": "Informationen über mich",
|
||||||
"fields": {
|
"fields": {
|
||||||
"version": "Version",
|
"version": "Version",
|
||||||
@@ -155,8 +151,17 @@
|
|||||||
},
|
},
|
||||||
"footer": ""
|
"footer": ""
|
||||||
},
|
},
|
||||||
"user_info": {
|
"mass_move": {
|
||||||
"fields": {
|
"moved": "Alle Personen aus {} wurden nach {} verschoben.",
|
||||||
|
"channel_from_error": "Du musst dich in einem Voicechannel befinden oder die Option \"channel_from\" mit angeben."
|
||||||
|
},
|
||||||
|
"presence": {
|
||||||
|
"changed": "Presence wurde geändert.",
|
||||||
|
"removed": "Presence wurde entfernt.",
|
||||||
|
"max_char_count_exceeded": "Der Text darf nicht mehr als 128 Zeichen lang sein!"
|
||||||
|
},
|
||||||
|
"user": {
|
||||||
|
"atr": {
|
||||||
"id": "Id",
|
"id": "Id",
|
||||||
"name": "Name",
|
"name": "Name",
|
||||||
"discord_join": "Discord beigetreten am",
|
"discord_join": "Discord beigetreten am",
|
||||||
@@ -168,27 +173,47 @@
|
|||||||
"lefts": "Abgänge",
|
"lefts": "Abgänge",
|
||||||
"warnings": "Verwarnungen"
|
"warnings": "Verwarnungen"
|
||||||
},
|
},
|
||||||
"footer": ""
|
"info": {
|
||||||
|
"footer": ""
|
||||||
|
},
|
||||||
|
"get": {
|
||||||
|
"xp": "{} hat {} xp",
|
||||||
|
"ontime": "{} war insgesamt {} Stunden aktiv in einem Sprachkanal"
|
||||||
|
},
|
||||||
|
"set": {
|
||||||
|
"xp": "{} hat nun {} xp",
|
||||||
|
"error": {
|
||||||
|
"value_type_not_numeric": "Der angegebende Wert ist keine Ganzzahl! :(",
|
||||||
|
"type_error": "Der angegebene Wert ist keine Zahl! :("
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"remove": {
|
||||||
|
"xp": "Die {} von {} wurden entfernt",
|
||||||
|
"ontime": "Die {} von {} wurden entfernt"
|
||||||
|
},
|
||||||
|
"error": {
|
||||||
|
"atr_not_found": "Das Attribut {} konnte nicht gefunden werden :("
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"boot_log": {
|
"boot_log": {
|
||||||
"login_message": "Ich bin on the line :D\nDer Scheiß hat {} Sekunden gedauert"
|
"login_message": "Ich bin on the line :D\nDer Scheiß hat {} Sekunden gedauert"
|
||||||
},
|
},
|
||||||
"level": {
|
"level": {
|
||||||
"new_level_message": "<@{}> ist nun Level {}",
|
"new_level_message": "{} ist nun Level {}",
|
||||||
"seeding_started": "Levelsystem wird neu geladen.",
|
"seeding_started": "Levelsystem wird neu geladen...",
|
||||||
"seeding_failed": "Levelsystem konnte nicht neu geladen werden.",
|
"seeding_failed": "Levelsystem konnte nicht neu geladen werden :(",
|
||||||
"seeding_finished": "Levelsystem wurde Erfolgreich neu geladen.",
|
"seeding_finished": "Levelsystem wurde Erfolgreich neu geladen :)",
|
||||||
"error": {
|
"error": {
|
||||||
"nothing_found": "Keine Level Einträge gefunden.",
|
"nothing_found": "Keine Level Einträge gefunden.",
|
||||||
"level_with_name_already_exists": "Ein Level mit dem Namen {} existiert bereits!",
|
"level_with_name_already_exists": "Ein Level mit dem Namen {} existiert bereits!",
|
||||||
"level_with_xp_already_exists": "Das Level {} hat bereits die Mindest XP {}!"
|
"level_with_xp_already_exists": "Das Level {} hat bereits die Mindest-XP {}!"
|
||||||
},
|
},
|
||||||
"list": {
|
"list": {
|
||||||
"title": "Level:",
|
"title": "Level:",
|
||||||
"description": "Konfigurierte Level:",
|
"description": "Konfigurierte Level:",
|
||||||
"name": "Name",
|
"name": "Name",
|
||||||
"min_xp": "Mindest XP",
|
"min_xp": "Mindest-XP",
|
||||||
"permission_int": "Berechtigungen"
|
"permission_int": "Berechtigungen"
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
@@ -248,6 +273,11 @@
|
|||||||
"failed": "Statistik kann nicht gelöscht werden :(",
|
"failed": "Statistik kann nicht gelöscht werden :(",
|
||||||
"success": "Statistik wurde gelöscht :D"
|
"success": "Statistik wurde gelöscht :D"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"technician": {
|
||||||
|
"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 :)",
|
||||||
|
"log_message": "Hier sind deine Logdateien! :)"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"api": {
|
"api": {
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'bot_api'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
@@ -11,11 +11,11 @@ Discord bot for the Keksdose discord Server
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
__title__ = 'bot_api.service'
|
__title__ = 'bot_api.abc'
|
||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
@@ -70,6 +70,9 @@ class AuthServiceABC(ABC):
|
|||||||
@abstractmethod
|
@abstractmethod
|
||||||
async def login_async(self, user_dto: AuthUserDTO) -> TokenDTO: pass
|
async def login_async(self, user_dto: AuthUserDTO) -> TokenDTO: pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
async def login_discord_async(self, oauth_dto: AuthUserDTO) -> TokenDTO: pass
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
async def refresh_async(self, token_dto: TokenDTO) -> TokenDTO: pass
|
async def refresh_async(self, token_dto: TokenDTO) -> TokenDTO: pass
|
||||||
|
|
||||||
|
@@ -4,7 +4,7 @@
|
|||||||
"Version": {
|
"Version": {
|
||||||
"Major": "0",
|
"Major": "0",
|
||||||
"Minor": "3",
|
"Minor": "3",
|
||||||
"Micro": "dev70"
|
"Micro": "0"
|
||||||
},
|
},
|
||||||
"Author": "",
|
"Author": "",
|
||||||
"AuthorEmail": "",
|
"AuthorEmail": "",
|
||||||
@@ -16,10 +16,10 @@
|
|||||||
"LicenseName": "",
|
"LicenseName": "",
|
||||||
"LicenseDescription": "",
|
"LicenseDescription": "",
|
||||||
"Dependencies": [
|
"Dependencies": [
|
||||||
"cpl-core==2022.10.0.post7"
|
"cpl-core==2022.12.0"
|
||||||
],
|
],
|
||||||
"DevDependencies": [
|
"DevDependencies": [
|
||||||
"cpl-cli==2022.10.0"
|
"cpl-cli==2022.12.0"
|
||||||
],
|
],
|
||||||
"PythonVersion": ">=3.10.4",
|
"PythonVersion": ">=3.10.4",
|
||||||
"PythonPath": {},
|
"PythonPath": {},
|
||||||
|
Submodule kdb-bot/src/bot_api/config updated: 98303ffd45...e6046881b5
@@ -15,7 +15,7 @@ __title__ = 'bot_api.configuration'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'bot_api.controller'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
@@ -46,14 +46,14 @@ class AuthController:
|
|||||||
@Route.authorize(role=AuthRoleEnum.admin)
|
@Route.authorize(role=AuthRoleEnum.admin)
|
||||||
async def get_all_users(self) -> Response:
|
async def get_all_users(self) -> Response:
|
||||||
result = await self._auth_service.get_all_auth_users_async()
|
result = await self._auth_service.get_all_auth_users_async()
|
||||||
return jsonify(result.select(lambda x: x.to_dict()))
|
return jsonify(result.select(lambda x: x.to_dict()).to_list())
|
||||||
|
|
||||||
@Route.post(f'{BasePath}/users/get/filtered')
|
@Route.post(f'{BasePath}/users/get/filtered')
|
||||||
@Route.authorize(role=AuthRoleEnum.admin)
|
@Route.authorize(role=AuthRoleEnum.admin)
|
||||||
async def get_filtered_users(self) -> Response:
|
async def get_filtered_users(self) -> Response:
|
||||||
dto: AuthUserSelectCriteria = JSONProcessor.process(AuthUserSelectCriteria, request.get_json(force=True, silent=True))
|
dto: AuthUserSelectCriteria = JSONProcessor.process(AuthUserSelectCriteria, request.get_json(force=True, silent=True))
|
||||||
result = await self._auth_service.get_filtered_auth_users_async(dto)
|
result = await self._auth_service.get_filtered_auth_users_async(dto)
|
||||||
result.result = result.result.select(lambda x: x.to_dict())
|
result.result = result.result.select(lambda x: x.to_dict()).to_list()
|
||||||
return jsonify(result.to_dict())
|
return jsonify(result.to_dict())
|
||||||
|
|
||||||
@Route.get(f'{BasePath}/users/get/<email>')
|
@Route.get(f'{BasePath}/users/get/<email>')
|
||||||
|
@@ -82,8 +82,18 @@ class AuthDiscordController:
|
|||||||
), response['id'])
|
), response['id'])
|
||||||
return jsonify(result.to_dict())
|
return jsonify(result.to_dict())
|
||||||
|
|
||||||
@Route.post(f'{BasePath}/register')
|
@Route.get(f'{BasePath}/login')
|
||||||
async def discord_register(self):
|
async def discord_login(self) -> Response:
|
||||||
dto: OAuthDTO = JSONProcessor.process(OAuthDTO, request.get_json(force=True, silent=True))
|
response = self._get_user_from_discord_response()
|
||||||
await self._auth_service.add_auth_user_by_oauth_async(dto)
|
dto = AuthUserDTO(
|
||||||
return '', 200
|
0,
|
||||||
|
response['username'],
|
||||||
|
response['discriminator'],
|
||||||
|
response['email'],
|
||||||
|
str(uuid.uuid4()),
|
||||||
|
None,
|
||||||
|
AuthRoleEnum.normal
|
||||||
|
)
|
||||||
|
|
||||||
|
result = await self._auth_service.login_discord_async(dto)
|
||||||
|
return jsonify(result.to_dict())
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'bot_api.controller.discord'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
@@ -40,14 +40,14 @@ class ServerController:
|
|||||||
@Route.authorize(role=AuthRoleEnum.admin)
|
@Route.authorize(role=AuthRoleEnum.admin)
|
||||||
async def get_all_servers(self) -> Response:
|
async def get_all_servers(self) -> Response:
|
||||||
result = await self._discord_service.get_all_servers()
|
result = await self._discord_service.get_all_servers()
|
||||||
result = result.select(lambda x: x.to_dict())
|
result = result.select(lambda x: x.to_dict()).to_list()
|
||||||
return jsonify(result)
|
return jsonify(result)
|
||||||
|
|
||||||
@Route.get(f'{BasePath}/get/servers-by-user')
|
@Route.get(f'{BasePath}/get/servers-by-user')
|
||||||
@Route.authorize
|
@Route.authorize
|
||||||
async def get_all_servers_by_user(self) -> Response:
|
async def get_all_servers_by_user(self) -> Response:
|
||||||
result = await self._discord_service.get_all_servers_by_user()
|
result = await self._discord_service.get_all_servers_by_user()
|
||||||
result = result.select(lambda x: x.to_dict())
|
result = result.select(lambda x: x.to_dict()).to_list()
|
||||||
return jsonify(result)
|
return jsonify(result)
|
||||||
|
|
||||||
@Route.post(f'{BasePath}/get/filtered')
|
@Route.post(f'{BasePath}/get/filtered')
|
||||||
@@ -55,11 +55,11 @@ class ServerController:
|
|||||||
async def get_filtered_servers(self) -> Response:
|
async def get_filtered_servers(self) -> Response:
|
||||||
dto: ServerSelectCriteria = JSONProcessor.process(ServerSelectCriteria, request.get_json(force=True, silent=True))
|
dto: ServerSelectCriteria = JSONProcessor.process(ServerSelectCriteria, request.get_json(force=True, silent=True))
|
||||||
result = await self._discord_service.get_filtered_servers_async(dto)
|
result = await self._discord_service.get_filtered_servers_async(dto)
|
||||||
result.result = result.result.select(lambda x: x.to_dict())
|
result.result = result.result.select(lambda x: x.to_dict()).to_list()
|
||||||
return jsonify(result.to_dict())
|
return jsonify(result.to_dict())
|
||||||
|
|
||||||
@Route.get(f'{BasePath}/get/<id>')
|
@Route.get(f'{BasePath}/get/<id>')
|
||||||
@Route.authorize
|
@Route.authorize
|
||||||
async def get_server_by_id(self, id: int) -> Response:
|
async def get_server_by_id(self, id: int) -> Response:
|
||||||
result = await self._discord_service.get_server_by_id_async(id)
|
result = await self._discord_service.get_server_by_id_async(id).to_list()
|
||||||
return jsonify(result.to_dict())
|
return jsonify(result.to_dict())
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'bot_api.event'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'bot_api.exception'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'bot_api.filter'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'bot_api.filter.discord'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'bot_api.logging'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'bot_api.model'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'bot_api.model.discord'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'bot_api.route'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'bot_api.service'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
@@ -460,6 +460,24 @@ class AuthService(AuthServiceABC):
|
|||||||
self._db.save_changes()
|
self._db.save_changes()
|
||||||
return TokenDTO(token, refresh_token)
|
return TokenDTO(token, refresh_token)
|
||||||
|
|
||||||
|
async def login_discord_async(self, user_dto: AuthUserDTO) -> TokenDTO:
|
||||||
|
if user_dto is None:
|
||||||
|
raise ServiceException(ServiceErrorCode.InvalidData, 'User not set')
|
||||||
|
|
||||||
|
db_user = self._auth_users.find_auth_user_by_email(user_dto.email)
|
||||||
|
if db_user is None:
|
||||||
|
await self.add_auth_user_async(user_dto)
|
||||||
|
# raise ServiceException(ServiceErrorCode.InvalidUser, f'User not found')
|
||||||
|
|
||||||
|
db_user = self._auth_users.get_auth_user_by_email(user_dto.email)
|
||||||
|
token = self.generate_token(db_user)
|
||||||
|
refresh_token = self._create_and_save_refresh_token(db_user)
|
||||||
|
if db_user.forgot_password_id is not None:
|
||||||
|
db_user.forgot_password_id = None
|
||||||
|
|
||||||
|
self._db.save_changes()
|
||||||
|
return TokenDTO(token, refresh_token)
|
||||||
|
|
||||||
async def refresh_async(self, token_dto: TokenDTO) -> TokenDTO:
|
async def refresh_async(self, token_dto: TokenDTO) -> TokenDTO:
|
||||||
if token_dto is None:
|
if token_dto is None:
|
||||||
raise ServiceException(ServiceErrorCode.InvalidData, f'Token not set')
|
raise ServiceException(ServiceErrorCode.InvalidData, f'Token not set')
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'bot_api.transformer'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'bot_core'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
@@ -11,11 +11,11 @@ Discord bot for the Keksdose discord Server
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
__title__ = 'bot_core.service'
|
__title__ = 'bot_core.abc'
|
||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
@@ -1,5 +1,7 @@
|
|||||||
from abc import ABC, abstractmethod
|
from abc import ABC, abstractmethod
|
||||||
|
from typing import Callable
|
||||||
|
|
||||||
|
from cpl_query.extension import List
|
||||||
from discord.ext.commands import Context
|
from discord.ext.commands import Context
|
||||||
|
|
||||||
|
|
||||||
@@ -14,6 +16,9 @@ class ClientUtilsServiceABC(ABC):
|
|||||||
@abstractmethod
|
@abstractmethod
|
||||||
def moved_user(self, guild_id: int): pass
|
def moved_user(self, guild_id: int): pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def moved_users(self, guild_id: int, count: int): pass
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def get_client(self, dc_ic: int, guild_id: int): pass
|
def get_client(self, dc_ic: int, guild_id: int): pass
|
||||||
|
|
||||||
@@ -25,3 +30,6 @@ class ClientUtilsServiceABC(ABC):
|
|||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
async def presence_game(self, t_key: str): pass
|
async def presence_game(self, t_key: str): pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def get_auto_complete_list(self, _l: List, current: str, select: Callable = None) -> List: pass
|
||||||
|
@@ -13,10 +13,14 @@ class CustomFileLoggerABC(Logger, ABC):
|
|||||||
@abstractmethod
|
@abstractmethod
|
||||||
def __init__(self, key: str, config: ConfigurationABC, time_format: TimeFormatSettings, env: ApplicationEnvironmentABC):
|
def __init__(self, key: str, config: ConfigurationABC, time_format: TimeFormatSettings, env: ApplicationEnvironmentABC):
|
||||||
self._key = key
|
self._key = key
|
||||||
settings: LoggingSettings = config.get_configuration(f'{FileLoggingSettings.__name__}_{key}')
|
self._settings: LoggingSettings = config.get_configuration(f'{FileLoggingSettings.__name__}_{key}')
|
||||||
Logger.__init__(self, settings, time_format, env)
|
Logger.__init__(self, self._settings, time_format, env)
|
||||||
self._begin_log()
|
self._begin_log()
|
||||||
|
|
||||||
|
@property
|
||||||
|
def settings(self) -> LoggingSettings:
|
||||||
|
return self._settings
|
||||||
|
|
||||||
def _begin_log(self):
|
def _begin_log(self):
|
||||||
console_level = self._console.value
|
console_level = self._console.value
|
||||||
self._console = LoggingLevelEnum.OFF
|
self._console = LoggingLevelEnum.OFF
|
||||||
|
@@ -25,7 +25,7 @@ class MessageServiceABC(ABC):
|
|||||||
async def send_dm_message(self, message: Union[str, discord.Embed], receiver: Union[discord.User, discord.Member], without_tracking=False): pass
|
async def send_dm_message(self, message: Union[str, discord.Embed], receiver: Union[discord.User, discord.Member], without_tracking=False): pass
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
async def send_ctx_msg(self, ctx: Context, message: Union[str, discord.Embed], file: discord.File = None, is_persistent: bool = False, wait_before_delete: int = None, without_tracking=True): pass
|
async def send_ctx_msg(self, ctx: Context, message: Union[str, discord.Embed], file: discord.File = None, is_persistent: bool = False, is_public: bool = False, wait_before_delete: int = None, without_tracking=True): pass
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
async def send_interaction_msg(self, interaction: Interaction, message: Union[str, discord.Embed], is_persistent: bool = False, wait_before_delete: int = None, without_tracking=True): pass
|
async def send_interaction_msg(self, interaction: Interaction, message: Union[str, discord.Embed], is_persistent: bool = False, is_public: bool = False, wait_before_delete: int = None, without_tracking=True, **kwargs): pass
|
||||||
|
@@ -4,7 +4,7 @@
|
|||||||
"Version": {
|
"Version": {
|
||||||
"Major": "0",
|
"Major": "0",
|
||||||
"Minor": "3",
|
"Minor": "3",
|
||||||
"Micro": "dev70"
|
"Micro": "0"
|
||||||
},
|
},
|
||||||
"Author": "Sven Heidemann",
|
"Author": "Sven Heidemann",
|
||||||
"AuthorEmail": "sven.heidemann@sh-edraft.de",
|
"AuthorEmail": "sven.heidemann@sh-edraft.de",
|
||||||
@@ -16,10 +16,10 @@
|
|||||||
"LicenseName": "MIT",
|
"LicenseName": "MIT",
|
||||||
"LicenseDescription": "MIT, see LICENSE for more details.",
|
"LicenseDescription": "MIT, see LICENSE for more details.",
|
||||||
"Dependencies": [
|
"Dependencies": [
|
||||||
"cpl-core>=0.3.dev70"
|
"cpl-core==2022.12.0"
|
||||||
],
|
],
|
||||||
"DevDependencies": [
|
"DevDependencies": [
|
||||||
"cpl-cli==2022.10.0"
|
"cpl-cli==2022.12.0"
|
||||||
],
|
],
|
||||||
"PythonVersion": ">=3.10.4",
|
"PythonVersion": ">=3.10.4",
|
||||||
"PythonPath": {},
|
"PythonPath": {},
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'bot_core.configuration'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'bot_core.core_extension'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'bot_core.events'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
@@ -0,0 +1,26 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
"""
|
||||||
|
bot Keksdose bot
|
||||||
|
~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Discord bot for the Keksdose discord Server
|
||||||
|
|
||||||
|
:copyright: (c) 2022 sh-edraft.de
|
||||||
|
:license: MIT, see LICENSE for more details.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
__title__ = 'bot_core.exception'
|
||||||
|
__author__ = 'Sven Heidemann'
|
||||||
|
__license__ = 'MIT'
|
||||||
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
|
from collections import namedtuple
|
||||||
|
|
||||||
|
|
||||||
|
# imports:
|
||||||
|
|
||||||
|
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||||
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'bot_core.helper'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'bot_core.logging'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'bot_core.pipes'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'bot_core.service'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
@@ -1,10 +1,14 @@
|
|||||||
|
from typing import Callable
|
||||||
|
|
||||||
import discord
|
import discord
|
||||||
from cpl_core.configuration import ConfigurationABC
|
from cpl_core.configuration import ConfigurationABC
|
||||||
from cpl_core.database.context import DatabaseContextABC
|
from cpl_core.database.context import DatabaseContextABC
|
||||||
from cpl_core.logging import LoggerABC
|
from cpl_core.logging import LoggerABC
|
||||||
|
|
||||||
from cpl_discord.service import DiscordBotServiceABC
|
from cpl_discord.service import DiscordBotServiceABC
|
||||||
|
from cpl_query.extension import List
|
||||||
from cpl_translation import TranslatePipe
|
from cpl_translation import TranslatePipe
|
||||||
|
from discord import app_commands
|
||||||
from discord.ext.commands import Context
|
from discord.ext.commands import Context
|
||||||
|
|
||||||
from bot_core.abc.client_utils_service_abc import ClientUtilsServiceABC
|
from bot_core.abc.client_utils_service_abc import ClientUtilsServiceABC
|
||||||
@@ -54,6 +58,13 @@ class ClientUtilsService(ClientUtilsServiceABC):
|
|||||||
self._clients.update_client(client)
|
self._clients.update_client(client)
|
||||||
self._db.save_changes()
|
self._db.save_changes()
|
||||||
|
|
||||||
|
def moved_users(self, guild_id: int, count: int):
|
||||||
|
server = self._servers.get_server_by_discord_id(guild_id)
|
||||||
|
client = self._clients.find_client_by_discord_id_and_server_id(self._bot.user.id, server.server_id)
|
||||||
|
client.moved_users_count += count
|
||||||
|
self._clients.update_client(client)
|
||||||
|
self._db.save_changes()
|
||||||
|
|
||||||
def get_client(self, dc_ic: int, guild_id: int):
|
def get_client(self, dc_ic: int, guild_id: int):
|
||||||
server = self._servers.get_server_by_discord_id(guild_id)
|
server = self._servers.get_server_by_discord_id(guild_id)
|
||||||
client = self._clients.find_client_by_discord_id_and_server_id(self._bot.user.id, server.server_id)
|
client = self._clients.find_client_by_discord_id_and_server_id(self._bot.user.id, server.server_id)
|
||||||
@@ -81,3 +92,17 @@ class ClientUtilsService(ClientUtilsServiceABC):
|
|||||||
name = self._t.transform(t_key).format(bot.__version__)
|
name = self._t.transform(t_key).format(bot.__version__)
|
||||||
await self._bot.change_presence(activity=discord.Game(name=name))
|
await self._bot.change_presence(activity=discord.Game(name=name))
|
||||||
self._logger.info(__name__, f'Set presence {name}')
|
self._logger.info(__name__, f'Set presence {name}')
|
||||||
|
|
||||||
|
def get_auto_complete_list(self, _l: List, current: str, select: Callable = None) -> List:
|
||||||
|
if current != '':
|
||||||
|
if select is None:
|
||||||
|
select = lambda x: x
|
||||||
|
|
||||||
|
sl = _l.select(select)
|
||||||
|
sl = sl.where(lambda x: current in x)
|
||||||
|
if current in sl:
|
||||||
|
sl = sl.skip(sl.index_of(current))
|
||||||
|
|
||||||
|
_l = _l.where(lambda x: x.name in sl)
|
||||||
|
|
||||||
|
return _l.take(25)
|
||||||
|
@@ -89,7 +89,7 @@ class MessageService(MessageServiceABC):
|
|||||||
self._db.save_changes()
|
self._db.save_changes()
|
||||||
self._logger.info(__name__, f'Sent message to user {receiver.id}')
|
self._logger.info(__name__, f'Sent message to user {receiver.id}')
|
||||||
|
|
||||||
async def send_ctx_msg(self, ctx: Context, message: Union[str, discord.Embed], file: discord.File = None, is_persistent: bool = False, wait_before_delete: int = None, without_tracking=False):
|
async def send_ctx_msg(self, ctx: Context, message: Union[str, discord.Embed], file: discord.File = None, is_persistent: bool = False, is_public: bool = False, wait_before_delete: int = None, without_tracking=False):
|
||||||
if ctx is None:
|
if ctx is None:
|
||||||
self._logger.warn(__name__, 'Message context is empty')
|
self._logger.warn(__name__, 'Message context is empty')
|
||||||
self._logger.debug(__name__, f'Message: {message}')
|
self._logger.debug(__name__, f'Message: {message}')
|
||||||
@@ -99,9 +99,9 @@ class MessageService(MessageServiceABC):
|
|||||||
msg = None
|
msg = None
|
||||||
try:
|
try:
|
||||||
if isinstance(message, discord.Embed):
|
if isinstance(message, discord.Embed):
|
||||||
msg = await ctx.send(embed=message, file=file)
|
msg = await ctx.send(embed=message, file=file, ephemeral=not is_public)
|
||||||
else:
|
else:
|
||||||
msg = await ctx.send(message, file=file)
|
msg = await ctx.send(message, file=file, ephemeral=not is_public)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self._logger.error(__name__, f'Send message to channel {ctx.channel.id} failed', e)
|
self._logger.error(__name__, f'Send message to channel {ctx.channel.id} failed', e)
|
||||||
else:
|
else:
|
||||||
@@ -119,7 +119,7 @@ class MessageService(MessageServiceABC):
|
|||||||
if ctx.guild is not None:
|
if ctx.guild is not None:
|
||||||
await self.delete_message(msg, without_tracking)
|
await self.delete_message(msg, without_tracking)
|
||||||
|
|
||||||
async def send_interaction_msg(self, interaction: Interaction, message: Union[str, discord.Embed], is_persistent: bool = False, wait_before_delete: int = None, without_tracking=False):
|
async def send_interaction_msg(self, interaction: Interaction, message: Union[str, discord.Embed], is_persistent: bool = False, is_public: bool = False, wait_before_delete: int = None, without_tracking=False, **kwargs):
|
||||||
if interaction is None:
|
if interaction is None:
|
||||||
self._logger.warn(__name__, 'Message context is empty')
|
self._logger.warn(__name__, 'Message context is empty')
|
||||||
self._logger.debug(__name__, f'Message: {message}')
|
self._logger.debug(__name__, f'Message: {message}')
|
||||||
@@ -128,9 +128,9 @@ class MessageService(MessageServiceABC):
|
|||||||
self._logger.debug(__name__, f'Try to send message\t\t{message}\n\tto: {interaction.channel}')
|
self._logger.debug(__name__, f'Try to send message\t\t{message}\n\tto: {interaction.channel}')
|
||||||
try:
|
try:
|
||||||
if isinstance(message, discord.Embed):
|
if isinstance(message, discord.Embed):
|
||||||
await interaction.response.send_message(embed=message)
|
await interaction.response.send_message(embed=message, ephemeral=not is_public, **kwargs)
|
||||||
else:
|
else:
|
||||||
await interaction.response.send_message(message)
|
await interaction.response.send_message(message, ephemeral=not is_public, **kwargs)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self._logger.error(__name__, f'Send message to channel {interaction.channel.id} failed', e)
|
self._logger.error(__name__, f'Send message to channel {interaction.channel.id} failed', e)
|
||||||
else:
|
else:
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'bot_data'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
@@ -11,11 +11,11 @@ Discord bot for the Keksdose discord Server
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
__title__ = 'bot_data.service'
|
__title__ = 'bot_data.abc'
|
||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
@@ -35,3 +35,6 @@ class UserJoinedVoiceChannelRepositoryABC(ABC):
|
|||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def delete_user_joined_voice_channel(self, user_joined_voice_channel: UserJoinedVoiceChannel): pass
|
def delete_user_joined_voice_channel(self, user_joined_voice_channel: UserJoinedVoiceChannel): pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def delete_user_joined_voice_channel_by_user_id(self, user_id: int): pass
|
||||||
|
@@ -4,7 +4,7 @@
|
|||||||
"Version": {
|
"Version": {
|
||||||
"Major": "0",
|
"Major": "0",
|
||||||
"Minor": "3",
|
"Minor": "3",
|
||||||
"Micro": "dev70"
|
"Micro": "0"
|
||||||
},
|
},
|
||||||
"Author": "Sven Heidemann",
|
"Author": "Sven Heidemann",
|
||||||
"AuthorEmail": "sven.heidemann@sh-edraft.de",
|
"AuthorEmail": "sven.heidemann@sh-edraft.de",
|
||||||
@@ -16,10 +16,10 @@
|
|||||||
"LicenseName": "MIT",
|
"LicenseName": "MIT",
|
||||||
"LicenseDescription": "MIT, see LICENSE for more details.",
|
"LicenseDescription": "MIT, see LICENSE for more details.",
|
||||||
"Dependencies": [
|
"Dependencies": [
|
||||||
"cpl-core>=0.3.dev70"
|
"cpl-core==2022.12.0"
|
||||||
],
|
],
|
||||||
"DevDependencies": [
|
"DevDependencies": [
|
||||||
"cpl-cli==2022.10.0"
|
"cpl-cli==2022.12.0"
|
||||||
],
|
],
|
||||||
"PythonVersion": ">=3.10.4",
|
"PythonVersion": ">=3.10.4",
|
||||||
"PythonPath": {},
|
"PythonPath": {},
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'bot_data.migration'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
29
kdb-bot/src/bot_data/migration/auto_role_fix1_migration.py
Normal file
29
kdb-bot/src/bot_data/migration/auto_role_fix1_migration.py
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
from bot_core.logging.database_logger import DatabaseLogger
|
||||||
|
from bot_data.abc.migration_abc import MigrationABC
|
||||||
|
from bot_data.db_context import DBContext
|
||||||
|
|
||||||
|
|
||||||
|
class AutoRoleFix1Migration(MigrationABC):
|
||||||
|
name = '0.3.0_AutoRoleMigration'
|
||||||
|
|
||||||
|
def __init__(self, logger: DatabaseLogger, db: DBContext):
|
||||||
|
MigrationABC.__init__(self)
|
||||||
|
self._logger = logger
|
||||||
|
self._db = db
|
||||||
|
self._cursor = db.cursor
|
||||||
|
|
||||||
|
def upgrade(self):
|
||||||
|
self._logger.debug(__name__, 'Running upgrade')
|
||||||
|
|
||||||
|
self._cursor.execute(
|
||||||
|
str(f"""
|
||||||
|
ALTER TABLE AutoRoles ADD DiscordChannelId BIGINT NOT NULL AFTER ServerId;
|
||||||
|
""")
|
||||||
|
)
|
||||||
|
|
||||||
|
def downgrade(self):
|
||||||
|
self._cursor.execute(
|
||||||
|
str(f"""
|
||||||
|
ALTER TABLE AutoRoles DROP COLUMN DiscordChannelId;
|
||||||
|
""")
|
||||||
|
)
|
@@ -15,7 +15,7 @@ __title__ = 'bot_data.model'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
@@ -6,9 +6,10 @@ from cpl_core.database import TableABC
|
|||||||
|
|
||||||
class AutoRole(TableABC):
|
class AutoRole(TableABC):
|
||||||
|
|
||||||
def __init__(self, server_id: int, dc_message_id: int, created_at: datetime=None, modified_at: datetime=None, id=0):
|
def __init__(self, server_id: int, dc_channel_id: int, dc_message_id: int, created_at: datetime=None, modified_at: datetime=None, id=0):
|
||||||
self._auto_role_id = id
|
self._auto_role_id = id
|
||||||
self._server_id = server_id
|
self._server_id = server_id
|
||||||
|
self._discord_channel_id = dc_channel_id
|
||||||
self._discord_message_id = dc_message_id
|
self._discord_message_id = dc_message_id
|
||||||
|
|
||||||
TableABC.__init__(self)
|
TableABC.__init__(self)
|
||||||
@@ -23,6 +24,10 @@ class AutoRole(TableABC):
|
|||||||
def server_id(self) -> int:
|
def server_id(self) -> int:
|
||||||
return self._server_id
|
return self._server_id
|
||||||
|
|
||||||
|
@property
|
||||||
|
def discord_channel_id(self) -> int:
|
||||||
|
return self._discord_channel_id
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def discord_message_id(self) -> int:
|
def discord_message_id(self) -> int:
|
||||||
return self._discord_message_id
|
return self._discord_message_id
|
||||||
@@ -58,9 +63,10 @@ class AutoRole(TableABC):
|
|||||||
def insert_string(self) -> str:
|
def insert_string(self) -> str:
|
||||||
return str(f"""
|
return str(f"""
|
||||||
INSERT INTO `AutoRoles` (
|
INSERT INTO `AutoRoles` (
|
||||||
`ServerId`, `DiscordMessageId`, `CreatedAt`, `LastModifiedAt`
|
`ServerId`, `DiscordChannelId`, `DiscordMessageId`, `CreatedAt`, `LastModifiedAt`
|
||||||
) VALUES (
|
) VALUES (
|
||||||
{self._server_id},
|
{self._server_id},
|
||||||
|
{self._discord_channel_id},
|
||||||
{self._discord_message_id},
|
{self._discord_message_id},
|
||||||
'{self._created_at}',
|
'{self._created_at}',
|
||||||
'{self._modified_at}'
|
'{self._modified_at}'
|
||||||
@@ -72,6 +78,7 @@ class AutoRole(TableABC):
|
|||||||
return str(f"""
|
return str(f"""
|
||||||
UPDATE `AutoRoles`
|
UPDATE `AutoRoles`
|
||||||
SET `ServerId` = {self._server_id},
|
SET `ServerId` = {self._server_id},
|
||||||
|
`DiscordChannelId` = {self._discord_channel_id},
|
||||||
`DiscordMessageId` = {self._discord_message_id},
|
`DiscordMessageId` = {self._discord_message_id},
|
||||||
`LastModifiedAt` = '{self._modified_at}'
|
`LastModifiedAt` = '{self._modified_at}'
|
||||||
WHERE `AutoRoleId` = {self._auto_role_id};
|
WHERE `AutoRoleId` = {self._auto_role_id};
|
||||||
|
@@ -119,3 +119,10 @@ class UserJoinedVoiceChannel(TableABC):
|
|||||||
DELETE FROM `UserJoinedVoiceChannel`
|
DELETE FROM `UserJoinedVoiceChannel`
|
||||||
WHERE `JoinId` = {self._join_id};
|
WHERE `JoinId` = {self._join_id};
|
||||||
""")
|
""")
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def delete_by_user_id_string(id: int) -> str:
|
||||||
|
return str(f"""
|
||||||
|
DELETE FROM `UserJoinedVoiceChannel`
|
||||||
|
WHERE `UserId` = {id}
|
||||||
|
""")
|
@@ -15,7 +15,7 @@ __title__ = 'bot_data.service'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
@@ -27,6 +27,7 @@ class AutoRoleRepositoryService(AutoRoleRepositoryABC):
|
|||||||
result[2],
|
result[2],
|
||||||
result[3],
|
result[3],
|
||||||
result[4],
|
result[4],
|
||||||
|
result[5],
|
||||||
id=result[0]
|
id=result[0]
|
||||||
))
|
))
|
||||||
|
|
||||||
@@ -40,6 +41,7 @@ class AutoRoleRepositoryService(AutoRoleRepositoryABC):
|
|||||||
result[2],
|
result[2],
|
||||||
result[3],
|
result[3],
|
||||||
result[4],
|
result[4],
|
||||||
|
result[5],
|
||||||
id=result[0]
|
id=result[0]
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -56,6 +58,7 @@ class AutoRoleRepositoryService(AutoRoleRepositoryABC):
|
|||||||
result[2],
|
result[2],
|
||||||
result[3],
|
result[3],
|
||||||
result[4],
|
result[4],
|
||||||
|
result[5],
|
||||||
id=result[0]
|
id=result[0]
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -69,6 +72,7 @@ class AutoRoleRepositoryService(AutoRoleRepositoryABC):
|
|||||||
result[2],
|
result[2],
|
||||||
result[3],
|
result[3],
|
||||||
result[4],
|
result[4],
|
||||||
|
result[5],
|
||||||
id=result[0]
|
id=result[0]
|
||||||
))
|
))
|
||||||
|
|
||||||
@@ -82,6 +86,7 @@ class AutoRoleRepositoryService(AutoRoleRepositoryABC):
|
|||||||
result[2],
|
result[2],
|
||||||
result[3],
|
result[3],
|
||||||
result[4],
|
result[4],
|
||||||
|
result[5],
|
||||||
id=result[0]
|
id=result[0]
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -98,6 +103,7 @@ class AutoRoleRepositoryService(AutoRoleRepositoryABC):
|
|||||||
result[2],
|
result[2],
|
||||||
result[3],
|
result[3],
|
||||||
result[4],
|
result[4],
|
||||||
|
result[5],
|
||||||
id=result[0]
|
id=result[0]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@@ -121,3 +121,7 @@ class UserJoinedVoiceChannelRepositoryService(UserJoinedVoiceChannelRepositoryAB
|
|||||||
def delete_user_joined_voice_channel(self, user_joined_voice_channel: UserJoinedVoiceChannel):
|
def delete_user_joined_voice_channel(self, user_joined_voice_channel: UserJoinedVoiceChannel):
|
||||||
self._logger.trace(__name__, f'Send SQL command: {user_joined_voice_channel.delete_string}')
|
self._logger.trace(__name__, f'Send SQL command: {user_joined_voice_channel.delete_string}')
|
||||||
self._context.cursor.execute(user_joined_voice_channel.delete_string)
|
self._context.cursor.execute(user_joined_voice_channel.delete_string)
|
||||||
|
|
||||||
|
def delete_user_joined_voice_channel_by_user_id(self, user_id: int):
|
||||||
|
self._logger.trace(__name__, f'Send SQL command: {UserJoinedVoiceChannel.delete_by_user_id_string}')
|
||||||
|
self._context.cursor.execute(UserJoinedVoiceChannel.delete_by_user_id_string(user_id))
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'modules.auto_role'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
@@ -2,8 +2,8 @@
|
|||||||
"ProjectSettings": {
|
"ProjectSettings": {
|
||||||
"Name": "auto-role",
|
"Name": "auto-role",
|
||||||
"Version": {
|
"Version": {
|
||||||
"Major": "1",
|
"Major": "0",
|
||||||
"Minor": "0",
|
"Minor": "3",
|
||||||
"Micro": "0"
|
"Micro": "0"
|
||||||
},
|
},
|
||||||
"Author": "",
|
"Author": "",
|
||||||
@@ -16,10 +16,10 @@
|
|||||||
"LicenseName": "",
|
"LicenseName": "",
|
||||||
"LicenseDescription": "",
|
"LicenseDescription": "",
|
||||||
"Dependencies": [
|
"Dependencies": [
|
||||||
"cpl-core>=2022.10.0.post5"
|
"cpl-core==2022.12.0"
|
||||||
],
|
],
|
||||||
"DevDependencies": [
|
"DevDependencies": [
|
||||||
"cpl-cli==2022.10.0"
|
"cpl-cli==2022.12.0"
|
||||||
],
|
],
|
||||||
"PythonVersion": ">=3.10.4",
|
"PythonVersion": ">=3.10.4",
|
||||||
"PythonPath": {},
|
"PythonPath": {},
|
||||||
|
@@ -9,7 +9,7 @@ from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
|
|||||||
from modules.auto_role.command.auto_role_group import AutoRoleGroup
|
from modules.auto_role.command.auto_role_group import AutoRoleGroup
|
||||||
from modules.auto_role.events.auto_role_on_raw_reaction_add import AutoRoleOnRawReactionAddEvent
|
from modules.auto_role.events.auto_role_on_raw_reaction_add import AutoRoleOnRawReactionAddEvent
|
||||||
from modules.auto_role.events.auto_role_on_raw_reaction_remove import AutoRoleOnRawReactionRemoveEvent
|
from modules.auto_role.events.auto_role_on_raw_reaction_remove import AutoRoleOnRawReactionRemoveEvent
|
||||||
from modules.auto_role.helper.reaction_handler import ReactionHandler
|
from modules.auto_role.helper.auto_role_reaction_handler import AutoRoleReactionHandler
|
||||||
|
|
||||||
|
|
||||||
class AutoRoleModule(ModuleABC):
|
class AutoRoleModule(ModuleABC):
|
||||||
@@ -21,7 +21,7 @@ class AutoRoleModule(ModuleABC):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
def configure_services(self, services: ServiceCollectionABC, env: ApplicationEnvironmentABC):
|
def configure_services(self, services: ServiceCollectionABC, env: ApplicationEnvironmentABC):
|
||||||
services.add_transient(ReactionHandler)
|
services.add_transient(AutoRoleReactionHandler)
|
||||||
# commands
|
# commands
|
||||||
self._dc.add_command(AutoRoleGroup)
|
self._dc.add_command(AutoRoleGroup)
|
||||||
# events
|
# events
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'modules.auto_role.command'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
from typing import List as TList, Optional
|
from typing import List as TList, Optional, Any
|
||||||
|
|
||||||
import discord
|
import discord
|
||||||
from cpl_core.database.context import DatabaseContextABC
|
from cpl_core.database.context import DatabaseContextABC
|
||||||
@@ -50,6 +50,11 @@ class AutoRoleGroup(DiscordCommandABC):
|
|||||||
|
|
||||||
self._logger.trace(__name__, f'Loaded command service: {type(self).__name__}')
|
self._logger.trace(__name__, f'Loaded command service: {type(self).__name__}')
|
||||||
|
|
||||||
|
async def _auto_role_auto_complete(self, interaction: discord.Interaction, current: str) -> TList[app_commands.Choice[str]]:
|
||||||
|
server = self._servers.get_server_by_discord_id(interaction.guild.id)
|
||||||
|
auto_roles = self._auto_roles.get_auto_roles_by_server_id(server.server_id).select(lambda x: x.auto_role_id)
|
||||||
|
return [app_commands.Choice(name=auto_role, value=auto_role) for auto_role in self._client_utils.get_auto_complete_list(auto_roles, current)]
|
||||||
|
|
||||||
@commands.hybrid_group(name="auto-role")
|
@commands.hybrid_group(name="auto-role")
|
||||||
@commands.guild_only()
|
@commands.guild_only()
|
||||||
async def auto_role(self, ctx: Context):
|
async def auto_role(self, ctx: Context):
|
||||||
@@ -98,7 +103,7 @@ class AutoRoleGroup(DiscordCommandABC):
|
|||||||
message = List(discord.Message, [message async for message in channel.history(limit=50)]).where(lambda m: m.id == int(message_id)).single_or_default()
|
message = List(discord.Message, [message async for message in channel.history(limit=50)]).where(lambda m: m.id == int(message_id)).single_or_default()
|
||||||
if message is None:
|
if message is None:
|
||||||
self._logger.debug(__name__, f'Message with id {message_id} not found in {channel.name}')
|
self._logger.debug(__name__, f'Message with id {message_id} not found in {channel.name}')
|
||||||
await self._message_service.send_ctx_msg(ctx, self._t.transform('modules.auto_role.add.error.not_found').format(message_id, channel.name))
|
await self._message_service.send_ctx_msg(ctx, self._t.transform('modules.auto_role.add.error.not_found').format(message_id, channel.mention))
|
||||||
self._logger.trace(__name__, f'Finished command auto-role add')
|
self._logger.trace(__name__, f'Finished command auto-role add')
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -109,7 +114,7 @@ class AutoRoleGroup(DiscordCommandABC):
|
|||||||
return
|
return
|
||||||
|
|
||||||
server_id = self._servers.get_server_by_discord_id(ctx.guild.id).server_id
|
server_id = self._servers.get_server_by_discord_id(ctx.guild.id).server_id
|
||||||
self._auto_roles.add_auto_role(AutoRole(server_id, int(message_id)))
|
self._auto_roles.add_auto_role(AutoRole(server_id, int(channel.id), int(message_id)))
|
||||||
self._db_context.save_changes()
|
self._db_context.save_changes()
|
||||||
self._logger.info(__name__, f'Saved auto-role for message {message_id} at server {server_id}')
|
self._logger.info(__name__, f'Saved auto-role for message {message_id} at server {server_id}')
|
||||||
await self._message_service.send_ctx_msg(ctx, self._t.transform('modules.auto_role.add.success').format(message_id))
|
await self._message_service.send_ctx_msg(ctx, self._t.transform('modules.auto_role.add.success').format(message_id))
|
||||||
@@ -155,9 +160,7 @@ class AutoRoleGroup(DiscordCommandABC):
|
|||||||
|
|
||||||
@remove.autocomplete('auto_role')
|
@remove.autocomplete('auto_role')
|
||||||
async def remove_autocomplete(self, interaction: discord.Interaction, current: str) -> TList[app_commands.Choice[str]]:
|
async def remove_autocomplete(self, interaction: discord.Interaction, current: str) -> TList[app_commands.Choice[str]]:
|
||||||
server = self._servers.get_server_by_discord_id(interaction.guild.id)
|
return await self._auto_role_auto_complete(interaction, current)
|
||||||
auto_roles = self._auto_roles.get_auto_roles_by_server_id(server.server_id).select(lambda x: x.auto_role_id)
|
|
||||||
return [app_commands.Choice(name=auto_role, value=auto_role) for auto_role in auto_roles]
|
|
||||||
|
|
||||||
@auto_role.group()
|
@auto_role.group()
|
||||||
@commands.guild_only()
|
@commands.guild_only()
|
||||||
@@ -198,9 +201,7 @@ class AutoRoleGroup(DiscordCommandABC):
|
|||||||
|
|
||||||
@list.autocomplete('auto_role')
|
@list.autocomplete('auto_role')
|
||||||
async def list_autocomplete(self, interaction: discord.Interaction, current: str) -> TList[app_commands.Choice[str]]:
|
async def list_autocomplete(self, interaction: discord.Interaction, current: str) -> TList[app_commands.Choice[str]]:
|
||||||
server = self._servers.get_server_by_discord_id(interaction.guild.id)
|
return await self._auto_role_auto_complete(interaction, current)
|
||||||
auto_roles = self._auto_roles.get_auto_roles_by_server_id(server.server_id).select(lambda x: x.auto_role_id)
|
|
||||||
return [app_commands.Choice(name=auto_role, value=auto_role) for auto_role in auto_roles]
|
|
||||||
|
|
||||||
@rule.command()
|
@rule.command()
|
||||||
@commands.guild_only()
|
@commands.guild_only()
|
||||||
@@ -238,8 +239,9 @@ class AutoRoleGroup(DiscordCommandABC):
|
|||||||
self._db_context.save_changes()
|
self._db_context.save_changes()
|
||||||
rule = self._auto_roles.get_auto_role_rules_by_auto_role_id(auto_role).where(lambda r: r.emoji_name == emoji.name and int(role_id) == role.id).single()
|
rule = self._auto_roles.get_auto_role_rules_by_auto_role_id(auto_role).where(lambda r: r.emoji_name == emoji.name and int(role_id) == role.id).single()
|
||||||
try:
|
try:
|
||||||
message = await ctx.fetch_message(auto_role_from_db.discord_message_id)
|
|
||||||
guild: Guild = self._bot.guilds.where(lambda g: g == ctx.guild).single()
|
guild: Guild = self._bot.guilds.where(lambda g: g == ctx.guild).single()
|
||||||
|
channel = guild.get_channel(auto_role_from_db.discord_channel_id)
|
||||||
|
message = await channel.fetch_message(auto_role_from_db.discord_message_id)
|
||||||
emoji = List(discord.Emoji, guild.emojis).where(lambda x: x.name == rule.emoji_name).single()
|
emoji = List(discord.Emoji, guild.emojis).where(lambda x: x.name == rule.emoji_name).single()
|
||||||
|
|
||||||
if emoji is None:
|
if emoji is None:
|
||||||
@@ -250,24 +252,22 @@ class AutoRoleGroup(DiscordCommandABC):
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
self._logger.error(__name__, f'Cannot add reaction {rule.emoji_name} to message: {auto_role_from_db.discord_message_id}', e)
|
self._logger.error(__name__, f'Cannot add reaction {rule.emoji_name} to message: {auto_role_from_db.discord_message_id}', e)
|
||||||
|
|
||||||
await self._message_service.send_ctx_msg(ctx, self._t.transform('modules.auto_role.rule.add.success').format(emoji, role.name, auto_role))
|
await self._message_service.send_ctx_msg(ctx, self._t.transform('modules.auto_role.rule.add.success').format(emoji, role.mention, auto_role))
|
||||||
self._logger.trace(__name__, f'Finished command auto-role rule add')
|
self._logger.trace(__name__, f'Finished command auto-role rule add')
|
||||||
|
|
||||||
@add.autocomplete('auto_role')
|
@add.autocomplete('auto_role')
|
||||||
async def add_autocomplete(self, interaction: discord.Interaction, current: str) -> TList[app_commands.Choice[str]]:
|
async def add_autocomplete(self, interaction: discord.Interaction, current: str) -> TList[app_commands.Choice[str]]:
|
||||||
server = self._servers.get_server_by_discord_id(interaction.guild.id)
|
return await self._auto_role_auto_complete(interaction, current)
|
||||||
auto_roles = self._auto_roles.get_auto_roles_by_server_id(server.server_id).select(lambda x: x.auto_role_id)
|
|
||||||
return [app_commands.Choice(name=auto_role, value=auto_role) for auto_role in auto_roles]
|
|
||||||
|
|
||||||
@add.autocomplete('emoji_name')
|
@add.autocomplete('emoji_name')
|
||||||
async def add_autocomplete(self, interaction: discord.Interaction, current: str) -> TList[app_commands.Choice[str]]:
|
async def add_autocomplete(self, interaction: discord.Interaction, current: str) -> TList[app_commands.Choice[str]]:
|
||||||
emojis = interaction.guild.emojis
|
emojis = List(discord.Emoji, interaction.guild.emojis)
|
||||||
return [app_commands.Choice(name=emoji.name, value=emoji.name) for emoji in emojis]
|
return [app_commands.Choice(name=emoji.name, value=emoji.name) for emoji in self._client_utils.get_auto_complete_list(emojis, current, lambda e: e.name)]
|
||||||
|
|
||||||
@add.autocomplete('role_id')
|
@add.autocomplete('role_id')
|
||||||
async def rule_add_autocomplete(self, interaction: discord.Interaction, current: str) -> TList[app_commands.Choice[str]]:
|
async def rule_add_autocomplete(self, interaction: discord.Interaction, current: str) -> TList[app_commands.Choice[str]]:
|
||||||
roles = interaction.guild.roles
|
roles = List(discord.Role, interaction.guild.roles)
|
||||||
return [app_commands.Choice(name=role.name, value=str(role.id)) for role in roles]
|
return [app_commands.Choice(name=role.name, value=str(role.id)) for role in self._client_utils.get_auto_complete_list(roles, current, lambda r: r.name)]
|
||||||
|
|
||||||
@rule.command()
|
@rule.command()
|
||||||
@commands.guild_only()
|
@commands.guild_only()
|
||||||
@@ -294,4 +294,10 @@ class AutoRoleGroup(DiscordCommandABC):
|
|||||||
server = self._servers.get_server_by_discord_id(interaction.guild.id)
|
server = self._servers.get_server_by_discord_id(interaction.guild.id)
|
||||||
auto_roles = self._auto_roles.get_auto_roles_by_server_id(server.server_id).select(lambda x: x.auto_role_id)
|
auto_roles = self._auto_roles.get_auto_roles_by_server_id(server.server_id).select(lambda x: x.auto_role_id)
|
||||||
rules = auto_roles.select_many(lambda ar: self._auto_roles.get_auto_role_rules_by_auto_role_id(ar))
|
rules = auto_roles.select_many(lambda ar: self._auto_roles.get_auto_role_rules_by_auto_role_id(ar))
|
||||||
return [app_commands.Choice(name=f'{rule.auto_role_rule_id} {rule.emoji_name} {interaction.guild.get_role(int(rule.role_id))}', value=rule.auto_role_rule_id) for rule in rules]
|
return [
|
||||||
|
app_commands.Choice(
|
||||||
|
name=f'{rule.auto_role_rule_id} {rule.emoji_name} {interaction.guild.get_role(int(rule.role_id))}',
|
||||||
|
value=rule.auto_role_rule_id
|
||||||
|
)
|
||||||
|
for rule in self._client_utils.get_auto_complete_list(rules, current, lambda r: r.auto_role_rule_id)
|
||||||
|
]
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'modules.auto_role.events'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
@@ -6,7 +6,7 @@ from discord import RawReactionActionEvent
|
|||||||
from bot_core.helper.event_checks import EventChecks
|
from bot_core.helper.event_checks import EventChecks
|
||||||
from bot_data.abc.auto_role_repository_abc import AutoRoleRepositoryABC
|
from bot_data.abc.auto_role_repository_abc import AutoRoleRepositoryABC
|
||||||
from bot_data.abc.server_repository_abc import ServerRepositoryABC
|
from bot_data.abc.server_repository_abc import ServerRepositoryABC
|
||||||
from modules.auto_role.helper.reaction_handler import ReactionHandler
|
from modules.auto_role.helper.auto_role_reaction_handler import AutoRoleReactionHandler
|
||||||
|
|
||||||
|
|
||||||
class AutoRoleOnRawReactionAddEvent(OnRawReactionAddABC):
|
class AutoRoleOnRawReactionAddEvent(OnRawReactionAddABC):
|
||||||
@@ -17,7 +17,7 @@ class AutoRoleOnRawReactionAddEvent(OnRawReactionAddABC):
|
|||||||
bot: DiscordBotServiceABC,
|
bot: DiscordBotServiceABC,
|
||||||
servers: ServerRepositoryABC,
|
servers: ServerRepositoryABC,
|
||||||
auto_roles: AutoRoleRepositoryABC,
|
auto_roles: AutoRoleRepositoryABC,
|
||||||
reaction_handler: ReactionHandler
|
reaction_handler: AutoRoleReactionHandler
|
||||||
):
|
):
|
||||||
OnRawReactionAddABC.__init__(self)
|
OnRawReactionAddABC.__init__(self)
|
||||||
|
|
||||||
|
@@ -6,7 +6,7 @@ from discord import RawReactionActionEvent
|
|||||||
from bot_core.helper.event_checks import EventChecks
|
from bot_core.helper.event_checks import EventChecks
|
||||||
from bot_data.abc.auto_role_repository_abc import AutoRoleRepositoryABC
|
from bot_data.abc.auto_role_repository_abc import AutoRoleRepositoryABC
|
||||||
from bot_data.abc.server_repository_abc import ServerRepositoryABC
|
from bot_data.abc.server_repository_abc import ServerRepositoryABC
|
||||||
from modules.auto_role.helper.reaction_handler import ReactionHandler
|
from modules.auto_role.helper.auto_role_reaction_handler import AutoRoleReactionHandler
|
||||||
|
|
||||||
|
|
||||||
class AutoRoleOnRawReactionRemoveEvent(OnRawReactionRemoveABC):
|
class AutoRoleOnRawReactionRemoveEvent(OnRawReactionRemoveABC):
|
||||||
@@ -17,7 +17,7 @@ class AutoRoleOnRawReactionRemoveEvent(OnRawReactionRemoveABC):
|
|||||||
bot: DiscordBotServiceABC,
|
bot: DiscordBotServiceABC,
|
||||||
servers: ServerRepositoryABC,
|
servers: ServerRepositoryABC,
|
||||||
auto_roles: AutoRoleRepositoryABC,
|
auto_roles: AutoRoleRepositoryABC,
|
||||||
reaction_handler: ReactionHandler
|
reaction_handler: AutoRoleReactionHandler
|
||||||
):
|
):
|
||||||
OnRawReactionRemoveABC.__init__(self)
|
OnRawReactionRemoveABC.__init__(self)
|
||||||
|
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'modules.auto_role.helper'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
@@ -10,7 +10,7 @@ from bot_data.model.auto_role import AutoRole
|
|||||||
from bot_data.model.auto_role_rule import AutoRoleRule
|
from bot_data.model.auto_role_rule import AutoRoleRule
|
||||||
|
|
||||||
|
|
||||||
class ReactionHandler:
|
class AutoRoleReactionHandler:
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
@@ -15,7 +15,7 @@ __title__ = 'modules.base'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
@@ -11,11 +11,11 @@ Discord bot for the Keksdose discord Server
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
__title__ = 'modules.base.service'
|
__title__ = 'modules.base.abc'
|
||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
@@ -2,8 +2,8 @@
|
|||||||
"ProjectSettings": {
|
"ProjectSettings": {
|
||||||
"Name": "base",
|
"Name": "base",
|
||||||
"Version": {
|
"Version": {
|
||||||
"Major": "1",
|
"Major": "0",
|
||||||
"Minor": "0",
|
"Minor": "3",
|
||||||
"Micro": "0"
|
"Micro": "0"
|
||||||
},
|
},
|
||||||
"Author": "",
|
"Author": "",
|
||||||
@@ -16,10 +16,10 @@
|
|||||||
"LicenseName": "",
|
"LicenseName": "",
|
||||||
"LicenseDescription": "",
|
"LicenseDescription": "",
|
||||||
"Dependencies": [
|
"Dependencies": [
|
||||||
"cpl-core>=2022.10.0.post2"
|
"cpl-core==2022.12.0"
|
||||||
],
|
],
|
||||||
"DevDependencies": [
|
"DevDependencies": [
|
||||||
"cpl-cli==2022.10.0"
|
"cpl-cli==2022.12.0"
|
||||||
],
|
],
|
||||||
"PythonVersion": ">=3.10.4",
|
"PythonVersion": ">=3.10.4",
|
||||||
"PythonPath": {},
|
"PythonPath": {},
|
||||||
|
@@ -10,17 +10,21 @@ from modules.base.abc.base_helper_abc import BaseHelperABC
|
|||||||
from modules.base.command.afk_command import AFKCommand
|
from modules.base.command.afk_command import AFKCommand
|
||||||
from modules.base.command.help_command import HelpCommand
|
from modules.base.command.help_command import HelpCommand
|
||||||
from modules.base.command.info_command import InfoCommand
|
from modules.base.command.info_command import InfoCommand
|
||||||
|
from modules.base.command.mass_move_command import MassMoveCommand
|
||||||
from modules.base.command.ping_command import PingCommand
|
from modules.base.command.ping_command import PingCommand
|
||||||
|
from modules.base.command.presence_command import PresenceCommand
|
||||||
from modules.base.command.purge_command import PurgeCommand
|
from modules.base.command.purge_command import PurgeCommand
|
||||||
from modules.base.command.restart_command import RestartCommand
|
|
||||||
from modules.base.command.shutdown_command import ShutdownCommand
|
|
||||||
from modules.base.command.user_group import UserGroup
|
from modules.base.command.user_group import UserGroup
|
||||||
from modules.base.events.base_on_command_error_event import BaseOnCommandErrorEvent
|
from modules.base.events.base_on_command_error_event import BaseOnCommandErrorEvent
|
||||||
from modules.base.events.base_on_command_event import BaseOnCommandEvent
|
from modules.base.events.base_on_command_event import BaseOnCommandEvent
|
||||||
from modules.base.events.base_on_member_join_event import BaseOnMemberJoinEvent
|
from modules.base.events.base_on_member_join_event import BaseOnMemberJoinEvent
|
||||||
from modules.base.events.base_on_member_remove_event import BaseOnMemberRemoveEvent
|
from modules.base.events.base_on_member_remove_event import BaseOnMemberRemoveEvent
|
||||||
from modules.base.events.base_on_message_event import BaseOnMessageEvent
|
from modules.base.events.base_on_message_event import BaseOnMessageEvent
|
||||||
|
from modules.base.events.base_on_raw_reaction_add import BaseOnRawReactionAddEvent
|
||||||
|
from modules.base.events.base_on_raw_reaction_remove import BaseOnRawReactionRemoveEvent
|
||||||
from modules.base.events.base_on_voice_state_update_event import BaseOnVoiceStateUpdateEvent
|
from modules.base.events.base_on_voice_state_update_event import BaseOnVoiceStateUpdateEvent
|
||||||
|
from modules.base.events.base_on_voice_state_update_event_help_channel import BaseOnVoiceStateUpdateEventHelpChannel
|
||||||
|
from modules.base.helper.base_reaction_handler import BaseReactionHandler
|
||||||
from modules.base.service.base_helper_service import BaseHelperService
|
from modules.base.service.base_helper_service import BaseHelperService
|
||||||
|
|
||||||
|
|
||||||
@@ -34,14 +38,15 @@ class BaseModule(ModuleABC):
|
|||||||
|
|
||||||
def configure_services(self, services: ServiceCollectionABC, env: ApplicationEnvironmentABC):
|
def configure_services(self, services: ServiceCollectionABC, env: ApplicationEnvironmentABC):
|
||||||
services.add_transient(BaseHelperABC, BaseHelperService)
|
services.add_transient(BaseHelperABC, BaseHelperService)
|
||||||
|
services.add_transient(BaseReactionHandler)
|
||||||
# commands
|
# commands
|
||||||
self._dc.add_command(AFKCommand)
|
self._dc.add_command(AFKCommand)
|
||||||
self._dc.add_command(HelpCommand)
|
self._dc.add_command(HelpCommand)
|
||||||
self._dc.add_command(InfoCommand)
|
self._dc.add_command(InfoCommand)
|
||||||
|
self._dc.add_command(MassMoveCommand)
|
||||||
self._dc.add_command(PingCommand)
|
self._dc.add_command(PingCommand)
|
||||||
|
self._dc.add_command(PresenceCommand)
|
||||||
|
|
||||||
self._dc.add_command(RestartCommand)
|
|
||||||
self._dc.add_command(ShutdownCommand)
|
|
||||||
self._dc.add_command(PurgeCommand)
|
self._dc.add_command(PurgeCommand)
|
||||||
self._dc.add_command(UserGroup)
|
self._dc.add_command(UserGroup)
|
||||||
# events
|
# events
|
||||||
@@ -50,4 +55,7 @@ class BaseModule(ModuleABC):
|
|||||||
self._dc.add_event(DiscordEventTypesEnum.on_member_join.value, BaseOnMemberJoinEvent)
|
self._dc.add_event(DiscordEventTypesEnum.on_member_join.value, BaseOnMemberJoinEvent)
|
||||||
self._dc.add_event(DiscordEventTypesEnum.on_member_remove.value, BaseOnMemberRemoveEvent)
|
self._dc.add_event(DiscordEventTypesEnum.on_member_remove.value, BaseOnMemberRemoveEvent)
|
||||||
self._dc.add_event(DiscordEventTypesEnum.on_message.value, BaseOnMessageEvent)
|
self._dc.add_event(DiscordEventTypesEnum.on_message.value, BaseOnMessageEvent)
|
||||||
|
self._dc.add_event(DiscordEventTypesEnum.on_raw_reaction_add.value, BaseOnRawReactionAddEvent)
|
||||||
|
self._dc.add_event(DiscordEventTypesEnum.on_raw_reaction_remove.value, BaseOnRawReactionRemoveEvent)
|
||||||
self._dc.add_event(DiscordEventTypesEnum.on_voice_state_update.value, BaseOnVoiceStateUpdateEvent)
|
self._dc.add_event(DiscordEventTypesEnum.on_voice_state_update.value, BaseOnVoiceStateUpdateEvent)
|
||||||
|
self._dc.add_event(DiscordEventTypesEnum.on_voice_state_update.value, BaseOnVoiceStateUpdateEventHelpChannel)
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'modules.base.command'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
@@ -42,7 +42,7 @@ class HelpCommand(DiscordCommandABC):
|
|||||||
self._logger.debug(__name__, f'Received command help {ctx}:{persistent_flag}')
|
self._logger.debug(__name__, f'Received command help {ctx}:{persistent_flag}')
|
||||||
settings: BaseServerSettings = self._config.get_configuration(f'BaseServerSettings_{ctx.guild.id}')
|
settings: BaseServerSettings = self._config.get_configuration(f'BaseServerSettings_{ctx.guild.id}')
|
||||||
is_persistent = persistent_flag == '--stay'
|
is_persistent = persistent_flag == '--stay'
|
||||||
await self._message_service.send_ctx_msg(ctx, settings.help_command_reference_url, is_persistent=is_persistent)
|
await self._message_service.send_ctx_msg(ctx, settings.help_command_reference_url, is_persistent=is_persistent, is_public=True)
|
||||||
self._logger.trace(__name__, f'Finished help command')
|
self._logger.trace(__name__, f'Finished help command')
|
||||||
|
|
||||||
@help.autocomplete('persistent_flag')
|
@help.autocomplete('persistent_flag')
|
||||||
|
54
kdb-bot/src/modules/base/command/mass_move_command.py
Normal file
54
kdb-bot/src/modules/base/command/mass_move_command.py
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
import asyncio
|
||||||
|
|
||||||
|
import discord
|
||||||
|
from cpl_discord.command import DiscordCommandABC
|
||||||
|
from cpl_discord.service import DiscordBotServiceABC
|
||||||
|
from cpl_translation import TranslatePipe
|
||||||
|
from discord.ext import commands
|
||||||
|
from discord.ext.commands import Context
|
||||||
|
|
||||||
|
from bot_core.abc.message_service_abc import MessageServiceABC
|
||||||
|
from bot_core.helper.command_checks import CommandChecks
|
||||||
|
from bot_core.logging.command_logger import CommandLogger
|
||||||
|
from bot_core.service.client_utils_service import ClientUtilsService
|
||||||
|
|
||||||
|
|
||||||
|
class MassMoveCommand(DiscordCommandABC):
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
logger: CommandLogger,
|
||||||
|
message_service: MessageServiceABC,
|
||||||
|
bot: DiscordBotServiceABC,
|
||||||
|
translate: TranslatePipe,
|
||||||
|
client_utils: ClientUtilsService
|
||||||
|
):
|
||||||
|
DiscordCommandABC.__init__(self)
|
||||||
|
self._logger = logger
|
||||||
|
self._message_service = message_service
|
||||||
|
self._bot = bot
|
||||||
|
self._t = translate
|
||||||
|
self._client_utils = client_utils
|
||||||
|
|
||||||
|
@commands.hybrid_command(name='mass-move')
|
||||||
|
@CommandChecks.check_is_ready()
|
||||||
|
@CommandChecks.check_is_member_moderator()
|
||||||
|
async def mass_move(self, ctx: Context, channel_to: discord.VoiceChannel,
|
||||||
|
channel_from: discord.VoiceChannel = None):
|
||||||
|
self._logger.debug(__name__, f'Received command mass-move {ctx}')
|
||||||
|
|
||||||
|
if channel_from is None and ctx.author.voice is None:
|
||||||
|
await self._message_service.send_ctx_msg(ctx, self._t.transform('modules.base.mass_move.channel_from_error'))
|
||||||
|
return
|
||||||
|
|
||||||
|
if channel_from is None:
|
||||||
|
channel_from = ctx.author.voice.channel
|
||||||
|
|
||||||
|
moves = [member.move_to(channel_to) for member in channel_from.members]
|
||||||
|
move_count = len(moves)
|
||||||
|
await asyncio.gather(*moves)
|
||||||
|
self._client_utils.moved_users(ctx.guild.id, move_count)
|
||||||
|
|
||||||
|
await self._message_service.send_ctx_msg(ctx, self._t.transform('modules.base.mass_move.moved').format(channel_from.mention, channel_to.mention))
|
||||||
|
|
||||||
|
self._logger.trace(__name__, f'Finished mass-move command')
|
@@ -1,3 +1,4 @@
|
|||||||
|
import discord
|
||||||
from cpl_discord.command import DiscordCommandABC
|
from cpl_discord.command import DiscordCommandABC
|
||||||
from cpl_discord.service import DiscordBotServiceABC
|
from cpl_discord.service import DiscordBotServiceABC
|
||||||
from cpl_translation import TranslatePipe
|
from cpl_translation import TranslatePipe
|
||||||
@@ -8,6 +9,10 @@ from bot_core.abc.client_utils_service_abc import ClientUtilsServiceABC
|
|||||||
from bot_core.abc.message_service_abc import MessageServiceABC
|
from bot_core.abc.message_service_abc import MessageServiceABC
|
||||||
from bot_core.helper.command_checks import CommandChecks
|
from bot_core.helper.command_checks import CommandChecks
|
||||||
from bot_core.logging.command_logger import CommandLogger
|
from bot_core.logging.command_logger import CommandLogger
|
||||||
|
from bot_data.abc.server_repository_abc import ServerRepositoryABC
|
||||||
|
from modules.base.abc.base_helper_abc import BaseHelperABC
|
||||||
|
from modules.base.configuration.base_server_settings import BaseServerSettings
|
||||||
|
from modules.permission.abc.permission_service_abc import PermissionServiceABC
|
||||||
|
|
||||||
|
|
||||||
class PingCommand(DiscordCommandABC):
|
class PingCommand(DiscordCommandABC):
|
||||||
@@ -18,7 +23,10 @@ class PingCommand(DiscordCommandABC):
|
|||||||
message_service: MessageServiceABC,
|
message_service: MessageServiceABC,
|
||||||
bot: DiscordBotServiceABC,
|
bot: DiscordBotServiceABC,
|
||||||
client_utils: ClientUtilsServiceABC,
|
client_utils: ClientUtilsServiceABC,
|
||||||
translate: TranslatePipe
|
translate: TranslatePipe,
|
||||||
|
permissions: PermissionServiceABC,
|
||||||
|
base_helper: BaseHelperABC,
|
||||||
|
servers: ServerRepositoryABC,
|
||||||
):
|
):
|
||||||
DiscordCommandABC.__init__(self)
|
DiscordCommandABC.__init__(self)
|
||||||
|
|
||||||
@@ -27,13 +35,34 @@ class PingCommand(DiscordCommandABC):
|
|||||||
self._bot = bot
|
self._bot = bot
|
||||||
self._client_utils = client_utils
|
self._client_utils = client_utils
|
||||||
self._t = translate
|
self._t = translate
|
||||||
|
self._permissions = permissions
|
||||||
|
self._base_helper = base_helper
|
||||||
|
self._servers = servers
|
||||||
|
|
||||||
self._logger.trace(__name__, f'Loaded command service: {type(self).__name__}')
|
self._logger.trace(__name__, f'Loaded command service: {type(self).__name__}')
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _get_ping(url: str) -> float:
|
||||||
|
from icmplib import ping
|
||||||
|
ping_result = ping(url, count=4, interval=0.2, privileged=False)
|
||||||
|
return ping_result.avg_rtt
|
||||||
|
|
||||||
@commands.hybrid_command()
|
@commands.hybrid_command()
|
||||||
@commands.guild_only()
|
@commands.guild_only()
|
||||||
@CommandChecks.check_is_ready()
|
@CommandChecks.check_is_ready()
|
||||||
async def ping(self, ctx: Context):
|
async def ping(self, ctx: Context):
|
||||||
self._logger.debug(__name__, f'Received command ping {ctx}')
|
self._logger.debug(__name__, f'Received command ping {ctx}')
|
||||||
await self._message_service.send_ctx_msg(ctx, self._t.transform('modules.base.pong'))
|
if self._permissions.is_member_technician(ctx.author):
|
||||||
|
embed = discord.Embed(
|
||||||
|
title=self._t.transform('modules.base.info.title'),
|
||||||
|
description=self._t.transform('modules.base.info.description'),
|
||||||
|
color=int('ef9d0d', 16)
|
||||||
|
)
|
||||||
|
server = self._servers.get_server_by_discord_id(ctx.guild.id)
|
||||||
|
settings: BaseServerSettings = self._base_helper.get_config(server.discord_server_id)
|
||||||
|
for server in settings.ping_urls:
|
||||||
|
embed.add_field(name=server, value=f'{self._get_ping(server)} ms', inline=False)
|
||||||
|
await self._message_service.send_ctx_msg(ctx, embed)
|
||||||
|
else:
|
||||||
|
await self._message_service.send_ctx_msg(ctx, self._t.transform('modules.base.pong'))
|
||||||
self._logger.trace(__name__, f'Finished ping command')
|
self._logger.trace(__name__, f'Finished ping command')
|
||||||
|
48
kdb-bot/src/modules/base/command/presence_command.py
Normal file
48
kdb-bot/src/modules/base/command/presence_command.py
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
import discord
|
||||||
|
from cpl_discord.command import DiscordCommandABC
|
||||||
|
from cpl_discord.service import DiscordBotServiceABC
|
||||||
|
from cpl_translation import TranslatePipe
|
||||||
|
from discord.ext import commands
|
||||||
|
from discord.ext.commands import Context
|
||||||
|
|
||||||
|
from bot_core.abc.message_service_abc import MessageServiceABC
|
||||||
|
from bot_core.helper.command_checks import CommandChecks
|
||||||
|
from bot_core.logging.command_logger import CommandLogger
|
||||||
|
|
||||||
|
|
||||||
|
class PresenceCommand(DiscordCommandABC):
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
logger: CommandLogger,
|
||||||
|
message_service: MessageServiceABC,
|
||||||
|
bot: DiscordBotServiceABC,
|
||||||
|
translate: TranslatePipe,
|
||||||
|
):
|
||||||
|
DiscordCommandABC.__init__(self)
|
||||||
|
|
||||||
|
self._logger = logger
|
||||||
|
self._message_service = message_service
|
||||||
|
self._bot = bot
|
||||||
|
self._t = translate
|
||||||
|
|
||||||
|
@commands.hybrid_command()
|
||||||
|
@commands.guild_only()
|
||||||
|
@CommandChecks.check_is_ready()
|
||||||
|
@CommandChecks.check_is_member_moderator()
|
||||||
|
async def presence(self, ctx: Context, text: str = ''):
|
||||||
|
self._logger.debug(__name__, f'Received command presence {ctx}')
|
||||||
|
|
||||||
|
if text == '':
|
||||||
|
await self._bot.change_presence(activity=None)
|
||||||
|
await self._message_service.send_ctx_msg(ctx, self._t.transform('modules.base.presence.removed'))
|
||||||
|
return
|
||||||
|
|
||||||
|
if len(text) > 128:
|
||||||
|
await self._message_service.send_ctx_msg(ctx, self._t.transform('modules.base.presence.max_char_count_exceeded'))
|
||||||
|
return
|
||||||
|
|
||||||
|
await self._bot.change_presence(activity=discord.Game(name=text))
|
||||||
|
await self._message_service.send_ctx_msg(ctx, self._t.transform('modules.base.presence.changed'))
|
||||||
|
|
||||||
|
self._logger.trace(__name__, f'Finished presence command')
|
@@ -1,12 +1,15 @@
|
|||||||
from typing import Optional
|
from typing import Optional, List
|
||||||
|
|
||||||
import discord
|
import discord
|
||||||
from cpl_core.configuration import ConfigurationABC
|
from cpl_core.configuration import ConfigurationABC
|
||||||
|
from cpl_core.database.context import DatabaseContextABC
|
||||||
from cpl_discord.command import DiscordCommandABC
|
from cpl_discord.command import DiscordCommandABC
|
||||||
from cpl_discord.service import DiscordBotServiceABC
|
from cpl_discord.service import DiscordBotServiceABC
|
||||||
from cpl_translation import TranslatePipe
|
from cpl_translation import TranslatePipe
|
||||||
|
from discord import app_commands
|
||||||
from discord.ext import commands
|
from discord.ext import commands
|
||||||
from discord.ext.commands import Context
|
from discord.ext.commands import Context
|
||||||
|
from mysql.connector.errors import DatabaseError
|
||||||
|
|
||||||
from bot_core.abc.client_utils_service_abc import ClientUtilsServiceABC
|
from bot_core.abc.client_utils_service_abc import ClientUtilsServiceABC
|
||||||
from bot_core.abc.message_service_abc import MessageServiceABC
|
from bot_core.abc.message_service_abc import MessageServiceABC
|
||||||
@@ -17,6 +20,7 @@ from bot_data.abc.server_repository_abc import ServerRepositoryABC
|
|||||||
from bot_data.abc.user_joined_server_repository_abc import UserJoinedServerRepositoryABC
|
from bot_data.abc.user_joined_server_repository_abc import UserJoinedServerRepositoryABC
|
||||||
from bot_data.abc.user_joined_voice_channel_abc import UserJoinedVoiceChannelRepositoryABC
|
from bot_data.abc.user_joined_voice_channel_abc import UserJoinedVoiceChannelRepositoryABC
|
||||||
from bot_data.abc.user_repository_abc import UserRepositoryABC
|
from bot_data.abc.user_repository_abc import UserRepositoryABC
|
||||||
|
from modules.level.service.level_service import LevelService
|
||||||
from modules.permission.abc.permission_service_abc import PermissionServiceABC
|
from modules.permission.abc.permission_service_abc import PermissionServiceABC
|
||||||
|
|
||||||
|
|
||||||
@@ -31,11 +35,13 @@ class UserGroup(DiscordCommandABC):
|
|||||||
client_utils: ClientUtilsServiceABC,
|
client_utils: ClientUtilsServiceABC,
|
||||||
permissions: PermissionServiceABC,
|
permissions: PermissionServiceABC,
|
||||||
servers: ServerRepositoryABC,
|
servers: ServerRepositoryABC,
|
||||||
|
db: DatabaseContextABC,
|
||||||
users: UserRepositoryABC,
|
users: UserRepositoryABC,
|
||||||
user_joined_servers: UserJoinedServerRepositoryABC,
|
user_joined_servers: UserJoinedServerRepositoryABC,
|
||||||
user_joined_voice_channel: UserJoinedVoiceChannelRepositoryABC,
|
user_joined_voice_channel: UserJoinedVoiceChannelRepositoryABC,
|
||||||
translate: TranslatePipe,
|
translate: TranslatePipe,
|
||||||
date: DateTimeOffsetPipe
|
date: DateTimeOffsetPipe,
|
||||||
|
level: LevelService
|
||||||
):
|
):
|
||||||
DiscordCommandABC.__init__(self)
|
DiscordCommandABC.__init__(self)
|
||||||
|
|
||||||
@@ -46,14 +52,23 @@ class UserGroup(DiscordCommandABC):
|
|||||||
self._client_utils = client_utils
|
self._client_utils = client_utils
|
||||||
self._permissions = permissions
|
self._permissions = permissions
|
||||||
self._servers = servers
|
self._servers = servers
|
||||||
|
self._db = db
|
||||||
self._users = users
|
self._users = users
|
||||||
self._user_joined_servers = user_joined_servers
|
self._user_joined_servers = user_joined_servers
|
||||||
self._user_joined_voice_channel = user_joined_voice_channel
|
self._user_joined_voice_channel = user_joined_voice_channel
|
||||||
self._t = translate
|
self._t = translate
|
||||||
self._date = date
|
self._date = date
|
||||||
|
self._level = level
|
||||||
|
|
||||||
self._logger.trace(__name__, f'Loaded command service: {type(self).__name__}')
|
self._logger.trace(__name__, f'Loaded command service: {type(self).__name__}')
|
||||||
|
|
||||||
|
self._atr_dict = {
|
||||||
|
"xp": self._t.transform('modules.base.user.atr.xp'),
|
||||||
|
'ontime': self._t.transform('modules.base.user.atr.ontime')
|
||||||
|
}
|
||||||
|
|
||||||
|
self._atr_list = [(key, self._atr_dict[key]) for key in self._atr_dict]
|
||||||
|
|
||||||
@commands.hybrid_group()
|
@commands.hybrid_group()
|
||||||
@commands.guild_only()
|
@commands.guild_only()
|
||||||
async def user(self, ctx: Context):
|
async def user(self, ctx: Context):
|
||||||
@@ -62,10 +77,14 @@ class UserGroup(DiscordCommandABC):
|
|||||||
@user.command()
|
@user.command()
|
||||||
@commands.guild_only()
|
@commands.guild_only()
|
||||||
@CommandChecks.check_is_ready()
|
@CommandChecks.check_is_ready()
|
||||||
@CommandChecks.check_is_member_moderator()
|
|
||||||
async def info(self, ctx: Context, member: Optional[discord.Member] = None, *, wait: int = None):
|
async def info(self, ctx: Context, member: Optional[discord.Member] = None, *, wait: int = None):
|
||||||
self._logger.debug(__name__, f'Received command user-info {ctx}:{member},{wait}')
|
self._logger.debug(__name__, f'Received command user-info {ctx}:{member},{wait}')
|
||||||
|
|
||||||
|
is_mod = self._permissions.is_member_moderator(ctx.author)
|
||||||
|
if member is not None and not is_mod:
|
||||||
|
await self._message_service.send_ctx_msg(ctx, self._t.transform('common.no_permission_message'))
|
||||||
|
return
|
||||||
|
|
||||||
if member is None or not isinstance(member, discord.Member):
|
if member is None or not isinstance(member, discord.Member):
|
||||||
member = ctx.author
|
member = ctx.author
|
||||||
|
|
||||||
@@ -79,35 +98,161 @@ class UserGroup(DiscordCommandABC):
|
|||||||
color=int('ef9d0d', 16)
|
color=int('ef9d0d', 16)
|
||||||
)
|
)
|
||||||
|
|
||||||
ujvs = self._user_joined_voice_channel.get_user_joined_voice_channels_by_user_id(user.user_id)
|
ontime = self._user_joined_voice_channel.get_user_joined_voice_channels_by_user_id(user.user_id)\
|
||||||
ontime = ujvs.sum(lambda join: round((join.leaved_on - join.joined_on).total_seconds() / 3600, 2))
|
.where(lambda x: x.leaved_on is not None and x.joined_on is not None)\
|
||||||
|
.sum(lambda join: round((join.leaved_on - join.joined_on).total_seconds() / 3600, 2))
|
||||||
|
|
||||||
embed.add_field(name=self._t.transform('modules.base.user_info.fields.id'), value=member.id)
|
embed.add_field(name=self._t.transform('modules.base.user.atr.id'), value=member.id)
|
||||||
embed.add_field(name=self._t.transform('modules.base.user_info.fields.name'), value=member.name)
|
embed.add_field(name=self._t.transform('modules.base.user.atr.name'), value=member.name)
|
||||||
embed.add_field(name=self._t.transform('modules.base.user_info.fields.discord_join'), value=self._date.transform(member.created_at), inline=False)
|
embed.add_field(name=self._t.transform('modules.base.user.atr.discord_join'),
|
||||||
embed.add_field(name=self._t.transform('modules.base.user_info.fields.last_join'), value=self._date.transform(member.joined_at), inline=False)
|
value=self._date.transform(member.created_at), inline=False)
|
||||||
embed.add_field(name=self._t.transform('modules.base.user_info.fields.xp'), value=str(user.xp))
|
embed.add_field(name=self._t.transform('modules.base.user.atr.last_join'),
|
||||||
embed.add_field(name=self._t.transform('modules.base.user_info.fields.ontime'), value=str(ontime))
|
value=self._date.transform(member.joined_at), inline=False)
|
||||||
|
embed.add_field(name=self._t.transform('modules.base.user.atr.xp'), value=str(user.xp))
|
||||||
|
embed.add_field(name=self._t.transform('modules.base.user.atr.ontime'), value=str(ontime))
|
||||||
|
|
||||||
roles = ''
|
roles = ''
|
||||||
for role in member.roles:
|
for role in member.roles:
|
||||||
roles += f'{role.name}\n'
|
roles += f'{role.name}\n'
|
||||||
embed.add_field(name=self._t.transform('modules.base.user_info.fields.roles'), value=roles, inline=False)
|
embed.add_field(name=self._t.transform('modules.base.user.atr.roles'), value=roles, inline=False)
|
||||||
|
|
||||||
joins_string = ''
|
if is_mod or member == ctx.author:
|
||||||
for join in joins:
|
joins_string = ''
|
||||||
joins_string += f'{self._date.transform(join.joined_on)}\n'
|
for join in joins:
|
||||||
embed.add_field(name=self._t.transform('modules.base.user_info.fields.joins'), value=joins_string)
|
joins_string += f'{self._date.transform(join.joined_on)}\n'
|
||||||
|
embed.add_field(name=self._t.transform('modules.base.user.atr.joins'), value=joins_string)
|
||||||
|
|
||||||
lefts_string = ''
|
if is_mod or member == ctx.author:
|
||||||
for join in joins:
|
lefts_string = ''
|
||||||
if join.leaved_on is None:
|
for join in joins:
|
||||||
if lefts_string == '':
|
if join.leaved_on is None:
|
||||||
lefts_string = '/'
|
if lefts_string == '':
|
||||||
continue
|
lefts_string = '/'
|
||||||
lefts_string += f'{self._date.transform(join.leaved_on)}\n'
|
continue
|
||||||
embed.add_field(name=self._t.transform('modules.base.user_info.fields.lefts'), value=lefts_string)
|
lefts_string += f'{self._date.transform(join.leaved_on)}\n'
|
||||||
embed.add_field(name=self._t.transform('modules.base.user_info.fields.warnings'), value=self._t.transform('common.not_implemented_yet'), inline=False)
|
|
||||||
|
|
||||||
await self._message_service.send_ctx_msg(ctx, embed, wait_before_delete=wait)
|
embed.add_field(name=self._t.transform('modules.base.user.atr.lefts'), value=lefts_string)
|
||||||
|
|
||||||
|
if is_mod or member == ctx.author:
|
||||||
|
embed.add_field(name=self._t.transform('modules.base.user.atr.warnings'),
|
||||||
|
value=self._t.transform('common.not_implemented_yet'), inline=False)
|
||||||
|
|
||||||
|
# send to interaction because of sensitive data
|
||||||
|
await self._message_service.send_interaction_msg(ctx.interaction, embed, wait_before_delete=wait)
|
||||||
self._logger.trace(__name__, f'Finished user-info command')
|
self._logger.trace(__name__, f'Finished user-info command')
|
||||||
|
|
||||||
|
@user.command()
|
||||||
|
@commands.guild_only()
|
||||||
|
@CommandChecks.check_is_ready()
|
||||||
|
async def get(self, ctx: Context, atr: str, member: discord.Member = None):
|
||||||
|
self._logger.debug(__name__, f'Received command user-get {atr} {ctx}:{member}')
|
||||||
|
|
||||||
|
is_mod = self._permissions.is_member_moderator(ctx.author)
|
||||||
|
if member is not None and not is_mod:
|
||||||
|
await self._message_service.send_ctx_msg(ctx, self._t.transform('common.no_permission_message'))
|
||||||
|
return
|
||||||
|
|
||||||
|
if member is None or not isinstance(member, discord.Member):
|
||||||
|
member = ctx.author
|
||||||
|
|
||||||
|
server = self._servers.find_server_by_discord_id(ctx.guild.id)
|
||||||
|
user = self._users.find_user_by_discord_id_and_server_id(member.id, server.server_id)
|
||||||
|
|
||||||
|
if atr == 'xp':
|
||||||
|
value = str(user.xp)
|
||||||
|
|
||||||
|
elif atr == 'ontime':
|
||||||
|
value = str(round(
|
||||||
|
self._user_joined_voice_channel.get_user_joined_voice_channels_by_user_id(user.user_id)
|
||||||
|
.sum(lambda join: (join.leaved_on - join.joined_on).total_seconds() / 3600),
|
||||||
|
2
|
||||||
|
))
|
||||||
|
|
||||||
|
else:
|
||||||
|
await self._message_service.send_interaction_msg(ctx.interaction, self._t.transform('modules.base.user.error.atr_not_found').format(atr))
|
||||||
|
return
|
||||||
|
|
||||||
|
await self._message_service.send_interaction_msg(
|
||||||
|
ctx.interaction,
|
||||||
|
self._t.transform(f'modules.base.user.get.{atr.lower()}').format(member.mention, value)
|
||||||
|
)
|
||||||
|
|
||||||
|
@get.autocomplete('atr')
|
||||||
|
async def get_autocomplete(self, interaction: discord.Interaction, current: str) -> List[app_commands.Choice[str]]:
|
||||||
|
return [app_commands.Choice(name=value, value=key) for key, value in self._atr_list]
|
||||||
|
|
||||||
|
@user.command()
|
||||||
|
@commands.guild_only()
|
||||||
|
@CommandChecks.check_is_ready()
|
||||||
|
@CommandChecks.check_is_member_moderator()
|
||||||
|
async def set(self, ctx: Context, atr: str, value: str, member: discord.Member = None):
|
||||||
|
self._logger.debug(__name__, f'Received command user-set {atr} {ctx}:{member}')
|
||||||
|
|
||||||
|
if member is None or not isinstance(member, discord.Member):
|
||||||
|
member = ctx.author
|
||||||
|
|
||||||
|
server = self._servers.find_server_by_discord_id(ctx.guild.id)
|
||||||
|
user = self._users.find_user_by_discord_id_and_server_id(member.id, server.server_id)
|
||||||
|
|
||||||
|
if atr == 'xp':
|
||||||
|
if not value.isnumeric():
|
||||||
|
await self._message_service.send_interaction_msg(ctx.interaction, self._t.transform('modules.base.user.set.error.value_type_not_numeric'))
|
||||||
|
return
|
||||||
|
|
||||||
|
try:
|
||||||
|
user.xp = int(value)
|
||||||
|
except TypeError as te:
|
||||||
|
self._logger.error(__name__, f'String value couldn\'t be converted to int', te)
|
||||||
|
await self._message_service.send_interaction_msg(ctx.interaction, self._t.transform('modules.base.user.set.error.type_error'))
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
self._users.update_user(user)
|
||||||
|
self._db.save_changes()
|
||||||
|
await self._level.check_level(member)
|
||||||
|
|
||||||
|
else:
|
||||||
|
await self._message_service.send_interaction_msg(ctx.interaction, self._t.transform('modules.base.user.error.atr_not_found').format(atr))
|
||||||
|
return
|
||||||
|
|
||||||
|
await self._message_service.send_interaction_msg(ctx.interaction, self._t.transform(f'modules.base.user.set.{atr.lower()}').format(member.mention, value))
|
||||||
|
|
||||||
|
@set.autocomplete('atr')
|
||||||
|
async def set_autocomplete(self, interaction: discord.Interaction, current: str) -> List[app_commands.Choice[str]]:
|
||||||
|
atr_list = [('xp', self._atr_dict['xp'])]
|
||||||
|
return [app_commands.Choice(name=value, value=key) for key, value in atr_list]
|
||||||
|
|
||||||
|
@user.command()
|
||||||
|
@commands.guild_only()
|
||||||
|
@CommandChecks.check_is_ready()
|
||||||
|
@CommandChecks.check_is_member_moderator()
|
||||||
|
async def remove(self, ctx: Context, atr: str, member: discord.Member = None):
|
||||||
|
self._logger.debug(__name__, f'Received command user-remove {atr} {ctx}:{member}')
|
||||||
|
|
||||||
|
if member is None or not isinstance(member, discord.Member):
|
||||||
|
member = ctx.author
|
||||||
|
|
||||||
|
server = self._servers.find_server_by_discord_id(ctx.guild.id)
|
||||||
|
user = self._users.find_user_by_discord_id_and_server_id(member.id, server.server_id)
|
||||||
|
|
||||||
|
if atr == 'xp':
|
||||||
|
user.xp = 0
|
||||||
|
self._users.update_user(user)
|
||||||
|
self._db.save_changes()
|
||||||
|
await self._level.check_level(member)
|
||||||
|
|
||||||
|
elif atr == 'ontime':
|
||||||
|
self._user_joined_voice_channel.delete_user_joined_voice_channel_by_user_id(user.user_id)
|
||||||
|
self._db.save_changes()
|
||||||
|
|
||||||
|
else:
|
||||||
|
await self._message_service.send_interaction_msg(ctx.interaction, self._t.transform('modules.base.user.error.atr_not_found').format(atr))
|
||||||
|
return
|
||||||
|
|
||||||
|
await self._message_service.send_interaction_msg(
|
||||||
|
ctx.interaction,
|
||||||
|
self._t.transform(f'modules.base.user.remove.{atr.lower()}').format(atr, member.mention)
|
||||||
|
)
|
||||||
|
|
||||||
|
@remove.autocomplete('atr')
|
||||||
|
async def remove_autocomplete(self, interaction: discord.Interaction, current: str) -> List[app_commands.Choice[str]]:
|
||||||
|
return [app_commands.Choice(name=value, value=key) for key, value in self._atr_list]
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'modules.base.configuration'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
@@ -13,10 +13,13 @@ class BaseServerSettings(ConfigurationModelABC):
|
|||||||
self._id: int = 0
|
self._id: int = 0
|
||||||
self._max_voice_state_hours: int = 0
|
self._max_voice_state_hours: int = 0
|
||||||
self._xp_per_message: int = 0
|
self._xp_per_message: int = 0
|
||||||
|
self._xp_per_reaction: int = 0
|
||||||
self._xp_per_ontime_hour: int = 0
|
self._xp_per_ontime_hour: int = 0
|
||||||
self._afk_channel_ids: List[int] = List(int)
|
self._afk_channel_ids: List[int] = List(int)
|
||||||
self._afk_command_channel_id: int = 0
|
self._afk_command_channel_id: int = 0
|
||||||
self._help_command_reference_url: str = ''
|
self._help_command_reference_url: str = ''
|
||||||
|
self._help_voice_channel_id: int = 0
|
||||||
|
self._ping_urls = List(str)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def id(self) -> int:
|
def id(self) -> int:
|
||||||
@@ -30,6 +33,10 @@ class BaseServerSettings(ConfigurationModelABC):
|
|||||||
def xp_per_message(self) -> int:
|
def xp_per_message(self) -> int:
|
||||||
return self._xp_per_message
|
return self._xp_per_message
|
||||||
|
|
||||||
|
@property
|
||||||
|
def xp_per_reaction(self) -> int:
|
||||||
|
return self._xp_per_reaction
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def xp_per_ontime_hour(self) -> int:
|
def xp_per_ontime_hour(self) -> int:
|
||||||
return self._xp_per_ontime_hour
|
return self._xp_per_ontime_hour
|
||||||
@@ -46,16 +53,28 @@ class BaseServerSettings(ConfigurationModelABC):
|
|||||||
def help_command_reference_url(self) -> str:
|
def help_command_reference_url(self) -> str:
|
||||||
return self._help_command_reference_url
|
return self._help_command_reference_url
|
||||||
|
|
||||||
|
@property
|
||||||
|
def help_voice_channel_id(self) -> int:
|
||||||
|
return self._help_voice_channel_id
|
||||||
|
|
||||||
|
@property
|
||||||
|
def ping_urls(self) -> List[str]:
|
||||||
|
return self._ping_urls
|
||||||
|
|
||||||
def from_dict(self, settings: dict):
|
def from_dict(self, settings: dict):
|
||||||
try:
|
try:
|
||||||
self._id = int(settings['Id'])
|
self._id = int(settings['Id'])
|
||||||
self._max_voice_state_hours = int(settings['MaxVoiceStateHours'])
|
self._max_voice_state_hours = int(settings['MaxVoiceStateHours'])
|
||||||
self._xp_per_message = int(settings['XpPerMessage'])
|
self._xp_per_message = int(settings['XpPerMessage'])
|
||||||
|
self._xp_per_reaction = int(settings['XpPerReaction'])
|
||||||
self._xp_per_ontime_hour = int(settings['XpPerOntimeHour'])
|
self._xp_per_ontime_hour = int(settings['XpPerOntimeHour'])
|
||||||
for index in settings['AFKChannelIds']:
|
for index in settings['AFKChannelIds']:
|
||||||
self._afk_channel_ids.append(int(index))
|
self._afk_channel_ids.append(int(index))
|
||||||
self._afk_command_channel_id = settings['AFKCommandChannelId']
|
self._afk_command_channel_id = settings['AFKCommandChannelId']
|
||||||
self._help_command_reference_url = settings['HelpCommandReferenceUrl']
|
self._help_command_reference_url = settings['HelpCommandReferenceUrl']
|
||||||
|
self._help_voice_channel_id = settings['HelpVoiceChannelId']
|
||||||
|
for url in settings['PingURLs']:
|
||||||
|
self._ping_urls.append(url)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
Console.error(f'[ ERROR ] [ {__name__} ]: Reading error in {type(self).__name__} settings')
|
Console.error(f'[ ERROR ] [ {__name__} ]: Reading error in {type(self).__name__} settings')
|
||||||
Console.error(f'[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}')
|
Console.error(f'[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}')
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'modules.base.events'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
@@ -70,17 +70,17 @@ class BaseOnMemberJoinEvent(OnMemberJoinABC):
|
|||||||
await self._messenger.send_dm_message(self._t.transform('modules.base.welcome_message').format(member.guild.name), member)
|
await self._messenger.send_dm_message(self._t.transform('modules.base.welcome_message').format(member.guild.name), member)
|
||||||
|
|
||||||
for admin in self._permission_service.get_admins(member.guild.id):
|
for admin in self._permission_service.get_admins(member.guild.id):
|
||||||
await self._messenger.send_dm_message(self._t.transform('modules.base.welcome_message_for_team').format(member.name), admin)
|
await self._messenger.send_dm_message(self._t.transform('modules.base.welcome_message_for_team').format(member.mention), admin)
|
||||||
|
|
||||||
for moderator in self._permission_service.get_moderators(member.guild.id):
|
for moderator in self._permission_service.get_moderators(member.guild.id):
|
||||||
await self._messenger.send_dm_message(self._t.transform('modules.base.welcome_message_for_team').format(member.name), moderator)
|
await self._messenger.send_dm_message(self._t.transform('modules.base.welcome_message_for_team').format(member.mention), moderator)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
server = self._servers.get_server_by_discord_id(member.guild.id)
|
server = self._servers.get_server_by_discord_id(member.guild.id)
|
||||||
|
|
||||||
user = self._users.find_user_by_discord_id_and_server_id(member.id, server.server_id)
|
user = self._users.find_user_by_discord_id_and_server_id(member.id, server.server_id)
|
||||||
if user is not None:
|
if user is not None:
|
||||||
self._user_joins.add_user_joined_server(UserJoinedServer(user, datetime.now()))
|
self._user_joins.add_user_joined_server(UserJoinedServer(user, datetime.now()))
|
||||||
|
self._db.save_changes()
|
||||||
return
|
return
|
||||||
|
|
||||||
self._logger.debug(__name__, f'Add user: {member.id}')
|
self._logger.debug(__name__, f'Add user: {member.id}')
|
||||||
|
36
kdb-bot/src/modules/base/events/base_on_raw_reaction_add.py
Normal file
36
kdb-bot/src/modules/base/events/base_on_raw_reaction_add.py
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
from cpl_core.logging import LoggerABC
|
||||||
|
from cpl_discord.events.on_raw_reaction_add_abc import OnRawReactionAddABC
|
||||||
|
from cpl_discord.service import DiscordBotServiceABC
|
||||||
|
from discord import RawReactionActionEvent
|
||||||
|
|
||||||
|
from bot_core.helper.event_checks import EventChecks
|
||||||
|
from bot_data.abc.auto_role_repository_abc import AutoRoleRepositoryABC
|
||||||
|
from bot_data.abc.server_repository_abc import ServerRepositoryABC
|
||||||
|
from modules.base.helper.base_reaction_handler import BaseReactionHandler
|
||||||
|
|
||||||
|
|
||||||
|
class BaseOnRawReactionAddEvent(OnRawReactionAddABC):
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
logger: LoggerABC,
|
||||||
|
bot: DiscordBotServiceABC,
|
||||||
|
servers: ServerRepositoryABC,
|
||||||
|
auto_roles: AutoRoleRepositoryABC,
|
||||||
|
reaction_handler: BaseReactionHandler
|
||||||
|
):
|
||||||
|
OnRawReactionAddABC.__init__(self)
|
||||||
|
|
||||||
|
self._logger = logger
|
||||||
|
self._bot = bot
|
||||||
|
self._servers = servers
|
||||||
|
self._auto_roles = auto_roles
|
||||||
|
self._reaction_handler = reaction_handler
|
||||||
|
|
||||||
|
@EventChecks.check_is_ready()
|
||||||
|
async def on_raw_reaction_add(self, payload: RawReactionActionEvent):
|
||||||
|
self._logger.debug(__name__, f'Module {type(self)} started')
|
||||||
|
|
||||||
|
await self._reaction_handler.handle(payload, 'add')
|
||||||
|
|
||||||
|
self._logger.debug(__name__, f'Module {type(self)} stopped')
|
@@ -0,0 +1,36 @@
|
|||||||
|
from cpl_core.logging import LoggerABC
|
||||||
|
from cpl_discord.events.on_raw_reaction_remove_abc import OnRawReactionRemoveABC
|
||||||
|
from cpl_discord.service import DiscordBotServiceABC
|
||||||
|
from discord import RawReactionActionEvent
|
||||||
|
|
||||||
|
from bot_core.helper.event_checks import EventChecks
|
||||||
|
from bot_data.abc.auto_role_repository_abc import AutoRoleRepositoryABC
|
||||||
|
from bot_data.abc.server_repository_abc import ServerRepositoryABC
|
||||||
|
from modules.base.helper.base_reaction_handler import BaseReactionHandler
|
||||||
|
|
||||||
|
|
||||||
|
class BaseOnRawReactionRemoveEvent(OnRawReactionRemoveABC):
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
logger: LoggerABC,
|
||||||
|
bot: DiscordBotServiceABC,
|
||||||
|
servers: ServerRepositoryABC,
|
||||||
|
auto_roles: AutoRoleRepositoryABC,
|
||||||
|
reaction_handler: BaseReactionHandler,
|
||||||
|
):
|
||||||
|
OnRawReactionRemoveABC.__init__(self)
|
||||||
|
|
||||||
|
self._logger = logger
|
||||||
|
self._bot = bot
|
||||||
|
self._servers = servers
|
||||||
|
self._auto_roles = auto_roles
|
||||||
|
self._reaction_handler = reaction_handler
|
||||||
|
|
||||||
|
@EventChecks.check_is_ready()
|
||||||
|
async def on_raw_reaction_remove(self, payload: RawReactionActionEvent):
|
||||||
|
self._logger.debug(__name__, f'Module {type(self)} started')
|
||||||
|
|
||||||
|
await self._reaction_handler.handle(payload, 'remove')
|
||||||
|
|
||||||
|
self._logger.debug(__name__, f'Module {type(self)} stopped')
|
@@ -0,0 +1,53 @@
|
|||||||
|
import discord
|
||||||
|
from cpl_core.configuration import ConfigurationABC
|
||||||
|
from cpl_core.logging import LoggerABC
|
||||||
|
from cpl_discord.events import OnVoiceStateUpdateABC
|
||||||
|
from cpl_translation import TranslatePipe
|
||||||
|
|
||||||
|
from bot_core.abc.message_service_abc import MessageServiceABC
|
||||||
|
from bot_core.helper.event_checks import EventChecks
|
||||||
|
from bot_data.abc.server_repository_abc import ServerRepositoryABC
|
||||||
|
from modules.base.abc.base_helper_abc import BaseHelperABC
|
||||||
|
from modules.base.configuration.base_server_settings import BaseServerSettings
|
||||||
|
from modules.permission.abc.permission_service_abc import PermissionServiceABC
|
||||||
|
|
||||||
|
|
||||||
|
class BaseOnVoiceStateUpdateEventHelpChannel(OnVoiceStateUpdateABC):
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
config: ConfigurationABC,
|
||||||
|
logger: LoggerABC,
|
||||||
|
base_helper: BaseHelperABC,
|
||||||
|
servers: ServerRepositoryABC,
|
||||||
|
permissions: PermissionServiceABC,
|
||||||
|
message_service: MessageServiceABC,
|
||||||
|
t: TranslatePipe,
|
||||||
|
):
|
||||||
|
OnVoiceStateUpdateABC.__init__(self)
|
||||||
|
self._config = config
|
||||||
|
self._logger = logger
|
||||||
|
self._base_helper = base_helper
|
||||||
|
self._servers = servers
|
||||||
|
self._permissions = permissions
|
||||||
|
self._message_service = message_service
|
||||||
|
self._t = t
|
||||||
|
|
||||||
|
self._logger.info(__name__, f'Module {type(self)} loaded')
|
||||||
|
|
||||||
|
@EventChecks.check_is_ready()
|
||||||
|
async def on_voice_state_update(self, member: discord.Member, before: discord.VoiceState, after: discord.VoiceState):
|
||||||
|
self._logger.debug(__name__, f'Module {type(self)} started')
|
||||||
|
server = self._servers.get_server_by_discord_id(member.guild.id)
|
||||||
|
settings: BaseServerSettings = self._base_helper.get_config(server.discord_server_id)
|
||||||
|
if after.channel is None or after.channel.id != settings.help_voice_channel_id:
|
||||||
|
return
|
||||||
|
|
||||||
|
mods = [*self._permissions.get_admins(member.guild.id), *self._permissions.get_moderators(member.guild.id)]
|
||||||
|
for a in mods:
|
||||||
|
await self._message_service.send_dm_message(
|
||||||
|
self._t.transform('modules.base.member_joined_help_voice_channel').format(member.mention),
|
||||||
|
a,
|
||||||
|
)
|
||||||
|
|
||||||
|
self._logger.debug(__name__, f'Module {type(self)} stopped')
|
26
kdb-bot/src/modules/base/helper/__init__.py
Normal file
26
kdb-bot/src/modules/base/helper/__init__.py
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
"""
|
||||||
|
bot Keksdose bot
|
||||||
|
~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Discord bot for the Keksdose discord Server
|
||||||
|
|
||||||
|
:copyright: (c) 2022 sh-edraft.de
|
||||||
|
:license: MIT, see LICENSE for more details.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
__title__ = 'modules.base.helper'
|
||||||
|
__author__ = 'Sven Heidemann'
|
||||||
|
__license__ = 'MIT'
|
||||||
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
|
from collections import namedtuple
|
||||||
|
|
||||||
|
|
||||||
|
# imports:
|
||||||
|
|
||||||
|
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||||
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
55
kdb-bot/src/modules/base/helper/base_reaction_handler.py
Normal file
55
kdb-bot/src/modules/base/helper/base_reaction_handler.py
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
from cpl_core.database.context import DatabaseContextABC
|
||||||
|
from cpl_core.logging import LoggerABC
|
||||||
|
from cpl_discord.service import DiscordBotServiceABC
|
||||||
|
from discord import RawReactionActionEvent
|
||||||
|
|
||||||
|
from bot_data.abc.server_repository_abc import ServerRepositoryABC
|
||||||
|
from bot_data.abc.user_repository_abc import UserRepositoryABC
|
||||||
|
from modules.base.abc.base_helper_abc import BaseHelperABC
|
||||||
|
from modules.base.configuration.base_server_settings import BaseServerSettings
|
||||||
|
|
||||||
|
|
||||||
|
class BaseReactionHandler:
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
logger: LoggerABC,
|
||||||
|
bot: DiscordBotServiceABC,
|
||||||
|
servers: ServerRepositoryABC,
|
||||||
|
users: UserRepositoryABC,
|
||||||
|
base_helper: BaseHelperABC,
|
||||||
|
db: DatabaseContextABC,
|
||||||
|
):
|
||||||
|
self._logger = logger
|
||||||
|
self._bot = bot
|
||||||
|
self._servers = servers
|
||||||
|
self._users = users
|
||||||
|
self._base_helper = base_helper
|
||||||
|
self._db = db
|
||||||
|
|
||||||
|
async def handle(self, payload: RawReactionActionEvent, r_type=None) -> None:
|
||||||
|
self._logger.trace(__name__, f'Handle reaction {payload} {r_type}')
|
||||||
|
|
||||||
|
guild = self._bot.get_guild(payload.guild_id)
|
||||||
|
member = guild.get_member(payload.user_id)
|
||||||
|
if member is None:
|
||||||
|
self._logger.warn(__name__, f'User {payload.user_id} in {guild.name} not found - skipping')
|
||||||
|
return
|
||||||
|
|
||||||
|
if member.bot:
|
||||||
|
return
|
||||||
|
|
||||||
|
server = self._servers.get_server_by_discord_id(guild.id)
|
||||||
|
user = self._users.get_user_by_discord_id_and_server_id(member.id, server.server_id)
|
||||||
|
settings: BaseServerSettings = self._base_helper.get_config(guild.id)
|
||||||
|
|
||||||
|
if r_type == 'add':
|
||||||
|
user.xp += settings.xp_per_reaction
|
||||||
|
self._users.update_user(user)
|
||||||
|
self._db.save_changes()
|
||||||
|
elif r_type == 'remove':
|
||||||
|
user.xp -= settings.xp_per_reaction
|
||||||
|
self._users.update_user(user)
|
||||||
|
self._db.save_changes()
|
||||||
|
else:
|
||||||
|
self._logger.warn(__name__, f'Invalid reaction type {r_type}')
|
@@ -15,7 +15,7 @@ __title__ = 'modules.base.service'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
26
kdb-bot/src/modules/base/thread/__init__.py
Normal file
26
kdb-bot/src/modules/base/thread/__init__.py
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
"""
|
||||||
|
bot Keksdose bot
|
||||||
|
~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Discord bot for the Keksdose discord Server
|
||||||
|
|
||||||
|
:copyright: (c) 2022 sh-edraft.de
|
||||||
|
:license: MIT, see LICENSE for more details.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
__title__ = 'modules.base.thread'
|
||||||
|
__author__ = 'Sven Heidemann'
|
||||||
|
__license__ = 'MIT'
|
||||||
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
|
from collections import namedtuple
|
||||||
|
|
||||||
|
|
||||||
|
# imports
|
||||||
|
|
||||||
|
VersionInfo = namedtuple('VersionInfo', 'major minor micro')
|
||||||
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
@@ -15,7 +15,7 @@ __title__ = 'modules.boot_log'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
@@ -2,8 +2,8 @@
|
|||||||
"ProjectSettings": {
|
"ProjectSettings": {
|
||||||
"Name": "boot-log",
|
"Name": "boot-log",
|
||||||
"Version": {
|
"Version": {
|
||||||
"Major": "1",
|
"Major": "0",
|
||||||
"Minor": "0",
|
"Minor": "3",
|
||||||
"Micro": "0"
|
"Micro": "0"
|
||||||
},
|
},
|
||||||
"Author": "",
|
"Author": "",
|
||||||
@@ -16,10 +16,10 @@
|
|||||||
"LicenseName": "",
|
"LicenseName": "",
|
||||||
"LicenseDescription": "",
|
"LicenseDescription": "",
|
||||||
"Dependencies": [
|
"Dependencies": [
|
||||||
"cpl-core>=2022.10.0.post2"
|
"cpl-core==2022.12.0"
|
||||||
],
|
],
|
||||||
"DevDependencies": [
|
"DevDependencies": [
|
||||||
"cpl-cli==2022.10.0"
|
"cpl-cli==2022.12.0"
|
||||||
],
|
],
|
||||||
"PythonVersion": ">=3.10.4",
|
"PythonVersion": ">=3.10.4",
|
||||||
"PythonPath": {},
|
"PythonPath": {},
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'modules.boot_log.configuration'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'modules.database'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
@@ -2,9 +2,9 @@
|
|||||||
"ProjectSettings": {
|
"ProjectSettings": {
|
||||||
"Name": "database",
|
"Name": "database",
|
||||||
"Version": {
|
"Version": {
|
||||||
"Major": "1",
|
"Major": "0",
|
||||||
"Minor": "0",
|
"Minor": "3",
|
||||||
"Micro": "0.dev1"
|
"Micro": "0"
|
||||||
},
|
},
|
||||||
"Author": "Sven Heidemann",
|
"Author": "Sven Heidemann",
|
||||||
"AuthorEmail": "sven.heidemann@sh-edraft.de",
|
"AuthorEmail": "sven.heidemann@sh-edraft.de",
|
||||||
@@ -16,10 +16,10 @@
|
|||||||
"LicenseName": "MIT",
|
"LicenseName": "MIT",
|
||||||
"LicenseDescription": "MIT, see LICENSE for more details.",
|
"LicenseDescription": "MIT, see LICENSE for more details.",
|
||||||
"Dependencies": [
|
"Dependencies": [
|
||||||
"cpl-core>=2022.10.0.post2"
|
"cpl-core==2022.12.0"
|
||||||
],
|
],
|
||||||
"DevDependencies": [
|
"DevDependencies": [
|
||||||
"cpl-cli==2022.10.0"
|
"cpl-cli==2022.12.0"
|
||||||
],
|
],
|
||||||
"PythonVersion": ">=3.10.4",
|
"PythonVersion": ">=3.10.4",
|
||||||
"PythonPath": {},
|
"PythonPath": {},
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'modules.level'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'modules.level.command'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev29'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev29')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
@@ -93,6 +93,11 @@ class LevelGroup(DiscordCommandABC):
|
|||||||
self._logger.error(__name__, f'Level seeding failed', e)
|
self._logger.error(__name__, f'Level seeding failed', e)
|
||||||
await self._message_service.send_channel_message(channel, self._t.transform('modules.level.seeding_failed'))
|
await self._message_service.send_channel_message(channel, self._t.transform('modules.level.seeding_failed'))
|
||||||
|
|
||||||
|
async def _level_auto_complete(self, interaction: discord.Interaction, current: str) -> TList[app_commands.Choice[str]]:
|
||||||
|
server = self._servers.get_server_by_discord_id(interaction.guild.id)
|
||||||
|
levels = self._levels.get_levels_by_server_id(server.server_id).select(lambda l: l.name)
|
||||||
|
return [app_commands.Choice(name=level, value=level) for level in self._client_utils.get_auto_complete_list(levels, current)]
|
||||||
|
|
||||||
@commands.hybrid_group()
|
@commands.hybrid_group()
|
||||||
@commands.guild_only()
|
@commands.guild_only()
|
||||||
async def level(self, ctx: Context):
|
async def level(self, ctx: Context):
|
||||||
@@ -240,9 +245,7 @@ class LevelGroup(DiscordCommandABC):
|
|||||||
|
|
||||||
@edit.autocomplete('level')
|
@edit.autocomplete('level')
|
||||||
async def edit_autocomplete(self, interaction: discord.Interaction, current: str) -> TList[app_commands.Choice[str]]:
|
async def edit_autocomplete(self, interaction: discord.Interaction, current: str) -> TList[app_commands.Choice[str]]:
|
||||||
server = self._servers.get_server_by_discord_id(interaction.guild.id)
|
return await self._level_auto_complete(interaction, current)
|
||||||
levels = self._levels.get_levels_by_server_id(server.server_id).select(lambda l: l.name)
|
|
||||||
return [app_commands.Choice(name=level, value=level) for level in levels]
|
|
||||||
|
|
||||||
@edit.autocomplete('color')
|
@edit.autocomplete('color')
|
||||||
async def edit_color_autocomplete(self, interaction: discord.Interaction, current: str) -> TList[app_commands.Choice[str]]:
|
async def edit_color_autocomplete(self, interaction: discord.Interaction, current: str) -> TList[app_commands.Choice[str]]:
|
||||||
@@ -283,9 +286,7 @@ class LevelGroup(DiscordCommandABC):
|
|||||||
|
|
||||||
@remove.autocomplete('level')
|
@remove.autocomplete('level')
|
||||||
async def remove_autocomplete(self, interaction: discord.Interaction, current: str) -> TList[app_commands.Choice[str]]:
|
async def remove_autocomplete(self, interaction: discord.Interaction, current: str) -> TList[app_commands.Choice[str]]:
|
||||||
server = self._servers.get_server_by_discord_id(interaction.guild.id)
|
return await self._level_auto_complete(interaction, current)
|
||||||
levels = self._levels.get_levels_by_server_id(server.server_id).select(lambda l: l.name)
|
|
||||||
return [app_commands.Choice(name=level, value=level) for level in levels]
|
|
||||||
|
|
||||||
@level.command()
|
@level.command()
|
||||||
@commands.guild_only()
|
@commands.guild_only()
|
||||||
@@ -303,7 +304,7 @@ class LevelGroup(DiscordCommandABC):
|
|||||||
levels = self._levels.get_levels_by_server_id(server.server_id).order_by(lambda l: l.min_xp)
|
levels = self._levels.get_levels_by_server_id(server.server_id).order_by(lambda l: l.min_xp)
|
||||||
|
|
||||||
if level == levels.first():
|
if level == levels.first():
|
||||||
await self._message_service.send_ctx_msg(ctx, self._t.transform('modules.level.down.already_first').format(member.name))
|
await self._message_service.send_ctx_msg(ctx, self._t.transform('modules.level.down.already_first').format(member.mention))
|
||||||
self._logger.trace(__name__, f'Finished command level down')
|
self._logger.trace(__name__, f'Finished command level down')
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -312,11 +313,11 @@ class LevelGroup(DiscordCommandABC):
|
|||||||
user.xp = new_level.min_xp
|
user.xp = new_level.min_xp
|
||||||
self._users.update_user(user)
|
self._users.update_user(user)
|
||||||
self._db.save_changes()
|
self._db.save_changes()
|
||||||
await self._message_service.send_ctx_msg(ctx, self._t.transform('modules.level.down.success').format(member.name, new_level.name))
|
await self._message_service.send_ctx_msg(ctx, self._t.transform('modules.level.down.success').format(member.mention, new_level.name))
|
||||||
await self._level_service.set_level(user)
|
await self._level_service.set_level(user)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self._logger.error(__name__, f'Cannot level down {member.name} with level {level.name}', e)
|
self._logger.error(__name__, f'Cannot level down {member.name} with level {level.name}', e)
|
||||||
await self._message_service.send_ctx_msg(ctx, self._t.transform('modules.level.down.failed').format(member.name))
|
await self._message_service.send_ctx_msg(ctx, self._t.transform('modules.level.down.failed').format(member.mention))
|
||||||
|
|
||||||
self._logger.trace(__name__, f'Finished command level down')
|
self._logger.trace(__name__, f'Finished command level down')
|
||||||
|
|
||||||
@@ -336,7 +337,7 @@ class LevelGroup(DiscordCommandABC):
|
|||||||
levels = self._levels.get_levels_by_server_id(server.server_id).order_by(lambda l: l.min_xp)
|
levels = self._levels.get_levels_by_server_id(server.server_id).order_by(lambda l: l.min_xp)
|
||||||
|
|
||||||
if level.name == levels.last().name:
|
if level.name == levels.last().name:
|
||||||
await self._message_service.send_ctx_msg(ctx, self._t.transform('modules.level.up.already_last').format(member.name))
|
await self._message_service.send_ctx_msg(ctx, self._t.transform('modules.level.up.already_last').format(member.mention))
|
||||||
self._logger.trace(__name__, f'Finished command level up')
|
self._logger.trace(__name__, f'Finished command level up')
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -345,11 +346,11 @@ class LevelGroup(DiscordCommandABC):
|
|||||||
user.xp = new_level.min_xp
|
user.xp = new_level.min_xp
|
||||||
self._users.update_user(user)
|
self._users.update_user(user)
|
||||||
self._db.save_changes()
|
self._db.save_changes()
|
||||||
await self._message_service.send_ctx_msg(ctx, self._t.transform('modules.level.up.success').format(member.name, new_level.name))
|
await self._message_service.send_ctx_msg(ctx, self._t.transform('modules.level.up.success').format(member.mention, new_level.name))
|
||||||
await self._level_service.set_level(user)
|
await self._level_service.set_level(user)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self._logger.error(__name__, f'Cannot level up {member.name} with level {level.name}', e)
|
self._logger.error(__name__, f'Cannot level up {member.name} with level {level.name}', e)
|
||||||
await self._message_service.send_ctx_msg(ctx, self._t.transform('modules.level.up.failed').format(member.name))
|
await self._message_service.send_ctx_msg(ctx, self._t.transform('modules.level.up.failed').format(member.mention))
|
||||||
|
|
||||||
self._logger.trace(__name__, f'Finished command level up')
|
self._logger.trace(__name__, f'Finished command level up')
|
||||||
|
|
||||||
@@ -374,7 +375,7 @@ class LevelGroup(DiscordCommandABC):
|
|||||||
return
|
return
|
||||||
|
|
||||||
if current_level.name == level:
|
if current_level.name == level:
|
||||||
await self._message_service.send_ctx_msg(ctx, self._t.transform('modules.level.set.already_level').format(member.name, level))
|
await self._message_service.send_ctx_msg(ctx, self._t.transform('modules.level.set.already_level').format(member.mention, level))
|
||||||
self._logger.trace(__name__, f'Finished command level set')
|
self._logger.trace(__name__, f'Finished command level set')
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -382,16 +383,14 @@ class LevelGroup(DiscordCommandABC):
|
|||||||
user.xp = new_level.min_xp
|
user.xp = new_level.min_xp
|
||||||
self._users.update_user(user)
|
self._users.update_user(user)
|
||||||
self._db.save_changes()
|
self._db.save_changes()
|
||||||
await self._message_service.send_ctx_msg(ctx, self._t.transform('modules.level.set.success').format(member.name, new_level.name))
|
await self._message_service.send_ctx_msg(ctx, self._t.transform('modules.level.set.success').format(member.mention, new_level.name))
|
||||||
await self._level_service.set_level(user)
|
await self._level_service.set_level(user)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self._logger.error(__name__, f'Cannot set level {level} for {member.name}', e)
|
self._logger.error(__name__, f'Cannot set level {level} for {member.name}', e)
|
||||||
await self._message_service.send_ctx_msg(ctx, self._t.transform('modules.level.set.failed').format(member.name))
|
await self._message_service.send_ctx_msg(ctx, self._t.transform('modules.level.set.failed').format(member.mention))
|
||||||
|
|
||||||
self._logger.trace(__name__, f'Finished command level set')
|
self._logger.trace(__name__, f'Finished command level set')
|
||||||
|
|
||||||
@set.autocomplete('level')
|
@set.autocomplete('level')
|
||||||
async def set_autocomplete(self, interaction: discord.Interaction, current: str) -> TList[app_commands.Choice[str]]:
|
async def set_autocomplete(self, interaction: discord.Interaction, current: str) -> TList[app_commands.Choice[str]]:
|
||||||
server = self._servers.get_server_by_discord_id(interaction.guild.id)
|
return await self._level_auto_complete(interaction, current)
|
||||||
levels = self._levels.get_levels_by_server_id(server.server_id).select(lambda l: l.name)
|
|
||||||
return [app_commands.Choice(name=level, value=level) for level in levels]
|
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'modules.level.configuration'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
@@ -15,7 +15,7 @@ __title__ = 'modules.level.events'
|
|||||||
__author__ = 'Sven Heidemann'
|
__author__ = 'Sven Heidemann'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
__copyright__ = 'Copyright (c) 2022 sh-edraft.de'
|
||||||
__version__ = '0.3.dev25'
|
__version__ = '0.3.0'
|
||||||
|
|
||||||
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='0', minor='3', micro='dev25')
|
version_info = VersionInfo(major='0', minor='3', micro='0')
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user