1.1.0.rc4 #345
							
								
								
									
										53
									
								
								kdb-bot/src/bot_graphql/graphql/discord.gql
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								kdb-bot/src/bot_graphql/graphql/discord.gql
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,53 @@ | ||||
| type Discord { | ||||
|     guilds(filter: GuildFilter): [Guild] | ||||
|     users(filter: DiscordUserFilter): [DiscordUser] | ||||
| } | ||||
|  | ||||
| type Guild { | ||||
|     id: ID | ||||
|     name: String | ||||
|  | ||||
|     channels(filter: ChannelFilter): [Channel] | ||||
|     roles: [Role] | ||||
|     emojis: [Emoji] | ||||
| } | ||||
|  | ||||
| input GuildFilter { | ||||
|     id: ID | ||||
|     name: String | ||||
| } | ||||
|  | ||||
| type Channel { | ||||
|     id: String | ||||
|     name: String | ||||
|     type: String | ||||
| } | ||||
|  | ||||
| input ChannelFilter { | ||||
|     id: String | ||||
|     name: String | ||||
|     type: String | ||||
| } | ||||
|  | ||||
| type Role { | ||||
|     id: String | ||||
|     name: String | ||||
| } | ||||
|  | ||||
| type DiscordUser { | ||||
|     id: String | ||||
|     name: String | ||||
|     bot: Boolean | ||||
| } | ||||
|  | ||||
| input DiscordUserFilter { | ||||
|     id: ID | ||||
|     name: String | ||||
|     bot: Boolean | ||||
| } | ||||
|  | ||||
| type Emoji { | ||||
|     id: String | ||||
|     name: String | ||||
|     url: String | ||||
| } | ||||
| @@ -38,7 +38,6 @@ type Query { | ||||
|     achievementOperators: [String] | ||||
| 
 | ||||
|     technicianConfig: TechnicianConfig | ||||
| 
 | ||||
|     guilds(filter: GuildFilter): [Guild] | ||||
|     possibleFeatureFlags: [String] | ||||
|     discord: Discord | ||||
| } | ||||
| @@ -37,6 +37,12 @@ from bot_graphql.queries.auto_role_rule_history_query import AutoRoleRuleHistory | ||||
| from bot_graphql.queries.auto_role_rule_query import AutoRoleRuleQuery | ||||
| from bot_graphql.queries.client_history_query import ClientHistoryQuery | ||||
| from bot_graphql.queries.client_query import ClientQuery | ||||
| from bot_graphql.queries.discord.channel_query import ChannelQuery | ||||
| from bot_graphql.queries.discord.discord_query import DiscordQuery | ||||
| from bot_graphql.queries.discord.discord_user_query import DiscordUserQuery | ||||
| from bot_graphql.queries.discord.emoji_query import EmojiQuery | ||||
| from bot_graphql.queries.discord.guild_query import GuildQuery | ||||
| from bot_graphql.queries.discord.role_query import RoleQuery | ||||
| from bot_graphql.queries.game_server_query import GameServerQuery | ||||
| from bot_graphql.queries.known_user_history_query import KnownUserHistoryQuery | ||||
| from bot_graphql.queries.known_user_query import KnownUserQuery | ||||
| @@ -105,6 +111,13 @@ class GraphQLModule(ModuleABC): | ||||
|         services.add_transient(QueryABC, UserJoinedGameServerHistoryQuery) | ||||
|         services.add_transient(QueryABC, UserJoinedGameServerQuery) | ||||
|  | ||||
|         services.add_transient(QueryABC, DiscordQuery) | ||||
|         services.add_transient(QueryABC, GuildQuery) | ||||
|         services.add_transient(QueryABC, ChannelQuery) | ||||
|         services.add_transient(QueryABC, RoleQuery) | ||||
|         services.add_transient(QueryABC, EmojiQuery) | ||||
|         services.add_transient(QueryABC, DiscordUserQuery) | ||||
|  | ||||
|         # filters | ||||
|         services.add_transient(FilterABC, AutoRoleFilter) | ||||
|         services.add_transient(FilterABC, AutoRoleRuleFilter) | ||||
|   | ||||
							
								
								
									
										1
									
								
								kdb-bot/src/bot_graphql/model/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								kdb-bot/src/bot_graphql/model/__init__.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| # imports | ||||
| @@ -1,29 +0,0 @@ | ||||
| type Guild { | ||||
|     id: ID | ||||
|     name: String | ||||
|  | ||||
|     channels: [Channel] | ||||
|     roles: [Role] | ||||
|     emojis: [Emoji] | ||||
| } | ||||
|  | ||||
| input GuildFilter { | ||||
|     id: ID | ||||
| } | ||||
|  | ||||
| type Channel { | ||||
|     id: String | ||||
|     name: String | ||||
|     type: String | ||||
| } | ||||
|  | ||||
| type Role { | ||||
|     id: String | ||||
|     name: String | ||||
| } | ||||
|  | ||||
| type Emoji { | ||||
|     id: String | ||||
|     name: String | ||||
|     url: String | ||||
| } | ||||
							
								
								
									
										16
									
								
								kdb-bot/src/bot_graphql/model/discord.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								kdb-bot/src/bot_graphql/model/discord.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| from cpl_query.extension import List | ||||
| from discord import Guild, User | ||||
|  | ||||
|  | ||||
| class Discord: | ||||
|     def __init__(self, guilds: List[Guild], users: List[User]): | ||||
|         self._guilds = guilds | ||||
|         self._users = users | ||||
|  | ||||
|     @property | ||||
|     def guilds(self) -> List[Guild]: | ||||
|         return self._guilds | ||||
|  | ||||
|     @property | ||||
|     def users(self) -> List[User]: | ||||
|         return self._users | ||||
| @@ -1,10 +1,10 @@ | ||||
| from bot_graphql.abc.data_query_abc import DataQueryABC | ||||
| from bot_graphql.abc.query_abc import QueryABC | ||||
|  | ||||
|  | ||||
| class ChannelQuery(DataQueryABC): | ||||
| class ChannelQuery(QueryABC): | ||||
|     def __init__(self): | ||||
|         DataQueryABC.__init__(self, "Channel") | ||||
|         QueryABC.__init__(self, "Channel") | ||||
|  | ||||
|         self.set_field("id", lambda c, *_: c.id) | ||||
|         self.set_field("name", lambda c, *_: c.name) | ||||
|         self.set_field("type", lambda c, *_: type(c)) | ||||
|         self.set_field("type", lambda c, *_: type(c).__name__) | ||||
|   | ||||
							
								
								
									
										48
									
								
								kdb-bot/src/bot_graphql/queries/discord/discord_query.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								kdb-bot/src/bot_graphql/queries/discord/discord_query.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,48 @@ | ||||
| from cpl_discord.service import DiscordBotServiceABC | ||||
| from cpl_query.extension import List | ||||
|  | ||||
| from bot_graphql.abc.query_abc import QueryABC | ||||
|  | ||||
|  | ||||
| class DiscordQuery(QueryABC): | ||||
|     def __init__( | ||||
|         self, | ||||
|         bot: DiscordBotServiceABC, | ||||
|     ): | ||||
|         QueryABC.__init__(self, "Discord") | ||||
|  | ||||
|         self._bot = bot | ||||
|  | ||||
|         self.set_field("guilds", self._resolve_guilds) | ||||
|         self.set_field("users", self._resolve_users) | ||||
|  | ||||
|     def _resolve_guilds(self, *_, filter=None): | ||||
|         guilds = self._bot.guilds | ||||
|  | ||||
|         if filter is None: | ||||
|             return guilds | ||||
|  | ||||
|         if "id" in filter: | ||||
|             guilds = self._bot.guilds.where(lambda g: g.id == int(filter["id"])) | ||||
|  | ||||
|         if "name" in filter: | ||||
|             guilds = self._bot.guilds.where(lambda g: g.name == filter["name"]) | ||||
|  | ||||
|         return guilds | ||||
|  | ||||
|     def _resolve_users(self, *_, filter=None): | ||||
|         users = List(any).extend(self._bot.users) | ||||
|  | ||||
|         if filter is None: | ||||
|             return users | ||||
|  | ||||
|         if "id" in filter: | ||||
|             users = users.where(lambda g: g.id == int(filter["id"])) | ||||
|  | ||||
|         if "name" in filter: | ||||
|             users = users.where(lambda g: g.name == filter["name"]) | ||||
|  | ||||
|         if "bot" in filter: | ||||
|             users = users.where(lambda g: g.bot == bool(filter["bot"])) | ||||
|  | ||||
|         return users | ||||
| @@ -0,0 +1,10 @@ | ||||
| from bot_graphql.abc.query_abc import QueryABC | ||||
|  | ||||
|  | ||||
| class DiscordUserQuery(QueryABC): | ||||
|     def __init__(self): | ||||
|         QueryABC.__init__(self, "DiscordUser") | ||||
|  | ||||
|         self.set_field("id", lambda r, *_: r.id) | ||||
|         self.set_field("name", lambda r, *_: r.name) | ||||
|         self.set_field("bot", lambda r, *_: r.bot) | ||||
| @@ -1,9 +1,9 @@ | ||||
| from bot_graphql.abc.data_query_abc import DataQueryABC | ||||
| from bot_graphql.abc.query_abc import QueryABC | ||||
|  | ||||
|  | ||||
| class RoleQuery(DataQueryABC): | ||||
| class EmojiQuery(QueryABC): | ||||
|     def __init__(self): | ||||
|         DataQueryABC.__init__(self, "Emoji") | ||||
|         QueryABC.__init__(self, "Emoji") | ||||
|  | ||||
|         self.set_field("id", lambda e, *_: e.id) | ||||
|         self.set_field("name", lambda e, *_: e.name) | ||||
|   | ||||
| @@ -1,12 +1,38 @@ | ||||
| from bot_graphql.abc.data_query_abc import DataQueryABC | ||||
| from cpl_discord.service import DiscordBotServiceABC | ||||
| from cpl_query.extension import List | ||||
| from discord import Guild | ||||
|  | ||||
| from bot_graphql.abc.query_abc import QueryABC | ||||
|  | ||||
|  | ||||
| class GuildQuery(DataQueryABC): | ||||
|     def __init__(self): | ||||
|         DataQueryABC.__init__(self, "Guild") | ||||
| class GuildQuery(QueryABC): | ||||
|     def __init__( | ||||
|         self, | ||||
|         bot: DiscordBotServiceABC, | ||||
|     ): | ||||
|         QueryABC.__init__(self, "Guild") | ||||
|  | ||||
|         self._bot = bot | ||||
|  | ||||
|         self.set_field("id", lambda g, *_: g.id) | ||||
|         self.set_field("name", lambda g, *_: g.name) | ||||
|         self.set_field("channels", lambda g, *_: g.channels) | ||||
|         self.set_field("channels", self._resolve_channels) | ||||
|         self.set_field("roles", lambda g, *_: g.roles) | ||||
|         self.set_field("emojis", lambda g, *_: g.emojis) | ||||
|  | ||||
|     def _resolve_channels(self, g: Guild, *_, filter=None): | ||||
|         users = List(any).extend(g.channels) | ||||
|  | ||||
|         if filter is None: | ||||
|             return users | ||||
|  | ||||
|         if "id" in filter: | ||||
|             users = users.where(lambda c: c.id == int(filter["id"])) | ||||
|  | ||||
|         if "name" in filter: | ||||
|             users = users.where(lambda c: c.id == filter["name"]) | ||||
|  | ||||
|         if "type" in filter: | ||||
|             users = users.where(lambda c: type(c).__name__ == filter["type"]) | ||||
|  | ||||
|         return users | ||||
|   | ||||
| @@ -1,9 +1,9 @@ | ||||
| from bot_graphql.abc.data_query_abc import DataQueryABC | ||||
| from bot_graphql.abc.query_abc import QueryABC | ||||
|  | ||||
|  | ||||
| class RoleQuery(DataQueryABC): | ||||
| class RoleQuery(QueryABC): | ||||
|     def __init__(self): | ||||
|         DataQueryABC.__init__(self, "Role") | ||||
|         QueryABC.__init__(self, "Role") | ||||
|  | ||||
|         self.set_field("id", lambda r, *_: r.id) | ||||
|         self.set_field("name", lambda r, *_: r.name) | ||||
|   | ||||
| @@ -1,4 +1,5 @@ | ||||
| from cpl_discord.service import DiscordBotServiceABC | ||||
| from cpl_query.extension import List | ||||
|  | ||||
| from bot_core.configuration.feature_flags_enum import FeatureFlagsEnum | ||||
| from bot_data.abc.achievement_repository_abc import AchievementRepositoryABC | ||||
| @@ -24,6 +25,7 @@ from bot_graphql.filter.user_filter import UserFilter | ||||
| from bot_graphql.filter.user_joined_game_server_filter import UserJoinedGameServerFilter | ||||
| from bot_graphql.filter.user_joined_server_filter import UserJoinedServerFilter | ||||
| from bot_graphql.filter.user_joined_voice_channel_filter import UserJoinedVoiceChannelFilter | ||||
| from bot_graphql.model.discord import Discord | ||||
| from modules.achievements.achievement_service import AchievementService | ||||
|  | ||||
|  | ||||
| @@ -47,8 +49,6 @@ class Query(QueryABC): | ||||
|     ): | ||||
|         QueryABC.__init__(self, "Query") | ||||
|  | ||||
|         self._bot = bot | ||||
|  | ||||
|         self.add_collection("autoRole", lambda *_: auto_roles.get_auto_roles(), AutoRoleFilter) | ||||
|         self.add_collection("autoRoleRule", lambda *_: auto_roles.get_auto_role_rules(), AutoRoleRuleFilter) | ||||
|         self.add_collection("client", lambda *_: clients.get_clients(), ClientFilter) | ||||
| @@ -73,13 +73,7 @@ class Query(QueryABC): | ||||
|         self.add_collection("achievement", lambda *_: achievements.get_achievements(), AchievementFilter) | ||||
|         self.set_field("technicianConfig", lambda *_: technician_config.get_technician_config()) | ||||
|  | ||||
|         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: | ||||
|             return self._bot.guilds | ||||
|  | ||||
|         return self._bot.guilds.where(lambda g: g.id == int(filter["id"])) | ||||
|         self.set_field("achievementAttributes", lambda *_: achievement_service.get_attributes()) | ||||
|         self.set_field("achievementOperators", lambda *_: achievement_service.get_operators()) | ||||
|         self.set_field("possibleFeatureFlags", lambda *_: [e.value for e in FeatureFlagsEnum]) | ||||
|         self.set_field("discord", lambda *_: Discord(bot.guilds, List(any).extend(bot.users))) | ||||
|   | ||||
| @@ -10,7 +10,7 @@ from bot_graphql.query import Query | ||||
|  | ||||
| class Schema: | ||||
|     def __init__(self, query: Query, mutation: Mutation, queries: list[QueryABC]): | ||||
|         type_defs = load_schema_from_path(os.path.join(os.path.dirname(os.path.realpath(__file__)), "model/")) | ||||
|         type_defs = load_schema_from_path(os.path.join(os.path.dirname(os.path.realpath(__file__)), "graphql/")) | ||||
|         self._schema = make_executable_schema(type_defs, query, mutation, *queries) | ||||
|  | ||||
|     @property | ||||
|   | ||||
| @@ -1,3 +1,8 @@ | ||||
| export  interface Discord { | ||||
|   guilds?: Guild[]; | ||||
|   users?: DiscordUser[]; | ||||
| } | ||||
|  | ||||
| export interface Guild { | ||||
|   id?: string; | ||||
|   name?: string; | ||||
| @@ -14,9 +19,9 @@ export interface Channel { | ||||
| } | ||||
|  | ||||
| export enum ChannelType { | ||||
|   category = "category", | ||||
|   text = "text", | ||||
|   voice = "voice" | ||||
|   category = "CategoryChannel", | ||||
|   text = "TextChannel", | ||||
|   voice = "VoiceChannel" | ||||
| } | ||||
|  | ||||
| export interface Role { | ||||
| @@ -29,3 +34,9 @@ export interface Emoji { | ||||
|   name?: string; | ||||
|   url?: string; | ||||
| } | ||||
|  | ||||
| export interface DiscordUser { | ||||
|   id?: string; | ||||
|   name?: string; | ||||
|   bot?: boolean; | ||||
| } | ||||
|   | ||||
| @@ -1,25 +1,38 @@ | ||||
| export class Queries { | ||||
|  | ||||
|   static guildsQuery = ` | ||||
|     query GuildsQuery($id: ID) { | ||||
|       guilds(filter: {id: $id}) { | ||||
|         id | ||||
|         name | ||||
|     query GuildsQuery($id: ID, $filter: ChannelFilter) { | ||||
|       discord { | ||||
|         guilds(filter: {id: $id}) { | ||||
|           id | ||||
|           name | ||||
|  | ||||
|         channels { | ||||
|           id | ||||
|           name | ||||
|           type | ||||
|           channels(filter: $filter) { | ||||
|             id | ||||
|             name | ||||
|             type | ||||
|           } | ||||
|           roles { | ||||
|             id | ||||
|             name | ||||
|           } | ||||
|           emojis { | ||||
|             id | ||||
|             name | ||||
|             url | ||||
|           } | ||||
|         } | ||||
|         roles { | ||||
|       } | ||||
|     } | ||||
|   `; | ||||
|  | ||||
|   static discordUsersQuery = ` | ||||
|     query DiscordUsersQuery { | ||||
|       discord { | ||||
|         users { | ||||
|           id | ||||
|           name | ||||
|         } | ||||
|         emojis { | ||||
|           id | ||||
|           name | ||||
|           url | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   `; | ||||
| @@ -29,10 +42,11 @@ export class Queries { | ||||
|       serverCount | ||||
|       servers(filter: $filter, page: $page, sort: $sort) { | ||||
|         id | ||||
|         discordId | ||||
|         name | ||||
|         iconURL | ||||
|         userCount | ||||
|         clients{ | ||||
|         clients { | ||||
|           id | ||||
|           discordId | ||||
|           name | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| import { GameServer, Server } from "../data/server.model"; | ||||
| import { User } from "../data/user.model"; | ||||
| import { AutoRole, AutoRoleRule } from "../data/auto_role.model"; | ||||
| import { Guild } from "../data/discord.model"; | ||||
| import { Discord, Guild } from "../data/discord.model"; | ||||
| import { Level } from "../data/level.model"; | ||||
| import { Achievement, AchievementAttribute } from "../data/achievement.model"; | ||||
| import { TechnicianConfig } from "../config/technician-config.model"; | ||||
| @@ -21,7 +21,7 @@ export interface ServerConfigQuery { | ||||
| } | ||||
|  | ||||
| export interface SingleDiscordQuery { | ||||
|   guilds: Guild[]; | ||||
|   discord: Discord; | ||||
| } | ||||
|  | ||||
| export interface UserListQuery { | ||||
|   | ||||
| @@ -162,7 +162,7 @@ | ||||
|  | ||||
|     <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-config-list translationKey="admin.settings.bot.technician_ids" [options]="possibleTechnicians" optionLabel="name" optionValue="id" [(data)]="config.technicianIds"></app-config-list> | ||||
|     <app-feature-flag-list [(data)]="config.featureFlags"></app-feature-flag-list> | ||||
|  | ||||
|     <div class="content-row"> | ||||
|   | ||||
| @@ -11,12 +11,13 @@ import { SpinnerService } from "src/app/services/spinner/spinner.service"; | ||||
| import { ToastService } from "src/app/services/toast/toast.service"; | ||||
| import { forkJoin, throwError } from "rxjs"; | ||||
| import { TechnicianConfig } from "../../../../../models/config/technician-config.model"; | ||||
| import { TechnicianConfigQuery } from "../../../../../models/graphql/query.model"; | ||||
| import { SingleDiscordQuery, TechnicianConfigQuery } from "../../../../../models/graphql/query.model"; | ||||
| import { Queries } from "../../../../../models/graphql/queries.model"; | ||||
| import { DataService } from "../../../../../services/data/data.service"; | ||||
| import { TechnicianConfigMutationResult } from "../../../../../models/graphql/result.model"; | ||||
| import { Mutations } from "../../../../../models/graphql/mutations.model"; | ||||
| import { AuthService } from "../../../../../services/auth/auth.service"; | ||||
| import { ChannelType, DiscordUser } from "../../../../../models/data/discord.model"; | ||||
|  | ||||
|  | ||||
| @Component({ | ||||
| @@ -54,6 +55,8 @@ export class SettingsComponent implements OnInit { | ||||
|     technicianIds: [] | ||||
|   }; | ||||
|  | ||||
|   possibleTechnicians?: DiscordUser[]; | ||||
|  | ||||
|   constructor( | ||||
|     private dataService: DataService, | ||||
|     private settingsService: SettingsService, | ||||
| @@ -76,7 +79,8 @@ export class SettingsComponent implements OnInit { | ||||
|         this.spinnerService.hideSpinner(); | ||||
|         return throwError(() => error); | ||||
|       })), | ||||
|       this.dataService.query<TechnicianConfigQuery>(Queries.technicianConfigQuery) | ||||
|       this.dataService.query<TechnicianConfigQuery>(Queries.technicianConfigQuery), | ||||
|       this.dataService.query<SingleDiscordQuery>(Queries.discordUsersQuery) | ||||
|     ]).subscribe(data => { | ||||
|       this.data = data[0]; | ||||
|       this.data.webVersion = this.settingsService.getWebVersion()?.getVersionString() ?? "0.0.0"; | ||||
| @@ -86,6 +90,7 @@ export class SettingsComponent implements OnInit { | ||||
|       } | ||||
|  | ||||
|       this.config = data[1].technicianConfig; | ||||
|       this.possibleTechnicians = data[2].discord.users ?? undefined; | ||||
|       this.initForms(); | ||||
|       this.spinnerService.hideSpinner(); | ||||
|     }); | ||||
|   | ||||
| @@ -19,10 +19,13 @@ | ||||
|             <td style="flex: 1;"> | ||||
|               <p-cellEditor> | ||||
|                 <ng-template pTemplate="input"> | ||||
|                   <input class="table-edit-input" pInputText type="text" [(ngModel)]="value.value"> | ||||
|                   <p-dropdown *ngIf="options" [options]="options" [optionLabel]="optionLabel ?? ''" [optionValue]="optionValue ?? ''" [(ngModel)]="value.value"></p-dropdown> | ||||
|  | ||||
|                   <input *ngIf="!options" class="table-edit-input" pInputText type="text" [(ngModel)]="value.value"> | ||||
|                 </ng-template> | ||||
|                 <ng-template pTemplate="output"> | ||||
|                   {{value.value}} | ||||
|                   <p-dropdown *ngIf="options" [options]="options" [optionLabel]="optionLabel ?? ''" [optionValue]="optionValue ?? ''" [(ngModel)]="value.value" [disabled]="true"></p-dropdown> | ||||
|                   <input *ngIf="!options" class="table-edit-input" pInputText type="text" [(ngModel)]="value.value" [disabled]="true"> | ||||
|                 </ng-template> | ||||
|               </p-cellEditor> | ||||
|             </td> | ||||
|   | ||||
| @@ -10,6 +10,9 @@ export class ConfigListComponent { | ||||
|   internal_data: any[] = []; | ||||
|  | ||||
|   @Input() translationKey: string = ""; | ||||
|   @Input() options?: Array<any>; | ||||
|   @Input() optionLabel?: string = ""; | ||||
|   @Input() optionValue?: string = ""; | ||||
|  | ||||
|   @Input() | ||||
|   set data(val: any[]) { | ||||
|   | ||||
| @@ -1,10 +1,11 @@ | ||||
| import { Injectable } from "@angular/core"; | ||||
| import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from "@angular/router"; | ||||
| import { ActivatedRoute, ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from "@angular/router"; | ||||
| import { catchError } from "rxjs/operators"; | ||||
| import { AuthService } from "src/app/services/auth/auth.service"; | ||||
| import { ThemeService } from "src/app/services/theme/theme.service"; | ||||
| import { SidebarService } from "../../../../services/sidebar/sidebar.service"; | ||||
| import { MemberRoles } from "../../../../models/auth/auth-user.dto"; | ||||
| import { DataService } from "../../../../services/data/data.service"; | ||||
|  | ||||
| @Injectable({ | ||||
|   providedIn: "root" | ||||
| @@ -14,7 +15,9 @@ export class AuthGuard implements CanActivate { | ||||
|     private router: Router, | ||||
|     private authService: AuthService, | ||||
|     private themeService: ThemeService, | ||||
|     private sidebarService: SidebarService | ||||
|     private sidebarService: SidebarService, | ||||
|     private data: DataService, | ||||
|     private route: ActivatedRoute | ||||
|   ) { | ||||
|   } | ||||
|  | ||||
| @@ -47,8 +50,13 @@ export class AuthGuard implements CanActivate { | ||||
|     if (memberRole !== undefined) { | ||||
|       let userHasAccess = false; | ||||
|       let authUser = await this.authService.getLoggedInUser(); | ||||
|       let server = route.params["serverId"]; | ||||
|  | ||||
|       if (!authUser || !authUser.users) { | ||||
|         return true; | ||||
|       } | ||||
|       authUser?.users?.forEach(u => { | ||||
|         if (u.server === +(this.sidebarService.server$.value?.id ?? 0)) { | ||||
|         if (u.server === +(server ?? 0)) { | ||||
|           if ( | ||||
|             memberRole === MemberRoles.Moderator && u.isModerator || | ||||
|             memberRole === MemberRoles.Admin && u.isAdmin || | ||||
|   | ||||
| @@ -105,9 +105,11 @@ export class AutoRolesRulesComponent extends ComponentWithTable implements OnIni | ||||
|           filter: { | ||||
|             id: server.discordId | ||||
|           } | ||||
|         } | ||||
|         }, | ||||
|       ).subscribe(data => { | ||||
|         this.guild = data.guilds[0]; | ||||
|         if (data.discord.guilds) { | ||||
|           this.guild = data.discord.guilds[0]; | ||||
|         } | ||||
|         this.emojis = this.guild.emojis | ||||
|           .map(x => { | ||||
|             return { label: x.name, value: x }; | ||||
|   | ||||
| @@ -77,7 +77,7 @@ export class AutoRolesComponent extends ComponentWithTable implements OnInit, On | ||||
|     private sidebar: SidebarService, | ||||
|     private route: ActivatedRoute | ||||
|   ) { | ||||
|     super('auto-role', ['id', 'channel_id', 'channel_name', 'message_id', 'rule_count']) | ||||
|     super("auto-role", ["id", "channel_id", "channel_name", "message_id", "rule_count"]); | ||||
|   } | ||||
|  | ||||
|   public ngOnInit(): void { | ||||
| @@ -87,14 +87,16 @@ export class AutoRolesComponent extends ComponentWithTable implements OnInit, On | ||||
|       this.server = server; | ||||
|       this.spinner.showSpinner(); | ||||
|       this.data.query<SingleDiscordQuery>(Queries.guildsQuery, { | ||||
|           id: server?.discordId, | ||||
|           filter: { | ||||
|             id: server?.discordId | ||||
|             type: ChannelType.text | ||||
|           } | ||||
|         } | ||||
|       ).subscribe(data => { | ||||
|         this.guild = data.guilds[0]; | ||||
|         if (data.discord.guilds) { | ||||
|           this.guild = data.discord.guilds[0]; | ||||
|         } | ||||
|         this.channels = this.guild.channels | ||||
|           .filter(x => x.type === ChannelType.text) | ||||
|           .map(x => { | ||||
|             return { label: x.name, value: x }; | ||||
|           }); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user