deploy built in support
This commit is contained in:
		
							parent
							
								
									62b2aa07de
								
							
						
					
					
						commit
						768fec7195
					
				
					 3 changed files with 166 additions and 69 deletions
				
			
		
							
								
								
									
										87
									
								
								deploy.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								deploy.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,87 @@ | ||||||
|  | import { | ||||||
|  |   SlashCommandsManager, | ||||||
|  |   SlashClient, | ||||||
|  |   SlashCommandHandlerCallback | ||||||
|  | } from './src/models/slashClient.ts' | ||||||
|  | import { InteractionResponseType, InteractionType } from './src/types/slash.ts' | ||||||
|  | 
 | ||||||
|  | export interface DeploySlashInitOptions { | ||||||
|  |   env?: boolean | ||||||
|  |   publicKey?: string | ||||||
|  |   token?: string | ||||||
|  |   id?: string | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | let client: SlashClient | ||||||
|  | let commands: SlashCommandsManager | ||||||
|  | 
 | ||||||
|  | export function init(options: DeploySlashInitOptions): void { | ||||||
|  |   if (client !== undefined) throw new Error('Already initialized') | ||||||
|  |   if (options.env === true) { | ||||||
|  |     options.publicKey = Deno.env.get('PUBLIC_KEY') | ||||||
|  |     options.token = Deno.env.get('TOKEN') | ||||||
|  |     options.id = Deno.env.get('ID') | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   if (options.publicKey === undefined) | ||||||
|  |     throw new Error('Public Key not provided') | ||||||
|  | 
 | ||||||
|  |   client = new SlashClient({ | ||||||
|  |     id: options.id, | ||||||
|  |     token: options.token, | ||||||
|  |     publicKey: options.publicKey | ||||||
|  |   }) | ||||||
|  | 
 | ||||||
|  |   commands = client.commands | ||||||
|  | 
 | ||||||
|  |   const cb = async (evt: { | ||||||
|  |     respondWith: CallableFunction | ||||||
|  |     request: Request | ||||||
|  |   }): Promise<void> => { | ||||||
|  |     try { | ||||||
|  |       const d = await client.verifyFetchEvent(evt) | ||||||
|  |       if (d === false) { | ||||||
|  |         await evt.respondWith( | ||||||
|  |           new Response(null, { | ||||||
|  |             status: 400 | ||||||
|  |           }) | ||||||
|  |         ) | ||||||
|  |         return | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|  |       if (d.type === InteractionType.PING) { | ||||||
|  |         await d.respond({ type: InteractionResponseType.PONG }) | ||||||
|  |         return | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|  |       await (client as any)._process(d) | ||||||
|  |     } catch (e) { | ||||||
|  |       await client.emit('interactionError', e) | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   addEventListener('fetch', cb as any) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export function handle( | ||||||
|  |   cmd: | ||||||
|  |     | string | ||||||
|  |     | { | ||||||
|  |       name: string | ||||||
|  |       parent?: string | ||||||
|  |       group?: string | ||||||
|  |       guild?: string | ||||||
|  |     }, | ||||||
|  |   handler: SlashCommandHandlerCallback | ||||||
|  | ): void { | ||||||
|  |   client.handle({ | ||||||
|  |     name: typeof cmd === 'string' ? cmd : cmd.name, | ||||||
|  |     handler, | ||||||
|  |     ...(typeof cmd === 'string' ? {} : cmd) | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export { commands, client } | ||||||
|  | export * from './src/types/slash.ts' | ||||||
|  | export * from './src/structures/slash.ts' | ||||||
|  | export * from './src/models/slashClient.ts' | ||||||
|  | @ -13,7 +13,6 @@ import { ActivityGame, ClientActivity } from '../types/presence.ts' | ||||||
| import { Extension } from './extensions.ts' | 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 { ShardManager } from './shard.ts' | import { ShardManager } from './shard.ts' | ||||||
| import { Application } from '../structures/application.ts' | import { Application } from '../structures/application.ts' | ||||||
| import { Invite } from '../structures/invite.ts' | import { Invite } from '../structures/invite.ts' | ||||||
|  | @ -208,7 +207,7 @@ export class Client extends HarmonyEventEmitter<ClientEvents> { | ||||||
|           this.token = token |           this.token = token | ||||||
|           this.debug('Info', 'Found token in ENV') |           this.debug('Info', 'Found token in ENV') | ||||||
|         } |         } | ||||||
|       } catch (e) {} |       } catch (e) { } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     const restOptions: RESTOptions = { |     const restOptions: RESTOptions = { | ||||||
|  | @ -436,59 +435,3 @@ export function event(name?: keyof ClientEvents) { | ||||||
|     client._decoratedEvents[key] = listener |     client._decoratedEvents[key] = listener | ||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 |  | ||||||
| /** Decorator to create a Slash Command handler */ |  | ||||||
| export function slash(name?: string, guild?: string) { |  | ||||||
|   return function (client: Client | SlashClient | SlashModule, prop: string) { |  | ||||||
|     if (client._decoratedSlash === undefined) client._decoratedSlash = [] |  | ||||||
|     const item = (client as { [name: string]: any })[prop] |  | ||||||
|     if (typeof item !== 'function') { |  | ||||||
|       throw new Error('@slash decorator requires a function') |  | ||||||
|     } else |  | ||||||
|       client._decoratedSlash.push({ |  | ||||||
|         name: name ?? prop, |  | ||||||
|         guild, |  | ||||||
|         handler: item |  | ||||||
|       }) |  | ||||||
|   } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /** Decorator to create a Sub-Slash Command handler */ |  | ||||||
| export function subslash(parent: string, name?: string, guild?: string) { |  | ||||||
|   return function (client: Client | SlashModule | SlashClient, prop: string) { |  | ||||||
|     if (client._decoratedSlash === undefined) client._decoratedSlash = [] |  | ||||||
|     const item = (client as { [name: string]: any })[prop] |  | ||||||
|     if (typeof item !== 'function') { |  | ||||||
|       throw new Error('@subslash decorator requires a function') |  | ||||||
|     } else |  | ||||||
|       client._decoratedSlash.push({ |  | ||||||
|         parent, |  | ||||||
|         name: name ?? prop, |  | ||||||
|         guild, |  | ||||||
|         handler: item |  | ||||||
|       }) |  | ||||||
|   } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /** Decorator to create a Grouped Slash Command handler */ |  | ||||||
| export function groupslash( |  | ||||||
|   parent: string, |  | ||||||
|   group: string, |  | ||||||
|   name?: string, |  | ||||||
|   guild?: string |  | ||||||
| ) { |  | ||||||
|   return function (client: Client | SlashModule | SlashClient, prop: string) { |  | ||||||
|     if (client._decoratedSlash === undefined) client._decoratedSlash = [] |  | ||||||
|     const item = (client as { [name: string]: any })[prop] |  | ||||||
|     if (typeof item !== 'function') { |  | ||||||
|       throw new Error('@groupslash decorator requires a function') |  | ||||||
|     } else |  | ||||||
|       client._decoratedSlash.push({ |  | ||||||
|         group, |  | ||||||
|         parent, |  | ||||||
|         name: name ?? prop, |  | ||||||
|         guild, |  | ||||||
|         handler: item |  | ||||||
|       }) |  | ||||||
|   } |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  | @ -1,4 +1,4 @@ | ||||||
| import { Guild } from '../structures/guild.ts' | import type { Guild } from '../structures/guild.ts' | ||||||
| import { | import { | ||||||
|   Interaction, |   Interaction, | ||||||
|   InteractionApplicationCommandResolved |   InteractionApplicationCommandResolved | ||||||
|  | @ -14,11 +14,12 @@ import { | ||||||
|   SlashCommandPayload |   SlashCommandPayload | ||||||
| } from '../types/slash.ts' | } from '../types/slash.ts' | ||||||
| import { Collection } from '../utils/collection.ts' | import { Collection } from '../utils/collection.ts' | ||||||
| import { Client } from './client.ts' | import type { Client } from './client.ts' | ||||||
| import { RESTManager } from './rest.ts' | import { RESTManager } from './rest.ts' | ||||||
| import { SlashModule } from './slashModule.ts' | import { SlashModule } from './slashModule.ts' | ||||||
| import { verify as edverify } from 'https://deno.land/x/ed25519@1.0.1/mod.ts' | import { verify as edverify } from 'https://deno.land/x/ed25519@1.0.1/mod.ts' | ||||||
| import { User } from '../structures/user.ts' | import { User } from '../structures/user.ts' | ||||||
|  | import { HarmonyEventEmitter } from "../utils/events.ts" | ||||||
| 
 | 
 | ||||||
| export class SlashCommand { | export class SlashCommand { | ||||||
|   slash: SlashCommandsManager |   slash: SlashCommandsManager | ||||||
|  | @ -380,8 +381,14 @@ export interface SlashOptions { | ||||||
| const encoder = new TextEncoder() | const encoder = new TextEncoder() | ||||||
| const decoder = new TextDecoder('utf-8') | const decoder = new TextDecoder('utf-8') | ||||||
| 
 | 
 | ||||||
|  | // eslint-disable-next-line @typescript-eslint/consistent-type-definitions
 | ||||||
|  | export type SlashClientEvents = { | ||||||
|  |   interaction: [Interaction] | ||||||
|  |   interactionError: [Error] | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /** Slash Client represents an Interactions Client which can be used without Harmony Client. */ | /** Slash Client represents an Interactions Client which can be used without Harmony Client. */ | ||||||
| export class SlashClient { | export class SlashClient extends HarmonyEventEmitter<SlashClientEvents> { | ||||||
|   id: string | (() => string) |   id: string | (() => string) | ||||||
|   client?: Client |   client?: Client | ||||||
|   token?: string |   token?: string | ||||||
|  | @ -401,6 +408,7 @@ export class SlashClient { | ||||||
|   }> |   }> | ||||||
| 
 | 
 | ||||||
|   constructor(options: SlashOptions) { |   constructor(options: SlashOptions) { | ||||||
|  |     super() | ||||||
|     let id = options.id |     let id = options.id | ||||||
|     if (options.token !== undefined) id = atob(options.token?.split('.')[0]) |     if (options.token !== undefined) id = atob(options.token?.split('.')[0]) | ||||||
|     if (id === undefined) |     if (id === undefined) | ||||||
|  | @ -435,8 +443,8 @@ export class SlashClient { | ||||||
|           : options.rest |           : options.rest | ||||||
|         : options.client.rest |         : options.client.rest | ||||||
| 
 | 
 | ||||||
|     this.client?.on('interactionCreate', (interaction) => |     this.client?.on('interactionCreate', async (interaction) => | ||||||
|       this._process(interaction) |       await this._process(interaction) | ||||||
|     ) |     ) | ||||||
| 
 | 
 | ||||||
|     this.commands = new SlashCommandsManager(this) |     this.commands = new SlashCommandsManager(this) | ||||||
|  | @ -506,7 +514,7 @@ export class SlashClient { | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   /** Process an incoming Interaction */ |   /** Process an incoming Interaction */ | ||||||
|   private _process(interaction: Interaction): void { |   private async _process(interaction: Interaction): Promise<void> { | ||||||
|     if (!this.enabled) return |     if (!this.enabled) return | ||||||
| 
 | 
 | ||||||
|     if ( |     if ( | ||||||
|  | @ -523,7 +531,10 @@ export class SlashClient { | ||||||
| 
 | 
 | ||||||
|     if (cmd === undefined) return |     if (cmd === undefined) return | ||||||
| 
 | 
 | ||||||
|     cmd.handler(interaction) |     await this.emit('interaction', interaction) | ||||||
|  |     try { await cmd.handler(interaction) } catch (e) { | ||||||
|  |       await this.emit('interactionError', e) | ||||||
|  |     } | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   /** Verify HTTP based Interaction */ |   /** Verify HTTP based Interaction */ | ||||||
|  | @ -672,3 +683,59 @@ export class SlashClient { | ||||||
|     return true |     return true | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | /** Decorator to create a Slash Command handler */ | ||||||
|  | export function slash(name?: string, guild?: string) { | ||||||
|  |   return function (client: Client | SlashClient | SlashModule, prop: string) { | ||||||
|  |     if (client._decoratedSlash === undefined) client._decoratedSlash = [] | ||||||
|  |     const item = (client as { [name: string]: any })[prop] | ||||||
|  |     if (typeof item !== 'function') { | ||||||
|  |       throw new Error('@slash decorator requires a function') | ||||||
|  |     } else | ||||||
|  |       client._decoratedSlash.push({ | ||||||
|  |         name: name ?? prop, | ||||||
|  |         guild, | ||||||
|  |         handler: item | ||||||
|  |       }) | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** Decorator to create a Sub-Slash Command handler */ | ||||||
|  | export function subslash(parent: string, name?: string, guild?: string) { | ||||||
|  |   return function (client: Client | SlashModule | SlashClient, prop: string) { | ||||||
|  |     if (client._decoratedSlash === undefined) client._decoratedSlash = [] | ||||||
|  |     const item = (client as { [name: string]: any })[prop] | ||||||
|  |     if (typeof item !== 'function') { | ||||||
|  |       throw new Error('@subslash decorator requires a function') | ||||||
|  |     } else | ||||||
|  |       client._decoratedSlash.push({ | ||||||
|  |         parent, | ||||||
|  |         name: name ?? prop, | ||||||
|  |         guild, | ||||||
|  |         handler: item | ||||||
|  |       }) | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** Decorator to create a Grouped Slash Command handler */ | ||||||
|  | export function groupslash( | ||||||
|  |   parent: string, | ||||||
|  |   group: string, | ||||||
|  |   name?: string, | ||||||
|  |   guild?: string | ||||||
|  | ) { | ||||||
|  |   return function (client: Client | SlashModule | SlashClient, prop: string) { | ||||||
|  |     if (client._decoratedSlash === undefined) client._decoratedSlash = [] | ||||||
|  |     const item = (client as { [name: string]: any })[prop] | ||||||
|  |     if (typeof item !== 'function') { | ||||||
|  |       throw new Error('@groupslash decorator requires a function') | ||||||
|  |     } else | ||||||
|  |       client._decoratedSlash.push({ | ||||||
|  |         group, | ||||||
|  |         parent, | ||||||
|  |         name: name ?? prop, | ||||||
|  |         guild, | ||||||
|  |         handler: item | ||||||
|  |       }) | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue