Files
openclaw/src/discord/send.guild.ts
2026-02-18 01:34:35 +00:00

141 lines
4.5 KiB
TypeScript

import type {
APIChannel,
APIGuildMember,
APIGuildScheduledEvent,
APIRole,
APIVoiceState,
RESTPostAPIGuildScheduledEventJSONBody,
} from "discord-api-types/v10";
import { Routes } from "discord-api-types/v10";
import { resolveDiscordRest } from "./send.shared.js";
import type {
DiscordModerationTarget,
DiscordReactOpts,
DiscordRoleChange,
DiscordTimeoutTarget,
} from "./send.types.js";
export async function fetchMemberInfoDiscord(
guildId: string,
userId: string,
opts: DiscordReactOpts = {},
): Promise<APIGuildMember> {
const rest = resolveDiscordRest(opts);
return (await rest.get(Routes.guildMember(guildId, userId))) as APIGuildMember;
}
export async function fetchRoleInfoDiscord(
guildId: string,
opts: DiscordReactOpts = {},
): Promise<APIRole[]> {
const rest = resolveDiscordRest(opts);
return (await rest.get(Routes.guildRoles(guildId))) as APIRole[];
}
export async function addRoleDiscord(payload: DiscordRoleChange, opts: DiscordReactOpts = {}) {
const rest = resolveDiscordRest(opts);
await rest.put(Routes.guildMemberRole(payload.guildId, payload.userId, payload.roleId));
return { ok: true };
}
export async function removeRoleDiscord(payload: DiscordRoleChange, opts: DiscordReactOpts = {}) {
const rest = resolveDiscordRest(opts);
await rest.delete(Routes.guildMemberRole(payload.guildId, payload.userId, payload.roleId));
return { ok: true };
}
export async function fetchChannelInfoDiscord(
channelId: string,
opts: DiscordReactOpts = {},
): Promise<APIChannel> {
const rest = resolveDiscordRest(opts);
return (await rest.get(Routes.channel(channelId))) as APIChannel;
}
export async function listGuildChannelsDiscord(
guildId: string,
opts: DiscordReactOpts = {},
): Promise<APIChannel[]> {
const rest = resolveDiscordRest(opts);
return (await rest.get(Routes.guildChannels(guildId))) as APIChannel[];
}
export async function fetchVoiceStatusDiscord(
guildId: string,
userId: string,
opts: DiscordReactOpts = {},
): Promise<APIVoiceState> {
const rest = resolveDiscordRest(opts);
return (await rest.get(Routes.guildVoiceState(guildId, userId))) as APIVoiceState;
}
export async function listScheduledEventsDiscord(
guildId: string,
opts: DiscordReactOpts = {},
): Promise<APIGuildScheduledEvent[]> {
const rest = resolveDiscordRest(opts);
return (await rest.get(Routes.guildScheduledEvents(guildId))) as APIGuildScheduledEvent[];
}
export async function createScheduledEventDiscord(
guildId: string,
payload: RESTPostAPIGuildScheduledEventJSONBody,
opts: DiscordReactOpts = {},
): Promise<APIGuildScheduledEvent> {
const rest = resolveDiscordRest(opts);
return (await rest.post(Routes.guildScheduledEvents(guildId), {
body: payload,
})) as APIGuildScheduledEvent;
}
export async function timeoutMemberDiscord(
payload: DiscordTimeoutTarget,
opts: DiscordReactOpts = {},
): Promise<APIGuildMember> {
const rest = resolveDiscordRest(opts);
let until = payload.until;
if (!until && payload.durationMinutes) {
const ms = payload.durationMinutes * 60 * 1000;
until = new Date(Date.now() + ms).toISOString();
}
return (await rest.patch(Routes.guildMember(payload.guildId, payload.userId), {
body: { communication_disabled_until: until ?? null },
headers: payload.reason
? { "X-Audit-Log-Reason": encodeURIComponent(payload.reason) }
: undefined,
})) as APIGuildMember;
}
export async function kickMemberDiscord(
payload: DiscordModerationTarget,
opts: DiscordReactOpts = {},
) {
const rest = resolveDiscordRest(opts);
await rest.delete(Routes.guildMember(payload.guildId, payload.userId), {
headers: payload.reason
? { "X-Audit-Log-Reason": encodeURIComponent(payload.reason) }
: undefined,
});
return { ok: true };
}
export async function banMemberDiscord(
payload: DiscordModerationTarget & { deleteMessageDays?: number },
opts: DiscordReactOpts = {},
) {
const rest = resolveDiscordRest(opts);
const deleteMessageDays =
typeof payload.deleteMessageDays === "number" && Number.isFinite(payload.deleteMessageDays)
? Math.min(Math.max(Math.floor(payload.deleteMessageDays), 0), 7)
: undefined;
await rest.put(Routes.guildBan(payload.guildId, payload.userId), {
body: deleteMessageDays !== undefined ? { delete_message_days: deleteMessageDays } : undefined,
headers: payload.reason
? { "X-Audit-Log-Reason": encodeURIComponent(payload.reason) }
: undefined,
});
return { ok: true };
}
// Channel management functions