Compare commits
2 Commits
1.2.5
...
59f1183a50
Author | SHA1 | Date | |
---|---|---|---|
59f1183a50 | |||
527d28ae39 |
@@ -1,17 +0,0 @@
|
||||
#### Beschreibung
|
||||
|
||||
Als Produktmanager muss ich nun dieses Ticket ausfüllen.
|
||||
|
||||
#### Aktuelles Verhalten
|
||||
|
||||
* Was macht die Software aktuell?
|
||||
|
||||
#### Gewünschtes Verhalten
|
||||
|
||||
* Was soll die Software anders machen?
|
||||
|
||||
#### Akzeptanzkriterien
|
||||
|
||||
* Was muss erfüllt sein, damit das Ticket als abgeschlossen angesehen werden kann?
|
||||
|
||||
#### Anmerkungen
|
@@ -1,7 +0,0 @@
|
||||
#### Ticket Referenz:
|
||||
|
||||
#1
|
||||
|
||||
#### Gibt es etwas beim Review zu beachten?
|
||||
|
||||
Nein
|
@@ -1,129 +0,0 @@
|
||||
name: Deploy dev on push
|
||||
run-name: Deploy dev on push
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- dev
|
||||
|
||||
jobs:
|
||||
pre-build:
|
||||
runs-on: [ dobby.sh-edraft.de, ubuntu-latest ]
|
||||
container: git.sh-edraft.de/sh-edraft.de/act-runner:latest
|
||||
steps:
|
||||
- name: Shutdown stack
|
||||
run: docker stack rm sdb_dev
|
||||
|
||||
build-bot:
|
||||
needs: pre-build
|
||||
runs-on: [ dobby.sh-edraft.de, ubuntu-latest ]
|
||||
container: git.sh-edraft.de/sh-edraft.de/act-runner:latest
|
||||
steps:
|
||||
- name: Setup docker
|
||||
uses: https://github.com/papodaca/install-docker-action@main
|
||||
- run: docker -v
|
||||
|
||||
- name: Clone Repository
|
||||
uses: https://github.com/actions/checkout@v3
|
||||
with:
|
||||
token: ${{ secrets.CI_ACCESS_TOKEN }}
|
||||
submodules: true
|
||||
|
||||
- name: Prepare bot build
|
||||
run: |
|
||||
python3.10 -m pip install --extra-index-url https://pip.sh-edraft.de cpl-cli
|
||||
cd bot
|
||||
cpl i
|
||||
|
||||
- name: Build docker bot
|
||||
run: |
|
||||
cd bot
|
||||
docker image prune -f
|
||||
cpl build
|
||||
docker build -t git.sh-edraft.de/sh-edraft.de/sdb-bot:$(cpl gv)-dev .
|
||||
|
||||
- name: Login to registry git.sh-edraft.de
|
||||
uses: https://github.com/docker/login-action@v1
|
||||
with:
|
||||
registry: git.sh-edraft.de
|
||||
username: ${{ secrets.CI_USERNAME }}
|
||||
password: ${{ secrets.CI_ACCESS_TOKEN }}
|
||||
|
||||
- name: Push image
|
||||
run: |
|
||||
cd bot
|
||||
docker push git.sh-edraft.de/sh-edraft.de/sdb-bot:$(cpl gv)-dev
|
||||
|
||||
build-web:
|
||||
needs: pre-build
|
||||
runs-on: [ dobby.sh-edraft.de, ubuntu-latest ]
|
||||
container: git.sh-edraft.de/sh-edraft.de/act-runner:latest
|
||||
steps:
|
||||
- name: Setup docker
|
||||
uses: https://github.com/papodaca/install-docker-action@main
|
||||
- run: docker -v
|
||||
|
||||
- name: Clone Repository
|
||||
uses: https://github.com/actions/checkout@v3
|
||||
with:
|
||||
token: ${{ secrets.CI_ACCESS_TOKEN }}
|
||||
submodules: true
|
||||
|
||||
- name: Setup node
|
||||
uses: https://github.com/actions/setup-node@v3
|
||||
|
||||
- name: Prepare web build
|
||||
run: |
|
||||
cd web
|
||||
npm install -g ts-node
|
||||
npm ci
|
||||
|
||||
- name: Build docker web
|
||||
run: |
|
||||
cd web
|
||||
docker image prune -f
|
||||
cp src/favicon.dev.ico src/favicon.ico
|
||||
npm run build
|
||||
docker build -t git.sh-edraft.de/sh-edraft.de/sdb-web:$(npm run -s gv)-dev .
|
||||
|
||||
- name: Login to registry git.sh-edraft.de
|
||||
uses: https://github.com/docker/login-action@v1
|
||||
with:
|
||||
registry: git.sh-edraft.de
|
||||
username: ${{ secrets.CI_USERNAME }}
|
||||
password: ${{ secrets.CI_ACCESS_TOKEN }}
|
||||
|
||||
- name: Push image
|
||||
run: |
|
||||
cd web
|
||||
docker push git.sh-edraft.de/sh-edraft.de/sdb-web:$(npm run -s gv)-dev
|
||||
|
||||
deploy:
|
||||
needs: [ build-bot, build-web ]
|
||||
runs-on: [ dobby.sh-edraft.de, ubuntu-latest ]
|
||||
container: git.sh-edraft.de/sh-edraft.de/act-runner:latest
|
||||
steps:
|
||||
- name: Clone Repository
|
||||
uses: https://github.com/actions/checkout@v3
|
||||
with:
|
||||
token: ${{ secrets.CI_ACCESS_TOKEN }}
|
||||
submodules: true
|
||||
|
||||
- name: Install cpl
|
||||
run: python3.10 -m pip install --extra-index-url https://pip.sh-edraft.de cpl-cli
|
||||
|
||||
- name: Set version
|
||||
run: |
|
||||
cd bot/docker
|
||||
chmod +x ./set-docker-compose-image-version.sh
|
||||
./set-docker-compose-image-version.sh git.sh-edraft.de/sh-edraft.de/sdb-bot:$(cd ../; cpl gv)-dev git.sh-edraft.de/sh-edraft.de/sdb-web:$(cd ../../web; npm run -s gv;)-dev
|
||||
|
||||
- name: Deploy Stack to sh-edraft.de
|
||||
uses: https://github.com/kgierke/portainer-stack-deployment@v1
|
||||
with:
|
||||
portainer-url: "https://docker.sh-edraft.de"
|
||||
portainer-username: "gitea_job"
|
||||
portainer-password: "${{ secrets.docker_job }}"
|
||||
portainer-endpoint: 2
|
||||
name: sdb_dev
|
||||
file: bot/docker/docker-compose.dev.yml
|
||||
variables: '{}'
|
@@ -1,128 +0,0 @@
|
||||
name: Deploy prod on push
|
||||
run-name: Deploy prod on push
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
|
||||
jobs:
|
||||
pre-build:
|
||||
runs-on: [ dobby.sh-edraft.de, ubuntu-latest ]
|
||||
container: git.sh-edraft.de/sh-edraft.de/act-runner:latest
|
||||
steps:
|
||||
- name: Shutdown stack
|
||||
run: docker stack rm sdb_prod
|
||||
|
||||
build-bot:
|
||||
needs: pre-build
|
||||
runs-on: [ dobby.sh-edraft.de, ubuntu-latest ]
|
||||
container: git.sh-edraft.de/sh-edraft.de/act-runner:latest
|
||||
steps:
|
||||
- name: Setup docker
|
||||
uses: https://github.com/papodaca/install-docker-action@main
|
||||
- run: docker -v
|
||||
|
||||
- name: Clone Repository
|
||||
uses: https://github.com/actions/checkout@v3
|
||||
with:
|
||||
token: ${{ secrets.CI_ACCESS_TOKEN }}
|
||||
submodules: true
|
||||
|
||||
- name: Prepare bot build
|
||||
run: |
|
||||
python3.10 -m pip install --extra-index-url https://pip.sh-edraft.de cpl-cli
|
||||
cd bot
|
||||
cpl i
|
||||
|
||||
- name: Build docker bot
|
||||
run: |
|
||||
cd bot
|
||||
docker image prune -f
|
||||
cpl build
|
||||
docker build -t git.sh-edraft.de/sh-edraft.de/sdb-bot:$(cpl gv) .
|
||||
|
||||
- name: Login to registry git.sh-edraft.de
|
||||
uses: https://github.com/docker/login-action@v1
|
||||
with:
|
||||
registry: git.sh-edraft.de
|
||||
username: ${{ secrets.CI_USERNAME }}
|
||||
password: ${{ secrets.CI_ACCESS_TOKEN }}
|
||||
|
||||
- name: Push image
|
||||
run: |
|
||||
cd bot
|
||||
docker push git.sh-edraft.de/sh-edraft.de/sdb-bot:$(cpl gv)
|
||||
|
||||
build-web:
|
||||
needs: pre-build
|
||||
runs-on: [ dobby.sh-edraft.de, ubuntu-latest ]
|
||||
container: git.sh-edraft.de/sh-edraft.de/act-runner:latest
|
||||
steps:
|
||||
- name: Setup docker
|
||||
uses: https://github.com/papodaca/install-docker-action@main
|
||||
- run: docker -v
|
||||
|
||||
- name: Clone Repository
|
||||
uses: https://github.com/actions/checkout@v3
|
||||
with:
|
||||
token: ${{ secrets.CI_ACCESS_TOKEN }}
|
||||
submodules: true
|
||||
|
||||
- name: Setup node
|
||||
uses: https://github.com/actions/setup-node@v3
|
||||
|
||||
- name: Prepare web build
|
||||
run: |
|
||||
cd web
|
||||
npm install -g ts-node
|
||||
npm ci
|
||||
|
||||
- name: Build docker web
|
||||
run: |
|
||||
cd web
|
||||
docker image prune -f
|
||||
npm run build
|
||||
docker build -t git.sh-edraft.de/sh-edraft.de/sdb-web:$(npm run -s gv) .
|
||||
|
||||
- name: Login to registry git.sh-edraft.de
|
||||
uses: https://github.com/docker/login-action@v1
|
||||
with:
|
||||
registry: git.sh-edraft.de
|
||||
username: ${{ secrets.CI_USERNAME }}
|
||||
password: ${{ secrets.CI_ACCESS_TOKEN }}
|
||||
|
||||
- name: Push image
|
||||
run: |
|
||||
cd web
|
||||
docker push git.sh-edraft.de/sh-edraft.de/sdb-web:$(npm run -s gv)
|
||||
|
||||
deploy:
|
||||
needs: [ build-bot, build-web ]
|
||||
runs-on: [ dobby.sh-edraft.de, ubuntu-latest ]
|
||||
container: git.sh-edraft.de/sh-edraft.de/act-runner:latest
|
||||
steps:
|
||||
- name: Clone Repository
|
||||
uses: https://github.com/actions/checkout@v3
|
||||
with:
|
||||
token: ${{ secrets.CI_ACCESS_TOKEN }}
|
||||
submodules: true
|
||||
|
||||
- name: Install cpl
|
||||
run: python3.10 -m pip install --extra-index-url https://pip.sh-edraft.de cpl-cli
|
||||
|
||||
- name: Set version
|
||||
run: |
|
||||
cd bot/docker
|
||||
chmod +x ./set-docker-compose-image-version.sh
|
||||
./set-docker-compose-image-version.sh git.sh-edraft.de/sh-edraft.de/sdb-bot:$(cd ../; cpl gv) git.sh-edraft.de/sh-edraft.de/sdb-web:$(cd ../../web; npm run -s gv;)
|
||||
|
||||
- name: Deploy Stack to sh-edraft.de
|
||||
uses: https://github.com/kgierke/portainer-stack-deployment@v1
|
||||
with:
|
||||
portainer-url: "https://docker.sh-edraft.de"
|
||||
portainer-username: "gitea_job"
|
||||
portainer-password: "${{ secrets.docker_job }}"
|
||||
portainer-endpoint: 2
|
||||
name: sdb_prod
|
||||
file: bot/docker/docker-compose.yml
|
||||
variables: '{}'
|
@@ -1,129 +0,0 @@
|
||||
name: Deploy staging on push
|
||||
run-name: Deploy staging on push
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- staging
|
||||
|
||||
jobs:
|
||||
pre-build:
|
||||
runs-on: [ dobby.sh-edraft.de, ubuntu-latest ]
|
||||
container: git.sh-edraft.de/sh-edraft.de/act-runner:latest
|
||||
steps:
|
||||
- name: Shutdown stack
|
||||
run: docker stack rm sdb_staging
|
||||
|
||||
build-bot:
|
||||
needs: pre-build
|
||||
runs-on: [ dobby.sh-edraft.de, ubuntu-latest ]
|
||||
container: git.sh-edraft.de/sh-edraft.de/act-runner:latest
|
||||
steps:
|
||||
- name: Setup docker
|
||||
uses: https://github.com/papodaca/install-docker-action@main
|
||||
- run: docker -v
|
||||
|
||||
- name: Clone Repository
|
||||
uses: https://github.com/actions/checkout@v3
|
||||
with:
|
||||
token: ${{ secrets.CI_ACCESS_TOKEN }}
|
||||
submodules: true
|
||||
|
||||
- name: Prepare bot build
|
||||
run: |
|
||||
python3.10 -m pip install --extra-index-url https://pip.sh-edraft.de cpl-cli
|
||||
cd bot
|
||||
cpl i
|
||||
|
||||
- name: Build docker bot
|
||||
run: |
|
||||
cd bot
|
||||
docker image prune -f
|
||||
cpl build
|
||||
docker build -t git.sh-edraft.de/sh-edraft.de/sdb-bot:$(cpl gv)-staging .
|
||||
|
||||
- name: Login to registry git.sh-edraft.de
|
||||
uses: https://github.com/docker/login-action@v1
|
||||
with:
|
||||
registry: git.sh-edraft.de
|
||||
username: ${{ secrets.CI_USERNAME }}
|
||||
password: ${{ secrets.CI_ACCESS_TOKEN }}
|
||||
|
||||
- name: Push image
|
||||
run: |
|
||||
cd bot
|
||||
docker push git.sh-edraft.de/sh-edraft.de/sdb-bot:$(cpl gv)-staging
|
||||
|
||||
build-web:
|
||||
needs: pre-build
|
||||
runs-on: [ dobby.sh-edraft.de, ubuntu-latest ]
|
||||
container: git.sh-edraft.de/sh-edraft.de/act-runner:latest
|
||||
steps:
|
||||
- name: Setup docker
|
||||
uses: https://github.com/papodaca/install-docker-action@main
|
||||
- run: docker -v
|
||||
|
||||
- name: Clone Repository
|
||||
uses: https://github.com/actions/checkout@v3
|
||||
with:
|
||||
token: ${{ secrets.CI_ACCESS_TOKEN }}
|
||||
submodules: true
|
||||
|
||||
- name: Setup node
|
||||
uses: https://github.com/actions/setup-node@v3
|
||||
|
||||
- name: Prepare web build
|
||||
run: |
|
||||
cd web
|
||||
npm install -g ts-node
|
||||
npm ci
|
||||
|
||||
- name: Build docker web
|
||||
run: |
|
||||
cd web
|
||||
docker image prune -f
|
||||
cp src/favicon.staging.ico src/favicon.ico
|
||||
npm run build
|
||||
docker build -t git.sh-edraft.de/sh-edraft.de/sdb-web:$(npm run -s gv)-staging .
|
||||
|
||||
- name: Login to registry git.sh-edraft.de
|
||||
uses: https://github.com/docker/login-action@v1
|
||||
with:
|
||||
registry: git.sh-edraft.de
|
||||
username: ${{ secrets.CI_USERNAME }}
|
||||
password: ${{ secrets.CI_ACCESS_TOKEN }}
|
||||
|
||||
- name: Push image
|
||||
run: |
|
||||
cd web
|
||||
docker push git.sh-edraft.de/sh-edraft.de/sdb-web:$(npm run -s gv)-staging
|
||||
|
||||
deploy:
|
||||
needs: [ build-bot, build-web ]
|
||||
runs-on: [ dobby.sh-edraft.de, ubuntu-latest ]
|
||||
container: git.sh-edraft.de/sh-edraft.de/act-runner:latest
|
||||
steps:
|
||||
- name: Clone Repository
|
||||
uses: https://github.com/actions/checkout@v3
|
||||
with:
|
||||
token: ${{ secrets.CI_ACCESS_TOKEN }}
|
||||
submodules: true
|
||||
|
||||
- name: Install cpl
|
||||
run: python3.10 -m pip install --extra-index-url https://pip.sh-edraft.de cpl-cli
|
||||
|
||||
- name: Set version
|
||||
run: |
|
||||
cd bot/docker
|
||||
chmod +x ./set-docker-compose-image-version.sh
|
||||
./set-docker-compose-image-version.sh git.sh-edraft.de/sh-edraft.de/sdb-bot:$(cd ../; cpl gv)-staging git.sh-edraft.de/sh-edraft.de/sdb-web:$(cd ../../web; npm run -s gv;)-staging
|
||||
|
||||
- name: Deploy Stack to sh-edraft.de
|
||||
uses: https://github.com/kgierke/portainer-stack-deployment@v1
|
||||
with:
|
||||
portainer-url: "https://docker.sh-edraft.de"
|
||||
portainer-username: "gitea_job"
|
||||
portainer-password: "${{ secrets.docker_job }}"
|
||||
portainer-endpoint: 2
|
||||
name: sdb_staging
|
||||
file: bot/docker/docker-compose.staging.yml
|
||||
variables: '{}'
|
18
.gitmodules
vendored
18
.gitmodules
vendored
@@ -1,9 +1,9 @@
|
||||
[submodule "bot/src/bot/config"]
|
||||
path = bot/src/bot/config
|
||||
url = https://git.sh-edraft.de/sh-edraft.de/sh_discord_bot.config.git
|
||||
[submodule "bot/src/bot_api/config"]
|
||||
path = bot/src/bot_api/config
|
||||
url = https://git.sh-edraft.de/sh-edraft.de/sh_discord_bot.api.config.git
|
||||
[submodule "bot/docker"]
|
||||
path = bot/docker
|
||||
url = https://git.sh-edraft.de/sh-edraft.de/sh_discord_bot.docker.git
|
||||
[submodule "kdb-bot/src/bot/config"]
|
||||
path = kdb-bot/src/bot/config
|
||||
url = https://git.sh-edraft.de/sh-edraft.de/kd_discord_bot.config.git
|
||||
[submodule "kdb-bot/src/bot_api/config"]
|
||||
path = kdb-bot/src/bot_api/config
|
||||
url = https://git.sh-edraft.de/sh-edraft.de/kd_discord_bot.api.config.git
|
||||
[submodule "kdb-bot/docker"]
|
||||
path = kdb-bot/docker
|
||||
url = https://git.sh-edraft.de/sh-edraft.de/kd_discord_bot.docker.git
|
||||
|
9
LICENSE
9
LICENSE
@@ -1,9 +0,0 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2022-2023 sh-edraft.de
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
@@ -1,100 +0,0 @@
|
||||
from cpl_cli.abc.generate_schematic_abc import GenerateSchematicABC
|
||||
|
||||
|
||||
class DBTable(GenerateSchematicABC):
|
||||
def __init__(self, *args: str):
|
||||
GenerateSchematicABC.__init__(self, *args)
|
||||
self._name = self._name.replace("_db_table", "")
|
||||
self._class_name = self._class_name.split("Db_table")[0]
|
||||
|
||||
def get_code(self) -> str:
|
||||
import textwrap
|
||||
|
||||
code = textwrap.dedent(
|
||||
"""\
|
||||
from datetime import datetime
|
||||
|
||||
from cpl_core.database import TableABC
|
||||
|
||||
|
||||
class $ClassName(TableABC):
|
||||
def __init__(
|
||||
self,
|
||||
value: str,
|
||||
created_at: datetime = None,
|
||||
modified_at: datetime = None,
|
||||
id=0,
|
||||
):
|
||||
self._id = id
|
||||
self._value = value
|
||||
|
||||
TableABC.__init__(self)
|
||||
self._created_at = created_at if created_at is not None else self._created_at
|
||||
self._modified_at = modified_at if modified_at is not None else self._modified_at
|
||||
|
||||
@property
|
||||
def value(self) -> str:
|
||||
return self._value
|
||||
|
||||
@value.setter
|
||||
def value(self, value: str):
|
||||
self._value = value
|
||||
|
||||
@staticmethod
|
||||
def get_select_all_string() -> str:
|
||||
return str(
|
||||
f\"""
|
||||
SELECT * FROM `$TableName`;
|
||||
\"""
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def get_select_by_id_string(id: int) -> str:
|
||||
return str(
|
||||
f\"""
|
||||
SELECT * FROM `$TableName`
|
||||
WHERE `Id` = {id};
|
||||
\"""
|
||||
)
|
||||
|
||||
@property
|
||||
def insert_string(self) -> str:
|
||||
return str(
|
||||
f\"""
|
||||
INSERT INTO `$TableName` (
|
||||
`Value`
|
||||
) VALUES (
|
||||
{self._value}
|
||||
);
|
||||
\"""
|
||||
)
|
||||
|
||||
@property
|
||||
def udpate_string(self) -> str:
|
||||
return str(
|
||||
f\"""
|
||||
UPDATE `$TableName`
|
||||
SET `Value` = {self._value}
|
||||
WHERE `Id` = {self._id};
|
||||
\"""
|
||||
)
|
||||
|
||||
@property
|
||||
def delete_string(self) -> str:
|
||||
return str(
|
||||
f\"""
|
||||
DELETE FROM `$TableName`
|
||||
WHERE `Id` = {self._id};
|
||||
\"""
|
||||
)
|
||||
"""
|
||||
)
|
||||
return self.build_code_str(
|
||||
code,
|
||||
ClassName=self._class_name,
|
||||
TableName=self._class_name,
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def register(cls):
|
||||
GenerateSchematicABC.register(cls, "db-table", [])
|
@@ -1,55 +0,0 @@
|
||||
from cpl_cli.abc.generate_schematic_abc import GenerateSchematicABC
|
||||
|
||||
|
||||
class Migration(GenerateSchematicABC):
|
||||
def __init__(self, *args: str):
|
||||
GenerateSchematicABC.__init__(self, *args)
|
||||
|
||||
def get_code(self) -> str:
|
||||
import textwrap
|
||||
|
||||
code = textwrap.dedent(
|
||||
"""\
|
||||
from bot_core.logging.database_logger import DatabaseLogger
|
||||
from bot_data.abc.migration_abc import MigrationABC
|
||||
from bot_data.db_context import DBContext
|
||||
|
||||
|
||||
class $ClassName(MigrationABC):
|
||||
name = "1.0_$ClassName"
|
||||
|
||||
def __init__(self, logger: DatabaseLogger, db: DBContext):
|
||||
MigrationABC.__init__(self)
|
||||
self._logger = logger
|
||||
self._db = db
|
||||
self._cursor = db.cursor
|
||||
|
||||
def upgrade(self):
|
||||
self._logger.debug(__name__, "Running upgrade")
|
||||
|
||||
self._cursor.execute(
|
||||
str(
|
||||
f\"""
|
||||
CREATE TABLE IF NOT EXISTS `$TableName` (
|
||||
`Id` BIGINT NOT NULL AUTO_INCREMENT,
|
||||
`CreatedAt` DATETIME(6),
|
||||
`LastModifiedAt` DATETIME(6),
|
||||
PRIMARY KEY(`Id`)
|
||||
);
|
||||
\"""
|
||||
)
|
||||
)
|
||||
|
||||
def downgrade(self):
|
||||
self._cursor.execute("DROP TABLE `$TableName`;")
|
||||
"""
|
||||
)
|
||||
return self.build_code_str(
|
||||
code,
|
||||
ClassName=self._class_name,
|
||||
TableName=self._class_name.split("Migration")[0],
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def register(cls):
|
||||
GenerateSchematicABC.register(cls, "migration", [])
|
Submodule bot/docker deleted from 36ed43055d
Submodule bot/src/bot/config deleted from eeebd13f80
@@ -1,22 +0,0 @@
|
||||
import os
|
||||
import shutil
|
||||
from datetime import datetime
|
||||
|
||||
from cpl_core.application.application_extension_abc import ApplicationExtensionABC
|
||||
from cpl_core.configuration import ConfigurationABC
|
||||
from cpl_core.dependency_injection import ServiceProviderABC
|
||||
from cpl_query.extension import List
|
||||
|
||||
|
||||
class CleanLogsExtension(ApplicationExtensionABC):
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
async def run(self, config: ConfigurationABC, services: ServiceProviderABC):
|
||||
(
|
||||
List(str, os.listdir("logs/"))
|
||||
.where(lambda x: os.path.isdir(f"logs/{x}"))
|
||||
.order_by()
|
||||
.where(lambda x: (datetime.now() - datetime.strptime(x, "%Y-%m-%d")).days >= 7)
|
||||
.for_each(lambda x: shutil.rmtree(f"logs/{x}"))
|
||||
)
|
Submodule bot/src/bot_api/config deleted from 521951b8ab
@@ -1,22 +0,0 @@
|
||||
from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC
|
||||
|
||||
|
||||
class ApiSettings(ConfigurationModelABC):
|
||||
def __init__(self, port: int = None, host: str = None, redirect_uri: bool = None):
|
||||
ConfigurationModelABC.__init__(self)
|
||||
|
||||
self._port = 80 if port is None else port
|
||||
self._host = "" if host is None else host
|
||||
self._redirect_to_https = False if redirect_uri is None else redirect_uri
|
||||
|
||||
@property
|
||||
def port(self) -> int:
|
||||
return self._port
|
||||
|
||||
@property
|
||||
def host(self) -> str:
|
||||
return self._host
|
||||
|
||||
@property
|
||||
def redirect_to_https(self) -> bool:
|
||||
return self._redirect_to_https
|
@@ -1,39 +0,0 @@
|
||||
from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC
|
||||
|
||||
|
||||
class AuthenticationSettings(ConfigurationModelABC):
|
||||
def __init__(
|
||||
self,
|
||||
secret_key: str = None,
|
||||
issuer: str = None,
|
||||
audience: str = None,
|
||||
token_expire_time: int = None,
|
||||
refresh_token_expire_time: int = None,
|
||||
):
|
||||
ConfigurationModelABC.__init__(self)
|
||||
|
||||
self._secret_key = "" if secret_key is None else secret_key
|
||||
self._issuer = "" if issuer is None else issuer
|
||||
self._audience = "" if audience is None else audience
|
||||
self._token_expire_time = 0 if token_expire_time is None else token_expire_time
|
||||
self._refresh_token_expire_time = 0 if refresh_token_expire_time is None else refresh_token_expire_time
|
||||
|
||||
@property
|
||||
def secret_key(self) -> str:
|
||||
return self._secret_key
|
||||
|
||||
@property
|
||||
def issuer(self) -> str:
|
||||
return self._issuer
|
||||
|
||||
@property
|
||||
def audience(self) -> str:
|
||||
return self._audience
|
||||
|
||||
@property
|
||||
def token_expire_time(self) -> int:
|
||||
return self._token_expire_time
|
||||
|
||||
@property
|
||||
def refresh_token_expire_time(self) -> int:
|
||||
return self._refresh_token_expire_time
|
@@ -1,40 +0,0 @@
|
||||
from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC
|
||||
from cpl_query.extension import List
|
||||
|
||||
|
||||
class DiscordAuthenticationSettings(ConfigurationModelABC):
|
||||
def __init__(
|
||||
self,
|
||||
client_secret: str = None,
|
||||
redirect_uri: str = None,
|
||||
scope: list = None,
|
||||
token_url: str = None,
|
||||
auth_url: str = None,
|
||||
):
|
||||
ConfigurationModelABC.__init__(self)
|
||||
|
||||
self._client_secret = "" if client_secret is None else client_secret
|
||||
self._redirect_url = "" if redirect_uri is None else redirect_uri
|
||||
self._scope = List() if scope is None else List(str, scope)
|
||||
self._token_url = "" if token_url is None else token_url
|
||||
self._auth_url = "" if auth_url is None else auth_url
|
||||
|
||||
@property
|
||||
def client_secret(self) -> str:
|
||||
return self._client_secret
|
||||
|
||||
@property
|
||||
def redirect_url(self) -> str:
|
||||
return self._redirect_url
|
||||
|
||||
@property
|
||||
def scope(self) -> List[str]:
|
||||
return self._scope
|
||||
|
||||
@property
|
||||
def token_url(self) -> str:
|
||||
return self._token_url
|
||||
|
||||
@property
|
||||
def auth_url(self) -> str:
|
||||
return self._auth_url
|
@@ -1,12 +0,0 @@
|
||||
from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC
|
||||
|
||||
|
||||
class FrontendSettings(ConfigurationModelABC):
|
||||
def __init__(self, url: str = None):
|
||||
ConfigurationModelABC.__init__(self)
|
||||
|
||||
self._url = "" if url is None else url
|
||||
|
||||
@property
|
||||
def url(self) -> str:
|
||||
return self._url
|
@@ -1,21 +0,0 @@
|
||||
from abc import ABC, abstractmethod
|
||||
|
||||
import discord
|
||||
|
||||
|
||||
class PermissionServiceABC(ABC):
|
||||
@abstractmethod
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def is_member_admin(self, member: discord.Member) -> bool:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def is_member_moderator(self, member: discord.Member) -> bool:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def is_member_technician(self, member: discord.Member) -> bool:
|
||||
pass
|
@@ -1,33 +0,0 @@
|
||||
import asyncio
|
||||
from abc import abstractmethod
|
||||
|
||||
from cpl_core.configuration import ConfigurationABC
|
||||
from cpl_core.dependency_injection import ServiceProviderABC
|
||||
from cpl_discord.service import DiscordBotServiceABC
|
||||
from discord.ext import commands
|
||||
|
||||
from bot_core.environment_variables import MAINTENANCE
|
||||
from bot_core.logging.task_logger import TaskLogger
|
||||
|
||||
|
||||
class TaskABC(commands.Cog):
|
||||
@abstractmethod
|
||||
def __init__(self):
|
||||
commands.Cog.__init__(self)
|
||||
|
||||
@ServiceProviderABC.inject
|
||||
def _is_maintenance(self, config: ConfigurationABC) -> bool:
|
||||
return config.get_configuration(MAINTENANCE) is True
|
||||
|
||||
@ServiceProviderABC.inject
|
||||
async def _wait_until_ready(self, config: ConfigurationABC, logger: TaskLogger, bot: DiscordBotServiceABC):
|
||||
logger.debug(__name__, f"Waiting before ready {type(self).__name__}")
|
||||
await bot.wait_until_ready()
|
||||
|
||||
async def wait():
|
||||
is_ready = config.get_configuration("IS_READY") is True
|
||||
if not is_ready:
|
||||
await asyncio.sleep(1)
|
||||
await wait()
|
||||
|
||||
await wait()
|
@@ -1,25 +0,0 @@
|
||||
from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC
|
||||
from cpl_core.utils.json_processor import JSONProcessor
|
||||
from cpl_query.extension import List
|
||||
|
||||
from bot_core.configuration.file_logging_settings import FileLoggingSettings
|
||||
|
||||
|
||||
class BotLoggingSettings(ConfigurationModelABC):
|
||||
def __init__(self, **kwargs: dict):
|
||||
ConfigurationModelABC.__init__(self)
|
||||
self._files: List[FileLoggingSettings] = List(FileLoggingSettings)
|
||||
|
||||
if kwargs is not None:
|
||||
self._files_from_dict(kwargs)
|
||||
|
||||
@property
|
||||
def files(self) -> List[FileLoggingSettings]:
|
||||
return self._files
|
||||
|
||||
def _files_from_dict(self, settings: dict):
|
||||
files = List(FileLoggingSettings)
|
||||
for s in settings:
|
||||
settings[s]["Key"] = s
|
||||
files.append(JSONProcessor.process(FileLoggingSettings, settings[s]))
|
||||
self._files = files
|
@@ -1,31 +0,0 @@
|
||||
from enum import Enum
|
||||
|
||||
|
||||
class FeatureFlagsEnum(Enum):
|
||||
# modules
|
||||
achievements_module = "AchievementsModule"
|
||||
api_module = "ApiModule"
|
||||
auto_role_module = "AutoRoleModule"
|
||||
base_module = "BaseModule"
|
||||
boot_log_module = "BootLogModule"
|
||||
core_module = "CoreModule"
|
||||
core_extension_module = "CoreExtensionModule"
|
||||
config_module = "ConfigModule"
|
||||
data_module = "DataModule"
|
||||
database_module = "DatabaseModule"
|
||||
level_module = "LevelModule"
|
||||
moderator_module = "ModeratorModule"
|
||||
short_role_name_module = "ShortRoleNameModule"
|
||||
steam_special_offers_module = "SteamSpecialOffersModule"
|
||||
# features
|
||||
api_only = "ApiOnly"
|
||||
presence = "Presence"
|
||||
version_in_presence = "VersionInPresence"
|
||||
game_server = "GameServer"
|
||||
sync_xp = "SyncXp"
|
||||
short_role_name = "ShortRoleName"
|
||||
technician_full_access = "TechnicianFullAccess"
|
||||
steam_special_offers = "SteamSpecialOffers"
|
||||
scheduled_events = "ScheduledEvents"
|
||||
basic_registration = "BasicRegistration"
|
||||
basic_login = "BasicLogin"
|
@@ -1,65 +0,0 @@
|
||||
from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC
|
||||
|
||||
from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
|
||||
|
||||
|
||||
class FeatureFlagsSettings(ConfigurationModelABC):
|
||||
_flags = {
|
||||
# modules
|
||||
FeatureFlagsEnum.achievements_module.value: False, # 14.06.2023 #268
|
||||
FeatureFlagsEnum.api_module.value: False, # 13.10.2022 #70
|
||||
FeatureFlagsEnum.auto_role_module.value: False, # 03.10.2022 #54
|
||||
FeatureFlagsEnum.base_module.value: True, # 02.10.2022 #48
|
||||
FeatureFlagsEnum.boot_log_module.value: True, # 02.10.2022 #48
|
||||
FeatureFlagsEnum.core_module.value: True, # 03.10.2022 #56
|
||||
FeatureFlagsEnum.core_extension_module.value: True, # 03.10.2022 #56
|
||||
FeatureFlagsEnum.data_module.value: True, # 03.10.2022 #56
|
||||
FeatureFlagsEnum.database_module.value: True, # 02.10.2022 #48
|
||||
FeatureFlagsEnum.moderator_module.value: False, # 02.10.2022 #48
|
||||
FeatureFlagsEnum.config_module.value: True, # 19.07.2023 #127
|
||||
FeatureFlagsEnum.short_role_name_module.value: True, # 28.09.2023 #378
|
||||
FeatureFlagsEnum.steam_special_offers_module.value: True, # 11.10.2023 #188
|
||||
# features
|
||||
FeatureFlagsEnum.api_only.value: False, # 13.10.2022 #70
|
||||
FeatureFlagsEnum.presence.value: True, # 03.10.2022 #56
|
||||
FeatureFlagsEnum.version_in_presence.value: False, # 21.03.2023 #253
|
||||
FeatureFlagsEnum.game_server.value: False, # 25.09.2023 #366
|
||||
FeatureFlagsEnum.sync_xp.value: False, # 25.09.2023 #366
|
||||
FeatureFlagsEnum.short_role_name.value: False, # 28.09.2023 #378
|
||||
FeatureFlagsEnum.technician_full_access.value: False, # 03.10.2023 #393
|
||||
FeatureFlagsEnum.steam_special_offers.value: False, # 11.10.2023 #188
|
||||
FeatureFlagsEnum.scheduled_events.value: False, # 14.11.2023 #410
|
||||
FeatureFlagsEnum.basic_registration.value: False, # 19.11.2023 #440
|
||||
FeatureFlagsEnum.basic_login.value: False, # 19.11.2023 #440
|
||||
}
|
||||
|
||||
def __init__(self, **kwargs: dict):
|
||||
ConfigurationModelABC.__init__(self)
|
||||
|
||||
if len(kwargs.keys()) == 0:
|
||||
return
|
||||
|
||||
for flag in [f.value for f in FeatureFlagsEnum]:
|
||||
self._load_flag(kwargs, FeatureFlagsEnum(flag))
|
||||
|
||||
@classmethod
|
||||
def get_flag_from_dict(cls, flags: dict, key: FeatureFlagsEnum) -> bool:
|
||||
def get_flag():
|
||||
if key.value not in cls._flags:
|
||||
return False
|
||||
return cls._flags[key.value]
|
||||
|
||||
if key.value not in flags:
|
||||
return get_flag()
|
||||
return flags[key.value]
|
||||
|
||||
def get_flag(self, key: FeatureFlagsEnum) -> bool:
|
||||
if key.value not in self._flags:
|
||||
return False
|
||||
return self._flags[key.value]
|
||||
|
||||
def _load_flag(self, settings: dict, key: FeatureFlagsEnum):
|
||||
if key.value not in settings:
|
||||
return
|
||||
|
||||
self._flags[key.value] = bool(settings[key.value])
|
@@ -1,19 +0,0 @@
|
||||
from cpl_core.logging import LoggingSettings, LoggingLevelEnum
|
||||
|
||||
|
||||
class FileLoggingSettings(LoggingSettings):
|
||||
def __init__(
|
||||
self,
|
||||
key: str,
|
||||
path: str = None,
|
||||
filename: str = None,
|
||||
console_log_level: LoggingLevelEnum = None,
|
||||
file_log_level: LoggingLevelEnum = None,
|
||||
):
|
||||
LoggingSettings.__init__(self, path, filename, console_log_level, file_log_level)
|
||||
|
||||
self._key = key
|
||||
|
||||
@property
|
||||
def key(self) -> str:
|
||||
return self._key
|
@@ -1,2 +0,0 @@
|
||||
MIGRATION_ONLY = "MIGRATION_ONLY"
|
||||
MAINTENANCE = "MAINTENANCE"
|
@@ -1,35 +0,0 @@
|
||||
import inspect
|
||||
from typing import Optional
|
||||
|
||||
from discord.ext import commands
|
||||
|
||||
from bot_core.abc.client_utils_abc import ClientUtilsABC
|
||||
from bot_core.exception.check_error import CheckError
|
||||
|
||||
|
||||
class EventChecks:
|
||||
_client_utils: Optional[ClientUtilsABC] = None
|
||||
|
||||
@classmethod
|
||||
def init(
|
||||
cls,
|
||||
client_utils: ClientUtilsABC,
|
||||
):
|
||||
cls._client_utils = client_utils
|
||||
|
||||
@classmethod
|
||||
def check_is_ready(cls, func):
|
||||
async def check_if_bot_is_ready(*args, **kwargs):
|
||||
result = await cls._client_utils.check_if_bot_is_ready_yet()
|
||||
if not result:
|
||||
|
||||
def empty(*args, **kwargs):
|
||||
return
|
||||
|
||||
return empty
|
||||
return await func(*args, **kwargs)
|
||||
|
||||
check_if_bot_is_ready.__name__ = func.__name__
|
||||
sig = inspect.signature(func)
|
||||
check_if_bot_is_ready.__signature__ = sig.replace(parameters=tuple(sig.parameters.values())[1:])
|
||||
return check_if_bot_is_ready
|
@@ -1,15 +0,0 @@
|
||||
from cpl_core.configuration import ConfigurationABC
|
||||
from cpl_core.environment import ApplicationEnvironmentABC
|
||||
from cpl_core.time import TimeFormatSettings
|
||||
|
||||
from bot_core.abc.custom_file_logger_abc import CustomFileLoggerABC
|
||||
|
||||
|
||||
class EventLogger(CustomFileLoggerABC):
|
||||
def __init__(
|
||||
self,
|
||||
config: ConfigurationABC,
|
||||
time_format: TimeFormatSettings,
|
||||
env: ApplicationEnvironmentABC,
|
||||
):
|
||||
CustomFileLoggerABC.__init__(self, "Event", config, time_format, env)
|
@@ -1,15 +0,0 @@
|
||||
from cpl_core.configuration import ConfigurationABC
|
||||
from cpl_core.environment import ApplicationEnvironmentABC
|
||||
from cpl_core.time import TimeFormatSettings
|
||||
|
||||
from bot_core.abc.custom_file_logger_abc import CustomFileLoggerABC
|
||||
|
||||
|
||||
class TaskLogger(CustomFileLoggerABC):
|
||||
def __init__(
|
||||
self,
|
||||
config: ConfigurationABC,
|
||||
time_format: TimeFormatSettings,
|
||||
env: ApplicationEnvironmentABC,
|
||||
):
|
||||
CustomFileLoggerABC.__init__(self, "Task", config, time_format, env)
|
@@ -1,52 +0,0 @@
|
||||
from cpl_core.configuration import ConfigurationABC
|
||||
from cpl_core.dependency_injection import ServiceProviderABC
|
||||
|
||||
from bot_core.configuration.feature_flags_settings import FeatureFlagsSettings
|
||||
from bot_data.abc.server_config_repository_abc import ServerConfigRepositoryABC
|
||||
from bot_data.abc.technician_config_repository_abc import TechnicianConfigRepositoryABC
|
||||
from bot_data.model.server import Server
|
||||
from bot_data.model.technician_config import TechnicianConfig
|
||||
from bot_data.service.server_config_seeder import ServerConfigSeeder
|
||||
from bot_data.service.technician_config_seeder import TechnicianConfigSeeder
|
||||
|
||||
|
||||
class ConfigService:
|
||||
def __init__(
|
||||
self,
|
||||
config: ConfigurationABC,
|
||||
services: ServiceProviderABC,
|
||||
technician_config_repo: TechnicianConfigRepositoryABC,
|
||||
server_config_repo: ServerConfigRepositoryABC,
|
||||
technician_seeder: TechnicianConfigSeeder,
|
||||
server_seeder: ServerConfigSeeder,
|
||||
):
|
||||
self._config = config
|
||||
self._services = services
|
||||
self._technician_config_repo = technician_config_repo
|
||||
self._technician_seeder = technician_seeder
|
||||
self._server_config_repo = server_config_repo
|
||||
|
||||
self._server_seeder = server_seeder
|
||||
|
||||
async def reload_technician_config(self):
|
||||
try:
|
||||
technician_config = self._technician_config_repo.get_technician_config()
|
||||
except Exception as e:
|
||||
await self._technician_seeder.seed()
|
||||
technician_config = self._technician_config_repo.get_technician_config()
|
||||
|
||||
self._config.add_configuration(TechnicianConfig, technician_config)
|
||||
self._config.add_configuration(
|
||||
FeatureFlagsSettings,
|
||||
FeatureFlagsSettings(**technician_config.feature_flags),
|
||||
)
|
||||
|
||||
async def reload_server_config(self, server: Server):
|
||||
if not self._server_config_repo.does_server_config_exists(server.id):
|
||||
await self._server_seeder.seed()
|
||||
|
||||
server_config = self._server_config_repo.get_server_config_by_server(server.id)
|
||||
self._config.add_configuration(
|
||||
f"{type(server_config).__name__}_{server_config.server.discord_id}",
|
||||
server_config,
|
||||
)
|
@@ -1,319 +0,0 @@
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
from cpl_core.configuration import ConfigurationABC
|
||||
from cpl_core.database.context import DatabaseContextABC
|
||||
from cpl_discord.container import Member, Guild
|
||||
from cpl_discord.service import DiscordBotServiceABC
|
||||
|
||||
from bot_core.abc.client_utils_abc import ClientUtilsABC
|
||||
from bot_core.logging.database_logger import DatabaseLogger
|
||||
from bot_core.pipes.date_time_offset_pipe import DateTimeOffsetPipe
|
||||
from bot_data.abc.client_repository_abc import ClientRepositoryABC
|
||||
from bot_data.abc.known_user_repository_abc import KnownUserRepositoryABC
|
||||
from bot_data.abc.user_joined_game_server_repository_abc import (
|
||||
UserJoinedGameServerRepositoryABC,
|
||||
)
|
||||
from bot_data.abc.user_joined_server_repository_abc import UserJoinedServerRepositoryABC
|
||||
from bot_data.abc.user_joined_voice_channel_repository_abc import (
|
||||
UserJoinedVoiceChannelRepositoryABC,
|
||||
)
|
||||
from bot_data.abc.user_repository_abc import UserRepositoryABC
|
||||
from bot_data.model.client import Client
|
||||
from bot_data.model.known_user import KnownUser
|
||||
from bot_data.model.server import Server
|
||||
from bot_data.model.server_config import ServerConfig
|
||||
from bot_data.model.user import User
|
||||
from bot_data.model.user_joined_server import UserJoinedServer
|
||||
from bot_data.model.user_joined_voice_channel import UserJoinedVoiceChannel
|
||||
from bot_data.service.user_repository_service import ServerRepositoryABC
|
||||
from modules.achievements.achievement_service import AchievementService
|
||||
|
||||
|
||||
class DataIntegrityService:
|
||||
def __init__(
|
||||
self,
|
||||
config: ConfigurationABC,
|
||||
logger: DatabaseLogger,
|
||||
bot: DiscordBotServiceABC,
|
||||
db_context: DatabaseContextABC,
|
||||
server_repo: ServerRepositoryABC,
|
||||
user_repo: UserRepositoryABC,
|
||||
client_repo: ClientRepositoryABC,
|
||||
known_users: KnownUserRepositoryABC,
|
||||
user_joins: UserJoinedServerRepositoryABC,
|
||||
user_joins_vc: UserJoinedVoiceChannelRepositoryABC,
|
||||
user_joined_gs: UserJoinedGameServerRepositoryABC,
|
||||
achievement_service: AchievementService,
|
||||
client_utils: ClientUtilsABC,
|
||||
dtp: DateTimeOffsetPipe,
|
||||
):
|
||||
self._config = config
|
||||
|
||||
self._logger = logger
|
||||
self._bot = bot
|
||||
self._db_context = db_context
|
||||
self._servers = server_repo
|
||||
self._users = user_repo
|
||||
self._clients = client_repo
|
||||
self._known_users = known_users
|
||||
self._user_joins = user_joins
|
||||
self._user_joins_vc = user_joins_vc
|
||||
self._user_joined_gs = user_joined_gs
|
||||
self._achievements = achievement_service
|
||||
self._client_utils = client_utils
|
||||
self._dtp = dtp
|
||||
|
||||
self._is_for_shutdown = False
|
||||
|
||||
async def check_data_integrity(self, is_for_shutdown=False):
|
||||
self._logger.info(__name__, f"Data integrity service started")
|
||||
if is_for_shutdown != self._is_for_shutdown:
|
||||
self._is_for_shutdown = is_for_shutdown
|
||||
|
||||
try:
|
||||
for g in self._bot.guilds:
|
||||
self._logger.debug(__name__, f"Start check for server: {g.id}")
|
||||
s = self._get_or_create_server(g)
|
||||
self._logger.debug(__name__, f"Start check for clients")
|
||||
self._check_clients(g.id, s)
|
||||
|
||||
for m in [m for m in g.members if not m.bot]:
|
||||
await self._check_default_role(m)
|
||||
self._check_known_user(m.id)
|
||||
|
||||
self._logger.debug(__name__, f"Start check for member: {g.id}@{m.id}")
|
||||
u = self._get_or_create_user(s, m.id)
|
||||
|
||||
self._logger.debug(__name__, f"Start check for user joined server: {g.id}@{m.id}")
|
||||
self._check_user_join(g, m, u)
|
||||
|
||||
self._logger.debug(__name__, f"Start check for user joined voice channels: {g.id}@{m.id}")
|
||||
self._check_user_joined_vc(g.id, m, u)
|
||||
|
||||
self._logger.debug(__name__, f"Start check for user joined game servers: {g.id}@{m.id}")
|
||||
self._check_user_joined_gs(g.id, m.id, u)
|
||||
|
||||
self._logger.debug(__name__, f"Start check for user got achievements: {g.id}@{m.id}")
|
||||
await self._check_for_user_achievements(u)
|
||||
|
||||
for m in [m for m in g.members if m.bot]:
|
||||
u = self._users.find_user_by_discord_id_and_server_id(m.id, s.id)
|
||||
if u is None:
|
||||
continue
|
||||
|
||||
self._remove_bot(u)
|
||||
self._logger.info(__name__, f"Data integrity service finished")
|
||||
except Exception as e:
|
||||
self._logger.fatal(__name__, f"Checking data integrity failed", e)
|
||||
|
||||
def _get_or_create_server(self, guild: Guild) -> Server:
|
||||
try:
|
||||
server = self._servers.find_server_by_discord_id(guild.id)
|
||||
if server is not None:
|
||||
return server
|
||||
|
||||
self._logger.warn(__name__, f"Server not found in database: {guild.id}")
|
||||
self._logger.debug(__name__, f"Add server: {guild.id}")
|
||||
self._servers.add_server(Server(guild.id))
|
||||
self._db_context.save_changes()
|
||||
|
||||
server = self._servers.find_server_by_discord_id(guild.id)
|
||||
if server is None:
|
||||
self._logger.fatal(__name__, f"Cannot add server: {guild.id}")
|
||||
|
||||
self._logger.trace(__name__, f"Added server: {guild.id}")
|
||||
return server
|
||||
except Exception as e:
|
||||
self._logger.error(__name__, f"Cannot get server", e)
|
||||
|
||||
def _check_clients(self, guild_id: int, server: Server):
|
||||
try:
|
||||
client = self._clients.find_client_by_server_id(server.id)
|
||||
if client is not None:
|
||||
return
|
||||
|
||||
self._logger.warn(
|
||||
__name__,
|
||||
f"Client for server {guild_id} not found in database: {self._bot.user.id}",
|
||||
)
|
||||
self._logger.debug(__name__, f"Add client: {self._bot.user.id}")
|
||||
self._clients.add_client(Client(self._bot.user.id, 0, 0, 0, 0, 0, server))
|
||||
self._db_context.save_changes()
|
||||
|
||||
client = self._clients.find_client_by_server_id(server.id)
|
||||
if client is None:
|
||||
self._logger.fatal(
|
||||
__name__,
|
||||
f"Cannot add client {self._bot.user.id} for server {guild_id}",
|
||||
)
|
||||
|
||||
self._logger.trace(__name__, f"Added client: {guild_id}")
|
||||
except Exception as e:
|
||||
self._logger.error(__name__, f"Cannot get client", e)
|
||||
|
||||
results = self._servers.get_servers()
|
||||
if results is None or len(results) == 0:
|
||||
self._logger.error(__name__, f"Table Servers is empty!")
|
||||
|
||||
def _check_known_user(self, member_id: int):
|
||||
try:
|
||||
if self._known_users.find_user_by_discord_id(member_id) is not None:
|
||||
return
|
||||
|
||||
self._logger.warn(__name__, f"Unknown user: {member_id}")
|
||||
self._logger.trace(__name__, f"Add known user: {member_id}")
|
||||
self._known_users.add_user(KnownUser(member_id))
|
||||
self._db_context.save_changes()
|
||||
|
||||
user = self._known_users.find_user_by_discord_id(member_id)
|
||||
if user is None:
|
||||
self._logger.fatal(__name__, f"Cannot add user: {member_id}")
|
||||
|
||||
self._logger.trace(__name__, f"Added known user: {member_id}")
|
||||
except Exception as e:
|
||||
self._logger.error(__name__, f"Cannot get user", e)
|
||||
|
||||
def _get_or_create_user(self, server: Server, member_id: int) -> User:
|
||||
try:
|
||||
user = self._users.find_user_by_discord_id_and_server_id(member_id, server.id)
|
||||
if user is not None:
|
||||
return user
|
||||
|
||||
self._logger.warn(__name__, f"User not found in database: {member_id}")
|
||||
self._logger.debug(__name__, f"Add user: {member_id}")
|
||||
self._users.add_user(User(member_id, 0, 0, 0, None, server))
|
||||
self._db_context.save_changes()
|
||||
|
||||
self._logger.trace(__name__, f"Added User: {member_id}")
|
||||
return self._users.get_user_by_discord_id_and_server_id(member_id, server.id)
|
||||
except Exception as e:
|
||||
self._logger.error(__name__, f"Cannot get User", e)
|
||||
|
||||
results = self._users.get_users()
|
||||
if results is None or len(results) == 0:
|
||||
self._logger.error(__name__, f"Table Users is empty!")
|
||||
|
||||
def _check_user_join(self, guild: Guild, member: Member, user: User):
|
||||
try:
|
||||
join = self._user_joins.find_active_user_joined_server_by_user_id(user.id)
|
||||
if join is not None:
|
||||
return
|
||||
|
||||
self._logger.warn(
|
||||
__name__,
|
||||
f"Active UserJoinedServer not found in database: {guild.id}:{member.id}@{member.joined_at}",
|
||||
)
|
||||
self._logger.debug(
|
||||
__name__,
|
||||
f"Add UserJoinedServer: {guild.id}:{member.id}@{member.joined_at}",
|
||||
)
|
||||
self._user_joins.add_user_joined_server(UserJoinedServer(user, self._dtp.transform(member.joined_at), None))
|
||||
self._db_context.save_changes()
|
||||
|
||||
self._logger.trace(__name__, f"Added UserJoinedServer: {member.id}")
|
||||
except Exception as e:
|
||||
self._logger.error(__name__, f"Cannot get UserJoinedServer", e)
|
||||
|
||||
try:
|
||||
joins = self._user_joins.get_user_joined_servers()
|
||||
for join in [x for x in joins if x.user.server.discord_id == guild.id and x.leaved_on is None]:
|
||||
dc_user = guild.get_member(join.user.discord_id)
|
||||
if dc_user is not None:
|
||||
continue
|
||||
|
||||
self._logger.warn(
|
||||
__name__,
|
||||
f"User {join.user.discord_id} already left the server.",
|
||||
)
|
||||
join.leaved_on = datetime.now()
|
||||
self._user_joins.update_user_joined_server(join)
|
||||
|
||||
self._db_context.save_changes()
|
||||
except Exception as e:
|
||||
self._logger.error(__name__, f"Cannot update UserJoinedServer", e)
|
||||
|
||||
def _check_user_joined_vc(self, guild_id: int, member: Member, user: User):
|
||||
settings: ServerConfig = self._config.get_configuration(f"ServerConfig_{guild_id}")
|
||||
|
||||
try:
|
||||
# close open voice states
|
||||
joins = self._user_joins_vc.find_active_user_joined_voice_channels_by_user_id(user.id)
|
||||
if joins is None or len(joins) == 0:
|
||||
return
|
||||
|
||||
for join in joins:
|
||||
self._logger.warn(
|
||||
__name__,
|
||||
f"Active UserJoinedVoiceChannel found in database: {guild_id}:{member.id}@{join.joined_on}",
|
||||
)
|
||||
join.leaved_on = datetime.now()
|
||||
|
||||
if ((join.leaved_on - join.joined_on).total_seconds() / 60 / 60) > settings.max_voice_state_hours:
|
||||
join.leaved_on = join.joined_on + timedelta(hours=settings.max_voice_state_hours)
|
||||
|
||||
self._user_joins_vc.update_user_joined_voice_channel(join)
|
||||
|
||||
if self._is_for_shutdown:
|
||||
user.xp += round(join.time * settings.xp_per_ontime_hour)
|
||||
self._users.update_user(user)
|
||||
|
||||
self._db_context.save_changes()
|
||||
if self._is_for_shutdown:
|
||||
return
|
||||
|
||||
# add open voice states
|
||||
if member.voice is None or member.voice.channel.id in settings.afk_channel_ids:
|
||||
return
|
||||
|
||||
join = UserJoinedVoiceChannel(user, member.voice.channel.id, datetime.now())
|
||||
self._user_joins_vc.add_user_joined_voice_channel(join)
|
||||
self._db_context.save_changes()
|
||||
except Exception as e:
|
||||
self._logger.error(__name__, f"Cannot get UserJoinedVoiceChannel", e)
|
||||
|
||||
def _check_user_joined_gs(self, guild_id: int, member_id: int, user: User):
|
||||
try:
|
||||
joins = self._user_joined_gs.find_active_user_joined_game_servers_by_user_id(user.id)
|
||||
if joins is None or len(joins) == 0:
|
||||
return
|
||||
|
||||
for join in joins:
|
||||
self._logger.warn(
|
||||
__name__,
|
||||
f"Active UserJoinedGameServer found in database: {guild_id}:{member_id}@{join.joined_on}",
|
||||
)
|
||||
join.leaved_on = datetime.now()
|
||||
settings: ServerConfig = self._config.get_configuration(f"ServerConfig_{guild_id}")
|
||||
|
||||
if join.time > settings.max_voice_state_hours:
|
||||
join.leaved_on = join.joined_on + timedelta(hours=settings.max_voice_state_hours)
|
||||
|
||||
self._user_joined_gs.update_user_joined_game_server(join)
|
||||
if self._is_for_shutdown:
|
||||
user.xp += round(join.time * settings.xp_per_ontime_hour)
|
||||
self._users.update_user(user)
|
||||
|
||||
self._db_context.save_changes()
|
||||
except Exception as e:
|
||||
self._logger.error(__name__, f"Cannot get UserJoinedGameServer", e)
|
||||
|
||||
async def _check_for_user_achievements(self, user: User):
|
||||
try:
|
||||
await self._achievements.validate_achievements_for_user(user)
|
||||
except Exception as e:
|
||||
self._logger.error(__name__, f"Cannot check UserGotAchievement for {user.id}", e)
|
||||
|
||||
async def _check_default_role(self, member: Member):
|
||||
await self._client_utils.check_default_role(member)
|
||||
|
||||
def _remove_bot(self, user: User):
|
||||
known_user = self._known_users.find_user_by_discord_id(user.discord_id)
|
||||
if known_user is not None:
|
||||
self._known_users.delete_user(known_user)
|
||||
|
||||
for join in self._user_joins.get_user_joined_servers_by_user_id(user.id):
|
||||
self._user_joins.delete_user_joined_server(join)
|
||||
|
||||
self._user_joins_vc.delete_user_joined_voice_channel_by_user_id(user.id)
|
||||
self._users.delete_user(user)
|
||||
self._db_context.save_changes()
|
@@ -1,114 +0,0 @@
|
||||
from typing import Optional
|
||||
|
||||
import discord
|
||||
from cpl_core.configuration import ConfigurationABC
|
||||
from cpl_core.logging import LoggerABC
|
||||
from cpl_discord.service import DiscordBotServiceABC
|
||||
|
||||
from bot_data.abc.server_config_repository_abc import ServerConfigRepositoryABC
|
||||
from bot_data.abc.server_repository_abc import ServerRepositoryABC
|
||||
from bot_data.abc.technician_config_repository_abc import TechnicianConfigRepositoryABC
|
||||
from bot_data.model.team_member_type_enum import TeamMemberTypeEnum
|
||||
from bot_core.abc.permission_service_abc import PermissionServiceABC
|
||||
|
||||
|
||||
class PermissionService(PermissionServiceABC):
|
||||
def __init__(
|
||||
self,
|
||||
logger: LoggerABC,
|
||||
bot: DiscordBotServiceABC,
|
||||
config: ConfigurationABC,
|
||||
servers: ServerRepositoryABC,
|
||||
server_configs: ServerConfigRepositoryABC,
|
||||
technician_configs: TechnicianConfigRepositoryABC,
|
||||
):
|
||||
PermissionServiceABC.__init__(self)
|
||||
self._logger = logger
|
||||
self._bot = bot
|
||||
self._config = config
|
||||
self._servers = servers
|
||||
self._server_configs = server_configs
|
||||
self._technician_configs = technician_configs
|
||||
|
||||
# member_id: {team_member_type: {guild_id: bool}}
|
||||
self._cache: dict[int, dict[TeamMemberTypeEnum, dict[int, bool]]] = {}
|
||||
|
||||
def reset_cache(self):
|
||||
self._cache = {}
|
||||
|
||||
def get_cached_permission(
|
||||
self, member_id: int, team_member_type: TeamMemberTypeEnum, guild_id: int = None
|
||||
) -> Optional[bool]:
|
||||
if member_id not in self._cache:
|
||||
self._cache[member_id] = {}
|
||||
|
||||
if team_member_type not in self._cache[member_id]:
|
||||
self._cache[member_id][team_member_type] = {}
|
||||
return None
|
||||
|
||||
if guild_id not in self._cache[member_id][team_member_type]:
|
||||
return None
|
||||
|
||||
return self._cache[member_id][team_member_type][guild_id]
|
||||
|
||||
def set_cached_permission(
|
||||
self, value: bool, member_id: int, team_member_type: TeamMemberTypeEnum, guild_id: int = None
|
||||
):
|
||||
if member_id not in self._cache:
|
||||
self._cache[member_id] = {}
|
||||
|
||||
if team_member_type not in self._cache[member_id]:
|
||||
self._cache[member_id][team_member_type] = {}
|
||||
|
||||
self._cache[member_id][team_member_type][guild_id] = value
|
||||
|
||||
def _has_member_role(self, member: discord.Member, team_member_type: TeamMemberTypeEnum) -> bool:
|
||||
if member is None or member.guild is None:
|
||||
return False
|
||||
|
||||
try:
|
||||
has_permission_cached = self.get_cached_permission(member.id, team_member_type, member.guild.id)
|
||||
if has_permission_cached is not None:
|
||||
return has_permission_cached
|
||||
|
||||
self._logger.debug(__name__, f"Checking is member {member.name} {team_member_type.value}")
|
||||
|
||||
has_permission = True in [
|
||||
member.guild.get_role(x.role_id) in member.roles
|
||||
for x in self._server_configs.get_server_config_by_server(
|
||||
self._servers.get_server_by_discord_id(member.guild.id).id
|
||||
).team_role_ids
|
||||
if x.team_member_type == team_member_type
|
||||
]
|
||||
self.set_cached_permission(has_permission, member.id, team_member_type, member.guild.id)
|
||||
return has_permission
|
||||
except Exception as e:
|
||||
self._logger.error(__name__, "Permission check failed", e)
|
||||
|
||||
return False
|
||||
|
||||
def is_member_admin(self, member: discord.Member) -> bool:
|
||||
return self._has_member_role(member, TeamMemberTypeEnum.admin)
|
||||
|
||||
def is_member_moderator(self, member: discord.Member) -> bool:
|
||||
return self._has_member_role(member, TeamMemberTypeEnum.moderator) or self._has_member_role(
|
||||
member, TeamMemberTypeEnum.admin
|
||||
)
|
||||
|
||||
def is_member_technician(self, member: discord.Member) -> bool:
|
||||
if member is None or member.guild is None:
|
||||
return False
|
||||
|
||||
has_permission_cached = self.get_cached_permission(member.id, TeamMemberTypeEnum.technician)
|
||||
if has_permission_cached is not None:
|
||||
return has_permission_cached
|
||||
|
||||
self._logger.debug(__name__, f"Checking is member {member.name} technician")
|
||||
|
||||
try:
|
||||
has_permission = member.id in self._technician_configs.get_technician_config().technician_ids
|
||||
self.set_cached_permission(has_permission, member.id, TeamMemberTypeEnum.technician)
|
||||
return has_permission
|
||||
except Exception as e:
|
||||
self._logger.error(__name__, "Permission check failed", e)
|
||||
return False
|
@@ -1,52 +0,0 @@
|
||||
from abc import ABC, abstractmethod
|
||||
|
||||
from cpl_query.extension import List
|
||||
|
||||
from bot_data.model.achievement import Achievement
|
||||
from bot_data.model.user_got_achievement import UserGotAchievement
|
||||
|
||||
|
||||
class AchievementRepositoryABC(ABC):
|
||||
@abstractmethod
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def get_achievements(self) -> List[Achievement]:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def get_achievement_by_id(self, id: int) -> Achievement:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def get_achievements_by_server_id(self, server_id: int) -> List[Achievement]:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def get_achievements_by_user_id(self, user_id: int) -> List[Achievement]:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def get_user_got_achievements_by_achievement_id(self, achievement_id: int) -> List[Achievement]:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def add_achievement(self, achievement: Achievement):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def update_achievement(self, achievement: Achievement):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def delete_achievement(self, achievement: Achievement):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def add_user_got_achievement(self, join: UserGotAchievement):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def delete_user_got_achievement(self, join: UserGotAchievement):
|
||||
pass
|
@@ -1,39 +0,0 @@
|
||||
from abc import ABC, abstractmethod
|
||||
|
||||
from cpl_query.extension import List
|
||||
|
||||
from bot_data.model.game_server import GameServer
|
||||
|
||||
|
||||
class GameServerRepositoryABC(ABC):
|
||||
@abstractmethod
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def get_game_servers(self) -> List[GameServer]:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def get_game_server_by_id(self, id: int) -> GameServer:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def get_game_servers_by_server_id(self, id: int) -> List[GameServer]:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def get_game_servers_by_api_key_id(self, id: int) -> List[GameServer]:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def add_game_server(self, game_server: GameServer):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def update_game_server(self, game_server: GameServer):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def delete_game_server(self, game_server: GameServer):
|
||||
pass
|
@@ -1,27 +0,0 @@
|
||||
from abc import ABC, abstractmethod
|
||||
from datetime import datetime
|
||||
|
||||
|
||||
class HistoryTableABC(ABC):
|
||||
@abstractmethod
|
||||
def __init__(self):
|
||||
self._id = 0
|
||||
self._deleted = False
|
||||
self._date_from = datetime.now().isoformat()
|
||||
self._date_to = datetime.now().isoformat()
|
||||
|
||||
@property
|
||||
def id(self) -> int:
|
||||
return self._id
|
||||
|
||||
@property
|
||||
def deleted(self) -> bool:
|
||||
return self._deleted
|
||||
|
||||
@property
|
||||
def date_from(self) -> str:
|
||||
return self._date_from
|
||||
|
||||
@property
|
||||
def date_to(self) -> str:
|
||||
return self._date_to
|
@@ -1,32 +0,0 @@
|
||||
import os
|
||||
from abc import ABC, abstractmethod
|
||||
|
||||
from cpl_core.dependency_injection import ServiceProviderABC
|
||||
from mysql.connector.cursor import MySQLCursorBuffered
|
||||
|
||||
from bot_data.db_context import DBContext
|
||||
|
||||
|
||||
class MigrationABC(ABC):
|
||||
name = None
|
||||
prio = 0
|
||||
|
||||
@abstractmethod
|
||||
@ServiceProviderABC.inject
|
||||
def __init__(self, db: DBContext):
|
||||
self._cursor: MySQLCursorBuffered = db.cursor
|
||||
|
||||
@abstractmethod
|
||||
def upgrade(self):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def downgrade(self):
|
||||
pass
|
||||
|
||||
def _exec(self, self_file: str, file: str):
|
||||
path = f"{os.path.dirname(os.path.realpath(self_file))}/db_history_scripts"
|
||||
sql = open(f"{path}/{file}").read()
|
||||
|
||||
for statement in sql.split("\n\n"):
|
||||
self._cursor.execute(statement + ";")
|
@@ -1,35 +0,0 @@
|
||||
from abc import ABC, abstractmethod
|
||||
|
||||
from cpl_query.extension import List
|
||||
|
||||
from bot_data.model.scheduled_event import ScheduledEvent
|
||||
|
||||
|
||||
class ScheduledEventRepositoryABC(ABC):
|
||||
@abstractmethod
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def get_scheduled_events(self) -> List[ScheduledEvent]:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def get_scheduled_event_by_id(self, id: int) -> ScheduledEvent:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def get_scheduled_events_by_server_id(self, id: int) -> List[ScheduledEvent]:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def add_scheduled_event(self, scheduled_event: ScheduledEvent):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def update_scheduled_event(self, scheduled_event: ScheduledEvent):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def delete_scheduled_event(self, scheduled_event: ScheduledEvent):
|
||||
pass
|
@@ -1,59 +0,0 @@
|
||||
from abc import ABC, abstractmethod
|
||||
|
||||
from bot_data.model.server_afk_channel_ids_config import ServerAFKChannelIdsConfig
|
||||
from bot_data.model.server_config import ServerConfig
|
||||
from bot_data.model.server_team_role_ids_config import ServerTeamRoleIdsConfig
|
||||
|
||||
|
||||
class ServerConfigRepositoryABC(ABC):
|
||||
@abstractmethod
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def does_server_config_exists(self, server_id: int) -> bool:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def get_server_config_by_server(self, server_id: int) -> ServerConfig:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def get_server_config_by_id(self, config_id: int) -> ServerConfig:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def add_server_config(self, server_config: ServerConfig):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def update_server_config(self, server_config: ServerConfig):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def delete_server_config(self, server_config: ServerConfig):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def add_server_team_role_id_config(self, server_team_role_id: ServerTeamRoleIdsConfig):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def update_server_team_role_id_config(self, server_team_role_id: ServerTeamRoleIdsConfig):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def delete_server_team_role_id_config(self, server_team_role_id: ServerTeamRoleIdsConfig):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def add_server_afk_channel_config(self, server_afk_channel: ServerAFKChannelIdsConfig):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def update_server_afk_channel_config(self, server_afk_channel: ServerAFKChannelIdsConfig):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def delete_server_afk_channel_config(self, server_afk_channel: ServerAFKChannelIdsConfig):
|
||||
pass
|
@@ -1,39 +0,0 @@
|
||||
from abc import ABC, abstractmethod
|
||||
|
||||
from cpl_query.extension import List
|
||||
|
||||
from bot_data.model.short_role_name import ShortRoleName
|
||||
|
||||
|
||||
class ShortRoleNameRepositoryABC(ABC):
|
||||
@abstractmethod
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def get_short_role_names(self) -> List[ShortRoleName]:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def get_short_role_name_by_id(self, id: int) -> ShortRoleName:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def find_short_role_names_by_role_id(self, role_id: int) -> List[ShortRoleName]:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def get_short_role_names_by_server_id(self, id: int) -> List[ShortRoleName]:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def add_short_role_name(self, short_role_name: ShortRoleName):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def update_short_role_name(self, short_role_name: ShortRoleName):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def delete_short_role_name(self, short_role_name: ShortRoleName):
|
||||
pass
|
@@ -1,32 +0,0 @@
|
||||
from abc import ABC, abstractmethod
|
||||
from typing import Optional
|
||||
|
||||
from cpl_query.extension import List
|
||||
|
||||
from bot_data.model.steam_special_offer import SteamSpecialOffer
|
||||
|
||||
|
||||
class SteamSpecialOfferRepositoryABC(ABC):
|
||||
@abstractmethod
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def get_steam_special_offers(self) -> List[SteamSpecialOffer]:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def get_steam_special_offer_by_name(self, name: str) -> SteamSpecialOffer:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def add_steam_special_offer(self, steam_special_offer: SteamSpecialOffer):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def update_steam_special_offer(self, steam_special_offer: SteamSpecialOffer):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def delete_steam_special_offer(self, steam_special_offer: SteamSpecialOffer):
|
||||
pass
|
@@ -1,15 +0,0 @@
|
||||
from abc import abstractmethod
|
||||
|
||||
from cpl_core.database import TableABC
|
||||
|
||||
|
||||
class TableWithIdABC(TableABC):
|
||||
@abstractmethod
|
||||
def __init__(self):
|
||||
self.__init__()
|
||||
|
||||
self._id = 0
|
||||
|
||||
@property
|
||||
def id(self) -> int:
|
||||
return self._id
|
@@ -1,55 +0,0 @@
|
||||
from abc import ABC, abstractmethod
|
||||
|
||||
from bot_data.model.technician_config import TechnicianConfig
|
||||
from bot_data.model.technician_id_config import TechnicianIdConfig
|
||||
from bot_data.model.technician_ping_url_config import TechnicianPingUrlConfig
|
||||
|
||||
|
||||
class TechnicianConfigRepositoryABC(ABC):
|
||||
@abstractmethod
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def does_technician_config_exists(self) -> bool:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def get_technician_config(self) -> TechnicianConfig:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def add_technician_config(self, technician_config: TechnicianConfig):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def update_technician_config(self, technician_config: TechnicianConfig):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def delete_technician_config(self, technician_config: TechnicianConfig):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def add_technician_id_config(self, technician_id: TechnicianIdConfig):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def update_technician_id_config(self, technician_id: TechnicianIdConfig):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def delete_technician_id_config(self, technician_id: TechnicianIdConfig):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def add_technician_ping_url_config(self, technician_ping_url: TechnicianPingUrlConfig):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def update_technician_ping_url_config(self, technician_ping_url: TechnicianPingUrlConfig):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def delete_technician_ping_url_config(self, technician_ping_url: TechnicianPingUrlConfig):
|
||||
pass
|
@@ -1,51 +0,0 @@
|
||||
from abc import ABC, abstractmethod
|
||||
|
||||
from cpl_query.extension import List
|
||||
|
||||
from bot_data.model.user_game_ident import UserGameIdent
|
||||
|
||||
|
||||
class UserGameIdentRepositoryABC(ABC):
|
||||
@abstractmethod
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def get_user_game_idents(self) -> List[UserGameIdent]:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def get_user_game_idents_by_game_server_id(self, id: int) -> List[UserGameIdent]:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def get_user_game_ident_by_id(self, id: int) -> UserGameIdent:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def get_user_game_ident_by_ident(self, ident: str) -> UserGameIdent:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def find_user_game_ident_by_ident(self, ident: str) -> UserGameIdent:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def get_user_game_idents_by_user_id(self, user_id: int) -> List[UserGameIdent]:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def add_user_game_ident(self, user_game_ident: UserGameIdent):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def update_user_game_ident(self, user_game_ident: UserGameIdent):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def delete_user_game_ident(self, user_game_ident: UserGameIdent):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def delete_user_game_ident_by_user_id(self, user_id: int):
|
||||
pass
|
@@ -1,35 +0,0 @@
|
||||
from abc import ABC, abstractmethod
|
||||
|
||||
from cpl_query.extension import List
|
||||
|
||||
from bot_data.model.user_warnings import UserWarnings
|
||||
|
||||
|
||||
class UserWarningsRepositoryABC(ABC):
|
||||
@abstractmethod
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def get_user_warnings(self) -> List[UserWarnings]:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def get_user_warnings_by_id(self, id: int) -> UserWarnings:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def get_user_warnings_by_user_id(self, user_id: int) -> List[UserWarnings]:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def add_user_warnings(self, user_warnings: UserWarnings):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def update_user_warnings(self, user_warnings: UserWarnings):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def delete_user_warnings(self, user_warnings: UserWarnings):
|
||||
pass
|
@@ -1,158 +0,0 @@
|
||||
from datetime import datetime
|
||||
from typing import Optional
|
||||
|
||||
from cpl_core.database import TableABC
|
||||
from cpl_core.dependency_injection import ServiceProviderABC
|
||||
|
||||
from bot_data.model.server import Server
|
||||
|
||||
|
||||
class Achievement(TableABC):
|
||||
def __init__(
|
||||
self,
|
||||
name: str,
|
||||
description: str,
|
||||
attribute: str,
|
||||
operator: str,
|
||||
value: str,
|
||||
server: Optional[Server],
|
||||
created_at: datetime = None,
|
||||
modified_at: datetime = None,
|
||||
id=0,
|
||||
):
|
||||
self._id = id
|
||||
self._name = name
|
||||
self._description = description
|
||||
self._attribute = attribute
|
||||
|
||||
if self._is_operator_valid(operator):
|
||||
raise ValueError("Operator invalid")
|
||||
|
||||
self._operator = operator
|
||||
self._value = value
|
||||
self._server = server
|
||||
|
||||
TableABC.__init__(self)
|
||||
self._created_at = created_at if created_at is not None else self._created_at
|
||||
self._modified_at = modified_at if modified_at is not None else self._modified_at
|
||||
|
||||
@ServiceProviderABC.inject
|
||||
def _is_operator_valid(self, operator, service: ServiceProviderABC) -> bool:
|
||||
from modules.achievements.achievement_service import AchievementService
|
||||
|
||||
achievements: AchievementService = service.get_service(AchievementService)
|
||||
return operator not in achievements.get_operators()
|
||||
|
||||
@property
|
||||
def id(self) -> int:
|
||||
return self._id
|
||||
|
||||
@property
|
||||
def name(self) -> str:
|
||||
return self._name
|
||||
|
||||
@name.setter
|
||||
def name(self, value: str):
|
||||
self._name = value
|
||||
|
||||
@property
|
||||
def description(self) -> str:
|
||||
return self._description
|
||||
|
||||
@description.setter
|
||||
def description(self, value: str):
|
||||
self._description = value
|
||||
|
||||
@property
|
||||
def attribute(self) -> str:
|
||||
return self._attribute
|
||||
|
||||
@attribute.setter
|
||||
def attribute(self, value: str):
|
||||
self._attribute = value
|
||||
|
||||
@property
|
||||
def operator(self) -> str:
|
||||
return self._operator
|
||||
|
||||
@operator.setter
|
||||
def operator(self, value: str):
|
||||
self._operator = value
|
||||
|
||||
@property
|
||||
def value(self) -> str:
|
||||
return self._value
|
||||
|
||||
@value.setter
|
||||
def value(self, value: str):
|
||||
self._value = value
|
||||
|
||||
@property
|
||||
def server(self) -> Server:
|
||||
return self._server
|
||||
|
||||
@staticmethod
|
||||
def get_select_all_string() -> str:
|
||||
return str(
|
||||
f"""
|
||||
SELECT * FROM `Achievements`;
|
||||
"""
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def get_select_by_id_string(id: int) -> str:
|
||||
return str(
|
||||
f"""
|
||||
SELECT * FROM `Achievements`
|
||||
WHERE `Id` = {id};
|
||||
"""
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def get_select_by_server_id_string(id: int) -> str:
|
||||
return str(
|
||||
f"""
|
||||
SELECT * FROM `Achievements`
|
||||
WHERE `ServerId` = {id};
|
||||
"""
|
||||
)
|
||||
|
||||
@property
|
||||
def insert_string(self) -> str:
|
||||
return str(
|
||||
f"""
|
||||
INSERT INTO `Achievements` (
|
||||
`Name`, `Description`, `Attribute`, `Operator`, `Value`, `ServerId`
|
||||
) VALUES (
|
||||
'{self._name}',
|
||||
'{self._description}',
|
||||
'{self._attribute}',
|
||||
'{self._operator}',
|
||||
'{self._value}',
|
||||
{self._server.id}
|
||||
);
|
||||
"""
|
||||
)
|
||||
|
||||
@property
|
||||
def udpate_string(self) -> str:
|
||||
return str(
|
||||
f"""
|
||||
UPDATE `Achievements`
|
||||
SET `Name` = '{self._name}',
|
||||
`Description` = '{self._description}',
|
||||
`Attribute` = '{self._attribute}',
|
||||
`Operator` = '{self._operator}',
|
||||
`Value` = '{self._value}'
|
||||
WHERE `Id` = {self._id};
|
||||
"""
|
||||
)
|
||||
|
||||
@property
|
||||
def delete_string(self) -> str:
|
||||
return str(
|
||||
f"""
|
||||
DELETE FROM `Achievements`
|
||||
WHERE `Id` = {self._id};
|
||||
"""
|
||||
)
|
@@ -1,58 +0,0 @@
|
||||
from bot_data.abc.history_table_abc import HistoryTableABC
|
||||
|
||||
|
||||
class AchievementHistory(HistoryTableABC):
|
||||
def __init__(
|
||||
self,
|
||||
name: str,
|
||||
description: str,
|
||||
attribute: str,
|
||||
operator: str,
|
||||
value: str,
|
||||
server: int,
|
||||
deleted: bool,
|
||||
date_from: str,
|
||||
date_to: str,
|
||||
id=0,
|
||||
):
|
||||
HistoryTableABC.__init__(self)
|
||||
|
||||
self._id = id
|
||||
self._name = name
|
||||
self._description = description
|
||||
self._attribute = attribute
|
||||
self._operator = operator
|
||||
self._value = value
|
||||
self._server = server
|
||||
|
||||
self._deleted = deleted
|
||||
self._date_from = date_from
|
||||
self._date_to = date_to
|
||||
|
||||
@property
|
||||
def id(self) -> int:
|
||||
return self._id
|
||||
|
||||
@property
|
||||
def name(self) -> str:
|
||||
return self._name
|
||||
|
||||
@property
|
||||
def description(self) -> str:
|
||||
return self._description
|
||||
|
||||
@property
|
||||
def attribute(self) -> str:
|
||||
return self._attribute
|
||||
|
||||
@property
|
||||
def operator(self) -> str:
|
||||
return self._operator
|
||||
|
||||
@property
|
||||
def value(self) -> str:
|
||||
return self._value
|
||||
|
||||
@property
|
||||
def server(self) -> int:
|
||||
return self._server
|
@@ -1,49 +0,0 @@
|
||||
from cpl_core.dependency_injection import ServiceProviderABC
|
||||
from cpl_discord.service import DiscordBotServiceABC
|
||||
|
||||
from bot_data.abc.history_table_abc import HistoryTableABC
|
||||
|
||||
|
||||
class AutoRoleHistory(HistoryTableABC):
|
||||
def __init__(
|
||||
self,
|
||||
server: int,
|
||||
channel_id: int,
|
||||
dc_message_id: int,
|
||||
deleted: bool,
|
||||
date_from: str,
|
||||
date_to: str,
|
||||
id=0,
|
||||
):
|
||||
HistoryTableABC.__init__(self)
|
||||
|
||||
self._auto_role_id = id
|
||||
self._server = server
|
||||
self._discord_channel_id = channel_id
|
||||
self._discord_message_id = dc_message_id
|
||||
|
||||
self._deleted = deleted
|
||||
self._date_from = date_from
|
||||
self._date_to = date_to
|
||||
|
||||
@property
|
||||
def id(self) -> int:
|
||||
return self._auto_role_id
|
||||
|
||||
@property
|
||||
def server(self) -> int:
|
||||
return self._server
|
||||
|
||||
@property
|
||||
def discord_channel_id(self) -> int:
|
||||
return self._discord_channel_id
|
||||
|
||||
@property
|
||||
@ServiceProviderABC.inject
|
||||
def discord_channel_name(self, bot: DiscordBotServiceABC) -> str:
|
||||
channel = bot.get_channel(self.discord_channel_id)
|
||||
return None if channel is None else channel.name
|
||||
|
||||
@property
|
||||
def discord_message_id(self) -> int:
|
||||
return self._discord_message_id
|
@@ -1,48 +0,0 @@
|
||||
from cpl_core.dependency_injection import ServiceProviderABC
|
||||
from cpl_discord.service import DiscordBotServiceABC
|
||||
|
||||
from bot_data.abc.history_table_abc import HistoryTableABC
|
||||
|
||||
|
||||
class AutoRoleRuleHistory(HistoryTableABC):
|
||||
def __init__(
|
||||
self,
|
||||
auto_role: int,
|
||||
discord_emoji_name: str,
|
||||
discord_role_id: int,
|
||||
deleted: bool,
|
||||
date_from: str,
|
||||
date_to: str,
|
||||
id=0,
|
||||
):
|
||||
HistoryTableABC.__init__(self)
|
||||
self._auto_role_rule_id = id
|
||||
self._auto_role = auto_role
|
||||
self._discord_emoji_name = discord_emoji_name
|
||||
self._discord_role_id = discord_role_id
|
||||
|
||||
self._deleted = deleted
|
||||
self._date_from = date_from
|
||||
self._date_to = date_to
|
||||
|
||||
@property
|
||||
def id(self) -> int:
|
||||
return self._auto_role_rule_id
|
||||
|
||||
@property
|
||||
def auto_role(self) -> int:
|
||||
return self._auto_role
|
||||
|
||||
@property
|
||||
def emoji_name(self) -> str:
|
||||
return self._discord_emoji_name
|
||||
|
||||
@property
|
||||
def role_id(self) -> int:
|
||||
return self._discord_role_id
|
||||
|
||||
@property
|
||||
@ServiceProviderABC.inject
|
||||
def role_name(self, bot: DiscordBotServiceABC) -> str:
|
||||
guild = bot.get_guild(self.auto_role.server.discord_id)
|
||||
return guild.get_role(self.role_id).name
|
@@ -1,72 +0,0 @@
|
||||
from cpl_core.dependency_injection import ServiceProviderABC
|
||||
from cpl_discord.service import DiscordBotServiceABC
|
||||
|
||||
from bot_data.abc.history_table_abc import HistoryTableABC
|
||||
|
||||
|
||||
class ClientHistory(HistoryTableABC):
|
||||
def __init__(
|
||||
self,
|
||||
dc_id: int,
|
||||
smc: int,
|
||||
rmc: int,
|
||||
dmc: int,
|
||||
rcc: int,
|
||||
muc: int,
|
||||
server: int,
|
||||
deleted: bool,
|
||||
date_from: str,
|
||||
date_to: str,
|
||||
id=0,
|
||||
):
|
||||
HistoryTableABC.__init__(self)
|
||||
|
||||
self._client_id = id
|
||||
self._discord_client_id = dc_id
|
||||
self._sent_message_count = smc
|
||||
self._received_message_count = rmc
|
||||
self._deleted_message_count = dmc
|
||||
self._received_command_count = rcc
|
||||
self._moved_users_count = muc
|
||||
self._server = server
|
||||
|
||||
self._deleted = deleted
|
||||
self._date_from = date_from
|
||||
self._date_to = date_to
|
||||
|
||||
@property
|
||||
def id(self) -> int:
|
||||
return self._client_id
|
||||
|
||||
@property
|
||||
def discord_id(self) -> int:
|
||||
return self._discord_client_id
|
||||
|
||||
@property
|
||||
@ServiceProviderABC.inject
|
||||
def name(self, bot: DiscordBotServiceABC) -> str:
|
||||
return bot.user.name
|
||||
|
||||
@property
|
||||
def sent_message_count(self) -> int:
|
||||
return self._sent_message_count
|
||||
|
||||
@property
|
||||
def received_message_count(self) -> int:
|
||||
return self._received_message_count
|
||||
|
||||
@property
|
||||
def deleted_message_count(self) -> int:
|
||||
return self._deleted_message_count
|
||||
|
||||
@property
|
||||
def received_command_count(self) -> int:
|
||||
return self._received_command_count
|
||||
|
||||
@property
|
||||
def moved_users_count(self) -> int:
|
||||
return self._moved_users_count
|
||||
|
||||
@property
|
||||
def server(self) -> int:
|
||||
return self._server
|
@@ -1,28 +0,0 @@
|
||||
from bot_data.abc.history_table_abc import HistoryTableABC
|
||||
|
||||
|
||||
class KnownUserHistory(HistoryTableABC):
|
||||
def __init__(
|
||||
self,
|
||||
dc_id: int,
|
||||
deleted: bool,
|
||||
date_from: str,
|
||||
date_to: str,
|
||||
id=0,
|
||||
):
|
||||
HistoryTableABC.__init__(self)
|
||||
|
||||
self._known_user_id = id
|
||||
self._discord_id = dc_id
|
||||
|
||||
self._deleted = deleted
|
||||
self._date_from = date_from
|
||||
self._date_to = date_to
|
||||
|
||||
@property
|
||||
def id(self) -> int:
|
||||
return self._known_user_id
|
||||
|
||||
@property
|
||||
def discord_id(self) -> int:
|
||||
return self._discord_id
|
@@ -1,55 +0,0 @@
|
||||
from typing import Optional
|
||||
|
||||
from bot_data.abc.history_table_abc import HistoryTableABC
|
||||
from bot_data.model.server import Server
|
||||
|
||||
|
||||
class LevelHistory(HistoryTableABC):
|
||||
def __init__(
|
||||
self,
|
||||
name: str,
|
||||
color: str,
|
||||
min_xp: int,
|
||||
permissions: int,
|
||||
server: Optional[Server],
|
||||
deleted: bool,
|
||||
date_from: str,
|
||||
date_to: str,
|
||||
id=0,
|
||||
):
|
||||
HistoryTableABC.__init__(self)
|
||||
|
||||
self._id = id
|
||||
self._name = name
|
||||
self._color = color
|
||||
self._min_xp = min_xp
|
||||
self._permissions = permissions
|
||||
self._server = server
|
||||
|
||||
self._deleted = deleted
|
||||
self._date_from = date_from
|
||||
self._date_to = date_to
|
||||
|
||||
@property
|
||||
def id(self) -> int:
|
||||
return self._id
|
||||
|
||||
@property
|
||||
def name(self) -> str:
|
||||
return self._name
|
||||
|
||||
@property
|
||||
def color(self) -> str:
|
||||
return self._color
|
||||
|
||||
@property
|
||||
def min_xp(self) -> int:
|
||||
return self._min_xp
|
||||
|
||||
@property
|
||||
def permissions(self) -> int:
|
||||
return self._permissions
|
||||
|
||||
@property
|
||||
def server(self) -> Server:
|
||||
return self._server
|
@@ -1,17 +0,0 @@
|
||||
class Migration:
|
||||
def __init__(self, name: str, version: str, script: str):
|
||||
self._name = name
|
||||
self._version = version
|
||||
self._script = script
|
||||
|
||||
@property
|
||||
def name(self) -> str:
|
||||
return self._name
|
||||
|
||||
@property
|
||||
def version(self) -> str:
|
||||
return self._version
|
||||
|
||||
@property
|
||||
def script(self) -> str:
|
||||
return self._script
|
@@ -1,188 +0,0 @@
|
||||
from datetime import datetime
|
||||
from typing import Optional
|
||||
|
||||
import discord
|
||||
from cpl_core.database import TableABC
|
||||
|
||||
from bot_data.model.scheduled_event_interval_enum import ScheduledEventIntervalEnum
|
||||
from bot_data.model.server import Server
|
||||
|
||||
|
||||
class ScheduledEvent(TableABC):
|
||||
def __init__(
|
||||
self,
|
||||
interval: ScheduledEventIntervalEnum,
|
||||
name: str,
|
||||
description: str,
|
||||
channel_id: int,
|
||||
start_time: datetime,
|
||||
end_time: Optional[datetime],
|
||||
entity_type: discord.EntityType,
|
||||
location: Optional[str],
|
||||
server: Optional[Server],
|
||||
created_at: datetime = None,
|
||||
modified_at: datetime = None,
|
||||
id=0,
|
||||
):
|
||||
self._id = id
|
||||
self._interval = interval
|
||||
self._name = name
|
||||
self._description = description
|
||||
self._channel_id = channel_id
|
||||
self._start_time = start_time
|
||||
self._end_time = end_time
|
||||
self._entity_type = entity_type
|
||||
self._location = location
|
||||
self._server = server
|
||||
|
||||
TableABC.__init__(self)
|
||||
self._created_at = created_at if created_at is not None else self._created_at
|
||||
self._modified_at = modified_at if modified_at is not None else self._modified_at
|
||||
|
||||
@property
|
||||
def id(self) -> int:
|
||||
return self._id
|
||||
|
||||
@property
|
||||
def interval(self) -> ScheduledEventIntervalEnum:
|
||||
return self._interval
|
||||
|
||||
@interval.setter
|
||||
def interval(self, value: ScheduledEventIntervalEnum):
|
||||
self._interval = value
|
||||
|
||||
@property
|
||||
def name(self) -> str:
|
||||
return self._name
|
||||
|
||||
@name.setter
|
||||
def name(self, value: str):
|
||||
self._name = value
|
||||
|
||||
@property
|
||||
def description(self) -> str:
|
||||
return self._description
|
||||
|
||||
@description.setter
|
||||
def description(self, value: str):
|
||||
self._description = value
|
||||
|
||||
@property
|
||||
def channel_id(self) -> int:
|
||||
return self._channel_id
|
||||
|
||||
@channel_id.setter
|
||||
def channel_id(self, value: int):
|
||||
self._channel_id = value
|
||||
|
||||
@property
|
||||
def start_time(self) -> datetime:
|
||||
return self._start_time
|
||||
|
||||
@start_time.setter
|
||||
def start_time(self, value: datetime):
|
||||
self._start_time = value
|
||||
|
||||
@property
|
||||
def end_time(self) -> datetime:
|
||||
return self._end_time
|
||||
|
||||
@end_time.setter
|
||||
def end_time(self, value: datetime):
|
||||
self._end_time = value
|
||||
|
||||
@property
|
||||
def entity_type(self) -> discord.EntityType:
|
||||
return self._entity_type
|
||||
|
||||
@entity_type.setter
|
||||
def entity_type(self, value: discord.EntityType):
|
||||
self._entity_type = value
|
||||
|
||||
@property
|
||||
def location(self) -> str:
|
||||
return self._location
|
||||
|
||||
@location.setter
|
||||
def location(self, value: str):
|
||||
self._location = value
|
||||
|
||||
@property
|
||||
def server(self) -> Server:
|
||||
return self._server
|
||||
|
||||
@server.setter
|
||||
def server(self, value: Server):
|
||||
self._server = value
|
||||
|
||||
@staticmethod
|
||||
def get_select_all_string() -> str:
|
||||
return str(
|
||||
f"""
|
||||
SELECT * FROM `ScheduledEvents`;
|
||||
"""
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def get_select_by_id_string(id: int) -> str:
|
||||
return str(
|
||||
f"""
|
||||
SELECT * FROM `ScheduledEvents`
|
||||
WHERE `Id` = {id};
|
||||
"""
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def get_select_by_server_id_string(s_id: int) -> str:
|
||||
return str(
|
||||
f"""
|
||||
SELECT * FROM `ScheduledEvents`
|
||||
WHERE `ServerId` = {s_id};
|
||||
"""
|
||||
)
|
||||
|
||||
@property
|
||||
def insert_string(self) -> str:
|
||||
return str(
|
||||
f"""
|
||||
INSERT INTO `ScheduledEvents` (
|
||||
`Interval`, `Name`, `Description`, `ChannelId`, `StartTime`, `EndTime`, `EntityType`, `Location`, `ServerId`
|
||||
) VALUES (
|
||||
'{self._interval.value}',
|
||||
'{self._name}',
|
||||
{"NULL" if self._description is None else f"'{self._description}'"},
|
||||
{"NULL" if self._channel_id is None else f"'{self._channel_id}'"},
|
||||
'{self._start_time}',
|
||||
{"NULL" if self._end_time is None else f"'{self._end_time}'"},
|
||||
'{self._entity_type.value}',
|
||||
{"NULL" if self._location is None else f"'{self._location}'"},
|
||||
{self._server.id}
|
||||
);
|
||||
"""
|
||||
)
|
||||
|
||||
@property
|
||||
def udpate_string(self) -> str:
|
||||
return str(
|
||||
f"""
|
||||
UPDATE `ScheduledEvents`
|
||||
SET `Interval` = '{self._interval.value}',
|
||||
`Name` = '{self._name}',
|
||||
`Description` = {"NULL" if self._description is None else f"'{self._description}'"},
|
||||
`ChannelId` = {"NULL" if self._channel_id is None else f"'{self._channel_id}'"},
|
||||
`StartTime` = '{self._start_time}',
|
||||
`EndTime` = {"NULL" if self._end_time is None else f"'{self._end_time}'"},
|
||||
`EntityType` = '{self._entity_type.value}',
|
||||
`Location` = {"NULL" if self._location is None else f"'{self._location}'"}
|
||||
WHERE `Id` = {self._id};
|
||||
"""
|
||||
)
|
||||
|
||||
@property
|
||||
def delete_string(self) -> str:
|
||||
return str(
|
||||
f"""
|
||||
DELETE FROM `ScheduledEvents`
|
||||
WHERE `Id` = {self._id};
|
||||
"""
|
||||
)
|
@@ -1,118 +0,0 @@
|
||||
from datetime import datetime
|
||||
from typing import Optional
|
||||
|
||||
import discord
|
||||
from cpl_core.database import TableABC
|
||||
|
||||
from bot_data.abc.history_table_abc import HistoryTableABC
|
||||
from bot_data.model.server import Server
|
||||
|
||||
|
||||
class ScheduledEventHistory(HistoryTableABC):
|
||||
def __init__(
|
||||
self,
|
||||
interval: str,
|
||||
name: str,
|
||||
description: str,
|
||||
channel_id: int,
|
||||
start_time: datetime,
|
||||
end_time: Optional[datetime],
|
||||
entity_type: discord.EntityType,
|
||||
location: Optional[str],
|
||||
server: Optional[Server],
|
||||
deleted: bool,
|
||||
date_from: str,
|
||||
date_to: str,
|
||||
id=0,
|
||||
):
|
||||
HistoryTableABC.__init__(self)
|
||||
self._id = id
|
||||
self._interval = interval
|
||||
self._name = name
|
||||
self._description = description
|
||||
self._channel_id = channel_id
|
||||
self._start_time = start_time
|
||||
self._end_time = end_time
|
||||
self._entity_type = entity_type
|
||||
self._location = location
|
||||
self._server = server
|
||||
|
||||
self._deleted = deleted
|
||||
self._date_from = date_from
|
||||
self._date_to = date_to
|
||||
|
||||
@property
|
||||
def id(self) -> int:
|
||||
return self._id
|
||||
|
||||
@property
|
||||
def interval(self) -> str:
|
||||
return self._interval
|
||||
|
||||
@interval.setter
|
||||
def interval(self, value: str):
|
||||
self._interval = value
|
||||
|
||||
@property
|
||||
def name(self) -> str:
|
||||
return self._name
|
||||
|
||||
@name.setter
|
||||
def name(self, value: str):
|
||||
self._name = value
|
||||
|
||||
@property
|
||||
def description(self) -> str:
|
||||
return self._description
|
||||
|
||||
@description.setter
|
||||
def description(self, value: str):
|
||||
self._description = value
|
||||
|
||||
@property
|
||||
def channel_id(self) -> int:
|
||||
return self._channel_id
|
||||
|
||||
@channel_id.setter
|
||||
def channel_id(self, value: int):
|
||||
self._channel_id = value
|
||||
|
||||
@property
|
||||
def start_time(self) -> datetime:
|
||||
return self._start_time
|
||||
|
||||
@start_time.setter
|
||||
def start_time(self, value: datetime):
|
||||
self._start_time = value
|
||||
|
||||
@property
|
||||
def end_time(self) -> datetime:
|
||||
return self._end_time
|
||||
|
||||
@end_time.setter
|
||||
def end_time(self, value: datetime):
|
||||
self._end_time = value
|
||||
|
||||
@property
|
||||
def entity_type(self) -> discord.EntityType:
|
||||
return self._entity_type
|
||||
|
||||
@entity_type.setter
|
||||
def entity_type(self, value: discord.EntityType):
|
||||
self._entity_type = value
|
||||
|
||||
@property
|
||||
def location(self) -> str:
|
||||
return self._location
|
||||
|
||||
@location.setter
|
||||
def location(self, value: str):
|
||||
self._location = value
|
||||
|
||||
@property
|
||||
def server(self) -> Server:
|
||||
return self._server
|
||||
|
||||
@server.setter
|
||||
def server(self, value: Server):
|
||||
self._server = value
|
@@ -1,8 +0,0 @@
|
||||
from enum import Enum
|
||||
|
||||
|
||||
class ScheduledEventIntervalEnum(Enum):
|
||||
daily = "daily"
|
||||
weekly = "weekly"
|
||||
monthly = "monthly"
|
||||
yearly = "yearly"
|
@@ -1,85 +0,0 @@
|
||||
from datetime import datetime
|
||||
|
||||
from cpl_core.database import TableABC
|
||||
|
||||
|
||||
class ServerAFKChannelIdsConfig(TableABC):
|
||||
def __init__(
|
||||
self,
|
||||
channel_id: int,
|
||||
server_id: int,
|
||||
created_at: datetime = None,
|
||||
modified_at: datetime = None,
|
||||
id=0,
|
||||
):
|
||||
self._id = id
|
||||
self._channel_id = channel_id
|
||||
self._server_id = server_id
|
||||
|
||||
TableABC.__init__(self)
|
||||
self._created_at = created_at if created_at is not None else self._created_at
|
||||
self._modified_at = modified_at if modified_at is not None else self._modified_at
|
||||
|
||||
@property
|
||||
def channel_id(self) -> int:
|
||||
return self._channel_id
|
||||
|
||||
@staticmethod
|
||||
def get_select_all_string() -> str:
|
||||
return str(
|
||||
f"""
|
||||
SELECT * FROM `CFG_ServerAFKChannelIds`;
|
||||
"""
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def get_select_by_id_string(id: int) -> str:
|
||||
return str(
|
||||
f"""
|
||||
SELECT * FROM `CFG_ServerAFKChannelIds`
|
||||
WHERE `Id` = {id};
|
||||
"""
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def get_select_by_server_id_string(server_id: int) -> str:
|
||||
return str(
|
||||
f"""
|
||||
SELECT * FROM `CFG_ServerAFKChannelIds`
|
||||
WHERE `ServerId` = {server_id};
|
||||
"""
|
||||
)
|
||||
|
||||
@property
|
||||
def insert_string(self) -> str:
|
||||
return str(
|
||||
f"""
|
||||
INSERT INTO `CFG_ServerAFKChannelIds` (
|
||||
`ChannelId`,
|
||||
`ServerId`
|
||||
) VALUES (
|
||||
{self._channel_id},
|
||||
{self._server_id}
|
||||
);
|
||||
"""
|
||||
)
|
||||
|
||||
@property
|
||||
def udpate_string(self) -> str:
|
||||
return str(
|
||||
f"""
|
||||
UPDATE `CFG_ServerAFKChannelIds`
|
||||
SET `ChannelId` = {self._channel_id},
|
||||
`ServerId` = {self._server_id}
|
||||
WHERE `Id` = {self._id};
|
||||
"""
|
||||
)
|
||||
|
||||
@property
|
||||
def delete_string(self) -> str:
|
||||
return str(
|
||||
f"""
|
||||
DELETE FROM `CFG_ServerAFKChannelIds`
|
||||
WHERE `ChannelId` = {self._channel_id};
|
||||
"""
|
||||
)
|
@@ -1,388 +0,0 @@
|
||||
import json
|
||||
from datetime import datetime
|
||||
from typing import Optional
|
||||
|
||||
from cpl_core.configuration import ConfigurationModelABC
|
||||
from cpl_core.database import TableABC
|
||||
from cpl_query.extension import List
|
||||
from discord import Guild
|
||||
|
||||
from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
|
||||
from bot_data.model.server import Server
|
||||
from bot_data.model.server_team_role_ids_config import ServerTeamRoleIdsConfig
|
||||
|
||||
|
||||
class ServerConfig(TableABC, ConfigurationModelABC):
|
||||
def __init__(
|
||||
self,
|
||||
message_delete_timer: int,
|
||||
notification_chat_id: int,
|
||||
max_voice_state_hours: int,
|
||||
xp_per_message: int,
|
||||
xp_per_reaction: int,
|
||||
max_message_xp_per_hour: int,
|
||||
xp_per_ontime_hour: int,
|
||||
xp_per_event_participation: int,
|
||||
xp_per_achievement: int,
|
||||
xp_for_birthday: int,
|
||||
afk_command_channel_id: int,
|
||||
help_voice_channel_id: int,
|
||||
team_channel_id: int,
|
||||
login_message_channel_id: int,
|
||||
default_role_id: Optional[int],
|
||||
short_role_name_only_set_highest_role: bool,
|
||||
game_offer_notification_chat_id: int,
|
||||
reset_member_after_rejoin: bool,
|
||||
feature_flags: dict[FeatureFlagsEnum],
|
||||
server: Server,
|
||||
afk_channel_ids: List[int],
|
||||
team_role_ids: List[ServerTeamRoleIdsConfig],
|
||||
created_at: datetime = None,
|
||||
modified_at: datetime = None,
|
||||
id=0,
|
||||
):
|
||||
self._id = id
|
||||
self._message_delete_timer = message_delete_timer
|
||||
self._notification_chat_id = notification_chat_id
|
||||
self._max_voice_state_hours = max_voice_state_hours
|
||||
self._xp_per_message = xp_per_message
|
||||
self._xp_per_reaction = xp_per_reaction
|
||||
self._max_message_xp_per_hour = max_message_xp_per_hour
|
||||
self._xp_per_ontime_hour = xp_per_ontime_hour
|
||||
self._xp_per_event_participation = xp_per_event_participation
|
||||
self._xp_per_achievement = xp_per_achievement
|
||||
self._xp_for_birthday = xp_for_birthday
|
||||
self._afk_command_channel_id = afk_command_channel_id
|
||||
self._help_voice_channel_id = help_voice_channel_id
|
||||
self._team_channel_id = team_channel_id
|
||||
self._login_message_channel_id = login_message_channel_id
|
||||
self._default_role_id = default_role_id
|
||||
self._short_role_name_only_set_highest_role = short_role_name_only_set_highest_role
|
||||
self._game_offer_notification_chat_id = game_offer_notification_chat_id
|
||||
self._reset_member_after_rejoin = reset_member_after_rejoin
|
||||
|
||||
self._feature_flags = feature_flags
|
||||
self._server = server
|
||||
self._afk_channel_ids = afk_channel_ids
|
||||
self._team_role_ids = team_role_ids
|
||||
|
||||
TableABC.__init__(self)
|
||||
self._created_at = created_at if created_at is not None else self._created_at
|
||||
self._modified_at = modified_at if modified_at is not None else self._modified_at
|
||||
|
||||
@staticmethod
|
||||
def new(guild: Guild, server: Server) -> "ServerConfig":
|
||||
return ServerConfig(
|
||||
6,
|
||||
guild.system_channel.id,
|
||||
6,
|
||||
1,
|
||||
1,
|
||||
20,
|
||||
10,
|
||||
10,
|
||||
10,
|
||||
10,
|
||||
guild.system_channel.id,
|
||||
guild.system_channel.id,
|
||||
guild.system_channel.id,
|
||||
guild.system_channel.id,
|
||||
None,
|
||||
False,
|
||||
guild.system_channel.id,
|
||||
False,
|
||||
{},
|
||||
server,
|
||||
List(int),
|
||||
List(int),
|
||||
)
|
||||
|
||||
@property
|
||||
def id(self) -> int:
|
||||
return self._id
|
||||
|
||||
@property
|
||||
def message_delete_timer(self) -> int:
|
||||
return self._message_delete_timer
|
||||
|
||||
@message_delete_timer.setter
|
||||
def message_delete_timer(self, value: int):
|
||||
self._message_delete_timer = value
|
||||
|
||||
@property
|
||||
def notification_chat_id(self) -> int:
|
||||
return self._notification_chat_id
|
||||
|
||||
@notification_chat_id.setter
|
||||
def notification_chat_id(self, value: int):
|
||||
self._notification_chat_id = value
|
||||
|
||||
@property
|
||||
def max_voice_state_hours(self) -> int:
|
||||
return self._max_voice_state_hours
|
||||
|
||||
@max_voice_state_hours.setter
|
||||
def max_voice_state_hours(self, value: int):
|
||||
self._max_voice_state_hours = value
|
||||
|
||||
@property
|
||||
def xp_per_message(self) -> int:
|
||||
return self._xp_per_message
|
||||
|
||||
@xp_per_message.setter
|
||||
def xp_per_message(self, value: int):
|
||||
self._xp_per_message = value
|
||||
|
||||
@property
|
||||
def xp_per_reaction(self) -> int:
|
||||
return self._xp_per_reaction
|
||||
|
||||
@xp_per_reaction.setter
|
||||
def xp_per_reaction(self, value: int):
|
||||
self._xp_per_reaction = value
|
||||
|
||||
@property
|
||||
def max_message_xp_per_hour(self) -> int:
|
||||
return self._max_message_xp_per_hour
|
||||
|
||||
@max_message_xp_per_hour.setter
|
||||
def max_message_xp_per_hour(self, value: int):
|
||||
self._max_message_xp_per_hour = value
|
||||
|
||||
@property
|
||||
def xp_per_ontime_hour(self) -> int:
|
||||
return self._xp_per_ontime_hour
|
||||
|
||||
@xp_per_ontime_hour.setter
|
||||
def xp_per_ontime_hour(self, value: int):
|
||||
self._xp_per_ontime_hour = value
|
||||
|
||||
@property
|
||||
def xp_per_event_participation(self) -> int:
|
||||
return self._xp_per_event_participation
|
||||
|
||||
@xp_per_event_participation.setter
|
||||
def xp_per_event_participation(self, value: int):
|
||||
self._xp_per_event_participation = value
|
||||
|
||||
@property
|
||||
def xp_per_achievement(self) -> int:
|
||||
return self._xp_per_achievement
|
||||
|
||||
@xp_per_achievement.setter
|
||||
def xp_per_achievement(self, value: int):
|
||||
self._xp_per_achievement = value
|
||||
|
||||
@property
|
||||
def xp_for_birthday(self) -> int:
|
||||
return self._xp_for_birthday
|
||||
|
||||
@xp_for_birthday.setter
|
||||
def xp_for_birthday(self, value: int):
|
||||
self._xp_for_birthday = value
|
||||
|
||||
@property
|
||||
def afk_command_channel_id(self) -> int:
|
||||
return self._afk_command_channel_id
|
||||
|
||||
@afk_command_channel_id.setter
|
||||
def afk_command_channel_id(self, value: int):
|
||||
self._afk_command_channel_id = value
|
||||
|
||||
@property
|
||||
def help_voice_channel_id(self) -> int:
|
||||
return self._help_voice_channel_id
|
||||
|
||||
@help_voice_channel_id.setter
|
||||
def help_voice_channel_id(self, value: int):
|
||||
self._help_voice_channel_id = value
|
||||
|
||||
@property
|
||||
def team_channel_id(self) -> int:
|
||||
return self._team_channel_id
|
||||
|
||||
@team_channel_id.setter
|
||||
def team_channel_id(self, value: int):
|
||||
self._team_channel_id = value
|
||||
|
||||
@property
|
||||
def login_message_channel_id(self) -> int:
|
||||
return self._login_message_channel_id
|
||||
|
||||
@login_message_channel_id.setter
|
||||
def login_message_channel_id(self, value: int):
|
||||
self._login_message_channel_id = value
|
||||
|
||||
@property
|
||||
def default_role_id(self) -> int:
|
||||
return self._default_role_id
|
||||
|
||||
@default_role_id.setter
|
||||
def default_role_id(self, value: int):
|
||||
self._default_role_id = value
|
||||
|
||||
@property
|
||||
def short_role_name_only_set_highest_role(self) -> bool:
|
||||
return self._short_role_name_only_set_highest_role
|
||||
|
||||
@short_role_name_only_set_highest_role.setter
|
||||
def short_role_name_only_set_highest_role(self, value: bool):
|
||||
self._short_role_name_only_set_highest_role = value
|
||||
|
||||
@property
|
||||
def game_offer_notification_chat_id(self) -> int:
|
||||
return self._game_offer_notification_chat_id
|
||||
|
||||
@game_offer_notification_chat_id.setter
|
||||
def game_offer_notification_chat_id(self, value: int):
|
||||
self._game_offer_notification_chat_id = value
|
||||
|
||||
@property
|
||||
def reset_member_after_rejoin(self) -> bool:
|
||||
return self._reset_member_after_rejoin
|
||||
|
||||
@reset_member_after_rejoin.setter
|
||||
def reset_member_after_rejoin(self, value: bool):
|
||||
self._reset_member_after_rejoin = value
|
||||
|
||||
@property
|
||||
def feature_flags(self) -> dict[FeatureFlagsEnum]:
|
||||
return self._feature_flags
|
||||
|
||||
@feature_flags.setter
|
||||
def feature_flags(self, value: dict[FeatureFlagsEnum]):
|
||||
self._feature_flags = value
|
||||
|
||||
@property
|
||||
def afk_channel_ids(self) -> List[int]:
|
||||
return self._afk_channel_ids
|
||||
|
||||
@afk_channel_ids.setter
|
||||
def afk_channel_ids(self, value: List[int]):
|
||||
self._afk_channel_ids = value
|
||||
|
||||
@property
|
||||
def team_role_ids(self) -> List[ServerTeamRoleIdsConfig]:
|
||||
return self._team_role_ids
|
||||
|
||||
@team_role_ids.setter
|
||||
def team_role_ids(self, value: List[ServerTeamRoleIdsConfig]):
|
||||
self._team_role_ids = value
|
||||
|
||||
@property
|
||||
def server(self) -> Server:
|
||||
return self._server
|
||||
|
||||
@staticmethod
|
||||
def get_select_all_string() -> str:
|
||||
return str(
|
||||
f"""
|
||||
SELECT * FROM `CFG_Server`;
|
||||
"""
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def get_select_by_id_string(id: int) -> str:
|
||||
return str(
|
||||
f"""
|
||||
SELECT * FROM `CFG_Server`
|
||||
WHERE `Id` = {id};
|
||||
"""
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def get_select_by_server_id_string(server_id: int) -> str:
|
||||
return str(
|
||||
f"""
|
||||
SELECT * FROM `CFG_Server`
|
||||
WHERE `ServerId` = {server_id};
|
||||
"""
|
||||
)
|
||||
|
||||
@property
|
||||
def insert_string(self) -> str:
|
||||
return str(
|
||||
f"""
|
||||
INSERT INTO `CFG_Server` (
|
||||
`MessageDeleteTimer`,
|
||||
`NotificationChatId`,
|
||||
`MaxVoiceStateHours`,
|
||||
`XpPerMessage`,
|
||||
`XpPerReaction`,
|
||||
`MaxMessageXpPerHour`,
|
||||
`XpPerOntimeHour`,
|
||||
`XpPerEventParticipation`,
|
||||
`XpPerAchievement`,
|
||||
`XpForBirthday`,
|
||||
`AFKCommandChannelId`,
|
||||
`HelpVoiceChannelId`,
|
||||
`TeamChannelId`,
|
||||
`LoginMessageChannelId`,
|
||||
`DefaultRoleId`,
|
||||
`ShortRoleNameSetOnlyHighest`,
|
||||
`GameOfferNotificationChatId`,
|
||||
`ResetMemberAfterRejoin`,
|
||||
`FeatureFlags`,
|
||||
`ServerId`
|
||||
) VALUES (
|
||||
{self._message_delete_timer},
|
||||
{self._notification_chat_id},
|
||||
{self._max_voice_state_hours},
|
||||
{self._xp_per_message},
|
||||
{self._xp_per_reaction},
|
||||
{self._max_message_xp_per_hour},
|
||||
{self._xp_per_ontime_hour},
|
||||
{self._xp_per_event_participation},
|
||||
{self._xp_per_achievement},
|
||||
'{self._xp_for_birthday}',
|
||||
{self._afk_command_channel_id},
|
||||
{self._help_voice_channel_id},
|
||||
{self._team_channel_id},
|
||||
{self._login_message_channel_id},
|
||||
{"NULL" if self._default_role_id is None else self._default_role_id},
|
||||
{self._short_role_name_only_set_highest_role},
|
||||
{self._game_offer_notification_chat_id},
|
||||
{self._reset_member_after_rejoin},
|
||||
'{json.dumps(self._feature_flags)}',
|
||||
{self._server.id}
|
||||
);
|
||||
"""
|
||||
)
|
||||
|
||||
@property
|
||||
def udpate_string(self) -> str:
|
||||
return str(
|
||||
f"""
|
||||
UPDATE `CFG_Server`
|
||||
SET `MessageDeleteTimer` = {self._message_delete_timer},
|
||||
`NotificationChatId` = {self._notification_chat_id},
|
||||
`MaxVoiceStateHours` = {self._max_voice_state_hours},
|
||||
`XpPerMessage` = {self._xp_per_message},
|
||||
`XpPerReaction` = {self._xp_per_reaction},
|
||||
`MaxMessageXpPerHour` = {self._max_message_xp_per_hour},
|
||||
`XpPerOntimeHour` = {self._xp_per_ontime_hour},
|
||||
`XpPerEventParticipation` = {self._xp_per_event_participation},
|
||||
`XpPerAchievement` = {self._xp_per_achievement},
|
||||
`XpForBirthday` = {self._xp_for_birthday},
|
||||
`AFKCommandChannelId` = {self._afk_command_channel_id},
|
||||
`HelpVoiceChannelId` = {self._help_voice_channel_id},
|
||||
`TeamChannelId` = {self._team_channel_id},
|
||||
`LoginMessageChannelId` = {self._login_message_channel_id},
|
||||
`DefaultRoleId` = {"NULL" if self._default_role_id is None else self._default_role_id},
|
||||
`ShortRoleNameSetOnlyHighest` = {self._short_role_name_only_set_highest_role},
|
||||
`GameOfferNotificationChatId` = {self._game_offer_notification_chat_id},
|
||||
`ResetMemberAfterRejoin` = {self._reset_member_after_rejoin},
|
||||
`FeatureFlags` = '{json.dumps(self._feature_flags)}',
|
||||
`ServerId` = {self._server.id}
|
||||
WHERE `Id` = {self._id};
|
||||
"""
|
||||
)
|
||||
|
||||
@property
|
||||
def delete_string(self) -> str:
|
||||
return str(
|
||||
f"""
|
||||
DELETE FROM `CFG_Server`
|
||||
WHERE `Id` = {self._id};
|
||||
"""
|
||||
)
|
@@ -1,121 +0,0 @@
|
||||
from bot_data.abc.history_table_abc import HistoryTableABC
|
||||
|
||||
|
||||
class ServerConfigHistory(HistoryTableABC):
|
||||
def __init__(
|
||||
self,
|
||||
message_delete_timer: int,
|
||||
notification_chat_id: int,
|
||||
max_voice_state_hours: int,
|
||||
xp_per_message: int,
|
||||
xp_per_reaction: int,
|
||||
max_message_xp_per_hour: int,
|
||||
xp_per_ontime_hour: int,
|
||||
xp_per_event_participation: int,
|
||||
xp_per_achievement: int,
|
||||
afk_command_channel_id: int,
|
||||
help_voice_channel_id: int,
|
||||
team_channel_id: int,
|
||||
login_message_channel_id: int,
|
||||
default_role_id: int,
|
||||
short_role_name_only_set_highest_role: bool,
|
||||
feature_flags: dict[str],
|
||||
server_id: int,
|
||||
deleted: bool,
|
||||
date_from: str,
|
||||
date_to: str,
|
||||
id=0,
|
||||
):
|
||||
HistoryTableABC.__init__(self)
|
||||
|
||||
self._id = id
|
||||
self._message_delete_timer = message_delete_timer
|
||||
self._notification_chat_id = notification_chat_id
|
||||
self._max_voice_state_hours = max_voice_state_hours
|
||||
self._xp_per_message = xp_per_message
|
||||
self._xp_per_reaction = xp_per_reaction
|
||||
self._max_message_xp_per_hour = max_message_xp_per_hour
|
||||
self._xp_per_ontime_hour = xp_per_ontime_hour
|
||||
self._xp_per_event_participation = xp_per_event_participation
|
||||
self._xp_per_achievement = xp_per_achievement
|
||||
self._afk_command_channel_id = afk_command_channel_id
|
||||
self._help_voice_channel_id = help_voice_channel_id
|
||||
self._team_channel_id = team_channel_id
|
||||
self._login_message_channel_id = login_message_channel_id
|
||||
self._default_role_id = default_role_id
|
||||
self._short_role_name_only_set_highest_role = short_role_name_only_set_highest_role
|
||||
|
||||
self._feature_flags = feature_flags
|
||||
self._server_id = server_id
|
||||
|
||||
self._deleted = deleted
|
||||
self._date_from = date_from
|
||||
self._date_to = date_to
|
||||
|
||||
@property
|
||||
def message_delete_timer(self) -> int:
|
||||
return self._message_delete_timer
|
||||
|
||||
@property
|
||||
def notification_chat_id(self) -> int:
|
||||
return self._notification_chat_id
|
||||
|
||||
@property
|
||||
def max_voice_state_hours(self) -> int:
|
||||
return self._max_voice_state_hours
|
||||
|
||||
@property
|
||||
def xp_per_message(self) -> int:
|
||||
return self._xp_per_message
|
||||
|
||||
@property
|
||||
def xp_per_reaction(self) -> int:
|
||||
return self._xp_per_reaction
|
||||
|
||||
@property
|
||||
def max_message_xp_per_hour(self) -> int:
|
||||
return self._max_message_xp_per_hour
|
||||
|
||||
@property
|
||||
def xp_per_ontime_hour(self) -> int:
|
||||
return self._xp_per_ontime_hour
|
||||
|
||||
@property
|
||||
def xp_per_event_participation(self) -> int:
|
||||
return self._xp_per_event_participation
|
||||
|
||||
@property
|
||||
def xp_per_achievement(self) -> int:
|
||||
return self._xp_per_achievement
|
||||
|
||||
@property
|
||||
def afk_command_channel_id(self) -> int:
|
||||
return self._afk_command_channel_id
|
||||
|
||||
@property
|
||||
def help_voice_channel_id(self) -> int:
|
||||
return self._help_voice_channel_id
|
||||
|
||||
@property
|
||||
def team_channel_id(self) -> int:
|
||||
return self._team_channel_id
|
||||
|
||||
@property
|
||||
def login_message_channel_id(self) -> int:
|
||||
return self._login_message_channel_id
|
||||
|
||||
@property
|
||||
def default_role_id(self) -> int:
|
||||
return self._default_role_id
|
||||
|
||||
@property
|
||||
def short_role_name_only_set_highest_role(self) -> bool:
|
||||
return self._short_role_name_only_set_highest_role
|
||||
|
||||
@property
|
||||
def feature_flags(self) -> dict[str]:
|
||||
return self._feature_flags
|
||||
|
||||
@property
|
||||
def server_id(self) -> int:
|
||||
return self._server_id
|
@@ -1,43 +0,0 @@
|
||||
from cpl_core.dependency_injection import ServiceProviderABC
|
||||
from cpl_discord.service import DiscordBotServiceABC
|
||||
|
||||
from bot_data.abc.history_table_abc import HistoryTableABC
|
||||
|
||||
|
||||
class ServerHistory(HistoryTableABC):
|
||||
def __init__(
|
||||
self,
|
||||
dc_id: int,
|
||||
deleted: bool,
|
||||
date_from: str,
|
||||
date_to: str,
|
||||
id=0,
|
||||
):
|
||||
HistoryTableABC.__init__(self)
|
||||
|
||||
self._server_id = id
|
||||
self._discord_server_id = dc_id
|
||||
|
||||
self._deleted = deleted
|
||||
self._date_from = date_from
|
||||
self._date_to = date_to
|
||||
|
||||
@property
|
||||
def id(self) -> int:
|
||||
return self._server_id
|
||||
|
||||
@property
|
||||
def discord_id(self) -> int:
|
||||
return self._discord_server_id
|
||||
|
||||
@property
|
||||
@ServiceProviderABC.inject
|
||||
def name(self, bot: DiscordBotServiceABC) -> str:
|
||||
guild = bot.get_guild(self.discord_id)
|
||||
return None if guild is None else guild.name
|
||||
|
||||
@property
|
||||
@ServiceProviderABC.inject
|
||||
def icon_url(self, bot: DiscordBotServiceABC) -> str:
|
||||
guild = bot.get_guild(self.discord_id)
|
||||
return None if guild is None else guild.icon.url
|
@@ -1,100 +0,0 @@
|
||||
from datetime import datetime
|
||||
|
||||
from cpl_core.database import TableABC
|
||||
|
||||
from bot_data.model.team_member_type_enum import TeamMemberTypeEnum
|
||||
|
||||
|
||||
class ServerTeamRoleIdsConfig(TableABC):
|
||||
def __init__(
|
||||
self,
|
||||
role_id: int,
|
||||
team_member_type: TeamMemberTypeEnum,
|
||||
server_id: int,
|
||||
created_at: datetime = None,
|
||||
modified_at: datetime = None,
|
||||
id=0,
|
||||
):
|
||||
self._id = id
|
||||
self._role_id = role_id
|
||||
self._team_member_type = team_member_type
|
||||
self._server_id = server_id
|
||||
|
||||
TableABC.__init__(self)
|
||||
self._created_at = created_at if created_at is not None else self._created_at
|
||||
self._modified_at = modified_at if modified_at is not None else self._modified_at
|
||||
|
||||
@property
|
||||
def id(self) -> int:
|
||||
return self._id
|
||||
|
||||
@property
|
||||
def role_id(self) -> int:
|
||||
return self._role_id
|
||||
|
||||
@property
|
||||
def team_member_type(self) -> TeamMemberTypeEnum:
|
||||
return self._team_member_type
|
||||
|
||||
@staticmethod
|
||||
def get_select_all_string() -> str:
|
||||
return str(
|
||||
f"""
|
||||
SELECT * FROM `CFG_ServerTeamRoleIds`;
|
||||
"""
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def get_select_by_id_string(id: int) -> str:
|
||||
return str(
|
||||
f"""
|
||||
SELECT * FROM `CFG_ServerTeamRoleIds`
|
||||
WHERE `Id` = {id};
|
||||
"""
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def get_select_by_server_id_string(server_id: int) -> str:
|
||||
return str(
|
||||
f"""
|
||||
SELECT * FROM `CFG_ServerTeamRoleIds`
|
||||
WHERE `ServerId` = {server_id};
|
||||
"""
|
||||
)
|
||||
|
||||
@property
|
||||
def insert_string(self) -> str:
|
||||
return str(
|
||||
f"""
|
||||
INSERT INTO `CFG_ServerTeamRoleIds` (
|
||||
`RoleId`,
|
||||
`TeamMemberType`,
|
||||
`ServerId`
|
||||
) VALUES (
|
||||
{self._role_id},
|
||||
'{self._team_member_type.value}',
|
||||
{self._server_id}
|
||||
);
|
||||
"""
|
||||
)
|
||||
|
||||
@property
|
||||
def udpate_string(self) -> str:
|
||||
return str(
|
||||
f"""
|
||||
UPDATE `CFG_ServerTeamRoleIds`
|
||||
SET `RoleId` = {self._role_id},
|
||||
`TeamMemberType` = '{self._team_member_type.value}',
|
||||
`ServerId` = {self._server_id}
|
||||
WHERE `Id` = {self._id};
|
||||
"""
|
||||
)
|
||||
|
||||
@property
|
||||
def delete_string(self) -> str:
|
||||
return str(
|
||||
f"""
|
||||
DELETE FROM `CFG_ServerTeamRoleIds`
|
||||
WHERE `RoleId` = {self._role_id};
|
||||
"""
|
||||
)
|
@@ -1,140 +0,0 @@
|
||||
from datetime import datetime
|
||||
|
||||
from cpl_core.database import TableABC
|
||||
from cpl_core.dependency_injection import ServiceProviderABC
|
||||
from cpl_discord.service import DiscordBotServiceABC
|
||||
|
||||
from bot_data.model.server import Server
|
||||
from bot_data.model.short_role_name_position_enum import ShortRoleNamePositionEnum
|
||||
|
||||
|
||||
class ShortRoleName(TableABC):
|
||||
def __init__(
|
||||
self,
|
||||
short_name: str,
|
||||
discord_role_id: int,
|
||||
position: ShortRoleNamePositionEnum,
|
||||
server: Server,
|
||||
created_at: datetime = None,
|
||||
modified_at: datetime = None,
|
||||
id=0,
|
||||
):
|
||||
self._id = id
|
||||
self._short_name = short_name
|
||||
self._discord_role_id = discord_role_id
|
||||
self._position = position
|
||||
self._server = server
|
||||
|
||||
TableABC.__init__(self)
|
||||
self._created_at = created_at if created_at is not None else self._created_at
|
||||
self._modified_at = modified_at if modified_at is not None else self._modified_at
|
||||
|
||||
@property
|
||||
def id(self) -> int:
|
||||
return self._id
|
||||
|
||||
@property
|
||||
def short_name(self) -> str:
|
||||
return self._short_name
|
||||
|
||||
@short_name.setter
|
||||
def short_name(self, value: str):
|
||||
self._short_name = value
|
||||
|
||||
@property
|
||||
def role_id(self) -> int:
|
||||
return self._discord_role_id
|
||||
|
||||
@role_id.setter
|
||||
def role_id(self, value: int):
|
||||
self._discord_role_id = value
|
||||
|
||||
@property
|
||||
@ServiceProviderABC.inject
|
||||
def role_name(self, bot: DiscordBotServiceABC) -> str:
|
||||
guild = bot.get_guild(self._server.discord_id)
|
||||
return guild.get_role(self.role_id).name
|
||||
|
||||
@property
|
||||
def position(self) -> ShortRoleNamePositionEnum:
|
||||
return self._position
|
||||
|
||||
@position.setter
|
||||
def position(self, value: ShortRoleNamePositionEnum):
|
||||
self._position = value
|
||||
|
||||
@property
|
||||
def server(self) -> Server:
|
||||
return self._server
|
||||
|
||||
@staticmethod
|
||||
def get_select_all_string() -> str:
|
||||
return str(
|
||||
f"""
|
||||
SELECT * FROM `ShortRoleNames`;
|
||||
"""
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def get_select_by_id_string(id: int) -> str:
|
||||
return str(
|
||||
f"""
|
||||
SELECT * FROM `ShortRoleNames`
|
||||
WHERE `Id` = {id};
|
||||
"""
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def get_select_by_role_id_string(id: int) -> str:
|
||||
return str(
|
||||
f"""
|
||||
SELECT * FROM `ShortRoleNames`
|
||||
WHERE `DiscordRoleId` = {id};
|
||||
"""
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def get_select_by_server_id_string(id: int) -> str:
|
||||
return str(
|
||||
f"""
|
||||
SELECT * FROM `ShortRoleNames`
|
||||
WHERE `ServerId` = {id};
|
||||
"""
|
||||
)
|
||||
|
||||
@property
|
||||
def insert_string(self) -> str:
|
||||
return str(
|
||||
f"""
|
||||
INSERT INTO `ShortRoleNames` (
|
||||
`ShortName`, `DiscordRoleId`, `Position`, `ServerId`
|
||||
) VALUES (
|
||||
'{self._short_name}',
|
||||
{self._discord_role_id},
|
||||
'{self._position}',
|
||||
{self._server.id}
|
||||
);
|
||||
"""
|
||||
)
|
||||
|
||||
@property
|
||||
def udpate_string(self) -> str:
|
||||
return str(
|
||||
f"""
|
||||
UPDATE `ShortRoleNames`
|
||||
SET `ShortName` = '{self._short_name}',
|
||||
`DiscordRoleId` = {self._discord_role_id},
|
||||
`Position` = '{self._position}',
|
||||
`ServerId` = {self._server.id}
|
||||
WHERE `Id` = {self._id};
|
||||
"""
|
||||
)
|
||||
|
||||
@property
|
||||
def delete_string(self) -> str:
|
||||
return str(
|
||||
f"""
|
||||
DELETE FROM `ShortRoleNames`
|
||||
WHERE `Id` = {self._id};
|
||||
"""
|
||||
)
|
@@ -1,56 +0,0 @@
|
||||
from cpl_core.dependency_injection import ServiceProviderABC
|
||||
from cpl_discord.service import DiscordBotServiceABC
|
||||
|
||||
from bot_data.abc.history_table_abc import HistoryTableABC
|
||||
|
||||
|
||||
class ShortRoleNameHistory(HistoryTableABC):
|
||||
def __init__(
|
||||
self,
|
||||
name: str,
|
||||
discord_role_id: int,
|
||||
server: int,
|
||||
deleted: bool,
|
||||
date_from: str,
|
||||
date_to: str,
|
||||
id=0,
|
||||
):
|
||||
HistoryTableABC.__init__(self)
|
||||
self._id = id
|
||||
self._name = name
|
||||
self._discord_role_id = discord_role_id
|
||||
self._server = server
|
||||
|
||||
self._deleted = deleted
|
||||
self._date_from = date_from
|
||||
self._date_to = date_to
|
||||
|
||||
@property
|
||||
def id(self) -> int:
|
||||
return self._id
|
||||
|
||||
@property
|
||||
def name(self) -> str:
|
||||
return self._name
|
||||
|
||||
@name.setter
|
||||
def name(self, value: str):
|
||||
self._name = value
|
||||
|
||||
@property
|
||||
def role_id(self) -> int:
|
||||
return self._discord_role_id
|
||||
|
||||
@role_id.setter
|
||||
def role_id(self, value: int):
|
||||
self._discord_role_id = value
|
||||
|
||||
@property
|
||||
@ServiceProviderABC.inject
|
||||
def role_name(self, bot: DiscordBotServiceABC) -> str:
|
||||
guild = bot.get_guild(self._server.discord_id)
|
||||
return guild.get_role(self.role_id).name
|
||||
|
||||
@property
|
||||
def server(self) -> int:
|
||||
return self._server
|
@@ -1,6 +0,0 @@
|
||||
from enum import Enum
|
||||
|
||||
|
||||
class ShortRoleNamePositionEnum(Enum):
|
||||
before = "before"
|
||||
after = "after"
|
@@ -1,115 +0,0 @@
|
||||
from datetime import datetime
|
||||
|
||||
from cpl_core.database import TableABC
|
||||
|
||||
|
||||
class SteamSpecialOffer(TableABC):
|
||||
def __init__(
|
||||
self,
|
||||
name: str,
|
||||
original_price: float,
|
||||
discount_price: float,
|
||||
discount_pct: int,
|
||||
created_at: datetime = None,
|
||||
modified_at: datetime = None,
|
||||
id=0,
|
||||
):
|
||||
self._id = id
|
||||
self._name = name
|
||||
self._original_price = original_price
|
||||
self._discount_price = discount_price
|
||||
self._discount_pct = discount_pct
|
||||
|
||||
TableABC.__init__(self)
|
||||
self._created_at = created_at if created_at is not None else self._created_at
|
||||
self._modified_at = modified_at if modified_at is not None else self._modified_at
|
||||
|
||||
@property
|
||||
def id(self) -> int:
|
||||
return self._id
|
||||
|
||||
@property
|
||||
def name(self) -> str:
|
||||
return self._name
|
||||
|
||||
@name.setter
|
||||
def name(self, value: str):
|
||||
self._name = value
|
||||
|
||||
@property
|
||||
def original_price(self) -> float:
|
||||
return self._original_price
|
||||
|
||||
@original_price.setter
|
||||
def original_price(self, value: float):
|
||||
self._original_price = value
|
||||
|
||||
@property
|
||||
def discount_price(self) -> float:
|
||||
return self._discount_price
|
||||
|
||||
@discount_price.setter
|
||||
def discount_price(self, value: float):
|
||||
self._discount_price = value
|
||||
|
||||
@property
|
||||
def discount_pct(self) -> int:
|
||||
return self._discount_pct
|
||||
|
||||
@discount_pct.setter
|
||||
def discount_pct(self, value: int):
|
||||
self._discount_pct = value
|
||||
|
||||
@staticmethod
|
||||
def get_select_all_string() -> str:
|
||||
return str(
|
||||
f"""
|
||||
SELECT * FROM `SteamSpecialOffers`;
|
||||
"""
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def get_select_by_name_string(name: str) -> str:
|
||||
return str(
|
||||
f"""
|
||||
SELECT * FROM `SteamSpecialOffers`
|
||||
WHERE `Game` = '{name}';
|
||||
"""
|
||||
)
|
||||
|
||||
@property
|
||||
def insert_string(self) -> str:
|
||||
return str(
|
||||
f"""
|
||||
INSERT INTO `SteamSpecialOffers` (
|
||||
`Game`, `OriginalPrice`, `DiscountPrice`, `DiscountPct`
|
||||
) VALUES (
|
||||
'{self._name}',
|
||||
{self._original_price},
|
||||
{self._discount_price},
|
||||
{self._discount_pct}
|
||||
);
|
||||
"""
|
||||
)
|
||||
|
||||
@property
|
||||
def udpate_string(self) -> str:
|
||||
return str(
|
||||
f"""
|
||||
UPDATE `SteamSpecialOffers`
|
||||
SET `Game` = '{self._name}',
|
||||
`OriginalPrice` = {self._original_price},
|
||||
`DiscountPrice` = {self._discount_price},
|
||||
`DiscountPct` = {self._discount_pct}
|
||||
WHERE `Id` = {self._id};
|
||||
"""
|
||||
)
|
||||
|
||||
@property
|
||||
def delete_string(self) -> str:
|
||||
return str(
|
||||
f"""
|
||||
DELETE FROM `SteamSpecialOffers`
|
||||
WHERE `Id` = {self._id};
|
||||
"""
|
||||
)
|
@@ -1,7 +0,0 @@
|
||||
from enum import Enum
|
||||
|
||||
|
||||
class TeamMemberTypeEnum(Enum):
|
||||
moderator = "Moderator"
|
||||
admin = "Admin"
|
||||
technician = "Technician"
|
@@ -1,175 +0,0 @@
|
||||
import json
|
||||
from datetime import datetime
|
||||
|
||||
from cpl_core.configuration import ConfigurationModelABC
|
||||
from cpl_core.database import TableABC
|
||||
from cpl_query.extension import List
|
||||
|
||||
from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
|
||||
|
||||
|
||||
class TechnicianConfig(TableABC, ConfigurationModelABC):
|
||||
def __init__(
|
||||
self,
|
||||
help_command_reference_url: str,
|
||||
wait_for_restart: int,
|
||||
wait_for_shutdown: int,
|
||||
cache_max_messages: int,
|
||||
max_steam_offer_count: int,
|
||||
maintenance: bool,
|
||||
feature_flags: dict[FeatureFlagsEnum],
|
||||
technician_ids: List[int],
|
||||
ping_urls: List[str],
|
||||
created_at: datetime = None,
|
||||
modified_at: datetime = None,
|
||||
id=0,
|
||||
):
|
||||
self._id = id
|
||||
self._help_command_reference_url = help_command_reference_url
|
||||
self._wait_for_restart = wait_for_restart
|
||||
self._wait_for_shutdown = wait_for_shutdown
|
||||
self._cache_max_messages = cache_max_messages
|
||||
self._max_steam_offer_count = max_steam_offer_count
|
||||
self._maintenance = maintenance
|
||||
|
||||
self._feature_flags = feature_flags
|
||||
self._technician_ids = technician_ids
|
||||
self._ping_urls = ping_urls
|
||||
|
||||
TableABC.__init__(self)
|
||||
self._created_at = created_at if created_at is not None else self._created_at
|
||||
self._modified_at = modified_at if modified_at is not None else self._modified_at
|
||||
|
||||
@property
|
||||
def id(self) -> int:
|
||||
return self._id
|
||||
|
||||
@property
|
||||
def help_command_reference_url(self) -> str:
|
||||
return self._help_command_reference_url
|
||||
|
||||
@help_command_reference_url.setter
|
||||
def help_command_reference_url(self, value: str):
|
||||
self._help_command_reference_url = value
|
||||
|
||||
@property
|
||||
def wait_for_restart(self) -> int:
|
||||
return self._wait_for_restart
|
||||
|
||||
@wait_for_restart.setter
|
||||
def wait_for_restart(self, value: int):
|
||||
self._wait_for_restart = value
|
||||
|
||||
@property
|
||||
def wait_for_shutdown(self) -> int:
|
||||
return self._wait_for_shutdown
|
||||
|
||||
@wait_for_shutdown.setter
|
||||
def wait_for_shutdown(self, value: int):
|
||||
self._wait_for_shutdown = value
|
||||
|
||||
@property
|
||||
def cache_max_messages(self) -> int:
|
||||
return self._cache_max_messages
|
||||
|
||||
@cache_max_messages.setter
|
||||
def cache_max_messages(self, value: int):
|
||||
self._cache_max_messages = value
|
||||
|
||||
@property
|
||||
def max_steam_offer_count(self) -> int:
|
||||
return self._max_steam_offer_count
|
||||
|
||||
@max_steam_offer_count.setter
|
||||
def max_steam_offer_count(self, value: int):
|
||||
self._max_steam_offer_count = value
|
||||
|
||||
@property
|
||||
def feature_flags(self) -> dict[FeatureFlagsEnum]:
|
||||
return self._feature_flags
|
||||
|
||||
@feature_flags.setter
|
||||
def feature_flags(self, value: dict[FeatureFlagsEnum]):
|
||||
self._feature_flags = value
|
||||
|
||||
@property
|
||||
def technician_ids(self) -> List[int]:
|
||||
return self._technician_ids
|
||||
|
||||
@technician_ids.setter
|
||||
def technician_ids(self, value: List[int]):
|
||||
self._technician_ids = value
|
||||
|
||||
@property
|
||||
def ping_urls(self) -> List[str]:
|
||||
return self._ping_urls
|
||||
|
||||
@ping_urls.setter
|
||||
def ping_urls(self, value: List[str]):
|
||||
self._ping_urls = value
|
||||
|
||||
@property
|
||||
def maintenance(self) -> bool:
|
||||
return self._maintenance
|
||||
|
||||
@maintenance.setter
|
||||
def maintenance(self, value: bool):
|
||||
self._maintenance = value
|
||||
|
||||
@staticmethod
|
||||
def get_select_all_string() -> str:
|
||||
return str(
|
||||
f"""
|
||||
SELECT * FROM `CFG_Technician`;
|
||||
"""
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def get_select_by_id_string(id: int) -> str:
|
||||
return str(
|
||||
f"""
|
||||
SELECT * FROM `CFG_Technician`
|
||||
WHERE `Id` = {id};
|
||||
"""
|
||||
)
|
||||
|
||||
@property
|
||||
def insert_string(self) -> str:
|
||||
return str(
|
||||
f"""
|
||||
INSERT INTO `CFG_Technician` (
|
||||
`HelpCommandReferenceUrl`, `WaitForRestart`, `WaitForShutdown`, `CacheMaxMessages`, `MaxSteamOfferCount`, `FeatureFlags`
|
||||
) VALUES (
|
||||
'{self._help_command_reference_url}',
|
||||
{self._wait_for_restart},
|
||||
{self._wait_for_shutdown},
|
||||
{self._cache_max_messages},
|
||||
{self._max_steam_offer_count},
|
||||
'{json.dumps(self._feature_flags)}'
|
||||
);
|
||||
"""
|
||||
)
|
||||
|
||||
@property
|
||||
def udpate_string(self) -> str:
|
||||
return str(
|
||||
f"""
|
||||
UPDATE `CFG_Technician`
|
||||
SET `HelpCommandReferenceUrl` = '{self._help_command_reference_url}',
|
||||
`WaitForRestart` = {self._wait_for_restart},
|
||||
`WaitForShutdown` = {self._wait_for_shutdown},
|
||||
`CacheMaxMessages` = {self._cache_max_messages},
|
||||
`MaxSteamOfferCount` = {self._max_steam_offer_count},
|
||||
`FeatureFlags` = '{json.dumps(self._feature_flags)}'
|
||||
WHERE `Id` = {self._id};
|
||||
"""
|
||||
)
|
||||
|
||||
@property
|
||||
def delete_string(self) -> str:
|
||||
return str(
|
||||
f"""
|
||||
DELETE FROM `CFG_Technician`
|
||||
WHERE `Id` = {self._id};
|
||||
"""
|
||||
)
|
@@ -1,58 +0,0 @@
|
||||
from bot_data.abc.history_table_abc import HistoryTableABC
|
||||
|
||||
|
||||
class TechnicianConfigHistory(HistoryTableABC):
|
||||
def __init__(
|
||||
self,
|
||||
help_command_reference_url: str,
|
||||
wait_for_restart: int,
|
||||
wait_for_shutdown: int,
|
||||
cache_max_messages: int,
|
||||
deleted: bool,
|
||||
date_from: str,
|
||||
date_to: str,
|
||||
id=0,
|
||||
):
|
||||
HistoryTableABC.__init__(self)
|
||||
|
||||
self._id = id
|
||||
self._help_command_reference_url = help_command_reference_url
|
||||
self._wait_for_restart = wait_for_restart
|
||||
self._wait_for_shutdown = wait_for_shutdown
|
||||
self._cache_max_messages = cache_max_messages
|
||||
|
||||
self._deleted = deleted
|
||||
self._date_from = date_from
|
||||
self._date_to = date_to
|
||||
|
||||
@property
|
||||
def help_command_reference_url(self) -> str:
|
||||
return self._help_command_reference_url
|
||||
|
||||
@help_command_reference_url.setter
|
||||
def help_command_reference_url(self, value: str):
|
||||
self._help_command_reference_url = value
|
||||
|
||||
@property
|
||||
def wait_for_restart(self) -> int:
|
||||
return self._wait_for_restart
|
||||
|
||||
@wait_for_restart.setter
|
||||
def wait_for_restart(self, value: int):
|
||||
self._wait_for_restart = value
|
||||
|
||||
@property
|
||||
def wait_for_shutdown(self) -> int:
|
||||
return self._wait_for_shutdown
|
||||
|
||||
@wait_for_shutdown.setter
|
||||
def wait_for_shutdown(self, value: int):
|
||||
self._wait_for_shutdown = value
|
||||
|
||||
@property
|
||||
def cache_max_messages(self) -> int:
|
||||
return self._cache_max_messages
|
||||
|
||||
@cache_max_messages.setter
|
||||
def cache_max_messages(self, value: int):
|
||||
self._cache_max_messages = value
|
@@ -1,79 +0,0 @@
|
||||
from datetime import datetime
|
||||
|
||||
from cpl_core.database import TableABC
|
||||
|
||||
|
||||
class TechnicianIdConfig(TableABC):
|
||||
def __init__(
|
||||
self,
|
||||
technician_id: str,
|
||||
created_at: datetime = None,
|
||||
modified_at: datetime = None,
|
||||
id=0,
|
||||
):
|
||||
self._id = id
|
||||
self._technician_id = technician_id
|
||||
|
||||
TableABC.__init__(self)
|
||||
self._created_at = created_at if created_at is not None else self._created_at
|
||||
self._modified_at = modified_at if modified_at is not None else self._modified_at
|
||||
|
||||
@property
|
||||
def id(self) -> int:
|
||||
return self._id
|
||||
|
||||
@property
|
||||
def technician_id(self) -> str:
|
||||
return self._technician_id
|
||||
|
||||
@technician_id.setter
|
||||
def technician_id(self, value: str):
|
||||
self._technician_id = value
|
||||
|
||||
@staticmethod
|
||||
def get_select_all_string() -> str:
|
||||
return str(
|
||||
f"""
|
||||
SELECT * FROM `CFG_TechnicianIds`;
|
||||
"""
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def get_select_by_id_string(id: int) -> str:
|
||||
return str(
|
||||
f"""
|
||||
SELECT * FROM `CFG_TechnicianIds`
|
||||
WHERE `Id` = {id};
|
||||
"""
|
||||
)
|
||||
|
||||
@property
|
||||
def insert_string(self) -> str:
|
||||
return str(
|
||||
f"""
|
||||
INSERT INTO `CFG_TechnicianIds` (
|
||||
`TechnicianId`
|
||||
) VALUES (
|
||||
'{self._technician_id}'
|
||||
);
|
||||
"""
|
||||
)
|
||||
|
||||
@property
|
||||
def udpate_string(self) -> str:
|
||||
return str(
|
||||
f"""
|
||||
UPDATE `CFG_TechnicianIds`
|
||||
SET `TechnicianId` = '{self._technician_id}'
|
||||
WHERE `Id` = {self._id};
|
||||
"""
|
||||
)
|
||||
|
||||
@property
|
||||
def delete_string(self) -> str:
|
||||
return str(
|
||||
f"""
|
||||
DELETE FROM `CFG_TechnicianIds`
|
||||
WHERE `TechnicianId` = {self._technician_id};
|
||||
"""
|
||||
)
|
@@ -1,28 +0,0 @@
|
||||
from bot_data.abc.history_table_abc import HistoryTableABC
|
||||
|
||||
|
||||
class TechnicianIdConfigHistory(HistoryTableABC):
|
||||
def __init__(
|
||||
self,
|
||||
technician_id: int,
|
||||
deleted: bool,
|
||||
date_from: str,
|
||||
date_to: str,
|
||||
id=0,
|
||||
):
|
||||
HistoryTableABC.__init__(self)
|
||||
|
||||
self._id = id
|
||||
self._technician_id = technician_id
|
||||
|
||||
self._deleted = deleted
|
||||
self._date_from = date_from
|
||||
self._date_to = date_to
|
||||
|
||||
@property
|
||||
def technician_id(self) -> int:
|
||||
return self._technician_id
|
||||
|
||||
@technician_id.setter
|
||||
def technician_id(self, value: int):
|
||||
self._technician_id = value
|
@@ -1,79 +0,0 @@
|
||||
from datetime import datetime
|
||||
|
||||
from cpl_core.database import TableABC
|
||||
|
||||
|
||||
class TechnicianPingUrlConfig(TableABC):
|
||||
def __init__(
|
||||
self,
|
||||
ping_url: str,
|
||||
created_at: datetime = None,
|
||||
modified_at: datetime = None,
|
||||
id=0,
|
||||
):
|
||||
self._id = id
|
||||
self._ping_url = ping_url
|
||||
|
||||
TableABC.__init__(self)
|
||||
self._created_at = created_at if created_at is not None else self._created_at
|
||||
self._modified_at = modified_at if modified_at is not None else self._modified_at
|
||||
|
||||
@property
|
||||
def id(self) -> int:
|
||||
return self._id
|
||||
|
||||
@property
|
||||
def ping_url(self) -> str:
|
||||
return self._ping_url
|
||||
|
||||
@ping_url.setter
|
||||
def ping_url(self, value: str):
|
||||
self._ping_url = value
|
||||
|
||||
@staticmethod
|
||||
def get_select_all_string() -> str:
|
||||
return str(
|
||||
f"""
|
||||
SELECT * FROM `CFG_TechnicianPingUrls`;
|
||||
"""
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def get_select_by_id_string(id: int) -> str:
|
||||
return str(
|
||||
f"""
|
||||
SELECT * FROM `CFG_TechnicianPingUrls`
|
||||
WHERE `Id` = {id};
|
||||
"""
|
||||
)
|
||||
|
||||
@property
|
||||
def insert_string(self) -> str:
|
||||
return str(
|
||||
f"""
|
||||
INSERT INTO `CFG_TechnicianPingUrls` (
|
||||
`URL`
|
||||
) VALUES (
|
||||
'{self._ping_url}'
|
||||
);
|
||||
"""
|
||||
)
|
||||
|
||||
@property
|
||||
def udpate_string(self) -> str:
|
||||
return str(
|
||||
f"""
|
||||
UPDATE `CFG_TechnicianPingUrls`
|
||||
SET `URL` = '{self._ping_url}'
|
||||
WHERE `Id` = {self._id};
|
||||
"""
|
||||
)
|
||||
|
||||
@property
|
||||
def delete_string(self) -> str:
|
||||
return str(
|
||||
f"""
|
||||
DELETE FROM `CFG_TechnicianPingUrls`
|
||||
WHERE `URL` = '{self._ping_url}';
|
||||
"""
|
||||
)
|
@@ -1,28 +0,0 @@
|
||||
from bot_data.abc.history_table_abc import HistoryTableABC
|
||||
|
||||
|
||||
class TechnicianPingUrlConfigHistory(HistoryTableABC):
|
||||
def __init__(
|
||||
self,
|
||||
url: str,
|
||||
deleted: bool,
|
||||
date_from: str,
|
||||
date_to: str,
|
||||
id=0,
|
||||
):
|
||||
HistoryTableABC.__init__(self)
|
||||
|
||||
self._id = id
|
||||
self._url = url
|
||||
|
||||
self._deleted = deleted
|
||||
self._date_from = date_from
|
||||
self._date_to = date_to
|
||||
|
||||
@property
|
||||
def url(self) -> str:
|
||||
return self._url
|
||||
|
||||
@url.setter
|
||||
def url(self, value: str):
|
||||
self._url = value
|
@@ -1,132 +0,0 @@
|
||||
from datetime import datetime
|
||||
|
||||
from cpl_core.database import TableABC
|
||||
|
||||
from bot_data.model.game_server import GameServer
|
||||
from bot_data.model.user import User
|
||||
|
||||
|
||||
class UserGameIdent(TableABC):
|
||||
def __init__(
|
||||
self,
|
||||
user: User,
|
||||
game_server: GameServer,
|
||||
ident: str,
|
||||
created_at: datetime = None,
|
||||
modified_at: datetime = None,
|
||||
id=0,
|
||||
):
|
||||
self._id = id
|
||||
self._user = user
|
||||
self._game_server = game_server
|
||||
self._ident = ident
|
||||
|
||||
TableABC.__init__(self)
|
||||
self._created_at = created_at if created_at is not None else self._created_at
|
||||
self._modified_at = modified_at if modified_at is not None else self._modified_at
|
||||
|
||||
@property
|
||||
def id(self) -> int:
|
||||
return self._id
|
||||
|
||||
@property
|
||||
def user(self) -> User:
|
||||
return self._user
|
||||
|
||||
@property
|
||||
def game_server(self) -> GameServer:
|
||||
return self._game_server
|
||||
|
||||
@property
|
||||
def ident(self) -> str:
|
||||
return self._ident
|
||||
|
||||
@staticmethod
|
||||
def get_select_all_string() -> str:
|
||||
return str(
|
||||
f"""
|
||||
SELECT * FROM `UserGameIdents`;
|
||||
"""
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def get_select_by_game_server_id_string(id: int) -> str:
|
||||
return str(
|
||||
f"""
|
||||
SELECT * FROM `UserGameIdents`
|
||||
WHERE `GameServerId` = {id};
|
||||
"""
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def get_select_by_id_string(id: int) -> str:
|
||||
return str(
|
||||
f"""
|
||||
SELECT * FROM `UserGameIdents`
|
||||
WHERE `Id` = {id};
|
||||
"""
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def get_select_by_ident_string(ident: str) -> str:
|
||||
return str(
|
||||
f"""
|
||||
SELECT * FROM `UserGameIdents`
|
||||
WHERE `Ident` = '{ident}';
|
||||
"""
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def get_select_by_user_id_string(id: int) -> str:
|
||||
return str(
|
||||
f"""
|
||||
SELECT * FROM `UserGameIdents`
|
||||
WHERE `UserId` = {id};
|
||||
"""
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def get_select_active_by_user_id_string(id: int) -> str:
|
||||
return str(
|
||||
f"""
|
||||
SELECT * FROM `UserGameIdents`
|
||||
WHERE `UserId` = {id}
|
||||
AND `LeavedOn` IS NULL;
|
||||
"""
|
||||
)
|
||||
|
||||
@property
|
||||
def insert_string(self) -> str:
|
||||
return str(
|
||||
f"""
|
||||
INSERT INTO `UserGameIdents` (
|
||||
`UserId`, `GameServerId`, `Ident`
|
||||
) VALUES (
|
||||
{self._user.id},
|
||||
'{self._game_server.id}',
|
||||
'{self._ident}'
|
||||
);
|
||||
"""
|
||||
)
|
||||
|
||||
@property
|
||||
def udpate_string(self) -> str:
|
||||
return ""
|
||||
|
||||
@property
|
||||
def delete_string(self) -> str:
|
||||
return str(
|
||||
f"""
|
||||
DELETE FROM `UserGameIdents`
|
||||
WHERE `Id` = {self._id};
|
||||
"""
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def delete_by_user_id_string(id: int) -> str:
|
||||
return str(
|
||||
f"""
|
||||
DELETE FROM `UserGameIdents`
|
||||
WHERE `UserId` = {id}
|
||||
"""
|
||||
)
|
@@ -1,105 +0,0 @@
|
||||
from datetime import datetime
|
||||
from typing import Optional
|
||||
|
||||
from cpl_core.database import TableABC
|
||||
|
||||
from bot_data.model.achievement import Achievement
|
||||
from bot_data.model.user import User
|
||||
|
||||
|
||||
class UserGotAchievement(TableABC):
|
||||
def __init__(
|
||||
self,
|
||||
user: Optional[User],
|
||||
achievement: Optional[Achievement],
|
||||
created_at: datetime = None,
|
||||
modified_at: datetime = None,
|
||||
id=0,
|
||||
):
|
||||
self._id = id
|
||||
self._user = user
|
||||
self._achievement = achievement
|
||||
|
||||
TableABC.__init__(self)
|
||||
self._created_at = created_at if created_at is not None else self._created_at
|
||||
self._modified_at = modified_at if modified_at is not None else self._modified_at
|
||||
|
||||
@property
|
||||
def id(self) -> int:
|
||||
return self._id
|
||||
|
||||
@property
|
||||
def user(self) -> User:
|
||||
return self._user
|
||||
|
||||
@property
|
||||
def achievement(self) -> Achievement:
|
||||
return self._achievement
|
||||
|
||||
@staticmethod
|
||||
def get_select_all_string() -> str:
|
||||
return str(
|
||||
f"""
|
||||
SELECT * FROM `UserGotAchievements`;
|
||||
"""
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def get_select_by_id_string(id: int) -> str:
|
||||
return str(
|
||||
f"""
|
||||
SELECT * FROM `UserGotAchievements`
|
||||
WHERE `Id` = {id};
|
||||
"""
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def get_select_by_user_id_string(id: int) -> str:
|
||||
return str(
|
||||
f"""
|
||||
SELECT * FROM `UserGotAchievements`
|
||||
WHERE `UserId` = {id};
|
||||
"""
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def get_select_by_achievement_id_string(id: int) -> str:
|
||||
return str(
|
||||
f"""
|
||||
SELECT * FROM `UserGotAchievements`
|
||||
WHERE `AchievementId` = {id};
|
||||
"""
|
||||
)
|
||||
|
||||
@property
|
||||
def insert_string(self) -> str:
|
||||
return str(
|
||||
f"""
|
||||
INSERT INTO `UserGotAchievements` (
|
||||
`UserId`, `AchievementId`
|
||||
) VALUES (
|
||||
{self._user.id},
|
||||
{self._achievement.id}
|
||||
);
|
||||
"""
|
||||
)
|
||||
|
||||
@property
|
||||
def udpate_string(self) -> str:
|
||||
return str(
|
||||
f"""
|
||||
UPDATE `UserGotAchievements`
|
||||
SET `UserId` = '{self._user.id}',
|
||||
`AchievementId` = '{self._achievement.id}'
|
||||
WHERE `Id` = {self._id};
|
||||
"""
|
||||
)
|
||||
|
||||
@property
|
||||
def delete_string(self) -> str:
|
||||
return str(
|
||||
f"""
|
||||
DELETE FROM `UserGotAchievements`
|
||||
WHERE `Id` = {self._id};
|
||||
"""
|
||||
)
|
@@ -1,90 +0,0 @@
|
||||
from datetime import date
|
||||
from typing import Optional
|
||||
|
||||
from cpl_core.dependency_injection import ServiceProviderABC
|
||||
from cpl_query.extension import List
|
||||
|
||||
from bot_data.abc.history_table_abc import HistoryTableABC
|
||||
|
||||
|
||||
class UserHistory(HistoryTableABC):
|
||||
def __init__(
|
||||
self,
|
||||
dc_id: int,
|
||||
xp: int,
|
||||
message_count: int,
|
||||
reaction_count: int,
|
||||
birthday: Optional[date],
|
||||
server: int,
|
||||
deleted: bool,
|
||||
date_from: str,
|
||||
date_to: str,
|
||||
id=0,
|
||||
):
|
||||
HistoryTableABC.__init__(self)
|
||||
|
||||
self._user_id = id
|
||||
self._discord_id = dc_id
|
||||
self._xp = xp
|
||||
self._message_count = message_count
|
||||
self._reaction_count = reaction_count
|
||||
self._birthday = birthday
|
||||
self._server = server
|
||||
|
||||
self._deleted = deleted
|
||||
self._date_from = date_from
|
||||
self._date_to = date_to
|
||||
|
||||
@property
|
||||
def id(self) -> int:
|
||||
return self._user_id
|
||||
|
||||
@property
|
||||
def discord_id(self) -> int:
|
||||
return self._discord_id
|
||||
|
||||
@property
|
||||
def xp(self) -> int:
|
||||
return self._xp
|
||||
|
||||
@property
|
||||
def message_count(self) -> int:
|
||||
return self._message_count
|
||||
|
||||
@property
|
||||
def reaction_count(self) -> int:
|
||||
return self._reaction_count
|
||||
|
||||
@property
|
||||
def birthday(self) -> Optional[date]:
|
||||
return self._birthday
|
||||
|
||||
@property
|
||||
def server(self) -> int:
|
||||
return self._server
|
||||
|
||||
@property
|
||||
@ServiceProviderABC.inject
|
||||
def left_server(
|
||||
self,
|
||||
services: ServiceProviderABC,
|
||||
) -> bool:
|
||||
from bot_data.abc.user_joined_server_repository_abc import (
|
||||
UserJoinedServerRepositoryABC,
|
||||
)
|
||||
|
||||
ujs: UserJoinedServerRepositoryABC = services.get_service(UserJoinedServerRepositoryABC)
|
||||
return ujs.find_active_user_joined_server_by_user_id(self.id) is None
|
||||
|
||||
@property
|
||||
@ServiceProviderABC.inject
|
||||
def game_idents(
|
||||
self,
|
||||
services: ServiceProviderABC,
|
||||
) -> List["UserGameIdent"]:
|
||||
from bot_data.abc.user_game_ident_repository_abc import (
|
||||
UserGameIdentRepositoryABC,
|
||||
)
|
||||
|
||||
game_idents_repo: UserGameIdentRepositoryABC = services.get_service(UserGameIdentRepositoryABC)
|
||||
return game_idents_repo.get_user_game_idents_by_user_id(self.id)
|
@@ -1,54 +0,0 @@
|
||||
from datetime import datetime
|
||||
|
||||
from bot_data.abc.history_table_abc import HistoryTableABC
|
||||
|
||||
|
||||
class UserJoinedGameServerHistory(HistoryTableABC):
|
||||
def __init__(
|
||||
self,
|
||||
user: int,
|
||||
game_server: int,
|
||||
joined_on: datetime,
|
||||
leaved_on: datetime,
|
||||
deleted: bool,
|
||||
date_from: str,
|
||||
date_to: str,
|
||||
id=0,
|
||||
):
|
||||
HistoryTableABC.__init__(self)
|
||||
|
||||
self._id = id
|
||||
self._user = user
|
||||
self._game_server = game_server
|
||||
self._joined_on = joined_on
|
||||
self._leaved_on = leaved_on
|
||||
|
||||
self._deleted = deleted
|
||||
self._date_from = date_from
|
||||
self._date_to = date_to
|
||||
|
||||
@property
|
||||
def id(self) -> int:
|
||||
return self._id
|
||||
|
||||
@property
|
||||
def user(self) -> int:
|
||||
return self._user
|
||||
|
||||
@property
|
||||
def game_server(self) -> int:
|
||||
return self._game_server
|
||||
|
||||
@property
|
||||
def time(self) -> float:
|
||||
if self._leaved_on is None or self._joined_on is None:
|
||||
return 0
|
||||
return round((self.leaved_on - self.joined_on).total_seconds() / 3600, 2)
|
||||
|
||||
@property
|
||||
def joined_on(self) -> datetime:
|
||||
return self._joined_on
|
||||
|
||||
@property
|
||||
def leaved_on(self) -> datetime:
|
||||
return self._leaved_on
|
@@ -1,42 +0,0 @@
|
||||
from datetime import datetime
|
||||
|
||||
from bot_data.abc.history_table_abc import HistoryTableABC
|
||||
|
||||
|
||||
class UserJoinedServerHistory(HistoryTableABC):
|
||||
def __init__(
|
||||
self,
|
||||
user: int,
|
||||
joined_on: datetime,
|
||||
leaved_on: datetime,
|
||||
deleted: bool,
|
||||
date_from: str,
|
||||
date_to: str,
|
||||
id=0,
|
||||
):
|
||||
HistoryTableABC.__init__(self)
|
||||
|
||||
self._join_id = id
|
||||
self._user = user
|
||||
self._joined_on = joined_on
|
||||
self._leaved_on = leaved_on
|
||||
|
||||
self._deleted = deleted
|
||||
self._date_from = date_from
|
||||
self._date_to = date_to
|
||||
|
||||
@property
|
||||
def id(self) -> int:
|
||||
return self._join_id
|
||||
|
||||
@property
|
||||
def user(self) -> int:
|
||||
return self._user
|
||||
|
||||
@property
|
||||
def joined_on(self) -> datetime:
|
||||
return self._joined_on
|
||||
|
||||
@property
|
||||
def leaved_on(self) -> datetime:
|
||||
return self._leaved_on
|
@@ -1,65 +0,0 @@
|
||||
from datetime import datetime
|
||||
|
||||
from cpl_core.dependency_injection import ServiceProviderABC
|
||||
from cpl_discord.service import DiscordBotServiceABC
|
||||
|
||||
from bot_data.abc.history_table_abc import HistoryTableABC
|
||||
|
||||
|
||||
class UserJoinedVoiceChannelHistory(HistoryTableABC):
|
||||
def __init__(
|
||||
self,
|
||||
user: int,
|
||||
channel_id: int,
|
||||
joined_on: datetime,
|
||||
leaved_on: datetime,
|
||||
deleted: bool,
|
||||
date_from: str,
|
||||
date_to: str,
|
||||
id=0,
|
||||
):
|
||||
HistoryTableABC.__init__(self)
|
||||
|
||||
self._join_id = id
|
||||
self._channel_id = channel_id
|
||||
self._user = user
|
||||
self._joined_on = joined_on
|
||||
self._leaved_on = leaved_on
|
||||
|
||||
self._deleted = deleted
|
||||
self._date_from = date_from
|
||||
self._date_to = date_to
|
||||
|
||||
@property
|
||||
def id(self) -> int:
|
||||
return self._join_id
|
||||
|
||||
@property
|
||||
def channel_id(self) -> int:
|
||||
return self._channel_id
|
||||
|
||||
@property
|
||||
@ServiceProviderABC.inject
|
||||
def channel_name(self, bot: DiscordBotServiceABC) -> str:
|
||||
channel = bot.get_channel(self.channel_id)
|
||||
if channel is None:
|
||||
return ""
|
||||
return channel.name
|
||||
|
||||
@property
|
||||
def user(self) -> int:
|
||||
return self._user
|
||||
|
||||
@property
|
||||
def time(self) -> float:
|
||||
if self._leaved_on is None or self._joined_on is None:
|
||||
return 0
|
||||
return round((self.leaved_on - self.joined_on).total_seconds() / 3600, 2)
|
||||
|
||||
@property
|
||||
def joined_on(self) -> datetime:
|
||||
return self._joined_on
|
||||
|
||||
@property
|
||||
def leaved_on(self) -> datetime:
|
||||
return self._leaved_on
|
@@ -1,102 +0,0 @@
|
||||
from datetime import datetime
|
||||
from typing import Optional
|
||||
|
||||
from cpl_core.database import TableABC
|
||||
|
||||
from bot_data.model.user import User
|
||||
|
||||
|
||||
# had to name it UserWarnings instead of UserWarning because UserWarning is a builtin class
|
||||
class UserWarnings(TableABC):
|
||||
def __init__(
|
||||
self,
|
||||
description: str,
|
||||
user: User,
|
||||
author: Optional[User],
|
||||
created_at: datetime = None,
|
||||
modified_at: datetime = None,
|
||||
id=0,
|
||||
):
|
||||
self._id = id
|
||||
self._description = description
|
||||
self._user = user
|
||||
self._author = author
|
||||
|
||||
TableABC.__init__(self)
|
||||
self._created_at = created_at if created_at is not None else self._created_at
|
||||
self._modified_at = modified_at if modified_at is not None else self._modified_at
|
||||
|
||||
@property
|
||||
def id(self) -> int:
|
||||
return self._id
|
||||
|
||||
@property
|
||||
def description(self) -> str:
|
||||
return self._description
|
||||
|
||||
@property
|
||||
def user(self) -> User:
|
||||
return self._user
|
||||
|
||||
@property
|
||||
def author(self) -> Optional[User]:
|
||||
return self._author
|
||||
|
||||
@staticmethod
|
||||
def get_select_all_string() -> str:
|
||||
return str(
|
||||
f"""
|
||||
SELECT * FROM `UserWarnings`;
|
||||
"""
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def get_select_by_id_string(id: int) -> str:
|
||||
return str(
|
||||
f"""
|
||||
SELECT * FROM `UserWarnings`
|
||||
WHERE `Id` = {id};
|
||||
"""
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def get_select_by_user_id_string(id: int) -> str:
|
||||
return str(
|
||||
f"""
|
||||
SELECT * FROM `UserWarnings`
|
||||
WHERE `UserId` = {id};
|
||||
"""
|
||||
)
|
||||
|
||||
@property
|
||||
def insert_string(self) -> str:
|
||||
return str(
|
||||
f"""
|
||||
INSERT INTO `UserWarnings` (
|
||||
`Description`, `UserId`, `Author`
|
||||
) VALUES (
|
||||
'{self._description}',
|
||||
{self._user.id},
|
||||
{"NULL" if self._author is None else f"{self._author.id}"}
|
||||
);
|
||||
"""
|
||||
)
|
||||
|
||||
@property
|
||||
def udpate_string(self) -> str:
|
||||
return str(
|
||||
f"""
|
||||
UPDATE `UserWarnings`
|
||||
SET `Description` = '{self._description}'
|
||||
WHERE `Id` = {self._id};
|
||||
"""
|
||||
)
|
||||
|
||||
@property
|
||||
def delete_string(self) -> str:
|
||||
return str(
|
||||
f"""
|
||||
DELETE FROM `UserWarnings`
|
||||
WHERE `Id` = {self._id};
|
||||
"""
|
||||
)
|
@@ -1,43 +0,0 @@
|
||||
from typing import Optional
|
||||
|
||||
from bot_data.abc.history_table_abc import HistoryTableABC
|
||||
|
||||
|
||||
# had to name it UserWarnings instead of UserWarning because UserWarning is a builtin class
|
||||
class UserWarningsHistory(HistoryTableABC):
|
||||
def __init__(
|
||||
self,
|
||||
description: str,
|
||||
user: int,
|
||||
author: Optional[int],
|
||||
deleted: bool,
|
||||
date_from: str,
|
||||
date_to: str,
|
||||
id=0,
|
||||
):
|
||||
HistoryTableABC.__init__(self)
|
||||
|
||||
self._id = id
|
||||
self._description = description
|
||||
self._user = user
|
||||
self._author = author
|
||||
|
||||
self._deleted = deleted
|
||||
self._date_from = date_from
|
||||
self._date_to = date_to
|
||||
|
||||
@property
|
||||
def id(self) -> int:
|
||||
return self._id
|
||||
|
||||
@property
|
||||
def description(self) -> str:
|
||||
return self._description
|
||||
|
||||
@property
|
||||
def user(self) -> int:
|
||||
return self._user
|
||||
|
||||
@property
|
||||
def author(self) -> Optional[int]:
|
||||
return self._author
|
@@ -1,12 +0,0 @@
|
||||
DROP TABLE `Servers`;
|
||||
|
||||
DROP TABLE `Users`;
|
||||
|
||||
DROP TABLE `Clients`;
|
||||
|
||||
DROP TABLE `KnownUsers`;
|
||||
|
||||
DROP TABLE `UserJoinedServers`;
|
||||
|
||||
DROP TABLE `UserJoinedVoiceChannel`;
|
||||
|
@@ -1,80 +0,0 @@
|
||||
CREATE TABLE IF NOT EXISTS `MigrationHistory`
|
||||
(
|
||||
`MigrationId` VARCHAR(255),
|
||||
`CreatedAt` DATETIME(6),
|
||||
`LastModifiedAt` DATETIME(6),
|
||||
PRIMARY KEY (`MigrationId`)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `Servers`
|
||||
(
|
||||
`ServerId` BIGINT NOT NULL AUTO_INCREMENT,
|
||||
`DiscordServerId` BIGINT NOT NULL,
|
||||
`CreatedAt` DATETIME(6),
|
||||
`LastModifiedAt` DATETIME(6),
|
||||
PRIMARY KEY (`ServerId`)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `Users`
|
||||
(
|
||||
`UserId` BIGINT NOT NULL AUTO_INCREMENT,
|
||||
`DiscordId` BIGINT NOT NULL,
|
||||
`XP` BIGINT NOT NULL DEFAULT 0,
|
||||
`ServerId` BIGINT,
|
||||
`CreatedAt` DATETIME(6),
|
||||
`LastModifiedAt` DATETIME(6),
|
||||
FOREIGN KEY (`ServerId`) REFERENCES Servers (`ServerId`),
|
||||
PRIMARY KEY (`UserId`)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `Clients`
|
||||
(
|
||||
`ClientId` BIGINT NOT NULL AUTO_INCREMENT,
|
||||
`DiscordClientId` BIGINT NOT NULL,
|
||||
`SentMessageCount` BIGINT NOT NULL DEFAULT 0,
|
||||
`ReceivedMessageCount` BIGINT NOT NULL DEFAULT 0,
|
||||
`DeletedMessageCount` BIGINT NOT NULL DEFAULT 0,
|
||||
`ReceivedCommandsCount` BIGINT NOT NULL DEFAULT 0,
|
||||
`MovedUsersCount` BIGINT NOT NULL DEFAULT 0,
|
||||
`ServerId` BIGINT,
|
||||
`CreatedAt` DATETIME(6),
|
||||
`LastModifiedAt` DATETIME(6),
|
||||
FOREIGN KEY (`ServerId`) REFERENCES Servers (`ServerId`),
|
||||
PRIMARY KEY (`ClientId`)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `KnownUsers`
|
||||
(
|
||||
`KnownUserId` BIGINT NOT NULL AUTO_INCREMENT,
|
||||
`DiscordId` BIGINT NOT NULL,
|
||||
`CreatedAt` DATETIME(6),
|
||||
`LastModifiedAt` DATETIME(6),
|
||||
PRIMARY KEY (`KnownUserId`)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `UserJoinedServers`
|
||||
(
|
||||
`JoinId` BIGINT NOT NULL AUTO_INCREMENT,
|
||||
`UserId` BIGINT NOT NULL,
|
||||
`JoinedOn` DATETIME(6) NOT NULL,
|
||||
`LeavedOn` DATETIME(6),
|
||||
`CreatedAt` DATETIME(6),
|
||||
`LastModifiedAt` DATETIME(6),
|
||||
FOREIGN KEY (`UserId`) REFERENCES Users (`UserId`),
|
||||
PRIMARY KEY (`JoinId`)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `UserJoinedVoiceChannel`
|
||||
(
|
||||
`JoinId` BIGINT NOT NULL AUTO_INCREMENT,
|
||||
`UserId` BIGINT NOT NULL,
|
||||
`DiscordChannelId` BIGINT NOT NULL,
|
||||
`JoinedOn` DATETIME(6) NOT NULL,
|
||||
`LeavedOn` DATETIME(6),
|
||||
`CreatedAt` DATETIME(6),
|
||||
`LastModifiedAt` DATETIME(6),
|
||||
FOREIGN KEY (`UserId`) REFERENCES Users (`UserId`),
|
||||
PRIMARY KEY (`JoinId`)
|
||||
);
|
||||
|
||||
|
@@ -1,4 +0,0 @@
|
||||
DROP TABLE `AutoRoleRules`;
|
||||
|
||||
|
||||
DROP TABLE `AutoRoles`;
|
@@ -1,26 +0,0 @@
|
||||
CREATE TABLE IF NOT EXISTS `AutoRoles`
|
||||
(
|
||||
`AutoRoleId` BIGINT NOT NULL AUTO_INCREMENT,
|
||||
`ServerId` BIGINT,
|
||||
`DiscordMessageId` BIGINT NOT NULL,
|
||||
`CreatedAt` DATETIME(6),
|
||||
`LastModifiedAt` DATETIME(6),
|
||||
PRIMARY KEY (`AutoRoleId`),
|
||||
FOREIGN KEY (`ServerId`) REFERENCES `Servers` (`ServerId`)
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `AutoRoleRules`
|
||||
(
|
||||
`AutoRoleRuleId` BIGINT NOT NULL AUTO_INCREMENT,
|
||||
`AutoRoleId` BIGINT,
|
||||
`DiscordEmojiName` VARCHAR(64),
|
||||
`DiscordRoleId` BIGINT NOT NULL,
|
||||
`CreatedAt` DATETIME(6),
|
||||
`LastModifiedAt` DATETIME(6),
|
||||
PRIMARY KEY (`AutoRoleRuleId`),
|
||||
FOREIGN KEY (`AutoRoleId`) REFERENCES `AutoRoles` (`AutoRoleId`)
|
||||
);
|
||||
|
||||
|
@@ -1,4 +0,0 @@
|
||||
DROP TABLE `AuthUserUsersRelations`;
|
||||
|
||||
|
||||
DROP TABLE `AuthUsers`;
|
@@ -1,34 +0,0 @@
|
||||
CREATE TABLE IF NOT EXISTS `AuthUsers`
|
||||
(
|
||||
`Id` BIGINT NOT NULL AUTO_INCREMENT,
|
||||
`FirstName` VARCHAR(255),
|
||||
`LastName` VARCHAR(255),
|
||||
`EMail` VARCHAR(255),
|
||||
`Password` VARCHAR(255),
|
||||
`PasswordSalt` VARCHAR(255),
|
||||
`RefreshToken` VARCHAR(255),
|
||||
`ConfirmationId` VARCHAR(255) DEFAULT NULL,
|
||||
`ForgotPasswordId` VARCHAR(255) DEFAULT NULL,
|
||||
`OAuthId` VARCHAR(255) DEFAULT NULL,
|
||||
`RefreshTokenExpiryTime` DATETIME(6) NOT NULL,
|
||||
`AuthRole` INT NOT NULL DEFAULT 0,
|
||||
`CreatedAt` DATETIME(6) NOT NULL,
|
||||
`LastModifiedAt` DATETIME(6) NOT NULL,
|
||||
PRIMARY KEY (`Id`)
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `AuthUserUsersRelations`
|
||||
(
|
||||
`Id` BIGINT NOT NULL AUTO_INCREMENT,
|
||||
`AuthUserId` BIGINT DEFAULT NULL,
|
||||
`UserId` BIGINT DEFAULT NULL,
|
||||
`CreatedAt` DATETIME(6) NOT NULL,
|
||||
`LastModifiedAt` DATETIME(6) NOT NULL,
|
||||
PRIMARY KEY (`Id`),
|
||||
FOREIGN KEY (`AuthUserId`) REFERENCES `AuthUsers` (`Id`),
|
||||
FOREIGN KEY (`UserId`) REFERENCES `Users` (`UserId`)
|
||||
);
|
||||
|
||||
|
@@ -1,2 +0,0 @@
|
||||
DROP TABLE `Levels`;
|
||||
|
@@ -1,15 +0,0 @@
|
||||
CREATE TABLE IF NOT EXISTS `Levels`
|
||||
(
|
||||
`Id` BIGINT NOT NULL AUTO_INCREMENT,
|
||||
`Name` VARCHAR(255) NOT NULL,
|
||||
`Color` VARCHAR(8) NOT NULL,
|
||||
`MinXp` BIGINT NOT NULL,
|
||||
`PermissionInt` BIGINT NOT NULL,
|
||||
`ServerId` BIGINT,
|
||||
`CreatedAt` DATETIME(6),
|
||||
`LastModifiedAt` DATETIME(6),
|
||||
PRIMARY KEY (`Id`),
|
||||
FOREIGN KEY (`ServerId`) REFERENCES `Servers` (`ServerId`)
|
||||
);
|
||||
|
||||
|
@@ -1,2 +0,0 @@
|
||||
DROP TABLE `Statistics`;
|
||||
|
@@ -1,14 +0,0 @@
|
||||
CREATE TABLE IF NOT EXISTS `Statistics`
|
||||
(
|
||||
`Id` BIGINT NOT NULL AUTO_INCREMENT,
|
||||
`Name` VARCHAR(255) NOT NULL,
|
||||
`Description` VARCHAR(255) NOT NULL,
|
||||
`Code` LONGTEXT NOT NULL,
|
||||
`ServerId` BIGINT,
|
||||
`CreatedAt` DATETIME(6),
|
||||
`LastModifiedAt` DATETIME(6),
|
||||
PRIMARY KEY (`Id`),
|
||||
FOREIGN KEY (`ServerId`) REFERENCES `Servers` (`ServerId`)
|
||||
);
|
||||
|
||||
|
@@ -1,4 +0,0 @@
|
||||
ALTER TABLE AutoRoles
|
||||
DROP COLUMN DiscordChannelId;
|
||||
|
||||
|
@@ -1,4 +0,0 @@
|
||||
ALTER TABLE AutoRoles
|
||||
ADD DiscordChannelId BIGINT NOT NULL AFTER ServerId;
|
||||
|
||||
|
@@ -1,2 +0,0 @@
|
||||
DROP TABLE `UserMessageCountPerHour`;
|
||||
|
@@ -1,14 +0,0 @@
|
||||
CREATE TABLE IF NOT EXISTS `UserMessageCountPerHour`
|
||||
(
|
||||
`Id` BIGINT NOT NULL AUTO_INCREMENT,
|
||||
`Date` DATETIME(6) NOT NULL,
|
||||
`Hour` BIGINT,
|
||||
`XPCount` BIGINT,
|
||||
`UserId` BIGINT,
|
||||
`CreatedAt` DATETIME(6),
|
||||
`LastModifiedAt` DATETIME(6),
|
||||
PRIMARY KEY (`Id`),
|
||||
FOREIGN KEY (`UserId`) REFERENCES `Users` (`UserId`)
|
||||
);
|
||||
|
||||
|
@@ -1,2 +0,0 @@
|
||||
DROP TABLE `ApiKeys`;
|
||||
|
@@ -1,15 +0,0 @@
|
||||
CREATE TABLE IF NOT EXISTS `ApiKeys`
|
||||
(
|
||||
`Id` BIGINT NOT NULL AUTO_INCREMENT,
|
||||
`Identifier` VARCHAR(255) NOT NULL,
|
||||
`Key` VARCHAR(255) NOT NULL,
|
||||
`CreatorId` BIGINT NULL,
|
||||
`CreatedAt` DATETIME(6),
|
||||
`LastModifiedAt` DATETIME(6),
|
||||
PRIMARY KEY (`Id`),
|
||||
FOREIGN KEY (`CreatorId`) REFERENCES `Users` (`UserId`),
|
||||
CONSTRAINT UC_Identifier_Key UNIQUE (`Identifier`, `Key`),
|
||||
CONSTRAINT UC_Key UNIQUE (`Key`)
|
||||
);
|
||||
|
||||
|
@@ -1,8 +0,0 @@
|
||||
DROP TABLE `UserJoinedGameServer`;
|
||||
|
||||
|
||||
DROP TABLE `UserGameIdents`;
|
||||
|
||||
|
||||
DROP TABLE `GameServers`;
|
||||
|
@@ -1,46 +0,0 @@
|
||||
CREATE TABLE IF NOT EXISTS `GameServers`
|
||||
(
|
||||
`Id` BIGINT NOT NULL AUTO_INCREMENT,
|
||||
`Name` VARCHAR(255) NOT NULL,
|
||||
`ServerId` BIGINT NOT NULL,
|
||||
`ApiKeyId` BIGINT NOT NULL,
|
||||
`CreatedAt` DATETIME(6),
|
||||
`LastModifiedAt` DATETIME(6),
|
||||
FOREIGN KEY (`ServerId`) REFERENCES Servers (`ServerId`),
|
||||
FOREIGN KEY (`ApiKeyId`) REFERENCES ApiKeys (`Id`),
|
||||
PRIMARY KEY (`Id`)
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `UserJoinedGameServer`
|
||||
(
|
||||
`Id` BIGINT NOT NULL AUTO_INCREMENT,
|
||||
`UserId` BIGINT NOT NULL,
|
||||
`GameServerId` BIGINT NOT NULL,
|
||||
`JoinedOn` DATETIME(6) NOT NULL,
|
||||
`LeavedOn` DATETIME(6),
|
||||
`CreatedAt` DATETIME(6),
|
||||
`LastModifiedAt` DATETIME(6),
|
||||
FOREIGN KEY (`UserId`) REFERENCES Users (`UserId`),
|
||||
FOREIGN KEY (`GameServerId`) REFERENCES GameServers (`Id`),
|
||||
PRIMARY KEY (`Id`)
|
||||
);
|
||||
|
||||
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `UserGameIdents`
|
||||
(
|
||||
`Id` BIGINT NOT NULL AUTO_INCREMENT,
|
||||
`UserId` BIGINT NOT NULL,
|
||||
`GameServerId` BIGINT NOT NULL,
|
||||
`Ident` VARCHAR(255) NOT NULL,
|
||||
`CreatedAt` DATETIME(6),
|
||||
`LastModifiedAt` DATETIME(6),
|
||||
FOREIGN KEY (`UserId`) REFERENCES Users (`UserId`),
|
||||
FOREIGN KEY (`GameServerId`) REFERENCES GameServers (`Id`),
|
||||
CONSTRAINT UC_UserGameIdent UNIQUE (`GameServerId`, `Ident`),
|
||||
PRIMARY KEY (`Id`)
|
||||
);
|
||||
|
||||
|
@@ -1,14 +0,0 @@
|
||||
CREATE TABLE IF NOT EXISTS `Statistics`
|
||||
(
|
||||
`Id` BIGINT NOT NULL AUTO_INCREMENT,
|
||||
`Name` VARCHAR(255) NOT NULL,
|
||||
`Description` VARCHAR(255) NOT NULL,
|
||||
`Code` LONGTEXT NOT NULL,
|
||||
`ServerId` BIGINT,
|
||||
`CreatedAt` DATETIME(6),
|
||||
`LastModifiedAt` DATETIME(6),
|
||||
PRIMARY KEY (`Id`),
|
||||
FOREIGN KEY (`ServerId`) REFERENCES `Servers` (`ServerId`)
|
||||
);
|
||||
|
||||
|
@@ -1,3 +0,0 @@
|
||||
DROP TABLE IF EXISTS `Statistics`;
|
||||
|
||||
|
@@ -1,2 +0,0 @@
|
||||
DROP TABLE `UserWarnings`;
|
||||
|
@@ -1,14 +0,0 @@
|
||||
CREATE TABLE IF NOT EXISTS `UserWarnings`
|
||||
(
|
||||
`Id` BIGINT NOT NULL AUTO_INCREMENT,
|
||||
`Description` VARCHAR(255) NOT NULL,
|
||||
`UserId` BIGINT NOT NULL,
|
||||
`Author` BIGINT NULL,
|
||||
`CreatedAt` DATETIME(6),
|
||||
`LastModifiedAt` DATETIME(6),
|
||||
PRIMARY KEY (`Id`),
|
||||
FOREIGN KEY (`UserId`) REFERENCES `Users` (`UserId`),
|
||||
FOREIGN KEY (`Author`) REFERENCES `Users` (`UserId`)
|
||||
);
|
||||
|
||||
|
@@ -1,34 +0,0 @@
|
||||
DROP TABLE `ApiKeysHistory`;
|
||||
|
||||
DROP TABLE `AuthUsersHistory`;
|
||||
|
||||
DROP TABLE `AuthUserUsersRelationsHistory`;
|
||||
|
||||
DROP TABLE `AutoRoleRulesHistory`;
|
||||
|
||||
DROP TABLE `AutoRolesHistory`;
|
||||
|
||||
DROP TABLE `ClientsHistory`;
|
||||
|
||||
DROP TABLE `GameServersHistory`;
|
||||
|
||||
DROP TABLE `KnownUsersHistory`;
|
||||
|
||||
DROP TABLE `LevelsHistory`;
|
||||
|
||||
DROP TABLE `ServersHistory`;
|
||||
|
||||
DROP TABLE `UserGameIdentsHistory`;
|
||||
|
||||
DROP TABLE `UserJoinedGameServerHistory`;
|
||||
|
||||
DROP TABLE `UserJoinedServersHistory`;
|
||||
|
||||
DROP TABLE `UserJoinedVoiceChannelHistory`;
|
||||
|
||||
DROP TABLE `UserMessageCountPerHourHistory`;
|
||||
|
||||
DROP TABLE `UsersHistory`;
|
||||
|
||||
DROP TABLE `UserWarningsHistory`;
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user