Added logic to send message after level up #25
This commit is contained in:
@@ -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()}')
|
@@ -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()}')
|
@@ -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()}')
|
||||
|
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"Level": {
|
||||
"DefaultLevel": {
|
||||
"LevelHeader": "~~~ Level ~~~",
|
||||
"Levels": [
|
||||
{
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user