2022-07-14 12:58:09 -05:00

109 lines
3.6 KiB
TypeScript

import type { Localization, PermissionStrings } from "../../../../discordeno/mod.ts";
import { ApplicationCommandTypes } from "../../../../discordeno/mod.ts";
import { OptionBased } from "./ApplicationCommandOption.ts";
import { CreateApplicationCommand } from "../../../Session.ts";
export abstract class ApplicationCommandBuilder implements CreateApplicationCommand {
protected constructor(
// required
public type: ApplicationCommandTypes = ApplicationCommandTypes.ChatInput,
public name = "",
public description = "",
// non-required
public defaultMemberPermissions?: PermissionStrings[],
// etc
public nameLocalizations?: Localization,
public descriptionLocalizations?: Localization,
public dmPermission = true,
) {
this.type = type;
this.name = name;
this.description = description;
this.defaultMemberPermissions = defaultMemberPermissions;
this.nameLocalizations = nameLocalizations;
this.descriptionLocalizations = descriptionLocalizations;
this.dmPermission = dmPermission;
}
public setType(type: ApplicationCommandTypes) {
return (this.type = type), this;
}
public setName(name: string) {
return (this.name = name), this;
}
public setDescription(description: string) {
return (this.description = description), this;
}
public setDefaultMemberPermission(perm: PermissionStrings[]) {
return (this.defaultMemberPermissions = perm), this;
}
public setNameLocalizations(l: Localization) {
return (this.nameLocalizations = l), this;
}
public setDescriptionLocalizations(l: Localization) {
return (this.descriptionLocalizations = l), this;
}
public setDmPermission(perm: boolean) {
return (this.dmPermission = perm), this;
}
}
export class MessageApplicationCommandBuilder {
public constructor(
// required
public type?: ApplicationCommandTypes,
public name?: string,
) {
this.type = ApplicationCommandTypes.Message;
this.name = name;
}
public setName(name: string) {
return (this.name = name), this;
}
public toJSON(): { name: string; type: ApplicationCommandTypes.Message } {
if (!this.name) throw new TypeError("Propety 'name' is required");
return {
type: ApplicationCommandTypes.Message,
name: this.name,
};
}
}
export class ChatInputApplicationCommandBuilder extends ApplicationCommandBuilder {
public type: ApplicationCommandTypes.ChatInput = ApplicationCommandTypes.ChatInput;
public toJSON(): CreateApplicationCommand {
if (!this.type) throw new TypeError("Propety 'type' is required");
if (!this.name) throw new TypeError("Propety 'name' is required");
if (!this.description) {
throw new TypeError("Propety 'description' is required");
}
return {
type: ApplicationCommandTypes.ChatInput,
name: this.name,
description: this.description,
options: this.options?.map((o) => o.toJSON()) ?? [],
defaultMemberPermissions: this.defaultMemberPermissions,
nameLocalizations: this.nameLocalizations,
descriptionLocalizations: this.descriptionLocalizations,
dmPermission: this.dmPermission,
};
}
}
OptionBased.applyTo(ChatInputApplicationCommandBuilder);
export interface ChatInputApplicationCommandBuilder extends ApplicationCommandBuilder, OptionBased {
// pass
}