Compile all things

This commit is contained in:
Jean Ouina 2020-07-28 13:56:57 +02:00
parent 4939d69a19
commit 45ac98cb2d
14 changed files with 5375 additions and 2895 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -7,9 +7,14 @@ gulp.task("watch-css", function() {
return gulp.watch(["./src/styles/index.css"], minifyCSS);
});
function minifyCSS() {
return gulp.src("./src/styles/index.css")
async function minifyCSS() {
return [
gulp.src("./src/styles/index.css")
.pipe(csso({restructure: false}))
.pipe(rename("style.min.css"))
.pipe(gulp.dest("./dist")),
gulp.src("./src/styles/index.css")
.pipe(rename("style.css"))
.pipe(gulp.dest("./dist"));
.pipe(gulp.dest("./dist"))
]
}

File diff suppressed because it is too large Load Diff

View File

@ -1,321 +1,334 @@
import { Snowflake, Channel } from ".."
import { DiscordGuild, channelsModule, guildModule, UserSettingsModule, ConstantsModule, CdnModule, AckModule } from "../util/DiscordToModules"
import BaseStructure from "./BaseStructure"
import { createChannel, createGuildMember, createRole, UserResolvable, resolveUserID, ChannelData, ChannelCreationOverwrites, PermissionOverwrites } from "../util/util"
import Collection from "@discordjs/collection"
import SnowflakeUtil from "../util/Snowflake"
import GuildMember from "./GuildMember"
import { MessageNotificationType } from "../util/Constants"
import Role from "./Role"
import DiscordJSError from "../util/DiscordJSError"
export default class Guild extends BaseStructure {
DiscordGuild:DiscordGuild
constructor(data:DiscordGuild){
super()
this.DiscordGuild = data
}
get id(): Snowflake{
return this.DiscordGuild.id
}
get afkChannel():Channel{
if(!this.afkChannelID)return null
return createChannel(channelsModule.getChannel(this.afkChannelID))
}
get afkChannelID():Snowflake{
return this.DiscordGuild.afkChannelId
}
get afkTimeout():number{
return this.DiscordGuild.afkTimeout
}
get applicationID():Snowflake{
return this.DiscordGuild.application_id
}
get available():boolean{
return true
}
get channels():Collection<Snowflake, Channel>{{
return this.client.channels.filter(channel => channel.guild_id === this.id)
}}
get createdAt():Date{
return SnowflakeUtil.deconstruct(this.id).date
}
get createdTimestamp():number{
return this.createdAt.getTime()
}
get defaultChannel(){
return this.channels.get(this.id)
}
get defaultMessageNotifications():number{
return this.DiscordGuild.defaultMessageNotifications
}
deleted:boolean = false
get embedEnabled(){
return true
}
get emojis(){
return this.client.emojis.filter(e => e.guild_id === this.id)
}
get explicitContentFilter(){
return this.DiscordGuild.explicitContentFilter
}
get features(){
return Array.from(this.DiscordGuild.features)
}
get icon(){
return this.DiscordGuild.icon
}
get iconURL(){
return this.DiscordGuild.getIconURL().replace(".webp", ".jpg")
}
get joinedAt(){
return new Date(this.DiscordGuild.joinedAt)
}
get joinedTimestamp(){
return this.DiscordGuild.joinedAt.getTime()
}
get large(){
return false
}
get me(){
return this.members.find(member => member.id === this.client.user.id)
}
get memberCount(){
return guildModule.getMemberCount(this.id)
}
get members(){
return new Collection<Snowflake, GuildMember>(guildModule.getMembers(this.id).map(member => [member.userId, createGuildMember(member)]))
}
get messageNotifications():MessageNotificationType{
return MessageNotificationType[guildModule.getMessageNotifications(this.id)] as unknown as MessageNotificationType
}
get mfaLevel(){
return this.DiscordGuild.mfaLevel
}
get mobilePush():boolean{
return guildModule.getNotificationsState().userGuildSettings[this.id].mobile_push
}
get muted(){
return guildModule.getNotificationsState().userGuildSettings[this.id].muted
}
get name(){
return this.DiscordGuild.name
}
get nameAcronym(){
return this.DiscordGuild.acronym
}
get owner(){
return this.members.get(this.ownerID)
}
get ownerID(){
return this.DiscordGuild.ownerId
}
get position(){
let guildPositions = UserSettingsModule.getAllSettings().guildPositions
if(!guildPositions)return 0
return guildPositions.indexOf(this.id)
}
get presences(){ // TODO: Add activities.
return new Collection()
}
get region(){
return this.DiscordGuild.region
}
get roles(){
return new Collection<Snowflake, Role>(Object.values(this.DiscordGuild.roles).map(role => [role.id, createRole(role)]))
}
get splash(){
return this.DiscordGuild.splash
}
get splashURL(){
return CdnModule.getGuildSplashURL({
id: this.id,
splash: this.splash,
size: ConstantsModule.SPLASH_SIZE
})
}
get suppressEveryone(){
return guildModule.getNotificationsState().userGuildSettings[this.id].suppress_everyone
}
get systemChannel(){
return this.client.channels.get(this.systemChannelID)
}
get systemChannelID(){
return this.DiscordGuild.systemChannelId
}
get verificationLevel(){
return this.DiscordGuild.verificationLevel
}
get verified(){
return this.features.includes("VERIFIED")
}
get voiceConnection(){// TODO: Implement if possible VoiceConnection. Maybe not fully like discord.js, but at least can see if you're connected.
return null
}
get banner(){
return this.DiscordGuild.banner
}
get bannerURL(){
return CdnModule.getGuildBannerURL({
id: this.id,
banner: this.banner
})
}
get description(){
return this.DiscordGuild.description
}
get embedChannel(){ // TODO: Implement embedChannel
return null
}
get embedChannelID(){ // TODO: Implement embedChannelID
return null
}
get maximumMembers(){ // TODO: Correctly Implement maximumMembers if possible
return 250000
}
get maximumPresences(){ // TODO: Correctly Implement maximumPresences if possible
return 5000
}
get widgetEnabled(){ // TODO: Correctly Implement widgetEnabled if possible
return false
}
get widgetChannelID(){ // TODO: Correctly Implement widgetChannelID if possible
return null
}
get widgetChannel(){ // TODO: Correctly Implement widgetChannel if possible
return null
}
get vanityURLCode(){
return this.DiscordGuild.vanityURLCode
}
/** FUNCTIONS */
async acknowledge(){
AckModule.bulkAck(this.channels.filter(e => e.type === "text").map(e => {
return {
channelId: e.id,
messageId: channelsModule.lastMessageId(e.id)
}
}))
}
addMember(...args:any):Promise<GuildMember>{
return Promise.reject(new DiscordJSError("This method is not available on Lightcord."))
}
allowDMs(allow:boolean){
let restricted = UserSettingsModule.getAllSettings().restrictedGuilds
if(allow){
if(!restricted.includes(this.id))return Promise.resolve(this)
restricted = restricted.filter(e => e !== this.id)
}else{
if(restricted.includes(this.id))return Promise.resolve(this)
restricted.push(this.id)
}
return UserSettingsModule.updateRemoteSettings({
restrictedGuilds: restricted
}).then(() => this)
}
async ban(user:UserResolvable, {
days = 0,
reason = null
}: {
days?: number,
reason?: string
} = {}):Promise<Snowflake>{ // always returning a snowflake
let id = resolveUserID(user)
if(!id)return Promise.reject(new DiscordJSError("Given user could not be resolved to an user ID."))
let result = await guildModule.banUser(this.id, id, days, reason).catch(err => err)
if(result instanceof Error || result.status !== 204){
let message = result.body
if(Array.isArray(message)){
message = message[0]
}else{
if(message.user_id){
message = "User: "+ message.user_id[0]
}else if(message.delete_message_days){
message = "Days: "+ message.delete_message_days[0]
}else if(message.reason){
message = "Reason: "+ message.reason[0]
}else{
message = result.text
}
}
throw new DiscordJSError(message)
}
return id
}
createChannel(name:string, typeOrOptions:string|ChannelData = 'text', permissionOverwrites?: ChannelCreationOverwrites[] | Collection<Snowflake, PermissionOverwrites>, reason?: string){
}
fetch():Promise<Guild>{ // Guild is synced by Discord. Only refreshing from cache.
let guild = guildModule.getGuild(this.id)
if(!guild){
this.deleted = true
return Promise.resolve(this)
}
this.DiscordGuild = guild
return Promise.resolve(this)
}
import { Snowflake, Channel } from ".."
import { DiscordGuild, channelsModule, guildModule, UserSettingsModule, ConstantsModule, CdnModule, AckModule } from "../util/DiscordToModules"
import BaseStructure from "./BaseStructure"
import { createChannel, createGuildMember, createRole, UserResolvable, resolveUserID, ChannelData, ChannelCreationOverwrites } from "../util/util"
import Collection from "@discordjs/collection"
import SnowflakeUtil from "../util/Snowflake"
import GuildMember from "./GuildMember"
import { MessageNotificationType, ChannelTypes } from "../util/Constants"
import Role from "./Role"
import DiscordJSError from "../util/DiscordJSError"
import PermissionOverwrites from "./PermissionOverwrites"
export default class Guild extends BaseStructure {
DiscordGuild:DiscordGuild
constructor(data:DiscordGuild){
super()
this.DiscordGuild = data
}
get id(): Snowflake{
return this.DiscordGuild.id
}
get afkChannel():Channel{
if(!this.afkChannelID)return null
return createChannel(channelsModule.getChannel(this.afkChannelID))
}
get afkChannelID():Snowflake{
return this.DiscordGuild.afkChannelId
}
get afkTimeout():number{
return this.DiscordGuild.afkTimeout
}
get applicationID():Snowflake{
return this.DiscordGuild.application_id
}
get available():boolean{
return true
}
get channels():Collection<Snowflake, Channel>{{
return this.client.channels.filter(channel => channel.guild_id === this.id)
}}
get createdAt():Date{
return SnowflakeUtil.deconstruct(this.id).date
}
get createdTimestamp():number{
return this.createdAt.getTime()
}
get defaultChannel(){
return this.channels.get(this.id)
}
get defaultMessageNotifications():number{
return this.DiscordGuild.defaultMessageNotifications
}
deleted:boolean = false
get embedEnabled(){
return true
}
get emojis(){
return this.client.emojis.filter(e => e.guild_id === this.id)
}
get explicitContentFilter(){
return this.DiscordGuild.explicitContentFilter
}
get features(){
return Array.from(this.DiscordGuild.features)
}
get icon(){
return this.DiscordGuild.icon
}
get iconURL(){
return this.DiscordGuild.getIconURL().replace(".webp", ".jpg")
}
get joinedAt(){
return new Date(this.DiscordGuild.joinedAt)
}
get joinedTimestamp(){
return this.DiscordGuild.joinedAt.getTime()
}
get large(){
return false
}
get me(){
return this.members.find(member => member.id === this.client.user.id)
}
get memberCount(){
return guildModule.getMemberCount(this.id)
}
get members(){
return new Collection<Snowflake, GuildMember>(guildModule.getMembers(this.id).map(member => [member.userId, createGuildMember(member)]))
}
get messageNotifications():MessageNotificationType{
return MessageNotificationType[guildModule.getMessageNotifications(this.id)] as unknown as MessageNotificationType
}
get mfaLevel(){
return this.DiscordGuild.mfaLevel
}
get mobilePush():boolean{
return guildModule.getNotificationsState().userGuildSettings[this.id].mobile_push
}
get muted(){
return guildModule.getNotificationsState().userGuildSettings[this.id].muted
}
get name(){
return this.DiscordGuild.name
}
get nameAcronym(){
return this.DiscordGuild.acronym
}
get owner(){
return this.members.get(this.ownerID)
}
get ownerID(){
return this.DiscordGuild.ownerId
}
get position(){
let guildPositions = UserSettingsModule.getAllSettings().guildPositions
if(!guildPositions)return 0
return guildPositions.indexOf(this.id)
}
get presences(){ // TODO: Add activities.
return new Collection()
}
get region(){
return this.DiscordGuild.region
}
get roles(){
return new Collection<Snowflake, Role>(Object.values(this.DiscordGuild.roles).map(role => [role.id, createRole(role)]))
}
get splash(){
return this.DiscordGuild.splash
}
get splashURL(){
return CdnModule.getGuildSplashURL({
id: this.id,
splash: this.splash,
size: ConstantsModule.SPLASH_SIZE
})
}
get suppressEveryone(){
return guildModule.getNotificationsState().userGuildSettings[this.id].suppress_everyone
}
get systemChannel(){
return this.client.channels.get(this.systemChannelID)
}
get systemChannelID(){
return this.DiscordGuild.systemChannelId
}
get verificationLevel(){
return this.DiscordGuild.verificationLevel
}
get verified(){
return this.features.includes("VERIFIED")
}
get voiceConnection(){// TODO: Implement if possible VoiceConnection. Maybe not fully like discord.js, but at least can see if you're connected.
return null
}
get banner(){
return this.DiscordGuild.banner
}
get bannerURL(){
return CdnModule.getGuildBannerURL({
id: this.id,
banner: this.banner
})
}
get description(){
return this.DiscordGuild.description
}
get embedChannel(){ // TODO: Implement embedChannel
return null
}
get embedChannelID(){ // TODO: Implement embedChannelID
return null
}
get maximumMembers(){ // TODO: Correctly Implement maximumMembers if possible
return 250000
}
get maximumPresences(){ // TODO: Correctly Implement maximumPresences if possible
return 5000
}
get widgetEnabled(){ // TODO: Correctly Implement widgetEnabled if possible
return false
}
get widgetChannelID(){ // TODO: Correctly Implement widgetChannelID if possible
return null
}
get widgetChannel(){ // TODO: Correctly Implement widgetChannel if possible
return null
}
get vanityURLCode(){
return this.DiscordGuild.vanityURLCode
}
/** FUNCTIONS */
async acknowledge(){
AckModule.bulkAck(this.channels.filter(e => e.type === "text").map(e => {
return {
channelId: e.id,
messageId: channelsModule.lastMessageId(e.id)
}
}))
}
addMember(...args:any):Promise<GuildMember>{
return Promise.reject(new DiscordJSError("This method is not available on Lightcord."))
}
allowDMs(allow:boolean){
let restricted = UserSettingsModule.getAllSettings().restrictedGuilds
if(allow){
if(!restricted.includes(this.id))return Promise.resolve(this)
restricted = restricted.filter(e => e !== this.id)
}else{
if(restricted.includes(this.id))return Promise.resolve(this)
restricted.push(this.id)
}
return UserSettingsModule.updateRemoteSettings({
restrictedGuilds: restricted
}).then(() => this)
}
async ban(user:UserResolvable, {
days = 0,
reason = null
}: {
days?: number,
reason?: string
} = {}):Promise<Snowflake>{ // always returning a snowflake
let id = resolveUserID(user)
if(!id)return Promise.reject(new DiscordJSError("Given user could not be resolved to an user ID."))
let result = await guildModule.banUser(this.id, id, days, reason).catch(err => err)
if(result instanceof Error || result.status !== 204){
let message = result.body
if(Array.isArray(message)){
message = message[0]
}else{
if(message.user_id){
message = "User: "+ message.user_id[0]
}else if(message.delete_message_days){
message = "Days: "+ message.delete_message_days[0]
}else if(message.reason){
message = "Reason: "+ message.reason[0]
}else{
message = result.text
}
}
throw new DiscordJSError(message)
}
return id
}
createChannel(name:string, typeOrOptions:ChannelTypes|ChannelData = ChannelTypes.TEXT, permissionOverwrites?: ChannelCreationOverwrites[] | Collection<Snowflake, PermissionOverwrites>, reason?: string){
const [opts, type] = typeof typeOrOptions === "string" ? [
{},
typeOrOptions
] : [
typeOrOptions,
typeOrOptions.type
]
const options = {
name: name || "Unknown Channel",
type: type || "text"
}
//TODO: CreateGuildChannels and handle permissions
//channelsModule.createGuildChannel(this.id, options.type, optinos.name)
}
fetch():Promise<Guild>{ // Guild is synced by Discord. Only refreshing from cache.
let guild = guildModule.getGuild(this.id)
if(!guild){
this.deleted = true
return Promise.resolve(this)
}
this.DiscordGuild = guild
return Promise.resolve(this)
}
}

View File

@ -0,0 +1,61 @@
import Permissions from '../util/Permissions';
import GuildChannel from './GuildChannel';
import { Snowflake } from '..';
/**
* Represents a permission overwrite for a role or member in a guild channel.
*/
export default class PermissionOverwrites {
id: Snowflake;
type: "role"|"member";
deny: number;
allow: number;
channel: GuildChannel;
constructor(guildChannel:GuildChannel, data) {
/**
* The GuildChannel this overwrite is for
* @name PermissionOverwrites#channel
* @type {GuildChannel}
* @readonly
*/
Object.defineProperty(this, 'channel', { value: guildChannel });
if (data) this.setup(data);
}
setup(data) {
/**
* The ID of this overwrite, either a user ID or a role ID
* @type {Snowflake}
*/
this.id = data.id;
/**
* The type of this overwrite
* @type {string}
*/
this.type = data.type;
/**
* The permissions that are denied for the user or role as a bitfield.
* @type {number}
*/
this.deny = data.deny;
/**
* The permissions that are allowed for the user or role as a bitfield.
* @type {number}
*/
this.allow = data.allow;
}
/**
* Delete this Permission Overwrite.
* @param {string} [reason] Reason for deleting this overwrite
* @returns {Promise<PermissionOverwrites>}
*/
delete(reason) {
// TODO: Delete permission overwrites
//return this.channel.client.rest.methods.deletePermissionOverwrites(this, reason);
}
}

View File

@ -0,0 +1,32 @@
import Permissions from '../../util/Permissions';
import Collection from '@discordjs/collection';
import Guild from '../Guild';
import { ChannelCreationOverwrites } from '../../util/util';
import { Snowflake } from '../..';
import PermissionOverwrites from '../PermissionOverwrites';
module.exports = function resolvePermissions(overwrites: ChannelCreationOverwrites[] | Collection<Snowflake, PermissionOverwrites>, guild:Guild) {
if (overwrites instanceof Collection || overwrites instanceof Array) {
//TODO: Remove ts-ignore
// @ts-ignore
overwrites = (Array.isArray(overwrites) ? overwrites : overwrites.array()).map(overwrite => {
const role = this.client.resolver.resolveRole(guild, overwrite.id);
if (role) {
overwrite.id = role.id;
overwrite.type = 'role';
} else {
overwrite.id = this.client.resolver.resolveUserID(overwrite.id);
overwrite.type = 'member';
}
return {
allow: Permissions.resolve(overwrite.allow || overwrite.allowed || 0),
deny: Permissions.resolve(overwrite.deny || overwrite.denied || 0),
type: overwrite.type,
id: overwrite.id,
};
});
}
return overwrites;
};

View File

@ -1,210 +1,210 @@
import BitField from "./BitField";
import * as util from "util";
/**
* Data structure that makes it easy to interact with a permission bitfield. All {@link GuildMember}s have a set of
* permissions in their guild, and each channel in the guild may also have {@link PermissionOverwrites} for the member
* that override their default permissions.
* @extends {BitField}
*/
export default class Permissions extends BitField {
/**
* @param {number|PermissionResolvable} permissions Permissions or bitfield to read from
*/
constructor(permissions: number | PermissionResolvable) {
super(permissions);
}
/**
* Bitfield of the packed permissions
* @type {number}
* @see {@link Permissions#bitfield}
* @deprecated
* @readonly
*/
get raw() {
return this.bitfield;
}
set raw(raw) {
this.bitfield = raw;
}
/**
* Checks whether the bitfield has a permission, or any of multiple permissions.
* @param {PermissionResolvable} permission Permission(s) to check for
* @param {boolean} [checkAdmin=true] Whether to allow the administrator permission to override
* @returns {boolean}
*/
any(permission: PermissionResolvable, checkAdmin: boolean = true): boolean {
return (
(checkAdmin && super.has((this.constructor as any).FLAGS.ADMINISTRATOR)) ||
super.any(permission)
);
}
/**
* Checks whether the bitfield has a permission, or multiple permissions.
* @param {PermissionResolvable} permission Permission(s) to check for
* @param {boolean} [checkAdmin=true] Whether to allow the administrator permission to override
* @returns {boolean}
*/
has(permission: PermissionResolvable, checkAdmin: boolean = true): boolean {
return (
(checkAdmin && super.has((this.constructor as any).FLAGS.ADMINISTRATOR)) ||
super.has(permission)
);
}
/**
* Numeric permission flags. All available properties:
* - `ADMINISTRATOR` (implicitly has *all* permissions, and bypasses all channel overwrites)
* - `CREATE_INSTANT_INVITE` (create invitations to the guild)
* - `KICK_MEMBERS`
* - `BAN_MEMBERS`
* - `MANAGE_CHANNELS` (edit and reorder channels)
* - `MANAGE_GUILD` (edit the guild information, region, etc.)
* - `ADD_REACTIONS` (add new reactions to messages)
* - `VIEW_AUDIT_LOG`
* - `PRIORITY_SPEAKER`
* - `STREAM`
* - `VIEW_CHANNEL`
* - `READ_MESSAGES` **(deprecated)**
* - `SEND_MESSAGES`
* - `SEND_TTS_MESSAGES`
* - `MANAGE_MESSAGES` (delete messages and reactions)
* - `EMBED_LINKS` (links posted will have a preview embedded)
* - `ATTACH_FILES`
* - `READ_MESSAGE_HISTORY` (view messages that were posted prior to opening Discord)
* - `MENTION_EVERYONE`
* - `USE_EXTERNAL_EMOJIS` (use emojis from different guilds)
* - `EXTERNAL_EMOJIS` **(deprecated)**
* - `CONNECT` (connect to a voice channel)
* - `SPEAK` (speak in a voice channel)
* - `MUTE_MEMBERS` (mute members across all voice channels)
* - `DEAFEN_MEMBERS` (deafen members across all voice channels)
* - `MOVE_MEMBERS` (move members between voice channels)
* - `USE_VAD` (use voice activity detection)
* - `CHANGE_NICKNAME`
* - `MANAGE_NICKNAMES` (change other members' nicknames)
* - `MANAGE_ROLES`
* - `MANAGE_ROLES_OR_PERMISSIONS` **(deprecated)**
* - `MANAGE_WEBHOOKS`
* - `MANAGE_EMOJIS`
* @type {Object}
* @see {@link https://discordapp.com/developers/docs/topics/permissions}
*/
static FLAGS:{
CREATE_INSTANT_INVITE: number,
KICK_MEMBERS: number,
BAN_MEMBERS: number,
ADMINISTRATOR: number,
MANAGE_CHANNELS: number,
MANAGE_GUILD: number,
ADD_REACTIONS: number,
VIEW_AUDIT_LOG: number,
PRIORITY_SPEAKER: number,
STREAM: number,
VIEW_CHANNEL: number,
READ_MESSAGES: number,
SEND_MESSAGES: number,
SEND_TTS_MESSAGES: number,
MANAGE_MESSAGES: number,
EMBED_LINKS: number,
ATTACH_FILES: number,
READ_MESSAGE_HISTORY: number,
MENTION_EVERYONE: number,
EXTERNAL_EMOJIS: number,
USE_EXTERNAL_EMOJIS: number,
CONNECT: number,
SPEAK: number,
MUTE_MEMBERS: number,
DEAFEN_MEMBERS: number,
MOVE_MEMBERS: number,
USE_VAD: number,
CHANGE_NICKNAME: number,
MANAGE_NICKNAMES: number,
MANAGE_ROLES: number,
MANAGE_ROLES_OR_PERMISSIONS: number,
MANAGE_WEBHOOKS: number,
MANAGE_EMOJIS: number,
} = {
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,
READ_MESSAGES: 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,
EXTERNAL_EMOJIS: 1 << 18,
USE_EXTERNAL_EMOJIS: 1 << 18,
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_ROLES_OR_PERMISSIONS: 1 << 28,
MANAGE_WEBHOOKS: 1 << 29,
MANAGE_EMOJIS: 1 << 30,
};
/**
* Bitfield representing every permission combined
* @type {number}
*/
static ALL: number = Object.keys(Permissions.FLAGS).reduce(
(all, p) => all | Permissions.FLAGS[p],
0
);
/**
* Bitfield representing the default permissions for users
* @type {number}
*/
static DEFAULT: number = 104324673;
}
Object.defineProperty(Permissions.prototype, "raw", {
get: util.deprecate(
Object.getOwnPropertyDescriptor(Permissions.prototype, "raw").get,
"EvaluatedPermissions#raw is deprecated use Permissions#bitfield instead"
),
set: util.deprecate(
Object.getOwnPropertyDescriptor(Permissions.prototype, "raw").set,
"EvaluatedPermissions#raw is deprecated use Permissions#bitfield instead"
),
});
/**
* Data that can be resolved to give a permission number. This can be:
* * A string (see {@link Permissions.FLAGS})
* * A permission number
* @typedef {string|number|Permissions|PermissionResolvable[]} PermissionResolvable
*/
export type PermissionResolvable =
| string
| number
| Permissions
| PermissionResolvable[];
import BitField from "./BitField";
import * as util from "util";
/**
* Data structure that makes it easy to interact with a permission bitfield. All {@link GuildMember}s have a set of
* permissions in their guild, and each channel in the guild may also have {@link PermissionOverwrites} for the member
* that override their default permissions.
* @extends {BitField}
*/
export default class Permissions extends BitField {
/**
* @param {number|PermissionResolvable} permissions Permissions or bitfield to read from
*/
constructor(permissions: number | PermissionResolvable) {
super(permissions);
}
/**
* Bitfield of the packed permissions
* @type {number}
* @see {@link Permissions#bitfield}
* @deprecated
* @readonly
*/
get raw() {
return this.bitfield;
}
set raw(raw) {
this.bitfield = raw;
}
/**
* Checks whether the bitfield has a permission, or any of multiple permissions.
* @param {PermissionResolvable} permission Permission(s) to check for
* @param {boolean} [checkAdmin=true] Whether to allow the administrator permission to override
* @returns {boolean}
*/
any(permission: PermissionResolvable, checkAdmin: boolean = true): boolean {
return (
(checkAdmin && super.has((this.constructor as any).FLAGS.ADMINISTRATOR)) ||
super.any(permission)
);
}
/**
* Checks whether the bitfield has a permission, or multiple permissions.
* @param {PermissionResolvable} permission Permission(s) to check for
* @param {boolean} [checkAdmin=true] Whether to allow the administrator permission to override
* @returns {boolean}
*/
has(permission: PermissionResolvable, checkAdmin: boolean = true): boolean {
return (
(checkAdmin && super.has((this.constructor as any).FLAGS.ADMINISTRATOR)) ||
super.has(permission)
);
}
/**
* Numeric permission flags. All available properties:
* - `ADMINISTRATOR` (implicitly has *all* permissions, and bypasses all channel overwrites)
* - `CREATE_INSTANT_INVITE` (create invitations to the guild)
* - `KICK_MEMBERS`
* - `BAN_MEMBERS`
* - `MANAGE_CHANNELS` (edit and reorder channels)
* - `MANAGE_GUILD` (edit the guild information, region, etc.)
* - `ADD_REACTIONS` (add new reactions to messages)
* - `VIEW_AUDIT_LOG`
* - `PRIORITY_SPEAKER`
* - `STREAM`
* - `VIEW_CHANNEL`
* - `READ_MESSAGES` **(deprecated)**
* - `SEND_MESSAGES`
* - `SEND_TTS_MESSAGES`
* - `MANAGE_MESSAGES` (delete messages and reactions)
* - `EMBED_LINKS` (links posted will have a preview embedded)
* - `ATTACH_FILES`
* - `READ_MESSAGE_HISTORY` (view messages that were posted prior to opening Discord)
* - `MENTION_EVERYONE`
* - `USE_EXTERNAL_EMOJIS` (use emojis from different guilds)
* - `EXTERNAL_EMOJIS` **(deprecated)**
* - `CONNECT` (connect to a voice channel)
* - `SPEAK` (speak in a voice channel)
* - `MUTE_MEMBERS` (mute members across all voice channels)
* - `DEAFEN_MEMBERS` (deafen members across all voice channels)
* - `MOVE_MEMBERS` (move members between voice channels)
* - `USE_VAD` (use voice activity detection)
* - `CHANGE_NICKNAME`
* - `MANAGE_NICKNAMES` (change other members' nicknames)
* - `MANAGE_ROLES`
* - `MANAGE_ROLES_OR_PERMISSIONS` **(deprecated)**
* - `MANAGE_WEBHOOKS`
* - `MANAGE_EMOJIS`
* @type {Object}
* @see {@link https://discordapp.com/developers/docs/topics/permissions}
*/
static FLAGS:{
CREATE_INSTANT_INVITE: number,
KICK_MEMBERS: number,
BAN_MEMBERS: number,
ADMINISTRATOR: number,
MANAGE_CHANNELS: number,
MANAGE_GUILD: number,
ADD_REACTIONS: number,
VIEW_AUDIT_LOG: number,
PRIORITY_SPEAKER: number,
STREAM: number,
VIEW_CHANNEL: number,
READ_MESSAGES: number,
SEND_MESSAGES: number,
SEND_TTS_MESSAGES: number,
MANAGE_MESSAGES: number,
EMBED_LINKS: number,
ATTACH_FILES: number,
READ_MESSAGE_HISTORY: number,
MENTION_EVERYONE: number,
EXTERNAL_EMOJIS: number,
USE_EXTERNAL_EMOJIS: number,
CONNECT: number,
SPEAK: number,
MUTE_MEMBERS: number,
DEAFEN_MEMBERS: number,
MOVE_MEMBERS: number,
USE_VAD: number,
CHANGE_NICKNAME: number,
MANAGE_NICKNAMES: number,
MANAGE_ROLES: number,
MANAGE_ROLES_OR_PERMISSIONS: number,
MANAGE_WEBHOOKS: number,
MANAGE_EMOJIS: number,
} = {
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,
READ_MESSAGES: 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,
EXTERNAL_EMOJIS: 1 << 18,
USE_EXTERNAL_EMOJIS: 1 << 18,
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_ROLES_OR_PERMISSIONS: 1 << 28,
MANAGE_WEBHOOKS: 1 << 29,
MANAGE_EMOJIS: 1 << 30,
};
/**
* Bitfield representing every permission combined
* @type {number}
*/
static ALL: number = Object.keys(Permissions.FLAGS).reduce(
(all, p) => all | Permissions.FLAGS[p],
0
);
/**
* Bitfield representing the default permissions for users
* @type {number}
*/
static DEFAULT: number = 104324673;
}
Object.defineProperty(Permissions.prototype, "raw", {
get: util.deprecate(
Object.getOwnPropertyDescriptor(Permissions.prototype, "raw").get,
"EvaluatedPermissions#raw is deprecated use Permissions#bitfield instead"
),
set: util.deprecate(
Object.getOwnPropertyDescriptor(Permissions.prototype, "raw").set,
"EvaluatedPermissions#raw is deprecated use Permissions#bitfield instead"
),
});
/**
* Data that can be resolved to give a permission number. This can be:
* * A string (see {@link Permissions.FLAGS})
* * A permission number
* @typedef {string|number|Permissions|PermissionResolvable[]} PermissionResolvable
*/
export type PermissionResolvable =
| keyof typeof Permissions.FLAGS
| number
| Permissions
| PermissionResolvable[];

View File

@ -1,58 +1,69 @@
import {requireModule, DiscordChannel} from "../DiscordToModules"
import { Snowflake } from "../.."
let channelsModuleInternal1:{
getChannel(id:Snowflake): DiscordChannel,
getChannels(): {
[k:string]: DiscordChannel
},
getDMFromUserId(id:string):Snowflake,
getDMUserIds():Snowflake[],
getFollowerStatsForChannel(id: Snowflake):{
loadingStatus: "succeeded"|"failed",
lastFetched: number,
channelsFollowing: number,
guildMembers: number,
guildsFollowing: number,
usersSeenEver: number,
subscribersGainedSinceLastPost: number,
subscribersLostSinceLastPost: number
},
getGDMsForRecipients(recipients: Snowflake[]):Set<Snowflake>
} = requireModule(e => e.default && e.default.getChannels && e.default.getChannel)
let channelsModuleInternal2:{
deleteChannel(id: Snowflake):void
}
let channelsModuleInternal3:{
hasUnread(channel_id:Snowflake):boolean,
hasCategoryUnread(channel_id:Snowflake):boolean,
getUnreadCount(channel_id:Snowflake):number,
getMentionCount(channel_id:Snowflake):number,
ackMessageId(channel_id:Snowflake):Snowflake,
lastMessageId(channel_id:Snowflake):Snowflake,
getOldestUnreadMessageId(channel_id:Snowflake):Snowflake,
getOldestUnreadTimestamp(channel_id:Snowflake):number,
isEstimated(channel_id:Snowflake):boolean,
hasUnreadPins(channel_id:Snowflake):boolean,
getAllReadStates()
} = requireModule(e => e.default && e.default.lastMessageId)
function set3(){
if(channelsModuleInternal3)return
channelsModuleInternal3 = requireModule(e => e.default && e.default.lastMessageId)
}
export = {
getChannel: channelsModuleInternal1.getChannel,
getAllChannels: channelsModuleInternal1.getChannels,
get delete():typeof channelsModuleInternal2.deleteChannel{
return channelsModuleInternal2 ? channelsModuleInternal2.deleteChannel : (channelsModuleInternal2 = requireModule(e => e.default && e.default.deleteChannel), channelsModuleInternal2.deleteChannel)
},
get lastMessageId(){
set3()
return channelsModuleInternal3.lastMessageId
}
import {requireModule, DiscordChannel} from "../DiscordToModules"
import { Snowflake } from "../.."
let channelsModuleInternal1:{
getChannel(id:Snowflake): DiscordChannel,
getChannels(): {
[k:string]: DiscordChannel
},
getDMFromUserId(id:string):Snowflake,
getDMUserIds():Snowflake[],
getFollowerStatsForChannel(id: Snowflake):{
loadingStatus: "succeeded"|"failed",
lastFetched: number,
channelsFollowing: number,
guildMembers: number,
guildsFollowing: number,
usersSeenEver: number,
subscribersGainedSinceLastPost: number,
subscribersLostSinceLastPost: number
},
getGDMsForRecipients(recipients: Snowflake[]):Set<Snowflake>
} = requireModule(e => e.default && e.default.getChannels && e.default.getChannel)
let channelsModuleInternal2:{
deleteChannel(id: Snowflake):void
}
let channelsModuleInternal4:{
createChannel(guildId:Snowflake, type:string, name:string,
permissionOverwrites: {
id: Snowflake,
type: "role"|"member",
allow: number,
deny: number
}[], bitrate:number, userLimit:number, parentId:Snowflake, skuId:Snowflake, branchId:Snowflake):void
} = requireModule(e => e.default && e.default.createChannel)
let channelsModuleInternal3:{
hasUnread(channel_id:Snowflake):boolean,
hasCategoryUnread(channel_id:Snowflake):boolean,
getUnreadCount(channel_id:Snowflake):number,
getMentionCount(channel_id:Snowflake):number,
ackMessageId(channel_id:Snowflake):Snowflake,
lastMessageId(channel_id:Snowflake):Snowflake,
getOldestUnreadMessageId(channel_id:Snowflake):Snowflake,
getOldestUnreadTimestamp(channel_id:Snowflake):number,
isEstimated(channel_id:Snowflake):boolean,
hasUnreadPins(channel_id:Snowflake):boolean,
getAllReadStates()
} = requireModule(e => e.default && e.default.lastMessageId)
function set3(){
if(channelsModuleInternal3)return
channelsModuleInternal3 = requireModule(e => e.default && e.default.lastMessageId)
}
export = {
getChannel: channelsModuleInternal1.getChannel,
getAllChannels: channelsModuleInternal1.getChannels,
get delete():typeof channelsModuleInternal2.deleteChannel{
return channelsModuleInternal2 ? channelsModuleInternal2.deleteChannel : (channelsModuleInternal2 = requireModule(e => e.default && e.default.deleteChannel), channelsModuleInternal2.deleteChannel)
},
get lastMessageId(){
set3()
return channelsModuleInternal3.lastMessageId
},
createGuildChannel: channelsModuleInternal4.createChannel
}

View File

@ -1,150 +1,149 @@
import { DiscordChannel, DiscordGuild, DiscordGuildMember, DiscordRole, DiscordMessage, DiscordUser } from "./DiscordToModules"
import { Channel, Snowflake } from "..";
import BaseChannel from "../structures/BaseChannel";
import Guild from "../structures/Guild";
import TextChannel from "../structures/TextChannel";
import GuildMember from "../structures/GuildMember";
import Role from "../structures/Role";
import User from "../structures/User";
import Message from "../structures/Message";
import { ChannelTypes } from "./Constants";
import CategoryChannel from "../structures/CategoryChannel";
import Collection from "@discordjs/collection";
import Permissions, { PermissionResolvable } from "./Permissions";
export function createChannel(channel:DiscordChannel):Channel{
let constructor = channels[channel.type] || BaseChannel
return new constructor(channel)
}
const channels:(new(channel:DiscordChannel) => Channel)[] = [
TextChannel
]
export function createGuild(guild:DiscordGuild):Guild{
return new Guild(guild)
}
export function createGuildMember(member:DiscordGuildMember):GuildMember{
return new GuildMember(member)
}
export function createRole(role:DiscordRole):Role{
return new Role(role)
}
export function createMessage(message:DiscordMessage):Message{
return new Message(message)
}
export function createUser(user:DiscordUser):User{
return new User(user)
}
export function applyMixins(derivedCtor: any, baseCtors: any[]) {
baseCtors.forEach(baseCtor => {
Object.getOwnPropertyNames(baseCtor.prototype).forEach(name => {
if (name !== 'constructor') {
derivedCtor.prototype[name] = baseCtor.prototype[name];
}
});
});
}
/**
* Transforms a snowflake from a decimal string to a bit string.
* @param {string} num Snowflake to be transformed
* @returns {string}
* @private
*/
export function idToBinary(num:string):string{
let bin = '';
let high = parseInt(num.slice(0, -10)) || 0;
let low = parseInt(num.slice(-10));
while (low > 0 || high > 0) {
bin = String(low & 1) + bin;
low = Math.floor(low / 2);
if (high > 0) {
low += 5000000000 * (high % 2);
high = Math.floor(high / 2);
}
}
return bin;
}
/**
* Transforms a snowflake from a bit string to a decimal string.
* @param {string} num Bit string to be transformed
* @returns {string}
* @private
*/
export function binaryToID(num:string):string {
let dec = '';
while (num.length > 50) {
const high = parseInt(num.slice(0, -32), 2);
const low = parseInt((high % 10).toString(2) + num.slice(-32), 2);
dec = (low % 10).toString() + dec;
num = Math.floor(high / 10).toString(2) +
Math.floor(low / 10)
.toString(2)
.padStart(32, '0');
}
let num2 = parseInt(num, 2);
while (num2 > 0) {
dec = (num2 % 10).toString() + dec;
num2 = Math.floor(num2 / 10);
}
return dec;
}
export type UserResolvable = User | Snowflake | Message | Guild | GuildMember
export function resolveUserID(user:UserResolvable){
if(typeof user === "string")return user // ID
if(user instanceof User)return user.id // User
if(user instanceof Message)return user.author.id // Message Author
if(user instanceof Guild)return user.ownerID // Guild
if(user instanceof GuildMember)return user.id // GuildMember
return null
}
export type ChannelData = {
type?: ChannelTypes,
name?: string,
position?: number,
topic?: string,
nsfw?: boolean,
bitrate?: number,
userLimit?: number,
parent?: CategoryChannel|Snowflake,
permissionOverwrites?: ChannelCreationOverwrites[] | Collection<Snowflake, PermissionOverwrites>,
rateLimitPerUser?: number
}
export type ChannelCreationOverwrites = {
allow?: PermissionResolvable,
/**
* @deprecated
*/
allowed?: PermissionResolvable,
deny?: PermissionResolvable,
/**
* @deprecated
*/
denied?: PermissionResolvable,
id?: GuildMemberResolvable | RoleResolvable
}
export type PermissionOverwrites = keyof typeof Permissions.FLAGS | number | Permissions | PermissionResolvable[]
export {BitFieldResolvable} from "./BitField"
export type GuildMemberResolvable = GuildMember | User
import { DiscordChannel, DiscordGuild, DiscordGuildMember, DiscordRole, DiscordMessage, DiscordUser } from "./DiscordToModules"
import { Channel, Snowflake } from "..";
import BaseChannel from "../structures/BaseChannel";
import Guild from "../structures/Guild";
import TextChannel from "../structures/TextChannel";
import GuildMember from "../structures/GuildMember";
import Role from "../structures/Role";
import User from "../structures/User";
import Message from "../structures/Message";
import { ChannelTypes } from "./Constants";
import CategoryChannel from "../structures/CategoryChannel";
import Collection from "@discordjs/collection";
import Permissions, { PermissionResolvable } from "./Permissions";
import PermissionOverwrites from "../structures/PermissionOverwrites";
export function createChannel(channel:DiscordChannel):Channel{
let constructor = channels[channel.type] || BaseChannel
return new constructor(channel)
}
const channels:(new(channel:DiscordChannel) => Channel)[] = [
TextChannel
]
export function createGuild(guild:DiscordGuild):Guild{
return new Guild(guild)
}
export function createGuildMember(member:DiscordGuildMember):GuildMember{
return new GuildMember(member)
}
export function createRole(role:DiscordRole):Role{
return new Role(role)
}
export function createMessage(message:DiscordMessage):Message{
return new Message(message)
}
export function createUser(user:DiscordUser):User{
return new User(user)
}
export function applyMixins(derivedCtor: any, baseCtors: any[]) {
baseCtors.forEach(baseCtor => {
Object.getOwnPropertyNames(baseCtor.prototype).forEach(name => {
if (name !== 'constructor') {
derivedCtor.prototype[name] = baseCtor.prototype[name];
}
});
});
}
/**
* Transforms a snowflake from a decimal string to a bit string.
* @param {string} num Snowflake to be transformed
* @returns {string}
* @private
*/
export function idToBinary(num:string):string{
let bin = '';
let high = parseInt(num.slice(0, -10)) || 0;
let low = parseInt(num.slice(-10));
while (low > 0 || high > 0) {
bin = String(low & 1) + bin;
low = Math.floor(low / 2);
if (high > 0) {
low += 5000000000 * (high % 2);
high = Math.floor(high / 2);
}
}
return bin;
}
/**
* Transforms a snowflake from a bit string to a decimal string.
* @param {string} num Bit string to be transformed
* @returns {string}
* @private
*/
export function binaryToID(num:string):string {
let dec = '';
while (num.length > 50) {
const high = parseInt(num.slice(0, -32), 2);
const low = parseInt((high % 10).toString(2) + num.slice(-32), 2);
dec = (low % 10).toString() + dec;
num = Math.floor(high / 10).toString(2) +
Math.floor(low / 10)
.toString(2)
.padStart(32, '0');
}
let num2 = parseInt(num, 2);
while (num2 > 0) {
dec = (num2 % 10).toString() + dec;
num2 = Math.floor(num2 / 10);
}
return dec;
}
export type UserResolvable = User | Snowflake | Message | Guild | GuildMember
export function resolveUserID(user:UserResolvable){
if(typeof user === "string")return user // ID
if(user instanceof User)return user.id // User
if(user instanceof Message)return user.author.id // Message Author
if(user instanceof Guild)return user.ownerID // Guild
if(user instanceof GuildMember)return user.id // GuildMember
return null
}
export type ChannelData = {
type?: ChannelTypes,
name?: string,
position?: number,
topic?: string,
nsfw?: boolean,
bitrate?: number,
userLimit?: number,
parent?: CategoryChannel|Snowflake,
permissionOverwrites?: ChannelCreationOverwrites[] | Collection<Snowflake, PermissionOverwrites>,
rateLimitPerUser?: number
}
export type ChannelCreationOverwrites = {
allow?: PermissionResolvable,
/**
* @deprecated
*/
allowed?: PermissionResolvable,
deny?: PermissionResolvable,
/**
* @deprecated
*/
denied?: PermissionResolvable,
id?: GuildMemberResolvable | RoleResolvable
}
export {BitFieldResolvable} from "./BitField"
export type GuildMemberResolvable = GuildMember | User
export type RoleResolvable = Role | Snowflake

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -107,4 +107,8 @@ export default new class Utils {
})}\n}`
}
}
}
export class LightcordApiError extends Error {
name:string = "LightcordApiError"
}