add: thread channel support

This commit is contained in:
ITOH
2021-05-02 12:34:47 +02:00
parent 9ff0c2c693
commit 6f7ade244a
+60 -22
View File
@@ -2,28 +2,68 @@ import { eventHandlers } from "../../bot.ts";
import { cacheHandlers } from "../../cache.ts"; import { cacheHandlers } from "../../cache.ts";
import { rest } from "../../rest/rest.ts"; import { rest } from "../../rest/rest.ts";
import { ModifyChannel } from "../../types/channels/modify_channel.ts"; import { ModifyChannel } from "../../types/channels/modify_channel.ts";
import { Channel } from "../../types/mod.ts"; import { ModifyThread } from "../../types/channels/threads/modify_thread.ts";
import {
Channel,
DiscordChannelTypes,
PermissionStrings,
} from "../../types/mod.ts";
import { endpoints } from "../../util/constants.ts"; import { endpoints } from "../../util/constants.ts";
import { import {
calculateBits, calculateBits,
requireBotChannelPermissions,
requireOverwritePermissions, requireOverwritePermissions,
} from "../../util/permissions.ts"; } from "../../util/permissions.ts";
import { camelKeysToSnakeCase, hasOwnProperty } from "../../util/utils.ts";
//TODO: implement DM group channel edit //TODO: implement DM group channel edit
/** Update a channel's settings. Requires the `MANAGE_CHANNELS` permission for the guild. */ /** Update a channel's settings. Requires the `MANAGE_CHANNELS` permission for the guild. */
export async function editChannel( export async function editChannel(
channelId: string, channelId: string,
options: ModifyChannel, options: ModifyChannel | ModifyThread,
reason?: string, reason?: string,
) { ) {
const channel = await cacheHandlers.get("channels", channelId); const channel = await cacheHandlers.get("channels", channelId);
if (channel?.guildId) {
await requireOverwritePermissions( if (channel) {
channel.guildId, if (
options.permissionOverwrites || [], [
); DiscordChannelTypes.GuildNewsThread,
DiscordChannelTypes.GuildPivateThread,
DiscordChannelTypes.GuildPublicThread,
].includes(channel.type)
) {
const permissions = new Set<PermissionStrings>();
if (hasOwnProperty(options, "archive") && options.archive === false) {
permissions.add("SEND_MESSAGES");
}
// TODO(threads): change this to a better check
// hacky way of checking if more is being modified
if (Object.keys(options).length > 1) {
permissions.add("MANAGE_THREADS");
}
await requireBotChannelPermissions(channel.parentId ?? "", [
...permissions,
]);
}
if (
hasOwnProperty<ModifyChannel>(
options,
"permissionOverwrites",
) && Array.isArray(options.permissionOverwrites)
) {
await requireOverwritePermissions(
channel.guildId,
options.permissionOverwrites,
);
}
} }
if (options.name || options.topic) { if (options.name || (options as ModifyChannel).topic) {
const request = editChannelNameTopicQueue.get(channelId); const request = editChannelNameTopicQueue.get(channelId);
if (!request) { if (!request) {
// If this hasnt been done before simply add 1 for it // If this hasnt been done before simply add 1 for it
@@ -49,21 +89,18 @@ export async function editChannel(
} }
const payload = { const payload = {
...options, ...camelKeysToSnakeCase<{}>(options),
// deno-lint-ignore camelcase // deno-lint-ignore camelcase
rate_limit_per_user: options.rateLimitPerUser, permission_overwrites:
// deno-lint-ignore camelcase hasOwnProperty<ModifyChannel>(options, "permissionOverwrites")
parent_id: options.parentId, ? options.permissionOverwrites?.map((overwrite) => {
// deno-lint-ignore camelcase return {
user_limit: options.userLimit, ...overwrite,
// deno-lint-ignore camelcase allow: calculateBits(overwrite.allow),
permission_overwrites: options.permissionOverwrites?.map((overwrite) => { deny: calculateBits(overwrite.deny),
return { };
...overwrite, })
allow: calculateBits(overwrite.allow), : undefined,
deny: calculateBits(overwrite.deny),
};
}),
}; };
return await rest.runMethod<Channel>( return await rest.runMethod<Channel>(
@@ -87,6 +124,7 @@ interface EditChannelRequest {
} }
const editChannelNameTopicQueue = new Map<string, EditChannelRequest>(); const editChannelNameTopicQueue = new Map<string, EditChannelRequest>();
let editChannelProcessing = false; let editChannelProcessing = false;
function processEditChannelQueue() { function processEditChannelQueue() {