more events

This commit is contained in:
Skillz4Killz
2021-10-24 12:15:11 +00:00
committed by GitHub
parent 72ffbdc4db
commit 34a2baa799
15 changed files with 732 additions and 377 deletions
+569 -14
View File
@@ -14,7 +14,6 @@ import {
requireBotChannelPermissions, requireBotChannelPermissions,
requireBotGuildPermissions, requireBotGuildPermissions,
} from "./util/permissions.ts"; } from "./util/permissions.ts";
import { getGatewayBot } from "./helpers/misc/get_gateway_bot.ts";
import { import {
checkRateLimits, checkRateLimits,
processQueue, processQueue,
@@ -45,6 +44,7 @@ import {
transformRole, transformRole,
DiscordenoVoiceState, DiscordenoVoiceState,
transformVoiceState, transformVoiceState,
DiscordenoMessage,
} from "./transformers/mod.ts"; } from "./transformers/mod.ts";
import { import {
baseEndpoints, baseEndpoints,
@@ -125,14 +125,174 @@ import {
handleIntegrationCreate, handleIntegrationCreate,
handleIntegrationUpdate, handleIntegrationUpdate,
handleIntegrationDelete, handleIntegrationDelete,
handleGuildLoaded handleGuildLoaded,
} from "./handlers/mod.ts"; } from "./handlers/mod.ts";
import { DiscordenoInteraction, transformInteraction } from "./transformers/interaction.ts"; import { DiscordenoInteraction, transformInteraction } from "./transformers/interaction.ts";
import { DiscordenoIntegration, transformIntegration } from "./transformers/integration.ts"; import { DiscordenoIntegration, transformIntegration } from "./transformers/integration.ts";
import {Emoji} from "./types/emojis/emoji.ts"; import { Emoji } from "./types/emojis/emoji.ts";
import { transformApplication } from "./transformers/application.ts"; import { transformApplication } from "./transformers/application.ts";
import { transformTeam } from "./transformers/team.ts"; import { transformTeam } from "./transformers/team.ts";
import { DiscordenoInvite, transformInvite } from "./transformers/invite.ts"; import { DiscordenoInvite, transformInvite } from "./transformers/invite.ts";
import {
addDiscoverySubcategory,
addReaction,
addReactions,
addRole,
addToThread,
archiveThread,
avatarURL,
ban,
banMember,
batchEditSlashCommandPermissions,
categoryChildren,
channelOverwriteHasPermission,
connectToVoiceChannel,
createChannel,
createEmoji,
createGuild,
createGuildFromTemplate,
createGuildTemplate,
createInvite,
createRole,
createSlashCommand,
createStageInstance,
createWebhook,
deleteChannel,
deleteChannelOverwrite,
deleteEmoji,
deleteGuild,
deleteGuildTemplate,
deleteIntegration,
deleteInvite,
deleteMessage,
deleteMessages,
deleteRole,
deleteSlashCommand,
deleteSlashResponse,
deleteStageInstance,
deleteThread,
deleteWebhook,
deleteWebhookMessage,
deleteWebhookWithToken,
disconnectMember,
editBotNickname,
editBotProfile,
editBotStatus,
editChannel,
editChannelOverwrite,
editDiscovery,
editEmoji,
editGuild,
editGuildTemplate,
editMember,
editMessage,
editRole,
editSlashCommandPermissions,
editSlashResponse,
editThread,
editWebhook,
editWebhookMessage,
editWebhookWithToken,
editWelcomeScreen,
editWidget,
emojiURL,
fetchMembers,
followChannel,
getActiveThreads,
getApplicationInfo,
getArchivedThreads,
getAuditLogs,
getAvailableVoiceRegions,
getBan,
getBans,
getChannel,
getChannelInvites,
getChannels,
getChannelWebhooks,
getDiscoveryCategories,
getEmoji,
getEmojis,
getGatewayBot,
getGuild,
getGuildPreview,
getGuildTemplates,
getIntegrations,
getInvite,
getInvites,
getMember,
getMembers,
getMessage,
getMessages,
getOriginalInteractionResponse,
getPins,
getPruneCount,
getReactions,
getRoles,
getSlashCommand,
getSlashCommandPermission,
getSlashCommandPermissions,
getSlashCommands,
getStageInstance,
getTemplate,
getThreadMembers,
getUser,
getVanityURL,
getVoiceRegions,
getWebhook,
getWebhookMessage,
getWebhooks,
getWebhookWithToken,
getWelcomeScreen,
getWidget,
getWidgetImageURL,
getWidgetSettings,
guildBannerURL,
guildIconURL,
guildSplashURL,
isButton,
isChannelSynced,
isSelectMenu,
isSlashCommand,
joinThread,
kick,
kickMember,
leaveGuild,
leaveThread,
lockThread,
moveMember,
pin,
pinMessage,
pruneMembers,
publishMessage,
removeAllReactions,
removeDiscoverySubcategory,
removeReaction,
removeReactionEmoji,
removeRole,
removeThreadMember,
sendDirectMessage,
sendInteractionResponse,
sendMessage,
sendWebhook,
startPrivateThread,
startThread,
startTyping,
suppressEmbeds,
swapChannels,
syncGuildTemplate,
unarchiveThread,
unban,
unbanMember,
unlockThread,
unpin,
unpinMessage,
updateBotVoiceState,
updateStageInstance,
upsertSlashCommand,
upsertSlashCommands,
validDiscoveryTerm,
} from "./helpers/mod.ts";
import { DiscordenoEmoji, transformEmoji } from "./transformers/emoji.ts";
export async function createBot(options: CreateBotOptions) { export async function createBot(options: CreateBotOptions) {
return { return {
@@ -141,7 +301,7 @@ export async function createBot(options: CreateBotOptions) {
token: `Bot ${options.token}`, token: `Bot ${options.token}`,
events: options.events, events: options.events,
intents: options.intents.reduce((bits, next) => (bits |= DiscordGatewayIntents[next]), 0), intents: options.intents.reduce((bits, next) => (bits |= DiscordGatewayIntents[next]), 0),
botGatewayData: options.botGatewayData || (await getGatewayBot()), botGatewayData: options.botGatewayData,
isReady: false, isReady: false,
activeGuildIds: new Set<bigint>(), activeGuildIds: new Set<bigint>(),
constants: createBotConstants(), constants: createBotConstants(),
@@ -158,6 +318,20 @@ export async function createBot(options: CreateBotOptions) {
options: Record<string, any> options: Record<string, any>
) {}, ) {},
fetchAllMembersProcessingRequests: new Collection<string, Function>(), fetchAllMembersProcessingRequests: new Collection<string, Function>(),
messages: {
get: async function (id: bigint): Promise<DiscordenoMessage | undefined> {
return {} as any as DiscordenoMessage;
},
has: async function (id: bigint): Promise<boolean> {
return false;
},
set: async function (id: bigint, guild: DiscordenoMessage): Promise<void> {
return;
},
delete: async function (id: bigint): Promise<void> {
return;
},
},
guilds: { guilds: {
get: async function (id: bigint): Promise<DiscordenoGuild | undefined> { get: async function (id: bigint): Promise<DiscordenoGuild | undefined> {
return {} as any as DiscordenoGuild; return {} as any as DiscordenoGuild;
@@ -248,7 +422,6 @@ export function createEventHandlers(events: Partial<EventHandlers>): EventHandle
function ignore() {} function ignore() {}
return { return {
channelCreate: events.channelCreate ?? ignore,
debug: events.debug ?? ignore, debug: events.debug ?? ignore,
dispatchRequirements: events.dispatchRequirements ?? ignore, dispatchRequirements: events.dispatchRequirements ?? ignore,
integrationCreate: events.integrationCreate ?? ignore, integrationCreate: events.integrationCreate ?? ignore,
@@ -260,6 +433,13 @@ export function createEventHandlers(events: Partial<EventHandlers>): EventHandle
guildMemberAdd: events.guildMemberAdd ?? ignore, guildMemberAdd: events.guildMemberAdd ?? ignore,
guildMemberRemove: events.guildMemberRemove ?? ignore, guildMemberRemove: events.guildMemberRemove ?? ignore,
guildMemberUpdate: events.guildMemberUpdate ?? ignore, guildMemberUpdate: events.guildMemberUpdate ?? ignore,
messageCreate: events.messageCreate ?? ignore,
messageDelete: events.messageDelete ?? ignore,
messageUpdate: events.messageUpdate ?? ignore,
reactionAdd: events.reactionAdd ?? ignore,
reactionRemove: events.reactionRemove ?? ignore,
reactionRemoveAll: events.reactionRemoveAll ?? ignore,
reactionRemoveEmoji: events.reactionRemoveEmoji ?? ignore,
channelCreate: events.channelCreate ?? ignore, channelCreate: events.channelCreate ?? ignore,
voiceChannelLeave: events.voiceChannelLeave ?? ignore, voiceChannelLeave: events.voiceChannelLeave ?? ignore,
channelDelete: events.channelDelete ?? ignore, channelDelete: events.channelDelete ?? ignore,
@@ -339,16 +519,18 @@ export function createRestManager(options: CreateRestManagerOptions) {
} }
export async function startBot(bot: Bot) { export async function startBot(bot: Bot) {
const transformers = createTransformers(bot.transformers); // SETUP
// SETUP UTILS
bot.utils = createUtils({}); bot.utils = createUtils({});
bot.transformers = createTransformers(bot.transformers);
bot.helpers = createHelpers(bot.helpers);
// START REST // START REST
bot.rest = createRestManager({ token: bot.token }); bot.rest = createRestManager({ token: bot.token });
// START WS // START WS
bot.gateway = createGatewayManager({}); bot.gateway = createGatewayManager({});
if (!bot.botGatewayData) bot.botGatewayData = await bot.helpers.getGatewayBot(bot);
} }
export function createUtils(options: Partial<HelperUtils>) { export function createUtils(options: Partial<HelperUtils>) {
@@ -413,6 +595,7 @@ export function createGatewayManager(options: Partial<GatewayManager>): GatewayM
cache: { cache: {
guildIds: new Set(), guildIds: new Set(),
loadingGuildIds: new Set(), loadingGuildIds: new Set(),
editedMessages: new Collection(),
}, },
secretKey: options.secretKey ?? "", secretKey: options.secretKey ?? "",
url: options.url ?? "", url: options.url ?? "",
@@ -495,8 +678,331 @@ export type Bot = CreatedBot & {
rest: RestManager; rest: RestManager;
gateway: GatewayManager; gateway: GatewayManager;
transformers: Transformers; transformers: Transformers;
helpers: Helpers;
}; };
export interface Helpers {
addDiscoverySubcategory: typeof addDiscoverySubcategory;
addReaction: typeof addReaction;
addReactions: typeof addReactions;
addRole: typeof addRole;
avatarURL: typeof avatarURL;
ban: typeof ban;
banMember: typeof banMember;
batchEditSlashCommandPermissions: typeof batchEditSlashCommandPermissions;
categoryChildren: typeof categoryChildren;
channelOverwriteHasPermission: typeof channelOverwriteHasPermission;
connectToVoiceChannel: typeof connectToVoiceChannel;
createChannel: typeof createChannel;
createEmoji: typeof createEmoji;
createGuild: typeof createGuild;
createGuildFromTemplate: typeof createGuildFromTemplate;
createGuildTemplate: typeof createGuildTemplate;
createInvite: typeof createInvite;
createRole: typeof createRole;
createSlashCommand: typeof createSlashCommand;
createStageInstance: typeof createStageInstance;
createWebhook: typeof createWebhook;
deleteChannel: typeof deleteChannel;
deleteChannelOverwrite: typeof deleteChannelOverwrite;
deleteEmoji: typeof deleteEmoji;
deleteGuild: typeof deleteGuild;
deleteGuildTemplate: typeof deleteGuildTemplate;
deleteIntegration: typeof deleteIntegration;
deleteInvite: typeof deleteInvite;
deleteMessage: typeof deleteMessage;
deleteMessages: typeof deleteMessages;
deleteRole: typeof deleteRole;
deleteSlashCommand: typeof deleteSlashCommand;
deleteSlashResponse: typeof deleteSlashResponse;
deleteStageInstance: typeof deleteStageInstance;
deleteWebhook: typeof deleteWebhook;
deleteWebhookMessage: typeof deleteWebhookMessage;
deleteWebhookWithToken: typeof deleteWebhookWithToken;
disconnectMember: typeof disconnectMember;
editBotNickname: typeof editBotNickname;
editBotProfile: typeof editBotProfile;
editBotStatus: typeof editBotStatus;
editChannel: typeof editChannel;
editChannelOverwrite: typeof editChannelOverwrite;
editDiscovery: typeof editDiscovery;
editEmoji: typeof editEmoji;
editGuild: typeof editGuild;
editGuildTemplate: typeof editGuildTemplate;
editMember: typeof editMember;
editMessage: typeof editMessage;
editRole: typeof editRole;
editSlashResponse: typeof editSlashResponse;
editSlashCommandPermissions: typeof editSlashCommandPermissions;
editWebhook: typeof editWebhook;
editWebhookMessage: typeof editWebhookMessage;
editWebhookWithToken: typeof editWebhookWithToken;
editWelcomeScreen: typeof editWelcomeScreen;
editWidget: typeof editWidget;
emojiURL: typeof emojiURL;
fetchMembers: typeof fetchMembers;
followChannel: typeof followChannel;
getAuditLogs: typeof getAuditLogs;
getAvailableVoiceRegions: typeof getAvailableVoiceRegions;
getBan: typeof getBan;
getBans: typeof getBans;
getChannel: typeof getChannel;
getChannelInvites: typeof getChannelInvites;
getChannels: typeof getChannels;
getChannelWebhooks: typeof getChannelWebhooks;
getDiscoveryCategories: typeof getDiscoveryCategories;
getEmoji: typeof getEmoji;
getEmojis: typeof getEmojis;
getGatewayBot: typeof getGatewayBot;
getGuild: typeof getGuild;
getGuildPreview: typeof getGuildPreview;
getGuildTemplates: typeof getGuildTemplates;
getIntegrations: typeof getIntegrations;
getInvite: typeof getInvite;
getInvites: typeof getInvites;
getMember: typeof getMember;
getMembers: typeof getMembers;
getMessage: typeof getMessage;
getMessages: typeof getMessages;
getOriginalInteractionResponse: typeof getOriginalInteractionResponse;
getPins: typeof getPins;
getPruneCount: typeof getPruneCount;
getReactions: typeof getReactions;
getRoles: typeof getRoles;
getSlashCommand: typeof getSlashCommand;
getSlashCommandPermission: typeof getSlashCommandPermission;
getSlashCommandPermissions: typeof getSlashCommandPermissions;
getSlashCommands: typeof getSlashCommands;
getStageInstance: typeof getStageInstance;
getTemplate: typeof getTemplate;
getUser: typeof getUser;
getApplicationInfo: typeof getApplicationInfo;
getVanityURL: typeof getVanityURL;
getVoiceRegions: typeof getVoiceRegions;
getWebhook: typeof getWebhook;
getWebhookMessage: typeof getWebhookMessage;
getWebhooks: typeof getWebhooks;
getWebhookWithToken: typeof getWebhookWithToken;
getWelcomeScreen: typeof getWelcomeScreen;
getWidget: typeof getWidget;
getWidgetImageURL: typeof getWidgetImageURL;
getWidgetSettings: typeof getWidgetSettings;
guildBannerURL: typeof guildBannerURL;
guildIconURL: typeof guildIconURL;
guildSplashURL: typeof guildSplashURL;
isButton: typeof isButton;
isSelectMenu: typeof isSelectMenu;
isSlashCommand: typeof isSlashCommand;
isChannelSynced: typeof isChannelSynced;
kick: typeof kick;
kickMember: typeof kickMember;
leaveGuild: typeof leaveGuild;
moveMember: typeof moveMember;
pin: typeof pin;
pinMessage: typeof pinMessage;
pruneMembers: typeof pruneMembers;
publishMessage: typeof publishMessage;
removeAllReactions: typeof removeAllReactions;
removeDiscoverySubcategory: typeof removeDiscoverySubcategory;
removeReaction: typeof removeReaction;
removeReactionEmoji: typeof removeReactionEmoji;
removeRole: typeof removeRole;
sendDirectMessage: typeof sendDirectMessage;
sendInteractionResponse: typeof sendInteractionResponse;
sendMessage: typeof sendMessage;
sendWebhook: typeof sendWebhook;
startTyping: typeof startTyping;
swapChannels: typeof swapChannels;
syncGuildTemplate: typeof syncGuildTemplate;
unban: typeof unban;
unbanMember: typeof unbanMember;
unpin: typeof unpin;
unpinMessage: typeof unpinMessage;
updateBotVoiceState: typeof updateBotVoiceState;
updateStageInstance: typeof updateStageInstance;
upsertSlashCommand: typeof upsertSlashCommand;
upsertSlashCommands: typeof upsertSlashCommands;
validDiscoveryTerm: typeof validDiscoveryTerm;
addToThread: typeof addToThread;
archiveThread: typeof archiveThread;
deleteThread: typeof deleteThread;
editThread: typeof editThread;
getActiveThreads: typeof getActiveThreads;
getArchivedThreads: typeof getArchivedThreads;
getThreadMembers: typeof getThreadMembers;
joinThread: typeof joinThread;
leaveThread: typeof leaveThread;
lockThread: typeof lockThread;
removeThreadMember: typeof removeThreadMember;
startPrivateThread: typeof startPrivateThread;
startThread: typeof startThread;
unarchiveThread: typeof unarchiveThread;
unlockThread: typeof unlockThread;
suppressEmbeds: typeof suppressEmbeds;
}
export function createHelpers(options: Partial<Helpers>) {
return {
addDiscoverySubcategory: options.addDiscoverySubcategory || addDiscoverySubcategory,
addReaction: options.addReaction || addReaction,
addReactions: options.addReactions || addReactions,
addRole: options.addRole || addRole,
avatarURL: options.avatarURL || avatarURL,
ban: options.ban || ban,
banMember: options.banMember || banMember,
batchEditSlashCommandPermissions: options.batchEditSlashCommandPermissions || batchEditSlashCommandPermissions,
categoryChildren: options.categoryChildren || categoryChildren,
channelOverwriteHasPermission: options.channelOverwriteHasPermission || channelOverwriteHasPermission,
connectToVoiceChannel: options.connectToVoiceChannel || connectToVoiceChannel,
createChannel: options.createChannel || createChannel,
createEmoji: options.createEmoji || createEmoji,
createGuild: options.createGuild || createGuild,
createGuildFromTemplate: options.createGuildFromTemplate || createGuildFromTemplate,
createGuildTemplate: options.createGuildTemplate || createGuildTemplate,
createInvite: options.createInvite || createInvite,
createRole: options.createRole || createRole,
createSlashCommand: options.createSlashCommand || createSlashCommand,
createStageInstance: options.createStageInstance || createStageInstance,
createWebhook: options.createWebhook || createWebhook,
deleteChannel: options.deleteChannel || deleteChannel,
deleteChannelOverwrite: options.deleteChannelOverwrite || deleteChannelOverwrite,
deleteEmoji: options.deleteEmoji || deleteEmoji,
deleteGuild: options.deleteGuild || deleteGuild,
deleteGuildTemplate: options.deleteGuildTemplate || deleteGuildTemplate,
deleteIntegration: options.deleteIntegration || deleteIntegration,
deleteInvite: options.deleteInvite || deleteInvite,
deleteMessage: options.deleteMessage || deleteMessage,
deleteMessages: options.deleteMessages || deleteMessages,
deleteRole: options.deleteRole || deleteRole,
deleteSlashCommand: options.deleteSlashCommand || deleteSlashCommand,
deleteSlashResponse: options.deleteSlashResponse || deleteSlashResponse,
deleteStageInstance: options.deleteStageInstance || deleteStageInstance,
deleteWebhook: options.deleteWebhook || deleteWebhook,
deleteWebhookMessage: options.deleteWebhookMessage || deleteWebhookMessage,
deleteWebhookWithToken: options.deleteWebhookWithToken || deleteWebhookWithToken,
disconnectMember: options.disconnectMember || disconnectMember,
editBotNickname: options.editBotNickname || editBotNickname,
editBotProfile: options.editBotProfile || editBotProfile,
editBotStatus: options.editBotStatus || editBotStatus,
editChannel: options.editChannel || editChannel,
editChannelOverwrite: options.editChannelOverwrite || editChannelOverwrite,
editDiscovery: options.editDiscovery || editDiscovery,
editEmoji: options.editEmoji || editEmoji,
editGuild: options.editGuild || editGuild,
editGuildTemplate: options.editGuildTemplate || editGuildTemplate,
editMember: options.editMember || editMember,
editMessage: options.editMessage || editMessage,
editRole: options.editRole || editRole,
editSlashResponse: options.editSlashResponse || editSlashResponse,
editSlashCommandPermissions: options.editSlashCommandPermissions || editSlashCommandPermissions,
editWebhook: options.editWebhook || editWebhook,
editWebhookMessage: options.editWebhookMessage || editWebhookMessage,
editWebhookWithToken: options.editWebhookWithToken || editWebhookWithToken,
editWelcomeScreen: options.editWelcomeScreen || editWelcomeScreen,
editWidget: options.editWidget || editWidget,
emojiURL: options.emojiURL || emojiURL,
fetchMembers: options.fetchMembers || fetchMembers,
followChannel: options.followChannel || followChannel,
getAuditLogs: options.getAuditLogs || getAuditLogs,
getAvailableVoiceRegions: options.getAvailableVoiceRegions || getAvailableVoiceRegions,
getBan: options.getBan || getBan,
getBans: options.getBans || getBans,
getChannel: options.getChannel || getChannel,
getChannelInvites: options.getChannelInvites || getChannelInvites,
getChannels: options.getChannels || getChannels,
getChannelWebhooks: options.getChannelWebhooks || getChannelWebhooks,
getDiscoveryCategories: options.getDiscoveryCategories || getDiscoveryCategories,
getEmoji: options.getEmoji || getEmoji,
getEmojis: options.getEmojis || getEmojis,
getGatewayBot: options.getGatewayBot || getGatewayBot,
getGuild: options.getGuild || getGuild,
getGuildPreview: options.getGuildPreview || getGuildPreview,
getGuildTemplates: options.getGuildTemplates || getGuildTemplates,
getIntegrations: options.getIntegrations || getIntegrations,
getInvite: options.getInvite || getInvite,
getInvites: options.getInvites || getInvites,
getMember: options.getMember || getMember,
getMembers: options.getMembers || getMembers,
getMessage: options.getMessage || getMessage,
getMessages: options.getMessages || getMessages,
getOriginalInteractionResponse: options.getOriginalInteractionResponse || getOriginalInteractionResponse,
getPins: options.getPins || getPins,
getPruneCount: options.getPruneCount || getPruneCount,
getReactions: options.getReactions || getReactions,
getRoles: options.getRoles || getRoles,
getSlashCommand: options.getSlashCommand || getSlashCommand,
getSlashCommandPermission: options.getSlashCommandPermission || getSlashCommandPermission,
getSlashCommandPermissions: options.getSlashCommandPermissions || getSlashCommandPermissions,
getSlashCommands: options.getSlashCommands || getSlashCommands,
getStageInstance: options.getStageInstance || getStageInstance,
getTemplate: options.getTemplate || getTemplate,
getUser: options.getUser || getUser,
getApplicationInfo: options.getApplicationInfo || getApplicationInfo,
getVanityURL: options.getVanityURL || getVanityURL,
getVoiceRegions: options.getVoiceRegions || getVoiceRegions,
getWebhook: options.getWebhook || getWebhook,
getWebhookMessage: options.getWebhookMessage || getWebhookMessage,
getWebhooks: options.getWebhooks || getWebhooks,
getWebhookWithToken: options.getWebhookWithToken || getWebhookWithToken,
getWelcomeScreen: options.getWelcomeScreen || getWelcomeScreen,
getWidget: options.getWidget || getWidget,
getWidgetImageURL: options.getWidgetImageURL || getWidgetImageURL,
getWidgetSettings: options.getWidgetSettings || getWidgetSettings,
guildBannerURL: options.guildBannerURL || guildBannerURL,
guildIconURL: options.guildIconURL || guildIconURL,
guildSplashURL: options.guildSplashURL || guildSplashURL,
isButton: options.isButton || isButton,
isSelectMenu: options.isSelectMenu || isSelectMenu,
isSlashCommand: options.isSlashCommand || isSlashCommand,
isChannelSynced: options.isChannelSynced || isChannelSynced,
kick: options.kick || kick,
kickMember: options.kickMember || kickMember,
leaveGuild: options.leaveGuild || leaveGuild,
moveMember: options.moveMember || moveMember,
pin: options.pin || pin,
pinMessage: options.pinMessage || pinMessage,
pruneMembers: options.pruneMembers || pruneMembers,
publishMessage: options.publishMessage || publishMessage,
removeAllReactions: options.removeAllReactions || removeAllReactions,
removeDiscoverySubcategory: options.removeDiscoverySubcategory || removeDiscoverySubcategory,
removeReaction: options.removeReaction || removeReaction,
removeReactionEmoji: options.removeReactionEmoji || removeReactionEmoji,
removeRole: options.removeRole || removeRole,
sendDirectMessage: options.sendDirectMessage || sendDirectMessage,
sendInteractionResponse: options.sendInteractionResponse || sendInteractionResponse,
sendMessage: options.sendMessage || sendMessage,
sendWebhook: options.sendWebhook || sendWebhook,
startTyping: options.startTyping || startTyping,
swapChannels: options.swapChannels || swapChannels,
syncGuildTemplate: options.syncGuildTemplate || syncGuildTemplate,
unban: options.unban || unban,
unbanMember: options.unbanMember || unbanMember,
unpin: options.unpin || unpin,
unpinMessage: options.unpinMessage || unpinMessage,
updateBotVoiceState: options.updateBotVoiceState || updateBotVoiceState,
updateStageInstance: options.updateStageInstance || updateStageInstance,
upsertSlashCommand: options.upsertSlashCommand || upsertSlashCommand,
upsertSlashCommands: options.upsertSlashCommands || upsertSlashCommands,
validDiscoveryTerm: options.validDiscoveryTerm || validDiscoveryTerm,
addToThread: options.addToThread || addToThread,
archiveThread: options.archiveThread || archiveThread,
deleteThread: options.deleteThread || deleteThread,
editThread: options.editThread || editThread,
getActiveThreads: options.getActiveThreads || getActiveThreads,
getArchivedThreads: options.getArchivedThreads || getArchivedThreads,
getThreadMembers: options.getThreadMembers || getThreadMembers,
joinThread: options.joinThread || joinThread,
leaveThread: options.leaveThread || leaveThread,
lockThread: options.lockThread || lockThread,
removeThreadMember: options.removeThreadMember || removeThreadMember,
startPrivateThread: options.startPrivateThread || startPrivateThread,
startThread: options.startThread || startThread,
unarchiveThread: options.unarchiveThread || unarchiveThread,
unlockThread: options.unlockThread || unlockThread,
suppressEmbeds: options.suppressEmbeds || suppressEmbeds,
};
}
export interface Transformers { export interface Transformers {
snowflake: typeof snowflakeToBigint; snowflake: typeof snowflakeToBigint;
channel: typeof transformChannel; channel: typeof transformChannel;
@@ -511,22 +1017,25 @@ export interface Transformers {
invite: typeof transformInvite; invite: typeof transformInvite;
application: typeof transformApplication; application: typeof transformApplication;
team: typeof transformTeam; team: typeof transformTeam;
emoji: typeof transformEmoji;
} }
export function createTransformers(options: Partial<Transformers>) { export function createTransformers(options: Partial<Transformers>) {
return { return {
snowflake: options.snowflake || snowflakeToBigint, application: options.application || transformApplication,
channel: options.channel || transformChannel, channel: options.channel || transformChannel,
emoji: options.emoji || transformEmoji,
guild: options.guild || transformGuild, guild: options.guild || transformGuild,
user: options.user || transformUser, integration: options.integration || transformIntegration,
interaction: options.interaction || transformInteraction,
invite: options.invite || transformInvite,
member: options.member || transformMember, member: options.member || transformMember,
message: options.message || transformMessage, message: options.message || transformMessage,
role: options.role || transformRole, role: options.role || transformRole,
voiceState: options.voiceState || transformVoiceState, user: options.user || transformUser,
integration: options.integration || transformIntegration,
invite: options.invite || transformInvite,
application: options.application || transformApplication,
team: options.team || transformTeam, team: options.team || transformTeam,
voiceState: options.voiceState || transformVoiceState,
snowflake: options.snowflake || snowflakeToBigint,
}; };
} }
@@ -600,6 +1109,7 @@ export interface GatewayManager {
cache: { cache: {
guildIds: Set<bigint>; guildIds: Set<bigint>;
loadingGuildIds: Set<bigint>; loadingGuildIds: Set<bigint>;
editedMessages: Collection<bigint, string>;
}; };
// METHODS // METHODS
@@ -652,6 +1162,51 @@ export interface EventHandlers {
guildMemberAdd: (bot: Bot, member: DiscordenoMember, user: DiscordenoUser) => any; guildMemberAdd: (bot: Bot, member: DiscordenoMember, user: DiscordenoUser) => any;
guildMemberRemove: (bot: Bot, user: DiscordenoUser, guildId: bigint) => any; guildMemberRemove: (bot: Bot, user: DiscordenoUser, guildId: bigint) => any;
guildMemberUpdate: (bot: Bot, member: DiscordenoMember, user: DiscordenoUser) => any; guildMemberUpdate: (bot: Bot, member: DiscordenoMember, user: DiscordenoUser) => any;
messageCreate: (bot: Bot, message: DiscordenoMessage) => any;
messageDelete: (
bot: Bot,
payload: { id: bigint; channelId: bigint; guildId?: bigint },
message?: DiscordenoMessage
) => any;
messageUpdate: (bot: Bot, message: DiscordenoMessage, oldMessage?: DiscordenoMessage) => any;
reactionAdd: (
bot: Bot,
payload: {
userId: bigint;
channelId: bigint;
messageId: bigint;
guildId?: bigint;
member?: DiscordenoMember;
emoji: DiscordenoEmoji;
}
) => any;
reactionRemove: (
bot: Bot,
payload: {
userId: bigint;
channelId: bigint;
messageId: bigint;
guildId?: bigint;
emoji: DiscordenoEmoji;
}
) => any;
reactionRemoveEmoji: (
bot: Bot,
payload: {
channelId: bigint;
messageId: bigint;
guildId?: bigint;
emoji: DiscordenoEmoji;
}
) => any;
reactionRemoveAll: (
bot: Bot,
payload: {
channelId: bigint;
messageId: bigint;
guildId?: bigint;
}
) => any;
channelCreate: (bot: Bot, channel: DiscordenoChannel) => any; channelCreate: (bot: Bot, channel: DiscordenoChannel) => any;
dispatchRequirements: (bot: Bot, data: GatewayPayload, shardId: number) => any; dispatchRequirements: (bot: Bot, data: GatewayPayload, shardId: number) => any;
voiceChannelLeave: (bot: Bot, voiceState: DiscordenoVoiceState, channel: DiscordenoChannel) => any; voiceChannelLeave: (bot: Bot, voiceState: DiscordenoVoiceState, channel: DiscordenoChannel) => any;
+7 -40
View File
@@ -1,46 +1,13 @@
import { eventHandlers } from "../../bot.ts"; import { Bot } from "../../bot.ts";
import { cacheHandlers } from "../../cache.ts";
import { structures } from "../../structures/mod.ts";
import type { DiscordGatewayPayload } from "../../types/gateway/gateway_payload.ts"; import type { DiscordGatewayPayload } from "../../types/gateway/gateway_payload.ts";
import type { GuildMemberWithUser } from "../../types/members/guild_member.ts";
import type { Message } from "../../types/messages/message.ts"; import type { Message } from "../../types/messages/message.ts";
import { snowflakeToBigint } from "../../util/bigint.ts"; import { SnakeCasedPropertiesDeep } from "../../types/util.ts";
export async function handleMessageCreate(data: DiscordGatewayPayload) { export async function handleMessageCreate(bot: Bot, data: DiscordGatewayPayload) {
const payload = data.d as Message; const payload = data.d as SnakeCasedPropertiesDeep<Message>;
const channel = await cacheHandlers.get("channels", snowflakeToBigint(payload.channelId));
if (channel) channel.lastMessageId = snowflakeToBigint(payload.id);
const guild = payload.guildId ? await cacheHandlers.get("guilds", snowflakeToBigint(payload.guildId)) : undefined; const message = bot.transformers.message(bot, payload);
await bot.cache.messages.set(message.id, message);
if (payload.member && guild) { bot.events.messageCreate(bot, message);
// If in a guild cache the author as a member
const discordenoMember = await structures.createDiscordenoMember(
{ ...payload.member, user: payload.author } as GuildMemberWithUser,
guild.id
);
await cacheHandlers.set("members", discordenoMember.id, discordenoMember);
}
if (payload.mentions && guild) {
await Promise.all(
payload.mentions.map(async (mention) => {
// Cache the member if its a valid member
if (mention.member) {
const discordenoMember = await structures.createDiscordenoMember(
{ ...mention.member, user: mention } as GuildMemberWithUser,
guild.id
);
return cacheHandlers.set("members", snowflakeToBigint(mention.id), discordenoMember);
}
})
);
}
const message = await structures.createDiscordenoMessage(data.d as Message);
// Cache the message
await cacheHandlers.set("messages", snowflakeToBigint(payload.id), message);
eventHandlers.messageCreate?.(message);
} }
+13 -11
View File
@@ -1,18 +1,20 @@
import { eventHandlers } from "../../bot.ts"; import { Bot } from "../../bot.ts";
import { cacheHandlers } from "../../cache.ts";
import type { DiscordGatewayPayload } from "../../types/gateway/gateway_payload.ts"; import type { DiscordGatewayPayload } from "../../types/gateway/gateway_payload.ts";
import type { MessageDelete } from "../../types/messages/message_delete.ts"; import type { MessageDelete } from "../../types/messages/message_delete.ts";
import { snowflakeToBigint } from "../../util/bigint.ts"; import { SnakeCasedPropertiesDeep } from "../../types/util.ts";
export async function handleMessageDelete(data: DiscordGatewayPayload) { export async function handleMessageDelete(bot: Bot, data: DiscordGatewayPayload) {
const payload = data.d as MessageDelete; const payload = data.d as SnakeCasedPropertiesDeep<MessageDelete>;
const channel = await cacheHandlers.get("channels", snowflakeToBigint(payload.channelId)); const id = bot.transformers.snowflake(payload.id);
if (!channel) return;
eventHandlers.messageDelete?.( bot.events.messageDelete(bot,
{ id: payload.id, channel }, {
await cacheHandlers.get("messages", snowflakeToBigint(payload.id)) id,
channelId: bot.transformers.snowflake(payload.channel_id),
guildId: payload.guild_id ? bot.transformers.snowflake(payload.guild_id) : undefined,
},
await bot.cache.messages.get(id)
); );
await cacheHandlers.delete("messages", snowflakeToBigint(payload.id)); await bot.cache.messages.delete(id);
} }
+18 -13
View File
@@ -1,18 +1,23 @@
import { eventHandlers } from "../../bot.ts"; import { Bot } from "../../bot.ts";
import { cacheHandlers } from "../../cache.ts";
import type { DiscordGatewayPayload } from "../../types/gateway/gateway_payload.ts"; import type { DiscordGatewayPayload } from "../../types/gateway/gateway_payload.ts";
import type { MessageDeleteBulk } from "../../types/messages/message_delete_bulk.ts"; import type { MessageDeleteBulk } from "../../types/messages/message_delete_bulk.ts";
import { snowflakeToBigint } from "../../util/bigint.ts"; import { SnakeCasedPropertiesDeep } from "../../types/util.ts";
export async function handleMessageDeleteBulk(data: DiscordGatewayPayload) { export async function handleMessageDeleteBulk(bot: Bot, data: DiscordGatewayPayload) {
const payload = data.d as MessageDeleteBulk; const payload = data.d as SnakeCasedPropertiesDeep<MessageDeleteBulk>;
const channel = await cacheHandlers.get("channels", snowflakeToBigint(payload.channelId));
if (!channel) return;
return Promise.all( const ids = payload.ids.map((id) => bot.transformers.snowflake(id));
payload.ids.map(async (id) => { const messages = await bot.cache.execute("BULK_DELETE_MESSAGES", { messageIds: ids });
eventHandlers.messageDelete?.({ id, channel }, await cacheHandlers.get("messages", snowflakeToBigint(id)));
await cacheHandlers.delete("messages", snowflakeToBigint(id)); ids.forEach((id) => {
}) bot.events.messageDelete(
); bot,
{
id,
channelId: bot.transformers.snowflake(payload.channel_id),
guildId: payload.guild_id ? bot.transformers.snowflake(payload.guild_id) : undefined,
},
messages.find((m) => m.id === id)
);
});
} }
+13 -34
View File
@@ -1,39 +1,18 @@
import { botId, eventHandlers } from "../../bot.ts"; import { Bot } from "../../bot.ts";
import { cacheHandlers } from "../../cache.ts";
import { structures } from "../../structures/mod.ts";
import type { DiscordGatewayPayload } from "../../types/gateway/gateway_payload.ts"; import type { DiscordGatewayPayload } from "../../types/gateway/gateway_payload.ts";
import type { MessageReactionAdd } from "../../types/messages/message_reaction_add.ts"; import type { MessageReactionAdd } from "../../types/messages/message_reaction_add.ts";
import { snowflakeToBigint } from "../../util/bigint.ts"; import { SnakeCasedPropertiesDeep } from "../../types/util.ts";
export async function handleMessageReactionAdd(data: DiscordGatewayPayload) { export async function handleMessageReactionAdd(bot: Bot, data: DiscordGatewayPayload) {
const payload = data.d as MessageReactionAdd; const payload = data.d as SnakeCasedPropertiesDeep<MessageReactionAdd>;
const message = await cacheHandlers.get("messages", snowflakeToBigint(payload.messageId));
if (message) { const guildId = payload.guild_id ? bot.transformers.snowflake(payload.guild_id) : undefined;
const reactionExisted = message.reactions?.find( bot.events.reactionAdd(bot, {
(reaction) => reaction.emoji.id === payload.emoji.id && reaction.emoji.name === payload.emoji.name userId: bot.transformers.snowflake(payload.user_id),
); channelId: bot.transformers.snowflake(payload.channel_id),
messageId: bot.transformers.snowflake(payload.message_id),
if (reactionExisted) reactionExisted.count++; guildId,
else { member: payload.member && guildId ? bot.transformers.member(bot, payload.member, guildId) : undefined,
const newReaction = { emoji: bot.transformers.emoji(bot, payload.emoji),
count: 1, });
me: snowflakeToBigint(payload.userId) === botId,
emoji: { ...payload.emoji, id: payload.emoji.id || undefined },
};
message.reactions = message.reactions ? [...message.reactions, newReaction] : [newReaction];
}
await cacheHandlers.set("messages", snowflakeToBigint(payload.messageId), message);
}
if (payload.member && payload.guildId) {
const guild = await cacheHandlers.get("guilds", snowflakeToBigint(payload.guildId));
if (guild) {
const discordenoMember = await structures.createDiscordenoMember(payload.member, guild.id);
await cacheHandlers.set("members", discordenoMember.id, discordenoMember);
}
}
eventHandlers.reactionAdd?.(payload, message);
} }
@@ -1,30 +1,16 @@
import { eventHandlers } from "../../bot.ts"; import { Bot, } from "../../bot.ts";
import { cacheHandlers } from "../../cache.ts";
import type { DiscordGatewayPayload } from "../../types/gateway/gateway_payload.ts"; import type { DiscordGatewayPayload } from "../../types/gateway/gateway_payload.ts";
import type { MessageReactionRemove } from "../../types/messages/message_reaction_remove.ts"; import type { MessageReactionRemove } from "../../types/messages/message_reaction_remove.ts";
import { snowflakeToBigint } from "../../util/bigint.ts"; import { SnakeCasedPropertiesDeep } from "../../types/util.ts";
export async function handleMessageReactionRemove(data: DiscordGatewayPayload) { export async function handleMessageReactionRemove(bot: Bot, data: DiscordGatewayPayload) {
const payload = data.d as MessageReactionRemove; const payload = data.d as SnakeCasedPropertiesDeep<MessageReactionRemove>;
const message = await cacheHandlers.get("messages", snowflakeToBigint(payload.messageId));
if (message) { bot.events.reactionRemove(bot, {
const reaction = message.reactions?.find( userId: bot.transformers.snowflake(payload.user_id),
(reaction) => channelId: bot.transformers.snowflake(payload.channel_id),
// MUST USE == because discord sends null and we use undefined messageId: bot.transformers.snowflake(payload.message_id),
reaction.emoji.id == payload.emoji.id && reaction.emoji.name === payload.emoji.name guildId: payload.guild_id ? bot.transformers.snowflake(payload.guild_id) : undefined,
); emoji: bot.transformers.emoji(bot, payload.emoji),
});
if (reaction) {
reaction.count--;
if (reaction.count === 0) {
message.reactions = message.reactions?.filter((r) => r.count !== 0);
}
if (!message.reactions?.length) message.reactions = undefined;
await cacheHandlers.set("messages", message.id, message);
}
}
eventHandlers.reactionRemove?.(payload, message);
} }
@@ -1,18 +1,14 @@
import { eventHandlers } from "../../bot.ts"; import { Bot } from "../../bot.ts";
import { cacheHandlers } from "../../cache.ts";
import type { DiscordGatewayPayload } from "../../types/gateway/gateway_payload.ts"; import type { DiscordGatewayPayload } from "../../types/gateway/gateway_payload.ts";
import type { MessageReactionRemoveAll } from "../../types/messages/message_reaction_remove_all.ts"; import type { MessageReactionRemoveAll } from "../../types/messages/message_reaction_remove_all.ts";
import { snowflakeToBigint } from "../../util/bigint.ts"; import { SnakeCasedPropertiesDeep } from "../../types/util.ts";
export async function handleMessageReactionRemoveAll(data: DiscordGatewayPayload) { export async function handleMessageReactionRemoveAll(bot: Bot, data: DiscordGatewayPayload) {
const payload = data.d as MessageReactionRemoveAll; const payload = data.d as SnakeCasedPropertiesDeep<MessageReactionRemoveAll>;
const message = await cacheHandlers.get("messages", snowflakeToBigint(payload.messageId));
if (message?.reactions) { bot.events.reactionRemoveAll(bot, {
message.reactions = undefined; channelId: bot.transformers.snowflake(payload.channel_id),
messageId: bot.transformers.snowflake(payload.message_id),
await cacheHandlers.set("messages", snowflakeToBigint(payload.messageId), message); guildId: payload.guild_id ? bot.transformers.snowflake(payload.guild_id) : undefined,
} });
eventHandlers.reactionRemoveAll?.(payload, message);
} }
@@ -1,31 +1,15 @@
import { eventHandlers } from "../../bot.ts"; import { Bot } from "../../bot.ts";
import { cacheHandlers } from "../../cache.ts";
import type { DiscordGatewayPayload } from "../../types/gateway/gateway_payload.ts"; import type { DiscordGatewayPayload } from "../../types/gateway/gateway_payload.ts";
import type { MessageReactionRemoveEmoji } from "../../types/messages/message_reaction_remove_emoji.ts"; import type { MessageReactionRemoveEmoji } from "../../types/messages/message_reaction_remove_emoji.ts";
import { snowflakeToBigint } from "../../util/bigint.ts"; import { SnakeCasedPropertiesDeep } from "../../types/util.ts";
export async function handleMessageReactionRemoveEmoji(data: DiscordGatewayPayload) { export async function handleMessageReactionRemoveEmoji(bot: Bot, data: DiscordGatewayPayload) {
const payload = data.d as MessageReactionRemoveEmoji; const payload = data.d as SnakeCasedPropertiesDeep<MessageReactionRemoveEmoji>;
const message = await cacheHandlers.get("messages", snowflakeToBigint(payload.messageId));
if (message?.reactions) { bot.events.reactionRemoveEmoji(bot, {
message.reactions = message.reactions.filter( channelId: bot.transformers.snowflake(payload.channel_id),
(reaction) => messageId: bot.transformers.snowflake(payload.message_id),
!( guildId: payload.guild_id ? bot.transformers.snowflake(payload.guild_id) : undefined,
// MUST USE == because discord sends null and we use undefined emoji: bot.transformers.emoji(bot, payload.emoji),
(reaction.emoji.id == payload.emoji.id && reaction.emoji.name === payload.emoji.name) });
)
);
if (!message.reactions.length) message.reactions = undefined;
await cacheHandlers.set("messages", message.id, message);
}
eventHandlers.reactionRemoveEmoji?.(
payload.emoji,
snowflakeToBigint(payload.messageId),
snowflakeToBigint(payload.channelId),
payload.guildId ? snowflakeToBigint(payload.guildId) : undefined
);
} }
+11 -19
View File
@@ -1,26 +1,18 @@
import { eventHandlers } from "../../bot.ts"; import { Bot } from "../../bot.ts";
import { cacheHandlers } from "../../cache.ts";
import { structures } from "../../structures/mod.ts";
import type { DiscordGatewayPayload } from "../../types/gateway/gateway_payload.ts"; import type { DiscordGatewayPayload } from "../../types/gateway/gateway_payload.ts";
import type { Message } from "../../types/messages/message.ts"; import type { Message } from "../../types/messages/message.ts";
import { snowflakeToBigint } from "../../util/bigint.ts"; import { SnakeCasedPropertiesDeep } from "../../types/util.ts";
export async function handleMessageUpdate(data: DiscordGatewayPayload) { export async function handleMessageUpdate(bot: Bot, data: DiscordGatewayPayload) {
const payload = data.d as Message; const payload = data.d as SnakeCasedPropertiesDeep<Message>;
const channel = await cacheHandlers.get("channels", snowflakeToBigint(payload.channelId)); if (!payload.edited_timestamp) return;
if (!channel) return;
const oldMessage = await cacheHandlers.get("messages", snowflakeToBigint(payload.id)); const message = bot.transformers.message(bot, payload);
if (!oldMessage) return;
// Messages with embeds can trigger update but they wont have edited_timestamp // GET OLD CACHED MESSAGE IF ONE WAS CACHED
if (!payload.editedTimestamp || oldMessage.content === payload.content) { const oldMessage = await bot.cache.messages.get(message.id);
return; if (oldMessage?.content === message.content) return;
}
const message = await structures.createDiscordenoMessage(payload); await bot.cache.messages.set(message.id, message);
bot.events.messageUpdate(bot, message, oldMessage);
await cacheHandlers.set("messages", snowflakeToBigint(payload.id), message);
eventHandlers.messageUpdate?.(message, oldMessage);
} }
+1 -4
View File
@@ -56,6 +56,7 @@ export {
handleGuildBanRemove, handleGuildBanRemove,
handleGuildCreate, handleGuildCreate,
handleGuildDelete, handleGuildDelete,
handleGuildLoaded,
handleGuildEmojisUpdate, handleGuildEmojisUpdate,
handleGuildIntegrationsUpdate, handleGuildIntegrationsUpdate,
handleGuildMemberAdd, handleGuildMemberAdd,
@@ -96,7 +97,3 @@ export {
handleVoiceStateUpdate, handleVoiceStateUpdate,
handleWebhooksUpdate, handleWebhooksUpdate,
}; };
export const handlers = {
};
+13 -2
View File
@@ -3,10 +3,21 @@ import type { Bot } from "../../bot.ts";
import { SnakeCasedPropertiesDeep } from "../../types/util.ts"; import { SnakeCasedPropertiesDeep } from "../../types/util.ts";
/** Get the bots Gateway metadata that can help during the operation of large or sharded bots. */ /** Get the bots Gateway metadata that can help during the operation of large or sharded bots. */
export async function getGatewayBot(bot: Bot) { export async function getGatewayBot(bot: Bot): Promise<GetGatewayBot> {
return await bot.rest.runMethod<SnakeCasedPropertiesDeep<GetGatewayBot>>( const result = await bot.rest.runMethod<SnakeCasedPropertiesDeep<GetGatewayBot>>(
bot.rest, bot.rest,
"get", "get",
bot.constants.endpoints.GATEWAY_BOT bot.constants.endpoints.GATEWAY_BOT
); );
return {
url: result.url,
shards: result.shards,
sessionStartLimit: {
total: result.session_start_limit.total,
remaining: result.session_start_limit.remaining,
resetAfter: result.session_start_limit.reset_after,
maxConcurrency: result.session_start_limit.max_concurrency,
},
};
} }
-174
View File
@@ -313,177 +313,3 @@ export {
unlockThread, unlockThread,
suppressEmbeds, suppressEmbeds,
}; };
export let helpers = {
// channels
channelOverwriteHasPermission,
createChannel,
deleteChannelOverwrite,
deleteChannel,
editChannelOverwrite,
editChannel,
followChannel,
getChannelWebhooks,
getChannel,
getChannels,
getPins,
isChannelSynced,
startTyping,
swapChannels,
updateBotVoiceState,
createStageInstance,
getStageInstance,
updateStageInstance,
deleteStageInstance,
// commands
createSlashCommand,
deleteSlashCommand,
deleteSlashResponse,
editSlashResponse,
getSlashCommandPermission,
getSlashCommandPermissions,
batchEditSlashCommandPermissions,
editSlashCommandPermissions,
sendInteractionResponse,
getSlashCommand,
getSlashCommands,
upsertSlashCommand,
upsertSlashCommands,
getOriginalInteractionResponse,
// emojis
createEmoji,
deleteEmoji,
editEmoji,
getEmoji,
getEmojis,
// guilds
categoryChildren,
createGuild,
deleteGuild,
editGuild,
editWidget,
editWelcomeScreen,
emojiURL,
getAuditLogs,
getAvailableVoiceRegions,
getBan,
getBans,
getGuildPreview,
getGuild,
getWelcomeScreen,
getPruneCount,
getVanityURL,
getVoiceRegions,
getWidgetImageURL,
getWidgetSettings,
getWidget,
guildBannerURL,
guildIconURL,
guildSplashURL,
leaveGuild,
// discovery
addDiscoverySubcategory,
editDiscovery,
getDiscoveryCategories,
removeDiscoverySubcategory,
validDiscoveryTerm,
// integrations
deleteIntegration,
getIntegrations,
// invites
createInvite,
deleteInvite,
getChannelInvites,
getInvite,
getInvites,
// members
avatarURL,
banMember,
disconnectMember,
editBotNickname,
editBotProfile,
editMember,
fetchMembers,
getMember,
getMembers,
kickMember,
moveMember,
pruneMembers,
sendDirectMessage,
unbanMember,
// messages
addReaction,
addReactions,
deleteMessage,
deleteMessages,
editMessage,
getMessage,
getMessages,
getReactions,
pinMessage,
publishMessage,
removeAllReactions,
removeReactionEmoji,
removeReaction,
sendMessage,
unpinMessage,
// misc
getGatewayBot,
getUser,
// roles
addRole,
createRole,
deleteRole,
editRole,
getRoles,
removeRole,
// templates
createGuildFromTemplate,
createGuildTemplate,
deleteGuildTemplate,
editGuildTemplate,
getGuildTemplates,
getTemplate,
syncGuildTemplate,
// voice
connectToVoiceChannel,
// webhooks
createWebhook,
deleteWebhookMessage,
deleteWebhookWithToken,
deleteWebhook,
editWebhookMessage,
editWebhookWithToken,
editWebhook,
sendWebhook,
getWebhookWithToken,
getWebhook,
getWebhooks,
getWebhookMessage,
// threads
addToThread,
archiveThread,
deleteThread,
editThread,
getActiveThreads,
getArchivedThreads,
getThreadMembers,
joinThread,
leaveThread,
lockThread,
removeThreadMember,
startPrivateThread,
startThread,
unarchiveThread,
unlockThread,
suppressEmbeds,
};
export type Helpers = typeof helpers;
export function updateHelpers(newHelpers: Partial<Helpers>) {
helpers = {
...helpers,
...newHelpers,
};
}
+37
View File
@@ -0,0 +1,37 @@
import { Bot } from "../bot.ts";
import { Emoji } from "../types/emojis/emoji.ts";
import { SnakeCasedPropertiesDeep } from "../types/util.ts";
import { DiscordenoUser } from "./member.ts";
export function transformEmoji(bot: Bot, payload: SnakeCasedPropertiesDeep<Emoji>): DiscordenoEmoji {
return {
id: payload.id ? bot.transformers.snowflake(payload.id) : undefined,
name: payload.name || undefined,
roles: payload.roles?.map((id) => bot.transformers.snowflake(id)),
user: payload.user ? bot.transformers.user(bot, payload.user) : undefined,
// TODO: change to bitfield?
requireColons: payload.require_colons,
managed: payload.managed,
animated: payload.animated,
available: payload.available,
};
}
export interface DiscordenoEmoji {
/** Emoji id */
id?: bigint;
/** Emoji name (can only be null in reaction emoji objects) */
name?: string;
/** Roles allowed to use this emoji */
roles?: bigint[];
/** User that created this emoji */
user?: DiscordenoUser;
/** Whether this emoji must be wrapped in colons */
requireColons?: boolean;
/** Whether this emoji is managed */
managed?: boolean;
/** Whether this emoji is animated */
animated?: boolean;
/** Whether this emoji can be used, may be false due to loss of Server Boosts */
available?: boolean;
}
+2 -2
View File
@@ -3,9 +3,9 @@ import { User } from "../users/user.ts";
/** https://discord.com/developers/docs/resources/emoji#emoji-object-emoji-structure */ /** https://discord.com/developers/docs/resources/emoji#emoji-object-emoji-structure */
export interface Emoji { export interface Emoji {
/** Emoji id */ /** Emoji id */
id: string | null; id?: string;
/** Emoji name (can only be null in reaction emoji objects) */ /** Emoji name (can only be null in reaction emoji objects) */
name: string | null; name?: string;
/** Roles allowed to use this emoji */ /** Roles allowed to use this emoji */
roles?: string[]; roles?: string[];
/** User that created this emoji */ /** User that created this emoji */
+18
View File
@@ -5,6 +5,7 @@ import type { DiscordHello } from "../types/gateway/hello.ts";
import type { DiscordReady } from "../types/gateway/ready.ts"; import type { DiscordReady } from "../types/gateway/ready.ts";
import { Guild } from "../types/guilds/guild.ts"; import { Guild } from "../types/guilds/guild.ts";
import { UnavailableGuild } from "../types/guilds/unavailable_guild.ts"; import { UnavailableGuild } from "../types/guilds/unavailable_guild.ts";
import { Message } from "../types/messages/mod.ts";
import { SnakeCasedPropertiesDeep } from "../types/util.ts"; import { SnakeCasedPropertiesDeep } from "../types/util.ts";
import { snowflakeToBigint } from "../util/bigint.ts"; import { snowflakeToBigint } from "../util/bigint.ts";
import { delay } from "../util/utils.ts"; import { delay } from "../util/utils.ts";
@@ -135,6 +136,23 @@ export async function handleOnMessage(gateway: GatewayManager, message: any, sha
gateway.cache.guildIds.add(id); gateway.cache.guildIds.add(id);
} }
// MESSAGE_UPDATE CAN SPAM FOR NO REASON USE THIS TO IGNORE
if (messageData.t === "MESSAGE_UPDATE") {
const payload = messageData.d as SnakeCasedPropertiesDeep<Message>;
const id = snowflakeToBigint(payload.id);
const content = payload.content || "";
const cached = gateway.cache.editedMessages.get(id);
if (cached === content) return;
else {
// ADD TO LOCAL CACHE FOR FUTURE EVENTS.
gateway.cache.editedMessages.set(id, content);
// REMOVE AFTER 10 SECONDS FROM CACHE
setTimeout(() => gateway.cache.editedMessages.delete(id), 10000);
}
}
// MUST HANDLE GUILD_DELETE EVENTS FOR UNAVAILABLE // MUST HANDLE GUILD_DELETE EVENTS FOR UNAVAILABLE
if (messageData.t === "GUILD_DELETE") { if (messageData.t === "GUILD_DELETE") {
if ((messageData.d as UnavailableGuild).unavailable) return; if ((messageData.d as UnavailableGuild).unavailable) return;