feat: shard - the beginning
This commit is contained in:
		
							parent
							
								
									d0f48f601a
								
							
						
					
					
						commit
						71913ce239
					
				
					 5 changed files with 78 additions and 53 deletions
				
			
		|  | @ -15,6 +15,7 @@ import { Extension } from './extensions.ts' | ||||||
| import { SlashClient } from './slashClient.ts' | import { SlashClient } from './slashClient.ts' | ||||||
| import { Interaction } from '../structures/slash.ts' | import { Interaction } from '../structures/slash.ts' | ||||||
| import { SlashModule } from './slashModule.ts' | import { SlashModule } from './slashModule.ts' | ||||||
|  | import type { ShardManager } from './shard.ts' | ||||||
| 
 | 
 | ||||||
| /** OS related properties sent with Gateway Identify */ | /** OS related properties sent with Gateway Identify */ | ||||||
| export interface ClientProperties { | export interface ClientProperties { | ||||||
|  | @ -93,6 +94,7 @@ export class Client extends EventEmitter { | ||||||
|   _decoratedSlash?: Array<{ |   _decoratedSlash?: Array<{ | ||||||
|     name: string |     name: string | ||||||
|     guild?: string |     guild?: string | ||||||
|  |     parent?: string | ||||||
|     handler: (interaction: Interaction) => any |     handler: (interaction: Interaction) => any | ||||||
|   }> |   }> | ||||||
| 
 | 
 | ||||||
|  | @ -110,6 +112,11 @@ export class Client extends EventEmitter { | ||||||
|     ...args: Parameters<ClientEvents[K]> |     ...args: Parameters<ClientEvents[K]> | ||||||
|   ): boolean => this._untypedEmit(event, ...args) |   ): boolean => this._untypedEmit(event, ...args) | ||||||
| 
 | 
 | ||||||
|  |   /** Shard on which this Client is */ | ||||||
|  |   shard: number = 0 | ||||||
|  |   /** Shard Manager of this Client if Sharded */ | ||||||
|  |   shardManager?: ShardManager | ||||||
|  | 
 | ||||||
|   constructor(options: ClientOptions = {}) { |   constructor(options: ClientOptions = {}) { | ||||||
|     super() |     super() | ||||||
|     this.token = options.token |     this.token = options.token | ||||||
|  |  | ||||||
|  | @ -1 +1,69 @@ | ||||||
| // TODO: write code
 | import { Collection } from '../utils/collection.ts' | ||||||
|  | import { Client, ClientOptions } from './client.ts' | ||||||
|  | import EventEmitter from 'https://deno.land/std@0.74.0/node/events.ts' | ||||||
|  | import { RESTManager } from './rest.ts' | ||||||
|  | // import { GATEWAY_BOT } from '../types/endpoint.ts'
 | ||||||
|  | // import { GatewayBotPayload } from '../types/gatewayBot.ts'
 | ||||||
|  | 
 | ||||||
|  | // TODO(DjDeveloperr)
 | ||||||
|  | // I'm kinda confused; will continue on this later once
 | ||||||
|  | // Deno namespace in Web Woker is stable!
 | ||||||
|  | export interface ShardManagerOptions { | ||||||
|  |   client: Client | typeof Client | ||||||
|  |   token?: string | ||||||
|  |   intents?: number[] | ||||||
|  |   options?: ClientOptions | ||||||
|  |   shards: number | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export interface ShardManagerInitOptions { | ||||||
|  |   file: string | ||||||
|  |   token?: string | ||||||
|  |   intents?: number[] | ||||||
|  |   options?: ClientOptions | ||||||
|  |   shards?: number | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export class ShardManager extends EventEmitter { | ||||||
|  |   workers: Collection<string, Worker> = new Collection() | ||||||
|  |   token: string | ||||||
|  |   intents: number[] | ||||||
|  |   shardCount: number | ||||||
|  |   private readonly __client: Client | ||||||
|  | 
 | ||||||
|  |   get rest(): RESTManager { | ||||||
|  |     return this.__client.rest | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   constructor(options: ShardManagerOptions) { | ||||||
|  |     super() | ||||||
|  |     this.__client = | ||||||
|  |       options.client instanceof Client | ||||||
|  |         ? options.client | ||||||
|  |         : // eslint-disable-next-line new-cap
 | ||||||
|  |           new options.client(options.options) | ||||||
|  | 
 | ||||||
|  |     if (this.__client.token === undefined || options.token === undefined) | ||||||
|  |       throw new Error('Token should be provided when constructing ShardManager') | ||||||
|  |     if (this.__client.intents === undefined || options.intents === undefined) | ||||||
|  |       throw new Error( | ||||||
|  |         'Intents should be provided when constructing ShardManager' | ||||||
|  |       ) | ||||||
|  | 
 | ||||||
|  |     this.token = this.__client.token ?? options.token | ||||||
|  |     this.intents = this.__client.intents ?? options.intents | ||||||
|  |     this.shardCount = options.shards | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // static async init(): Promise<ShardManager> {}
 | ||||||
|  | 
 | ||||||
|  |   // async start(): Promise<ShardManager> {
 | ||||||
|  |   //   const info = ((await this.rest.get(
 | ||||||
|  |   //     GATEWAY_BOT()
 | ||||||
|  |   //   )) as unknown) as GatewayBotPayload
 | ||||||
|  | 
 | ||||||
|  |   //   const totalShards = this.__shardCount ?? info.shards
 | ||||||
|  | 
 | ||||||
|  |   //   return this
 | ||||||
|  |   // }
 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -158,6 +158,7 @@ export type SlashCommandHandlerCallback = (interaction: Interaction) => any | ||||||
| export interface SlashCommandHandler { | export interface SlashCommandHandler { | ||||||
|   name: string |   name: string | ||||||
|   guild?: string |   guild?: string | ||||||
|  |   parent?: string | ||||||
|   handler: SlashCommandHandlerCallback |   handler: SlashCommandHandlerCallback | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -11,7 +11,7 @@ import { LL_IP, LL_PASS, LL_PORT, TOKEN } from './config.ts' | ||||||
| import { | import { | ||||||
|   Manager, |   Manager, | ||||||
|   Player |   Player | ||||||
| } from 'https://raw.githubusercontent.com/DjDeveloperr/lavaclient-deno/master/mod.ts' | } from 'https://raw.githubusercontent.com/Lavaclient/lavadeno/master/mod.ts' | ||||||
| 
 | 
 | ||||||
| export const nodes = [ | export const nodes = [ | ||||||
|   { |   { | ||||||
|  |  | ||||||
|  | @ -1,51 +0,0 @@ | ||||||
| import { TOKEN } from './config.ts' |  | ||||||
| 
 |  | ||||||
| export const CMD = { |  | ||||||
|   name: 'blep', |  | ||||||
|   description: 'Send a random adorable animal photo', |  | ||||||
|   options: [ |  | ||||||
|     { |  | ||||||
|       name: 'animal', |  | ||||||
|       description: 'The type of animal', |  | ||||||
|       type: 3, |  | ||||||
|       required: true, |  | ||||||
|       choices: [ |  | ||||||
|         { |  | ||||||
|           name: 'Dog', |  | ||||||
|           value: 'animal_dog' |  | ||||||
|         }, |  | ||||||
|         { |  | ||||||
|           name: 'Cat', |  | ||||||
|           value: 'animal_dog' |  | ||||||
|         }, |  | ||||||
|         { |  | ||||||
|           name: 'Penguin', |  | ||||||
|           value: 'animal_penguin' |  | ||||||
|         } |  | ||||||
|       ] |  | ||||||
|     }, |  | ||||||
|     { |  | ||||||
|       name: 'only_smol', |  | ||||||
|       description: 'Whether to show only baby animals', |  | ||||||
|       type: 5, |  | ||||||
|       required: false |  | ||||||
|     } |  | ||||||
|   ] |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // fetch('https://discord.com/api/v8/applications/783937840752099332/commands', {
 |  | ||||||
| fetch( |  | ||||||
|   'https://discord.com/api/v8/applications/783937840752099332/guilds/783319033205751809/commands', |  | ||||||
|   { |  | ||||||
|     method: 'POST', |  | ||||||
|     body: JSON.stringify(CMD), |  | ||||||
|     headers: { |  | ||||||
|       'Content-Type': 'application/json', |  | ||||||
|       Authorization: |  | ||||||
|         // eslint-disable-next-line @typescript-eslint/restrict-plus-operands
 |  | ||||||
|         'Bot ' + TOKEN |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| ) |  | ||||||
|   .then((r) => r.json()) |  | ||||||
|   .then(console.log) |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue