Convert BitField to BigInt

This commit is contained in:
Flam3rboy 2021-01-30 23:55:32 +01:00
parent e11f94337b
commit d2795bdd0a
6 changed files with 78 additions and 71 deletions

View File

@ -4,7 +4,7 @@ import { getIpAdress } from "./GlobalRateLimit";
export function RateLimit({ count = 10, timespan = 1000 * 5, name = "/" }) {
return async (req: Request, res: Response, next: NextFunction) => {
let id = req.userid || getIpAdress(req); // TODO: .replaceAll(".", "_"); // for ip adress replace all dots to save in database
let id = req.userid || getIpAdress(req);
const limit: { count: number; start: number } = (await db.data.ratelimit.routes[name][id].get()) || {
count: 0,

15
src/models/User.ts Normal file
View File

@ -0,0 +1,15 @@
import { UserFlags } from "../util/UserFlags";
export interface User {
id: BigInt;
username: string;
discriminator: string;
avatar: string;
bot: boolean;
system: boolean;
mfa_enabled: boolean;
locale: string;
verified: boolean;
email: string;
flags: UserFlags;
}

View File

@ -3,26 +3,17 @@
// https://github.com/discordjs/discord.js/blob/master/src/util/BitField.js
// Apache License Version 2.0 Copyright 2015 - 2021 Amish Shah
export type BitFieldResolvable = number | BitField | string | BitFieldResolvable[];
export type BitFieldResolvable = number | BigInt | BitField | string | BitFieldResolvable[];
/**
* Data structure that makes it easy to interact with a bitfield.
*/
export class BitField {
public bitfield: number;
public bitfield: bigint = BigInt(0);
public static FLAGS: Record<string, bigint>;
/**
* Numeric bitfield flags.
* <info>Defined in extension classes</info>
*/
public static FLAGS: Record<string, number>;
/**
*/
constructor(bits: BitFieldResolvable = 0) {
/**
* Bitfield of the packed bits
* @type {number}
*/
this.bitfield = BitField.resolve(bits);
}
@ -30,7 +21,7 @@ export class BitField {
* Checks whether the bitfield has a bit, or any of multiple bits.
*/
any(bit: BitFieldResolvable): boolean {
return (this.bitfield & BitField.resolve(bit)) !== 0;
return (this.bitfield & BitField.resolve(bit)) !== 0n;
}
/**
@ -45,8 +36,8 @@ export class BitField {
*/
has(bit: BitFieldResolvable): boolean {
if (Array.isArray(bit)) return bit.every((p) => this.has(p));
bit = BitField.resolve(bit);
return (this.bitfield & bit) === bit;
const BIT = BitField.resolve(bit);
return (this.bitfield & BIT) === BIT;
}
/**
@ -70,7 +61,7 @@ export class BitField {
* @returns {BitField} These bits or new BitField if the instance is frozen.
*/
add(...bits: BitFieldResolvable[]): BitField {
let total = 0;
let total = 0n;
for (const bit of bits) {
total |= BitField.resolve(bit);
}
@ -84,7 +75,7 @@ export class BitField {
* @param {...BitFieldResolvable} [bits] Bits to remove
*/
remove(...bits: BitFieldResolvable[]) {
let total = 0;
let total = 0n;
for (const bit of bits) {
total |= BitField.resolve(bit);
}
@ -136,10 +127,11 @@ export class BitField {
* @param {BitFieldResolvable} [bit=0] - bit(s) to resolve
* @returns {number}
*/
static resolve(bit: BitFieldResolvable = 0): number {
if (typeof bit === "number" && bit >= 0) return bit;
static resolve(bit: BitFieldResolvable = 0n): bigint {
if ((typeof bit === "number" || typeof bit === "bigint") && bit >= 0n) return BigInt(bit);
if (bit instanceof BitField) return bit.bitfield;
if (Array.isArray(bit)) return bit.map((p) => this.resolve(p)).reduce((prev, p) => prev | p, 0);
if (Array.isArray(bit))
return bit.map((p) => this.resolve(p)).reduce((prev, p) => BigInt(prev) | BigInt(p), 0n);
if (typeof bit === "string" && typeof this.FLAGS[bit] !== "undefined") return this.FLAGS[bit];
throw new RangeError("BITFIELD_INVALID: " + bit);
}

View File

@ -5,10 +5,10 @@ import { BitField } from "./BitField";
export class MessageFlags extends BitField {
static FLAGS = {
CROSSPOSTED: 1 << 0,
IS_CROSSPOST: 1 << 1,
SUPPRESS_EMBEDS: 1 << 2,
SOURCE_MESSAGE_DELETED: 1 << 3,
URGENT: 1 << 4,
CROSSPOSTED: 1n << 0n,
IS_CROSSPOST: 1n << 1n,
SUPPRESS_EMBEDS: 1n << 2n,
SOURCE_MESSAGE_DELETED: 1n << 3n,
URGENT: 1n << 4n,
};
}

View File

@ -7,37 +7,37 @@ export type PermissionResolvable = string | number | Permissions | PermissionRes
export class Permissions extends BitField {
static FLAGS = {
CREATE_INSTANT_INVITE: 1 << 0,
KICK_MEMBERS: 1 << 1,
BAN_MEMBERS: 1 << 2,
ADMINISTRATOR: 1 << 3,
MANAGE_CHANNELS: 1 << 4,
MANAGE_GUILD: 1 << 5,
ADD_REACTIONS: 1 << 6,
VIEW_AUDIT_LOG: 1 << 7,
PRIORITY_SPEAKER: 1 << 8,
STREAM: 1 << 9,
VIEW_CHANNEL: 1 << 10,
SEND_MESSAGES: 1 << 11,
SEND_TTS_MESSAGES: 1 << 12,
MANAGE_MESSAGES: 1 << 13,
EMBED_LINKS: 1 << 14,
ATTACH_FILES: 1 << 15,
READ_MESSAGE_HISTORY: 1 << 16,
MENTION_EVERYONE: 1 << 17,
USE_EXTERNAL_EMOJIS: 1 << 18,
VIEW_GUILD_INSIGHTS: 1 << 19,
CONNECT: 1 << 20,
SPEAK: 1 << 21,
MUTE_MEMBERS: 1 << 22,
DEAFEN_MEMBERS: 1 << 23,
MOVE_MEMBERS: 1 << 24,
USE_VAD: 1 << 25,
CHANGE_NICKNAME: 1 << 26,
MANAGE_NICKNAMES: 1 << 27,
MANAGE_ROLES: 1 << 28,
MANAGE_WEBHOOKS: 1 << 29,
MANAGE_EMOJIS: 1 << 30,
CREATE_INSTANT_INVITE: 1n << 0n,
KICK_MEMBERS: 1n << 1n,
BAN_MEMBERS: 1n << 2n,
ADMINISTRATOR: 1n << 3n,
MANAGE_CHANNELS: 1n << 4n,
MANAGE_GUILD: 1n << 5n,
ADD_REACTIONS: 1n << 6n,
VIEW_AUDIT_LOG: 1n << 7n,
PRIORITY_SPEAKER: 1n << 8n,
STREAM: 1n << 9n,
VIEW_CHANNEL: 1n << 10n,
SEND_MESSAGES: 1n << 11n,
SEND_TTS_MESSAGES: 1n << 12n,
MANAGE_MESSAGES: 1n << 13n,
EMBED_LINKS: 1n << 14n,
ATTACH_FILES: 1n << 15n,
READ_MESSAGE_HISTORY: 1n << 16n,
MENTION_EVERYONE: 1n << 17n,
USE_EXTERNAL_EMOJIS: 1n << 18n,
VIEW_GUILD_INSIGHTS: 1n << 19n,
CONNECT: 1n << 20n,
SPEAK: 1n << 21n,
MUTE_MEMBERS: 1n << 22n,
DEAFEN_MEMBERS: 1n << 23n,
MOVE_MEMBERS: 1n << 24n,
USE_VAD: 1n << 25n,
CHANGE_NICKNAME: 1n << 26n,
MANAGE_NICKNAMES: 1n << 27n,
MANAGE_ROLES: 1n << 28n,
MANAGE_WEBHOOKS: 1n << 29n,
MANAGE_EMOJIS: 1n << 30n,
};
any(permission: PermissionResolvable, checkAdmin = true) {

View File

@ -5,18 +5,18 @@ import { BitField } from "./BitField";
export class UserFlags extends BitField {
static FLAGS = {
DISCORD_EMPLOYEE: 1 << 0,
PARTNERED_SERVER_OWNER: 1 << 1,
HYPESQUAD_EVENTS: 1 << 2,
BUGHUNTER_LEVEL_1: 1 << 3,
HOUSE_BRAVERY: 1 << 6,
HOUSE_BRILLIANCE: 1 << 7,
HOUSE_BALANCE: 1 << 8,
EARLY_SUPPORTER: 1 << 9,
TEAM_USER: 1 << 10,
SYSTEM: 1 << 12,
BUGHUNTER_LEVEL_2: 1 << 14,
VERIFIED_BOT: 1 << 16,
EARLY_VERIFIED_BOT_DEVELOPER: 1 << 17,
DISCORD_EMPLOYEE: 1n << 0n,
PARTNERED_SERVER_OWNER: 1n << 1n,
HYPESQUAD_EVENTS: 1n << 2n,
BUGHUNTER_LEVEL_1: 1n << 3n,
HOUSE_BRAVERY: 1n << 6n,
HOUSE_BRILLIANCE: 1n << 7n,
HOUSE_BALANCE: 1n << 8n,
EARLY_SUPPORTER: 1n << 9n,
TEAM_USER: 1n << 10n,
SYSTEM: 1n << 12n,
BUGHUNTER_LEVEL_2: 1n << 14n,
VERIFIED_BOT: 1n << 16n,
EARLY_VERIFIED_BOT_DEVELOPER: 1n << 17n,
};
}