fix: add hosted minimax onboarding (#495, thanks @tobiasbischoff)
This commit is contained in:
@@ -8,9 +8,8 @@ import {
|
||||
import { configureCommand } from "../commands/configure.js";
|
||||
import { doctorCommand } from "../commands/doctor.js";
|
||||
import { healthCommand } from "../commands/health.js";
|
||||
import { messageCommand } from "../commands/message.js";
|
||||
import { onboardCommand } from "../commands/onboard.js";
|
||||
import { pollCommand } from "../commands/poll.js";
|
||||
import { sendCommand } from "../commands/send.js";
|
||||
import { sessionsCommand } from "../commands/sessions.js";
|
||||
import { setupCommand } from "../commands/setup.js";
|
||||
import { statusCommand } from "../commands/status.js";
|
||||
@@ -26,7 +25,11 @@ import { autoMigrateLegacyState } from "../infra/state-migrations.js";
|
||||
import { defaultRuntime } from "../runtime.js";
|
||||
import { isRich, theme } from "../terminal/theme.js";
|
||||
import { VERSION } from "../version.js";
|
||||
import { emitCliBanner, formatCliBannerLine } from "./banner.js";
|
||||
import {
|
||||
emitCliBanner,
|
||||
formatCliBannerArt,
|
||||
formatCliBannerLine,
|
||||
} from "./banner.js";
|
||||
import { registerBrowserCli } from "./browser-cli.js";
|
||||
import { hasExplicitOptions } from "./command-options.js";
|
||||
import { registerCronCli } from "./cron-cli.js";
|
||||
@@ -70,6 +73,8 @@ export function buildProgram() {
|
||||
"Use a named profile (isolates CLAWDBOT_STATE_DIR/CLAWDBOT_CONFIG_PATH under ~/.clawdbot-<name>)",
|
||||
);
|
||||
|
||||
program.option("--no-color", "Disable ANSI colors", false);
|
||||
|
||||
program.configureHelp({
|
||||
optionTerm: (option) => theme.option(option.flags),
|
||||
subcommandTerm: (cmd) => theme.command(cmd.name()),
|
||||
@@ -97,8 +102,10 @@ export function buildProgram() {
|
||||
}
|
||||
|
||||
program.addHelpText("beforeAll", () => {
|
||||
const line = formatCliBannerLine(PROGRAM_VERSION, { richTty: isRich() });
|
||||
return `\n${line}\n`;
|
||||
const rich = isRich();
|
||||
const art = formatCliBannerArt({ richTty: rich });
|
||||
const line = formatCliBannerLine(PROGRAM_VERSION, { richTty: rich });
|
||||
return `\n${art}\n${line}\n`;
|
||||
});
|
||||
|
||||
program.hook("preAction", async (_thisCommand, actionCommand) => {
|
||||
@@ -147,7 +154,7 @@ export function buildProgram() {
|
||||
"Link personal WhatsApp Web and show QR + connection logs.",
|
||||
],
|
||||
[
|
||||
'clawdbot send --to +15555550123 --message "Hi" --json',
|
||||
'clawdbot message send --to +15555550123 --message "Hi" --json',
|
||||
"Send via your web session and print JSON result.",
|
||||
],
|
||||
["clawdbot gateway --port 18789", "Run the WebSocket Gateway locally."],
|
||||
@@ -165,7 +172,7 @@ export function buildProgram() {
|
||||
"Talk directly to the agent using the Gateway; optionally send the WhatsApp reply.",
|
||||
],
|
||||
[
|
||||
'clawdbot send --provider telegram --to @mychat --message "Hi"',
|
||||
'clawdbot message send --provider telegram --to @mychat --message "Hi"',
|
||||
"Send via your Telegram bot.",
|
||||
],
|
||||
] as const;
|
||||
@@ -339,6 +346,12 @@ export function buildProgram() {
|
||||
false,
|
||||
)
|
||||
.option("--yes", "Accept defaults without prompting", false)
|
||||
.option("--repair", "Apply recommended repairs without prompting", false)
|
||||
.option(
|
||||
"--force",
|
||||
"Apply aggressive repairs (overwrites custom service config)",
|
||||
false,
|
||||
)
|
||||
.option(
|
||||
"--non-interactive",
|
||||
"Run without prompts (safe migrations only)",
|
||||
@@ -350,6 +363,8 @@ export function buildProgram() {
|
||||
await doctorCommand(defaultRuntime, {
|
||||
workspaceSuggestions: opts.workspaceSuggestions,
|
||||
yes: Boolean(opts.yes),
|
||||
repair: Boolean(opts.repair),
|
||||
force: Boolean(opts.force),
|
||||
nonInteractive: Boolean(opts.nonInteractive),
|
||||
deep: Boolean(opts.deep),
|
||||
});
|
||||
@@ -402,107 +417,472 @@ export function buildProgram() {
|
||||
}
|
||||
});
|
||||
|
||||
program
|
||||
.command("send")
|
||||
.description(
|
||||
"Send a message (WhatsApp Web, Telegram bot, Discord, Slack, Signal, iMessage)",
|
||||
const message = program
|
||||
.command("message")
|
||||
.description("Send messages and provider actions")
|
||||
.addHelpText(
|
||||
"after",
|
||||
`
|
||||
Examples:
|
||||
clawdbot message send --to +15555550123 --message "Hi"
|
||||
clawdbot message send --to +15555550123 --message "Hi" --media photo.jpg
|
||||
clawdbot message poll --provider discord --to channel:123 --poll-question "Snack?" --poll-option Pizza --poll-option Sushi
|
||||
clawdbot message react --provider discord --to 123 --message-id 456 --emoji "✅"`,
|
||||
)
|
||||
.requiredOption(
|
||||
"-t, --to <number>",
|
||||
"Recipient: E.164 for WhatsApp/Signal, Telegram chat id/@username, Discord channel/user, or iMessage handle/chat_id",
|
||||
.action(() => {
|
||||
message.help({ error: true });
|
||||
});
|
||||
|
||||
const withMessageBase = (command: Command) =>
|
||||
command
|
||||
.option(
|
||||
"--provider <provider>",
|
||||
"Provider: whatsapp|telegram|discord|slack|signal|imessage",
|
||||
)
|
||||
.option("--account <id>", "Provider account id")
|
||||
.option("--json", "Output result as JSON", false)
|
||||
.option("--dry-run", "Print payload and skip sending", false)
|
||||
.option("--verbose", "Verbose logging", false);
|
||||
|
||||
const withMessageTarget = (command: Command) =>
|
||||
command.option(
|
||||
"-t, --to <dest>",
|
||||
"Recipient/channel: E.164 for WhatsApp/Signal, Telegram chat id/@username, Discord/Slack channel/user, or iMessage handle/chat_id",
|
||||
);
|
||||
const withRequiredMessageTarget = (command: Command) =>
|
||||
command.requiredOption(
|
||||
"-t, --to <dest>",
|
||||
"Recipient/channel: E.164 for WhatsApp/Signal, Telegram chat id/@username, Discord/Slack channel/user, or iMessage handle/chat_id",
|
||||
);
|
||||
|
||||
const runMessageAction = async (
|
||||
action: string,
|
||||
opts: Record<string, unknown>,
|
||||
) => {
|
||||
setVerbose(Boolean(opts.verbose));
|
||||
const deps = createDefaultDeps();
|
||||
try {
|
||||
await messageCommand(
|
||||
{
|
||||
...opts,
|
||||
action,
|
||||
account: opts.account as string | undefined,
|
||||
},
|
||||
deps,
|
||||
defaultRuntime,
|
||||
);
|
||||
} catch (err) {
|
||||
defaultRuntime.error(String(err));
|
||||
defaultRuntime.exit(1);
|
||||
}
|
||||
};
|
||||
|
||||
withMessageBase(
|
||||
withRequiredMessageTarget(
|
||||
message
|
||||
.command("send")
|
||||
.description("Send a message")
|
||||
.requiredOption("-m, --message <text>", "Message body"),
|
||||
)
|
||||
.requiredOption("-m, --message <text>", "Message body")
|
||||
.option(
|
||||
"--media <path-or-url>",
|
||||
"Attach media (image/audio/video/document). Accepts local paths or URLs.",
|
||||
)
|
||||
.option("--reply-to <id>", "Reply-to message id")
|
||||
.option("--thread-id <id>", "Thread id (Telegram forum thread)")
|
||||
.option(
|
||||
"--gif-playback",
|
||||
"Treat video media as GIF playback (WhatsApp only).",
|
||||
false,
|
||||
),
|
||||
).action(async (opts) => {
|
||||
await runMessageAction("send", opts);
|
||||
});
|
||||
|
||||
withMessageBase(
|
||||
withRequiredMessageTarget(
|
||||
message.command("poll").description("Send a poll"),
|
||||
),
|
||||
)
|
||||
.requiredOption("--poll-question <text>", "Poll question")
|
||||
.option(
|
||||
"--poll-option <choice>",
|
||||
"Poll option (repeat 2-12 times)",
|
||||
collectOption,
|
||||
[] as string[],
|
||||
)
|
||||
.option("--poll-multi", "Allow multiple selections", false)
|
||||
.option("--poll-duration-hours <n>", "Poll duration (Discord)")
|
||||
.option("-m, --message <text>", "Optional message body")
|
||||
.action(async (opts) => {
|
||||
await runMessageAction("poll", opts);
|
||||
});
|
||||
|
||||
withMessageBase(
|
||||
withMessageTarget(
|
||||
message.command("react").description("Add or remove a reaction"),
|
||||
),
|
||||
)
|
||||
.requiredOption("--message-id <id>", "Message id")
|
||||
.option("--emoji <emoji>", "Emoji for reactions")
|
||||
.option("--remove", "Remove reaction", false)
|
||||
.option("--participant <id>", "WhatsApp reaction participant")
|
||||
.option("--from-me", "WhatsApp reaction fromMe", false)
|
||||
.option("--channel-id <id>", "Channel id (defaults to --to)")
|
||||
.action(async (opts) => {
|
||||
await runMessageAction("react", opts);
|
||||
});
|
||||
|
||||
withMessageBase(
|
||||
withMessageTarget(
|
||||
message.command("reactions").description("List reactions on a message"),
|
||||
),
|
||||
)
|
||||
.requiredOption("--message-id <id>", "Message id")
|
||||
.option("--limit <n>", "Result limit")
|
||||
.option("--channel-id <id>", "Channel id (defaults to --to)")
|
||||
.action(async (opts) => {
|
||||
await runMessageAction("reactions", opts);
|
||||
});
|
||||
|
||||
withMessageBase(
|
||||
withMessageTarget(
|
||||
message.command("read").description("Read recent messages"),
|
||||
),
|
||||
)
|
||||
.option("--limit <n>", "Result limit")
|
||||
.option("--before <id>", "Read/search before id")
|
||||
.option("--after <id>", "Read/search after id")
|
||||
.option("--around <id>", "Read around id (Discord)")
|
||||
.option("--channel-id <id>", "Channel id (defaults to --to)")
|
||||
.action(async (opts) => {
|
||||
await runMessageAction("read", opts);
|
||||
});
|
||||
|
||||
withMessageBase(
|
||||
withMessageTarget(
|
||||
message
|
||||
.command("edit")
|
||||
.description("Edit a message")
|
||||
.requiredOption("-m, --message <text>", "Message body"),
|
||||
),
|
||||
)
|
||||
.requiredOption("--message-id <id>", "Message id")
|
||||
.option("--channel-id <id>", "Channel id (defaults to --to)")
|
||||
.action(async (opts) => {
|
||||
await runMessageAction("edit", opts);
|
||||
});
|
||||
|
||||
withMessageBase(
|
||||
withMessageTarget(
|
||||
message.command("delete").description("Delete a message"),
|
||||
),
|
||||
)
|
||||
.requiredOption("--message-id <id>", "Message id")
|
||||
.option("--channel-id <id>", "Channel id (defaults to --to)")
|
||||
.action(async (opts) => {
|
||||
await runMessageAction("delete", opts);
|
||||
});
|
||||
|
||||
withMessageBase(
|
||||
withMessageTarget(message.command("pin").description("Pin a message")),
|
||||
)
|
||||
.requiredOption("--message-id <id>", "Message id")
|
||||
.option("--channel-id <id>", "Channel id (defaults to --to)")
|
||||
.action(async (opts) => {
|
||||
await runMessageAction("pin", opts);
|
||||
});
|
||||
|
||||
withMessageBase(
|
||||
withMessageTarget(message.command("unpin").description("Unpin a message")),
|
||||
)
|
||||
.option("--message-id <id>", "Message id")
|
||||
.option("--channel-id <id>", "Channel id (defaults to --to)")
|
||||
.action(async (opts) => {
|
||||
await runMessageAction("unpin", opts);
|
||||
});
|
||||
|
||||
withMessageBase(
|
||||
withMessageTarget(
|
||||
message.command("pins").description("List pinned messages"),
|
||||
),
|
||||
)
|
||||
.option("--channel-id <id>", "Channel id (defaults to --to)")
|
||||
.action(async (opts) => {
|
||||
await runMessageAction("list-pins", opts);
|
||||
});
|
||||
|
||||
withMessageBase(
|
||||
withMessageTarget(
|
||||
message.command("permissions").description("Fetch channel permissions"),
|
||||
),
|
||||
)
|
||||
.option("--channel-id <id>", "Channel id (defaults to --to)")
|
||||
.action(async (opts) => {
|
||||
await runMessageAction("permissions", opts);
|
||||
});
|
||||
|
||||
withMessageBase(
|
||||
message.command("search").description("Search Discord messages"),
|
||||
)
|
||||
.requiredOption("--guild-id <id>", "Guild id")
|
||||
.requiredOption("--query <text>", "Search query")
|
||||
.option("--channel-id <id>", "Channel id")
|
||||
.option(
|
||||
"--channel-ids <id>",
|
||||
"Channel id (repeat)",
|
||||
collectOption,
|
||||
[] as string[],
|
||||
)
|
||||
.option("--author-id <id>", "Author id")
|
||||
.option(
|
||||
"--author-ids <id>",
|
||||
"Author id (repeat)",
|
||||
collectOption,
|
||||
[] as string[],
|
||||
)
|
||||
.option("--limit <n>", "Result limit")
|
||||
.action(async (opts) => {
|
||||
await runMessageAction("search", opts);
|
||||
});
|
||||
|
||||
const thread = message.command("thread").description("Thread actions");
|
||||
|
||||
withMessageBase(
|
||||
withMessageTarget(
|
||||
thread
|
||||
.command("create")
|
||||
.description("Create a thread")
|
||||
.requiredOption("--thread-name <name>", "Thread name"),
|
||||
),
|
||||
)
|
||||
.option("--channel-id <id>", "Channel id (defaults to --to)")
|
||||
.option("--message-id <id>", "Message id (optional)")
|
||||
.option("--auto-archive-min <n>", "Thread auto-archive minutes")
|
||||
.action(async (opts) => {
|
||||
await runMessageAction("thread-create", opts);
|
||||
});
|
||||
|
||||
withMessageBase(
|
||||
thread
|
||||
.command("list")
|
||||
.description("List threads")
|
||||
.requiredOption("--guild-id <id>", "Guild id"),
|
||||
)
|
||||
.option("--channel-id <id>", "Channel id")
|
||||
.option("--include-archived", "Include archived threads", false)
|
||||
.option("--before <id>", "Read/search before id")
|
||||
.option("--limit <n>", "Result limit")
|
||||
.action(async (opts) => {
|
||||
await runMessageAction("thread-list", opts);
|
||||
});
|
||||
|
||||
withMessageBase(
|
||||
withRequiredMessageTarget(
|
||||
thread
|
||||
.command("reply")
|
||||
.description("Reply in a thread")
|
||||
.requiredOption("-m, --message <text>", "Message body"),
|
||||
),
|
||||
)
|
||||
.option(
|
||||
"--media <path-or-url>",
|
||||
"Attach media (image/audio/video/document). Accepts local paths or URLs.",
|
||||
)
|
||||
.option(
|
||||
"--gif-playback",
|
||||
"Treat video media as GIF playback (WhatsApp only).",
|
||||
false,
|
||||
)
|
||||
.option(
|
||||
"--provider <provider>",
|
||||
"Delivery provider: whatsapp|telegram|discord|slack|signal|imessage (default: whatsapp)",
|
||||
)
|
||||
.option("--account <id>", "WhatsApp account id (accountId)")
|
||||
.option("--dry-run", "Print payload and skip sending", false)
|
||||
.option("--json", "Output result as JSON", false)
|
||||
.option("--verbose", "Verbose logging", false)
|
||||
.addHelpText(
|
||||
"after",
|
||||
`
|
||||
Examples:
|
||||
clawdbot send --to +15555550123 --message "Hi"
|
||||
clawdbot send --to +15555550123 --message "Hi" --media photo.jpg
|
||||
clawdbot send --to +15555550123 --message "Hi" --dry-run # print payload only
|
||||
clawdbot send --to +15555550123 --message "Hi" --json # machine-readable result`,
|
||||
)
|
||||
.option("--reply-to <id>", "Reply-to message id")
|
||||
.action(async (opts) => {
|
||||
setVerbose(Boolean(opts.verbose));
|
||||
const deps = createDefaultDeps();
|
||||
try {
|
||||
await sendCommand(
|
||||
{
|
||||
...opts,
|
||||
account: opts.account as string | undefined,
|
||||
},
|
||||
deps,
|
||||
defaultRuntime,
|
||||
);
|
||||
} catch (err) {
|
||||
defaultRuntime.error(String(err));
|
||||
defaultRuntime.exit(1);
|
||||
}
|
||||
await runMessageAction("thread-reply", opts);
|
||||
});
|
||||
|
||||
program
|
||||
.command("poll")
|
||||
.description("Create a poll via WhatsApp or Discord")
|
||||
.requiredOption(
|
||||
"-t, --to <id>",
|
||||
"Recipient: WhatsApp JID/number or Discord channel/user",
|
||||
)
|
||||
.requiredOption("-q, --question <text>", "Poll question")
|
||||
.requiredOption(
|
||||
"-o, --option <choice>",
|
||||
"Poll option (use multiple times, 2-12 required)",
|
||||
(value: string, previous: string[]) => previous.concat([value]),
|
||||
const emoji = message.command("emoji").description("Emoji actions");
|
||||
withMessageBase(emoji.command("list").description("List emojis"))
|
||||
.option("--guild-id <id>", "Guild id (Discord)")
|
||||
.action(async (opts) => {
|
||||
await runMessageAction("emoji-list", opts);
|
||||
});
|
||||
|
||||
withMessageBase(
|
||||
emoji
|
||||
.command("upload")
|
||||
.description("Upload an emoji")
|
||||
.requiredOption("--guild-id <id>", "Guild id"),
|
||||
)
|
||||
.requiredOption("--emoji-name <name>", "Emoji name")
|
||||
.requiredOption("--media <path-or-url>", "Emoji media (path or URL)")
|
||||
.option(
|
||||
"--role-ids <id>",
|
||||
"Role id (repeat)",
|
||||
collectOption,
|
||||
[] as string[],
|
||||
)
|
||||
.option(
|
||||
"-s, --max-selections <n>",
|
||||
"How many options can be selected (default: 1)",
|
||||
)
|
||||
.option(
|
||||
"--duration-hours <n>",
|
||||
"Poll duration in hours (Discord only, default: 24)",
|
||||
)
|
||||
.option(
|
||||
"--provider <provider>",
|
||||
"Delivery provider: whatsapp|discord (default: whatsapp)",
|
||||
)
|
||||
.option("--dry-run", "Print payload and skip sending", false)
|
||||
.option("--json", "Output result as JSON", false)
|
||||
.option("--verbose", "Verbose logging", false)
|
||||
.addHelpText(
|
||||
"after",
|
||||
`
|
||||
Examples:
|
||||
clawdbot poll --to +15555550123 -q "Lunch today?" -o "Yes" -o "No" -o "Maybe"
|
||||
clawdbot poll --to 123456789@g.us -q "Meeting time?" -o "10am" -o "2pm" -o "4pm" -s 2
|
||||
clawdbot poll --to channel:123456789 -q "Snack?" -o "Pizza" -o "Sushi" --provider discord
|
||||
clawdbot poll --to channel:123456789 -q "Plan?" -o "A" -o "B" --provider discord --duration-hours 48`,
|
||||
)
|
||||
.action(async (opts) => {
|
||||
setVerbose(Boolean(opts.verbose));
|
||||
const deps = createDefaultDeps();
|
||||
try {
|
||||
await pollCommand(opts, deps, defaultRuntime);
|
||||
} catch (err) {
|
||||
defaultRuntime.error(String(err));
|
||||
defaultRuntime.exit(1);
|
||||
}
|
||||
await runMessageAction("emoji-upload", opts);
|
||||
});
|
||||
|
||||
const sticker = message.command("sticker").description("Sticker actions");
|
||||
withMessageBase(
|
||||
withRequiredMessageTarget(
|
||||
sticker.command("send").description("Send stickers"),
|
||||
),
|
||||
)
|
||||
.requiredOption("--sticker-id <id>", "Sticker id (repeat)", collectOption)
|
||||
.option("-m, --message <text>", "Optional message body")
|
||||
.action(async (opts) => {
|
||||
await runMessageAction("sticker", opts);
|
||||
});
|
||||
|
||||
withMessageBase(
|
||||
sticker
|
||||
.command("upload")
|
||||
.description("Upload a sticker")
|
||||
.requiredOption("--guild-id <id>", "Guild id"),
|
||||
)
|
||||
.requiredOption("--sticker-name <name>", "Sticker name")
|
||||
.requiredOption("--sticker-desc <text>", "Sticker description")
|
||||
.requiredOption("--sticker-tags <tags>", "Sticker tags")
|
||||
.requiredOption("--media <path-or-url>", "Sticker media (path or URL)")
|
||||
.action(async (opts) => {
|
||||
await runMessageAction("sticker-upload", opts);
|
||||
});
|
||||
|
||||
const role = message.command("role").description("Role actions");
|
||||
withMessageBase(
|
||||
role
|
||||
.command("info")
|
||||
.description("List roles")
|
||||
.requiredOption("--guild-id <id>", "Guild id"),
|
||||
).action(async (opts) => {
|
||||
await runMessageAction("role-info", opts);
|
||||
});
|
||||
|
||||
withMessageBase(
|
||||
role
|
||||
.command("add")
|
||||
.description("Add role to a member")
|
||||
.requiredOption("--guild-id <id>", "Guild id")
|
||||
.requiredOption("--user-id <id>", "User id")
|
||||
.requiredOption("--role-id <id>", "Role id"),
|
||||
).action(async (opts) => {
|
||||
await runMessageAction("role-add", opts);
|
||||
});
|
||||
|
||||
withMessageBase(
|
||||
role
|
||||
.command("remove")
|
||||
.description("Remove role from a member")
|
||||
.requiredOption("--guild-id <id>", "Guild id")
|
||||
.requiredOption("--user-id <id>", "User id")
|
||||
.requiredOption("--role-id <id>", "Role id"),
|
||||
).action(async (opts) => {
|
||||
await runMessageAction("role-remove", opts);
|
||||
});
|
||||
|
||||
const channel = message.command("channel").description("Channel actions");
|
||||
withMessageBase(
|
||||
channel
|
||||
.command("info")
|
||||
.description("Fetch channel info")
|
||||
.requiredOption("--channel-id <id>", "Channel id"),
|
||||
).action(async (opts) => {
|
||||
await runMessageAction("channel-info", opts);
|
||||
});
|
||||
|
||||
withMessageBase(
|
||||
channel
|
||||
.command("list")
|
||||
.description("List channels")
|
||||
.requiredOption("--guild-id <id>", "Guild id"),
|
||||
).action(async (opts) => {
|
||||
await runMessageAction("channel-list", opts);
|
||||
});
|
||||
|
||||
const member = message.command("member").description("Member actions");
|
||||
withMessageBase(
|
||||
member
|
||||
.command("info")
|
||||
.description("Fetch member info")
|
||||
.requiredOption("--user-id <id>", "User id"),
|
||||
)
|
||||
.option("--guild-id <id>", "Guild id (Discord)")
|
||||
.action(async (opts) => {
|
||||
await runMessageAction("member-info", opts);
|
||||
});
|
||||
|
||||
const voice = message.command("voice").description("Voice actions");
|
||||
withMessageBase(
|
||||
voice
|
||||
.command("status")
|
||||
.description("Fetch voice status")
|
||||
.requiredOption("--guild-id <id>", "Guild id")
|
||||
.requiredOption("--user-id <id>", "User id"),
|
||||
).action(async (opts) => {
|
||||
await runMessageAction("voice-status", opts);
|
||||
});
|
||||
|
||||
const event = message.command("event").description("Event actions");
|
||||
withMessageBase(
|
||||
event
|
||||
.command("list")
|
||||
.description("List scheduled events")
|
||||
.requiredOption("--guild-id <id>", "Guild id"),
|
||||
).action(async (opts) => {
|
||||
await runMessageAction("event-list", opts);
|
||||
});
|
||||
|
||||
withMessageBase(
|
||||
event
|
||||
.command("create")
|
||||
.description("Create a scheduled event")
|
||||
.requiredOption("--guild-id <id>", "Guild id")
|
||||
.requiredOption("--event-name <name>", "Event name")
|
||||
.requiredOption("--start-time <iso>", "Event start time"),
|
||||
)
|
||||
.option("--end-time <iso>", "Event end time")
|
||||
.option("--desc <text>", "Event description")
|
||||
.option("--channel-id <id>", "Channel id")
|
||||
.option("--location <text>", "Event location")
|
||||
.option("--event-type <stage|external|voice>", "Event type")
|
||||
.action(async (opts) => {
|
||||
await runMessageAction("event-create", opts);
|
||||
});
|
||||
|
||||
withMessageBase(
|
||||
message
|
||||
.command("timeout")
|
||||
.description("Timeout a member")
|
||||
.requiredOption("--guild-id <id>", "Guild id")
|
||||
.requiredOption("--user-id <id>", "User id"),
|
||||
)
|
||||
.option("--duration-min <n>", "Timeout duration minutes")
|
||||
.option("--until <iso>", "Timeout until")
|
||||
.option("--reason <text>", "Moderation reason")
|
||||
.action(async (opts) => {
|
||||
await runMessageAction("timeout", opts);
|
||||
});
|
||||
|
||||
withMessageBase(
|
||||
message
|
||||
.command("kick")
|
||||
.description("Kick a member")
|
||||
.requiredOption("--guild-id <id>", "Guild id")
|
||||
.requiredOption("--user-id <id>", "User id"),
|
||||
)
|
||||
.option("--reason <text>", "Moderation reason")
|
||||
.action(async (opts) => {
|
||||
await runMessageAction("kick", opts);
|
||||
});
|
||||
|
||||
withMessageBase(
|
||||
message
|
||||
.command("ban")
|
||||
.description("Ban a member")
|
||||
.requiredOption("--guild-id <id>", "Guild id")
|
||||
.requiredOption("--user-id <id>", "User id"),
|
||||
)
|
||||
.option("--reason <text>", "Moderation reason")
|
||||
.option("--delete-days <n>", "Ban delete message days")
|
||||
.action(async (opts) => {
|
||||
await runMessageAction("ban", opts);
|
||||
});
|
||||
|
||||
program
|
||||
|
||||
Reference in New Issue
Block a user