Compare commits

..

No commits in common. "46b5757fd167f5841479e87cfef38ca4115120a1" and "02e0c72a8071e57ea94b1438c2d9e70127ccd68f" have entirely different histories.

68 changed files with 70 additions and 669 deletions

@ -1 +1 @@
Subproject commit 20adf415f9f02792aa0a873fac77b308405e38a4
Subproject commit 359f9c38c3ec825a89f3bf289a65ec035cfcb693

View File

@ -31,10 +31,10 @@ class Program:
.use_extension(StartupDiscordExtension)
.use_extension(StartupModuleExtension)
.use_extension(StartupMigrationExtension)
.use_extension(DatabaseExtension)
.use_extension(ConfigExtension)
.use_extension(InitBotExtension)
.use_extension(BootLogExtension)
.use_extension(DatabaseExtension)
.use_extension(AppApiExtension)
.use_extension(CoreExtension)
.use_startup(Startup)

View File

@ -9,7 +9,6 @@ from bot_data.migration.api_key_migration import ApiKeyMigration
from bot_data.migration.api_migration import ApiMigration
from bot_data.migration.auto_role_fix1_migration import AutoRoleFix1Migration
from bot_data.migration.auto_role_migration import AutoRoleMigration
from bot_data.migration.config_feature_flags_migration import ConfigFeatureFlagsMigration
from bot_data.migration.config_migration import ConfigMigration
from bot_data.migration.db_history_migration import DBHistoryMigration
from bot_data.migration.initial_migration import InitialMigration
@ -47,4 +46,3 @@ class StartupMigrationExtension(StartupExtensionABC):
services.add_transient(MigrationABC, DBHistoryMigration) # 06.03.2023 #246 - 1.0.0
services.add_transient(MigrationABC, AchievementsMigration) # 14.06.2023 #268 - 1.1.0
services.add_transient(MigrationABC, ConfigMigration) # 19.07.2023 #127 - 1.1.0
services.add_transient(MigrationABC, ConfigFeatureFlagsMigration) # 15.08.2023 #334 - 1.1.0

View File

@ -5,17 +5,18 @@ class FeatureFlagsEnum(Enum):
# modules
achievements_module = "AchievementsModule"
api_module = "ApiModule"
admin_module = "AdminModule"
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"
permission_module = "PermissionModule"
config_module = "ConfigModule"
# features
api_only = "ApiOnly"
presence = "Presence"

View File

@ -8,7 +8,8 @@ class FeatureFlagsSettings(ConfigurationModelABC):
# 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.admin_module.value: False, # 02.10.2022 #48
FeatureFlagsEnum.auto_role_module.value: True, # 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
@ -33,17 +34,6 @@ class FeatureFlagsSettings(ConfigurationModelABC):
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

View File

@ -11,7 +11,6 @@ from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
from bot_core.events.core_on_ready_event import CoreOnReadyEvent
from bot_core.pipes.date_time_offset_pipe import DateTimeOffsetPipe
from bot_core.service.client_utils_service import ClientUtilsService
from bot_core.service.config_service import ConfigService
from bot_core.service.data_integrity_service import DataIntegrityService
from bot_core.service.message_service import MessageService
@ -24,7 +23,6 @@ class CoreModule(ModuleABC):
pass
def configure_services(self, services: ServiceCollectionABC, env: ApplicationEnvironmentABC):
services.add_transient(ConfigService)
services.add_transient(MessageServiceABC, MessageService)
services.add_transient(ClientUtilsABC, ClientUtilsService)
services.add_transient(DataIntegrityService)

View File

@ -1,30 +0,0 @@
from cpl_core.configuration import ConfigurationABC
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
class ConfigService:
def __init__(
self,
config: ConfigurationABC,
technician_config_repo: TechnicianConfigRepositoryABC,
server_config_repo: ServerConfigRepositoryABC,
):
self._config = config
self._technician_config_repo = technician_config_repo
self._server_config_repo = server_config_repo
def reload_technician_config(self):
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))
def reload_server_config(self, server: Server):
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
)

View File

@ -1,33 +0,0 @@
from bot_core.logging.database_logger import DatabaseLogger
from bot_data.abc.migration_abc import MigrationABC
from bot_data.db_context import DBContext
class ConfigFeatureFlagsMigration(MigrationABC):
name = "1.1.0_ConfigFeatureFlagsMigration"
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(
"""ALTER TABLE CFG_Technician ADD FeatureFlags JSON NULL DEFAULT JSON_OBJECT() AFTER CacheMaxMessages;"""
)
)
self._cursor.execute(
str(
"""ALTER TABLE CFG_Server ADD FeatureFlags JSON NULL DEFAULT JSON_OBJECT() AFTER LoginMessageChannelId;"""
)
)
def downgrade(self):
self._logger.debug(__name__, "Running downgrade")
self._cursor.execute("ALTER TABLE CFG_Technician DROP COLUMN FeatureFlags;")
self._cursor.execute("ALTER TABLE CFG_Server DROP COLUMN FeatureFlags;")

View File

@ -143,8 +143,6 @@ class ConfigMigration(MigrationABC):
def downgrade(self):
self._logger.debug(__name__, "Running downgrade")
self._server_downgrade()
self._technician_downgrade()
def _server_downgrade(self):
self._cursor.execute("DROP TABLE `CFG_Server`;")

View File

@ -1,11 +1,9 @@
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
from bot_data.model.server import Server
from bot_data.model.server_team_role_ids_config import ServerTeamRoleIdsConfig
@ -26,7 +24,6 @@ class ServerConfig(TableABC, ConfigurationModelABC):
help_voice_channel_id: int,
team_channel_id: int,
login_message_channel_id: int,
feature_flags: dict[FeatureFlagsEnum],
server: Server,
afk_channel_ids: List[int],
team_role_ids: List[ServerTeamRoleIdsConfig],
@ -48,7 +45,6 @@ class ServerConfig(TableABC, ConfigurationModelABC):
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._feature_flags = feature_flags
self._server = server
self._afk_channel_ids = afk_channel_ids
self._team_role_ids = team_role_ids
@ -165,14 +161,6 @@ class ServerConfig(TableABC, ConfigurationModelABC):
def login_message_channel_id(self, value: int):
self._login_message_channel_id = 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
@ -237,7 +225,6 @@ class ServerConfig(TableABC, ConfigurationModelABC):
`HelpVoiceChannelId`,
`TeamChannelId`,
`LoginMessageChannelId`,
`FeatureFlags`,
`ServerId`
) VALUES (
{self._message_delete_timer},
@ -253,7 +240,6 @@ class ServerConfig(TableABC, ConfigurationModelABC):
{self._help_voice_channel_id},
{self._team_channel_id},
{self._login_message_channel_id},
'{json.dumps(self._feature_flags)}',
{self._server.id}
);
"""
@ -277,7 +263,6 @@ class ServerConfig(TableABC, ConfigurationModelABC):
`HelpVoiceChannelId` = {self._help_voice_channel_id},
`TeamChannelId` = {self._team_channel_id},
`LoginMessageChannelId` = {self._login_message_channel_id},
`FeatureFlags` = '{json.dumps(self._feature_flags)}',
`ServerId` = {self._server.id}
WHERE `Id` = {self._id};
"""

View File

@ -17,7 +17,6 @@ class ServerConfigHistory(HistoryTableABC):
help_voice_channel_id: int,
team_channel_id: int,
login_message_channel_id: int,
feature_flags: dict[str],
server_id: int,
deleted: bool,
date_from: str,
@ -40,7 +39,6 @@ class ServerConfigHistory(HistoryTableABC):
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._feature_flags = feature_flags
self._server_id = server_id
self._deleted = deleted
@ -99,10 +97,6 @@ class ServerConfigHistory(HistoryTableABC):
def login_message_channel_id(self) -> int:
return self._login_message_channel_id
@property
def feature_flags(self) -> dict[str]:
return self._feature_flags
@property
def server_id(self) -> int:
return self._server_id

View File

@ -1,12 +1,9 @@
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__(
@ -15,7 +12,6 @@ class TechnicianConfig(TableABC, ConfigurationModelABC):
wait_for_restart: int,
wait_for_shutdown: int,
cache_max_messages: int,
feature_flags: dict[FeatureFlagsEnum],
technician_ids: List[int],
ping_urls: List[str],
created_at: datetime = None,
@ -27,7 +23,6 @@ class TechnicianConfig(TableABC, ConfigurationModelABC):
self._wait_for_restart = wait_for_restart
self._wait_for_shutdown = wait_for_shutdown
self._cache_max_messages = cache_max_messages
self._feature_flags = feature_flags
self._technician_ids = technician_ids
self._ping_urls = ping_urls
@ -71,14 +66,6 @@ class TechnicianConfig(TableABC, ConfigurationModelABC):
def cache_max_messages(self, value: int):
self._cache_max_messages = 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
@ -117,13 +104,12 @@ class TechnicianConfig(TableABC, ConfigurationModelABC):
return str(
f"""
INSERT INTO `CFG_Technician` (
`HelpCommandReferenceUrl`, `WaitForRestart`, `WaitForShutdown`, `CacheMaxMessages`, `FeatureFlags`
`HelpCommandReferenceUrl`, `WaitForRestart`, `WaitForShutdown`, `CacheMaxMessages`
) VALUES (
'{self._help_command_reference_url}',
{self._wait_for_restart},
{self._wait_for_shutdown},
{self._cache_max_messages},
'{json.dumps(self._feature_flags)}'
{self._cache_max_messages}
);
"""
)
@ -136,8 +122,7 @@ class TechnicianConfig(TableABC, ConfigurationModelABC):
SET `HelpCommandReferenceUrl` = '{self._help_command_reference_url}',
`WaitForRestart` = {self._wait_for_restart},
`WaitForShutdown` = {self._wait_for_shutdown},
`CacheMaxMessages` = {self._cache_max_messages},
`FeatureFlags` = '{json.dumps(self._feature_flags)}'
`CacheMaxMessages` = {self._cache_max_messages}
WHERE `Id` = {self._id};
"""
)

View File

@ -1,5 +1,3 @@
import json
from cpl_core.database.context import DatabaseContextABC
from cpl_query.extension import List
@ -64,12 +62,11 @@ class ServerConfigRepositoryService(ServerConfigRepositoryABC):
result[11],
result[12],
result[13],
json.loads(result[14]),
self._servers.get_server_by_id(result[15]),
self._get_afk_channel_ids(result[15]),
self._get_team_role_ids(result[15]),
self._servers.get_server_by_id(result[14]),
self._get_afk_channel_ids(result[14]),
self._get_team_role_ids(result[14]),
result[15],
result[16],
result[17],
id=result[0],
)

View File

@ -48,7 +48,6 @@ class ServerConfigSeeder(DataSeederABC):
guild.system_channel.id,
guild.system_channel.id,
guild.system_channel.id,
{},
server,
[],
[],

View File

@ -1,5 +1,3 @@
import json
from cpl_core.database.context import DatabaseContextABC
from cpl_query.extension import List
@ -43,11 +41,10 @@ class TechnicianConfigRepositoryService(TechnicianConfigRepositoryABC):
result[2],
result[3],
result[4],
json.loads(result[5]),
self._get_technician_ids(),
self._get_technician_ping_urls(),
result[5],
result[6],
result[7],
id=result[0],
)

View File

@ -32,7 +32,6 @@ class TechnicianConfigSeeder(DataSeederABC):
8,
8,
1000000,
{},
List(int, [240160344557879316]),
List(str, ["www.google.com", "www.sh-edraft.de", "www.keksdose-gaming.de"]),
)

View File

@ -9,7 +9,6 @@ from cpl_query.extension import List
from bot_api.exception.service_error_code_enum import ServiceErrorCode
from bot_api.exception.service_exception import ServiceException
from bot_api.route.route import Route
from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
from bot_data.model.auth_role_enum import AuthRoleEnum
from bot_data.model.auth_user import AuthUser
from bot_data.model.auto_role import AutoRole
@ -18,7 +17,6 @@ from bot_data.model.client import Client
from bot_data.model.known_user import KnownUser
from bot_data.model.level import Level
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_game_server import UserJoinedGameServer
from bot_data.model.user_joined_server import UserJoinedServer
@ -68,12 +66,8 @@ class QueryABC(ObjectType):
self.set_field(f"{name}s", wrapper)
self.set_field(f"{name}Count", lambda *args: wrapper(*args).count())
def _can_user_see_element(self, user: AuthUser, element: T) -> bool:
@ServiceProviderABC.inject
def get_services(services: ServiceProviderABC) -> ServiceProviderABC:
return services
services = get_services()
@ServiceProviderABC.inject
def _can_user_see_element(self, user: AuthUser, element: T, services: ServiceProviderABC) -> bool:
permissions: PermissionService = services.get_service(PermissionService)
bot: DiscordBotServiceABC = services.get_service(DiscordBotServiceABC)
@ -164,24 +158,6 @@ class QueryABC(ObjectType):
access = True
break
elif type(element) == ServerConfig:
for u in user.users:
u: User = u
guild = bot.get_guild(u.server.discord_id)
member = guild.get_member(u.discord_id)
if permissions.is_member_technician(member):
access = True
break
elif type(element) == dict and "key" in element and element["key"] in [e.value for e in FeatureFlagsEnum]:
for u in user.users:
u: User = u
guild = bot.get_guild(u.server.discord_id)
member = guild.get_member(u.discord_id)
if permissions.is_member_technician(member):
access = True
break
return access
@ServiceProviderABC.inject

View File

@ -1,9 +0,0 @@
type FeatureFlag {
key: String
value: Boolean
}
input FeatureFlagInput {
key: String
value: Boolean
}

View File

@ -40,5 +40,4 @@ type Query {
technicianConfig: TechnicianConfig
guilds(filter: GuildFilter): [Guild]
possibleFeatureFlags: [String]
}

View File

@ -13,8 +13,6 @@ type ServerConfig implements TableWithHistoryQuery {
helpVoiceChannelId: String
teamChannelId: String
loginMessageChannelId: String
featureFlagCount: Int
featureFlags: [FeatureFlag]
afkChannelIds: [String]
moderatorRoleIds: [String]
@ -43,8 +41,6 @@ type ServerConfigHistory implements HistoryTableQuery {
helpVoiceChannelId: String
teamChannelId: String
loginMessageChannelId: String
featureFlagCount: Int
featureFlags: [FeatureFlag]
serverId: ID
@ -91,7 +87,6 @@ input ServerConfigInput {
helpVoiceChannelId: String
teamChannelId: String
loginMessageChannelId: String
featureFlags: [FeatureFlagInput]
afkChannelIds: [String]
moderatorRoleIds: [String]

View File

@ -4,8 +4,6 @@ type TechnicianConfig implements TableWithHistoryQuery {
waitForRestart: Int
waitForShutdown: Int
cacheMaxMessages: Int
featureFlagCount: Int
featureFlags: [FeatureFlag]
pingURLs: [String]
technicianIds: [String]
@ -23,8 +21,6 @@ type TechnicianConfigHistory implements HistoryTableQuery {
waitForRestart: Int
waitForShutdown: Int
cacheMaxMessages: Int
featureFlagCount: Int
featureFlags: [FeatureFlag]
deleted: Boolean
dateFrom: String
@ -59,7 +55,6 @@ input TechnicianConfigInput {
waitForRestart: Int
waitForShutdown: Int
cacheMaxMessages: Int
featureFlags: [FeatureFlagInput]
pingURLs: [String]
technicianIds: [String]
}

View File

@ -3,8 +3,6 @@ from cpl_discord.service import DiscordBotServiceABC
from cpl_query.extension import List
from bot_api.logging.api_logger import ApiLogger
from bot_api.route.route import Route
from bot_core.service.config_service import ConfigService
from bot_data.abc.server_config_repository_abc import ServerConfigRepositoryABC
from bot_data.abc.server_repository_abc import ServerRepositoryABC
from bot_data.model.server_afk_channel_ids_config import ServerAFKChannelIdsConfig
@ -13,7 +11,6 @@ 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.user_role_enum import UserRoleEnum
from bot_graphql.abc.query_abc import QueryABC
from modules.permission.abc.permission_service_abc import PermissionServiceABC
class ServerConfigMutation(QueryABC):
@ -24,8 +21,6 @@ class ServerConfigMutation(QueryABC):
servers: ServerRepositoryABC,
server_configs: ServerConfigRepositoryABC,
db: DatabaseContextABC,
config_service: ConfigService,
permissions: PermissionServiceABC,
):
QueryABC.__init__(self, "ServerConfigMutation")
@ -34,8 +29,6 @@ class ServerConfigMutation(QueryABC):
self._servers = servers
self._server_configs = server_configs
self._db = db
self._config_service = config_service
self._permissions = permissions
self.set_field("updateServerConfig", self.resolve_update_server_config)
@ -44,7 +37,7 @@ class ServerConfigMutation(QueryABC):
raise ValueError("Id not set")
server_config = self._server_configs.get_server_config_by_server(input["id"])
self._can_user_mutate_data(Route.get_user().users[0].server, UserRoleEnum.technician)
self._can_user_mutate_data(server_config, UserRoleEnum.admin)
server_config.message_delete_timer = (
input["messageDeleteTimer"] if "messageDeleteTimer" in input else server_config.message_delete_timer
@ -89,11 +82,6 @@ class ServerConfigMutation(QueryABC):
if "loginMessageChannelId" in input
else server_config.login_message_channel_id
)
server_config.feature_flags = (
dict(zip([x["key"] for x in input["featureFlags"]], [x["value"] for x in input["featureFlags"]]))
if "featureFlags" in input
else server_config.feature_flags
)
server_config.afk_channel_ids = (
List(int).extend([int(x) for x in input["afkChannelIds"]])
if "afkChannelIds" in input
@ -173,6 +161,3 @@ class ServerConfigMutation(QueryABC):
continue
self._server_configs.add_server_team_role_id_config(role_id)
self._config_service.reload_server_config(new_config.server)
self._permissions.on_ready()

View File

@ -3,8 +3,6 @@ from cpl_discord.service import DiscordBotServiceABC
from cpl_query.extension import List
from bot_api.logging.api_logger import ApiLogger
from bot_api.route.route import Route
from bot_core.service.config_service import ConfigService
from bot_data.abc.server_repository_abc import ServerRepositoryABC
from bot_data.abc.technician_config_repository_abc import TechnicianConfigRepositoryABC
from bot_data.model.technician_config import TechnicianConfig
@ -12,7 +10,6 @@ from bot_data.model.technician_id_config import TechnicianIdConfig
from bot_data.model.technician_ping_url_config import TechnicianPingUrlConfig
from bot_data.model.user_role_enum import UserRoleEnum
from bot_graphql.abc.query_abc import QueryABC
from modules.permission.abc.permission_service_abc import PermissionServiceABC
class TechnicianConfigMutation(QueryABC):
@ -23,8 +20,6 @@ class TechnicianConfigMutation(QueryABC):
servers: ServerRepositoryABC,
technician_configs: TechnicianConfigRepositoryABC,
db: DatabaseContextABC,
permissions: PermissionServiceABC,
config_service: ConfigService,
):
QueryABC.__init__(self, "TechnicianConfigMutation")
@ -33,14 +28,12 @@ class TechnicianConfigMutation(QueryABC):
self._servers = servers
self._technician_configs = technician_configs
self._db = db
self._permissions = permissions
self._config_service = config_service
self.set_field("updateTechnicianConfig", self.resolve_update_technician_config)
def resolve_update_technician_config(self, *_, input: dict):
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(technician_config, UserRoleEnum.admin)
technician_config.help_command_reference_url = (
input["helpCommandReferenceUrl"]
@ -56,11 +49,6 @@ class TechnicianConfigMutation(QueryABC):
technician_config.cache_max_messages = (
input["cacheMaxMessages"] if "cacheMaxMessages" in input else technician_config.cache_max_messages
)
technician_config.feature_flags = (
dict(zip([x["key"] for x in input["featureFlags"]], [x["value"] for x in input["featureFlags"]]))
if "featureFlags" in input
else technician_config.feature_flags
)
technician_config.ping_urls = (
List(str, input["pingURLs"]) if "pingURLs" in input else technician_config.ping_urls
)
@ -112,6 +100,3 @@ class TechnicianConfigMutation(QueryABC):
continue
self._technician_configs.add_technician_id_config(TechnicianIdConfig(technician_id))
self._config_service.reload_technician_config()
self._permissions.on_ready()

View File

@ -1,5 +1,4 @@
from cpl_core.database.context import DatabaseContextABC
from cpl_query.extension import List
from bot_data.model.server_config_history import ServerConfigHistory
from bot_data.model.team_member_type_enum import TeamMemberTypeEnum
@ -24,10 +23,6 @@ class ServerConfigQuery(DataQueryWithHistoryABC):
self.set_field("helpVoiceChannelId", lambda config, *_: config.help_voice_channel_id)
self.set_field("teamChannelId", lambda config, *_: config.team_channel_id)
self.set_field("loginMessageChannelId", lambda config, *_: config.login_message_channel_id)
self.add_collection(
"featureFlag",
lambda config, *_: List(any, [{"key": x, "value": config.feature_flags[x]} for x in config.feature_flags]),
)
self.set_field("afkChannelIds", lambda config, *_: config.afk_channel_ids)
self.set_field(
"moderatorRoleIds",

View File

@ -1,5 +1,3 @@
from cpl_query.extension import List
from bot_graphql.abc.history_query_abc import HistoryQueryABC
@ -11,7 +9,3 @@ class TechnicianConfigHistoryQuery(HistoryQueryABC):
self.set_field("waitForRestart", lambda config, *_: config.wait_for_restart)
self.set_field("waitForShutdown", lambda config, *_: config.wait_for_shutdown)
self.set_field("cacheMaxMessages", lambda config, *_: config.cache_max_messages)
self.add_collection(
"featureFlag",
lambda config, *_: List(any, [{"key": x, "value": config.feature_flags[x]} for x in config.feature_flags]),
)

View File

@ -16,10 +16,6 @@ class TechnicianConfigQuery(DataQueryWithHistoryABC):
self.set_field("waitForRestart", lambda config, *_: config.wait_for_restart)
self.set_field("waitForShutdown", lambda config, *_: config.wait_for_shutdown)
self.set_field("cacheMaxMessages", lambda config, *_: config.cache_max_messages)
self.add_collection(
"featureFlag",
lambda config, *_: List(any, [{"key": x, "value": config.feature_flags[x]} for x in config.feature_flags]),
)
self.set_field("pingURLs", lambda config, *_: config.ping_urls)
self.set_field("technicianIds", lambda config, *_: config.technician_ids)

View File

@ -1,6 +1,5 @@
from cpl_discord.service import DiscordBotServiceABC
from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
from bot_data.abc.achievement_repository_abc import AchievementRepositoryABC
from bot_data.abc.auto_role_repository_abc import AutoRoleRepositoryABC
from bot_data.abc.client_repository_abc import ClientRepositoryABC
@ -76,7 +75,6 @@ class Query(QueryABC):
self.set_field("guilds", self._resolve_guilds)
self.set_field("achievementAttributes", lambda x, *_: achievement_service.get_attributes())
self.set_field("achievementOperators", lambda x, *_: achievement_service.get_operators())
self.set_field("possibleFeatureFlags", lambda x, *_: [e.value for e in FeatureFlagsEnum])
def _resolve_guilds(self, *_, filter=None):
if filter is None or "id" not in filter:

View File

@ -14,7 +14,7 @@ from modules.achievements.events.achievement_on_message_event import Achievement
class AchievementsModule(ModuleABC):
def __init__(self, dc: DiscordCollectionABC):
ModuleABC.__init__(self, dc, FeatureFlagsEnum.achievements_module)
ModuleABC.__init__(self, dc, FeatureFlagsEnum.auto_role_module)
def configure_configuration(self, config: ConfigurationABC, env: ApplicationEnvironmentABC):
pass

View File

@ -1,5 +1,4 @@
import discord
from cpl_core.configuration import ConfigurationABC
from cpl_discord.command import DiscordCommandABC
from cpl_discord.service import DiscordBotServiceABC
from cpl_translation import TranslatePipe
@ -7,20 +6,16 @@ from discord.ext import commands
from discord.ext.commands import Context
from bot_core.abc.message_service_abc import MessageServiceABC
from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
from bot_core.configuration.feature_flags_settings import FeatureFlagsSettings
from bot_core.helper.command_checks import CommandChecks
from bot_core.logging.command_logger import CommandLogger
from bot_data.abc.server_repository_abc import ServerRepositoryABC
from bot_data.abc.user_repository_abc import UserRepositoryABC
from bot_data.model.server_config import ServerConfig
from modules.achievements.achievement_service import AchievementService
class AchievementGroup(DiscordCommandABC):
def __init__(
self,
config: ConfigurationABC,
logger: CommandLogger,
message_service: MessageServiceABC,
bot: DiscordBotServiceABC,
@ -31,7 +26,6 @@ class AchievementGroup(DiscordCommandABC):
):
DiscordCommandABC.__init__(self)
self._config = config
self._logger = logger
self._message_service = message_service
self._bot = bot
@ -51,14 +45,6 @@ class AchievementGroup(DiscordCommandABC):
@CommandChecks.check_is_member_moderator()
async def check(self, ctx: Context, member: discord.Member):
self._logger.debug(__name__, f"Received command achievement check {ctx}")
if ctx.guild is None:
return
server_config: ServerConfig = self._config.get_configuration(f"ServerConfig_{ctx.guild.id}")
if not FeatureFlagsSettings.get_flag_from_dict(
server_config.feature_flags, FeatureFlagsEnum.achievements_module
):
return
server = self._servers.get_server_by_discord_id(member.guild.id)
user = self._users.get_user_by_discord_id_and_server_id(member.id, server.id)

View File

@ -1,23 +1,18 @@
import discord
from cpl_core.configuration import ConfigurationABC
from cpl_core.database.context import DatabaseContextABC
from cpl_core.logging import LoggerABC
from cpl_discord.events import OnMessageABC
from cpl_discord.service import DiscordBotServiceABC
from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
from bot_core.configuration.feature_flags_settings import FeatureFlagsSettings
from bot_core.helper.event_checks import EventChecks
from bot_data.abc.server_repository_abc import ServerRepositoryABC
from bot_data.abc.user_repository_abc import UserRepositoryABC
from bot_data.model.server_config import ServerConfig
from modules.achievements.achievement_service import AchievementService
class AchievementOnMessageEvent(OnMessageABC):
def __init__(
self,
config: ConfigurationABC,
logger: LoggerABC,
bot: DiscordBotServiceABC,
achievements: AchievementService,
@ -27,7 +22,6 @@ class AchievementOnMessageEvent(OnMessageABC):
):
OnMessageABC.__init__(self)
self._config = config
self._logger = logger
self._bot = bot
self._achievements = achievements
@ -37,18 +31,9 @@ class AchievementOnMessageEvent(OnMessageABC):
@EventChecks.check_is_ready()
async def on_message(self, message: discord.Message):
if message.guild is None:
return
if message.author.bot:
return
server_config: ServerConfig = self._config.get_configuration(f"ServerConfig_{message.guild.id}")
if not FeatureFlagsSettings.get_flag_from_dict(
server_config.feature_flags, FeatureFlagsEnum.achievements_module
):
return
server = self._servers.get_server_by_discord_id(message.guild.id)
user = self._users.get_user_by_discord_id_and_server_id(message.author.id, server.id)

View File

@ -1,7 +1,6 @@
from typing import List as TList
import discord
from cpl_core.configuration import ConfigurationABC
from cpl_core.database.context import DatabaseContextABC
from cpl_discord.command import DiscordCommandABC
from cpl_discord.service import DiscordBotServiceABC
@ -13,22 +12,18 @@ from discord.ext.commands import Context
from bot_core.abc.client_utils_abc import ClientUtilsABC
from bot_core.abc.message_service_abc import MessageServiceABC
from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
from bot_core.configuration.feature_flags_settings import FeatureFlagsSettings
from bot_core.helper.command_checks import CommandChecks
from bot_core.logging.command_logger import CommandLogger
from bot_data.abc.auto_role_repository_abc import AutoRoleRepositoryABC
from bot_data.abc.server_repository_abc import ServerRepositoryABC
from bot_data.model.auto_role import AutoRole
from bot_data.model.auto_role_rule import AutoRoleRule
from bot_data.model.server_config import ServerConfig
from modules.permission.abc.permission_service_abc import PermissionServiceABC
class AutoRoleGroup(DiscordCommandABC):
def __init__(
self,
config: ConfigurationABC,
logger: CommandLogger,
message_service: MessageServiceABC,
bot: DiscordBotServiceABC,
@ -41,7 +36,6 @@ class AutoRoleGroup(DiscordCommandABC):
):
DiscordCommandABC.__init__(self)
self._config = config
self._logger = logger
self._message_service = message_service
self._bot = bot
@ -75,11 +69,8 @@ class AutoRoleGroup(DiscordCommandABC):
@CommandChecks.check_is_member_moderator()
async def list(self, ctx: Context, wait: int = None):
self._logger.debug(__name__, f"Received command auto-role list {ctx}")
if ctx.guild is None:
return
server_config: ServerConfig = self._config.get_configuration(f"ServerConfig_{ctx.guild_id}")
if not FeatureFlagsSettings.get_flag_from_dict(server_config.feature_flags, FeatureFlagsEnum.auto_role_module):
if ctx.guild is None:
return
embed = discord.Embed(
@ -119,12 +110,6 @@ class AutoRoleGroup(DiscordCommandABC):
@CommandChecks.check_is_member_moderator()
async def add(self, ctx: Context, channel: discord.TextChannel, message_id: str):
self._logger.debug(__name__, f"Received command auto-role add {ctx} {message_id}")
if ctx.guild is None:
return
server_config: ServerConfig = self._config.get_configuration(f"ServerConfig_{ctx.guild_id}")
if not FeatureFlagsSettings.get_flag_from_dict(server_config.feature_flags, FeatureFlagsEnum.auto_role_module):
return
message = (
List(
@ -185,12 +170,6 @@ class AutoRoleGroup(DiscordCommandABC):
@CommandChecks.check_is_member_moderator()
async def remove(self, ctx: Context, auto_role: int):
self._logger.debug(__name__, f"Received command auto-role remove {ctx} {auto_role}")
if ctx.guild is None:
return
server_config: ServerConfig = self._config.get_configuration(f"ServerConfig_{ctx.guild_id}")
if not FeatureFlagsSettings.get_flag_from_dict(server_config.feature_flags, FeatureFlagsEnum.auto_role_module):
return
auto_role_from_db = self._auto_roles.find_auto_role_by_id(auto_role)
if auto_role_from_db is None:
@ -231,12 +210,6 @@ class AutoRoleGroup(DiscordCommandABC):
@CommandChecks.check_is_member_moderator()
async def list(self, ctx: Context, auto_role: int, wait: int = None):
self._logger.debug(__name__, f"Received command auto-role rule list {ctx}")
if ctx.guild is None:
return
server_config: ServerConfig = self._config.get_configuration(f"ServerConfig_{ctx.guild_id}")
if not FeatureFlagsSettings.get_flag_from_dict(server_config.feature_flags, FeatureFlagsEnum.auto_role_module):
return
embed = discord.Embed(
title=self._t.transform("modules.auto_role.list.title"),
@ -289,12 +262,6 @@ class AutoRoleGroup(DiscordCommandABC):
@CommandChecks.check_is_member_moderator()
async def add(self, ctx: Context, auto_role: int, emoji_name: str, role_id: str):
self._logger.debug(__name__, f"Received command auto-role add {ctx} {auto_role}")
if ctx.guild is None:
return
server_config: ServerConfig = self._config.get_configuration(f"ServerConfig_{ctx.guild_id}")
if not FeatureFlagsSettings.get_flag_from_dict(server_config.feature_flags, FeatureFlagsEnum.auto_role_module):
return
emoji = discord.utils.get(self._bot.emojis, name=emoji_name)
if emoji is None:
@ -387,12 +354,6 @@ class AutoRoleGroup(DiscordCommandABC):
@CommandChecks.check_is_member_moderator()
async def remove(self, ctx: Context, auto_role_rule: int):
self._logger.debug(__name__, f"Received command auto-role remove {ctx} {auto_role_rule}")
if ctx.guild is None:
return
server_config: ServerConfig = self._config.get_configuration(f"ServerConfig_{ctx.guild_id}")
if not FeatureFlagsSettings.get_flag_from_dict(server_config.feature_flags, FeatureFlagsEnum.auto_role_module):
return
auto_role_from_db = self._auto_roles.get_auto_role_rule_by_id(auto_role_rule)
if auto_role_from_db is None:

View File

@ -1,22 +1,17 @@
from cpl_core.configuration import ConfigurationABC
from cpl_core.logging import LoggerABC
from cpl_discord.events.on_raw_reaction_add_abc import OnRawReactionAddABC
from cpl_discord.service import DiscordBotServiceABC
from discord import RawReactionActionEvent
from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
from bot_core.configuration.feature_flags_settings import FeatureFlagsSettings
from bot_core.helper.event_checks import EventChecks
from bot_data.abc.auto_role_repository_abc import AutoRoleRepositoryABC
from bot_data.abc.server_repository_abc import ServerRepositoryABC
from bot_data.model.server_config import ServerConfig
from modules.auto_role.helper.auto_role_reaction_handler import AutoRoleReactionHandler
class AutoRoleOnRawReactionAddEvent(OnRawReactionAddABC):
def __init__(
self,
config: ConfigurationABC,
logger: LoggerABC,
bot: DiscordBotServiceABC,
servers: ServerRepositoryABC,
@ -25,7 +20,6 @@ class AutoRoleOnRawReactionAddEvent(OnRawReactionAddABC):
):
OnRawReactionAddABC.__init__(self)
self._config = config
self._logger = logger
self._bot = bot
self._servers = servers
@ -35,9 +29,6 @@ class AutoRoleOnRawReactionAddEvent(OnRawReactionAddABC):
@EventChecks.check_is_ready()
async def on_raw_reaction_add(self, payload: RawReactionActionEvent):
self._logger.debug(__name__, f"Module {type(self)} started")
server_config: ServerConfig = self._config.get_configuration(f"ServerConfig_{payload.guild_id}")
if not FeatureFlagsSettings.get_flag_from_dict(server_config.feature_flags, FeatureFlagsEnum.auto_role_module):
return
await self._reaction_handler.handle(payload, "add")

View File

@ -1,22 +1,17 @@
from cpl_core.configuration import ConfigurationABC
from cpl_core.logging import LoggerABC
from cpl_discord.events.on_raw_reaction_remove_abc import OnRawReactionRemoveABC
from cpl_discord.service import DiscordBotServiceABC
from discord import RawReactionActionEvent
from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
from bot_core.configuration.feature_flags_settings import FeatureFlagsSettings
from bot_core.helper.event_checks import EventChecks
from bot_data.abc.auto_role_repository_abc import AutoRoleRepositoryABC
from bot_data.abc.server_repository_abc import ServerRepositoryABC
from bot_data.model.server_config import ServerConfig
from modules.auto_role.helper.auto_role_reaction_handler import AutoRoleReactionHandler
class AutoRoleOnRawReactionRemoveEvent(OnRawReactionRemoveABC):
def __init__(
self,
config: ConfigurationABC,
logger: LoggerABC,
bot: DiscordBotServiceABC,
servers: ServerRepositoryABC,
@ -25,7 +20,6 @@ class AutoRoleOnRawReactionRemoveEvent(OnRawReactionRemoveABC):
):
OnRawReactionRemoveABC.__init__(self)
self._config = config
self._logger = logger
self._bot = bot
self._servers = servers
@ -35,9 +29,6 @@ class AutoRoleOnRawReactionRemoveEvent(OnRawReactionRemoveABC):
@EventChecks.check_is_ready()
async def on_raw_reaction_remove(self, payload: RawReactionActionEvent):
self._logger.debug(__name__, f"Module {type(self)} started")
server_config: ServerConfig = self._config.get_configuration(f"ServerConfig_{payload.guild_id}")
if not FeatureFlagsSettings.get_flag_from_dict(server_config.feature_flags, FeatureFlagsEnum.auto_role_module):
return
await self._reaction_handler.handle(payload, "remove")

View File

@ -1,7 +1,6 @@
from typing import Optional
import discord
from cpl_core.configuration import ConfigurationABC
from cpl_core.database.context import DatabaseContextABC
from cpl_core.time import TimeFormatSettings
from cpl_discord.events import OnCommandABC
@ -14,14 +13,12 @@ from bot_core.logging.command_logger import CommandLogger
from bot_data.abc.client_repository_abc import ClientRepositoryABC
from bot_data.abc.server_repository_abc import ServerRepositoryABC
from bot_data.abc.user_repository_abc import UserRepositoryABC
from bot_data.model.server_config import ServerConfig
from bot_data.model.user import User
class BaseOnCommandEvent(OnCommandABC):
def __init__(
self,
config: ConfigurationABC,
logger: CommandLogger,
bot: DiscordBotServiceABC,
messenger: MessageServiceABC,
@ -33,7 +30,6 @@ class BaseOnCommandEvent(OnCommandABC):
servers: ServerRepositoryABC,
):
OnCommandABC.__init__(self)
self._config = config
self._logger = logger
self._bot = bot
self._messenger = messenger

View File

@ -1,7 +1,6 @@
from typing import Optional
import discord
from cpl_core.configuration import ConfigurationABC
from cpl_core.database.context import DatabaseContextABC
from cpl_discord.events import OnMessageDeleteABC
from cpl_discord.service import DiscordBotServiceABC
@ -11,14 +10,12 @@ from bot_core.logging.message_logger import MessageLogger
from bot_data.abc.client_repository_abc import ClientRepositoryABC
from bot_data.abc.server_repository_abc import ServerRepositoryABC
from bot_data.abc.user_repository_abc import UserRepositoryABC
from bot_data.model.server_config import ServerConfig
from bot_data.model.user import User
class BaseOnMessageDeleteEvent(OnMessageDeleteABC):
def __init__(
self,
config: ConfigurationABC,
logger: MessageLogger,
db: DatabaseContextABC,
bot: DiscordBotServiceABC,
@ -27,7 +24,6 @@ class BaseOnMessageDeleteEvent(OnMessageDeleteABC):
servers: ServerRepositoryABC,
):
OnMessageDeleteABC.__init__(self)
self._config = config
self._logger = logger
self._db = db
self._bot = bot

View File

@ -8,8 +8,6 @@ from cpl_translation import TranslatePipe
from discord import guild
from bot_core.abc.message_service_abc import MessageServiceABC
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
@ -62,11 +60,6 @@ class BootLogOnReadyEvent(OnReadyABC):
self._logger.error(__name__, f"Config {type(self).__name__}_{g.id} not found!")
return
if not FeatureFlagsSettings.get_flag_from_dict(
server_config.feature_flags, FeatureFlagsEnum.boot_log_module
):
continue
self._bot.loop.create_task(
self._message_service.send_channel_message(
self._bot.get_channel(server_config.login_message_channel_id),

View File

@ -5,7 +5,8 @@ from cpl_core.logging import LoggerABC
from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
from bot_core.configuration.feature_flags_settings import FeatureFlagsSettings
from bot_core.service.config_service import ConfigService
from bot_data.abc.technician_config_repository_abc import TechnicianConfigRepositoryABC
from bot_data.model.technician_config import TechnicianConfig
class ConfigExtension(ApplicationExtensionABC):
@ -18,5 +19,6 @@ class ConfigExtension(ApplicationExtensionABC):
return
logger: LoggerABC = services.get_service(LoggerABC)
logger.debug(__name__, "Config extension started")
config: ConfigService = services.get_service(ConfigService)
config.reload_technician_config()
technician_config_repo: TechnicianConfigRepositoryABC = services.get_service(TechnicianConfigRepositoryABC)
technician_config = technician_config_repo.get_technician_config()
config.add_configuration(TechnicianConfig, technician_config)

View File

@ -1,9 +1,10 @@
from cpl_core.configuration import ConfigurationABC
from cpl_core.logging import LoggerABC
from cpl_discord.container import Guild
from cpl_discord.events import OnReadyABC
from cpl_discord.service import DiscordBotServiceABC
from bot_core.service.config_service import ConfigService
from bot_data.abc.server_config_repository_abc import ServerConfigRepositoryABC
from bot_data.abc.server_repository_abc import ServerRepositoryABC
@ -14,7 +15,7 @@ class ConfigOnReadyEvent(OnReadyABC):
logger: LoggerABC,
bot: DiscordBotServiceABC,
servers: ServerRepositoryABC,
config_service: ConfigService,
server_config_repo: ServerConfigRepositoryABC,
):
OnReadyABC.__init__(self)
@ -22,8 +23,13 @@ class ConfigOnReadyEvent(OnReadyABC):
self._logger = logger
self._bot = bot
self._servers = servers
self._config_service = config_service
self._server_config_repo = server_config_repo
async def on_ready(self):
for guild in self._bot.guilds:
self._config_service.reload_server_config(self._servers.get_server_by_discord_id(guild.id))
guild: Guild = guild
server = self._servers.get_server_by_discord_id(guild.id)
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
)

View File

@ -1,7 +1,6 @@
from typing import List as TList
import discord
from cpl_core.configuration import ConfigurationABC
from cpl_core.database.context import DatabaseContextABC
from cpl_discord.command import DiscordCommandABC
from cpl_discord.container import Guild, Role
@ -13,15 +12,12 @@ from discord.ext.commands import Context
from bot_core.abc.client_utils_abc import ClientUtilsABC
from bot_core.abc.message_service_abc import MessageServiceABC
from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
from bot_core.configuration.feature_flags_settings import FeatureFlagsSettings
from bot_core.helper.command_checks import CommandChecks
from bot_core.logging.command_logger import CommandLogger
from bot_data.abc.level_repository_abc import LevelRepositoryABC
from bot_data.abc.server_repository_abc import ServerRepositoryABC
from bot_data.abc.user_repository_abc import UserRepositoryABC
from bot_data.model.level import Level
from bot_data.model.server_config import ServerConfig
from modules.level.level_seeder import LevelSeeder
from modules.level.service.level_service import LevelService
from modules.permission.abc.permission_service_abc import PermissionServiceABC
@ -30,7 +26,6 @@ from modules.permission.abc.permission_service_abc import PermissionServiceABC
class LevelGroup(DiscordCommandABC):
def __init__(
self,
config: ConfigurationABC,
logger: CommandLogger,
message_service: MessageServiceABC,
bot: DiscordBotServiceABC,
@ -46,7 +41,6 @@ class LevelGroup(DiscordCommandABC):
):
DiscordCommandABC.__init__(self)
self._config = config
self._logger = logger
self._message_service = message_service
self._bot = bot
@ -131,11 +125,8 @@ class LevelGroup(DiscordCommandABC):
@CommandChecks.check_is_member_moderator()
async def list(self, ctx: Context, wait: int = None):
self._logger.debug(__name__, f"Received command level list {ctx}")
if ctx.guild is None:
return
server_config: ServerConfig = self._config.get_configuration(f"ServerConfig_{ctx.guild.id}")
if not FeatureFlagsSettings.get_flag_from_dict(server_config.feature_flags, FeatureFlagsEnum.level_module):
if ctx.guild is None:
return
server = self._servers.get_server_by_discord_id(ctx.guild.id)
@ -178,12 +169,6 @@ class LevelGroup(DiscordCommandABC):
@CommandChecks.check_is_member_admin()
async def create(self, ctx: Context, name: str, color: str, min_xp: int, permissions: int):
self._logger.debug(__name__, f"Received command level create {ctx}")
if ctx.guild is None:
return
server_config: ServerConfig = self._config.get_configuration(f"ServerConfig_{ctx.guild.id}")
if not FeatureFlagsSettings.get_flag_from_dict(server_config.feature_flags, FeatureFlagsEnum.level_module):
return
try:
color = hex(discord.Colour.from_str(color).value)
@ -273,12 +258,6 @@ class LevelGroup(DiscordCommandABC):
permissions: int = None,
):
self._logger.debug(__name__, f"Received command level edit {ctx}")
if ctx.guild is None:
return
server_config: ServerConfig = self._config.get_configuration(f"ServerConfig_{ctx.guild.id}")
if not FeatureFlagsSettings.get_flag_from_dict(server_config.feature_flags, FeatureFlagsEnum.level_module):
return
server = self._servers.get_server_by_discord_id(ctx.guild.id)
level_from_db = (
@ -371,12 +350,6 @@ class LevelGroup(DiscordCommandABC):
@CommandChecks.check_is_member_admin()
async def remove(self, ctx: Context, level: str):
self._logger.debug(__name__, f"Received command level remove {ctx}")
if ctx.guild is None:
return
server_config: ServerConfig = self._config.get_configuration(f"ServerConfig_{ctx.guild.id}")
if not FeatureFlagsSettings.get_flag_from_dict(server_config.feature_flags, FeatureFlagsEnum.level_module):
return
server = self._servers.get_server_by_discord_id(ctx.guild.id)
level_from_db = (
@ -421,12 +394,6 @@ class LevelGroup(DiscordCommandABC):
@CommandChecks.check_is_member_moderator()
async def down(self, ctx: Context, member: discord.Member):
self._logger.debug(__name__, f"Received command level down {ctx} {member}")
if ctx.guild is None:
return
server_config: ServerConfig = self._config.get_configuration(f"ServerConfig_{ctx.guild.id}")
if not FeatureFlagsSettings.get_flag_from_dict(server_config.feature_flags, FeatureFlagsEnum.level_module):
return
if member.bot:
return
@ -469,12 +436,6 @@ class LevelGroup(DiscordCommandABC):
@CommandChecks.check_is_member_moderator()
async def up(self, ctx: Context, member: discord.Member):
self._logger.debug(__name__, f"Received command level up {ctx} {member}")
if ctx.guild is None:
return
server_config: ServerConfig = self._config.get_configuration(f"ServerConfig_{ctx.guild.id}")
if not FeatureFlagsSettings.get_flag_from_dict(server_config.feature_flags, FeatureFlagsEnum.level_module):
return
if member.bot:
return
@ -516,12 +477,6 @@ class LevelGroup(DiscordCommandABC):
@CommandChecks.check_is_member_moderator()
async def set(self, ctx: Context, member: discord.Member, level: str):
self._logger.debug(__name__, f"Received command level up {ctx} {member}")
if ctx.guild is None:
return
server_config: ServerConfig = self._config.get_configuration(f"ServerConfig_{ctx.guild.id}")
if not FeatureFlagsSettings.get_flag_from_dict(server_config.feature_flags, FeatureFlagsEnum.level_module):
return
if member.bot:
return
@ -574,12 +529,5 @@ class LevelGroup(DiscordCommandABC):
@CommandChecks.check_is_member_moderator()
async def reload(self, ctx: Context):
self._logger.debug(__name__, f"Received command level reload {ctx}")
if ctx.guild is None:
return
server_config: ServerConfig = self._config.get_configuration(f"ServerConfig_{ctx.guild.id}")
if not FeatureFlagsSettings.get_flag_from_dict(server_config.feature_flags, FeatureFlagsEnum.level_module):
return
await self._seed_levels(ctx)
self._logger.trace(__name__, f"Finished command level reload")

View File

@ -1,27 +1,18 @@
import discord
from cpl_core.configuration import ConfigurationABC
from cpl_discord.events import OnMemberJoinABC
from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
from bot_core.configuration.feature_flags_settings import FeatureFlagsSettings
from bot_core.helper.event_checks import EventChecks
from bot_core.logging.message_logger import MessageLogger
from bot_data.model.server_config import ServerConfig
from modules.level.service.level_service import LevelService
class LevelOnMemberJoinEvent(OnMemberJoinABC):
def __init__(self, config: ConfigurationABC, logger: MessageLogger, level: LevelService):
def __init__(self, logger: MessageLogger, level: LevelService):
OnMemberJoinABC.__init__(self)
self._config = config
self._logger = logger
self._level = level
@EventChecks.check_is_ready()
async def on_member_join(self, member: discord.Member):
self._logger.debug(__name__, f"Module {type(self)} started")
server_config: ServerConfig = self._config.get_configuration(f"ServerConfig_{member.guild.id}")
if not FeatureFlagsSettings.get_flag_from_dict(server_config.feature_flags, FeatureFlagsEnum.level_module):
return
await self._level.check_level(member)

View File

@ -1,35 +1,20 @@
import discord
from cpl_core.configuration import ConfigurationABC
from cpl_discord.events import OnMessageABC
from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
from bot_core.configuration.feature_flags_settings import FeatureFlagsSettings
from bot_core.helper.event_checks import EventChecks
from bot_core.logging.message_logger import MessageLogger
from bot_data.model.server_config import ServerConfig
from modules.level.service.level_service import LevelService
class LevelOnMessageEvent(OnMessageABC):
def __init__(self, config: ConfigurationABC, logger: MessageLogger, level: LevelService):
def __init__(self, logger: MessageLogger, level: LevelService):
OnMessageABC.__init__(self)
self._config = config
self._logger = logger
self._level = level
@EventChecks.check_is_ready()
async def on_message(self, message: discord.Message):
self._logger.debug(__name__, f"Module {type(self)} started")
if message.guild is None:
return
if message.author.bot:
return
server_config: ServerConfig = self._config.get_configuration(f"ServerConfig_{message.guild.id}")
if not FeatureFlagsSettings.get_flag_from_dict(server_config.feature_flags, FeatureFlagsEnum.level_module):
return
try:
await self._level.check_level(message.author)
except Exception as e:

View File

@ -1,27 +1,21 @@
from cpl_core.configuration import ConfigurationABC
from cpl_core.logging import LoggerABC
from cpl_discord.events.on_raw_reaction_add_abc import OnRawReactionAddABC
from cpl_discord.service import DiscordBotServiceABC
from discord import RawReactionActionEvent
from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
from bot_core.configuration.feature_flags_settings import FeatureFlagsSettings
from bot_core.helper.event_checks import EventChecks
from bot_data.model.server_config import ServerConfig
from modules.level.service.level_service import LevelService
class LevelOnRawReactionAddEvent(OnRawReactionAddABC):
def __init__(
self,
config: ConfigurationABC,
logger: LoggerABC,
bot: DiscordBotServiceABC,
level: LevelService,
):
OnRawReactionAddABC.__init__(self)
self._config = config
self._logger = logger
self._bot = bot
self._level = level
@ -29,10 +23,6 @@ class LevelOnRawReactionAddEvent(OnRawReactionAddABC):
@EventChecks.check_is_ready()
async def on_raw_reaction_add(self, payload: RawReactionActionEvent):
self._logger.debug(__name__, f"Module {type(self)} started")
server_config: ServerConfig = self._config.get_configuration(f"ServerConfig_{payload.guild_id}")
if not FeatureFlagsSettings.get_flag_from_dict(server_config.feature_flags, FeatureFlagsEnum.level_module):
return
try:
self._logger.trace(__name__, f"Handle reaction {payload} for level")

View File

@ -1,27 +1,21 @@
from cpl_core.configuration import ConfigurationABC
from cpl_core.logging import LoggerABC
from cpl_discord.events.on_raw_reaction_remove_abc import OnRawReactionRemoveABC
from cpl_discord.service import DiscordBotServiceABC
from discord import RawReactionActionEvent
from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
from bot_core.configuration.feature_flags_settings import FeatureFlagsSettings
from bot_core.helper.event_checks import EventChecks
from bot_data.model.server_config import ServerConfig
from modules.level.service.level_service import LevelService
class LevelOnRawReactionRemoveEvent(OnRawReactionRemoveABC):
def __init__(
self,
config: ConfigurationABC,
logger: LoggerABC,
bot: DiscordBotServiceABC,
level: LevelService,
):
OnRawReactionRemoveABC.__init__(self)
self._config = config
self._logger = logger
self._bot = bot
self._level = level
@ -29,10 +23,6 @@ class LevelOnRawReactionRemoveEvent(OnRawReactionRemoveABC):
@EventChecks.check_is_ready()
async def on_raw_reaction_remove(self, payload: RawReactionActionEvent):
self._logger.debug(__name__, f"Module {type(self)} started")
server_config: ServerConfig = self._config.get_configuration(f"ServerConfig_{payload.guild_id}")
if not FeatureFlagsSettings.get_flag_from_dict(server_config.feature_flags, FeatureFlagsEnum.level_module):
return
try:
self._logger.trace(__name__, f"Handle reaction {payload} for level")

View File

@ -1,19 +1,14 @@
import discord
from cpl_core.configuration import ConfigurationABC
from cpl_core.logging import LoggerABC
from cpl_discord.events import OnVoiceStateUpdateABC
from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum
from bot_core.configuration.feature_flags_settings import FeatureFlagsSettings
from bot_core.helper.event_checks import EventChecks
from bot_data.model.server_config import ServerConfig
from modules.level.service.level_service import LevelService
class LevelOnVoiceStateUpdateEvent(OnVoiceStateUpdateABC):
def __init__(self, config: ConfigurationABC, logger: LoggerABC, level: LevelService):
def __init__(self, logger: LoggerABC, level: LevelService):
OnVoiceStateUpdateABC.__init__(self)
self._config = config
self._logger = logger
self._level = level
@ -27,8 +22,4 @@ class LevelOnVoiceStateUpdateEvent(OnVoiceStateUpdateABC):
after: discord.VoiceState,
):
self._logger.debug(__name__, f"Module {type(self)} started")
server_config: ServerConfig = self._config.get_configuration(f"ServerConfig_{member.guild.id}")
if not FeatureFlagsSettings.get_flag_from_dict(server_config.feature_flags, FeatureFlagsEnum.level_module):
return
await self._level.check_level(member)

View File

@ -1,6 +1,6 @@
{
"name": "kdb-web",
"version": "1.1.dev334_feature_flags_in_wi",
"version": "1.1.dev79_hide_table_columns",
"scripts": {
"ng": "ng",
"update-version": "ts-node-esm update-version.ts",

View File

@ -26,12 +26,7 @@ export class ComponentWithTable {
this.columns = columns.map(column => {
return { key: this.getKey(column), name: column };
});
let hiddenColumns = localStorage.getItem("hiddenColumns");
if (!hiddenColumns) {
localStorage.setItem("hiddenColumns", JSON.stringify([{}]));
hiddenColumns = localStorage.getItem("hiddenColumns") ?? JSON.stringify([{}]);
}
this._hiddenColumns = JSON.parse(hiddenColumns);
this._hiddenColumns = JSON.parse(localStorage.getItem("hiddenColumns") ?? "");
}
private getKey(column: string): string {

View File

@ -1,4 +0,0 @@
export interface FeatureFlag {
key: string;
value: boolean;
}

View File

@ -1,5 +1,4 @@
import { DataWithHistory } from "../data/data.model";
import { FeatureFlag } from "./feature-flags.model";
export interface ServerConfig extends DataWithHistory {
id?: number;
@ -16,7 +15,6 @@ export interface ServerConfig extends DataWithHistory {
helpVoiceChannelId?: string;
teamChannelId?: string;
loginMessageChannelId?: string;
featureFlags: FeatureFlag[];
afkChannelIds: string[];
moderatorRoleIds: string[];
adminRoleIds: string[];

View File

@ -1,5 +1,4 @@
import { DataWithHistory } from "../data/data.model";
import { FeatureFlag } from "./feature-flags.model";
export interface TechnicianConfig extends DataWithHistory {
id?: number;
@ -7,7 +6,6 @@ export interface TechnicianConfig extends DataWithHistory {
waitForRestart?: number;
waitForShutdown?: number;
cacheMaxMessages?: number;
featureFlags: FeatureFlag[];
pingURLs: string[];
technicianIds: string[];
}

View File

@ -167,7 +167,7 @@ export class Mutations {
`;
static updateTechnicianConfig = `
mutation updateTechnicianConfig($id: ID, $helpCommandReferenceUrl: String, $waitForRestart: Int, $waitForShutdown: Int, $cacheMaxMessages: Int, $featureFlags: [FeatureFlagInput], $pingURLs: [String], $technicianIds: [String]) {
mutation updateTechnicianConfig($id: ID, $helpCommandReferenceUrl: String, $waitForRestart: Int, $waitForShutdown: Int, $cacheMaxMessages: Int, $pingURLs: [String], $technicianIds: [String]) {
technicianConfig {
updateTechnicianConfig(input: {
id: $id,
@ -175,7 +175,6 @@ export class Mutations {
waitForRestart: $waitForRestart,
waitForShutdown: $waitForShutdown,
cacheMaxMessages: $cacheMaxMessages,
featureFlags: $featureFlags,
pingURLs: $pingURLs,
technicianIds: $technicianIds
}) {
@ -184,10 +183,6 @@ export class Mutations {
waitForRestart
waitForShutdown
cacheMaxMessages
featureFlags {
key
value
}
pingURLs
technicianIds
}
@ -211,7 +206,6 @@ export class Mutations {
$helpVoiceChannelId: String,
$teamChannelId: String,
$loginMessageChannelId: String,
$featureFlags: [FeatureFlagInput],
$afkChannelIds: [String],
$moderatorRoleIds: [String],
$adminRoleIds: [String]
@ -219,22 +213,21 @@ export class Mutations {
serverConfig {
updateServerConfig(input: {
id: $id,
messageDeleteTimer: $messageDeleteTimer,
notificationChatId: $notificationChatId,
maxVoiceStateHours: $maxVoiceStateHours,
xpPerMessage: $xpPerMessage,
xpPerReaction: $xpPerReaction,
maxMessageXpPerHour: $maxMessageXpPerHour,
xpPerOntimeHour: $xpPerOntimeHour,
xpPerEventParticipation: $xpPerEventParticipation,
xpPerAchievement: $xpPerAchievement,
afkCommandChannelId: $afkCommandChannelId,
helpVoiceChannelId: $helpVoiceChannelId,
teamChannelId: $teamChannelId,
loginMessageChannelId: $loginMessageChannelId,
featureFlags: $featureFlags,
afkChannelIds: $afkChannelIds,
moderatorRoleIds: $moderatorRoleIds,
messageDeleteTimer: $messageDeleteTimer
notificationChatId: $notificationChatId
maxVoiceStateHours: $maxVoiceStateHours
xpPerMessage: $xpPerMessage
xpPerReaction: $xpPerReaction
maxMessageXpPerHour: $maxMessageXpPerHour
xpPerOntimeHour: $xpPerOntimeHour
xpPerEventParticipation: $xpPerEventParticipation
xpPerAchievement: $xpPerAchievement
afkCommandChannelId: $afkCommandChannelId
helpVoiceChannelId: $helpVoiceChannelId
teamChannelId: $teamChannelId
loginMessageChannelId: $loginMessageChannelId
afkChannelIds: $afkChannelIds
moderatorRoleIds: $moderatorRoleIds
adminRoleIds: $adminRoleIds
}) {
id
@ -251,10 +244,6 @@ export class Mutations {
helpVoiceChannelId
teamChannelId
loginMessageChannelId
featureFlags {
key
value
}
afkChannelIds
moderatorRoleIds
adminRoleIds

View File

@ -353,10 +353,6 @@ export class Queries {
waitForRestart
waitForShutdown
cacheMaxMessages
featureFlags {
key
value
}
pingURLs
technicianIds
@ -385,10 +381,6 @@ export class Queries {
helpVoiceChannelId
teamChannelId
loginMessageChannelId
featureFlags {
key
value
}
afkChannelIds
moderatorRoleIds
adminRoleIds

View File

@ -59,8 +59,3 @@ export interface AutoRoleRuleQuery {
autoRoleRules: AutoRoleRule[];
}
export interface PossibleFeatureFlagsQuery {
possibleFeatureFlags: string[];
}

View File

@ -163,7 +163,6 @@
<div class="content-divider"></div>
<app-config-list translationKey="admin.settings.bot.ping_urls" [(data)]="config.pingURLs"></app-config-list>
<app-config-list translationKey="admin.settings.bot.technician_ids" [(data)]="config.technicianIds"></app-config-list>
<app-feature-flag-list [(data)]="config.featureFlags"></app-feature-flag-list>
<div class="content-row">
<button pButton icon="pi pi-save" label="{{'common.save' | translate}}" class="btn login-form-submit-btn"

View File

@ -49,7 +49,6 @@ export class SettingsComponent implements OnInit {
waitForRestart: 0,
waitForShutdown: 0,
cacheMaxMessages: 0,
featureFlags: [],
pingURLs: [],
technicianIds: []
};
@ -151,7 +150,6 @@ export class SettingsComponent implements OnInit {
waitForRestart: this.config.waitForRestart,
waitForShutdown: this.config.waitForShutdown,
cacheMaxMessages: this.config.cacheMaxMessages,
featureFlags: this.config.featureFlags,
pingURLs: this.config.pingURLs,
technicianIds: this.config.technicianIds
}

View File

@ -2,10 +2,9 @@
<p-multiSelect display="chip" [options]="columns" [(ngModel)]="hiddenColumns" optionLabel="name" placeholder="{{'common.hidden_columns' | translate}}" [filter]=false>
<ng-template let-value pTemplate="selectedItems">
<div *ngFor="let item of hiddenColumns; let i = index;">
<div *ngIf="item.name">
<div>
{{'common.' + item.name | translate}}<span *ngIf="i < columns.length-1">,</span>
</div>
<div *ngIf="!item.name">{{'common.hidden_columns' | translate}}</div>
</div>
<div *ngIf="!hiddenColumns || hiddenColumns.length === 0">{{'common.hidden_columns' | translate}}</div>
</ng-template>

View File

@ -15,8 +15,8 @@
</div>
</ng-template>
<ng-template pTemplate="body" let-value let-editing="editing" let-ri="rowIndex">
<tr [pEditableRow]="value" style="display: flex;">
<td style="flex: 1;">
<tr [pEditableRow]="value">
<td>
<p-cellEditor>
<ng-template pTemplate="input">
<input class="table-edit-input" pInputText type="text" [(ngModel)]="value.value">

View File

@ -1,55 +0,0 @@
<div class="content-row">
<div class="content-column">
<div class="content-data-name">
{{'common.feature_flags' | translate}}:
</div>
<div class="content-data-value-row">
<p-table #dt [value]="internal_data" dataKey="id" editMode="row">
<ng-template pTemplate="caption">
<div class="table-caption">
<div class="table-caption-btn-wrapper btn-wrapper">
<button pButton class="icon-btn btn"
icon="pi pi-plus" (click)="addNew(dt)">
</button>
</div>
</div>
</ng-template>
<ng-template pTemplate="body" let-value let-editing="editing" let-ri="rowIndex">
<tr [pEditableRow]="value" style="display: flex;">
<td style="flex: 3;">
<p-cellEditor>
<ng-template pTemplate="input">
<p-dropdown class="table-edit-input" [options]="featureFlags" [(ngModel)]="value.value.key"></p-dropdown>
</ng-template>
<ng-template pTemplate="output">
{{value.value.key}}
</ng-template>
</p-cellEditor>
</td>
<td style="flex: 1;">
<p-cellEditor>
<ng-template pTemplate="input">
<p-inputSwitch class="table-edit-input" [(ngModel)]="value.value.value"></p-inputSwitch>
</ng-template>
<ng-template pTemplate="output">
<p-inputSwitch class="table-edit-input" [(ngModel)]="value.value.value" [disabled]="true"></p-inputSwitch>
</ng-template>
</p-cellEditor>
</td>
<td>
<div class="btn-wrapper">
<button *ngIf="!editing" pButton type="button" pInitEditableRow class="btn icon-btn" icon="pi pi-pencil" (click)="editInit(value, ri)"></button>
<button *ngIf="!editing" pButton type="button" class="btn danger-icon-btn" icon="pi pi-trash" (click)="delete(ri)"></button>
<button *ngIf="editing" pButton type="button" pSaveEditableRow class="btn icon-btn" icon="pi pi-check" (click)="editSave(value, ri)"></button>
<button *ngIf="editing" pButton type="button" pCancelEditableRow class="btn danger-icon-btn" icon="pi pi-times"
(click)="editCancel(ri)"></button>
</div>
</td>
</tr>
</ng-template>
</p-table>
</div>
</div>
</div>
<div class="content-divider"></div>

View File

@ -1,23 +0,0 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { FeatureFlagListComponent } from './feature-flag-list.component';
describe('FeatureFlagListComponent', () => {
let component: FeatureFlagListComponent;
let fixture: ComponentFixture<FeatureFlagListComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ FeatureFlagListComponent ]
})
.compileComponents();
fixture = TestBed.createComponent(FeatureFlagListComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -1,40 +0,0 @@
import { Component, OnInit } from "@angular/core";
import { ConfigListComponent } from "../config-list/config-list.component";
import { Table } from "primeng/table";
import { PossibleFeatureFlagsQuery } from "../../../../models/graphql/query.model";
import { DataService } from "../../../../services/data/data.service";
@Component({
selector: "app-feature-flag-list",
templateUrl: "./feature-flag-list.component.html",
styleUrls: ["./feature-flag-list.component.scss"]
})
export class FeatureFlagListComponent extends ConfigListComponent implements OnInit {
featureFlags: string[] = [];
constructor(
private dataService: DataService
) {
super();
}
ngOnInit() {
this.dataService.query<PossibleFeatureFlagsQuery>("{possibleFeatureFlags}"
).subscribe(data => {
this.featureFlags = data.possibleFeatureFlags;
});
}
override addNew(table: Table) {
const id = Math.max.apply(Math, this.internal_data.map(value => {
return value.id ?? 0;
})) + 1;
const newItem = { id: id, value: { key: "", value: false } };
this.internal_data.push(newItem);
table.initRowEdit(newItem);
const index = this.internal_data.findIndex(l => l.id == newItem.id);
this.editInit(newItem, index);
}
}

View File

@ -28,11 +28,8 @@ export class AuthGuard implements CanActivate {
const role = route.data['role'];
if (role) {
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) {
this.authService.hasUserPermission(role).then(hasPermission => {
if (!hasPermission) {
this.router.navigate(['/dashboard']);
return false;
}

View File

@ -30,8 +30,6 @@ import { MultiSelectModule } from "primeng/multiselect";
import { HideableColumnComponent } from './components/hideable-column/hideable-column.component';
import { HideableHeaderComponent } from './components/hideable-header/hideable-header.component';
import { MultiSelectColumnsComponent } from './base/multi-select-columns/multi-select-columns.component';
import { FeatureFlagListComponent } from './components/feature-flag-list/feature-flag-list.component';
import { InputSwitchModule } from "primeng/inputswitch";
@NgModule({
@ -44,7 +42,6 @@ import { InputSwitchModule } from "primeng/inputswitch";
HideableColumnComponent,
HideableHeaderComponent,
MultiSelectColumnsComponent,
FeatureFlagListComponent,
],
imports: [
CommonModule,
@ -71,7 +68,6 @@ import { InputSwitchModule } from "primeng/inputswitch";
SidebarModule,
DataViewModule,
MultiSelectModule,
InputSwitchModule,
],
exports: [
ButtonModule,
@ -106,8 +102,6 @@ import { InputSwitchModule } from "primeng/inputswitch";
HideableColumnComponent,
HideableHeaderComponent,
MultiSelectColumnsComponent,
FeatureFlagListComponent,
InputSwitchModule,
]
})
export class SharedModule {

View File

@ -113,7 +113,6 @@
<app-config-list translationKey="view.server.config.bot.afk_channels" [(data)]="config.afkChannelIds"></app-config-list>
<app-config-list translationKey="view.server.config.bot.moderator_roles" [(data)]="config.moderatorRoleIds"></app-config-list>
<app-config-list translationKey="view.server.config.bot.admin_roles" [(data)]="config.adminRoleIds"></app-config-list>
<app-feature-flag-list *ngIf="isTechnician" [(data)]="config.featureFlags"></app-feature-flag-list>
<div class="content-row">
<button pButton icon="pi pi-save" label="{{'common.save' | translate}}" class="btn login-form-submit-btn"

View File

@ -16,7 +16,7 @@ import { AuthService } from "../../../../../../services/auth/auth.service";
import { ServerConfig } from "../../../../../../models/config/server-config.model";
import { Server } from "../../../../../../models/data/server.model";
import { ActivatedRoute } from "@angular/router";
import { UserDTO } from "../../../../../../models/auth/auth-user.dto";
import { Table } from "primeng/table";
type AFKChannelId = {
id: number;
@ -31,7 +31,6 @@ type AFKChannelId = {
export class ConfigComponent implements OnInit {
config: ServerConfig = {
messageDeleteTimer: 0,
featureFlags: [],
afkChannelIds: [],
moderatorRoleIds: [],
adminRoleIds: []
@ -42,7 +41,6 @@ export class ConfigComponent implements OnInit {
clonedAfkChannelIds: { [s: number]: AFKChannelId } = {};
private server: Server = {};
isTechnician: boolean = false;
constructor(
private data: DataService,
@ -64,9 +62,6 @@ export class ConfigComponent implements OnInit {
this.data.getServerFromRoute(this.route).then(async server => {
this.server = server;
this.loadConfig();
let authUser = await this.authService.getLoggedInUser();
let isUserTechnicianList = authUser?.users?.map(u => u.isTechnician).filter(u => u) ?? [];
this.isTechnician = isUserTechnicianList.length > 0;
});
}
@ -106,7 +101,6 @@ export class ConfigComponent implements OnInit {
helpVoiceChannelId: this.config.helpVoiceChannelId,
teamChannelId: this.config.teamChannelId,
loginMessageChannelId: this.config.loginMessageChannelId,
featureFlags: this.config.featureFlags,
afkChannelIds: this.config.afkChannelIds,
moderatorRoleIds: this.config.moderatorRoleIds,
adminRoleIds: this.config.adminRoleIds
@ -116,7 +110,7 @@ export class ConfigComponent implements OnInit {
return throwError(err);
})).subscribe(result => {
this.spinner.hideSpinner();
this.toastService.success(this.translate.instant("view.server.config.message.server_config_create"), this.translate.instant("view.server.config.message.server_config_create_d"));
this.toastService.success(this.translate.instant("view.server.config.message.server#_config_create"), this.translate.instant("view.server.config.message.server_config_create_d"));
});
}
}

View File

@ -67,7 +67,7 @@ export class SidebarService {
}
}
async buildMenu(user: UserDTO | null, hasPermission: boolean, isTechnician: boolean = false) {
async buildMenu(user: UserDTO | null, hasPermission: boolean) {
this.dashboard = {
label: this.isSidebarOpen ? this.translateService.instant("sidebar.dashboard") : "",
icon: "pi pi-th-large",
@ -127,20 +127,18 @@ export class SidebarService {
};
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,
visible: hasPermission,
expanded: true,
items: [this.adminConfig, this.adminUsers]
};
@ -150,10 +148,9 @@ export class SidebarService {
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$.value?.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);
await this.buildMenu(user, hasPermission);
}
if (this.server$.value) {
@ -162,7 +159,7 @@ export class SidebarService {
this.serverAutoRoles.visible = !!user?.isModerator;
this.serverLevels.visible = !!user?.isModerator;
this.serverAchievements.visible = !!user?.isModerator;
this.serverConfig.visible = !!user?.isAdmin || isTechnician.length > 0;
this.serverConfig.visible = !!user?.isAdmin;
} else {
this.serverMenu.visible = false;
}

View File

@ -122,7 +122,6 @@
}
},
"common": {
"feature_flags": "Funktionen",
"404": "404 - Der Eintrag konnte nicht gefunden werden",
"actions": "Aktionen",
"active": "Aktiv",

View File

@ -2,6 +2,6 @@
"WebVersion": {
"Major": "1",
"Minor": "1",
"Micro": "dev334_feature_flags_in_wi"
"Micro": "dev79_hide_table_columns"
}
}

View File

@ -587,7 +587,7 @@
.p-datatable .p-sortable-column.p-highlight,
.p-datatable .p-sortable-column.p-highlight .p-sortable-column-icon,
.p-datatable .p-sortable-column:not(.p-highlight):hover {
.p-datatable .p-sortable-column:not(.p-highlight):hover{
color: $primaryHeaderColor !important;
background-color: transparent !important;
}
@ -672,13 +672,4 @@
}
}
}
.p-inputswitch.p-inputswitch-checked .p-inputswitch-slider {
background: $primaryHeaderColor !important;
}
.p-inputswitch.p-focus .p-inputswitch-slider {
box-shadow: none !important;
}
}