mirror of
https://github.com/fluxerapp/fluxer
synced 2026-10-18 21:45:31 +09:00
200 lines
4.3 KiB
TypeScript
200 lines
4.3 KiB
TypeScript
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
import type {LimitKey} from '@fluxer/constants/src/LimitConfigMetadata';
|
|
|
|
type PerkStatus = 'available' | 'coming_soon' | 'beta';
|
|
type PerkType = 'boolean' | 'numeric' | 'text';
|
|
|
|
interface BasePerk {
|
|
id: string;
|
|
type: PerkType;
|
|
status: PerkStatus;
|
|
i18nKey: string;
|
|
}
|
|
|
|
export interface BooleanTierPerk extends BasePerk {
|
|
type: 'boolean';
|
|
restrictedValue: boolean;
|
|
stockValue: boolean;
|
|
limitKey?: LimitKey;
|
|
}
|
|
|
|
export interface NumericTierPerk extends BasePerk {
|
|
type: 'numeric';
|
|
restrictedValue: number;
|
|
stockValue: number;
|
|
limitKey?: LimitKey;
|
|
unit?: 'count' | 'bytes' | 'characters';
|
|
}
|
|
|
|
export interface TextTierPerk extends BasePerk {
|
|
type: 'text';
|
|
restrictedValueI18nKey: string;
|
|
stockValueI18nKey: string;
|
|
limitKey?: LimitKey;
|
|
}
|
|
|
|
export type LimitTierPerk = BooleanTierPerk | NumericTierPerk | TextTierPerk;
|
|
|
|
export function isBooleanTierPerk(perk: LimitTierPerk): perk is BooleanTierPerk {
|
|
return perk.type === 'boolean';
|
|
}
|
|
|
|
export function isNumericTierPerk(perk: LimitTierPerk): perk is NumericTierPerk {
|
|
return perk.type === 'numeric';
|
|
}
|
|
|
|
export function isTextTierPerk(perk: LimitTierPerk): perk is TextTierPerk {
|
|
return perk.type === 'text';
|
|
}
|
|
|
|
export const LIMIT_TIER_PERKS: ReadonlyArray<LimitTierPerk> = [
|
|
{
|
|
id: 'custom_discriminator',
|
|
type: 'boolean',
|
|
status: 'available',
|
|
i18nKey: 'custom_4_digit_username_tag',
|
|
restrictedValue: false,
|
|
stockValue: true,
|
|
limitKey: 'feature_custom_discriminator',
|
|
},
|
|
{
|
|
id: 'per_guild_profiles',
|
|
type: 'boolean',
|
|
status: 'available',
|
|
i18nKey: 'per_community_profiles',
|
|
restrictedValue: false,
|
|
stockValue: true,
|
|
limitKey: 'feature_per_guild_profiles',
|
|
},
|
|
{
|
|
id: 'profile_badge',
|
|
type: 'boolean',
|
|
status: 'available',
|
|
i18nKey: 'profile_badge',
|
|
restrictedValue: false,
|
|
stockValue: true,
|
|
},
|
|
{
|
|
id: 'custom_video_backgrounds',
|
|
type: 'numeric',
|
|
status: 'beta',
|
|
i18nKey: 'custom_video_backgrounds',
|
|
restrictedValue: 1,
|
|
stockValue: 15,
|
|
limitKey: 'max_custom_backgrounds',
|
|
unit: 'count',
|
|
},
|
|
{
|
|
id: 'entrance_sounds',
|
|
type: 'boolean',
|
|
status: 'beta',
|
|
i18nKey: 'entrance_sounds',
|
|
restrictedValue: false,
|
|
stockValue: true,
|
|
limitKey: 'feature_voice_entrance_sounds',
|
|
},
|
|
{
|
|
id: 'max_guilds',
|
|
type: 'numeric',
|
|
status: 'available',
|
|
i18nKey: 'communities',
|
|
restrictedValue: 100,
|
|
stockValue: 200,
|
|
limitKey: 'max_guilds',
|
|
unit: 'count',
|
|
},
|
|
{
|
|
id: 'max_message_length',
|
|
type: 'numeric',
|
|
status: 'available',
|
|
i18nKey: 'message_character_limit',
|
|
restrictedValue: 2000,
|
|
stockValue: 4000,
|
|
limitKey: 'max_message_length',
|
|
unit: 'characters',
|
|
},
|
|
{
|
|
id: 'max_bookmarks',
|
|
type: 'numeric',
|
|
status: 'available',
|
|
i18nKey: 'bookmarked_messages',
|
|
restrictedValue: 50,
|
|
stockValue: 300,
|
|
limitKey: 'max_bookmarks',
|
|
unit: 'count',
|
|
},
|
|
{
|
|
id: 'max_attachment_file_size',
|
|
type: 'numeric',
|
|
status: 'available',
|
|
i18nKey: 'file_upload_size',
|
|
restrictedValue: 25 * 1024 * 1024,
|
|
stockValue: 500 * 1024 * 1024,
|
|
limitKey: 'max_attachment_file_size',
|
|
unit: 'bytes',
|
|
},
|
|
{
|
|
id: 'max_favorite_memes',
|
|
type: 'numeric',
|
|
status: 'beta',
|
|
i18nKey: 'saved_media',
|
|
restrictedValue: 50,
|
|
stockValue: 500,
|
|
limitKey: 'max_favorite_memes',
|
|
unit: 'count',
|
|
},
|
|
{
|
|
id: 'use_animated_emojis',
|
|
type: 'boolean',
|
|
status: 'available',
|
|
i18nKey: 'use_animated_emojis',
|
|
restrictedValue: true,
|
|
stockValue: true,
|
|
},
|
|
{
|
|
id: 'global_expressions',
|
|
type: 'boolean',
|
|
status: 'available',
|
|
i18nKey: 'global_emoji_sticker_access',
|
|
restrictedValue: false,
|
|
stockValue: true,
|
|
limitKey: 'feature_global_expressions',
|
|
},
|
|
{
|
|
id: 'video_quality',
|
|
type: 'text',
|
|
status: 'available',
|
|
i18nKey: 'video_quality',
|
|
restrictedValueI18nKey: 'video_quality_restricted',
|
|
stockValueI18nKey: 'video_quality_stock',
|
|
limitKey: 'feature_higher_video_quality',
|
|
},
|
|
{
|
|
id: 'animated_profile',
|
|
type: 'boolean',
|
|
status: 'available',
|
|
i18nKey: 'animated_avatars_and_banners',
|
|
restrictedValue: false,
|
|
stockValue: true,
|
|
limitKey: 'feature_animated_avatar',
|
|
},
|
|
{
|
|
id: 'early_access',
|
|
type: 'boolean',
|
|
status: 'available',
|
|
i18nKey: 'early_access',
|
|
restrictedValue: false,
|
|
stockValue: true,
|
|
limitKey: 'feature_early_access',
|
|
},
|
|
{
|
|
id: 'custom_themes',
|
|
type: 'boolean',
|
|
status: 'available',
|
|
i18nKey: 'custom_themes',
|
|
restrictedValue: true,
|
|
stockValue: true,
|
|
},
|
|
] as const;
|