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