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 { Interaction } from '../structures/slash.ts' | ||||
| import { SlashModule } from './slashModule.ts' | ||||
| import type { ShardManager } from './shard.ts' | ||||
| 
 | ||||
| /** OS related properties sent with Gateway Identify */ | ||||
| export interface ClientProperties { | ||||
|  | @ -93,6 +94,7 @@ export class Client extends EventEmitter { | |||
|   _decoratedSlash?: Array<{ | ||||
|     name: string | ||||
|     guild?: string | ||||
|     parent?: string | ||||
|     handler: (interaction: Interaction) => any | ||||
|   }> | ||||
| 
 | ||||
|  | @ -110,6 +112,11 @@ export class Client extends EventEmitter { | |||
|     ...args: Parameters<ClientEvents[K]> | ||||
|   ): 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 = {}) { | ||||
|     super() | ||||
|     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 { | ||||
|   name: string | ||||
|   guild?: string | ||||
|   parent?: string | ||||
|   handler: SlashCommandHandlerCallback | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -11,7 +11,7 @@ import { LL_IP, LL_PASS, LL_PORT, TOKEN } from './config.ts' | |||
| import { | ||||
|   Manager, | ||||
|   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 = [ | ||||
|   { | ||||
|  |  | |||
|  | @ -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