/* * Copyright (C) 2026 Fluxer Contributors * * This file is part of Fluxer. * * Fluxer is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Fluxer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with Fluxer. If not, see . */ import type {EmojiID, GuildID, StickerID, UserID} from '~/BrandedTypes'; import type { GuildEmojiResponse, GuildEmojiWithUserResponse, GuildStickerResponse, GuildStickerWithUserResponse, } from '~/guild/GuildModel'; import type {AvatarService} from '~/infrastructure/AvatarService'; import type {IAssetDeletionQueue} from '~/infrastructure/IAssetDeletionQueue'; import type {IGatewayService} from '~/infrastructure/IGatewayService'; import type {SnowflakeService} from '~/infrastructure/SnowflakeService'; import type {UserCacheService} from '~/infrastructure/UserCacheService'; import type {User} from '~/Models'; import type {RequestCache} from '~/middleware/RequestCacheMiddleware'; import type {UserPartialResponse} from '~/user/UserModel'; import type {GuildAuditLogService} from '../GuildAuditLogService'; import type {IGuildRepository} from '../IGuildRepository'; import {ContentHelpers} from './content/ContentHelpers'; import {EmojiService} from './content/EmojiService'; import {ExpressionAssetPurger} from './content/ExpressionAssetPurger'; import {StickerService} from './content/StickerService'; export class GuildContentService { private readonly contentHelpers: ContentHelpers; private readonly emojiService: EmojiService; private readonly stickerService: StickerService; constructor( guildRepository: IGuildRepository, userCacheService: UserCacheService, gatewayService: IGatewayService, avatarService: AvatarService, snowflakeService: SnowflakeService, guildAuditLogService: GuildAuditLogService, assetDeletionQueue: IAssetDeletionQueue, ) { this.contentHelpers = new ContentHelpers(gatewayService, guildAuditLogService); const expressionAssetPurger = new ExpressionAssetPurger(assetDeletionQueue); this.emojiService = new EmojiService( guildRepository, userCacheService, gatewayService, avatarService, snowflakeService, this.contentHelpers, expressionAssetPurger, ); this.stickerService = new StickerService( guildRepository, userCacheService, gatewayService, avatarService, snowflakeService, this.contentHelpers, expressionAssetPurger, ); } async getEmojis(params: { userId: UserID; guildId: GuildID; requestCache: RequestCache; }): Promise> { return this.emojiService.getEmojis(params); } async getEmojiUser(params: { userId: UserID; guildId: GuildID; emojiId: EmojiID; requestCache: RequestCache; }): Promise { return this.emojiService.getEmojiUser(params); } async createEmoji( params: {user: User; guildId: GuildID; name: string; image: string}, auditLogReason?: string | null, ): Promise { return this.emojiService.createEmoji(params, auditLogReason); } async bulkCreateEmojis( params: {user: User; guildId: GuildID; emojis: Array<{name: string; image: string}>}, auditLogReason?: string | null, ): Promise<{ success: Array; failed: Array<{name: string; error: string}>; }> { return this.emojiService.bulkCreateEmojis(params, auditLogReason); } async updateEmoji( params: {userId: UserID; guildId: GuildID; emojiId: EmojiID; name: string}, auditLogReason?: string | null, ): Promise { return this.emojiService.updateEmoji(params, auditLogReason); } async deleteEmoji( params: {userId: UserID; guildId: GuildID; emojiId: EmojiID; purge?: boolean}, auditLogReason?: string | null, ): Promise { return this.emojiService.deleteEmoji(params, auditLogReason); } async getStickers(params: { userId: UserID; guildId: GuildID; requestCache: RequestCache; }): Promise> { return this.stickerService.getStickers(params); } async getStickerUser(params: { userId: UserID; guildId: GuildID; stickerId: StickerID; requestCache: RequestCache; }): Promise { return this.stickerService.getStickerUser(params); } async createSticker( params: { user: User; guildId: GuildID; name: string; description?: string | null; tags: Array; image: string; }, auditLogReason?: string | null, ): Promise { return this.stickerService.createSticker(params, auditLogReason); } async bulkCreateStickers( params: { user: User; guildId: GuildID; stickers: Array<{name: string; description?: string | null; tags: Array; image: string}>; }, auditLogReason?: string | null, ): Promise<{ success: Array; failed: Array<{name: string; error: string}>; }> { return this.stickerService.bulkCreateStickers(params, auditLogReason); } async updateSticker( params: { userId: UserID; guildId: GuildID; stickerId: StickerID; name: string; description?: string | null; tags: Array; }, auditLogReason?: string | null, ): Promise { return this.stickerService.updateSticker(params, auditLogReason); } async deleteSticker( params: {userId: UserID; guildId: GuildID; stickerId: StickerID; purge?: boolean}, auditLogReason?: string | null, ): Promise { return this.stickerService.deleteSticker(params, auditLogReason); } }