Caching fixes, new Managers, improvemnts
This commit is contained in:
		
							parent
							
								
									935456906d
								
							
						
					
					
						commit
						e8347891d7
					
				
					 10 changed files with 56 additions and 48 deletions
				
			
		|  | @ -12,7 +12,7 @@ export const channelPinsUpdate: GatewayEventHandler = ( | ||||||
|     const before = after.refreshFromData({ |     const before = after.refreshFromData({ | ||||||
|       last_pin_timestamp: d.last_pin_timestamp |       last_pin_timestamp: d.last_pin_timestamp | ||||||
|     }) |     }) | ||||||
|     let raw = gateway.client.channels._get(d.channel_id) as ChannelPayload; |     const raw = gateway.client.channels._get(d.channel_id) ; | ||||||
|     gateway.client.channels.set(after.id, Object.assign(raw, { last_pin_timestamp: d.last_pin_timestamp })) |     gateway.client.channels.set(after.id, Object.assign(raw, { last_pin_timestamp: d.last_pin_timestamp })) | ||||||
|     gateway.client.emit('channelPinsUpdate', before, after) |     gateway.client.emit('channelPinsUpdate', before, after) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  | @ -142,7 +142,7 @@ class Gateway { | ||||||
| 
 | 
 | ||||||
|   private async sendIdentify () { |   private async sendIdentify () { | ||||||
|     this.debug("Fetching /gateway/bot...") |     this.debug("Fetching /gateway/bot...") | ||||||
|     let info = await this.client.rest.get(GATEWAY_BOT()) as GatewayBotPayload |     const info = await this.client.rest.get(GATEWAY_BOT()) as GatewayBotPayload | ||||||
|     if(info.session_start_limit.remaining == 0) throw new Error("Session Limit Reached. Retry After " + info.session_start_limit.reset_after + "ms") |     if(info.session_start_limit.remaining == 0) throw new Error("Session Limit Reached. Retry After " + info.session_start_limit.reset_after + "ms") | ||||||
|     this.debug("Recommended Shards: " + info.shards) |     this.debug("Recommended Shards: " + info.shards) | ||||||
|     this.debug("=== Session Limit Info ===") |     this.debug("=== Session Limit Info ===") | ||||||
|  |  | ||||||
|  | @ -17,7 +17,7 @@ export class BaseManager<T, T2> { | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   get(key: string): T2 | void { |   get(key: string): T2 | void { | ||||||
|     let raw = this._get(key) |     const raw = this._get(key) | ||||||
|     if(!raw) return |     if(!raw) return | ||||||
|     return new this.dataType(this.client, raw) as any |     return new this.dataType(this.client, raw) as any | ||||||
|   } |   } | ||||||
|  |  | ||||||
							
								
								
									
										20
									
								
								src/managers/MessagesManager.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								src/managers/MessagesManager.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,20 @@ | ||||||
|  | import { Client } from "../models/client.ts"; | ||||||
|  | import { Message } from "../structures/message.ts"; | ||||||
|  | import { MessagePayload } from "../types/channelTypes.ts"; | ||||||
|  | import { CHANNEL_MESSAGE } from "../types/endpoint.ts"; | ||||||
|  | import { BaseManager } from "./BaseManager.ts"; | ||||||
|  | 
 | ||||||
|  | export class MessagesManager extends BaseManager<MessagePayload, Message> { | ||||||
|  |   constructor(client: Client) { | ||||||
|  |     super(client, "messages", Message) | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   fetch(channelID: string, id: string) { | ||||||
|  |     return new Promise((res, rej) => { | ||||||
|  |       this.client.rest.get(CHANNEL_MESSAGE(channelID, id)).then(data => { | ||||||
|  |         this.set(id, data as MessagePayload) | ||||||
|  |         res(new Message(this.client, data as MessagePayload)) | ||||||
|  |       }).catch(e => rej(e)) | ||||||
|  |     }) | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | @ -20,7 +20,7 @@ export class DefaultCacheAdapter implements ICacheAdapter { | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   get(cacheName: string, key: string) { |   get(cacheName: string, key: string) { | ||||||
|     let cache = this.data[cacheName] |     const cache = this.data[cacheName] | ||||||
|     if (!cache) return; |     if (!cache) return; | ||||||
|     return cache.get(key) |     return cache.get(key) | ||||||
|   } |   } | ||||||
|  | @ -35,13 +35,13 @@ export class DefaultCacheAdapter implements ICacheAdapter { | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   delete(cacheName: string, key: string) { |   delete(cacheName: string, key: string) { | ||||||
|     let cache = this.data[cacheName] |     const cache = this.data[cacheName] | ||||||
|     if (!cache) return false |     if (!cache) return false | ||||||
|     return cache.delete(key) |     return cache.delete(key) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   array(cacheName: string) { |   array(cacheName: string) { | ||||||
|     let cache = this.data[cacheName] |     const cache = this.data[cacheName] | ||||||
|     if (!cache) return |     if (!cache) return | ||||||
|     return cache.array() |     return cache.array() | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  | @ -8,6 +8,7 @@ import { UserManager } from "../managers/UsersManager.ts" | ||||||
| import { GuildManager } from "../managers/GuildsManager.ts" | import { GuildManager } from "../managers/GuildsManager.ts" | ||||||
| import { EmojisManager } from "../managers/EmojisManager.ts" | import { EmojisManager } from "../managers/EmojisManager.ts" | ||||||
| import { ChannelsManager } from "../managers/ChannelsManager.ts" | import { ChannelsManager } from "../managers/ChannelsManager.ts" | ||||||
|  | import { MessagesManager } from "../managers/MessagesManager.ts" | ||||||
| 
 | 
 | ||||||
| /** Some Client Options to modify behaviour */ | /** Some Client Options to modify behaviour */ | ||||||
| export interface ClientOptions { | export interface ClientOptions { | ||||||
|  | @ -27,9 +28,11 @@ export class Client extends EventEmitter { | ||||||
|   token?: string |   token?: string | ||||||
|   cache: ICacheAdapter = new DefaultCacheAdapter(this) |   cache: ICacheAdapter = new DefaultCacheAdapter(this) | ||||||
|   intents?: GatewayIntents[] |   intents?: GatewayIntents[] | ||||||
|  |    | ||||||
|   users: UserManager = new UserManager(this) |   users: UserManager = new UserManager(this) | ||||||
|   guilds: GuildManager = new GuildManager(this) |   guilds: GuildManager = new GuildManager(this) | ||||||
|   channels: ChannelsManager = new ChannelsManager(this) |   channels: ChannelsManager = new ChannelsManager(this) | ||||||
|  |   messages: MessagesManager = new MessagesManager(this) | ||||||
|   emojis: EmojisManager = new EmojisManager(this) |   emojis: EmojisManager = new EmojisManager(this) | ||||||
| 
 | 
 | ||||||
|   constructor (options: ClientOptions = {}) { |   constructor (options: ClientOptions = {}) { | ||||||
|  |  | ||||||
|  | @ -149,7 +149,7 @@ export class RESTManager { | ||||||
| 				`DiscordBot (discord.deno)`, | 				`DiscordBot (discord.deno)`, | ||||||
| 		}; | 		}; | ||||||
| 
 | 
 | ||||||
| 		if(!this.client.token) delete headers["Authorization"]; | 		if(!this.client.token) delete headers.Authorization; | ||||||
| 	 | 	 | ||||||
| 		if (method === "get") body = undefined; | 		if (method === "get") body = undefined; | ||||||
| 	 | 	 | ||||||
|  | @ -201,7 +201,7 @@ export class RESTManager { | ||||||
| 		const errorStack = new Error("Location In Your Files:"); | 		const errorStack = new Error("Location In Your Files:"); | ||||||
| 		Error.captureStackTrace(errorStack); | 		Error.captureStackTrace(errorStack); | ||||||
| 	 | 	 | ||||||
| 		return new Promise((resolve, reject) => { | 		return await new Promise((resolve, reject) => { | ||||||
| 			const callback = async () => { | 			const callback = async () => { | ||||||
| 				try { | 				try { | ||||||
| 					const rateLimitResetIn = await this.checkRatelimits(url); | 					const rateLimitResetIn = await this.checkRatelimits(url); | ||||||
|  | @ -349,15 +349,19 @@ export class RESTManager { | ||||||
| 	get(url: string, body?: unknown) { | 	get(url: string, body?: unknown) { | ||||||
|     return this.runMethod("get", url, body); |     return this.runMethod("get", url, body); | ||||||
|   } |   } | ||||||
|  | 
 | ||||||
|   post(url: string, body?: unknown) { |   post(url: string, body?: unknown) { | ||||||
|     return this.runMethod("post", url, body); |     return this.runMethod("post", url, body); | ||||||
|   } |   } | ||||||
|  | 
 | ||||||
|   delete(url: string, body?: unknown) { |   delete(url: string, body?: unknown) { | ||||||
|     return this.runMethod("delete", url, body); |     return this.runMethod("delete", url, body); | ||||||
|   } |   } | ||||||
|  | 
 | ||||||
|   patch(url: string, body?: unknown) { |   patch(url: string, body?: unknown) { | ||||||
|     return this.runMethod("patch", url, body); |     return this.runMethod("patch", url, body); | ||||||
|   } |   } | ||||||
|  | 
 | ||||||
|   put(url: string, body?: unknown) { |   put(url: string, body?: unknown) { | ||||||
|     return this.runMethod("put", url, body); |     return this.runMethod("put", url, body); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  | @ -51,14 +51,14 @@ export class Message extends Base { | ||||||
|     this.channelID = data.channel_id |     this.channelID = data.channel_id | ||||||
|     this.guildID = data.guild_id |     this.guildID = data.guild_id | ||||||
|     this.author = |     this.author = | ||||||
|       cache.get('user', data.author.id) ?? new User(this.client, data.author) |       this.client.users.get(data.author.id) || new User(this.client, data.author) | ||||||
|     this.content = data.content |     this.content = data.content | ||||||
|     this.timestamp = data.timestamp |     this.timestamp = data.timestamp | ||||||
|     this.editedTimestamp = data.edited_timestamp |     this.editedTimestamp = data.edited_timestamp | ||||||
|     this.tts = data.tts |     this.tts = data.tts | ||||||
|     this.mentionEveryone = data.mention_everyone |     this.mentionEveryone = data.mention_everyone | ||||||
|     this.mentions = data.mentions.map( |     this.mentions = data.mentions.map( | ||||||
|       v => cache.get('user', v.id) ?? new User(client, v) |       v => this.client.users.get(v.id) || new User(client, v) | ||||||
|     ) |     ) | ||||||
|     this.mentionRoles = data.mention_roles |     this.mentionRoles = data.mention_roles | ||||||
|     this.mentionChannels = data.mention_channels |     this.mentionChannels = data.mention_channels | ||||||
|  | @ -73,7 +73,7 @@ export class Message extends Base { | ||||||
|     this.application = data.application |     this.application = data.application | ||||||
|     this.messageReference = data.message_reference |     this.messageReference = data.message_reference | ||||||
|     this.flags = data.flags |     this.flags = data.flags | ||||||
|     cache.set('message', this.id, this) |     this.client.messages.set(this.id, data) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   protected readFromData (data: MessagePayload): void { |   protected readFromData (data: MessagePayload): void { | ||||||
|  | @ -81,8 +81,8 @@ export class Message extends Base { | ||||||
|     this.channelID = data.channel_id ?? this.channelID |     this.channelID = data.channel_id ?? this.channelID | ||||||
|     this.guildID = data.guild_id ?? this.guildID |     this.guildID = data.guild_id ?? this.guildID | ||||||
|     this.author = |     this.author = | ||||||
|       cache.get('user', data.author.id) ?? |       this.client.users.get(data.author.id) || | ||||||
|       this.author ?? |       this.author || | ||||||
|       new User(this.client, data.author) |       new User(this.client, data.author) | ||||||
|     this.content = data.content ?? this.content |     this.content = data.content ?? this.content | ||||||
|     this.timestamp = data.timestamp ?? this.timestamp |     this.timestamp = data.timestamp ?? this.timestamp | ||||||
|  | @ -91,7 +91,7 @@ export class Message extends Base { | ||||||
|     this.mentionEveryone = data.mention_everyone ?? this.mentionEveryone |     this.mentionEveryone = data.mention_everyone ?? this.mentionEveryone | ||||||
|     this.mentions = |     this.mentions = | ||||||
|       data.mentions.map( |       data.mentions.map( | ||||||
|         v => cache.get('user', v.id) ?? new User(this.client, v) |         v => this.client.users.get(v.id) || new User(this.client, v) | ||||||
|       ) ?? this.mentions |       ) ?? this.mentions | ||||||
|     this.mentionRoles = data.mention_roles ?? this.mentionRoles |     this.mentionRoles = data.mention_roles ?? this.mentionRoles | ||||||
|     this.mentionChannels = data.mention_channels ?? this.mentionChannels |     this.mentionChannels = data.mention_channels ?? this.mentionChannels | ||||||
|  | @ -109,43 +109,24 @@ export class Message extends Base { | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   // TODO: We have to seperate fetch()
 |   // TODO: We have to seperate fetch()
 | ||||||
|   async editMessage (text?: string, option?: MessageOption): Promise<Message> { |   async edit (text?: string, option?: MessageOption): Promise<Message> { | ||||||
|     if (text !== undefined && option !== undefined) { |     if (text !== undefined && option !== undefined) { | ||||||
|       throw new Error('Either text or option is necessary.') |       throw new Error('Either text or option is necessary.') | ||||||
|     } |     } | ||||||
|     const resp = await fetch(CHANNEL_MESSAGE(this.channelID, this.id), { | 
 | ||||||
|       headers: { |     let newMsg = await this.client.rest.patch(CHANNEL_MESSAGE(this.channelID, this.id), { | ||||||
|         Authorization: `Bot ${this.client.token}`, |  | ||||||
|         'Content-Type': 'application/json' |  | ||||||
|       }, |  | ||||||
|       method: 'PATCH', |  | ||||||
|       body: JSON.stringify({ |  | ||||||
|       content: text, |       content: text, | ||||||
|       embed: option?.embed.toJSON(), |       embed: option?.embed.toJSON(), | ||||||
|       file: option?.file, |       file: option?.file, | ||||||
|       tts: option?.tts, |       tts: option?.tts, | ||||||
|       allowed_mentions: option?.allowedMention |       allowed_mentions: option?.allowedMention | ||||||
|       }) |     }) as MessagePayload | ||||||
|     }) |  | ||||||
| 
 | 
 | ||||||
|     return new Message(this.client, await resp.json()) |     return new Message(this.client, newMsg) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   // TODO: We have to seperate fetch()
 |   // TODO: We have to seperate fetch()
 | ||||||
|   async delete (): Promise<void> { |   delete (): Promise<void> { | ||||||
|     const resp = await fetch(CHANNEL_MESSAGE(this.channelID, this.id), { |     return this.client.rest.delete(CHANNEL_MESSAGE(this.channelID, this.id)) as any | ||||||
|       headers: { |  | ||||||
|         Authorization: `Bot ${this.client.token}` |  | ||||||
|       }, |  | ||||||
|       method: 'DELETE' |  | ||||||
|     }) |  | ||||||
| 
 |  | ||||||
|     // TODO: improve Error and Promise
 |  | ||||||
|     return await new Promise((resolve, reject) => { |  | ||||||
|       if (resp.status !== 204) { |  | ||||||
|         reject(new Error()) |  | ||||||
|       } |  | ||||||
|       resolve() |  | ||||||
|     }) |  | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -22,7 +22,7 @@ export class Collection<K, V> extends Map<K, V> { | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   random() { |   random() { | ||||||
|     let arr = [...this.values()] |     const arr = [...this.values()] | ||||||
|     return arr[Math.floor(Math.random() * arr.length)] |     return arr[Math.floor(Math.random() * arr.length)] | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  | @ -32,7 +32,7 @@ export class Collection<K, V> extends Map<K, V> { | ||||||
|       if (callback(value, key)) return value |       if (callback(value, key)) return value | ||||||
|     } |     } | ||||||
|     // If nothing matched
 |     // If nothing matched
 | ||||||
|     return; |      | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   filter(callback: (value: V, key: K) => boolean) { |   filter(callback: (value: V, key: K) => boolean) { | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue