116 lines
3.2 KiB
TypeScript
116 lines
3.2 KiB
TypeScript
import {I18n} from "./i18n.js";
|
|
|
|
class Rights {
|
|
allow!: bigint;
|
|
constructor(allow: string | number) {
|
|
this.update(allow);
|
|
}
|
|
update(allow: string | number) {
|
|
try {
|
|
this.allow = BigInt(allow);
|
|
} catch {
|
|
this.allow = 875069521787904n;
|
|
console.error(
|
|
`Something really stupid happened with a permission with allow being ${allow}, execution will still happen, but something really stupid happened, please report if you know what caused this.`,
|
|
);
|
|
}
|
|
}
|
|
getPermissionbit(b: number, big: bigint): boolean {
|
|
return Boolean((big >> BigInt(b)) & 1n);
|
|
}
|
|
setPermissionbit(b: number, state: boolean, big: bigint): bigint {
|
|
const bit = 1n << BigInt(b);
|
|
return (big & ~bit) | (BigInt(state) << BigInt(b)); //thanks to geotale for this code :3
|
|
}
|
|
static *info(): Generator<{name: string; readableName: string; description: string}> {
|
|
throw new Error("Isn't implemented");
|
|
for (const thing of this.permisions) {
|
|
yield {
|
|
name: thing,
|
|
readableName: I18n.getTranslation("permissions.readableNames." + thing),
|
|
description: I18n.getTranslation("permissions.descriptions." + thing),
|
|
};
|
|
}
|
|
}
|
|
static readonly permisions = [
|
|
"OPERATOR",
|
|
"MANAGE_APPLICATIONS",
|
|
"MANAGE_GUILDS",
|
|
"MANAGE_MESSAGES",
|
|
"MANAGE_RATE_LIMITS",
|
|
"MANAGE_ROUTING",
|
|
"MANAGE_TICKETS",
|
|
"MANAGE_USERS",
|
|
"ADD_MEMBERS",
|
|
"BYPASS_RATE_LIMITS",
|
|
"CREATE_APPLICATIONS",
|
|
"CREATE_CHANNELS",
|
|
"CREATE_DMS",
|
|
"CREATE_DM_GROUPS",
|
|
"CREATE_GUILDS",
|
|
"CREATE_INVITES",
|
|
"CREATE_ROLES",
|
|
"CREATE_TEMPLATES",
|
|
"CREATE_WEBHOOKS",
|
|
"JOIN_GUILDS",
|
|
"PIN_MESSAGES",
|
|
"SELF_ADD_REACTIONS",
|
|
"SELF_DELETE_MESSAGES",
|
|
"SELF_EDIT_MESSAGES",
|
|
"SELF_EDIT_NAME",
|
|
"SEND_MESSAGES",
|
|
"USE_ACTIVITIES",
|
|
"USE_VIDEO",
|
|
"USE_VOICE",
|
|
"INVITE_USERS",
|
|
"SELF_DELETE_DISABLE",
|
|
"DEBTABLE",
|
|
"CREDITABLE",
|
|
"KICK_BAN_MEMBERS",
|
|
"SELF_LEAVE_GROUPS",
|
|
"PRESENCE",
|
|
"SELF_ADD_DISCOVERABLE",
|
|
"MANAGE_GUILD_DIRECTORY",
|
|
"POGGERS",
|
|
"USE_ACHIEVEMENTS",
|
|
"INITIATE_INTERACTIONS",
|
|
"RESPOND_TO_INTERACTIONS",
|
|
"SEND_BACKDATED_EVENTS",
|
|
"USE_MASS_INVITES",
|
|
"ACCEPT_INVITES",
|
|
"SELF_EDIT_FLAGS",
|
|
"EDIT_FLAGS",
|
|
"MANAGE_GROUPS",
|
|
"VIEW_SERVER_STATS",
|
|
"RESEND_VERIFICATION_EMAIL",
|
|
"CREATE_REGISTRATION_TOKENS",
|
|
];
|
|
getPermission(name: string): boolean {
|
|
if (undefined === Rights.permisions.indexOf(name)) {
|
|
console.error(name + " is not found in map", Rights.permisions);
|
|
}
|
|
return this.getPermissionbit(Rights.permisions.indexOf(name), this.allow);
|
|
}
|
|
hasPermission(name: string, adminOverride = true): boolean {
|
|
if (this.getPermissionbit(Rights.permisions.indexOf(name), this.allow)) return true;
|
|
if (name !== "OPERATOR" && adminOverride) return this.hasPermission("OPERATOR");
|
|
return false;
|
|
}
|
|
setPermission(name: string, setto: number): void {
|
|
const bit = Rights.permisions.indexOf(name);
|
|
if (bit === undefined) {
|
|
return console.error(
|
|
"Tried to set permission to " + setto + " for " + name + " but it doesn't exist",
|
|
);
|
|
}
|
|
|
|
if (setto === 0) {
|
|
this.allow = this.setPermissionbit(bit, false, this.allow);
|
|
} else if (setto === 1) {
|
|
this.allow = this.setPermissionbit(bit, true, this.allow);
|
|
} else {
|
|
console.error("invalid number entered:" + setto);
|
|
}
|
|
}
|
|
}
|
|
export {Rights};
|