import { request } from './client'; import type { Channel, ChannelType, Guild, GuildMember, GuildSummary, Role } from './types'; export interface CreateChannelInput { name: string; type: ChannelType; parent_id?: string; } export interface UpdateGuildInput { name?: string; description?: string; } export const guildQueryKey = (guildId: string) => ['guilds', guildId] as const; export const guildChannelsQueryKey = (guildId: string) => ['guilds', guildId, 'channels'] as const; export const guildMembersQueryKey = (guildId: string) => ['guilds', guildId, 'members'] as const; export const guildRolesQueryKey = (guildId: string) => ['guilds', guildId, 'roles'] as const; export async function createGuild(name: string): Promise { const payload = await request<{ guild: GuildSummary }>('/guilds', { method: 'POST', body: { name }, }); return payload.guild; } export async function fetchGuild(guildId: string, signal?: AbortSignal): Promise { const payload = await request<{ guild: Guild }>( `/guilds/${encodeURIComponent(guildId)}`, signal === undefined ? {} : { signal }, ); return payload.guild; } export async function updateGuild(guildId: string, input: UpdateGuildInput): Promise { const payload = await request<{ guild: Guild }>(`/guilds/${encodeURIComponent(guildId)}`, { method: 'PATCH', body: input, }); return payload.guild; } export async function fetchChannels(guildId: string, signal?: AbortSignal): Promise { const payload = await request<{ channels: Channel[] }>( `/guilds/${encodeURIComponent(guildId)}/channels`, signal === undefined ? {} : { signal }, ); return payload.channels; } export async function createChannel(guildId: string, input: CreateChannelInput): Promise { const payload = await request<{ channel: Channel }>( `/guilds/${encodeURIComponent(guildId)}/channels`, { method: 'POST', body: input }, ); return payload.channel; } export async function fetchMembers(guildId: string, signal?: AbortSignal): Promise { const payload = await request<{ members: GuildMember[] }>( `/guilds/${encodeURIComponent(guildId)}/members`, signal === undefined ? {} : { signal }, ); return payload.members; } export async function fetchRoles(guildId: string, signal?: AbortSignal): Promise { const payload = await request<{ roles: Role[] }>( `/guilds/${encodeURIComponent(guildId)}/roles`, signal === undefined ? {} : { signal }, ); return payload.roles; } export function joinGuild(guildId: string): Promise<{ ok: true }> { return request<{ ok: true }>(`/guilds/${encodeURIComponent(guildId)}/join`, { method: 'POST' }); } export function leaveGuild(guildId: string): Promise<{ ok: true }> { return request<{ ok: true }>(`/guilds/${encodeURIComponent(guildId)}/leave`, { method: 'POST' }); } /** * Свой никнейм на сервере: сервер разрешает участнику менять его без прав * (пустая строка сбрасывает ник). */ export async function updateGuildMember( guildId: string, userId: string, input: { nickname: string }, ): Promise { await request<{ ok: true }>( `/guilds/${encodeURIComponent(guildId)}/members/${encodeURIComponent(userId)}`, { method: 'PATCH', body: input }, ); } /** Удаление сервера: доступно владельцу и администратору инстанса. */ export async function deleteGuild(guildId: string): Promise { await request<{ ok: true }>(`/guilds/${encodeURIComponent(guildId)}`, { method: 'DELETE' }); }