Added server config mutation #127

This commit is contained in:
2023-08-14 15:53:42 +02:00
parent 4c42949516
commit 5d36f1188a
16 changed files with 537 additions and 26 deletions

View File

@@ -24,6 +24,7 @@ from bot_graphql.mutations.achievement_mutation import AchievementMutation
from bot_graphql.mutations.auto_role_mutation import AutoRoleMutation
from bot_graphql.mutations.auto_role_rule_mutation import AutoRoleRuleMutation
from bot_graphql.mutations.level_mutation import LevelMutation
from bot_graphql.mutations.server_config_mutation import ServerConfigMutation
from bot_graphql.mutations.technician_config_mutation import TechnicianConfigMutation
from bot_graphql.mutations.user_joined_game_server_mutation import UserJoinedGameServerMutation
from bot_graphql.mutations.user_mutation import UserMutation
@@ -41,6 +42,7 @@ from bot_graphql.queries.known_user_history_query import KnownUserHistoryQuery
from bot_graphql.queries.known_user_query import KnownUserQuery
from bot_graphql.queries.level_history_query import LevelHistoryQuery
from bot_graphql.queries.level_query import LevelQuery
from bot_graphql.queries.server_config_query import ServerConfigQuery
from bot_graphql.queries.server_history_query import ServerHistoryQuery
from bot_graphql.queries.server_query import ServerQuery
from bot_graphql.queries.technician_config_history_query import TechnicianConfigHistoryQuery
@@ -86,6 +88,7 @@ class GraphQLModule(ModuleABC):
services.add_transient(QueryABC, KnownUserQuery)
services.add_transient(QueryABC, LevelHistoryQuery)
services.add_transient(QueryABC, LevelQuery)
services.add_transient(QueryABC, ServerConfigQuery)
services.add_transient(QueryABC, ServerHistoryQuery)
services.add_transient(QueryABC, ServerQuery)
services.add_transient(QueryABC, TechnicianConfigQuery)
@@ -122,5 +125,6 @@ class GraphQLModule(ModuleABC):
services.add_transient(QueryABC, AchievementMutation)
services.add_transient(QueryABC, UserJoinedGameServerMutation)
services.add_transient(QueryABC, TechnicianConfigMutation)
services.add_transient(QueryABC, ServerConfigMutation)
services.add_transient(SeederService)

View File

@@ -6,4 +6,5 @@ type Mutation {
userJoinedGameServer: UserJoinedGameServerMutation
achievement: AchievementMutation
technicianConfig: TechnicianConfigMutation
serverConfig: ServerConfigMutation
}

View File

@@ -31,6 +31,8 @@ type Server implements TableWithHistoryQuery {
achievementCount: Int
achievements(filter: AchievementFilter, page: Page, sort: Sort): [Achievement]
config: ServerConfig
createdAt: String
modifiedAt: String

View File

@@ -0,0 +1,94 @@
type ServerConfig implements TableWithHistoryQuery {
id: ID
messageDeleteTimer: Int
notificationChatId: String
maxVoiceStateHours: Int
xpPerMessage: Int
xpPerReaction: Int
maxMessageXpPerHour: Int
xpPerOntimeHour: Int
xpPerEventParticipation: Int
xpPerAchievement: Int
afkCommandChannelId: String
helpVoiceChannelId: String
teamChannelId: String
loginMessageChannelId: String
afkChannelIds: [String]
moderatorRoleIds: [String]
adminRoleIds: [String]
server: Server
createdAt: String
modifiedAt: String
history: [ServerConfigHistory]
}
type ServerConfigHistory implements HistoryTableQuery {
id: ID
messageDeleteTimer: Int
notificationChatId: String
maxVoiceStateHours: Int
xpPerMessage: Int
xpPerReaction: Int
maxMessageXpPerHour: Int
xpPerOntimeHour: Int
xpPerEventParticipation: Int
xpPerAchievement: Int
afkCommandChannelId: String
helpVoiceChannelId: String
teamChannelId: String
loginMessageChannelId: String
serverId: ID
deleted: Boolean
dateFrom: String
dateTo: String
}
type ServerAFKChannelIdsConfigHistory implements HistoryTableQuery {
id: ID
channelId: String
deleted: Boolean
dateFrom: String
dateTo: String
}
type ServerTeamRoleIdsConfigHistory implements HistoryTableQuery {
id: ID
roleId: String
teamMemberType: String
deleted: Boolean
dateFrom: String
dateTo: String
}
type ServerConfigMutation {
updateServerConfig(input: ServerConfigInput!): ServerConfig
}
input ServerConfigInput {
id: ID
messageDeleteTimer: Int
notificationChatId: String
maxVoiceStateHours: Int
xpPerMessage: Int
xpPerReaction: Int
maxMessageXpPerHour: Int
xpPerOntimeHour: Int
xpPerEventParticipation: Int
xpPerAchievement: Int
afkCommandChannelId: String
helpVoiceChannelId: String
teamChannelId: String
loginMessageChannelId: String
afkChannelIds: [String]
moderatorRoleIds: [String]
adminRoleIds: [String]
}

View File

@@ -4,6 +4,7 @@ from bot_graphql.mutations.achievement_mutation import AchievementMutation
from bot_graphql.mutations.auto_role_mutation import AutoRoleMutation
from bot_graphql.mutations.auto_role_rule_mutation import AutoRoleRuleMutation
from bot_graphql.mutations.level_mutation import LevelMutation
from bot_graphql.mutations.server_config_mutation import ServerConfigMutation
from bot_graphql.mutations.technician_config_mutation import TechnicianConfigMutation
from bot_graphql.mutations.user_joined_game_server_mutation import UserJoinedGameServerMutation
from bot_graphql.mutations.user_mutation import UserMutation
@@ -19,6 +20,7 @@ class Mutation(MutationType):
achievement_mutation: AchievementMutation,
user_joined_game_server: UserJoinedGameServerMutation,
technician_config: TechnicianConfigMutation,
server_config: ServerConfigMutation,
):
MutationType.__init__(self)
@@ -29,3 +31,4 @@ class Mutation(MutationType):
self.set_field("achievement", lambda *_: achievement_mutation)
self.set_field("userJoinedGameServer", lambda *_: user_joined_game_server)
self.set_field("technicianConfig", lambda *_: technician_config)
self.set_field("serverConfig", lambda *_: server_config)

View File

@@ -0,0 +1,157 @@
from cpl_core.database.context import DatabaseContextABC
from cpl_discord.service import DiscordBotServiceABC
from cpl_query.extension import List
from bot_api.logging.api_logger import ApiLogger
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
from bot_data.model.server_config import ServerConfig
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
class ServerConfigMutation(QueryABC):
def __init__(
self,
logger: ApiLogger,
bot: DiscordBotServiceABC,
servers: ServerRepositoryABC,
server_configs: ServerConfigRepositoryABC,
db: DatabaseContextABC,
):
QueryABC.__init__(self, "ServerConfigMutation")
self._logger = logger
self._bot = bot
self._servers = servers
self._server_configs = server_configs
self._db = db
self.set_field("updateServerConfig", self.resolve_update_server_config)
def resolve_update_server_config(self, *_, input: dict):
if "id" not in input:
raise ValueError("Id not set")
server_config = self._server_configs.get_server_config_by_server(input["id"])
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
)
server_config.notification_chat_id = (
input["notificationChatId"] if "notificationChatId" in input else server_config.notification_chat_id
)
server_config.max_voice_state_hours = (
input["maxVoiceStateHours"] if "maxVoiceStateHours" in input else server_config.max_voice_state_hours
)
server_config.xp_per_message = (
input["xpPerMessage"] if "xpPerMessage" in input else server_config.xp_per_message
)
server_config.xp_per_reaction = (
input["xpPerReaction"] if "xpPerReaction" in input else server_config.xp_per_reaction
)
server_config.max_message_xp_per_hour = (
input["maxMessageXpPerHour"] if "maxMessageXpPerHour" in input else server_config.max_message_xp_per_hour
)
server_config.xp_per_ontime_hour = (
input["xpPerOntimeHour"] if "xpPerOntimeHour" in input else server_config.xp_per_ontime_hour
)
server_config.xp_per_event_participation = (
input["xpPerEventParticipation"]
if "xpPerEventParticipation" in input
else server_config.xp_per_event_participation
)
server_config.xp_per_achievement = (
input["xpPerAchievement"] if "xpPerAchievement" in input else server_config.xp_per_achievement
)
server_config.afk_command_channel_id = (
input["afkCommandChannelId"] if "afkCommandChannelId" in input else server_config.afk_command_channel_id
)
server_config.help_voice_channel_id = (
input["helpVoiceChannelId"] if "helpVoiceChannelId" in input else server_config.help_voice_channel_id
)
server_config.team_channel_id = (
input["teamChannelId"] if "teamChannelId" in input else server_config.team_channel_id
)
server_config.login_message_channel_id = (
input["loginMessageChannelId"]
if "loginMessageChannelId" in input
else server_config.login_message_channel_id
)
server_config.afk_channel_ids = (
List(int).extend([int(x) for x in input["afkChannelIds"]])
if "afkChannelIds" in input
else server_config.afk_channel_ids
)
team_role_ids = List(ServerTeamRoleIdsConfig)
if "moderatorRoleIds" in input:
team_role_ids.extend(
[
ServerTeamRoleIdsConfig(x, TeamMemberTypeEnum.moderator, server_config.server.id)
for x in input["moderatorRoleIds"]
]
)
else:
team_role_ids.extend(
server_config.team_role_ids.where(lambda x: x.team_member_type == TeamMemberTypeEnum.moderator)
)
if "adminRoleIds" in input:
team_role_ids.extend(
[
ServerTeamRoleIdsConfig(x, TeamMemberTypeEnum.admin, server_config.server.id)
for x in input["adminRoleIds"]
]
)
else:
team_role_ids.extend(
server_config.team_role_ids.where(lambda x: x.team_member_type == TeamMemberTypeEnum.admin)
)
self._server_configs.update_server_config(server_config)
if "afkChannelIds" in input:
self._update_afk_channel_ids(server_config)
if "moderatorRoleIds" in input or "adminRoleIds" in input:
server_config.team_role_ids = team_role_ids
self._update_team_role_ids(server_config)
self._db.save_changes()
return server_config
def _update_afk_channel_ids(self, new_config: ServerConfig):
old_config = self._server_configs.get_server_config_by_id(new_config.server.id)
for channel_id in old_config.afk_channel_ids:
if channel_id in new_config.afk_channel_ids:
continue
self._server_configs.delete_server_afk_channel_config(
ServerAFKChannelIdsConfig(channel_id, new_config.server.id)
)
for channel_id in new_config.afk_channel_ids:
if channel_id in old_config.afk_channel_ids:
continue
self._server_configs.add_server_afk_channel_config(
ServerAFKChannelIdsConfig(channel_id, new_config.server.id)
)
def _update_team_role_ids(self, new_config: ServerConfig):
old_config = self._server_configs.get_server_config_by_id(new_config.server.id)
for role_id in old_config.team_role_ids:
if role_id.role_id in new_config.team_role_ids.select(lambda x: int(x.role_id)):
continue
self._server_configs.delete_server_team_role_id_config(role_id)
for role_id in new_config.team_role_ids:
if role_id.role_id in old_config.team_role_ids.select(lambda x: str(x.role_id)):
continue
self._server_configs.add_server_team_role_id_config(role_id)

View File

@@ -0,0 +1,39 @@
from cpl_core.database.context import DatabaseContextABC
from bot_data.model.server_config_history import ServerConfigHistory
from bot_data.model.team_member_type_enum import TeamMemberTypeEnum
from bot_graphql.abc.data_query_with_history_abc import DataQueryWithHistoryABC
class ServerConfigQuery(DataQueryWithHistoryABC):
def __init__(self, db: DatabaseContextABC):
DataQueryWithHistoryABC.__init__(self, "ServerConfig", "CFG_ServerHistory", ServerConfigHistory, db)
self.set_field("id", lambda config, *_: config.id)
self.set_field("messageDeleteTimer", lambda config, *_: config.message_delete_timer)
self.set_field("notificationChatId", lambda config, *_: config.notification_chat_id)
self.set_field("maxVoiceStateHours", lambda config, *_: config.max_voice_state_hours)
self.set_field("xpPerMessage", lambda config, *_: config.xp_per_message)
self.set_field("xpPerReaction", lambda config, *_: config.xp_per_reaction)
self.set_field("maxMessageXpPerHour", lambda config, *_: config.max_message_xp_per_hour)
self.set_field("xpPerOntimeHour", lambda config, *_: config.xp_per_ontime_hour)
self.set_field("xpPerEventParticipation", lambda config, *_: config.xp_per_event_participation)
self.set_field("xpPerAchievement", lambda config, *_: config.xp_per_achievement)
self.set_field("afkCommandChannelId", lambda config, *_: config.afk_command_channel_id)
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.set_field("afkChannelIds", lambda config, *_: config.afk_channel_ids)
self.set_field(
"moderatorRoleIds",
lambda config, *_: config.team_role_ids.where(
lambda x: x.team_member_type == TeamMemberTypeEnum.moderator
).select(lambda x: x.role_id),
)
self.set_field(
"adminRoleIds",
lambda config, *_: config.team_role_ids.where(
lambda x: x.team_member_type == TeamMemberTypeEnum.admin
).select(lambda x: x.role_id),
)
self.set_field("server", lambda config, *_: config.server)

View File

@@ -6,6 +6,7 @@ from bot_data.abc.auto_role_repository_abc import AutoRoleRepositoryABC
from bot_data.abc.client_repository_abc import ClientRepositoryABC
from bot_data.abc.game_server_repository_abc import GameServerRepositoryABC
from bot_data.abc.level_repository_abc import LevelRepositoryABC
from bot_data.abc.server_config_repository_abc import ServerConfigRepositoryABC
from bot_data.abc.user_joined_server_repository_abc import UserJoinedServerRepositoryABC
from bot_data.abc.user_joined_voice_channel_repository_abc import UserJoinedVoiceChannelRepositoryABC
from bot_data.abc.user_repository_abc import UserRepositoryABC
@@ -32,6 +33,7 @@ class ServerQuery(DataQueryWithHistoryABC):
ujs: UserJoinedServerRepositoryABC,
ujvs: UserJoinedVoiceChannelRepositoryABC,
achievements: AchievementRepositoryABC,
server_configs: ServerConfigRepositoryABC,
):
DataQueryWithHistoryABC.__init__(self, "Server", "ServersHistory", ServerHistory, db)
@@ -62,6 +64,7 @@ class ServerQuery(DataQueryWithHistoryABC):
self.add_collection(
"achievement", lambda server, *_: achievements.get_achievements_by_server_id(server.id), AchievementFilter
)
self.set_field("config", lambda server, *_: server_configs.get_server_config_by_server(server.id))
@staticmethod
def resolve_id(server: Server, *_):

View File

@@ -27,11 +27,11 @@ class TechnicianConfigQuery(DataQueryWithHistoryABC):
results = self._db.select(
f"""
SELECT *
FROM CFG_TechnicianPingUrlsHistory
WHERE Id = {entry.id}
ORDER BY DateTo DESC;
"""
SELECT *
FROM CFG_TechnicianPingUrlsHistory
WHERE Id = {entry.id}
ORDER BY DateTo DESC;
"""
)
for result in results:
@@ -44,11 +44,11 @@ class TechnicianConfigQuery(DataQueryWithHistoryABC):
results = self._db.select(
f"""
SELECT *
FROM CFG_TechnicianIdsHistory
WHERE Id = {entry.id}
ORDER BY DateTo DESC;
"""
SELECT *
FROM CFG_TechnicianIdsHistory
WHERE Id = {entry.id}
ORDER BY DateTo DESC;
"""
)
for result in results: