This commit is contained in:
ITOH
2021-04-09 23:07:20 +02:00
parent b40aaf5a8f
commit 7a6b4bf2d7
41 changed files with 233 additions and 190 deletions
+47 -38
View File
@@ -1,8 +1,8 @@
// deno-lint-ignore-file require-await no-explicit-any prefer-const
import { ChannelStruct } from "./structures/channel.ts";
import { GuildStruct } from "./structures/guild.ts";
import { MemberStruct } from "./structures/member.ts";
import { MessageStruct } from "./structures/message.ts";
import { DiscordenoChannel } from "./structures/channel.ts";
import { DiscordenoGuild } from "./structures/guild.ts";
import { DiscordenoMember } from "./structures/member.ts";
import { DiscordenoMessage } from "./structures/message.ts";
import { Emoji } from "./types/emojis/emoji.ts";
import { PresenceUpdate } from "./types/misc/presence_update.ts";
import { Collection } from "./util/collection.ts";
@@ -10,13 +10,13 @@ import { Collection } from "./util/collection.ts";
export const cache = {
isReady: false,
/** All of the guild objects the bot has access to, mapped by their Ids */
guilds: new Collection<string, GuildStruct>(),
guilds: new Collection<string, DiscordenoGuild>(),
/** All of the channel objects the bot has access to, mapped by their Ids */
channels: new Collection<string, ChannelStruct>(),
channels: new Collection<string, DiscordenoChannel>(),
/** All of the message objects the bot has cached since the bot acquired `READY` state, mapped by their Ids */
messages: new Collection<string, MessageStruct>(),
messages: new Collection<string, DiscordenoMessage>(),
/** All of the member objects that have been cached since the bot acquired `READY` state, mapped by their Ids */
members: new Collection<string, MemberStruct>(),
members: new Collection<string, DiscordenoMember>(),
/** All of the unavailable guilds, mapped by their Ids (id, timestamp) */
unavailableGuilds: new Collection<string, number>(),
/** All of the presence update objects received in PRESENCE_UPDATE gateway event, mapped by their user Id */
@@ -25,8 +25,8 @@ export const cache = {
string,
(
value:
| Collection<string, MemberStruct>
| PromiseLike<Collection<string, MemberStruct>>,
| Collection<string, DiscordenoMember>
| PromiseLike<Collection<string, DiscordenoMember>>,
) => void
>(),
executedSlashCommands: new Collection<string, string>(),
@@ -81,23 +81,23 @@ export type TableName =
function set(
table: "guilds",
key: string,
value: GuildStruct,
): Promise<Collection<string, GuildStruct>>;
value: DiscordenoGuild,
): Promise<Collection<string, DiscordenoGuild>>;
function set(
table: "channels",
key: string,
value: ChannelStruct,
): Promise<Collection<string, ChannelStruct>>;
value: DiscordenoChannel,
): Promise<Collection<string, DiscordenoChannel>>;
function set(
table: "messages",
key: string,
value: MessageStruct,
): Promise<Collection<string, MessageStruct>>;
value: DiscordenoMessage,
): Promise<Collection<string, DiscordenoMessage>>;
function set(
table: "members",
key: string,
value: MemberStruct,
): Promise<Collection<string, MemberStruct>>;
value: DiscordenoMember,
): Promise<Collection<string, DiscordenoMember>>;
function set(
table: "presences",
key: string,
@@ -112,13 +112,22 @@ async function set(table: TableName, key: string, value: any) {
return cache[table].set(key, value);
}
function get(table: "guilds", key: string): Promise<GuildStruct | undefined>;
function get(
table: "guilds",
key: string,
): Promise<DiscordenoGuild | undefined>;
function get(
table: "channels",
key: string,
): Promise<ChannelStruct | undefined>;
function get(table: "messages", key: string): Promise<MemberStruct | undefined>;
function get(table: "members", key: string): Promise<MemberStruct | undefined>;
): Promise<DiscordenoChannel | undefined>;
function get(
table: "messages",
key: string,
): Promise<DiscordenoMember | undefined>;
function get(
table: "members",
key: string,
): Promise<DiscordenoMember | undefined>;
function get(
table: "presences",
key: string,
@@ -134,9 +143,9 @@ async function get(table: TableName, key: string) {
function forEach(
table: "guilds",
callback: (
value: GuildStruct,
value: DiscordenoGuild,
key: string,
map: Map<string, GuildStruct>,
map: Map<string, DiscordenoGuild>,
) => unknown,
): void;
function forEach(
@@ -146,25 +155,25 @@ function forEach(
function forEach(
table: "channels",
callback: (
value: ChannelStruct,
value: DiscordenoChannel,
key: string,
map: Map<string, ChannelStruct>,
map: Map<string, DiscordenoChannel>,
) => unknown,
): void;
function forEach(
table: "messages",
callback: (
value: MessageStruct,
value: DiscordenoMessage,
key: string,
map: Map<string, MessageStruct>,
map: Map<string, DiscordenoMessage>,
) => unknown,
): void;
function forEach(
table: "members",
callback: (
value: MemberStruct,
value: DiscordenoMember,
key: string,
map: Map<string, MemberStruct>,
map: Map<string, DiscordenoMember>,
) => unknown,
): void;
function forEach(
@@ -176,24 +185,24 @@ function forEach(
function filter(
table: "guilds",
callback: (value: GuildStruct, key: string) => boolean,
): Promise<Collection<string, GuildStruct>>;
callback: (value: DiscordenoGuild, key: string) => boolean,
): Promise<Collection<string, DiscordenoGuild>>;
function filter(
table: "unavailableGuilds",
callback: (value: number, key: string) => boolean,
): Promise<Collection<string, number>>;
function filter(
table: "channels",
callback: (value: ChannelStruct, key: string) => boolean,
): Promise<Collection<string, ChannelStruct>>;
callback: (value: DiscordenoChannel, key: string) => boolean,
): Promise<Collection<string, DiscordenoChannel>>;
function filter(
table: "messages",
callback: (value: MessageStruct, key: string) => boolean,
): Promise<Collection<string, MessageStruct>>;
callback: (value: DiscordenoMessage, key: string) => boolean,
): Promise<Collection<string, DiscordenoMessage>>;
function filter(
table: "members",
callback: (value: MemberStruct, key: string) => boolean,
): Promise<Collection<string, MemberStruct>>;
callback: (value: DiscordenoMember, key: string) => boolean,
): Promise<Collection<string, DiscordenoMember>>;
async function filter(
table: TableName,
callback: (value: any, key: string) => boolean,
+3 -3
View File
@@ -7,8 +7,8 @@ import { DiscordGatewayPayload } from "../../types/gateway/gateway_payload.ts";
export async function handleChannelCreate(data: DiscordGatewayPayload) {
const payload = data.d as DiscordChannel;
const channelStruct = await structures.createChannelStruct(payload);
await cacheHandlers.set("channels", channelStruct.id, channelStruct);
const discordenoChannel = await structures.createDiscordenoChannel(payload);
await cacheHandlers.set("channels", discordenoChannel.id, discordenoChannel);
eventHandlers.channelCreate?.(channelStruct);
eventHandlers.channelCreate?.(discordenoChannel);
}
+3 -3
View File
@@ -8,10 +8,10 @@ export async function handleChannelUpdate(data: DiscordGatewayPayload) {
const payload = data.d as DiscordChannel;
const cachedChannel = await cacheHandlers.get("channels", payload.id);
const channelStruct = await structures.createChannelStruct(payload);
await cacheHandlers.set("channels", channelStruct.id, channelStruct);
const discordenoChannel = await structures.createDiscordenoChannel(payload);
await cacheHandlers.set("channels", discordenoChannel.id, discordenoChannel);
if (!cachedChannel) return;
eventHandlers.channelUpdate?.(channelStruct, cachedChannel);
eventHandlers.channelUpdate?.(discordenoChannel, cachedChannel);
}
+5 -5
View File
@@ -13,11 +13,11 @@ export async function handleGuildCreate(
// When shards resume they emit GUILD_CREATE again.
if (await cacheHandlers.has("guilds", payload.id)) return;
const guildStruct = await structures.createGuildStruct(
const discordenoGuild = await structures.createDiscordenoGuild(
payload,
shardId,
);
await cacheHandlers.set("guilds", guildStruct.id, guildStruct);
await cacheHandlers.set("guilds", discordenoGuild.id, discordenoGuild);
const shard = ws.shards.get(shardId);
@@ -26,9 +26,9 @@ export async function handleGuildCreate(
shard.unavailableGuildIds.delete(payload.id);
return eventHandlers.guildAvailable?.(guildStruct);
return eventHandlers.guildAvailable?.(discordenoGuild);
}
if (!cache.isReady) return eventHandlers.guildLoaded?.(guildStruct);
eventHandlers.guildCreate?.(guildStruct);
if (!cache.isReady) return eventHandlers.guildLoaded?.(discordenoGuild);
eventHandlers.guildCreate?.(discordenoGuild);
}
@@ -5,16 +5,16 @@ import { DiscordGatewayPayload } from "../../types/gateway/gateway_payload.ts";
export async function handleInteractionCreate(data: DiscordGatewayPayload) {
const payload = data.d as InteractionCommandPayload;
const memberStruct = await structures.createMemberStruct(
const discordenoMember = await structures.createDiscordenoMember(
payload.member,
payload.guild_id,
);
await cacheHandlers.set("members", memberStruct.id, memberStruct);
await cacheHandlers.set("members", discordenoMember.id, discordenoMember);
eventHandlers.interactionCreate?.(
{
...payload,
member: memberStruct,
member: discordenoMember,
},
);
}
+3 -3
View File
@@ -9,13 +9,13 @@ export async function handleGuildMembersChunk(data: DiscordGatewayPayload) {
const members = await Promise.all(
payload.members.map(async (member) => {
const memberStruct = await structures.createMemberStruct(
const discordenoMember = await structures.createDiscordenoMember(
member,
payload.guild_id,
);
await cacheHandlers.set("members", memberStruct.id, memberStruct);
await cacheHandlers.set("members", discordenoMember.id, discordenoMember);
return memberStruct;
return discordenoMember;
}),
);
+3 -3
View File
@@ -10,11 +10,11 @@ export async function handleGuildMemberAdd(data: DiscordGatewayPayload) {
if (!guild) return;
guild.memberCount++;
const memberStruct = await structures.createMemberStruct(
const discordenoMember = await structures.createDiscordenoMember(
payload,
payload.guild_id,
);
await cacheHandlers.set("members", memberStruct.id, memberStruct);
await cacheHandlers.set("members", discordenoMember.id, discordenoMember);
eventHandlers.guildMemberAdd?.(guild, memberStruct);
eventHandlers.guildMemberAdd?.(guild, discordenoMember);
}
+7 -7
View File
@@ -23,24 +23,24 @@ export async function handleGuildMemberUpdate(data: DiscordGatewayPayload) {
mute: guildMember?.mute || false,
roles: payload.roles,
};
const memberStruct = await structures.createMemberStruct(
const discordenoMember = await structures.createDiscordenoMember(
newMemberData,
payload.guild_id,
);
await cacheHandlers.set("members", memberStruct.id, memberStruct);
await cacheHandlers.set("members", discordenoMember.id, discordenoMember);
if (guildMember) {
if (guildMember.nick !== payload.nick) {
eventHandlers.nicknameUpdate?.(
guild,
memberStruct,
discordenoMember,
payload.nick!,
guildMember.nick,
);
}
if (payload.pending === false && guildMember.pending === true) {
eventHandlers.membershipScreeningPassed?.(guild, memberStruct);
eventHandlers.membershipScreeningPassed?.(guild, discordenoMember);
}
const roleIds = guildMember.roles || [];
@@ -51,7 +51,7 @@ export async function handleGuildMemberUpdate(data: DiscordGatewayPayload) {
`1. Running forEach loop in GUILD_MEMBER_UPDATE file.`,
);
if (!payload.roles.includes(id)) {
eventHandlers.roleLost?.(guild, memberStruct, id);
eventHandlers.roleLost?.(guild, discordenoMember, id);
}
});
@@ -61,10 +61,10 @@ export async function handleGuildMemberUpdate(data: DiscordGatewayPayload) {
`2. Running forEach loop in GUILD_MEMBER_UPDATE file.`,
);
if (!roleIds.includes(id)) {
eventHandlers.roleGained?.(guild, memberStruct, id);
eventHandlers.roleGained?.(guild, discordenoMember, id);
}
});
}
eventHandlers.guildMemberUpdate?.(guild, memberStruct, cachedMember);
eventHandlers.guildMemberUpdate?.(guild, discordenoMember, cachedMember);
}
+9 -5
View File
@@ -15,26 +15,30 @@ export async function handleMessageCreate(data: DiscordGatewayPayload) {
if (payload.member && guild) {
// If in a guild cache the author as a member
const memberStruct = await structures.createMemberStruct(
const discordenoMember = await structures.createDiscordenoMember(
{ ...payload.member, user: payload.author },
guild.id,
);
await cacheHandlers.set("members", memberStruct.id, memberStruct);
await cacheHandlers.set("members", discordenoMember.id, discordenoMember);
}
await Promise.all(payload.mentions.map(async (mention) => {
// Cache the member if its a valid member
if (mention.member && guild) {
const memberStruct = await structures.createMemberStruct(
const discordenoMember = await structures.createDiscordenoMember(
{ ...mention.member, user: mention },
guild.id,
);
return cacheHandlers.set("members", memberStruct.id, memberStruct);
return cacheHandlers.set(
"members",
discordenoMember.id,
discordenoMember,
);
}
}));
const message = await structures.createMessageStruct(payload);
const message = await structures.createDiscordenoMessage(payload);
// Cache the message
await cacheHandlers.set("messages", payload.id, message);
@@ -33,11 +33,11 @@ export async function handleMessageReactionAdd(data: DiscordGatewayPayload) {
if (payload.member && payload.guild_id) {
const guild = await cacheHandlers.get("guilds", payload.guild_id);
if (guild) {
const memberStruct = await structures.createMemberStruct(
const discordenoMember = await structures.createDiscordenoMember(
payload.member,
guild.id,
);
await cacheHandlers.set("members", memberStruct.id, memberStruct);
await cacheHandlers.set("members", discordenoMember.id, discordenoMember);
}
}
@@ -35,11 +35,11 @@ export async function handleMessageReactionRemove(
if (payload.member && payload.guild_id) {
const guild = await cacheHandlers.get("guilds", payload.guild_id);
if (guild) {
const memberStruct = await structures.createMemberStruct(
const discordenoMember = await structures.createDiscordenoMember(
payload.member,
guild.id,
);
await cacheHandlers.set("members", memberStruct.id, memberStruct);
await cacheHandlers.set("members", discordenoMember.id, discordenoMember);
}
}
+1 -1
View File
@@ -29,7 +29,7 @@ export async function handleMessageUpdate(data: DiscordGatewayPayload) {
return;
}
const message = await structures.createMessageStruct(payload);
const message = await structures.createDiscordenoMessage(payload);
await cacheHandlers.set("messages", payload.id, message);
+3 -3
View File
@@ -102,15 +102,15 @@ async function loaded(shardId: number) {
);
await Promise.allSettled(
members.map(async (member) => {
const memberStruct = await structures.createMemberStruct(
const discordenoMember = await structures.createDiscordenoMember(
snakeKeysToCamelCase(member),
guildId,
);
return cacheHandlers.set(
"members",
memberStruct.id,
memberStruct,
discordenoMember.id,
discordenoMember,
);
}),
);
+1 -1
View File
@@ -8,7 +8,7 @@ export async function handleGuildRoleCreate(data: DiscordGatewayPayload) {
const guild = await cacheHandlers.get("guilds", payload.guild_id);
if (!guild) return;
const role = await structures.createRoleStruct(payload.role);
const role = await structures.createDiscordenoRole(payload.role);
guild.roles = guild.roles.set(payload.role.id, role);
await cacheHandlers.set("guilds", payload.guild_id, guild);
+1 -1
View File
@@ -11,7 +11,7 @@ export async function handleGuildRoleUpdate(data: DiscordGatewayPayload) {
const cachedRole = guild.roles.get(payload.role.id);
if (!cachedRole) return;
const role = await structures.createRoleStruct(payload.role);
const role = await structures.createDiscordenoRole(payload.role);
guild.roles.set(payload.role.id, role);
await cacheHandlers.set("guilds", guild.id, guild);
+1 -1
View File
@@ -12,7 +12,7 @@ export async function handleVoiceStateUpdate(data: DiscordGatewayPayload) {
if (!guild) return;
const member = payload.member
? await structures.createMemberStruct(payload.member, guild.id)
? await structures.createDiscordenoMember(payload.member, guild.id)
: await cacheHandlers.get("members", payload.user_id);
if (!member) return;
+3 -3
View File
@@ -45,8 +45,8 @@ export async function createChannel(
},
)) as DiscordChannel;
const channelStruct = await structures.createChannelStruct(result);
await cacheHandlers.set("channels", channelStruct.id, channelStruct);
const discordenoChannel = await structures.createDiscordenoChannel(result);
await cacheHandlers.set("channels", discordenoChannel.id, discordenoChannel);
return channelStruct;
return discordenoChannel;
}
+7 -3
View File
@@ -14,13 +14,17 @@ export async function getChannel(channelId: string, addToCache = true) {
endpoints.CHANNEL_BASE(channelId),
)) as DiscordChannel;
const channelStruct = await structures.createChannelStruct(
const discordenoChannel = await structures.createDiscordenoChannel(
result,
result.guild_id,
);
if (addToCache) {
await cacheHandlers.set("channels", channelStruct.id, channelStruct);
await cacheHandlers.set(
"channels",
discordenoChannel.id,
discordenoChannel,
);
}
return channelStruct;
return discordenoChannel;
}
+10 -3
View File
@@ -15,11 +15,18 @@ export async function getChannels(guildId: string, addToCache = true) {
) as DiscordChannel[]);
return Promise.all(result.map(async (res) => {
const channelStruct = await structures.createChannelStruct(res, guildId);
const discordenoChannel = await structures.createDiscordenoChannel(
res,
guildId,
);
if (addToCache) {
await cacheHandlers.set("channels", channelStruct.id, channelStruct);
await cacheHandlers.set(
"channels",
discordenoChannel.id,
discordenoChannel,
);
}
return channelStruct;
return discordenoChannel;
}));
}
+1 -1
View File
@@ -11,6 +11,6 @@ export async function getPins(channelId: string) {
)) as DiscordMessage[];
return Promise.all(
result.map((res) => structures.createMessageStruct(res)),
result.map((res) => structures.createDiscordenoMessage(res)),
);
}
+1 -1
View File
@@ -71,7 +71,7 @@ export async function editSlashResponse(
// If the original message was edited, this will not return a message
if (!options.messageId) return result;
const message = await structures.createMessageStruct(
const message = await structures.createDiscordenoMessage(
result as DiscordMessage,
);
return message;
+1 -1
View File
@@ -12,5 +12,5 @@ export async function createGuild(options: CreateGuild) {
options,
)) as DiscordGuild;
return structures.createGuildStruct(guild, 0);
return structures.createDiscordenoGuild(guild, 0);
}
+1 -1
View File
@@ -28,5 +28,5 @@ export async function editGuild(guildId: string, options: ModifyGuild) {
options,
) as DiscordGuild;
return structures.createGuildStruct(result, -1);
return structures.createDiscordenoGuild(result, -1);
}
+1 -1
View File
@@ -70,7 +70,7 @@ export async function editMember(
endpoints.GUILD_MEMBER(guildId, memberId),
options,
) as MemberCreatePayload;
const member = await structures.createMemberStruct(result, guildId);
const member = await structures.createDiscordenoMember(result, guildId);
return member;
}
+6 -3
View File
@@ -20,8 +20,11 @@ export async function getMember(
endpoints.GUILD_MEMBER(guildId, id),
)) as MemberCreatePayload;
const memberStruct = await structures.createMemberStruct(data, guildId);
await cacheHandlers.set("members", memberStruct.id, memberStruct);
const discordenoMember = await structures.createDiscordenoMember(
data,
guildId,
);
await cacheHandlers.set("members", discordenoMember.id, discordenoMember);
return memberStruct;
return discordenoMember;
}
+11 -7
View File
@@ -51,22 +51,26 @@ export async function getMembers(guildId: string, options?: GetMemberOptions) {
}${options?.after ? `&after=${options.after}` : ""}`,
)) as DiscordGuildMember[];
const memberStructures = await Promise.all(
const discordenoMembers = await Promise.all(
result.map(async (member) => {
const memberStruct = await structures.createMemberStruct(
const discordenoMember = await structures.createDiscordenoMember(
member,
guildId,
);
await cacheHandlers.set("members", memberStruct.id, memberStruct);
await cacheHandlers.set(
"members",
discordenoMember.id,
discordenoMember,
);
return memberStruct;
return discordenoMember;
}),
) as Member[];
if (!memberStructures.length) break;
if (!discordenoMembers.length) break;
memberStructures.forEach((member) => {
discordenoMembers.forEach((member) => {
eventHandlers.debug?.(
"loop",
`Running forEach loop in get_members file.`,
@@ -76,7 +80,7 @@ export async function getMembers(guildId: string, options?: GetMemberOptions) {
options = {
limit: options?.limit,
after: memberStructures[memberStructures.length - 1].id,
after: discordenoMembers[discordenoMembers.length - 1].id,
};
membersLeft -= 1000;
+3 -3
View File
@@ -15,12 +15,12 @@ export async function sendDirectMessage(
const dmChannelData = await rest.runMethod("post", endpoints.USER_DM, {
recipient_id: memberId,
}) as DMChannelCreatePayload;
const channelStruct = await structures.createChannelStruct(
const discordenoChannel = await structures.createDiscordenoChannel(
dmChannelData as unknown as ChannelCreatePayload,
);
// Recreate the channel and add it undert he users id
await cacheHandlers.set("channels", memberId, channelStruct);
dmChannel = channelStruct;
await cacheHandlers.set("channels", memberId, discordenoChannel);
dmChannel = discordenoChannel;
}
// If it does exist try sending a message to this user
+1 -1
View File
@@ -33,5 +33,5 @@ export async function editMessage(
content,
);
return structures.createMessageStruct(result as MessageCreateOptions);
return structures.createDiscordenoMessage(result as MessageCreateOptions);
}
+1 -1
View File
@@ -18,5 +18,5 @@ export async function getMessage(channelId: string, id: string) {
endpoints.CHANNEL_MESSAGE(channelId, id),
)) as MessageCreateOptions;
return structures.createMessageStruct(result);
return structures.createDiscordenoMessage(result);
}
+1 -1
View File
@@ -26,6 +26,6 @@ export async function getMessages(
)) as MessageCreateOptions[];
return Promise.all(
result.map((res) => structures.createMessageStruct(res)),
result.map((res) => structures.createDiscordenoMessage(res)),
);
}
+1 -1
View File
@@ -9,5 +9,5 @@ export async function publishMessage(channelId: string, messageId: string) {
endpoints.CHANNEL_MESSAGE_CROSSPOST(channelId, messageId),
)) as MessageCreateOptions;
return structures.createMessageStruct(data);
return structures.createDiscordenoMessage(data);
}
+1 -1
View File
@@ -107,5 +107,5 @@ export async function sendMessage(
}),
)) as DiscordMessage;
return structures.createMessageStruct(result);
return structures.createDiscordenoMessage(result);
}
+1 -1
View File
@@ -22,7 +22,7 @@ export async function createRole(
});
const roleData = result as RoleData;
const role = await structures.createRoleStruct(roleData);
const role = await structures.createDiscordenoRole(roleData);
const guild = await cacheHandlers.get("guilds", guildId);
guild?.roles.set(role.id, role);
+1 -1
View File
@@ -55,6 +55,6 @@ export async function editWebhookMessage(
{ ...options, allowed_mentions: options.allowed_mentions },
) as MessageCreateOptions;
const message = await structures.createMessageStruct(result);
const message = await structures.createDiscordenoMessage(result);
return message;
}
+1 -1
View File
@@ -60,5 +60,5 @@ export async function executeWebhook(
);
if (!options.wait) return;
return structures.createMessageStruct(result as MessageCreateOptions);
return structures.createDiscordenoMessage(result as MessageCreateOptions);
}
+11 -9
View File
@@ -15,9 +15,11 @@ import { PermissionStrings } from "../types/permissions/permission_strings.ts";
import { VoiceState } from "../types/voice/voice_state.ts";
import { Collection } from "../util/collection.ts";
import { createNewProp, snakeKeysToCamelCase } from "../util/utils.ts";
import { MessageStruct } from "./message.ts";
import { DiscordenoGuild } from "./guild.ts";
import { DiscordenoMember } from "./member.ts";
import { DiscordenoMessage } from "./message.ts";
const baseChannel: Partial<ChannelStruct> = {
const baseChannel: Partial<DiscordenoChannel> = {
get guild() {
return cache.guilds.get(this.guildId!);
},
@@ -70,7 +72,7 @@ const baseChannel: Partial<ChannelStruct> = {
/** Create a structure object */
// deno-lint-ignore require-await
export async function createChannelStruct(
export async function createDiscordenoChannel(
data: DiscordChannel,
guildId?: string,
) {
@@ -84,13 +86,13 @@ export async function createChannelStruct(
Object.keys(rest).forEach((key) => {
eventHandlers.debug?.(
"loop",
`Running forEach loop in createChannelStruct function.`,
`Running forEach loop in createDiscordenoChannel function.`,
);
// @ts-ignore index signature
props[key] = createNewProp(rest[key]);
});
const channel: ChannelStruct = Object.create(baseChannel, {
const channel: DiscordenoChannel = Object.create(baseChannel, {
...props,
guildId: createNewProp(guildId || rawGuildId),
lastPinTimestamp: createNewProp(
@@ -101,7 +103,7 @@ export async function createChannelStruct(
return channel;
}
export interface ChannelStruct extends Channel {
export interface DiscordenoChannel extends Channel {
// GETTERS
/**
@@ -109,13 +111,13 @@ export interface ChannelStruct extends Channel {
*
* ⚠️ ADVANCED: If you use the custom cache, these will not work for you. Getters can not be async and custom cache requires async.
*/
guild?: GuildStruct;
guild?: DiscordenoGuild;
/**
* Gets the messages from cache that were sent in this channel
*
* ⚠️ ADVANCED: If you use the custom cache, these will not work for you. Getters can not be async and custom cache requires async.
*/
messages: Collection<string, MessageStruct>;
messages: Collection<string, DiscordenoMessage>;
/** The mention of the channel */
mention: string;
/**
@@ -129,7 +131,7 @@ export interface ChannelStruct extends Channel {
*
* ⚠️ ADVANCED: If you use the custom cache, these will not work for you. Getters can not be async and custom cache requires async.
*/
connectedMembers?: Collection<string, MemberStruct | undefined>;
connectedMembers?: Collection<string, DiscordenoMember | undefined>;
// METHODS
+32 -24
View File
@@ -33,14 +33,14 @@ import {
createNewProp,
snakeKeysToCamelCase,
} from "../util/utils.ts";
import { ChannelStruct } from "./channel.ts";
import { MemberStruct } from "./member.ts";
import { DiscordenoChannel } from "./channel.ts";
import { DiscordenoMember } from "./member.ts";
import { structures } from "./mod.ts";
import { RoleStruct } from "./role.ts";
import { DiscordenoRole } from "./role.ts";
export const initialMemberLoadQueue = new Map<string, GuildMember[]>();
const baseGuild: Partial<GuildStruct> = {
const baseGuild: Partial<DiscordenoGuild> = {
get members() {
return cache.members.filter((member) => member.guilds.has(this.id!));
},
@@ -115,7 +115,7 @@ const baseGuild: Partial<GuildStruct> = {
},
};
export async function createGuildStruct(
export async function createDiscordenoGuild(
data: DiscordGuild,
shardId: number,
) {
@@ -132,34 +132,38 @@ export async function createGuildStruct(
const roles = await Promise.all(
(data.roles || []).map((role) =>
structures.createRoleStruct({ role, guild_id: rest.id })
structures.createDiscordenoRole({ role, guild_id: rest.id })
),
);
await Promise.all(channels.map(async (channel) => {
const channelStruct = await structures.createChannelStruct(
const discordenoChannel = await structures.createDiscordenoChannel(
channel,
rest.id,
);
return cacheHandlers.set("channels", channelStruct.id, channelStruct);
return cacheHandlers.set(
"channels",
discordenoChannel.id,
discordenoChannel,
);
}));
const props: Record<string, ReturnType<typeof createNewProp>> = {};
for (const key of Object.keys(rest)) {
eventHandlers.debug?.(
"loop",
`Running for of loop in createGuildStruct function.`,
`Running for of loop in createDiscordenoGuild function.`,
);
// @ts-ignore index signature
props[key] = createNewProp(rest[key]);
}
const guild = Object.create(baseGuild, {
const guild: DiscordenoGuild = Object.create(baseGuild, {
...props,
shardId: createNewProp(shardId),
roles: createNewProp(
new Collection(roles.map((r: RoleStruct) => [r.id, r])),
new Collection(roles.map((r: DiscordenoRole) => [r.id, r])),
),
joinedAt: createNewProp(Date.parse(joinedAt)),
presences: createNewProp(
@@ -184,22 +188,26 @@ export async function createGuildStruct(
else {
await Promise.allSettled(
members.map(async (member) => {
const memberStruct = await structures.createMemberStruct(
const discordenoMember = await structures.createDiscordenoMember(
camelKeysToSnakeCase(member) as Omit<DiscordGuildMember, "user"> & {
user: DiscordUser;
},
guild.id,
);
return cacheHandlers.set("members", memberStruct.id, memberStruct);
return cacheHandlers.set(
"members",
discordenoMember.id,
discordenoMember,
);
}),
);
}
return guild as GuildStruct;
return guild;
}
export interface GuildStruct extends
export interface DiscordenoGuild extends
Omit<
Guild,
| "roles"
@@ -214,7 +222,7 @@ export interface GuildStruct extends
/** Total number of members in this guild */
memberCount?: number;
/** The roles in the guild */
roles: Collection<string, RoleStruct>;
roles: Collection<string, DiscordenoRole>;
/** The presences of all the users in the guild. */
presences: Collection<string, PresenceUpdate>;
/** The Voice State data for each user in a voice channel in this server. */
@@ -224,19 +232,19 @@ export interface GuildStruct extends
// GETTERS
/** Members in this guild. */
members: Collection<string, MemberStruct>;
members: Collection<string, DiscordenoMember>;
/** Channels in this guild. */
channels: Collection<string, ChannelStruct>;
channels: Collection<string, DiscordenoChannel>;
/** The afk channel if one is set */
afkChannel?: ChannelStruct;
afkChannel?: DiscordenoChannel;
/** The public update channel if one is set */
publicUpdatesChannel?: ChannelStruct;
publicUpdatesChannel?: DiscordenoChannel;
/** The rules channel in this guild if one is set */
rulesChannel?: ChannelStruct;
rulesChannel?: DiscordenoChannel;
/** The system channel in this guild if one is set */
systemChannel?: ChannelStruct;
systemChannel?: DiscordenoChannel;
/** The bot member in this guild if cached */
bot?: MemberStruct;
bot?: DiscordenoMember;
/** The bot guild member in this guild if cached */
botMember?: Omit<GuildMember, "joinedAt" | "premiumSince"> & {
joinedAt: number;
@@ -245,7 +253,7 @@ export interface GuildStruct extends
/** The bots voice state if there is one in this guild */
botVoice?: VoiceState;
/** The owner member of this guild */
owner?: MemberStruct;
owner?: DiscordenoMember;
/** Whether or not this guild is partnered */
partnered: boolean;
/** Whether or not this guild is verified */
+9 -9
View File
@@ -19,9 +19,9 @@ import { DiscordImageSize } from "../types/misc/image_size.ts";
import { DiscordUser, User } from "../types/users/user.ts";
import { Collection } from "../util/collection.ts";
import { createNewProp, snakeKeysToCamelCase } from "../util/utils.ts";
import { GuildStruct } from "./guild.ts";
import { DiscordenoGuild } from "./guild.ts";
const baseMember: Partial<MemberStruct> = {
const baseMember: Partial<DiscordenoMember> = {
get avatarURL() {
return avatarURL(this.id!, this.discriminator!, this.avatar!);
},
@@ -71,7 +71,7 @@ const baseMember: Partial<MemberStruct> = {
},
};
export async function createMemberStruct(
export async function createDiscordenoMember(
// The `user` param in `DiscordGuildMember` is optional since discord does not send it in `MESSAGE_CREATE` and `MESSAGE_UPDATE` events. But this data in there is required to build this structure so it is required in this case
data: Omit<DiscordGuildMember, "user"> & { user: DiscordUser },
guildId: string,
@@ -90,7 +90,7 @@ export async function createMemberStruct(
for (const key of Object.keys(rest)) {
eventHandlers.debug?.(
"loop",
`Running for of loop for Object.keys(rest) in createMemberStruct function.`,
`Running for of loop for Object.keys(rest) in DiscordenoMember function.`,
);
// @ts-ignore index signature
props[key] = createNewProp(rest[key]);
@@ -99,13 +99,13 @@ export async function createMemberStruct(
for (const key of Object.keys(user)) {
eventHandlers.debug?.(
"loop",
`Running for of for Object.keys(user) loop in createMemberStruct function.`,
`Running for of for Object.keys(user) loop in DiscordenoMember function.`,
);
// @ts-ignore index signature
props[key] = createNewProp(user[key]);
}
const member: MemberStruct = Object.create(baseMember, {
const member: DiscordenoMember = Object.create(baseMember, {
...props,
/** The guild related data mapped by guild id */
guilds: createNewProp(new Collection<string, GuildMember>()),
@@ -116,7 +116,7 @@ export async function createMemberStruct(
for (const [id, guild] of cached.guilds.entries()) {
eventHandlers.debug?.(
"loop",
`Running for of for cached.guilds.entries() loop in createMemberStruct function.`,
`Running for of for cached.guilds.entries() loop in DiscordenoMember function.`,
);
member.guilds.set(id, guild);
}
@@ -135,7 +135,7 @@ export async function createMemberStruct(
return member;
}
export interface MemberStruct extends GuildMember, User {
export interface DiscordenoMember extends GuildMember, User {
/** The guild related data mapped by guild id */
guilds: Collection<
string,
@@ -160,7 +160,7 @@ export interface MemberStruct extends GuildMember, User {
options: { size?: DiscordImageSize; format?: DiscordImageFormat },
): string;
/** Returns the guild for this guildID */
guild(guildID: string): GuildStruct | undefined;
guild(guildID: string): DiscordenoGuild | undefined;
/** Get the nickname or the username if no nickname */
name(guildID: string): string;
/** Get the guild member object for the specified guild */
+15 -15
View File
@@ -15,12 +15,12 @@ import { EditMessage } from "../types/messages/edit_message.ts";
import { DiscordMessage, Message } from "../types/messages/message.ts";
import { CHANNEL_MENTION_REGEX } from "../util/constants.ts";
import { createNewProp, snakeKeysToCamelCase } from "../util/utils.ts";
import { ChannelStruct } from "./channel.ts";
import { GuildStruct } from "./guild.ts";
import { MemberStruct } from "./member.ts";
import { RoleStruct } from "./role.ts";
import { DiscordenoChannel } from "./channel.ts";
import { DiscordenoGuild } from "./guild.ts";
import { DiscordenoMember } from "./member.ts";
import { DiscordenoRole } from "./role.ts";
const baseMessage: Partial<MessageStruct> = {
const baseMessage: Partial<DiscordenoMessage> = {
get channel() {
if (this.guildId) return cache.channels.get(this.channelId!);
return cache.channels.get(this.author?.id!);
@@ -117,7 +117,7 @@ const baseMessage: Partial<MessageStruct> = {
},
};
export async function createMessageStruct(data: DiscordMessage) {
export async function createDiscordenoMessage(data: DiscordMessage) {
const {
guildId = "",
channelId,
@@ -132,7 +132,7 @@ export async function createMessageStruct(data: DiscordMessage) {
for (const key of Object.keys(rest)) {
eventHandlers.debug?.(
"loop",
`Running for of loop in createMessageStruct function.`,
`Running for of loop in createDiscordenoMessage function.`,
);
// @ts-ignore index signature
props[key] = createNewProp(rest[key]);
@@ -142,7 +142,7 @@ export async function createMessageStruct(data: DiscordMessage) {
const guildIdFinal = guildId ||
(await cacheHandlers.get("channels", channelId))?.guildId || "";
const message: MessageStruct = Object.create(baseMessage, {
const message: DiscordenoMessage = Object.create(baseMessage, {
...props,
/** The message id of the original message if this message was sent as a reply. If null, the original message was deleted. */
channelId: createNewProp(channelId),
@@ -169,7 +169,7 @@ export async function createMessageStruct(data: DiscordMessage) {
return message;
}
export interface MessageStruct extends Message {
export interface DiscordenoMessage extends Message {
// For better user experience
/** Ids of users specifically mentioned in the message */
mentionedUserIds: string[];
@@ -180,11 +180,11 @@ export interface MessageStruct extends Message {
// GETTERS
/** The channel where this message was sent. Can be undefined if uncached. */
channel?: ChannelStruct;
channel?: DiscordenoChannel;
/** The guild of this message. Can be undefined if not in cache or in DM */
guild?: GuildStruct;
guild?: DiscordenoGuild;
/** The member for the user who sent the message. Can be undefined if not in cache or in dm. */
member?: MemberStruct;
member?: DiscordenoMember;
/** The guild member details for this guild and member. Can be undefined if not in cache or in dm. */
guildMember?: Omit<GuildMember, "joinedAt" | "premiumSince"> & {
joinedAt: number;
@@ -193,11 +193,11 @@ export interface MessageStruct extends Message {
/** The url link to this message */
link: string;
/** The role objects for all the roles that were mentioned in this message */
mentionedRoles: (RoleStruct | undefined)[];
mentionedRoles: (DiscordenoRole | undefined)[];
/** The channel objects for all the channels that were mentioned in this message. */
mentionedChannels: (ChannelStruct | undefined)[];
mentionedChannels: (DiscordenoChannel | undefined)[];
/** The member objects for all the members that were mentioned in this message. */
mentionedMembers: (MemberStruct | undefined)[];
mentionedMembers: (DiscordenoMember | undefined)[];
// METHODS
+10 -10
View File
@@ -1,17 +1,17 @@
import { createChannelStruct } from "./channel.ts";
import { createGuildStruct } from "./guild.ts";
import { createMemberStruct } from "./member.ts";
import { createMessageStruct } from "./message.ts";
import { createRoleStruct } from "./role.ts";
import { createDiscordenoChannel } from "./channel.ts";
import { createDiscordenoGuild } from "./guild.ts";
import { createDiscordenoMember } from "./member.ts";
import { createDiscordenoMessage } from "./message.ts";
import { createDiscordenoRole } from "./role.ts";
import { createTemplateStruct } from "./template.ts";
/** This is the placeholder where the structure creation functions are kept. */
export let structures = {
createChannelStruct,
createGuildStruct,
createMemberStruct,
createMessageStruct,
createRoleStruct,
createDiscordenoChannel,
createDiscordenoGuild,
createDiscordenoMember,
createDiscordenoMessage,
createDiscordenoRole,
createTemplateStruct,
};
+9 -7
View File
@@ -9,8 +9,10 @@ import { Role } from "../types/permissions/role.ts";
import { Collection } from "../util/collection.ts";
import { highestRole } from "../util/permissions.ts";
import { createNewProp, snakeKeysToCamelCase } from "../util/utils.ts";
import { DiscordenoGuild } from "./guild.ts";
import { DiscordenoMember } from "./member.ts";
const baseRole: Partial<RoleStruct> = {
const baseRole: Partial<DiscordenoRole> = {
get guild() {
return cache.guilds.get(this.guildId!);
},
@@ -65,7 +67,7 @@ const baseRole: Partial<RoleStruct> = {
};
// deno-lint-ignore require-await
export async function createRoleStruct(data: DiscordGuildRoleCreate) {
export async function createDiscordenoRole(data: DiscordGuildRoleCreate) {
const {
tags = {},
...rest
@@ -77,13 +79,13 @@ export async function createRoleStruct(data: DiscordGuildRoleCreate) {
for (const key of Object.keys(rest)) {
eventHandlers.debug?.(
"loop",
`Running for of loop in createRoleStruct function.`,
`Running for of loop in createDiscordenoRole function.`,
);
// @ts-ignore index signature
props[key] = createNewProp(rest[key]);
}
const role: RoleStruct = Object.create(baseRole, {
const role: DiscordenoRole = Object.create(baseRole, {
...props,
botId: createNewProp(tags.botId),
isNitroBoostRole: createNewProp("premiumSubscriber" in tags),
@@ -93,7 +95,7 @@ export async function createRoleStruct(data: DiscordGuildRoleCreate) {
return role;
}
export interface RoleStruct extends Omit<Role, "tags"> {
export interface DiscordenoRole extends Omit<Role, "tags"> {
/** The bot id that is associated with this role. */
botId?: string;
/** If this role is the nitro boost role. */
@@ -106,11 +108,11 @@ export interface RoleStruct extends Omit<Role, "tags"> {
// GETTERS
/** The guild where this role is. If undefined, the guild is not cached */
guild?: GuildStruct;
guild?: DiscordenoGuild;
/** The hex color for this role. */
hexColor: string;
/** The cached members that have this role */
members: Collection<string, MemberStruct>;
members: Collection<string, DiscordenoMember>;
/** The @ mention of the role in a string. */
mention: string;