mirror of
https://github.com/openclaw/openclaw.git
synced 2026-03-12 07:20:45 +00:00
90 lines
2.3 KiB
TypeScript
90 lines
2.3 KiB
TypeScript
import { resolveIrcAccount } from "./accounts.js";
|
|
import type { IrcClient } from "./client.js";
|
|
import { connectIrcClient } from "./client.js";
|
|
import { buildIrcConnectOptions } from "./connect-options.js";
|
|
import { normalizeIrcMessagingTarget } from "./normalize.js";
|
|
import { makeIrcMessageId } from "./protocol.js";
|
|
import { getIrcRuntime } from "./runtime.js";
|
|
import type { CoreConfig } from "./types.js";
|
|
|
|
type SendIrcOptions = {
|
|
cfg?: CoreConfig;
|
|
accountId?: string;
|
|
replyTo?: string;
|
|
target?: string;
|
|
client?: IrcClient;
|
|
};
|
|
|
|
export type SendIrcResult = {
|
|
messageId: string;
|
|
target: string;
|
|
};
|
|
|
|
function resolveTarget(to: string, opts?: SendIrcOptions): string {
|
|
const fromArg = normalizeIrcMessagingTarget(to);
|
|
if (fromArg) {
|
|
return fromArg;
|
|
}
|
|
const fromOpt = normalizeIrcMessagingTarget(opts?.target ?? "");
|
|
if (fromOpt) {
|
|
return fromOpt;
|
|
}
|
|
throw new Error(`Invalid IRC target: ${to}`);
|
|
}
|
|
|
|
export async function sendMessageIrc(
|
|
to: string,
|
|
text: string,
|
|
opts: SendIrcOptions = {},
|
|
): Promise<SendIrcResult> {
|
|
const runtime = getIrcRuntime();
|
|
const cfg = (opts.cfg ?? runtime.config.loadConfig()) as CoreConfig;
|
|
const account = resolveIrcAccount({
|
|
cfg,
|
|
accountId: opts.accountId,
|
|
});
|
|
|
|
if (!account.configured) {
|
|
throw new Error(
|
|
`IRC is not configured for account "${account.accountId}" (need host and nick in channels.irc).`,
|
|
);
|
|
}
|
|
|
|
const target = resolveTarget(to, opts);
|
|
const tableMode = runtime.channel.text.resolveMarkdownTableMode({
|
|
cfg,
|
|
channel: "irc",
|
|
accountId: account.accountId,
|
|
});
|
|
const prepared = runtime.channel.text.convertMarkdownTables(text.trim(), tableMode);
|
|
const payload = opts.replyTo ? `${prepared}\n\n[reply:${opts.replyTo}]` : prepared;
|
|
|
|
if (!payload.trim()) {
|
|
throw new Error("Message must be non-empty for IRC sends");
|
|
}
|
|
|
|
const client = opts.client;
|
|
if (client?.isReady()) {
|
|
client.sendPrivmsg(target, payload);
|
|
} else {
|
|
const transient = await connectIrcClient(
|
|
buildIrcConnectOptions(account, {
|
|
connectTimeoutMs: 12000,
|
|
}),
|
|
);
|
|
transient.sendPrivmsg(target, payload);
|
|
transient.quit("sent");
|
|
}
|
|
|
|
runtime.channel.activity.record({
|
|
channel: "irc",
|
|
accountId: account.accountId,
|
|
direction: "outbound",
|
|
});
|
|
|
|
return {
|
|
messageId: makeIrcMessageId(),
|
|
target,
|
|
};
|
|
}
|