Compare commits
No commits in common. "75adc2285e9d83cbe0c8bea88b9bae5a75c58340" and "aba6e48e2b1144c5ff39b1882f57ed5bad0447b5" have entirely different histories.
75adc2285e
...
aba6e48e2b
@ -4,7 +4,7 @@
|
|||||||
"Version": {
|
"Version": {
|
||||||
"Major": "1",
|
"Major": "1",
|
||||||
"Minor": "1",
|
"Minor": "1",
|
||||||
"Micro": "10"
|
"Micro": "9"
|
||||||
},
|
},
|
||||||
"Author": "Sven Heidemann",
|
"Author": "Sven Heidemann",
|
||||||
"AuthorEmail": "sven.heidemann@sh-edraft.de",
|
"AuthorEmail": "sven.heidemann@sh-edraft.de",
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
"Version": {
|
"Version": {
|
||||||
"Major": "1",
|
"Major": "1",
|
||||||
"Minor": "1",
|
"Minor": "1",
|
||||||
"Micro": "10"
|
"Micro": "9"
|
||||||
},
|
},
|
||||||
"Author": "",
|
"Author": "",
|
||||||
"AuthorEmail": "",
|
"AuthorEmail": "",
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
"Version": {
|
"Version": {
|
||||||
"Major": "1",
|
"Major": "1",
|
||||||
"Minor": "1",
|
"Minor": "1",
|
||||||
"Micro": "10"
|
"Micro": "9"
|
||||||
},
|
},
|
||||||
"Author": "Sven Heidemann",
|
"Author": "Sven Heidemann",
|
||||||
"AuthorEmail": "sven.heidemann@sh-edraft.de",
|
"AuthorEmail": "sven.heidemann@sh-edraft.de",
|
||||||
|
@ -24,4 +24,3 @@ class FeatureFlagsEnum(Enum):
|
|||||||
game_server = "GameServer"
|
game_server = "GameServer"
|
||||||
sync_xp = "SyncXp"
|
sync_xp = "SyncXp"
|
||||||
short_role_name = "ShortRoleName"
|
short_role_name = "ShortRoleName"
|
||||||
technician_full_access = "TechnicianFullAccess"
|
|
||||||
|
@ -26,7 +26,6 @@ class FeatureFlagsSettings(ConfigurationModelABC):
|
|||||||
FeatureFlagsEnum.game_server.value: False, # 25.09.2023 #366
|
FeatureFlagsEnum.game_server.value: False, # 25.09.2023 #366
|
||||||
FeatureFlagsEnum.sync_xp.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.short_role_name.value: False, # 28.09.2023 #378
|
||||||
FeatureFlagsEnum.technician_full_access.value: False, # 03.10.2023 #393
|
|
||||||
}
|
}
|
||||||
|
|
||||||
def __init__(self, **kwargs: dict):
|
def __init__(self, **kwargs: dict):
|
||||||
|
@ -7,6 +7,8 @@ from bot_data.abc.technician_config_repository_abc import TechnicianConfigReposi
|
|||||||
from bot_data.model.server import Server
|
from bot_data.model.server import Server
|
||||||
from bot_data.model.technician_config import TechnicianConfig
|
from bot_data.model.technician_config import TechnicianConfig
|
||||||
from bot_data.service.server_config_seeder import ServerConfigSeeder
|
from bot_data.service.server_config_seeder import ServerConfigSeeder
|
||||||
|
from bot_data.service.technician_config_seeder import TechnicianConfigSeeder
|
||||||
|
from modules.permission.abc.permission_service_abc import PermissionServiceABC
|
||||||
|
|
||||||
|
|
||||||
class ConfigService:
|
class ConfigService:
|
||||||
@ -16,6 +18,7 @@ class ConfigService:
|
|||||||
services: ServiceProviderABC,
|
services: ServiceProviderABC,
|
||||||
technician_config_repo: TechnicianConfigRepositoryABC,
|
technician_config_repo: TechnicianConfigRepositoryABC,
|
||||||
server_config_repo: ServerConfigRepositoryABC,
|
server_config_repo: ServerConfigRepositoryABC,
|
||||||
|
tech_seeder: TechnicianConfigSeeder,
|
||||||
server_seeder: ServerConfigSeeder,
|
server_seeder: ServerConfigSeeder,
|
||||||
):
|
):
|
||||||
self._config = config
|
self._config = config
|
||||||
@ -23,9 +26,13 @@ class ConfigService:
|
|||||||
self._technician_config_repo = technician_config_repo
|
self._technician_config_repo = technician_config_repo
|
||||||
self._server_config_repo = server_config_repo
|
self._server_config_repo = server_config_repo
|
||||||
|
|
||||||
|
self._tech_seeder = tech_seeder
|
||||||
self._server_seeder = server_seeder
|
self._server_seeder = server_seeder
|
||||||
|
|
||||||
def reload_technician_config(self):
|
async def reload_technician_config(self):
|
||||||
|
if not self._technician_config_repo.does_technician_config_exists():
|
||||||
|
await self._tech_seeder.seed()
|
||||||
|
|
||||||
technician_config = self._technician_config_repo.get_technician_config()
|
technician_config = self._technician_config_repo.get_technician_config()
|
||||||
self._config.add_configuration(TechnicianConfig, technician_config)
|
self._config.add_configuration(TechnicianConfig, technician_config)
|
||||||
self._config.add_configuration(FeatureFlagsSettings, FeatureFlagsSettings(**technician_config.feature_flags))
|
self._config.add_configuration(FeatureFlagsSettings, FeatureFlagsSettings(**technician_config.feature_flags))
|
||||||
@ -38,3 +45,6 @@ class ConfigService:
|
|||||||
self._config.add_configuration(
|
self._config.add_configuration(
|
||||||
f"{type(server_config).__name__}_{server_config.server.discord_id}", server_config
|
f"{type(server_config).__name__}_{server_config.server.discord_id}", server_config
|
||||||
)
|
)
|
||||||
|
|
||||||
|
permissions: PermissionServiceABC = self._services.get_service(PermissionServiceABC)
|
||||||
|
permissions.on_ready()
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
"Version": {
|
"Version": {
|
||||||
"Major": "1",
|
"Major": "1",
|
||||||
"Minor": "1",
|
"Minor": "1",
|
||||||
"Micro": "10"
|
"Micro": "9"
|
||||||
},
|
},
|
||||||
"Author": "Sven Heidemann",
|
"Author": "Sven Heidemann",
|
||||||
"AuthorEmail": "sven.heidemann@sh-edraft.de",
|
"AuthorEmail": "sven.heidemann@sh-edraft.de",
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
"Version": {
|
"Version": {
|
||||||
"Major": "1",
|
"Major": "1",
|
||||||
"Minor": "1",
|
"Minor": "1",
|
||||||
"Micro": "10"
|
"Micro": "9"
|
||||||
},
|
},
|
||||||
"Author": "Sven Heidemann",
|
"Author": "Sven Heidemann",
|
||||||
"AuthorEmail": "sven.heidemann@sh-edraft.de",
|
"AuthorEmail": "sven.heidemann@sh-edraft.de",
|
||||||
|
@ -13,6 +13,7 @@ from bot_data.model.server_team_role_ids_config import ServerTeamRoleIdsConfig
|
|||||||
from bot_data.model.team_member_type_enum import TeamMemberTypeEnum
|
from bot_data.model.team_member_type_enum import TeamMemberTypeEnum
|
||||||
from bot_data.model.user_role_enum import UserRoleEnum
|
from bot_data.model.user_role_enum import UserRoleEnum
|
||||||
from bot_graphql.abc.query_abc import QueryABC
|
from bot_graphql.abc.query_abc import QueryABC
|
||||||
|
from modules.permission.abc.permission_service_abc import PermissionServiceABC
|
||||||
|
|
||||||
|
|
||||||
class ServerConfigMutation(QueryABC):
|
class ServerConfigMutation(QueryABC):
|
||||||
@ -24,6 +25,7 @@ class ServerConfigMutation(QueryABC):
|
|||||||
server_configs: ServerConfigRepositoryABC,
|
server_configs: ServerConfigRepositoryABC,
|
||||||
db: DatabaseContextABC,
|
db: DatabaseContextABC,
|
||||||
config_service: ConfigService,
|
config_service: ConfigService,
|
||||||
|
permissions: PermissionServiceABC,
|
||||||
):
|
):
|
||||||
QueryABC.__init__(self, "ServerConfigMutation")
|
QueryABC.__init__(self, "ServerConfigMutation")
|
||||||
|
|
||||||
@ -33,6 +35,7 @@ class ServerConfigMutation(QueryABC):
|
|||||||
self._server_configs = server_configs
|
self._server_configs = server_configs
|
||||||
self._db = db
|
self._db = db
|
||||||
self._config_service = config_service
|
self._config_service = config_service
|
||||||
|
self._permissions = permissions
|
||||||
|
|
||||||
self.set_field("updateServerConfig", self.resolve_update_server_config)
|
self.set_field("updateServerConfig", self.resolve_update_server_config)
|
||||||
|
|
||||||
@ -180,3 +183,4 @@ class ServerConfigMutation(QueryABC):
|
|||||||
self._server_configs.add_server_team_role_id_config(role_id)
|
self._server_configs.add_server_team_role_id_config(role_id)
|
||||||
|
|
||||||
self._bot.loop.create_task(self._config_service.reload_server_config(new_config.server))
|
self._bot.loop.create_task(self._config_service.reload_server_config(new_config.server))
|
||||||
|
self._permissions.on_ready()
|
||||||
|
@ -11,8 +11,8 @@ from bot_data.model.technician_config import TechnicianConfig
|
|||||||
from bot_data.model.technician_id_config import TechnicianIdConfig
|
from bot_data.model.technician_id_config import TechnicianIdConfig
|
||||||
from bot_data.model.technician_ping_url_config import TechnicianPingUrlConfig
|
from bot_data.model.technician_ping_url_config import TechnicianPingUrlConfig
|
||||||
from bot_data.model.user_role_enum import UserRoleEnum
|
from bot_data.model.user_role_enum import UserRoleEnum
|
||||||
from bot_data.service.technician_config_seeder import TechnicianConfigSeeder
|
|
||||||
from bot_graphql.abc.query_abc import QueryABC
|
from bot_graphql.abc.query_abc import QueryABC
|
||||||
|
from modules.permission.abc.permission_service_abc import PermissionServiceABC
|
||||||
|
|
||||||
|
|
||||||
class TechnicianConfigMutation(QueryABC):
|
class TechnicianConfigMutation(QueryABC):
|
||||||
@ -23,8 +23,8 @@ class TechnicianConfigMutation(QueryABC):
|
|||||||
servers: ServerRepositoryABC,
|
servers: ServerRepositoryABC,
|
||||||
technician_configs: TechnicianConfigRepositoryABC,
|
technician_configs: TechnicianConfigRepositoryABC,
|
||||||
db: DatabaseContextABC,
|
db: DatabaseContextABC,
|
||||||
|
permissions: PermissionServiceABC,
|
||||||
config_service: ConfigService,
|
config_service: ConfigService,
|
||||||
tech_seeder: TechnicianConfigSeeder,
|
|
||||||
):
|
):
|
||||||
QueryABC.__init__(self, "TechnicianConfigMutation")
|
QueryABC.__init__(self, "TechnicianConfigMutation")
|
||||||
|
|
||||||
@ -33,15 +33,12 @@ class TechnicianConfigMutation(QueryABC):
|
|||||||
self._servers = servers
|
self._servers = servers
|
||||||
self._technician_configs = technician_configs
|
self._technician_configs = technician_configs
|
||||||
self._db = db
|
self._db = db
|
||||||
|
self._permissions = permissions
|
||||||
self._config_service = config_service
|
self._config_service = config_service
|
||||||
self._tech_seeder = tech_seeder
|
|
||||||
|
|
||||||
self.set_field("updateTechnicianConfig", self.resolve_update_technician_config)
|
self.set_field("updateTechnicianConfig", self.resolve_update_technician_config)
|
||||||
|
|
||||||
def resolve_update_technician_config(self, *_, input: dict):
|
def resolve_update_technician_config(self, *_, input: dict):
|
||||||
if not self._technician_configs.does_technician_config_exists():
|
|
||||||
self._bot.loop.create_task(self._tech_seeder.seed())
|
|
||||||
|
|
||||||
technician_config = self._technician_configs.get_technician_config()
|
technician_config = self._technician_configs.get_technician_config()
|
||||||
self._can_user_mutate_data(Route.get_user().users[0].server, UserRoleEnum.technician)
|
self._can_user_mutate_data(Route.get_user().users[0].server, UserRoleEnum.technician)
|
||||||
|
|
||||||
@ -59,16 +56,11 @@ class TechnicianConfigMutation(QueryABC):
|
|||||||
technician_config.cache_max_messages = (
|
technician_config.cache_max_messages = (
|
||||||
input["cacheMaxMessages"] if "cacheMaxMessages" in input else technician_config.cache_max_messages
|
input["cacheMaxMessages"] if "cacheMaxMessages" in input else technician_config.cache_max_messages
|
||||||
)
|
)
|
||||||
old_feature_flags = technician_config.feature_flags
|
|
||||||
technician_config.feature_flags = (
|
technician_config.feature_flags = (
|
||||||
dict(zip([x["key"] for x in input["featureFlags"]], [x["value"] for x in input["featureFlags"]]))
|
dict(zip([x["key"] for x in input["featureFlags"]], [x["value"] for x in input["featureFlags"]]))
|
||||||
if "featureFlags" in input
|
if "featureFlags" in input
|
||||||
else technician_config.feature_flags
|
else technician_config.feature_flags
|
||||||
)
|
)
|
||||||
for old_flag in old_feature_flags:
|
|
||||||
if old_flag not in technician_config.feature_flags:
|
|
||||||
technician_config.feature_flags[old_flag] = False
|
|
||||||
|
|
||||||
technician_config.ping_urls = (
|
technician_config.ping_urls = (
|
||||||
List(str, input["pingURLs"]) if "pingURLs" in input else technician_config.ping_urls
|
List(str, input["pingURLs"]) if "pingURLs" in input else technician_config.ping_urls
|
||||||
)
|
)
|
||||||
@ -86,7 +78,6 @@ class TechnicianConfigMutation(QueryABC):
|
|||||||
self._update_technician_ids(technician_config)
|
self._update_technician_ids(technician_config)
|
||||||
|
|
||||||
self._db.save_changes()
|
self._db.save_changes()
|
||||||
self._config_service.reload_technician_config()
|
|
||||||
return technician_config
|
return technician_config
|
||||||
|
|
||||||
def _update_ping_urls(self, new_config: TechnicianConfig):
|
def _update_ping_urls(self, new_config: TechnicianConfig):
|
||||||
@ -121,3 +112,6 @@ class TechnicianConfigMutation(QueryABC):
|
|||||||
continue
|
continue
|
||||||
|
|
||||||
self._technician_configs.add_technician_id_config(TechnicianIdConfig(technician_id))
|
self._technician_configs.add_technician_id_config(TechnicianIdConfig(technician_id))
|
||||||
|
|
||||||
|
self._bot.loop.create_task(self._config_service.reload_technician_config())
|
||||||
|
self._permissions.on_ready()
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
"Version": {
|
"Version": {
|
||||||
"Major": "1",
|
"Major": "1",
|
||||||
"Minor": "1",
|
"Minor": "1",
|
||||||
"Micro": "10"
|
"Micro": "9"
|
||||||
},
|
},
|
||||||
"Author": "Sven Heidemann",
|
"Author": "Sven Heidemann",
|
||||||
"AuthorEmail": "sven.heidemann@sh-edraft.de",
|
"AuthorEmail": "sven.heidemann@sh-edraft.de",
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
"Version": {
|
"Version": {
|
||||||
"Major": "1",
|
"Major": "1",
|
||||||
"Minor": "1",
|
"Minor": "1",
|
||||||
"Micro": "10"
|
"Micro": "9"
|
||||||
},
|
},
|
||||||
"Author": "",
|
"Author": "",
|
||||||
"AuthorEmail": "",
|
"AuthorEmail": "",
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
"Version": {
|
"Version": {
|
||||||
"Major": "1",
|
"Major": "1",
|
||||||
"Minor": "1",
|
"Minor": "1",
|
||||||
"Micro": "10"
|
"Micro": "9"
|
||||||
},
|
},
|
||||||
"Author": "",
|
"Author": "",
|
||||||
"AuthorEmail": "",
|
"AuthorEmail": "",
|
||||||
|
@ -31,17 +31,6 @@ class BaseOnVoiceStateUpdateEventHelpChannel(OnVoiceStateUpdateABC):
|
|||||||
|
|
||||||
self._logger.info(__name__, f"Module {type(self)} loaded")
|
self._logger.info(__name__, f"Module {type(self)} loaded")
|
||||||
|
|
||||||
async def _notify_team(self, member: discord.Member):
|
|
||||||
self._logger.debug(__name__, f"Notify team that a member needs help")
|
|
||||||
settings: ServerConfig = self._config.get_configuration(f"ServerConfig_{member.guild.id}")
|
|
||||||
channel = member.guild.get_channel(settings.team_channel_id)
|
|
||||||
await self._message_service.send_channel_message(
|
|
||||||
channel,
|
|
||||||
self._t.transform("modules.base.member_joined_help_voice_channel").format(member.mention),
|
|
||||||
is_persistent=True,
|
|
||||||
)
|
|
||||||
self._logger.trace(__name__, f"Notified team that a member need help")
|
|
||||||
|
|
||||||
@EventChecks.check_is_ready()
|
@EventChecks.check_is_ready()
|
||||||
async def on_voice_state_update(
|
async def on_voice_state_update(
|
||||||
self,
|
self,
|
||||||
@ -55,6 +44,14 @@ class BaseOnVoiceStateUpdateEventHelpChannel(OnVoiceStateUpdateABC):
|
|||||||
if after.channel is None or after.channel.id != settings.help_voice_channel_id:
|
if after.channel is None or after.channel.id != settings.help_voice_channel_id:
|
||||||
return
|
return
|
||||||
|
|
||||||
await self._notify_team(member)
|
mods = [
|
||||||
|
*self._permissions.get_admins(member.guild.id),
|
||||||
|
*self._permissions.get_moderators(member.guild.id),
|
||||||
|
]
|
||||||
|
for a in mods:
|
||||||
|
await self._message_service.send_dm_message(
|
||||||
|
self._t.transform("modules.base.member_joined_help_voice_channel").format(member.mention),
|
||||||
|
a,
|
||||||
|
)
|
||||||
|
|
||||||
self._logger.debug(__name__, f"Module {type(self)} stopped")
|
self._logger.debug(__name__, f"Module {type(self)} stopped")
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
"Version": {
|
"Version": {
|
||||||
"Major": "1",
|
"Major": "1",
|
||||||
"Minor": "1",
|
"Minor": "1",
|
||||||
"Micro": "10"
|
"Micro": "9"
|
||||||
},
|
},
|
||||||
"Author": "",
|
"Author": "",
|
||||||
"AuthorEmail": "",
|
"AuthorEmail": "",
|
||||||
|
@ -67,7 +67,7 @@ class BootLogOnReadyEvent(OnReadyABC):
|
|||||||
|
|
||||||
server_config: ServerConfig = self._config.get_configuration(f"ServerConfig_{g.id}")
|
server_config: ServerConfig = self._config.get_configuration(f"ServerConfig_{g.id}")
|
||||||
if server_config is None:
|
if server_config is None:
|
||||||
self._logger.error(__name__, f"Config ServerConfig_{g.id} not found!")
|
self._logger.error(__name__, f"Config {type(self).__name__}_{g.id} not found!")
|
||||||
return
|
return
|
||||||
|
|
||||||
if not FeatureFlagsSettings.get_flag_from_dict(
|
if not FeatureFlagsSettings.get_flag_from_dict(
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
"Version": {
|
"Version": {
|
||||||
"Major": "1",
|
"Major": "1",
|
||||||
"Minor": "1",
|
"Minor": "1",
|
||||||
"Micro": "10"
|
"Micro": "9"
|
||||||
},
|
},
|
||||||
"Author": "",
|
"Author": "",
|
||||||
"AuthorEmail": "",
|
"AuthorEmail": "",
|
||||||
|
@ -19,4 +19,4 @@ class ConfigExtension(ApplicationExtensionABC):
|
|||||||
logger: LoggerABC = services.get_service(LoggerABC)
|
logger: LoggerABC = services.get_service(LoggerABC)
|
||||||
logger.debug(__name__, "Config extension started")
|
logger.debug(__name__, "Config extension started")
|
||||||
config: ConfigService = services.get_service(ConfigService)
|
config: ConfigService = services.get_service(ConfigService)
|
||||||
config.reload_technician_config()
|
await config.reload_technician_config()
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
"Version": {
|
"Version": {
|
||||||
"Major": "1",
|
"Major": "1",
|
||||||
"Minor": "1",
|
"Minor": "1",
|
||||||
"Micro": "10"
|
"Micro": "9"
|
||||||
},
|
},
|
||||||
"Author": "Sven Heidemann",
|
"Author": "Sven Heidemann",
|
||||||
"AuthorEmail": "sven.heidemann@sh-edraft.de",
|
"AuthorEmail": "sven.heidemann@sh-edraft.de",
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
"Version": {
|
"Version": {
|
||||||
"Major": "1",
|
"Major": "1",
|
||||||
"Minor": "1",
|
"Minor": "1",
|
||||||
"Micro": "10"
|
"Micro": "9"
|
||||||
},
|
},
|
||||||
"Author": "",
|
"Author": "",
|
||||||
"AuthorEmail": "",
|
"AuthorEmail": "",
|
||||||
|
@ -8,6 +8,42 @@ class PermissionServiceABC(ABC):
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def on_ready(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def on_member_update(self, before: discord.Member, after: discord.Member):
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def get_admin_role_ids(self, g_id: int) -> list[int]:
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def get_admin_roles(self, g_id: int) -> list[discord.Role]:
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def get_admins(self, g_id: int) -> list[discord.Member]:
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def get_moderator_role_ids(self, g_id: int) -> list[int]:
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def get_moderator_roles(self, g_id: int) -> list[discord.Role]:
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def get_moderators(self, g_id: int) -> list[discord.Member]:
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def get_technicians(self) -> list[discord.Member]:
|
||||||
|
pass
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def is_member_admin(self, member: discord.Member) -> bool:
|
def is_member_admin(self, member: discord.Member) -> bool:
|
||||||
pass
|
pass
|
||||||
|
26
kdb-bot/src/modules/permission/events/__init__.py
Normal file
26
kdb-bot/src/modules/permission/events/__init__.py
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
"""
|
||||||
|
bot sh-edraft.de Discord bot
|
||||||
|
~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Discord bot for customers of sh-edraft.de
|
||||||
|
|
||||||
|
:copyright: (c) 2022 - 2023 sh-edraft.de
|
||||||
|
:license: MIT, see LICENSE for more details.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
__title__ = "modules.permission.events"
|
||||||
|
__author__ = "Sven Heidemann"
|
||||||
|
__license__ = "MIT"
|
||||||
|
__copyright__ = "Copyright (c) 2022 - 2023 sh-edraft.de"
|
||||||
|
__version__ = "1.1.9"
|
||||||
|
|
||||||
|
from collections import namedtuple
|
||||||
|
|
||||||
|
|
||||||
|
# imports:
|
||||||
|
|
||||||
|
VersionInfo = namedtuple("VersionInfo", "major minor micro")
|
||||||
|
version_info = VersionInfo(major="1", minor="1", micro="9")
|
@ -0,0 +1,30 @@
|
|||||||
|
import discord
|
||||||
|
from cpl_core.configuration import ConfigurationABC
|
||||||
|
from cpl_core.logging import LoggerABC
|
||||||
|
from cpl_discord.events import OnMemberUpdateABC
|
||||||
|
|
||||||
|
from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
|
||||||
|
from bot_core.configuration.feature_flags_settings import FeatureFlagsSettings
|
||||||
|
from bot_data.model.server_config import ServerConfig
|
||||||
|
from modules.permission.abc.permission_service_abc import PermissionServiceABC
|
||||||
|
|
||||||
|
|
||||||
|
class PermissionOnMemberUpdateEvent(OnMemberUpdateABC):
|
||||||
|
def __init__(self, config: ConfigurationABC, logger: LoggerABC, permission_service: PermissionServiceABC):
|
||||||
|
OnMemberUpdateABC.__init__(self)
|
||||||
|
self._config = config
|
||||||
|
self._logger = logger
|
||||||
|
self._permission_service = permission_service
|
||||||
|
|
||||||
|
async def on_member_update(self, before: discord.Member, after: discord.Member):
|
||||||
|
if before.guild is not None:
|
||||||
|
server_config: ServerConfig = self._config.get_configuration(f"ServerConfig_{before.guild.id}")
|
||||||
|
if not FeatureFlagsSettings.get_flag_from_dict(
|
||||||
|
server_config.feature_flags, FeatureFlagsEnum.permission_module
|
||||||
|
):
|
||||||
|
return
|
||||||
|
|
||||||
|
self._logger.debug(__name__, f"Module {type(self)} started")
|
||||||
|
|
||||||
|
if before.roles != after.roles:
|
||||||
|
self._permission_service.on_member_update(before, after)
|
@ -0,0 +1,22 @@
|
|||||||
|
from cpl_core.logging import LoggerABC
|
||||||
|
from cpl_discord.events import OnReadyABC
|
||||||
|
|
||||||
|
from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
|
||||||
|
from bot_core.configuration.feature_flags_settings import FeatureFlagsSettings
|
||||||
|
from bot_data.model.technician_config import TechnicianConfig
|
||||||
|
from modules.permission.abc.permission_service_abc import PermissionServiceABC
|
||||||
|
|
||||||
|
|
||||||
|
class PermissionOnReadyEvent(OnReadyABC):
|
||||||
|
def __init__(self, logger: LoggerABC, permission_service: PermissionServiceABC, tech_config: TechnicianConfig):
|
||||||
|
OnReadyABC.__init__(self)
|
||||||
|
self._logger = logger
|
||||||
|
self._permission_service = permission_service
|
||||||
|
self._tech_config = tech_config
|
||||||
|
|
||||||
|
async def on_ready(self):
|
||||||
|
if not FeatureFlagsSettings.get_flag_from_dict(
|
||||||
|
self._tech_config.feature_flags, FeatureFlagsEnum.permission_module
|
||||||
|
):
|
||||||
|
return
|
||||||
|
self._permission_service.on_ready()
|
@ -4,7 +4,7 @@
|
|||||||
"Version": {
|
"Version": {
|
||||||
"Major": "1",
|
"Major": "1",
|
||||||
"Minor": "1",
|
"Minor": "1",
|
||||||
"Micro": "10"
|
"Micro": "9"
|
||||||
},
|
},
|
||||||
"Author": "",
|
"Author": "",
|
||||||
"AuthorEmail": "",
|
"AuthorEmail": "",
|
||||||
|
@ -1,11 +1,16 @@
|
|||||||
from cpl_core.configuration import ConfigurationABC
|
from cpl_core.configuration import ConfigurationABC
|
||||||
from cpl_core.dependency_injection import ServiceCollectionABC
|
from cpl_core.dependency_injection import ServiceCollectionABC
|
||||||
from cpl_core.environment import ApplicationEnvironmentABC
|
from cpl_core.environment import ApplicationEnvironmentABC
|
||||||
|
from cpl_discord.discord_event_types_enum import DiscordEventTypesEnum
|
||||||
from cpl_discord.service.discord_collection_abc import DiscordCollectionABC
|
from cpl_discord.service.discord_collection_abc import DiscordCollectionABC
|
||||||
|
|
||||||
from bot_core.abc.module_abc import ModuleABC
|
from bot_core.abc.module_abc import ModuleABC
|
||||||
from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
|
from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
|
||||||
from modules.permission.abc.permission_service_abc import PermissionServiceABC
|
from modules.permission.abc.permission_service_abc import PermissionServiceABC
|
||||||
|
from modules.permission.events.permission_on_member_update_event import (
|
||||||
|
PermissionOnMemberUpdateEvent,
|
||||||
|
)
|
||||||
|
from modules.permission.events.permission_on_ready_event import PermissionOnReadyEvent
|
||||||
from modules.permission.service.permission_service import PermissionService
|
from modules.permission.service.permission_service import PermissionService
|
||||||
|
|
||||||
|
|
||||||
@ -17,6 +22,8 @@ class PermissionModule(ModuleABC):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
def configure_services(self, services: ServiceCollectionABC, env: ApplicationEnvironmentABC):
|
def configure_services(self, services: ServiceCollectionABC, env: ApplicationEnvironmentABC):
|
||||||
services.add_transient(PermissionServiceABC, PermissionService)
|
services.add_singleton(PermissionServiceABC, PermissionService)
|
||||||
# commands
|
# commands
|
||||||
# events
|
# events
|
||||||
|
self._dc.add_event(DiscordEventTypesEnum.on_ready.value, PermissionOnReadyEvent)
|
||||||
|
self._dc.add_event(DiscordEventTypesEnum.on_member_update.value, PermissionOnMemberUpdateEvent)
|
||||||
|
@ -3,72 +3,146 @@ from cpl_core.configuration import ConfigurationABC
|
|||||||
from cpl_core.logging import LoggerABC
|
from cpl_core.logging import LoggerABC
|
||||||
from cpl_discord.service import DiscordBotServiceABC
|
from cpl_discord.service import DiscordBotServiceABC
|
||||||
|
|
||||||
from bot_data.abc.server_config_repository_abc import ServerConfigRepositoryABC
|
from bot_data.model.server_config import ServerConfig
|
||||||
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_data.model.team_member_type_enum import TeamMemberTypeEnum
|
||||||
|
from bot_data.model.technician_config import TechnicianConfig
|
||||||
from modules.permission.abc.permission_service_abc import PermissionServiceABC
|
from modules.permission.abc.permission_service_abc import PermissionServiceABC
|
||||||
|
|
||||||
|
|
||||||
class PermissionService(PermissionServiceABC):
|
class PermissionService(PermissionServiceABC):
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
|
technician_settings: TechnicianConfig,
|
||||||
logger: LoggerABC,
|
logger: LoggerABC,
|
||||||
bot: DiscordBotServiceABC,
|
bot: DiscordBotServiceABC,
|
||||||
config: ConfigurationABC,
|
config: ConfigurationABC,
|
||||||
servers: ServerRepositoryABC,
|
|
||||||
server_configs: ServerConfigRepositoryABC,
|
|
||||||
technician_configs: TechnicianConfigRepositoryABC,
|
|
||||||
):
|
):
|
||||||
PermissionServiceABC.__init__(self)
|
PermissionServiceABC.__init__(self)
|
||||||
self._logger = logger
|
self._logger = logger
|
||||||
self._bot = bot
|
self._bot = bot
|
||||||
self._config = config
|
self._config = config
|
||||||
self._servers = servers
|
self._technician_settings = technician_settings
|
||||||
self._server_configs = server_configs
|
|
||||||
self._technician_configs = technician_configs
|
|
||||||
|
|
||||||
def _has_member_role(self, member: discord.Member, team_member_type: TeamMemberTypeEnum) -> bool:
|
self._admin_role_ids: dict[int, list[int]] = {}
|
||||||
if member is None or member.guild is None:
|
self._admin_roles: dict[int, list[discord.Role]] = {}
|
||||||
return False
|
self._admins: dict[int, list[discord.Member]] = {}
|
||||||
|
|
||||||
self._logger.debug(__name__, f"Checking is member {member.name} {team_member_type.value}")
|
self._moderator_role_ids: dict[int, list[int]] = {}
|
||||||
|
self._moderator_roles: dict[int, list[discord.Role]] = {}
|
||||||
|
self._moderators: dict[int, list[discord.Member]] = {}
|
||||||
|
|
||||||
try:
|
self._technician_ids: list[int] = technician_settings.technician_ids.to_list()
|
||||||
server = self._servers.get_server_by_discord_id(member.guild.id)
|
self._technicians: list[discord.Member] = []
|
||||||
config = self._server_configs.get_server_config_by_server(server.id)
|
|
||||||
roles = config.team_role_ids.where(lambda x: x.team_member_type == team_member_type).select(
|
def on_ready(self):
|
||||||
lambda x: member.guild.get_role(x.role_id)
|
for guild in self._bot.guilds:
|
||||||
)
|
guild: discord.Guild = guild
|
||||||
for role in roles:
|
self._logger.debug(__name__, f"Validate permission settings")
|
||||||
if role not in member.roles:
|
|
||||||
|
for technician_id in self._technician_ids:
|
||||||
|
technician = guild.get_member(technician_id)
|
||||||
|
if technician is None:
|
||||||
continue
|
continue
|
||||||
|
self._technicians.append(technician)
|
||||||
|
|
||||||
return True
|
settings: ServerConfig = self._config.get_configuration(f"ServerConfig_{guild.id}")
|
||||||
except Exception as e:
|
if settings is None:
|
||||||
self._logger.error(__name__, "Permission check failed", e)
|
self._logger.error(__name__, "Server settings not found")
|
||||||
|
return
|
||||||
|
|
||||||
return False
|
self._admin_role_ids[guild.id] = (
|
||||||
|
settings.team_role_ids.where(lambda x: x.team_member_type == TeamMemberTypeEnum.admin)
|
||||||
|
.select(lambda x: x.role_id)
|
||||||
|
.to_list()
|
||||||
|
)
|
||||||
|
self._moderator_role_ids[guild.id] = (
|
||||||
|
settings.team_role_ids.where(lambda x: x.team_member_type == TeamMemberTypeEnum.moderator)
|
||||||
|
.select(lambda x: x.role_id)
|
||||||
|
.to_list()
|
||||||
|
)
|
||||||
|
|
||||||
|
admin_roles = []
|
||||||
|
admins = []
|
||||||
|
|
||||||
|
mod_roles = []
|
||||||
|
mods = []
|
||||||
|
|
||||||
|
for role in guild.roles:
|
||||||
|
role: discord.Role = role
|
||||||
|
|
||||||
|
if role.id in self._admin_role_ids[guild.id]:
|
||||||
|
admin_roles.append(role)
|
||||||
|
self._logger.trace(__name__, f"Added admin role {role}")
|
||||||
|
|
||||||
|
for member in role.members:
|
||||||
|
admins.append(member)
|
||||||
|
self._logger.trace(__name__, f"Added admin {member}")
|
||||||
|
|
||||||
|
if role.id in self._moderator_role_ids[guild.id]:
|
||||||
|
mod_roles.append(role)
|
||||||
|
self._logger.trace(__name__, f"Added moderator role {role}")
|
||||||
|
|
||||||
|
for member in role.members:
|
||||||
|
mods.append(member)
|
||||||
|
self._logger.trace(__name__, f"Added moderator {member}")
|
||||||
|
|
||||||
|
self._admin_roles[guild.id] = admin_roles
|
||||||
|
self._admins[guild.id] = admins
|
||||||
|
self._moderator_roles[guild.id] = mod_roles
|
||||||
|
self._moderators[guild.id] = mods
|
||||||
|
|
||||||
|
def on_member_update(self, before: discord.Member, after: discord.Member):
|
||||||
|
g_id = after.guild.id
|
||||||
|
|
||||||
|
for admin_role in self._admin_roles[g_id]:
|
||||||
|
if admin_role in before.roles and admin_role not in after.roles:
|
||||||
|
self._admins[g_id].remove(after)
|
||||||
|
self._logger.trace(__name__, f"Removed {after.id} from admins")
|
||||||
|
|
||||||
|
elif admin_role in after.roles and admin_role not in before.roles:
|
||||||
|
self._admins[g_id].append(after)
|
||||||
|
self._logger.trace(__name__, f"Added {after.id} to admins")
|
||||||
|
|
||||||
|
for moderator_role in self._moderator_roles[g_id]:
|
||||||
|
if moderator_role in before.roles and moderator_role not in after.roles:
|
||||||
|
self._moderators[g_id].remove(after)
|
||||||
|
self._logger.trace(__name__, f"Removed {after.id} from moderators")
|
||||||
|
|
||||||
|
elif moderator_role in after.roles and moderator_role not in before.roles:
|
||||||
|
self._moderators[g_id].append(after)
|
||||||
|
self._logger.trace(__name__, f"Added {after.id} to moderators")
|
||||||
|
|
||||||
|
def get_admin_role_ids(self, g_id: int) -> list[int]:
|
||||||
|
return self._admin_role_ids[g_id]
|
||||||
|
|
||||||
|
def get_admin_roles(self, g_id: int) -> list[discord.Role]:
|
||||||
|
return self._admin_roles[g_id]
|
||||||
|
|
||||||
|
def get_admins(self, g_id: int) -> list[discord.Member]:
|
||||||
|
return self._admins[g_id]
|
||||||
|
|
||||||
|
def get_moderator_role_ids(self, g_id: int) -> list[int]:
|
||||||
|
return self._moderator_role_ids[g_id]
|
||||||
|
|
||||||
|
def get_moderator_roles(self, g_id: int) -> list[discord.Role]:
|
||||||
|
return self._moderator_roles[g_id]
|
||||||
|
|
||||||
|
def get_moderators(self, g_id: int) -> list[discord.Member]:
|
||||||
|
return self._moderators[g_id]
|
||||||
|
|
||||||
|
def get_technicians(self) -> list[discord.Member]:
|
||||||
|
return self._technicians
|
||||||
|
|
||||||
def is_member_admin(self, member: discord.Member) -> bool:
|
def is_member_admin(self, member: discord.Member) -> bool:
|
||||||
return self._has_member_role(member, TeamMemberTypeEnum.admin)
|
return member is not None and member.guild.id in self._admins and member in self._admins[member.guild.id]
|
||||||
|
|
||||||
def is_member_moderator(self, member: discord.Member) -> bool:
|
def is_member_moderator(self, member: discord.Member) -> bool:
|
||||||
return self._has_member_role(member, TeamMemberTypeEnum.moderator) or self._has_member_role(
|
return (
|
||||||
member, TeamMemberTypeEnum.admin
|
member is not None
|
||||||
|
and member.guild.id in self._moderators
|
||||||
|
and member in self._moderators[member.guild.id]
|
||||||
|
or self.is_member_admin(member)
|
||||||
)
|
)
|
||||||
|
|
||||||
def is_member_technician(self, member: discord.Member) -> bool:
|
def is_member_technician(self, member: discord.Member) -> bool:
|
||||||
if member is None or member.guild is None:
|
return member is not None and member in self._technicians
|
||||||
return False
|
|
||||||
|
|
||||||
self._logger.debug(__name__, f"Checking is member {member.name} technician")
|
|
||||||
|
|
||||||
try:
|
|
||||||
tech_config = self._technician_configs.get_technician_config()
|
|
||||||
if member.id in tech_config.technician_ids:
|
|
||||||
return True
|
|
||||||
except Exception as e:
|
|
||||||
self._logger.error(__name__, "Permission check failed", e)
|
|
||||||
|
|
||||||
return False
|
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
"Version": {
|
"Version": {
|
||||||
"Major": "1",
|
"Major": "1",
|
||||||
"Minor": "1",
|
"Minor": "1",
|
||||||
"Micro": "10"
|
"Micro": "9"
|
||||||
},
|
},
|
||||||
"Author": "",
|
"Author": "",
|
||||||
"AuthorEmail": "",
|
"AuthorEmail": "",
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
"Version": {
|
"Version": {
|
||||||
"Major": "1",
|
"Major": "1",
|
||||||
"Minor": "1",
|
"Minor": "1",
|
||||||
"Micro": "10"
|
"Micro": "9"
|
||||||
},
|
},
|
||||||
"Author": "Sven Heidemann",
|
"Author": "Sven Heidemann",
|
||||||
"AuthorEmail": "sven.heidemann@sh-edraft.de",
|
"AuthorEmail": "sven.heidemann@sh-edraft.de",
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
"Version": {
|
"Version": {
|
||||||
"Major": "1",
|
"Major": "1",
|
||||||
"Minor": "1",
|
"Minor": "1",
|
||||||
"Micro": "10"
|
"Micro": "9"
|
||||||
},
|
},
|
||||||
"Author": "Sven Heidemann",
|
"Author": "Sven Heidemann",
|
||||||
"AuthorEmail": "sven.heidemann@sh-edraft.de",
|
"AuthorEmail": "sven.heidemann@sh-edraft.de",
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
"Version": {
|
"Version": {
|
||||||
"Major": "1",
|
"Major": "1",
|
||||||
"Minor": "1",
|
"Minor": "1",
|
||||||
"Micro": "10"
|
"Micro": "9"
|
||||||
},
|
},
|
||||||
"Author": "Sven Heidemann",
|
"Author": "Sven Heidemann",
|
||||||
"AuthorEmail": "sven.heidemann@sh-edraft.de",
|
"AuthorEmail": "sven.heidemann@sh-edraft.de",
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
"Version": {
|
"Version": {
|
||||||
"Major": "1",
|
"Major": "1",
|
||||||
"Minor": "1",
|
"Minor": "1",
|
||||||
"Micro": "10"
|
"Micro": "9"
|
||||||
},
|
},
|
||||||
"Author": "Sven Heidemann",
|
"Author": "Sven Heidemann",
|
||||||
"AuthorEmail": "sven.heidemann@sh-edraft.de",
|
"AuthorEmail": "sven.heidemann@sh-edraft.de",
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "kdb-web",
|
"name": "kdb-web",
|
||||||
"version": "1.1.10",
|
"version": "1.1.9",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"ng": "ng",
|
"ng": "ng",
|
||||||
"update-version": "ts-node update-version.ts",
|
"update-version": "ts-node update-version.ts",
|
||||||
|
@ -34,11 +34,11 @@ export class AuthGuard implements CanActivate {
|
|||||||
|
|
||||||
const role = route.data["role"];
|
const role = route.data["role"];
|
||||||
const memberRole = route.data["memberRole"];
|
const memberRole = route.data["memberRole"];
|
||||||
const authUser = await this.authService.getLoggedInUser();
|
|
||||||
const isTechnician = (authUser?.users?.map(u => u.isTechnician).filter(u => u) ?? []).length > 0;
|
|
||||||
|
|
||||||
if (role !== undefined) {
|
if (role !== undefined) {
|
||||||
this.authService.hasUserPermission(role).then(async hasPermission => {
|
this.authService.hasUserPermission(role).then(async hasPermission => {
|
||||||
|
let authUser = await this.authService.getLoggedInUser();
|
||||||
|
let isTechnician = authUser?.users?.map(u => u.isTechnician).filter(u => u) ?? [];
|
||||||
|
|
||||||
if (!hasPermission && !isTechnician) {
|
if (!hasPermission && !isTechnician) {
|
||||||
this.router.navigate(["/dashboard"]);
|
this.router.navigate(["/dashboard"]);
|
||||||
return false;
|
return false;
|
||||||
@ -49,14 +49,11 @@ export class AuthGuard implements CanActivate {
|
|||||||
|
|
||||||
if (memberRole !== undefined) {
|
if (memberRole !== undefined) {
|
||||||
let userHasAccess = false;
|
let userHasAccess = false;
|
||||||
|
let authUser = await this.authService.getLoggedInUser();
|
||||||
let server = route.params["serverId"];
|
let server = route.params["serverId"];
|
||||||
|
|
||||||
if (this.sidebarService.hasFeature("TechnicianFullAccess") && isTechnician) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!authUser || !authUser.users) {
|
if (!authUser || !authUser.users) {
|
||||||
return false;
|
return true;
|
||||||
}
|
}
|
||||||
authUser?.users?.forEach(u => {
|
authUser?.users?.forEach(u => {
|
||||||
if (u.server === +(server ?? 0)) {
|
if (u.server === +(server ?? 0)) {
|
||||||
|
@ -15,218 +15,216 @@ import { DataService } from "../data/data.service";
|
|||||||
import { FeatureFlag } from "../../models/config/feature-flags.model";
|
import { FeatureFlag } from "../../models/config/feature-flags.model";
|
||||||
|
|
||||||
@Injectable({
|
@Injectable({
|
||||||
providedIn: "root"
|
providedIn: "root"
|
||||||
})
|
})
|
||||||
export class SidebarService {
|
export class SidebarService {
|
||||||
|
|
||||||
isSidebarOpen: boolean = true;
|
isSidebarOpen: boolean = true;
|
||||||
menuItems$ = new BehaviorSubject<MenuItem[]>(new Array<MenuItem>());
|
menuItems$ = new BehaviorSubject<MenuItem[]>(new Array<MenuItem>());
|
||||||
server!: Server | undefined;
|
server!: Server | undefined;
|
||||||
|
|
||||||
dashboard: MenuItem = {};
|
dashboard: MenuItem = {};
|
||||||
serverDashboard: MenuItem = {};
|
serverDashboard: MenuItem = {};
|
||||||
serverProfile: MenuItem = {};
|
serverProfile: MenuItem = {};
|
||||||
serverMembers: MenuItem = {};
|
serverMembers: MenuItem = {};
|
||||||
serverAutoRoles: MenuItem = {};
|
serverAutoRoles: MenuItem = {};
|
||||||
serverLevels: MenuItem = {};
|
serverLevels: MenuItem = {};
|
||||||
serverAchievements: MenuItem = {};
|
serverAchievements: MenuItem = {};
|
||||||
serverShortRoleNames: MenuItem = {};
|
serverShortRoleNames: MenuItem = {};
|
||||||
serverConfig: MenuItem = {};
|
serverConfig: MenuItem = {};
|
||||||
serverMenu: MenuItem = {};
|
serverMenu: MenuItem = {};
|
||||||
adminConfig: MenuItem = {};
|
adminConfig: MenuItem = {};
|
||||||
adminUsers: MenuItem = {};
|
adminUsers: MenuItem = {};
|
||||||
adminMenu: MenuItem = {};
|
adminMenu: MenuItem = {};
|
||||||
|
|
||||||
featureFlags: FeatureFlag[] = [];
|
featureFlags: FeatureFlag[] = [];
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private themeService: ThemeService,
|
private themeService: ThemeService,
|
||||||
private authService: AuthService,
|
private authService: AuthService,
|
||||||
private translateService: TranslateService,
|
private translateService: TranslateService,
|
||||||
private router: Router,
|
private router: Router,
|
||||||
private serverService: ServerService,
|
private serverService: ServerService,
|
||||||
private data: DataService
|
private data: DataService
|
||||||
) {
|
) {
|
||||||
this.themeService.isSidebarOpen$.subscribe(value => {
|
this.themeService.isSidebarOpen$.subscribe(value => {
|
||||||
this.isSidebarOpen = value;
|
this.isSidebarOpen = value;
|
||||||
this.setMenu(true);
|
this.setMenu(true);
|
||||||
});
|
|
||||||
|
|
||||||
this.translateService.onLangChange.subscribe(_ => {
|
|
||||||
this.setMenu(true);
|
|
||||||
});
|
|
||||||
|
|
||||||
this.serverService.server$.subscribe(server => {
|
|
||||||
this.server = server;
|
|
||||||
if (server) {
|
|
||||||
this.setMenu(true);
|
|
||||||
} else {
|
|
||||||
this.setMenu(false);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
async buildMenu(user: UserDTO | null, hasPermission: boolean, isTechnician: boolean = false) {
|
|
||||||
this.dashboard = {
|
|
||||||
label: this.isSidebarOpen ? this.translateService.instant("sidebar.dashboard") : "",
|
|
||||||
icon: "pi pi-th-large",
|
|
||||||
routerLink: "dashboard"
|
|
||||||
};
|
|
||||||
this.serverDashboard = {
|
|
||||||
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.dashboard") : "",
|
|
||||||
icon: "pi pi-th-large",
|
|
||||||
routerLink: `server/${this.server?.id}`
|
|
||||||
};
|
|
||||||
this.serverProfile = {
|
|
||||||
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.profile") : "",
|
|
||||||
icon: "pi pi-id-card",
|
|
||||||
routerLink: `server/${this.server?.id}/members/${user?.id}`
|
|
||||||
};
|
|
||||||
this.serverMembers = {
|
|
||||||
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.members") : "",
|
|
||||||
icon: "pi pi-users",
|
|
||||||
visible: true,
|
|
||||||
routerLink: `server/${this.server?.id}/members`
|
|
||||||
};
|
|
||||||
|
|
||||||
this.serverAutoRoles = {
|
|
||||||
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.auto_roles") : "",
|
|
||||||
icon: "pi pi-sitemap",
|
|
||||||
visible: true,
|
|
||||||
routerLink: `server/${this.server?.id}/auto-roles`
|
|
||||||
};
|
|
||||||
|
|
||||||
this.serverLevels = {
|
|
||||||
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.levels") : "",
|
|
||||||
icon: "pi pi-book",
|
|
||||||
visible: true,
|
|
||||||
routerLink: `server/${this.server?.id}/levels`
|
|
||||||
};
|
|
||||||
|
|
||||||
this.serverAchievements = {
|
|
||||||
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.achievements") : "",
|
|
||||||
icon: "pi pi-angle-double-up",
|
|
||||||
visible: true,
|
|
||||||
routerLink: `server/${this.server?.id}/achievements`
|
|
||||||
};
|
|
||||||
|
|
||||||
this.serverShortRoleNames = {
|
|
||||||
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.short_role_names") : "",
|
|
||||||
icon: "pi pi-list",
|
|
||||||
visible: true,
|
|
||||||
routerLink: `server/${this.server?.id}/short-role-names`
|
|
||||||
};
|
|
||||||
|
|
||||||
this.serverConfig = {
|
|
||||||
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.configuration") : "",
|
|
||||||
icon: "pi pi-cog",
|
|
||||||
visible: true,
|
|
||||||
routerLink: `server/${this.server?.id}/config`
|
|
||||||
};
|
|
||||||
|
|
||||||
this.serverMenu = {
|
|
||||||
label: this.isSidebarOpen ? this.server?.name : "",
|
|
||||||
icon: "pi pi-server",
|
|
||||||
visible: false,
|
|
||||||
expanded: true,
|
|
||||||
items: [this.serverDashboard, this.serverProfile, this.serverMembers, this.serverAutoRoles, this.serverLevels, this.serverAchievements, this.serverShortRoleNames, this.serverConfig]
|
|
||||||
};
|
|
||||||
this.adminConfig = {
|
|
||||||
label: this.isSidebarOpen ? this.translateService.instant("sidebar.config") : "",
|
|
||||||
visible: hasPermission || isTechnician,
|
|
||||||
icon: "pi pi-cog",
|
|
||||||
routerLink: "/admin/settings"
|
|
||||||
};
|
|
||||||
this.adminUsers = {
|
|
||||||
label: this.isSidebarOpen ? this.translateService.instant("sidebar.auth_user_list") : "",
|
|
||||||
visible: hasPermission,
|
|
||||||
icon: "pi pi-user-edit",
|
|
||||||
routerLink: "/admin/users"
|
|
||||||
};
|
|
||||||
this.adminMenu = {
|
|
||||||
label: this.isSidebarOpen ? this.translateService.instant("sidebar.administration") : "",
|
|
||||||
icon: "pi pi-cog",
|
|
||||||
visible: hasPermission || isTechnician,
|
|
||||||
expanded: true,
|
|
||||||
items: [this.adminConfig, this.adminUsers]
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
setMenu(build: boolean = false) {
|
|
||||||
const server = this.server;
|
|
||||||
|
|
||||||
if (server) {
|
|
||||||
this.featureFlags = [];
|
|
||||||
this.data.query<PossibleFeatureFlagsQuery>("{possibleFeatureFlags}"
|
|
||||||
).subscribe(data => {
|
|
||||||
let observables: Observable<HasServerFeatureFlagQuery>[] = [];
|
|
||||||
data.possibleFeatureFlags.forEach(flag => {
|
|
||||||
observables.push(
|
|
||||||
this.data.query<HasServerFeatureFlagQuery>(Queries.hasServerFeatureFlag, {
|
|
||||||
filter: { id: server.id },
|
|
||||||
flag: flag
|
|
||||||
},
|
|
||||||
function(data: Query) {
|
|
||||||
return data.servers[0];
|
|
||||||
}
|
|
||||||
)
|
|
||||||
);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
forkJoin(observables).subscribe(data => {
|
this.translateService.onLangChange.subscribe(_ => {
|
||||||
data.forEach(flag => {
|
this.setMenu(true);
|
||||||
if (!flag.hasFeatureFlag.value) {
|
});
|
||||||
return;
|
|
||||||
|
this.serverService.server$.subscribe(server => {
|
||||||
|
this.server = server;
|
||||||
|
if (server) {
|
||||||
|
this.setMenu(true);
|
||||||
|
} else {
|
||||||
|
this.setMenu(false);
|
||||||
}
|
}
|
||||||
this.featureFlags.push(flag.hasFeatureFlag);
|
|
||||||
});
|
|
||||||
this._setMenu(build);
|
|
||||||
});
|
});
|
||||||
});
|
|
||||||
} else {
|
|
||||||
this._setMenu(build);
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
private _setMenu(build: boolean = false) {
|
async buildMenu(user: UserDTO | null, hasPermission: boolean, isTechnician: boolean = false) {
|
||||||
this.authService.hasUserPermission(AuthRoles.Admin).then(async hasPermission => {
|
this.dashboard = {
|
||||||
let authUser = await this.authService.getLoggedInUser();
|
label: this.isSidebarOpen ? this.translateService.instant("sidebar.dashboard") : "",
|
||||||
let user: UserDTO | null = authUser?.users?.find(u => u.server == this.server?.id) ?? null;
|
icon: "pi pi-th-large",
|
||||||
let isTechnician = (authUser?.users?.map(u => u.isTechnician).filter(u => u) ?? []).length > 0;
|
routerLink: "dashboard"
|
||||||
let isTechnicianAndFullAccessActive = this.hasFeature("TechnicianFullAccess") && isTechnician;
|
};
|
||||||
console.log(this.hasFeature("TechnicianFullAccess"))
|
this.serverDashboard = {
|
||||||
|
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.dashboard") : "",
|
||||||
|
icon: "pi pi-th-large",
|
||||||
|
routerLink: `server/${this.server?.id}`
|
||||||
|
};
|
||||||
|
this.serverProfile = {
|
||||||
|
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.profile") : "",
|
||||||
|
icon: "pi pi-id-card",
|
||||||
|
routerLink: `server/${this.server?.id}/members/${user?.id}`
|
||||||
|
};
|
||||||
|
this.serverMembers = {
|
||||||
|
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.members") : "",
|
||||||
|
icon: "pi pi-users",
|
||||||
|
visible: true,
|
||||||
|
routerLink: `server/${this.server?.id}/members`
|
||||||
|
};
|
||||||
|
|
||||||
if (build || this.menuItems$.value.length == 0) {
|
this.serverAutoRoles = {
|
||||||
await this.buildMenu(user, hasPermission, isTechnician);
|
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.auto_roles") : "",
|
||||||
}
|
icon: "pi pi-sitemap",
|
||||||
|
visible: true,
|
||||||
|
routerLink: `server/${this.server?.id}/auto-roles`
|
||||||
|
};
|
||||||
|
|
||||||
if (this.server) {
|
this.serverLevels = {
|
||||||
this.serverMenu.visible = true;
|
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.levels") : "",
|
||||||
this.serverMembers.visible = isTechnicianAndFullAccessActive || user?.isModerator;
|
icon: "pi pi-book",
|
||||||
this.serverAutoRoles.visible = isTechnicianAndFullAccessActive || this.hasFeature("AutoRoleModule") && user?.isModerator;
|
visible: true,
|
||||||
this.serverLevels.visible = isTechnicianAndFullAccessActive || this.hasFeature("LevelModule") && user?.isModerator;
|
routerLink: `server/${this.server?.id}/levels`
|
||||||
this.serverAchievements.visible = isTechnicianAndFullAccessActive || this.hasFeature("AchievementsModule") && user?.isModerator;
|
};
|
||||||
this.serverShortRoleNames.visible = isTechnicianAndFullAccessActive || this.hasFeature("ShortRoleName") && user?.isAdmin;
|
|
||||||
|
|
||||||
this.serverConfig.visible = isTechnicianAndFullAccessActive || user?.isAdmin;
|
this.serverAchievements = {
|
||||||
} else {
|
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.achievements") : "",
|
||||||
this.serverMenu.visible = false;
|
icon: "pi pi-angle-double-up",
|
||||||
}
|
visible: true,
|
||||||
|
routerLink: `server/${this.server?.id}/achievements`
|
||||||
|
};
|
||||||
|
|
||||||
let menuItems: MenuItem[] = [
|
this.serverShortRoleNames = {
|
||||||
this.dashboard,
|
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.short_role_names") : "",
|
||||||
this.serverMenu,
|
icon: "pi pi-list",
|
||||||
this.adminMenu
|
visible: true,
|
||||||
];
|
routerLink: `server/${this.server?.id}/short-role-names`
|
||||||
this.menuItems$.next(menuItems);
|
};
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public hasFeature(key: string): boolean {
|
this.serverConfig = {
|
||||||
const flag = this.featureFlags.filter(flag => flag.key == key);
|
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.configuration") : "",
|
||||||
if (flag.length == 0) {
|
icon: "pi pi-cog",
|
||||||
return false;
|
visible: true,
|
||||||
|
routerLink: `server/${this.server?.id}/config`
|
||||||
|
};
|
||||||
|
|
||||||
|
this.serverMenu = {
|
||||||
|
label: this.isSidebarOpen ? this.server?.name : "",
|
||||||
|
icon: "pi pi-server",
|
||||||
|
visible: false,
|
||||||
|
expanded: true,
|
||||||
|
items: [this.serverDashboard, this.serverProfile, this.serverMembers, this.serverAutoRoles, this.serverLevels, this.serverAchievements, this.serverShortRoleNames, this.serverConfig]
|
||||||
|
};
|
||||||
|
this.adminConfig = {
|
||||||
|
label: this.isSidebarOpen ? this.translateService.instant("sidebar.config") : "",
|
||||||
|
visible: hasPermission || isTechnician,
|
||||||
|
icon: "pi pi-cog",
|
||||||
|
routerLink: "/admin/settings"
|
||||||
|
};
|
||||||
|
this.adminUsers = {
|
||||||
|
label: this.isSidebarOpen ? this.translateService.instant("sidebar.auth_user_list") : "",
|
||||||
|
visible: hasPermission,
|
||||||
|
icon: "pi pi-user-edit",
|
||||||
|
routerLink: "/admin/users"
|
||||||
|
};
|
||||||
|
this.adminMenu = {
|
||||||
|
label: this.isSidebarOpen ? this.translateService.instant("sidebar.administration") : "",
|
||||||
|
icon: "pi pi-cog",
|
||||||
|
visible: hasPermission || isTechnician,
|
||||||
|
expanded: true,
|
||||||
|
items: [this.adminConfig, this.adminUsers]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
setMenu(build: boolean = false) {
|
||||||
|
const server = this.server;
|
||||||
|
|
||||||
|
if (server) {
|
||||||
|
this.featureFlags = [];
|
||||||
|
this.data.query<PossibleFeatureFlagsQuery>("{possibleFeatureFlags}"
|
||||||
|
).subscribe(data => {
|
||||||
|
let observables: Observable<HasServerFeatureFlagQuery>[] = [];
|
||||||
|
data.possibleFeatureFlags.forEach(flag => {
|
||||||
|
observables.push(
|
||||||
|
this.data.query<HasServerFeatureFlagQuery>(Queries.hasServerFeatureFlag, {
|
||||||
|
filter: { id: server.id },
|
||||||
|
flag: flag
|
||||||
|
},
|
||||||
|
function(data: Query) {
|
||||||
|
return data.servers[0];
|
||||||
|
}
|
||||||
|
)
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
forkJoin(observables).subscribe(data => {
|
||||||
|
data.forEach(flag => {
|
||||||
|
if (!flag.hasFeatureFlag.value) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.featureFlags.push(flag.hasFeatureFlag);
|
||||||
|
});
|
||||||
|
this._setMenu(build);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
this._setMenu(build);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private _setMenu(build: boolean = false) {
|
||||||
|
this.authService.hasUserPermission(AuthRoles.Admin).then(async hasPermission => {
|
||||||
|
let authUser = await this.authService.getLoggedInUser();
|
||||||
|
let user: UserDTO | null = authUser?.users?.find(u => u.server == this.server?.id) ?? null;
|
||||||
|
let isTechnician = authUser?.users?.map(u => u.isTechnician).filter(u => u) ?? [];
|
||||||
|
|
||||||
|
if (build || this.menuItems$.value.length == 0) {
|
||||||
|
await this.buildMenu(user, hasPermission, isTechnician.length > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.server) {
|
||||||
|
this.serverMenu.visible = true;
|
||||||
|
this.serverMembers.visible = !!user?.isModerator;
|
||||||
|
this.serverAutoRoles.visible = this.hasFeature("AutoRoleModule") ? !!user?.isModerator : false;
|
||||||
|
this.serverLevels.visible = this.hasFeature("LevelModule") ? !!user?.isModerator : false;
|
||||||
|
this.serverAchievements.visible = this.hasFeature("AchievementsModule") ? !!user?.isModerator : false;
|
||||||
|
this.serverShortRoleNames.visible = this.hasFeature("ShortRoleName") ? !!user?.isAdmin : false;
|
||||||
|
|
||||||
|
this.serverConfig.visible = !!user?.isAdmin || isTechnician.length > 0;
|
||||||
|
} else {
|
||||||
|
this.serverMenu.visible = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
let menuItems: MenuItem[] = [
|
||||||
|
this.dashboard,
|
||||||
|
this.serverMenu,
|
||||||
|
this.adminMenu
|
||||||
|
];
|
||||||
|
this.menuItems$.next(menuItems);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private hasFeature(key: string): boolean {
|
||||||
|
const flag = this.featureFlags.filter(flag => flag.key == key);
|
||||||
|
if (flag.length == 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return flag[0].value;
|
||||||
}
|
}
|
||||||
return flag[0].value;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,6 @@
|
|||||||
"WebVersion": {
|
"WebVersion": {
|
||||||
"Major": "1",
|
"Major": "1",
|
||||||
"Minor": "1",
|
"Minor": "1",
|
||||||
"Micro": "10"
|
"Micro": "9"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user