Try to make Base class useful
Co-Authored-By: Aki <71239005+AkiaCode@users.noreply.github.com> Co-Authored-By: Y <8479056+yky4589@users.noreply.github.com> Co-Authored-By: Lee Hyun <ink0416@naver.com> Co-Authored-By: Choi Minseo <minseo0388@outlook.com> Co-Authored-By: khk4912 <30457148+khk4912@users.noreply.github.com>
This commit is contained in:
parent
b7e89ea263
commit
c846bd6f61
12 changed files with 197 additions and 25 deletions
|
@ -1,8 +1,38 @@
|
||||||
import { Client } from '../models/client.ts'
|
import { Client } from '../models/client.ts'
|
||||||
|
import * as cache from '../models/cache.ts'
|
||||||
|
|
||||||
export class Base {
|
export class Base {
|
||||||
client: Client
|
client: Client
|
||||||
constructor (client: Client) {
|
static useCache = true
|
||||||
|
static cacheName: string
|
||||||
|
static cacheArgIndex = 0
|
||||||
|
static restFunc: (...restArgs: string[]) => string
|
||||||
|
|
||||||
|
constructor (client: Client, _data?: any) {
|
||||||
this.client = client
|
this.client = client
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static async autoInit (client: Client, ...restURLfuncArgs: string[]) {
|
||||||
|
if (this.useCache) {
|
||||||
|
const cached = cache.get(
|
||||||
|
this.cacheName,
|
||||||
|
restURLfuncArgs[this.cacheArgIndex]
|
||||||
|
)
|
||||||
|
if (cached !== undefined && cached instanceof this) {
|
||||||
|
return cached
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const resp = await fetch(this.restFunc(...restURLfuncArgs), {
|
||||||
|
headers: {
|
||||||
|
Authorization: `Bot ${client.token}`
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const jsonParsed = await resp.json()
|
||||||
|
const initialized = new this(client, jsonParsed)
|
||||||
|
cache.set(this.cacheName, restURLfuncArgs[this.cacheArgIndex], initialized)
|
||||||
|
|
||||||
|
return initialized
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,12 +14,14 @@ import { CategoryChannel } from './guildCategoryChannel.ts'
|
||||||
import { VoiceChannel } from './guildVoiceChannel.ts'
|
import { VoiceChannel } from './guildVoiceChannel.ts'
|
||||||
import { NewsChannel } from './guildnewsChannel.ts'
|
import { NewsChannel } from './guildnewsChannel.ts'
|
||||||
import { DMChannel } from './dmChannel.ts'
|
import { DMChannel } from './dmChannel.ts'
|
||||||
import { GroupChannel } from './groupChannel.ts'
|
import { GroupDMChannel } from './groupChannel.ts'
|
||||||
import { TextChannel } from './textChannel.ts'
|
import { TextChannel } from './textChannel.ts'
|
||||||
|
|
||||||
export class Channel extends Base {
|
export class Channel extends Base {
|
||||||
type: ChannelTypes
|
type: ChannelTypes
|
||||||
id: string
|
id: string
|
||||||
|
static cacheName = 'channel'
|
||||||
|
static cacheArgIndex = 0
|
||||||
|
|
||||||
constructor (client: Client, data: ChannelPayload) {
|
constructor (client: Client, data: ChannelPayload) {
|
||||||
super(client)
|
super(client)
|
||||||
|
@ -31,6 +33,10 @@ export class Channel extends Base {
|
||||||
return `<#${this.id}>`
|
return `<#${this.id}>`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static async autoInit (client: Client, channelID: string) {
|
||||||
|
return super.autoInit(client, channelID)
|
||||||
|
}
|
||||||
|
|
||||||
static from (
|
static from (
|
||||||
data:
|
data:
|
||||||
| GuildChannelCategoryPayload
|
| GuildChannelCategoryPayload
|
||||||
|
@ -53,7 +59,7 @@ export class Channel extends Base {
|
||||||
case ChannelTypes.DM:
|
case ChannelTypes.DM:
|
||||||
return new DMChannel(client, data as DMChannelPayload)
|
return new DMChannel(client, data as DMChannelPayload)
|
||||||
case ChannelTypes.GROUP_DM:
|
case ChannelTypes.GROUP_DM:
|
||||||
return new GroupChannel(client, data as GroupDMChannelPayload)
|
return new GroupDMChannel(client, data as GroupDMChannelPayload)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,5 +28,36 @@ export class Embed extends Base {
|
||||||
fields?: EmbedField[]
|
fields?: EmbedField[]
|
||||||
constructor (client: Client, data: EmbedPayload) {
|
constructor (client: Client, data: EmbedPayload) {
|
||||||
super(client)
|
super(client)
|
||||||
|
this.title = data.title
|
||||||
|
this.type = data.type
|
||||||
|
this.description = data.description
|
||||||
|
this.url = data.url
|
||||||
|
this.timestamp = data.timestamp
|
||||||
|
this.color = data.color
|
||||||
|
this.footer = data.footer
|
||||||
|
this.image = data.image
|
||||||
|
this.thumbnail = data.thumbnail
|
||||||
|
this.video = data.video
|
||||||
|
this.provider = data.provider
|
||||||
|
this.author = data.author
|
||||||
|
this.fields = data.fields
|
||||||
|
}
|
||||||
|
|
||||||
|
toJSON () {
|
||||||
|
return {
|
||||||
|
title: this.title,
|
||||||
|
type: this.type,
|
||||||
|
description: this.description,
|
||||||
|
url: this.url,
|
||||||
|
timestamp: this.timestamp,
|
||||||
|
color: this.color,
|
||||||
|
footer: this.footer,
|
||||||
|
image: this.image,
|
||||||
|
thumbnail: this.thumbnail,
|
||||||
|
video: this.video,
|
||||||
|
provider: this.provider,
|
||||||
|
author: this.author,
|
||||||
|
fields: this.fields
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@ import { Client } from '../models/client.ts'
|
||||||
import { GroupDMChannelPayload } from '../types/channelTypes.ts'
|
import { GroupDMChannelPayload } from '../types/channelTypes.ts'
|
||||||
import { Channel } from './channel.ts'
|
import { Channel } from './channel.ts'
|
||||||
|
|
||||||
export class GroupChannel extends Channel {
|
export class GroupDMChannel extends Channel {
|
||||||
name: string
|
name: string
|
||||||
icon?: string
|
icon?: string
|
||||||
ownerID: string
|
ownerID: string
|
||||||
|
|
|
@ -109,7 +109,7 @@ export class Guild extends Base {
|
||||||
}
|
}
|
||||||
|
|
||||||
static async autoInit (client: Client, guildID: string) {
|
static async autoInit (client: Client, guildID: string) {
|
||||||
const cached = cache.get('guilds', guildID)
|
const cached = cache.get('guild', guildID)
|
||||||
if (cached === undefined || !(cached instanceof Guild)) {
|
if (cached === undefined || !(cached instanceof Guild)) {
|
||||||
const resp = await fetch(GUILD(guildID), {
|
const resp = await fetch(GUILD(guildID), {
|
||||||
headers: {
|
headers: {
|
||||||
|
@ -119,10 +119,68 @@ export class Guild extends Base {
|
||||||
const guildParsed: GuildPayload = await resp.json()
|
const guildParsed: GuildPayload = await resp.json()
|
||||||
|
|
||||||
const newGuild = new Guild(client, guildParsed)
|
const newGuild = new Guild(client, guildParsed)
|
||||||
cache.set('guilds', guildID, newGuild)
|
cache.set('guild', guildID, newGuild)
|
||||||
return newGuild
|
return newGuild
|
||||||
} else {
|
} else {
|
||||||
return cached
|
return cached
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async refresh () {
|
||||||
|
const resp = await fetch(GUILD(this.id), {
|
||||||
|
headers: {
|
||||||
|
Authorization: `Bot ${this.client.token}`
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const guildParsed: GuildPayload = await resp.json()
|
||||||
|
/*for (const rawKey of Object.keys(guildParsed)) {
|
||||||
|
const _key: string[] = rawKey.split('_').map((v, i) => i === 0 ? v : v.substr(0, 1).toUpperCase() + v.substr(1))
|
||||||
|
const key = _key.join('')
|
||||||
|
if (this.hasOwnProperty(key)) this[key] // fucking ts
|
||||||
|
}*/
|
||||||
|
this.name = guildParsed.name
|
||||||
|
this.icon = guildParsed.icon
|
||||||
|
this.iconHash = guildParsed.icon_hash
|
||||||
|
this.splash = guildParsed.splash
|
||||||
|
this.discoverySplash = guildParsed.discovery_splash
|
||||||
|
this.owner = guildParsed.owner
|
||||||
|
this.ownerID = guildParsed.owner_id
|
||||||
|
this.permissions = guildParsed.permissions
|
||||||
|
this.region = guildParsed.region
|
||||||
|
this.afkTimeout = guildParsed.afk_timeout
|
||||||
|
this.afkChannelID = guildParsed.afk_channel_id
|
||||||
|
this.widgetEnabled = guildParsed.widget_enabled
|
||||||
|
this.widgetChannelID = guildParsed.widget_channel_id
|
||||||
|
this.verificationLevel = guildParsed.verification_level
|
||||||
|
this.defaultMessageNotifications = guildParsed.default_message_notifications
|
||||||
|
this.explicitContentFilter = guildParsed.explicit_content_filter
|
||||||
|
this.roles = guildParsed.roles
|
||||||
|
this.emojis = guildParsed.emojis
|
||||||
|
this.features = guildParsed.features
|
||||||
|
this.mfaLevel = guildParsed.mfa_level
|
||||||
|
this.systemChannelID = guildParsed.system_channel_id
|
||||||
|
this.systemChannelFlags = guildParsed.system_channel_flags
|
||||||
|
this.rulesChannelID = guildParsed.rules_channel_id
|
||||||
|
this.joinedAt = guildParsed.joined_at
|
||||||
|
this.large = guildParsed.large
|
||||||
|
this.unavailable = guildParsed.unavailable
|
||||||
|
this.memberCount = guildParsed.member_count
|
||||||
|
this.voiceStates = guildParsed.voice_states
|
||||||
|
this.members = guildParsed.members
|
||||||
|
this.channels = guildParsed.channels
|
||||||
|
this.presences = guildParsed.presences
|
||||||
|
this.maxPresences = guildParsed.max_presences
|
||||||
|
this.maxMembers = guildParsed.max_members
|
||||||
|
this.vanityURLCode = guildParsed.vanity_url_code
|
||||||
|
this.description = guildParsed.description
|
||||||
|
this.banner = guildParsed.banner
|
||||||
|
this.premiumTier = guildParsed.premium_tier
|
||||||
|
this.premiumSubscriptionCount = guildParsed.premium_subscription_count
|
||||||
|
this.preferredLocale = guildParsed.preferred_locale
|
||||||
|
this.publicUpdatesChannelID = guildParsed.public_updates_channel_id
|
||||||
|
this.maxVideoChannelUsers = guildParsed.max_video_channel_users
|
||||||
|
this.approximateNumberCount = guildParsed.approximate_number_count
|
||||||
|
this.approximatePresenceCount = guildParsed.approximate_presence_count
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
import { Client } from '../models/client.ts'
|
import { Client } from '../models/client.ts'
|
||||||
import { GuildChannelPayload, Overwrite } from '../types/channelTypes.ts'
|
import { GuildChannelPayload, Overwrite } from '../types/channelTypes.ts'
|
||||||
import { Channel } from './channel.ts'
|
import { Channel } from './channel.ts'
|
||||||
|
import * as cache from '../models/cache.ts'
|
||||||
|
import { Guild } from './guild.ts'
|
||||||
|
import { GUILD_CHANNEL } from '../types/endpoint.ts'
|
||||||
|
|
||||||
export class GuildChannel extends Channel {
|
export class GuildChannel extends Channel {
|
||||||
guildID: string
|
guildID: string
|
||||||
|
@ -19,4 +22,22 @@ export class GuildChannel extends Channel {
|
||||||
this.nsfw = data.nsfw
|
this.nsfw = data.nsfw
|
||||||
this.parentID = data.parent_id
|
this.parentID = data.parent_id
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static async autoInit (client: Client, guildID: string) {
|
||||||
|
const cached = cache.get('guildChannel', guildID)
|
||||||
|
if (cached === undefined || !(cached instanceof GuildChannel)) {
|
||||||
|
const resp = await fetch(GUILD_CHANNEL(guildID), {
|
||||||
|
headers: {
|
||||||
|
Authorization: `Bot ${client.token}`
|
||||||
|
}
|
||||||
|
})
|
||||||
|
const guildChannelParsed: GuildChannelPayload = await resp.json()
|
||||||
|
|
||||||
|
const newGuild = new GuildChannel(client, guildChannelParsed)
|
||||||
|
cache.set('guildChannel', guildID, newGuild)
|
||||||
|
return newGuild
|
||||||
|
} else {
|
||||||
|
return cached
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
import { Client } from '../models/client.ts'
|
import { Client } from '../models/client.ts'
|
||||||
import { GuildChannel } from './guildChannel.ts'
|
import { GuildChannel } from './guildChannel.ts'
|
||||||
import { GuildTextChannelPayload } from '../types/channelTypes.ts'
|
import { GuildTextChannelPayload } from '../types/channelTypes.ts'
|
||||||
import { User } from './user.ts'
|
|
||||||
|
|
||||||
export class GuildTextChannel extends GuildChannel {
|
export class GuildTextChannel extends GuildChannel {
|
||||||
rateLimit: number
|
rateLimit: number
|
||||||
|
|
22
src/structures/snowflake.ts
Normal file
22
src/structures/snowflake.ts
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
export class Snowflake {
|
||||||
|
snowflake: bigint
|
||||||
|
constructor (id: string) {
|
||||||
|
this.snowflake = BigInt.asUintN(64, BigInt(id))
|
||||||
|
}
|
||||||
|
|
||||||
|
get timestamp () {
|
||||||
|
return ((this.snowflake >> BigInt(22)) + BigInt(1420070400000)).toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
get workerID () {
|
||||||
|
return ((this.snowflake & BigInt(0x3e0000)) >> BigInt(17)).toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
get processID () {
|
||||||
|
return ((this.snowflake & BigInt(0x1f000)) >> BigInt(12)).toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
get increment () {
|
||||||
|
return (this.snowflake & BigInt(0xfff)).toString()
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,6 +1,8 @@
|
||||||
import { Client } from '../models/client.ts'
|
import { Client } from '../models/client.ts'
|
||||||
import { UserPayload } from '../types/userTypes.ts'
|
import { UserPayload } from '../types/userTypes.ts'
|
||||||
import { Base } from './base.ts'
|
import { Base } from './base.ts'
|
||||||
|
import * as cache from '../models/cache.ts'
|
||||||
|
import { USER } from '../types/endpoint.ts'
|
||||||
|
|
||||||
export class User extends Base {
|
export class User extends Base {
|
||||||
id: string
|
id: string
|
||||||
|
@ -41,4 +43,23 @@ export class User extends Base {
|
||||||
this.premiumType = data.premium_type
|
this.premiumType = data.premium_type
|
||||||
this.publicFlags = data.public_flags
|
this.publicFlags = data.public_flags
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static async autoInit (client: Client, userID: string) {
|
||||||
|
// user? users?
|
||||||
|
const cached = cache.get('user', userID)
|
||||||
|
if (cached === undefined || !(cached instanceof User)) {
|
||||||
|
const resp = await fetch(USER(userID), {
|
||||||
|
headers: {
|
||||||
|
Authorization: `Bot ${client.token}`
|
||||||
|
}
|
||||||
|
})
|
||||||
|
const userParsed: UserPayload = await resp.json()
|
||||||
|
|
||||||
|
const newUser = new User(client, userParsed)
|
||||||
|
cached.set('user', userID, newUser)
|
||||||
|
return newUser
|
||||||
|
} else {
|
||||||
|
return cached
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -193,6 +193,7 @@ export {
|
||||||
GUILD_INTEGRATION,
|
GUILD_INTEGRATION,
|
||||||
GUILD_INTEGRATIONS,
|
GUILD_INTEGRATIONS,
|
||||||
GUILD_INTEGARTION_SYNC,
|
GUILD_INTEGARTION_SYNC,
|
||||||
|
GUILD_WIDGET_IMAGE,
|
||||||
GUILD_BAN,
|
GUILD_BAN,
|
||||||
GUILD_BANS,
|
GUILD_BANS,
|
||||||
GUILD_CHANNEL,
|
GUILD_CHANNEL,
|
||||||
|
|
|
@ -19,7 +19,7 @@ interface GuildPayload {
|
||||||
afk_channel_id?: string
|
afk_channel_id?: string
|
||||||
afk_timeout: number
|
afk_timeout: number
|
||||||
widget_enabled?: boolean
|
widget_enabled?: boolean
|
||||||
widge_channel_id?: string
|
widget_channel_id?: string
|
||||||
verification_level: string
|
verification_level: string
|
||||||
default_message_notifications: string
|
default_message_notifications: string
|
||||||
explicit_content_filter: string
|
explicit_content_filter: string
|
||||||
|
|
|
@ -1,17 +0,0 @@
|
||||||
export class Snowflake {
|
|
||||||
id: string
|
|
||||||
constructor (id: string) {
|
|
||||||
this.id = id
|
|
||||||
}
|
|
||||||
|
|
||||||
deconstruct () {
|
|
||||||
const snowflake = BigInt.asUintN(64, BigInt(this.id))
|
|
||||||
const res = {
|
|
||||||
timestamp: ((snowflake << BigInt(22)) + BigInt(1420070400000)).toString(),
|
|
||||||
workerId: ((snowflake & BigInt(0x3e0000)) >> BigInt(17)).toString(),
|
|
||||||
processId: ((snowflake & BigInt(0x1f000)) >> BigInt(12)).toString(),
|
|
||||||
increment: (snowflake & BigInt(0xfff)).toString()
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in a new issue