Added logic to send message after level up #25

This commit is contained in:
2022-11-06 22:17:17 +01:00
parent 6e39154c75
commit 6640d70440
9 changed files with 119 additions and 27 deletions

View File

@@ -0,0 +1,39 @@
import traceback
from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC
from cpl_core.console import Console
from cpl_query.extension import List
from bot_data.model.level import Level
class DefaultLevelSettings(ConfigurationModelABC):
def __init__(self):
ConfigurationModelABC.__init__(self)
self._levels = List(Level)
self._level_header = ''
@property
def levels(self) -> List[Level]:
return self._levels
@property
def level_header(self) -> str:
return self._level_header
def from_dict(self, settings: dict):
try:
self._level_header = settings['LevelHeader']
for level in settings['Levels']:
self._levels.append(Level(
level['Name'],
level['Color'],
int(level['MinXp']),
int(level['Permissions']),
None
))
except Exception as e:
Console.error(f'[ ERROR ] [ {__name__} ]: Reading error in {type(self).__name__} settings')
Console.error(f'[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}')

View File

@@ -0,0 +1,29 @@
import traceback
from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC
from cpl_core.console import Console
class LevelServerSettings(ConfigurationModelABC):
def __init__(self):
ConfigurationModelABC.__init__(self)
self._id: int = 0
self._changed_level_notification_channel = 0
@property
def id(self) -> int:
return self._id
@property
def changed_level_notification_channel(self) -> int:
return self._changed_level_notification_channel
def from_dict(self, settings: dict):
try:
self._id = int(settings['Id'])
self._changed_level_notification_channel = int(settings['ChangedLevelNotificationChannelId'])
except Exception as e:
Console.error(f'[ ERROR ] [ {__name__} ]: Reading error in {type(self).__name__} settings')
Console.error(f'[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}')

View File

@@ -4,7 +4,7 @@ from cpl_core.configuration.configuration_model_abc import ConfigurationModelABC
from cpl_core.console import Console
from cpl_query.extension import List
from bot_data.model.level import Level
from modules.level.configuration.level_server_settings import LevelServerSettings
class LevelSettings(ConfigurationModelABC):
@@ -12,28 +12,21 @@ class LevelSettings(ConfigurationModelABC):
def __init__(self):
ConfigurationModelABC.__init__(self)
self._levels = List(Level)
self._level_header = ''
self._servers: List[LevelServerSettings] = List()
@property
def levels(self) -> List[Level]:
return self._levels
@property
def level_header(self) -> str:
return self._level_header
def servers(self) -> List[LevelServerSettings]:
return self._servers
def from_dict(self, settings: dict):
try:
self._level_header = settings['LevelHeader']
for level in settings['Levels']:
self._levels.append(Level(
level['Name'],
level['Color'],
int(level['MinXp']),
int(level['Permissions']),
None
))
servers = List(LevelServerSettings)
for s in settings:
st = LevelServerSettings()
settings[s]['Id'] = s
st.from_dict(settings[s])
servers.append(st)
self._servers = servers
except Exception as e:
Console.error(f'[ ERROR ] [ {__name__} ]: Reading error in {type(self).__name__} settings')
Console.error(f'[ EXCEPTION ] [ {__name__} ]: {e} -> {traceback.format_exc()}')

View File

@@ -1,5 +1,5 @@
{
"Level": {
"DefaultLevel": {
"LevelHeader": "~~~ Level ~~~",
"Levels": [
{

View File

@@ -9,12 +9,12 @@ from bot_data.abc.server_repository_abc import ServerRepositoryABC
from bot_data.model.level import Level
from bot_data.model.server import Server
from bot_data.service.level_repository_service import LevelRepositoryService
from modules.level.configuration.level_settings import LevelSettings
from modules.level.configuration.default_level_settings import DefaultLevelSettings
class LevelSeeder(DataSeederABC):
def __init__(self, logger: DatabaseLogger, levels: LevelSettings, level_repo: LevelRepositoryService, servers: ServerRepositoryABC, bot: DiscordBotServiceABC):
def __init__(self, logger: DatabaseLogger, levels: DefaultLevelSettings, level_repo: LevelRepositoryService, servers: ServerRepositoryABC, bot: DiscordBotServiceABC):
DataSeederABC.__init__(self)
self._logger = logger

View File

@@ -1,35 +1,42 @@
import asyncio
import discord
from cpl_core.configuration import ConfigurationABC
from cpl_core.database.context import DatabaseContextABC
from cpl_core.logging import LoggerABC
from cpl_discord.container import Guild, Role, Member
from cpl_discord.service import DiscordBotServiceABC
from bot_core.service.message_service import MessageService
from bot_data.model.level import Level
from bot_data.model.user import User
from bot_data.service.level_repository_service import LevelRepositoryService
from bot_data.service.server_repository_service import ServerRepositoryService
from bot_data.service.user_repository_service import UserRepositoryService
from modules.level.configuration.level_server_settings import LevelServerSettings
class LevelService:
def __init__(
self,
config: ConfigurationABC,
logger: LoggerABC,
db: DatabaseContextABC,
levels: LevelRepositoryService,
users: UserRepositoryService,
servers: ServerRepositoryService,
bot: DiscordBotServiceABC
bot: DiscordBotServiceABC,
message_service: MessageService
):
self._config = config
self._logger = logger
self._db = db
self._levels = levels
self._users = users
self._servers = servers
self._bot = bot
self._message_service = message_service
def get_level(self, user: User) -> Level:
levels = self._levels.get_levels_by_server_id(user.server.server_id).order_by(lambda l: l.min_xp)
@@ -39,6 +46,12 @@ class LevelService:
level_names = self._levels.get_levels_by_server_id(user.server.server_id).select(lambda l: l.name)
guild: Guild = self._bot.guilds.where(lambda g: g.id == user.server.discord_server_id).single()
member: Member = guild.members.where(lambda m: m.id == user.discord_id).single()
level = self.get_level(user)
level_role: Role = guild.roles.where(lambda r: r.name == level.name).single()
if level_role in member.roles:
return
for role in member.roles:
if role.name not in level_names.to_list():
continue
@@ -50,9 +63,6 @@ class LevelService:
except Exception as e:
self._logger.error(__name__, f'Removing role {role.name} from {member.name} failed!', e)
level_role: Role = guild.roles.where(lambda r: r.name == self.get_level(user).name).single()
if level_role in member.roles:
return
try:
self._logger.debug(__name__, f'Try to add role {level_role.name} to {member.name}')
await member.add_roles(level_role)
@@ -60,6 +70,13 @@ class LevelService:
except Exception as e:
self._logger.error(__name__, f'Adding role {level_role.name} to {member.name} failed!', e)
level_settings: LevelServerSettings = self._config.get_configuration(f'LevelServerSettings_{guild.id}')
await self._message_service.send_channel_message(
self._bot.get_channel(level_settings.changed_level_notification_channel),
f'<@{member.id}> ist nun Level {level.name}',
is_persistent=True
)
async def check_level(self, member: discord.Member):
if member.bot:
return