/*
* 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 {UserRecord} from '@app/records/UserRecord';
import UserStore from '@app/stores/UserStore';
import {webhookUrl} from '@app/utils/UrlUtils';
import type {UserPartial} from '@fluxer/schema/src/domains/user/UserResponseSchemas';
import type {Webhook} from '@fluxer/schema/src/domains/webhook/WebhookSchemas';
import * as SnowflakeUtils from '@fluxer/snowflake/src/SnowflakeUtils';
export class WebhookRecord {
readonly id: string;
readonly guildId: string;
readonly channelId: string;
readonly name: string;
readonly avatar: string | null;
readonly token: string;
readonly creatorId: string;
readonly createdAt: Date;
private readonly creatorSnapshot: UserPartial;
constructor(webhook: Webhook) {
this.id = webhook.id;
this.guildId = webhook.guild_id;
this.channelId = webhook.channel_id;
this.name = webhook.name;
this.avatar = webhook.avatar ?? null;
this.token = webhook.token;
this.creatorId = webhook.user.id;
this.createdAt = new Date(SnowflakeUtils.extractTimestamp(webhook.id));
this.creatorSnapshot = webhook.user;
UserStore.cacheUsers([webhook.user]);
}
get webhookUrl(): string {
return webhookUrl(this.id, this.token);
}
get creator(): UserRecord | null {
return UserStore.getUser(this.creatorId)!;
}
get displayName(): string {
return this.name;
}
withUpdates(updates: Partial): WebhookRecord {
return new WebhookRecord({
id: updates.id ?? this.id,
guild_id: updates.guild_id ?? this.guildId,
channel_id: updates.channel_id ?? this.channelId,
user: updates.user ?? this.creatorSnapshot,
name: updates.name ?? this.name,
avatar: updates.avatar ?? this.avatar,
token: updates.token ?? this.token,
});
}
toJSON(): Webhook {
const creator = this.creator;
return {
id: this.id,
guild_id: this.guildId,
channel_id: this.channelId,
user: creator ? creator.toJSON() : this.creatorSnapshot,
name: this.name,
avatar: this.avatar,
token: this.token,
};
}
}