mirror of
https://github.com/fluxerapp/fluxer
synced 2026-10-17 04:55:42 +09:00
650 lines
26 KiB
TypeScript
650 lines
26 KiB
TypeScript
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
import {DeletionReasons} from '@fluxer/constants/src/Core';
|
|
import {
|
|
PremiumFlags,
|
|
PremiumFlagsDescriptions,
|
|
UserFlags,
|
|
UserFlagsDescriptions,
|
|
} from '@fluxer/constants/src/UserConstants';
|
|
import {ADMIN_ACL_COUNT, AdminAclType} from '@fluxer/schema/src/domains/admin/AdminAclType';
|
|
import {CalendarDateType} from '@fluxer/schema/src/primitives/DateValidators';
|
|
import {NSFWLevelSchema} from '@fluxer/schema/src/primitives/GuildValidators';
|
|
import {createQueryIntegerType, QueryBooleanType} from '@fluxer/schema/src/primitives/QueryValidators';
|
|
import {
|
|
createBitflagInt32Type,
|
|
createBitflagStringType,
|
|
createInt32EnumType,
|
|
createNamedStringLiteralUnion,
|
|
createStringType,
|
|
Int32Type,
|
|
SnowflakeStringType,
|
|
SnowflakeType,
|
|
withFieldDescription,
|
|
} from '@fluxer/schema/src/primitives/SchemaPrimitives';
|
|
import {DiscriminatorType, EmailType, UsernameType} from '@fluxer/schema/src/primitives/UserValidators';
|
|
import {z} from 'zod';
|
|
|
|
export const UserAdminResponseSchema = z.object({
|
|
id: SnowflakeStringType,
|
|
username: z.string(),
|
|
discriminator: Int32Type,
|
|
global_name: z.string().nullable(),
|
|
bot: z.boolean(),
|
|
system: z.boolean(),
|
|
flags: createBitflagStringType(UserFlags, UserFlagsDescriptions, 'User account flags (64-bit)', 'UserFlags'),
|
|
premium_flags: createBitflagInt32Type(
|
|
PremiumFlags,
|
|
PremiumFlagsDescriptions,
|
|
'User premium-related flags (32-bit)',
|
|
'PremiumFlags',
|
|
),
|
|
avatar: z.string().nullable(),
|
|
banner: z.string().nullable(),
|
|
bio: z.string().nullable(),
|
|
pronouns: z.string().nullable(),
|
|
accent_color: Int32Type.nullable(),
|
|
email: z.string().nullable(),
|
|
email_verified: z.boolean(),
|
|
email_bounced: z.boolean(),
|
|
date_of_birth: z.string().nullable(),
|
|
locale: z.string().nullable(),
|
|
premium_type: Int32Type.nullable(),
|
|
premium_since: z.string().nullable(),
|
|
premium_until: z.string().nullable(),
|
|
premium_grace_ends_at: z.string().nullable(),
|
|
premium_lifetime_sequence: Int32Type.nullable(),
|
|
temp_banned_until: z.string().nullable(),
|
|
pending_deletion_at: z.string().nullable(),
|
|
pending_bulk_message_deletion_at: z.string().nullable(),
|
|
deletion_reason_code: Int32Type.nullable(),
|
|
deletion_public_reason: z.string().nullable(),
|
|
deletion_audit_log_reason: z
|
|
.string()
|
|
.nullable()
|
|
.describe('Private reason recorded with the pending deletion, null without the audit log view permission'),
|
|
deletion_scheduled_by: SnowflakeStringType.nullable().describe(
|
|
'ID of the account that scheduled the pending deletion, null when it was not recorded',
|
|
),
|
|
deletion_scheduled_at: z.string().nullable().describe('ISO 8601 timestamp when the pending deletion was scheduled'),
|
|
acls: z.array(z.string()).max(ADMIN_ACL_COUNT),
|
|
traits: z.array(z.string()).max(100),
|
|
has_totp: z.boolean(),
|
|
authenticator_types: z.array(Int32Type).max(10),
|
|
last_active_at: z.string().nullable(),
|
|
last_active_ip: z.string().nullable(),
|
|
last_active_ip_reverse: z.string().nullable(),
|
|
last_active_location: z.string().nullable(),
|
|
});
|
|
|
|
export type UserAdminResponse = z.infer<typeof UserAdminResponseSchema>;
|
|
|
|
const LookupUserByQueryRequest = z.object({
|
|
query: createStringType(1, 1024),
|
|
});
|
|
|
|
const LookupUserByIdsRequest = z.object({
|
|
user_ids: z.array(SnowflakeType).max(100),
|
|
});
|
|
|
|
export const LookupUserRequest = z.union([LookupUserByQueryRequest, LookupUserByIdsRequest]);
|
|
|
|
export type LookupUserRequest = z.infer<typeof LookupUserRequest>;
|
|
|
|
const UserContactChangeLogEntrySchema = z.object({
|
|
event_id: z.string(),
|
|
field: z.string(),
|
|
old_value: z.string().nullable(),
|
|
new_value: z.string().nullable(),
|
|
reason: z.string().nullable(),
|
|
actor_user_id: z.string().nullable(),
|
|
event_at: z.string(),
|
|
});
|
|
|
|
export const ListUserChangeLogResponseSchema = z.object({
|
|
entries: z.array(UserContactChangeLogEntrySchema).max(200),
|
|
next_page_token: z.string().nullable(),
|
|
});
|
|
|
|
export const AdminUsersMeResponse = z.object({
|
|
user: UserAdminResponseSchema,
|
|
});
|
|
|
|
export type AdminUsersMeResponse = z.infer<typeof AdminUsersMeResponse>;
|
|
|
|
export const UserMutationResponse = AdminUsersMeResponse;
|
|
|
|
export type UserMutationResponse = z.infer<typeof UserMutationResponse>;
|
|
|
|
export const LookupUserResponse = z.object({
|
|
users: z.array(UserAdminResponseSchema),
|
|
});
|
|
|
|
export type LookupUserResponse = z.infer<typeof LookupUserResponse>;
|
|
|
|
const UserSessionResponse = z.object({
|
|
session_id_hash: createStringType(8, 256).describe('Hashed session identifier (base64url)'),
|
|
created_at: z.string().describe('ISO timestamp when the session was created'),
|
|
approx_last_used_at: z.string().describe('ISO timestamp of the session last usage (approximate)'),
|
|
client_ip: createStringType(1, 64).describe('Client IP address'),
|
|
client_ip_reverse: z.string().nullable().describe('Reverse DNS hostname for the client IP (PTR), if available'),
|
|
client_os: z.string().nullable().describe('Client operating system, if detected'),
|
|
client_platform: z.string().nullable().describe('Client platform, if detected'),
|
|
client_location: z.string().nullable().describe('Approximate geo location label for the client IP, if available'),
|
|
deleted_at: z.string().nullable().describe('ISO timestamp when the session was terminated, or null if still active'),
|
|
});
|
|
|
|
export const ListUserSessionsResponse = z.object({
|
|
sessions: z.array(UserSessionResponse),
|
|
});
|
|
|
|
export type ListUserSessionsResponse = z.infer<typeof ListUserSessionsResponse>;
|
|
|
|
export const ListUserDmChannelsRequest = z
|
|
.object({
|
|
user_id: SnowflakeType.describe('ID of the user to list DM channels for'),
|
|
before: SnowflakeType.optional().describe('Return channels with IDs lower than this channel ID'),
|
|
after: SnowflakeType.optional().describe('Return channels with IDs higher than this channel ID'),
|
|
limit: z.number().int().min(1).max(200).default(50).describe('Maximum number of DM channels to return'),
|
|
})
|
|
.refine((value) => value.before === undefined || value.after === undefined, {
|
|
error: 'before and after cannot both be provided',
|
|
});
|
|
|
|
export type ListUserDmChannelsRequest = z.infer<typeof ListUserDmChannelsRequest>;
|
|
|
|
const AdminResolvedUserSchema = z.object({
|
|
id: SnowflakeStringType,
|
|
username: z.string(),
|
|
discriminator: z.string(),
|
|
global_name: z.string().nullable(),
|
|
avatar: z.string().nullable(),
|
|
});
|
|
|
|
const AdminUserDmChannelSchema = z.object({
|
|
channel_id: SnowflakeStringType,
|
|
channel_type: Int32Type.nullable(),
|
|
channel_nsfw: z.boolean().nullable(),
|
|
guild_nsfw_level: NSFWLevelSchema.nullable(),
|
|
recipient_ids: z.array(SnowflakeStringType).max(100),
|
|
recipients: z.array(AdminResolvedUserSchema).max(100),
|
|
last_message_id: SnowflakeStringType.nullable(),
|
|
is_open: z.boolean(),
|
|
name: z.string().nullable(),
|
|
icon: z.string().nullable(),
|
|
owner_id: SnowflakeStringType.nullable(),
|
|
});
|
|
|
|
const ListUserDmChannelsResponse = z.object({
|
|
channels: z.array(AdminUserDmChannelSchema).max(200),
|
|
});
|
|
export const ListUserGroupDmChannelsRequest = z.object({
|
|
user_id: SnowflakeType.describe('ID of the user to list group DM channels for'),
|
|
});
|
|
|
|
export type ListUserGroupDmChannelsRequest = z.infer<typeof ListUserGroupDmChannelsRequest>;
|
|
|
|
const ListUserGroupDmChannelsResponse = z.object({
|
|
channels: z.array(AdminUserDmChannelSchema).max(500),
|
|
});
|
|
|
|
export const TerminateSessionsResponse = z.object({
|
|
terminated_count: Int32Type,
|
|
});
|
|
|
|
export type TerminateSessionsResponse = z.infer<typeof TerminateSessionsResponse>;
|
|
|
|
const UserFlagValueType = createBitflagStringType(
|
|
UserFlags,
|
|
UserFlagsDescriptions,
|
|
'A single user flag value to add or remove',
|
|
'UserFlags',
|
|
);
|
|
const PremiumFlagValueType = createBitflagInt32Type(
|
|
PremiumFlags,
|
|
PremiumFlagsDescriptions,
|
|
'A single premium flag value to add or remove',
|
|
'PremiumFlags',
|
|
);
|
|
const UpdateUserFlagsRequest = z.object({
|
|
user_id: SnowflakeType.describe('ID of the user to update'),
|
|
add_flags: z.array(UserFlagValueType).max(64).default([]).describe('User flags to add'),
|
|
remove_flags: z.array(UserFlagValueType).max(64).default([]).describe('User flags to remove'),
|
|
});
|
|
|
|
const UpdatePremiumFlagsRequest = z.object({
|
|
user_id: SnowflakeType.describe('ID of the user to update'),
|
|
add_flags: z.array(PremiumFlagValueType).max(64).default([]).describe('Premium flags to add'),
|
|
remove_flags: z.array(PremiumFlagValueType).max(64).default([]).describe('Premium flags to remove'),
|
|
});
|
|
|
|
export const DisableMfaRequest = z.object({
|
|
user_id: SnowflakeType.describe('ID of the user to disable MFA for'),
|
|
});
|
|
|
|
export type DisableMfaRequest = z.infer<typeof DisableMfaRequest>;
|
|
|
|
export const CancelBulkMessageDeletionRequest = z.object({
|
|
user_id: SnowflakeType.describe('ID of the user to cancel bulk message deletion for'),
|
|
});
|
|
|
|
export type CancelBulkMessageDeletionRequest = z.infer<typeof CancelBulkMessageDeletionRequest>;
|
|
|
|
const UserProfileFieldEnum = createNamedStringLiteralUnion(
|
|
[
|
|
['avatar', 'avatar', 'User profile avatar image'],
|
|
['banner', 'banner', 'User profile banner image'],
|
|
['bio', 'bio', 'User biography text'],
|
|
['pronouns', 'pronouns', 'User pronouns'],
|
|
['global_name', 'global_name', 'User display name'],
|
|
],
|
|
'User profile field that can be cleared',
|
|
);
|
|
export const ClearUserFieldsRequest = z.object({
|
|
user_id: SnowflakeType.describe('ID of the user to clear fields for'),
|
|
fields: z.array(UserProfileFieldEnum).max(10).describe('List of profile fields to clear'),
|
|
});
|
|
|
|
export type ClearUserFieldsRequest = z.infer<typeof ClearUserFieldsRequest>;
|
|
|
|
export const SetUserBotStatusRequest = z.object({
|
|
user_id: SnowflakeType.describe('ID of the user to update'),
|
|
bot: z.boolean().describe('Whether the user should be marked as a bot'),
|
|
});
|
|
|
|
export type SetUserBotStatusRequest = z.infer<typeof SetUserBotStatusRequest>;
|
|
|
|
export const SetUserSystemStatusRequest = z.object({
|
|
user_id: SnowflakeType.describe('ID of the user to update'),
|
|
system: z.boolean().describe('Whether the user should be marked as a system user'),
|
|
});
|
|
|
|
export type SetUserSystemStatusRequest = z.infer<typeof SetUserSystemStatusRequest>;
|
|
|
|
export const VerifyUserEmailRequest = z.object({
|
|
user_id: SnowflakeType.describe('ID of the user to verify email for'),
|
|
});
|
|
|
|
export type VerifyUserEmailRequest = z.infer<typeof VerifyUserEmailRequest>;
|
|
|
|
export const ResendVerificationEmailRequest = z.object({
|
|
user_id: SnowflakeType.describe('ID of the user to resend verification email to'),
|
|
});
|
|
|
|
export type ResendVerificationEmailRequest = z.infer<typeof ResendVerificationEmailRequest>;
|
|
|
|
export const SendPasswordResetRequest = z.object({
|
|
user_id: SnowflakeType.describe('ID of the user to send password reset to'),
|
|
});
|
|
|
|
export type SendPasswordResetRequest = z.infer<typeof SendPasswordResetRequest>;
|
|
|
|
export const AdminPasswordResetLinkResponse = z.object({
|
|
url: z.string().describe('Password reset link to hand to the user. It is shown only once'),
|
|
expires_at: z.iso.datetime().describe('ISO 8601 timestamp when the link stops working'),
|
|
});
|
|
|
|
export type AdminPasswordResetLinkResponse = z.infer<typeof AdminPasswordResetLinkResponse>;
|
|
|
|
export const ChangeUsernameRequest = z.object({
|
|
user_id: SnowflakeType.describe('ID of the user to change username for'),
|
|
username: UsernameType.describe('New username for the user'),
|
|
discriminator: DiscriminatorType.optional().describe('Legacy discriminator value'),
|
|
});
|
|
|
|
export type ChangeUsernameRequest = z.infer<typeof ChangeUsernameRequest>;
|
|
|
|
export const ChangeEmailRequest = z.object({
|
|
user_id: SnowflakeType.describe('ID of the user to change email for'),
|
|
email: EmailType.describe('New email address for the user'),
|
|
});
|
|
|
|
export type ChangeEmailRequest = z.infer<typeof ChangeEmailRequest>;
|
|
|
|
export const TerminateSessionsRequest = z.object({
|
|
user_id: SnowflakeType.describe('ID of the user to terminate sessions for'),
|
|
});
|
|
|
|
export type TerminateSessionsRequest = z.infer<typeof TerminateSessionsRequest>;
|
|
|
|
export const TempBanUserRequest = z.object({
|
|
user_id: SnowflakeType.describe('ID of the user to temporarily ban'),
|
|
duration_hours: z
|
|
.number()
|
|
.int()
|
|
.min(0)
|
|
.max(8760)
|
|
.describe('Duration of the ban in hours. Use 0 for a permanent ban (until manually unbanned).'),
|
|
reason: createStringType(0, 512).optional().describe('Reason shown to the user in the ban email'),
|
|
notify_user: z
|
|
.boolean()
|
|
.default(true)
|
|
.describe('Whether to email the user about a temporary ban. Permanent bans (duration_hours 0) are never emailed'),
|
|
});
|
|
|
|
export type TempBanUserRequest = z.infer<typeof TempBanUserRequest>;
|
|
|
|
const DeletionReasonCodeType = createInt32EnumType(
|
|
Object.entries(DeletionReasons).map(([name, value]) => [value, name] as const),
|
|
'Reason the account was scheduled for deletion',
|
|
'DeletionReasonCode',
|
|
);
|
|
|
|
export const ScheduleAccountDeletionRequest = z.object({
|
|
user_id: SnowflakeType.describe('ID of the user to schedule deletion for'),
|
|
reason_code: withFieldDescription(DeletionReasonCodeType, 'Code indicating the reason for deletion'),
|
|
public_reason: createStringType(0, 512).optional().describe('Public-facing reason for the deletion'),
|
|
days_until_deletion: z
|
|
.number()
|
|
.int()
|
|
.min(1)
|
|
.max(365)
|
|
.default(60)
|
|
.describe('Number of days until the account is deleted'),
|
|
replace_pending_deletion_at: z.iso
|
|
.datetime()
|
|
.optional()
|
|
.describe(
|
|
'pending_deletion_at of the deletion this request replaces. Required when a deletion is already scheduled for the account',
|
|
),
|
|
notify_user: z.boolean().default(true).describe('Whether to email the user about the scheduled deletion'),
|
|
});
|
|
|
|
export type ScheduleAccountDeletionRequest = z.infer<typeof ScheduleAccountDeletionRequest>;
|
|
|
|
export const SetUserAclsRequest = z.object({
|
|
user_id: SnowflakeType.describe('ID of the user to set ACLs for'),
|
|
acls: z.array(AdminAclType).max(ADMIN_ACL_COUNT).describe('List of access control permissions to assign'),
|
|
});
|
|
|
|
export type SetUserAclsRequest = z.infer<typeof SetUserAclsRequest>;
|
|
|
|
export const SetUserTraitsRequest = z.object({
|
|
user_id: SnowflakeType.describe('ID of the user to set traits for'),
|
|
traits: z.array(createStringType(1, 128)).max(100).describe('List of traits to assign to the user'),
|
|
});
|
|
|
|
export type SetUserTraitsRequest = z.infer<typeof SetUserTraitsRequest>;
|
|
|
|
export const ChangeDobRequest = z.object({
|
|
user_id: SnowflakeType.describe('ID of the user to change date of birth for'),
|
|
date_of_birth: createStringType(10, 10)
|
|
.refine((value) => CalendarDateType.safeParse(value).success, 'Invalid date format')
|
|
.describe('New date of birth in YYYY-MM-DD format'),
|
|
});
|
|
|
|
export type ChangeDobRequest = z.infer<typeof ChangeDobRequest>;
|
|
|
|
export const BulkUpdateUserFlagsRequest = z.object({
|
|
user_ids: z.array(SnowflakeType).max(1000).describe('List of user IDs to update'),
|
|
add_flags: z.array(UserFlagValueType).max(64).default([]).describe('User flags to add to all specified users'),
|
|
remove_flags: z
|
|
.array(UserFlagValueType)
|
|
.max(64)
|
|
.default([])
|
|
.describe('User flags to remove from all specified users'),
|
|
});
|
|
|
|
export type BulkUpdateUserFlagsRequest = z.infer<typeof BulkUpdateUserFlagsRequest>;
|
|
|
|
export const BulkScheduleUserDeletionRequest = ScheduleAccountDeletionRequest.omit({
|
|
user_id: true,
|
|
replace_pending_deletion_at: true,
|
|
}).extend({
|
|
user_ids: z.array(SnowflakeType).max(1000).describe('List of user IDs to schedule deletion for'),
|
|
days_until_deletion: ScheduleAccountDeletionRequest.shape.days_until_deletion.describe(
|
|
'Number of days until the accounts are deleted',
|
|
),
|
|
});
|
|
|
|
export type BulkScheduleUserDeletionRequest = z.infer<typeof BulkScheduleUserDeletionRequest>;
|
|
|
|
export const ListWebAuthnCredentialsRequest = z.object({
|
|
user_id: SnowflakeType.describe('ID of the user to list WebAuthn credentials for'),
|
|
});
|
|
|
|
export type ListWebAuthnCredentialsRequest = z.infer<typeof ListWebAuthnCredentialsRequest>;
|
|
|
|
export const DeleteWebAuthnCredentialRequest = z.object({
|
|
user_id: SnowflakeType.describe('ID of the user who owns the credential'),
|
|
credential_id: createStringType(1, 512).describe('ID of the WebAuthn credential to delete'),
|
|
});
|
|
|
|
export type DeleteWebAuthnCredentialRequest = z.infer<typeof DeleteWebAuthnCredentialRequest>;
|
|
|
|
export const ListUserChangeLogRequest = z.object({
|
|
user_id: SnowflakeType.describe('ID of the user to list change logs for'),
|
|
limit: z.number().int().min(1).max(200).default(50).describe('Maximum number of entries to return'),
|
|
page_token: z.string().optional().describe('Pagination token for the next page of results'),
|
|
});
|
|
|
|
export type ListUserChangeLogRequest = z.infer<typeof ListUserChangeLogRequest>;
|
|
|
|
export const RelationshipCategoryEnum = z.enum(['friend', 'incoming_request', 'outgoing_request', 'blocked']);
|
|
|
|
export type RelationshipCategory = z.infer<typeof RelationshipCategoryEnum>;
|
|
|
|
export const ListUserRelationshipsRequest = z.object({
|
|
user_id: SnowflakeType.describe('ID of the user to list relationships for'),
|
|
});
|
|
|
|
export type ListUserRelationshipsRequest = z.infer<typeof ListUserRelationshipsRequest>;
|
|
|
|
export const AdminRelationshipEntrySchema = z.object({
|
|
target_user_id: SnowflakeStringType,
|
|
category: RelationshipCategoryEnum,
|
|
nickname: z.string().nullable(),
|
|
since: z.string().nullable(),
|
|
target: AdminResolvedUserSchema.nullable(),
|
|
});
|
|
|
|
export type AdminRelationshipEntry = z.infer<typeof AdminRelationshipEntrySchema>;
|
|
|
|
export const ListUserRelationshipsResponse = z.object({
|
|
friends: z.array(AdminRelationshipEntrySchema),
|
|
incoming_requests: z.array(AdminRelationshipEntrySchema),
|
|
outgoing_requests: z.array(AdminRelationshipEntrySchema),
|
|
blocked: z.array(AdminRelationshipEntrySchema),
|
|
});
|
|
|
|
export type ListUserRelationshipsResponse = z.infer<typeof ListUserRelationshipsResponse>;
|
|
|
|
export const RemoveUserRelationshipRequest = z.object({
|
|
user_id: SnowflakeType.describe('ID of the user whose relationship is being removed'),
|
|
target_user_id: SnowflakeType.describe('ID of the other party in the relationship'),
|
|
category: RelationshipCategoryEnum.describe(
|
|
'Which relationship to remove. Friend and outgoing_request also remove the mirror entry on the target user.',
|
|
),
|
|
});
|
|
|
|
export type RemoveUserRelationshipRequest = z.infer<typeof RemoveUserRelationshipRequest>;
|
|
|
|
export const RemoveUserRelationshipsByCategoryRequest = z.object({
|
|
user_id: SnowflakeType.describe('ID of the user to bulk-remove relationships for'),
|
|
category: RelationshipCategoryEnum.describe('Category of relationships to remove for this user'),
|
|
});
|
|
|
|
export type RemoveUserRelationshipsByCategoryRequest = z.infer<typeof RemoveUserRelationshipsByCategoryRequest>;
|
|
|
|
export const RemoveUserRelationshipsResponse = z.object({
|
|
removed_count: Int32Type,
|
|
});
|
|
|
|
export type RemoveUserRelationshipsResponse = z.infer<typeof RemoveUserRelationshipsResponse>;
|
|
|
|
export const AdminAclListResponse = z.object({
|
|
acls: z
|
|
.array(createStringType(1, 64))
|
|
.max(ADMIN_ACL_COUNT)
|
|
.describe('Every admin access control permission the admin API recognises'),
|
|
});
|
|
|
|
export type AdminAclListResponse = z.infer<typeof AdminAclListResponse>;
|
|
|
|
export const AdminUserListQuery = z.object({
|
|
q: createStringType(1, 1024).optional().describe('Restrict the results to the users matching this free-text query'),
|
|
user_id: z
|
|
.union([SnowflakeStringType, z.array(SnowflakeStringType).max(100)])
|
|
.optional()
|
|
.describe('Restrict the results to these users. Repeat the parameter to pass more than one.'),
|
|
resolve: createStringType(1, 1024)
|
|
.optional()
|
|
.describe(
|
|
'Resolve one exact identifier: a username#discriminator tag, a user ID, an email address, or a Stripe subscription ID',
|
|
),
|
|
email: createStringType(1, 320).optional().describe('Restrict the results to the user with this exact email address'),
|
|
last_active_ip: createStringType(1, 64)
|
|
.optional()
|
|
.describe('Restrict the results to the users whose last active IP address matches this one exactly'),
|
|
limit: createQueryIntegerType({defaultValue: 50, minValue: 1, maxValue: 200}).describe(
|
|
'Maximum number of users to return',
|
|
),
|
|
offset: createQueryIntegerType({defaultValue: 0, minValue: 0, maxValue: 100000}).describe(
|
|
'Number of users to skip before returning results',
|
|
),
|
|
});
|
|
|
|
export type AdminUserListQuery = z.infer<typeof AdminUserListQuery>;
|
|
|
|
export const AdminUserGuildListQuery = z.object({
|
|
before: SnowflakeType.optional().describe('Return guilds with IDs lower than this guild ID'),
|
|
after: SnowflakeType.optional().describe('Return guilds with IDs higher than this guild ID'),
|
|
limit: createQueryIntegerType({defaultValue: 200, minValue: 1, maxValue: 200}).describe(
|
|
'Maximum number of guilds to return',
|
|
),
|
|
with_counts: QueryBooleanType.describe('Whether to resolve live member and presence counts from the gateway'),
|
|
});
|
|
|
|
export type AdminUserGuildListQuery = z.infer<typeof AdminUserGuildListQuery>;
|
|
|
|
export const AdminUserDmChannelType = createNamedStringLiteralUnion(
|
|
[
|
|
['dm', 'DM', 'One-to-one direct message channels'],
|
|
['group_dm', 'GROUP_DM', 'Group direct message channels'],
|
|
],
|
|
'Kind of direct message channel to list',
|
|
);
|
|
|
|
export const AdminUserDmChannelListQuery = z
|
|
.object({
|
|
type: AdminUserDmChannelType.optional()
|
|
.default('dm')
|
|
.describe('The kind of direct message channel to list. Defaults to the one-to-one direct message channels.'),
|
|
before: SnowflakeType.optional().describe('Return channels with IDs lower than this channel ID'),
|
|
after: SnowflakeType.optional().describe('Return channels with IDs higher than this channel ID'),
|
|
limit: createQueryIntegerType({defaultValue: 50, minValue: 1, maxValue: 200}).describe(
|
|
'Maximum number of DM channels to return',
|
|
),
|
|
})
|
|
.refine((value) => value.before === undefined || value.after === undefined, {
|
|
error: 'before and after cannot both be provided',
|
|
});
|
|
|
|
export type AdminUserDmChannelListQuery = z.infer<typeof AdminUserDmChannelListQuery>;
|
|
|
|
export const AdminUserChangeLogQuery = z.object({
|
|
limit: createQueryIntegerType({defaultValue: 50, minValue: 1, maxValue: 200}).describe(
|
|
'Maximum number of entries to return',
|
|
),
|
|
page_token: createStringType(1, 64).optional().describe('Pagination token for the next page of results'),
|
|
});
|
|
|
|
export type AdminUserChangeLogQuery = z.infer<typeof AdminUserChangeLogQuery>;
|
|
|
|
export const AdminUserRelationshipCategoryQuery = z.object({
|
|
category: RelationshipCategoryEnum.describe('Category of relationships the operation applies to'),
|
|
});
|
|
|
|
export type AdminUserRelationshipCategoryQuery = z.infer<typeof AdminUserRelationshipCategoryQuery>;
|
|
|
|
export const AdminUserRelationshipParam = z.object({
|
|
user_id: SnowflakeType.describe('The ID of the user'),
|
|
target_user_id: SnowflakeType.describe('The ID of the target user'),
|
|
});
|
|
|
|
export type AdminUserRelationshipParam = z.infer<typeof AdminUserRelationshipParam>;
|
|
|
|
export const AdminUserWebAuthnCredentialParam = z.object({
|
|
user_id: SnowflakeType.describe('The ID of the user'),
|
|
credential_id: createStringType(1, 512).describe('The ID of the WebAuthn credential'),
|
|
});
|
|
|
|
export type AdminUserWebAuthnCredentialParam = z.infer<typeof AdminUserWebAuthnCredentialParam>;
|
|
|
|
export const AdminUserClearFieldsRequest = ClearUserFieldsRequest.omit({user_id: true});
|
|
|
|
export type AdminUserClearFieldsRequest = z.infer<typeof AdminUserClearFieldsRequest>;
|
|
|
|
export const AdminUserBotStatusRequest = SetUserBotStatusRequest.omit({user_id: true});
|
|
|
|
export type AdminUserBotStatusRequest = z.infer<typeof AdminUserBotStatusRequest>;
|
|
|
|
export const AdminUserSystemStatusRequest = SetUserSystemStatusRequest.omit({user_id: true});
|
|
|
|
export type AdminUserSystemStatusRequest = z.infer<typeof AdminUserSystemStatusRequest>;
|
|
|
|
export const AdminUserUsernameUpdateRequest = ChangeUsernameRequest.omit({user_id: true});
|
|
|
|
export type AdminUserUsernameUpdateRequest = z.infer<typeof AdminUserUsernameUpdateRequest>;
|
|
|
|
export const AdminUserEmailUpdateRequest = ChangeEmailRequest.omit({user_id: true});
|
|
|
|
export type AdminUserEmailUpdateRequest = z.infer<typeof AdminUserEmailUpdateRequest>;
|
|
|
|
export const AdminUserBanRequest = TempBanUserRequest.omit({user_id: true});
|
|
|
|
export type AdminUserBanRequest = z.infer<typeof AdminUserBanRequest>;
|
|
|
|
export const AdminUserDeletionScheduleRequest = ScheduleAccountDeletionRequest.omit({user_id: true});
|
|
|
|
export type AdminUserDeletionScheduleRequest = z.infer<typeof AdminUserDeletionScheduleRequest>;
|
|
|
|
export const AdminUserDeletionCancelRequest = z.object({
|
|
expected_pending_deletion_at: z.iso
|
|
.datetime()
|
|
.describe('pending_deletion_at of the deletion being cancelled, as shown on the account'),
|
|
notify_user: z.boolean().default(false).describe('Whether to email the user that the deletion was cancelled'),
|
|
});
|
|
|
|
export type AdminUserDeletionCancelRequest = z.infer<typeof AdminUserDeletionCancelRequest>;
|
|
|
|
export const AdminUserUnbanRequest = z.object({
|
|
notify_user: z.boolean().default(true).describe('Whether to email the user that the suspension was lifted'),
|
|
public_reason: createStringType(0, 512)
|
|
.optional()
|
|
.describe('Reason shown to the user in the unban email. The audit log reason is never emailed'),
|
|
});
|
|
|
|
export type AdminUserUnbanRequest = z.infer<typeof AdminUserUnbanRequest>;
|
|
|
|
export const AdminUserBanNoteRequest = z.object({
|
|
ban_audit_log_id: SnowflakeType.describe('Audit log entry of the current ban that the note refers to'),
|
|
note: createStringType(1, 512).describe('Note to append to the ban. Recorded as the reason of a new audit log entry'),
|
|
});
|
|
|
|
export type AdminUserBanNoteRequest = z.infer<typeof AdminUserBanNoteRequest>;
|
|
|
|
export const AdminUserAclsRequest = SetUserAclsRequest.omit({user_id: true});
|
|
|
|
export type AdminUserAclsRequest = z.infer<typeof AdminUserAclsRequest>;
|
|
|
|
export const AdminUserTraitsRequest = SetUserTraitsRequest.omit({user_id: true});
|
|
|
|
export type AdminUserTraitsRequest = z.infer<typeof AdminUserTraitsRequest>;
|
|
|
|
export const AdminUserFlagsUpdateRequest = UpdateUserFlagsRequest.omit({user_id: true});
|
|
|
|
export type AdminUserFlagsUpdateRequest = z.infer<typeof AdminUserFlagsUpdateRequest>;
|
|
|
|
export const AdminUserPremiumFlagsUpdateRequest = UpdatePremiumFlagsRequest.omit({user_id: true});
|
|
|
|
export type AdminUserPremiumFlagsUpdateRequest = z.infer<typeof AdminUserPremiumFlagsUpdateRequest>;
|
|
|
|
export const AdminUserDobUpdateRequest = ChangeDobRequest.omit({user_id: true});
|
|
|
|
export type AdminUserDobUpdateRequest = z.infer<typeof AdminUserDobUpdateRequest>;
|
|
|
|
export const AdminUserDmChannelListResponse = z.union([ListUserDmChannelsResponse, ListUserGroupDmChannelsResponse]);
|
|
|
|
export type AdminUserDmChannelListResponse = z.infer<typeof AdminUserDmChannelListResponse>;
|