import { BaseEventEmitter, HandlerFunction } from "./event-emitter";
import { Transport, TransportOptions } from "./transport";
import { CamelCase } from "type-fest";
+import { REST } from "@discordjs/rest";
type ExtractEvent<O extends GatewayDispatchPayload, U extends O["t"]> = Extract<
O & { t: Exclude<O["t"], Exclude<O["t"], U>> },
>;
export type Events = {
- [P in GatewayDispatchPayload["t"] as `${CamelCase<P>}` | P]: [
+ [P in GatewayDispatchPayload["t"] as `${CamelCase<P>}`]: [
ExtractEvent<GatewayDispatchPayload, P>["d"]
];
};
export class EventClient extends BaseEventEmitter {
public transport: Transport;
// constructs
- constructor() {
+ constructor(private rest: REST) {
super();
- this.transport = new Transport(this);
+ this.transport = new Transport(this, rest);
}
public async start(options: TransportOptions) {
import { EventEmitter } from "events";
import { PascalCase } from "type-fest";
import { Events } from ".";
+import { APIInteractionResponse } from "discord-api-types/v10";
export type HandlerFunction<Args extends unknown[]> = (
- ...args: [...Args, ...[resolve?: (data: object) => void]]
+ ...args: [...Args, ...[resolve?: (data: APIInteractionResponse) => void]]
) => unknown | Promise<unknown>;
export type EventsFunctions = {
removeAllListeners(eventName: keyof Events | undefined): this;
removeListener(eventName: keyof Events): this;
- emit<T extends keyof Events>(name: T, ...args: Events[T]): boolean;
+ emit<T extends keyof Events>(
+ name: T,
+ respond: (data: APIInteractionResponse) => void,
+ ...args: Events[T]
+ ): boolean;
listenerCount(event: keyof Events): number;
listeners<T extends keyof Events>(event: T): HandlerFunction<Events[T]>[];
rawListeners: this["listeners"];
import { connect, ConnectionOptions, NatsConnection } from "nats";
import { EventClient, Events } from ".";
import globRegex from "glob-regex";
+import { REST } from "@discordjs/rest";
+import {
+ APIInteractionResponse,
+ GatewayDispatchEvents,
+ GatewayDispatchPayload,
+ GatewayInteractionCreateDispatch,
+ InteractionResponseType,
+ Routes,
+} from "discord-api-types/v10";
+import { CamelCase } from "type-fest";
export type TransportOptions = {
additionalEvents?: (keyof Events)[];
private queue?: string;
private events: Set<string> = new Set();
- constructor(private emitter: EventClient) {}
+ constructor(private emitter: EventClient, private rest: REST) {}
public async start(options: TransportOptions) {
this.nats = await connect(options?.nats);
const fn = async () => {
for await (let data of sub) {
let string = Buffer.from(data.data).toString("utf-8");
- let d = JSON.parse(string);
- let respond: Function | null = null;
-
- if (data.reply) {
- console.log("expecting reply.");
- respond = (d: object) => {
- data.respond(Buffer.from(JSON.stringify(d), "utf-8"));
- };
- }
+ let d: GatewayDispatchPayload = JSON.parse(string);
+ let respond: (repond: APIInteractionResponse) => void | null = null;
const camelCased = d.t.toLowerCase().replace(/_([a-z])/g, function (g) {
return g[1].toUpperCase();
- });
- console.log("envoi de ", camelCased);
- this.emitter.emit(camelCased, d.d, respond);
+ }) as CamelCase<`${typeof d.t}`>;
+
+ if (camelCased === "integrationCreate") {
+ let interaction = d.d as GatewayInteractionCreateDispatch["d"];
+ respond = (respond: APIInteractionResponse) => {
+ if (data.reply) {
+ data.respond(Buffer.from(JSON.stringify(respond), "utf-8"));
+ } else {
+ this.rest.post(
+ Routes.webhook(interaction.channel_id, interaction.token),
+ { body: respond }
+ );
+ }
+ };
+ console.log("expecting reply.");
+ }
+
+ this.emitter.emit(camelCased, respond, d.d as any);
}
};
this.subscription.set(event, resolve);