harmony/deploy.ts

113 lines
2.8 KiB
TypeScript
Raw Normal View History

2021-03-30 09:51:29 +00:00
import {
SlashCommandsManager,
SlashClient,
SlashCommandHandlerCallback
2021-04-04 05:42:15 +00:00
} from './src/interactions/mod.ts'
2021-03-30 09:51:29 +00:00
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 {
2021-03-30 10:07:13 +00:00
const d = await client.verifyFetchEvent({
respondWith: (...args: any[]) => evt.respondWith(...args),
2021-04-04 05:42:15 +00:00
request: evt.request
2021-03-30 10:07:13 +00:00
})
2021-03-30 09:51:29 +00:00
if (d === false) {
await evt.respondWith(
2021-03-30 10:05:52 +00:00
new Response('Not Authorized', {
2021-03-30 09:51:29 +00:00
status: 400
})
)
return
}
if (d.type === InteractionType.PING) {
await d.respond({ type: InteractionResponseType.PONG })
2021-03-30 10:07:13 +00:00
client.emit('ping')
2021-03-30 09:51:29 +00:00
return
}
await (client as any)._process(d)
} catch (e) {
2021-03-30 10:01:50 +00:00
console.log(e)
2021-03-30 09:51:29 +00:00
await client.emit('interactionError', e)
}
}
addEventListener('fetch', cb as any)
}
export function handle(
cmd:
| string
| {
2021-04-04 05:42:15 +00:00
name: string
parent?: string
group?: string
guild?: string
},
2021-03-30 09:51:29 +00:00
handler: SlashCommandHandlerCallback
): void {
const handle = {
2021-03-30 09:51:29 +00:00
name: typeof cmd === 'string' ? cmd : cmd.name,
handler,
...(typeof cmd === 'string' ? {} : cmd)
}
2021-04-04 05:42:15 +00:00
if (
typeof handle.name === 'string' &&
handle.name.includes(' ') &&
handle.parent === undefined &&
handle.group === undefined
) {
const parts = handle.name.split(/ +/).filter((e) => e !== '')
if (parts.length > 3 || parts.length < 1)
throw new Error('Invalid command name')
const root = parts.shift() as string
2021-03-30 12:15:38 +00:00
const group = parts.length === 2 ? parts.shift() : undefined
const sub = parts.shift()
handle.name = sub ?? root
handle.group = group
handle.parent = sub === undefined ? undefined : root
}
client.handle(handle)
2021-03-30 09:51:29 +00:00
}
export { commands, client }
export * from './src/types/slash.ts'
export * from './src/structures/slash.ts'
2021-04-04 05:42:15 +00:00
export * from './src/interactions/mod.ts'