refactor(BitField): base class for Permissions, ActivityFlags, Speaking (#2765)

* abstract BitField from Permissions

* reduce useless code, improve docs

* add a ReadOnly identifier to the return type of Bitfield#freeze()

https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-1.html#partial-readonly-record-and-pick

* fix the RangeError

* update docs, convert Speaking and ActivityFlags to bitfields

* fix some docs

* Fix Speaking BitField oops

* docs for oops

* more incorrect docs

* Fix incorrectly named property

* add new classes to index

* fix missing @extends docs

* default bitfield resolve to 0, and cleanup defaulting everywhere

Also removes GuildMember#missiongPermissions() alias that had incorrect behavior

* Breaking: Rename Overwrite allowed and denied to allow and deny

To be consistent with the api's naming

* fix setSpeaking usage to bitfields instead of booleans

* fix speaking bug in playChunk

* docs: Updated typings

* fix: BitFieldResolvable should use RecursiveArray

* bugfix/requested change

* typings: Cleanup (#2)

* typings: Fix BitField#{toArray,@@iterator} output type

* typings: correct PermissionOverwrites property names and nitpicks
This commit is contained in:
bdistin
2018-08-21 04:56:41 -05:00
committed by SpaceEEC
parent 6be8172539
commit c62f01f0e4
18 changed files with 339 additions and 242 deletions

83
typings/index.d.ts vendored
View File

@@ -35,6 +35,11 @@ declare module 'discord.js' {
public equals(activity: Activity): boolean;
}
export class ActivityFlags extends BitField<ActivityFlagsString> {
public static resolve(permission: BitFieldResolvable<ActivityFlagsString>): number;
public static FLAGS: Record<ActivityFlagsString, number>;
}
export class Base {
constructor (client: Client);
public readonly client: Client;
@@ -62,6 +67,24 @@ declare module 'discord.js' {
public broadcast: VoiceBroadcast;
}
export class BitField<S extends string> {
constructor(bits?: BitFieldResolvable<S>);
public bitfield: number;
public add(...bits: BitFieldResolvable<S>[]): BitField<S>;
public equals(bit: BitFieldResolvable<S>): boolean;
public freeze(): Readonly<BitField<S>>;
public has(bit: BitFieldResolvable<S>): boolean;
public missing(bits: BitFieldResolvable<S>, ...hasParams: any[]): S[];
public remove(...bits: BitFieldResolvable<S>[]): BitField<S>;
public serialize(...hasParams: BitFieldResolvable<S>[]): Record<S, boolean>;
public toArray(): S[];
public toJSON(): number;
public valueOf(): number;
public [Symbol.iterator](): Iterator<S>;
public static resolve(bit?: BitFieldResolvable<string>): number;
public static FLAGS: { [key: string]: number };
}
export class CategoryChannel extends GuildChannel {
public readonly children: Collection<Snowflake, GuildChannel>;
}
@@ -125,7 +148,7 @@ declare module 'discord.js' {
public on(event: 'guildCreate' | 'guildDelete' | 'guildUnavailable', listener: (guild: Guild) => void): this;
public on(event: 'guildMemberAdd' | 'guildMemberAvailable' | 'guildMemberRemove', listener: (member: GuildMember) => void): this;
public on(event: 'guildMembersChunk', listener: (members: Collection<Snowflake, GuildMember>, guild: Guild) => void): this;
public on(event: 'guildMemberSpeaking', listener: (member: GuildMember, speaking: boolean) => void): this;
public on(event: 'guildMemberSpeaking', listener: (member: GuildMember, speaking: Readonly<Speaking>) => void): this;
public on(event: 'guildMemberUpdate', listener: (oldMember: GuildMember, newMember: GuildMember) => void): this;
public on(event: 'guildUpdate', listener: (oldGuild: Guild, newGuild: Guild) => void): this;
public on(event: 'message' | 'messageDelete' | 'messageReactionRemoveAll', listener: (message: Message) => void): this;
@@ -156,7 +179,7 @@ declare module 'discord.js' {
public once(event: 'guildCreate' | 'guildDelete' | 'guildUnavailable', listener: (guild: Guild) => void): this;
public once(event: 'guildMemberAdd' | 'guildMemberAvailable' | 'guildMemberRemove', listener: (member: GuildMember) => void): this;
public once(event: 'guildMembersChunk', listener: (members: Collection<Snowflake, GuildMember>, guild: Guild) => void): this;
public once(event: 'guildMemberSpeaking', listener: (member: GuildMember, speaking: boolean) => void): this;
public once(event: 'guildMemberSpeaking', listener: (member: GuildMember, speaking: Readonly<Speaking>) => void): this;
public once(event: 'guildMemberUpdate', listener: (oldMember: GuildMember, newMember: GuildMember) => void): this;
public once(event: 'guildUpdate', listener: (oldGuild: Guild, newGuild: Guild) => void): this;
public once(event: 'message' | 'messageDelete' | 'messageReactionRemoveAll', listener: (message: Message) => void): this;
@@ -450,8 +473,8 @@ declare module 'discord.js' {
export class GuildChannel extends Channel {
constructor(guild: Guild, data: object);
private memberPermissions(member: GuildMember): Permissions;
private rolePermissions(role: Role): Permissions;
private memberPermissions(member: GuildMember): Readonly<Permissions>;
private rolePermissions(role: Role): Readonly<Permissions>;
public readonly calculatedPosition: number;
public readonly deletable: boolean;
@@ -513,7 +536,7 @@ declare module 'discord.js' {
public readonly kickable: boolean;
public readonly manageable: boolean;
public nickname: string;
public readonly permissions: Permissions;
public readonly permissions: Readonly<Permissions>;
public readonly presence: Presence;
public roles: GuildMemberRoleStore;
public user: User;
@@ -524,8 +547,7 @@ declare module 'discord.js' {
public edit(data: GuildMemberEditData, reason?: string): Promise<GuildMember>;
public hasPermission(permission: PermissionResolvable, options?: { checkAdmin?: boolean; checkOwner?: boolean }): boolean;
public kick(reason?: string): Promise<GuildMember>;
public missingPermissions(permissions: PermissionResolvable, explicit?: boolean): PermissionString[];
public permissionsIn(channel: ChannelResolvable): Permissions;
public permissionsIn(channel: ChannelResolvable): Readonly<Permissions>;
public setDeaf(deaf: boolean, reason?: string): Promise<GuildMember>;
public setMute(mute: boolean, reason?: string): Promise<GuildMember>;
public setNickname(nickname: string, reason?: string): Promise<GuildMember>;
@@ -710,29 +732,18 @@ declare module 'discord.js' {
export class PermissionOverwrites {
constructor(guildChannel: GuildChannel, data: object);
public allowed: Permissions;
public allow: Readonly<Permissions>;
public readonly channel: GuildChannel;
public denied: Permissions;
public deny: Readonly<Permissions>;
public id: Snowflake;
public type: OverwriteType;
public delete(reason?: string): Promise<PermissionOverwrites>;
public toJSON(): object;
}
export class Permissions {
constructor(permissions: PermissionResolvable);
public bitfield: number;
public add(...permissions: PermissionResolvable[]): this;
public freeze(): this;
export class Permissions extends BitField<PermissionString> {
public has(permission: PermissionResolvable, checkAdmin?: boolean): boolean;
public missing(permissions: PermissionResolvable, checkAdmin?: boolean): PermissionString[];
public remove(...permissions: PermissionResolvable[]): this;
public serialize(checkAdmin?: boolean): PermissionObject;
public toArray(checkAdmin?: boolean): PermissionString[];
public toJSON(): object;
public valueOf(): number;
public [Symbol.iterator](): IterableIterator<PermissionString>;
public has(bit: BitFieldResolvable<PermissionString>): boolean;
public static ALL: number;
public static DEFAULT: number;
@@ -743,6 +754,7 @@ declare module 'discord.js' {
export class Presence {
constructor(client: Client, data: object);
public activity: Activity;
public flags: Readonly<ActivityFlags>;
public status: 'online' | 'offline' | 'idle' | 'dnd';
public readonly user: User;
public readonly member?: GuildMember;
@@ -807,14 +819,14 @@ declare module 'discord.js' {
public readonly members: Collection<Snowflake, GuildMember>;
public mentionable: boolean;
public name: string;
public permissions: Permissions;
public permissions: Readonly<Permissions>;
public readonly position: number;
public rawPosition: number;
public comparePositionTo(role: Role): number;
public delete(reason?: string): Promise<Role>;
public edit(data: RoleData, reason?: string): Promise<Role>;
public equals(role: Role): boolean;
public permissionsIn(channel: ChannelResolvable): Permissions;
public permissionsIn(channel: ChannelResolvable): Readonly<Permissions>;
public setColor(color: ColorResolvable, reason?: string): Promise<Role>;
public setHoist(hoist: boolean, reason?: string): Promise<Role>;
public setMentionable(mentionable: boolean, reason?: string): Promise<Role>;
@@ -959,6 +971,11 @@ declare module 'discord.js' {
public once(event: string, listener: Function): this;
}
export class Speaking extends BitField<SpeakingString> {
public static resolve(permission: BitFieldResolvable<SpeakingString>): number;
public static FLAGS: Record<SpeakingString, number>;
}
export class Structures {
static get<K extends keyof Extendable>(structure: K): Extendable[K];
static get(structure: string): Function;
@@ -1097,7 +1114,7 @@ declare module 'discord.js' {
private reconnect(token: string, endpoint: string): void;
private sendVoiceStateUpdate(options: object): void;
private setSessionID(sessionID: string): void;
private setSpeaking(value: boolean): void;
private setSpeaking(value: BitFieldResolvable<SpeakingString>): void;
private setTokenAndEndpoint(token: string, endpoint: string): void;
private updateChannel(channel: VoiceChannel): void;
@@ -1106,7 +1123,7 @@ declare module 'discord.js' {
public readonly dispatcher: StreamDispatcher;
public player: object;
public receiver: VoiceReceiver;
public speaking: boolean;
public speaking: Readonly<Speaking>;
public status: VoiceStatus;
public voiceManager: object;
public disconnect(): void;
@@ -1121,7 +1138,7 @@ declare module 'discord.js' {
public on(event: 'newSession', listener: () => void): this;
public on(event: 'ready', listener: () => void): this;
public on(event: 'reconnecting', listener: () => void): this;
public on(event: 'speaking', listener: (user: User, speaking: boolean) => void): this;
public on(event: 'speaking', listener: (user: User, speaking: Readonly<Speaking>) => void): this;
public on(event: 'warn', listener: (warning: string | Error) => void): this;
public on(event: string, listener: Function): this;
@@ -1134,7 +1151,7 @@ declare module 'discord.js' {
public once(event: 'newSession', listener: () => void): this;
public once(event: 'ready', listener: () => void): this;
public once(event: 'reconnecting', listener: () => void): this;
public once(event: 'speaking', listener: (user: User, speaking: boolean) => void): this;
public once(event: 'speaking', listener: (user: User, speaking: Readonly<Speaking>) => void): this;
public once(event: 'warn', listener: (warning: string | Error) => void): this;
public once(event: string, listener: Function): this;
}
@@ -1360,6 +1377,8 @@ declare module 'discord.js' {
//#region Typedefs
type ActivityFlagsString = 'INSTANCE' | 'JOIN' | 'SPECTATE' | 'JOIN_REQUEST' | 'SYNC' | 'PLAY';
type ActivityType = 'PLAYING'
| 'STREAMING'
| 'LISTENING'
@@ -1444,6 +1463,8 @@ declare module 'discord.js' {
type Base64String = string;
type BitFieldResolvable<T extends string> = RecursiveArray<T | number | BitField<T>> | T | number | BitField<T>;
type BufferResolvable = Buffer | string;
type ChannelCreationOverwrites = {
@@ -1857,8 +1878,8 @@ declare module 'discord.js' {
type PermissionResolvable = RecursiveArray<Permissions | PermissionString | number> | Permissions | PermissionString | number;
type PermissionOverwriteOptions = {
allowed: PermissionResolvable;
denied: PermissionResolvable;
allow: PermissionResolvable;
deny: PermissionResolvable;
id: UserResolvable | RoleResolvable;
};
@@ -1924,6 +1945,8 @@ declare module 'discord.js' {
highWaterMark?: number;
};
type SpeakingString = 'SPEAKING' | 'SOUNDSHARE';
type StreamType = 'unknown' | 'converted' | 'opus' | 'ogg/opus' | 'webm/opus';
type StringResolvable = string | string[] | any;