Merge branch 'main' into stupid-deno-type-errors

This commit is contained in:
ITOH
2021-05-04 14:53:44 +02:00
23 changed files with 194 additions and 82 deletions

View File

@@ -47,6 +47,19 @@ const GUILD_SNOWFLAKES = [
"publicUpdatesChannelId",
];
export const guildToggles = {
/** Whether this user is owner of this guild */
owner: 1n,
/** Whether the guild widget is enabled */
widgetEnabled: 2n,
/** Whether this is a large guild */
large: 4n,
/** Whether this guild is unavailable due to an outage */
unavailable: 8n,
/** Whether this server is an nsfw guild */
nsfw: 16n,
};
const baseGuild: Partial<DiscordenoGuild> = {
get members() {
return cache.members.filter((member) => member.guilds.has(this.id!));
@@ -120,6 +133,21 @@ const baseGuild: Partial<DiscordenoGuild> = {
leave() {
return leaveGuild(this.id!);
},
get isOwner() {
return Boolean(this.bitfield! & guildToggles.owner);
},
get widgetEnabled() {
return Boolean(this.bitfield! & guildToggles.widgetEnabled);
},
get large() {
return Boolean(this.bitfield! & guildToggles.large);
},
get unavailable() {
return Boolean(this.bitfield! & guildToggles.unavailable);
},
get nsfw() {
return Boolean(this.bitfield! & guildToggles.nsfw);
},
};
export async function createDiscordenoGuild(
@@ -137,6 +165,7 @@ export async function createDiscordenoGuild(
...rest
} = data;
let bitfield = 0n;
const guildId = snowflakeToBigint(rest.id);
const roles = await Promise.all(
@@ -172,6 +201,12 @@ export async function createDiscordenoGuild(
`Running for of loop in createDiscordenoGuild function.`,
);
const toggleBits = guildToggles[key as keyof typeof guildToggles];
if (toggleBits) {
bitfield |= value ? toggleBits : 0n;
continue;
}
props[key] = createNewProp(
GUILD_SNOWFLAKES.includes(key)
? value ? snowflakeToBigint(value) : undefined
@@ -278,6 +313,10 @@ export interface DiscordenoGuild extends
voiceStates: Collection<bigint, DiscordenoVoiceState>;
/** Custom guild emojis */
emojis: Collection<bigint, Emoji>;
/** Whether the bot is the owner of this guild */
isOwner: boolean;
/** Holds all the boolean toggles. */
bitfield: bigint;
// GETTERS
/** Members in this guild. */

View File

@@ -23,11 +23,21 @@ import { createNewProp } from "../util/utils.ts";
import { DiscordenoGuild } from "./guild.ts";
const MEMBER_SNOWFLAKES = [
"roles",
"id",
"discriminator",
];
export const memberToggles = {
/** Whether the user belongs to an OAuth2 application */
bot: 1n,
/** Whether the user is an Official Discord System user (part of the urgent message system) */
system: 2n,
/** Whether the user has two factor enabled on their account */
mfaEnabled: 4n,
/** Whether the email on this account has been verified */
verified: 8n,
};
const baseMember: Partial<DiscordenoMember> = {
get avatarURL() {
return avatarURL(this.id!, this.discriminator!, this.avatar!);
@@ -76,6 +86,18 @@ const baseMember: Partial<DiscordenoMember> = {
removeRole(guildId, roleId, reason) {
return removeRole(guildId, this.id!, roleId, reason);
},
get bot() {
return Boolean(this.bitfield! & memberToggles.bot);
},
get system() {
return Boolean(this.bitfield! & memberToggles.system);
},
get mfaEnabled() {
return Boolean(this.bitfield! & memberToggles.mfaEnabled);
},
get verified() {
return Boolean(this.bitfield! & memberToggles.verified);
},
};
export async function createDiscordenoMember(
@@ -87,35 +109,23 @@ export async function createDiscordenoMember(
user,
joinedAt,
premiumSince,
...rest
} = data;
let bitfield = 0n;
const props: Record<string, ReturnType<typeof createNewProp>> = {};
for (const [key, value] of Object.entries(rest)) {
eventHandlers.debug?.(
"loop",
`Running for of loop for Object.keys(rest) in DiscordenoMember function.`,
);
if (key === "roles") {
props[key] = value.map((id: string) => snowflakeToBigint(id));
continue;
}
props[key] = createNewProp(
MEMBER_SNOWFLAKES.includes(key)
? value ? snowflakeToBigint(value) : undefined
: value,
);
}
for (const [key, value] of Object.entries(user)) {
eventHandlers.debug?.(
"loop",
`Running for of for Object.keys(user) loop in DiscordenoMember function.`,
);
const toggleBits = memberToggles[key as keyof typeof memberToggles];
if (toggleBits) {
bitfield |= value ? toggleBits : 0n;
continue;
}
props[key] = createNewProp(
MEMBER_SNOWFLAKES.includes(key)
? value ? snowflakeToBigint(value) : undefined
@@ -142,29 +152,23 @@ export async function createDiscordenoMember(
// User was never cached before
member.guilds.set(guildId, {
nick: rest.nick,
roles: rest.roles.map((id) => snowflakeToBigint(id)),
nick: data.nick,
roles: data.roles.map((id) => snowflakeToBigint(id)),
joinedAt: Date.parse(joinedAt),
premiumSince: premiumSince ? Date.parse(premiumSince) : undefined,
deaf: rest.deaf,
mute: rest.mute,
deaf: data.deaf,
mute: data.mute,
});
return member;
}
export interface DiscordenoMember extends
Omit<
GuildMember,
"roles"
>,
Omit<
User,
| "discriminator"
| "id"
> {
/** Array of role object ids */
roles: bigint[];
/** The user's id */
id: bigint;
/** The user's 4-digit discord-tag */
@@ -178,6 +182,8 @@ export interface DiscordenoMember extends
roles: bigint[];
}
>;
/** Holds all the boolean toggles. */
bitfield: bigint;
// GETTERS
/** The avatar url using the default format and size. */

View File

@@ -29,6 +29,15 @@ const MESSAGE_SNOWFLAKES = [
"webhookId",
];
const messageToggles = {
/** Whether this was a TTS message */
tts: 1n,
/** Whether this message mentions everyone */
mentionEveryone: 2n,
/** Whether this message is pinned */
pinned: 4n,
};
const baseMessage: Partial<DiscordenoMessage> = {
get channel() {
if (this.guildId) return cache.channels.get(this.channelId!);
@@ -132,6 +141,15 @@ const baseMessage: Partial<DiscordenoMessage> = {
removeReaction(reaction, userId) {
return removeReaction(this.channelId!, this.id!, reaction, { userId });
},
get tts() {
return Boolean(this.bitfield! & messageToggles.tts);
},
get mentionEveryone() {
return Boolean(this.bitfield! & messageToggles.mentionEveryone);
},
get pinned() {
return Boolean(this.bitfield! & messageToggles.pinned);
},
};
export async function createDiscordenoMessage(data: Message) {
@@ -146,6 +164,8 @@ export async function createDiscordenoMessage(data: Message) {
...rest
} = data;
let bitfield = 0n;
const props: Record<string, ReturnType<typeof createNewProp>> = {};
for (const [key, value] of Object.entries(rest)) {
eventHandlers.debug?.(
@@ -153,6 +173,12 @@ export async function createDiscordenoMessage(data: Message) {
`Running for of loop in createDiscordenoMessage function.`,
);
const toggleBits = messageToggles[key as keyof typeof messageToggles];
if (toggleBits) {
bitfield |= value ? toggleBits : 0n;
continue;
}
props[key] = createNewProp(
MESSAGE_SNOWFLAKES.includes(key)
? value ? snowflakeToBigint(value) : undefined
@@ -231,7 +257,11 @@ export interface DiscordenoMessage extends
isBot: boolean;
/** The username#discrimnator for the user who sent this message */
tag: string;
/** Holds all the boolean toggles. */
bitfield: bigint;
// For better user experience
/** Id of the guild which the massage has been send in. "0n" if it a DM */
guildId: bigint;
/** id of the channel the message was sent in */
@@ -252,6 +282,7 @@ export interface DiscordenoMessage extends
timestamp: number;
/** When this message was edited (or undefined if never) */
editedTimestamp?: number;
// GETTERS
/** The channel where this message was sent. Can be undefined if uncached. */

View File

@@ -19,6 +19,17 @@ const ROLE_SNOWFLAKES = [
"guildId",
];
const roleToggles = {
/** If this role is showed seperately in the user listing */
hoist: 1n,
/** Whether this role is managed by an integration */
managed: 2n,
/** Whether this role is mentionable */
mentionable: 4n,
/** If this role is the nitro boost role. */
isNitroBoostRole: 8n,
};
const baseRole: Partial<DiscordenoRole> = {
get guild() {
return cache.guilds.get(this.guildId!);
@@ -71,6 +82,18 @@ const baseRole: Partial<DiscordenoRole> = {
memberHighestRole.position,
);
},
get hoist() {
return Boolean(this.bitfield! & roleToggles.hoist);
},
get managed() {
return Boolean(this.bitfield! & roleToggles.managed);
},
get mentionable() {
return Boolean(this.bitfield! & roleToggles.mentionable);
},
get isNitroBoostRole() {
return Boolean(this.bitfield! & roleToggles.isNitroBoostRole);
},
};
// deno-lint-ignore require-await
@@ -84,6 +107,8 @@ export async function createDiscordenoRole(
...rest
} = ({ guildId: data.guildId, ...data.role });
let bitfield = 0n;
const props: Record<string, ReturnType<typeof createNewProp>> = {};
for (const [key, value] of Object.entries(rest)) {
eventHandlers.debug?.(
@@ -91,6 +116,12 @@ export async function createDiscordenoRole(
`Running for of loop in createDiscordenoRole function.`,
);
const toggleBits = roleToggles[key as keyof typeof roleToggles];
if (toggleBits) {
bitfield |= value ? toggleBits : 0n;
continue;
}
props[key] = createNewProp(
ROLE_SNOWFLAKES.includes(key)
? value ? snowflakeToBigint(value) : undefined
@@ -123,6 +154,8 @@ export interface DiscordenoRole extends Omit<Role, "tags" | "id"> {
integrationId: bigint;
/** The roles guildId */
guildId: bigint;
/** Holds all the boolean toggles. */
bitfield: bigint;
// GETTERS

View File

@@ -82,7 +82,7 @@ export async function createDiscordenoVoiceState(
const toggleBits = voiceStateToggles[key as keyof typeof voiceStateToggles];
if (toggleBits) {
bitfield |= toggleBits;
bitfield |= value ? toggleBits : 0n;
continue;
}