@sockethub/irc2as 4.0.0-beta.1 → 4.0.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/as-emitter.d.ts +1 -1
- package/dist/index.js +5 -8
- package/dist/index.js.map +4 -4
- package/package.json +3 -3
package/dist/as-emitter.d.ts
CHANGED
|
@@ -22,7 +22,7 @@ export class ASEmitter {
|
|
|
22
22
|
attendance(channel: any, nick: any, members: any, roles: any): void;
|
|
23
23
|
channelError(channel: any, nick: any, content: any): void;
|
|
24
24
|
nickError(nick: any, content: any): void;
|
|
25
|
-
notice(nick: any, content: any, from: any): void;
|
|
25
|
+
notice(nick: any, content: any, from: any, fromUser: any): void;
|
|
26
26
|
serviceError(nick: any, content: any): void;
|
|
27
27
|
joinError(nick: any): void;
|
|
28
28
|
topicChange(channel: any, nick: any, content: any): void;
|
package/dist/index.js
CHANGED
|
@@ -104,7 +104,7 @@ class ASEmitter {
|
|
|
104
104
|
nickError(nick, content) {
|
|
105
105
|
this.emitEvent(EVENT_ERROR, this.__generalError(nick, content));
|
|
106
106
|
}
|
|
107
|
-
notice(nick, content, from) {
|
|
107
|
+
notice(nick, content, from, fromUser) {
|
|
108
108
|
const ctcp = parseCtcp(content);
|
|
109
109
|
if (ctcp) {
|
|
110
110
|
this.ctcp("reply", from, nick, ctcp);
|
|
@@ -113,16 +113,13 @@ class ASEmitter {
|
|
|
113
113
|
this.emitEvent(EVENT_INCOMING, {
|
|
114
114
|
"@context": this.contexts,
|
|
115
115
|
type: "send",
|
|
116
|
-
actor: {
|
|
117
|
-
type: "service",
|
|
118
|
-
id: this.server
|
|
119
|
-
},
|
|
116
|
+
actor: fromUser ? { type: "person", id: `${from}@${this.server}`, name: from } : { type: "service", id: this.server },
|
|
120
117
|
object: {
|
|
121
118
|
type: "message",
|
|
122
119
|
content
|
|
123
120
|
},
|
|
124
121
|
target: {
|
|
125
|
-
type: "person",
|
|
122
|
+
type: nick.startsWith("#") ? "room" : "person",
|
|
126
123
|
id: `${nick}@${this.server}`,
|
|
127
124
|
name: nick
|
|
128
125
|
}
|
|
@@ -621,7 +618,7 @@ class IrcToActivityStreams {
|
|
|
621
618
|
ase.nickChange(getNickFromServer(server), trailingParam(content, pos1));
|
|
622
619
|
break;
|
|
623
620
|
case NOTICE:
|
|
624
|
-
ase.notice(pos1, trailingParam(content, pos2), getNickFromServer(server));
|
|
621
|
+
ase.notice(pos1, trailingParam(content, pos2), getNickFromServer(server), server.includes("!"));
|
|
625
622
|
break;
|
|
626
623
|
case PART:
|
|
627
624
|
ase.userPart(channel, getNickFromServer(server));
|
|
@@ -692,4 +689,4 @@ export {
|
|
|
692
689
|
LIST_MAX_ITEMS
|
|
693
690
|
};
|
|
694
691
|
|
|
695
|
-
//# debugId=
|
|
692
|
+
//# debugId=4A9B03FD86D7D4C864756E2164756E21
|
package/dist/index.js.map
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.js", "../src/as-emitter.js"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import events from \"node:events\";\nimport { ASEmitter } from \"./as-emitter.js\";\n\nconst EVENT_INCOMING = \"incoming\";\n// EVENT_ERROR = 'error',\nconst EVENT_PONG = \"pong\";\nconst EVENT_PING = \"ping\";\nconst EVENT_UNPROCESSED = \"unprocessed\";\n\nconst ERR_NO_NICK_GIVEN = \"431\";\nconst ERR_BAD_NICK = \"432\";\nconst ERR_CHAN_PRIVS = \"482\";\nconst ERR_NICK_IN_USE = \"433\";\nconst ERR_NICK_COLLISION = \"436\";\nconst ERR_TEMP_UNAVAIL = \"437\";\n// Not in RFC 1459. solanum (Libera), ircu, and Unreal send it when a nick\n// change exceeds the server's nick-flood limit.\nconst ERR_NICK_TOO_FAST = \"438\";\nconst ERR_NO_CHANNEL = \"403\";\nconst ERR_NOT_INVITED = \"471\";\nconst ERR_BADMODE = \"472\";\nconst ERR_INVITE_ONLY = \"473\";\nconst ERR_BANNED = \"474\";\nconst ERR_BADKEY = \"475\";\nconst ERR_BADMASK = \"476\";\nconst ERR_NOCHANMODES = \"477\";\nconst ERR_BANLISTFULL = \"478\";\nconst JOIN = \"JOIN\";\nconst LIST_START = \"321\";\nconst LIST = \"322\";\nconst LIST_END = \"323\";\nconst RPL_ISUPPORT = \"005\";\nconst DEFAULT_CHANTYPES = \"#&\";\n/** Cap LIST rows buffered and delivered in one channels response. */\nexport const LIST_MAX_ITEMS = 5000;\nconst MODE = \"MODE\";\nconst MOTD = \"372\";\nconst MOTD_END = \"376\";\nconst NAMES = \"353\";\nconst NAMES_END = \"366\";\nconst NICK = \"NICK\";\nconst NOTICE = \"NOTICE\";\nconst PART = \"PART\";\nconst PING = \"PING\";\nconst PONG = \"PONG\";\nconst PRIVMSG = \"PRIVMSG\";\nconst QUIT = \"QUIT\";\nconst TOPIC_CHANGE = \"TOPIC\";\nconst TOPIC_IS = \"332\";\nconst TOPIC_SET_BY = \"333\";\nconst WHO = \"352\";\nconst WHO_OLD = \"354\";\n// WHO_END = \"315\";\n\n// Status prefixes servers attach to nicks in RPL_NAMREPLY, highest first.\n// RFC 2812 defines \"@\" (op) and \"+\" (voice); UnrealIRCd and InspIRCd add \"~\"\n// (founder), \"&\" (admin), \"%\" (halfop) and \"!\"; some networks use \"*\". With\n// multi-prefix a nick carries several, highest first. Mapped onto the same\n// role names MODE and WHO use; unlisted prefixes are stripped as plain members.\nconst NICK_PREFIXES = /^[~&@%+!*]+/;\nconst PREFIX_ROLE = {\n \"~\": \"owner\",\n \"&\": \"owner\",\n \"@\": \"owner\",\n \"%\": \"admin\",\n \"+\": \"participant\",\n};\n\nconst MODES = {\n o: \"owner\",\n h: \"admin\",\n v: \"participant\",\n};\n\nfunction getNickFromServer(server) {\n return server.split(/^:/)[1].split(\"!\")[0];\n}\n\n/**\n * A trailing IRC parameter may omit its leading colon when it contains no\n * spaces (RFC 1459). Ergo and other servers do that for a one-word PRIVMSG,\n * a NICK change, or a RPL_NAMREPLY listing a single nick. `content` is only\n * set when the colon form was used, so fall back to the positional parameter\n * that holds the same value.\n */\nfunction trailingParam(content, positional) {\n return content !== undefined ? content : positional;\n}\n\nfunction isChannelName(channelName, chantypes) {\n if (typeof channelName !== \"string\" || channelName.length < 2) {\n return false;\n }\n const prefix = channelName[0];\n if (!chantypes.includes(prefix)) {\n return false;\n }\n const body = channelName.slice(1);\n if (body.length === 0 || /\\s/.test(channelName)) {\n return false;\n }\n return true;\n}\n\nfunction parseIsupportChantypes(pos2, pos3, msg) {\n const tokens = [pos2, pos3, ...msg];\n for (const token of tokens) {\n if (typeof token !== \"string\" || token.startsWith(\":\")) {\n break;\n }\n const eq = token.indexOf(\"=\");\n if (eq === -1) {\n continue;\n }\n const key = token.slice(0, eq);\n const value = token.slice(eq + 1);\n if (key === \"CHANTYPES\") {\n return value.length > 0 ? value : DEFAULT_CHANTYPES;\n }\n }\n return undefined;\n}\n\nexport class IrcToActivityStreams {\n constructor(cfg) {\n const config = cfg || {};\n this.server = config.server;\n if (!Array.isArray(config.contexts) || config.contexts.length === 0) {\n throw new Error(\n \"IrcToActivityStreams requires a non-empty contexts array\",\n );\n }\n this.contexts = [...config.contexts];\n this.events = new events.EventEmitter();\n this.chantypes = DEFAULT_CHANTYPES;\n this.__buffer = {};\n this.__buffer[NAMES] = {};\n this.__listTruncated = false;\n }\n\n input(payload) {\n if (typeof payload !== \"string\") {\n return false;\n }\n if (payload.length < 3) {\n return false;\n }\n const incoming = payload.trim();\n // Keep the entire trailing parameter. Splitting and keeping only the\n // second piece drops everything after an embedded \" :\" (a message\n // such as \"see :this\" would arrive as \"see\").\n const colonAt = incoming.indexOf(\" :\");\n const metadata = colonAt === -1 ? incoming : incoming.slice(0, colonAt);\n const content =\n colonAt === -1 ? undefined : incoming.slice(colonAt + 2);\n const [server, code, pos1, pos2, pos3, ...msg] = metadata.split(\" \");\n const channel =\n typeof pos1 === \"string\" && pos1.startsWith(\"#\")\n ? pos1\n : typeof pos2 === \"string\" && pos2.startsWith(\"#\")\n ? pos2\n : typeof pos3 === \"string\" && pos3.startsWith(\"#\")\n ? pos3\n : undefined;\n if (metadata === PING) {\n this.events.emit(EVENT_PING, `${Date.now()}`);\n return true;\n }\n this.__processIRCCodes(\n code,\n server,\n channel,\n pos1,\n pos2,\n pos3,\n content,\n msg,\n incoming,\n );\n }\n\n __processIRCCodes(\n code,\n server,\n channel,\n pos1,\n pos2,\n pos3,\n content,\n msg,\n incoming,\n ) {\n const ase = new ASEmitter(this.events, this.server, this.contexts);\n let nick;\n let type;\n let role;\n\n switch (code) {\n /** */\n case ERR_CHAN_PRIVS:\n case ERR_NOT_INVITED:\n case ERR_BADMODE:\n case ERR_INVITE_ONLY:\n case ERR_BANNED:\n case ERR_BADKEY:\n case ERR_BADMASK:\n case ERR_NOCHANMODES:\n case ERR_BANLISTFULL:\n ase.channelError(channel, pos1, content);\n break;\n\n /** */\n case ERR_NICK_IN_USE: // nick conflict\n case ERR_BAD_NICK:\n case ERR_NICK_COLLISION:\n case ERR_NICK_TOO_FAST:\n // A nick change completes only on the NICK echo or on an\n // error event. Leaving these as unprocessed drops the\n // rejection on the floor and the command waits forever.\n ase.serviceError(pos2, trailingParam(content, pos3));\n break;\n\n /** */\n case ERR_NO_NICK_GIVEN:\n // `431 <client> :reason`: no nick parameter, so the client\n // comes first and the reason follows it.\n ase.serviceError(pos1, trailingParam(content, pos2));\n break;\n\n /** */\n case ERR_NO_CHANNEL: // no such channel\n ase.joinError(pos2);\n break;\n\n /** */\n case ERR_TEMP_UNAVAIL: // nick conflict\n ase.nickError(pos2, content);\n break;\n\n /** */\n case JOIN: {\n // UnrealIRCd sends `JOIN :#channel` to clients that have not\n // negotiated extended-join, so the channel is only the trailing\n // parameter. The positional scan never sees it, and the join\n // is emitted with no room. A trailing realname (extended-join)\n // must not replace a channel that is already positional.\n const joined =\n channel ||\n (typeof content === \"string\" && /^#[^\\s,]+$/.test(content)\n ? content\n : undefined);\n ase.joinRoom(joined, getNickFromServer(server));\n break;\n }\n\n /** */\n case RPL_ISUPPORT: {\n const chantypes = parseIsupportChantypes(pos2, pos3, msg);\n if (chantypes !== undefined) {\n this.chantypes = chantypes;\n }\n break;\n }\n\n case LIST_START:\n this.__buffer[LIST] = [];\n this.__listTruncated = false;\n break;\n case LIST: {\n // :server 322 nick #channel <members> :topic\n // A one-word topic omits the leading colon (RFC 1459). Ergo\n // does this; a format string that always writes \" :\" does not.\n // Rows outside the server's CHANTYPES are skipped so the\n // aggregated response stays schema-valid.\n if (!this.__buffer[LIST]) {\n this.__buffer[LIST] = [];\n }\n if (!isChannelName(pos2, this.chantypes)) {\n break;\n }\n const id = `${pos2}@${this.server}`;\n if (this.__buffer[LIST].length >= LIST_MAX_ITEMS) {\n this.__listTruncated = true;\n break;\n }\n const summary = trailingParam(content, msg[msg.length - 1]);\n this.__buffer[LIST].push({\n type: \"room\",\n id,\n name: pos2,\n members: Number.parseInt(pos3, 10) || 0,\n summary: typeof summary === \"string\" ? summary : \"\",\n });\n break;\n }\n case LIST_END: {\n // One message for the whole list: a full LIST on a large\n // network is thousands of channels.\n const listObject = {\n type: \"channels\",\n items: this.__buffer[LIST] ?? [],\n };\n if (this.__listTruncated) {\n listObject.truncated = true;\n }\n ase.emitEvent(EVENT_INCOMING, {\n \"@context\": this.contexts,\n type: \"query\",\n actor: {\n type: \"service\",\n id: this.server,\n name: this.server,\n },\n object: listObject,\n });\n delete this.__buffer[LIST];\n this.__listTruncated = false;\n break;\n }\n\n // custom event indicating a channel mode has been updated, used to re-query user or channel\n case MODE: {\n const user_mode = pos2 || content;\n if (!channel) {\n break;\n } // don't handle cases with no channel defined\n if (!pos3) {\n break;\n } // we need target user\n role = MODES[user_mode[1]] || \"member\";\n type = \"add\";\n if (user_mode[0] === \"-\") {\n type = \"remove\";\n }\n ase.role(type, getNickFromServer(server), pos3, role, channel);\n break;\n }\n\n /** */\n case MOTD: // MOTD\n if (!this.__buffer[MOTD]) {\n this.__buffer[MOTD] = {\n \"@context\": this.contexts,\n type: \"update\",\n actor: {\n type: \"service\",\n id: this.server,\n name: this.server,\n },\n object: {\n type: \"topic\",\n content: trailingParam(content, pos2),\n },\n };\n } else {\n this.__buffer[MOTD].object.content +=\n ` ${trailingParam(content, pos2)}`;\n }\n break;\n case MOTD_END: // end of MOTD\n if (!this.__buffer[MOTD]) {\n break;\n }\n ase.emitEvent(EVENT_INCOMING, this.__buffer[MOTD]);\n delete this.__buffer[MOTD];\n break;\n\n /** */\n case NAMES: {\n // user list. A single nick has no spaces, so servers may omit\n // the trailing colon; `content` is then undefined and calling\n // `.split` on it throws, which kills the platform process.\n // Buffered per channel; one attendance message is emitted on\n // NAMES_END (see sockethub/sockethub#277).\n if (!channel) {\n break; // `channel` only recognises `#` rooms; skip others\n }\n const names = trailingParam(content, msg.join(\" \"));\n if (typeof names !== \"string\" || names.length === 0) {\n break;\n }\n const list = this.__buffer[NAMES][channel] || {\n members: [],\n roles: [],\n };\n for (const entry of names.split(\" \")) {\n const nick = entry.replace(NICK_PREFIXES, \"\");\n if (!nick) {\n continue; // empty, or prefixes with no nick\n }\n list.members.push(nick);\n for (const prefix of entry.slice(0, -nick.length)) {\n if (PREFIX_ROLE[prefix]) {\n list.roles.push([nick, PREFIX_ROLE[prefix]]);\n break; // highest prefix comes first\n }\n }\n }\n this.__buffer[NAMES][channel] = list;\n break;\n }\n\n /** */\n case NAMES_END: {\n if (!channel) {\n break;\n }\n const list = this.__buffer[NAMES][channel] || {\n members: [],\n roles: [],\n };\n // fromEntries defines own properties, so a nick named\n // `__proto__` keeps its role instead of setting the prototype.\n ase.attendance(\n channel,\n pos1,\n list.members,\n Object.fromEntries(list.roles),\n );\n delete this.__buffer[NAMES][channel];\n break;\n }\n\n /** */\n case NICK: // nick change\n // log(`- 2 nick: ${nick} from content: ${content}`);\n ase.nickChange(\n getNickFromServer(server),\n trailingParam(content, pos1),\n );\n break;\n\n /** */\n case NOTICE: // notice\n ase.notice(\n pos1,\n trailingParam(content, pos2),\n getNickFromServer(server),\n );\n break;\n\n /** */\n case PART: // leaving\n ase.userPart(channel, getNickFromServer(server));\n break;\n\n /** */\n case PONG: // ping response received\n this.events.emit(EVENT_PONG, `${Date.now()}`);\n break;\n\n /** */\n case PRIVMSG: // msg\n ase.privMsg(\n getNickFromServer(server),\n pos1,\n trailingParam(content, pos2),\n );\n break;\n\n /** */\n case QUIT: // quit user\n ase.userQuit(getNickFromServer(server));\n break;\n\n /** */\n case TOPIC_CHANGE: // topic changed now\n ase.topicChange(\n channel,\n getNickFromServer(server),\n trailingParam(content, pos2),\n );\n break;\n\n /** */\n case TOPIC_IS: // topic currently set to\n this.__buffer[TOPIC_IS] = {\n \"@context\": this.contexts,\n type: \"update\",\n actor: undefined,\n target: {\n type: \"room\",\n id: `${channel}@${this.server}`,\n name: channel,\n },\n object: {\n type: \"topic\",\n content: trailingParam(content, pos3),\n },\n };\n break;\n case TOPIC_SET_BY: {\n // current topic set by\n if (!this.__buffer[TOPIC_IS]) {\n break;\n }\n nick = pos3.split(\"!\")[0];\n this.__buffer[TOPIC_IS].actor = {\n type: \"person\",\n id: `${nick}@${this.server}`,\n name: nick,\n };\n // IRC RPL_TOPICWHOTIME (333) timestamp is Unix epoch seconds; normalize when valid\n const topicSetEpochSeconds = Number.parseInt(msg[0], 10);\n if (Number.isFinite(topicSetEpochSeconds)) {\n this.__buffer[TOPIC_IS].published = new Date(\n topicSetEpochSeconds * 1000,\n ).toISOString();\n }\n ase.emitEvent(EVENT_INCOMING, this.__buffer[TOPIC_IS]);\n delete this.__buffer[TOPIC_IS];\n break;\n }\n\n /** */\n case WHO:\n case WHO_OLD:\n nick = msg[3].length <= 2 ? msg[2] : msg[3];\n if (nick === \"undefined\") {\n break;\n }\n role = MODES[pos2[1]] || \"member\";\n ase.presence(nick, role, channel);\n break;\n\n /** */\n default:\n this.events.emit(EVENT_UNPROCESSED, incoming);\n break;\n }\n }\n}\n",
|
|
6
|
-
"const EVENT_INCOMING = \"incoming\";\nconst EVENT_ERROR = \"error\";\nconst EVENT_CTCP = \"ctcp\";\n\n// CTCP frames a command and optional argument in \\u0001 delimiters. Servers\n// with the legacy `identify-msg` capability (freenode-era) prefix the\n// payload with \"+\" or \"-\"; modern servers send the bare framing. The closing\n// delimiter is optional on input: servers truncate over-long lines, which\n// can drop it, and the CTCP spec says parsers should accept its absence.\n// biome-ignore lint/suspicious/noControlCharactersInRegex: CTCP framing uses control chars\nconst CTCP_FRAME = /^[+-]?\\u0001([^\\u0001 ]+)(?: ([\\s\\S]*?))?\\u0001?$/;\n\n/**\n * Returns `{ command, args }` when `content` is a CTCP frame, else null.\n * The command is upper-cased so callers can match it directly.\n */\nfunction parseCtcp(content) {\n const match = CTCP_FRAME.exec(content);\n if (!match) {\n return null;\n }\n return { command: match[1].toUpperCase(), args: match[2] ?? \"\" };\n}\n\nexport class ASEmitter {\n constructor(events, server, contexts) {\n if (!Array.isArray(contexts) || contexts.length === 0) {\n throw new Error(\n \"ASEmitter requires a non-empty contexts array from the caller\",\n );\n }\n this.server = server;\n this.events = events;\n this.contexts = [...contexts];\n }\n\n emitEvent(code, asObject) {\n if (typeof asObject === \"object\" && !asObject.published) {\n asObject.published = new Date().toISOString();\n }\n this.events.emit(code, asObject);\n }\n\n __generalError(nick, content) {\n return {\n \"@context\": this.contexts,\n type: \"update\",\n actor: {\n type: \"person\",\n id: `${nick}@${this.server}`,\n name: nick,\n },\n target: {\n type: \"service\",\n id: this.server,\n },\n error: content,\n };\n }\n\n presence(nick, role, channel) {\n this.emitEvent(EVENT_INCOMING, {\n \"@context\": this.contexts,\n type: \"update\",\n actor: {\n type: \"person\",\n id: `${nick}@${this.server}`,\n name: nick,\n },\n target: {\n type: \"room\",\n id: `${channel}@${this.server}`,\n name: channel,\n },\n object: {\n type: \"presence\",\n role: role,\n },\n });\n }\n\n // roles maps nick to owner/admin/participant; nicks absent from it are\n // plain members.\n attendance(channel, nick, members, roles) {\n this.emitEvent(EVENT_INCOMING, {\n \"@context\": this.contexts,\n type: \"query\",\n actor: {\n type: \"room\",\n id: `${channel}@${this.server}`,\n name: channel,\n },\n target: {\n type: \"person\",\n id: `${nick}@${this.server}`,\n name: nick,\n },\n object: {\n type: \"attendance\",\n members: members,\n roles: roles,\n },\n });\n }\n\n channelError(channel, nick, content) {\n this.emitEvent(EVENT_ERROR, {\n \"@context\": this.contexts,\n type: \"update\",\n actor: {\n type: \"person\",\n id: `${nick}@${this.server}`,\n },\n target: {\n type: \"room\",\n id: `${channel}@${this.server}`,\n },\n error: content,\n });\n }\n\n nickError(nick, content) {\n this.emitEvent(EVENT_ERROR, this.__generalError(nick, content));\n }\n\n notice(nick, content, from) {\n // A CTCP frame in a NOTICE is the reply to a request we sent. It\n // is not a chat message, so never hand it to the client as one.\n const ctcp = parseCtcp(content);\n if (ctcp) {\n this.ctcp(\"reply\", from, nick, ctcp);\n return;\n }\n this.emitEvent(EVENT_INCOMING, {\n \"@context\": this.contexts,\n type: \"send\",\n actor: {\n type: \"service\",\n id: this.server,\n },\n object: {\n type: \"message\",\n content: content,\n },\n target: {\n type: \"person\",\n id: `${nick}@${this.server}`,\n name: nick,\n },\n });\n }\n\n serviceError(nick, content) {\n this.emitEvent(EVENT_ERROR, this.__generalError(nick, content));\n }\n\n joinError(nick) {\n this.emitEvent(EVENT_ERROR, {\n \"@context\": this.contexts,\n type: \"join\",\n actor: {\n id: this.server,\n type: \"service\",\n },\n error: `no such channel ${nick}`,\n target: {\n id: `${nick}@${this.server}`,\n type: \"person\",\n },\n });\n }\n\n topicChange(channel, nick, content) {\n this.emitEvent(EVENT_INCOMING, {\n \"@context\": this.contexts,\n type: \"update\",\n actor: {\n type: \"person\",\n id: `${nick}@${this.server}`,\n name: nick,\n },\n target: {\n type: \"room\",\n id: `${channel}@${this.server}`,\n name: channel,\n },\n object: {\n type: \"topic\",\n content: content,\n },\n });\n }\n\n joinRoom(channel, nick) {\n this.emitEvent(EVENT_INCOMING, {\n \"@context\": this.contexts,\n type: \"join\",\n actor: {\n type: \"person\",\n id: `${nick}@${this.server}`,\n name: nick,\n },\n target: {\n type: \"room\",\n id: `${channel}@${this.server}`,\n name: channel,\n },\n });\n }\n\n userQuit(nick) {\n this.emitEvent(EVENT_INCOMING, {\n \"@context\": this.contexts,\n type: \"leave\",\n actor: {\n type: \"person\",\n id: `${nick}@${this.server}`,\n name: nick,\n },\n target: {\n type: \"service\",\n id: this.server,\n },\n object: {\n type: \"message\",\n content: \"user has quit\",\n },\n });\n }\n\n userPart(channel, nick) {\n this.emitEvent(EVENT_INCOMING, {\n \"@context\": this.contexts,\n type: \"leave\",\n actor: {\n type: \"person\",\n id: `${nick}@${this.server}`,\n name: nick,\n },\n target: {\n type: \"room\",\n id: `${channel}@${this.server}`,\n name: channel,\n },\n object: {\n type: \"message\",\n content: \"user has left the channel\",\n },\n });\n }\n\n privMsg(nick, target, content) {\n let type;\n let message;\n const ctcp = parseCtcp(content);\n if (ctcp?.command === \"ACTION\") {\n // CTCP ACTION (/me) is the one CTCP command that is a chat\n // message.\n type = \"me\";\n message = ctcp.args;\n } else if (ctcp) {\n // Any other CTCP frame in a PRIVMSG (VERSION, PING, TIME...) is a\n // request aimed at the client software, not at the user. Passing\n // it on as a message leaks raw control characters to the client\n // and opens a phantom conversation with the sender (#551).\n this.ctcp(\"request\", nick, target, ctcp);\n return;\n } else {\n type = \"message\";\n message = content;\n }\n this.emitEvent(EVENT_INCOMING, {\n \"@context\": this.contexts,\n type: \"send\",\n actor: {\n type: \"person\",\n id: `${nick}@${this.server}`,\n name: nick,\n },\n target: {\n type: target.startsWith(\"#\") ? \"room\" : \"person\",\n id: `${target}@${this.server}`,\n name: target,\n },\n object: {\n type: type,\n content: message,\n },\n });\n }\n\n /**\n * Emits a non-ACTION CTCP frame on the `ctcp` event. `kind` is \"request\"\n * for a PRIVMSG and \"reply\" for a NOTICE.\n */\n ctcp(kind, from, target, { command, args }) {\n this.events.emit(EVENT_CTCP, {\n kind: kind,\n command: command,\n args: args,\n from: from,\n target: target,\n });\n }\n\n role(type, nick, target, role, channel) {\n this.emitEvent(EVENT_INCOMING, {\n \"@context\": this.contexts,\n type: type,\n actor: {\n type: \"person\",\n id: `${nick}@${this.server}`,\n name: nick,\n },\n target: {\n type: \"person\",\n id: `${target}@${this.server}`,\n name: target,\n },\n object: {\n type: \"relationship\",\n relationship: \"role\",\n subject: {\n type: \"presence\",\n role: role,\n },\n object: {\n type: \"room\",\n id: `${channel}@${this.server}`,\n name: channel,\n },\n },\n });\n }\n\n nickChange(nick, content) {\n this.emitEvent(EVENT_INCOMING, {\n \"@context\": this.contexts,\n type: \"update\",\n actor: {\n type: \"person\",\n id: `${nick}@${this.server}`,\n name: nick,\n },\n target: {\n type: \"person\",\n id: `${content}@${this.server}`,\n name: content,\n },\n object: {\n type: \"address\",\n },\n });\n }\n}\n"
|
|
5
|
+
"import events from \"node:events\";\nimport { ASEmitter } from \"./as-emitter.js\";\n\nconst EVENT_INCOMING = \"incoming\";\n// EVENT_ERROR = 'error',\nconst EVENT_PONG = \"pong\";\nconst EVENT_PING = \"ping\";\nconst EVENT_UNPROCESSED = \"unprocessed\";\n\nconst ERR_NO_NICK_GIVEN = \"431\";\nconst ERR_BAD_NICK = \"432\";\nconst ERR_CHAN_PRIVS = \"482\";\nconst ERR_NICK_IN_USE = \"433\";\nconst ERR_NICK_COLLISION = \"436\";\nconst ERR_TEMP_UNAVAIL = \"437\";\n// Not in RFC 1459. solanum (Libera), ircu, and Unreal send it when a nick\n// change exceeds the server's nick-flood limit.\nconst ERR_NICK_TOO_FAST = \"438\";\nconst ERR_NO_CHANNEL = \"403\";\nconst ERR_NOT_INVITED = \"471\";\nconst ERR_BADMODE = \"472\";\nconst ERR_INVITE_ONLY = \"473\";\nconst ERR_BANNED = \"474\";\nconst ERR_BADKEY = \"475\";\nconst ERR_BADMASK = \"476\";\nconst ERR_NOCHANMODES = \"477\";\nconst ERR_BANLISTFULL = \"478\";\nconst JOIN = \"JOIN\";\nconst LIST_START = \"321\";\nconst LIST = \"322\";\nconst LIST_END = \"323\";\nconst RPL_ISUPPORT = \"005\";\nconst DEFAULT_CHANTYPES = \"#&\";\n/** Cap LIST rows buffered and delivered in one channels response. */\nexport const LIST_MAX_ITEMS = 5000;\nconst MODE = \"MODE\";\nconst MOTD = \"372\";\nconst MOTD_END = \"376\";\nconst NAMES = \"353\";\nconst NAMES_END = \"366\";\nconst NICK = \"NICK\";\nconst NOTICE = \"NOTICE\";\nconst PART = \"PART\";\nconst PING = \"PING\";\nconst PONG = \"PONG\";\nconst PRIVMSG = \"PRIVMSG\";\nconst QUIT = \"QUIT\";\nconst TOPIC_CHANGE = \"TOPIC\";\nconst TOPIC_IS = \"332\";\nconst TOPIC_SET_BY = \"333\";\nconst WHO = \"352\";\nconst WHO_OLD = \"354\";\n// WHO_END = \"315\";\n\n// Status prefixes servers attach to nicks in RPL_NAMREPLY, highest first.\n// RFC 2812 defines \"@\" (op) and \"+\" (voice); UnrealIRCd and InspIRCd add \"~\"\n// (founder), \"&\" (admin), \"%\" (halfop) and \"!\"; some networks use \"*\". With\n// multi-prefix a nick carries several, highest first. Mapped onto the same\n// role names MODE and WHO use; unlisted prefixes are stripped as plain members.\nconst NICK_PREFIXES = /^[~&@%+!*]+/;\nconst PREFIX_ROLE = {\n \"~\": \"owner\",\n \"&\": \"owner\",\n \"@\": \"owner\",\n \"%\": \"admin\",\n \"+\": \"participant\",\n};\n\nconst MODES = {\n o: \"owner\",\n h: \"admin\",\n v: \"participant\",\n};\n\nfunction getNickFromServer(server) {\n return server.split(/^:/)[1].split(\"!\")[0];\n}\n\n/**\n * A trailing IRC parameter may omit its leading colon when it contains no\n * spaces (RFC 1459). Ergo and other servers do that for a one-word PRIVMSG,\n * a NICK change, or a RPL_NAMREPLY listing a single nick. `content` is only\n * set when the colon form was used, so fall back to the positional parameter\n * that holds the same value.\n */\nfunction trailingParam(content, positional) {\n return content !== undefined ? content : positional;\n}\n\nfunction isChannelName(channelName, chantypes) {\n if (typeof channelName !== \"string\" || channelName.length < 2) {\n return false;\n }\n const prefix = channelName[0];\n if (!chantypes.includes(prefix)) {\n return false;\n }\n const body = channelName.slice(1);\n if (body.length === 0 || /\\s/.test(channelName)) {\n return false;\n }\n return true;\n}\n\nfunction parseIsupportChantypes(pos2, pos3, msg) {\n const tokens = [pos2, pos3, ...msg];\n for (const token of tokens) {\n if (typeof token !== \"string\" || token.startsWith(\":\")) {\n break;\n }\n const eq = token.indexOf(\"=\");\n if (eq === -1) {\n continue;\n }\n const key = token.slice(0, eq);\n const value = token.slice(eq + 1);\n if (key === \"CHANTYPES\") {\n return value.length > 0 ? value : DEFAULT_CHANTYPES;\n }\n }\n return undefined;\n}\n\nexport class IrcToActivityStreams {\n constructor(cfg) {\n const config = cfg || {};\n this.server = config.server;\n if (!Array.isArray(config.contexts) || config.contexts.length === 0) {\n throw new Error(\n \"IrcToActivityStreams requires a non-empty contexts array\",\n );\n }\n this.contexts = [...config.contexts];\n this.events = new events.EventEmitter();\n this.chantypes = DEFAULT_CHANTYPES;\n this.__buffer = {};\n this.__buffer[NAMES] = {};\n this.__listTruncated = false;\n }\n\n input(payload) {\n if (typeof payload !== \"string\") {\n return false;\n }\n if (payload.length < 3) {\n return false;\n }\n const incoming = payload.trim();\n // Keep the entire trailing parameter. Splitting and keeping only the\n // second piece drops everything after an embedded \" :\" (a message\n // such as \"see :this\" would arrive as \"see\").\n const colonAt = incoming.indexOf(\" :\");\n const metadata = colonAt === -1 ? incoming : incoming.slice(0, colonAt);\n const content =\n colonAt === -1 ? undefined : incoming.slice(colonAt + 2);\n const [server, code, pos1, pos2, pos3, ...msg] = metadata.split(\" \");\n const channel =\n typeof pos1 === \"string\" && pos1.startsWith(\"#\")\n ? pos1\n : typeof pos2 === \"string\" && pos2.startsWith(\"#\")\n ? pos2\n : typeof pos3 === \"string\" && pos3.startsWith(\"#\")\n ? pos3\n : undefined;\n if (metadata === PING) {\n this.events.emit(EVENT_PING, `${Date.now()}`);\n return true;\n }\n this.__processIRCCodes(\n code,\n server,\n channel,\n pos1,\n pos2,\n pos3,\n content,\n msg,\n incoming,\n );\n }\n\n __processIRCCodes(\n code,\n server,\n channel,\n pos1,\n pos2,\n pos3,\n content,\n msg,\n incoming,\n ) {\n const ase = new ASEmitter(this.events, this.server, this.contexts);\n let nick;\n let type;\n let role;\n\n switch (code) {\n /** */\n case ERR_CHAN_PRIVS:\n case ERR_NOT_INVITED:\n case ERR_BADMODE:\n case ERR_INVITE_ONLY:\n case ERR_BANNED:\n case ERR_BADKEY:\n case ERR_BADMASK:\n case ERR_NOCHANMODES:\n case ERR_BANLISTFULL:\n ase.channelError(channel, pos1, content);\n break;\n\n /** */\n case ERR_NICK_IN_USE: // nick conflict\n case ERR_BAD_NICK:\n case ERR_NICK_COLLISION:\n case ERR_NICK_TOO_FAST:\n // A nick change completes only on the NICK echo or on an\n // error event. Leaving these as unprocessed drops the\n // rejection on the floor and the command waits forever.\n ase.serviceError(pos2, trailingParam(content, pos3));\n break;\n\n /** */\n case ERR_NO_NICK_GIVEN:\n // `431 <client> :reason`: no nick parameter, so the client\n // comes first and the reason follows it.\n ase.serviceError(pos1, trailingParam(content, pos2));\n break;\n\n /** */\n case ERR_NO_CHANNEL: // no such channel\n ase.joinError(pos2);\n break;\n\n /** */\n case ERR_TEMP_UNAVAIL: // nick conflict\n ase.nickError(pos2, content);\n break;\n\n /** */\n case JOIN: {\n // UnrealIRCd sends `JOIN :#channel` to clients that have not\n // negotiated extended-join, so the channel is only the trailing\n // parameter. The positional scan never sees it, and the join\n // is emitted with no room. A trailing realname (extended-join)\n // must not replace a channel that is already positional.\n const joined =\n channel ||\n (typeof content === \"string\" && /^#[^\\s,]+$/.test(content)\n ? content\n : undefined);\n ase.joinRoom(joined, getNickFromServer(server));\n break;\n }\n\n /** */\n case RPL_ISUPPORT: {\n const chantypes = parseIsupportChantypes(pos2, pos3, msg);\n if (chantypes !== undefined) {\n this.chantypes = chantypes;\n }\n break;\n }\n\n case LIST_START:\n this.__buffer[LIST] = [];\n this.__listTruncated = false;\n break;\n case LIST: {\n // :server 322 nick #channel <members> :topic\n // A one-word topic omits the leading colon (RFC 1459). Ergo\n // does this; a format string that always writes \" :\" does not.\n // Rows outside the server's CHANTYPES are skipped so the\n // aggregated response stays schema-valid.\n if (!this.__buffer[LIST]) {\n this.__buffer[LIST] = [];\n }\n if (!isChannelName(pos2, this.chantypes)) {\n break;\n }\n const id = `${pos2}@${this.server}`;\n if (this.__buffer[LIST].length >= LIST_MAX_ITEMS) {\n this.__listTruncated = true;\n break;\n }\n const summary = trailingParam(content, msg[msg.length - 1]);\n this.__buffer[LIST].push({\n type: \"room\",\n id,\n name: pos2,\n members: Number.parseInt(pos3, 10) || 0,\n summary: typeof summary === \"string\" ? summary : \"\",\n });\n break;\n }\n case LIST_END: {\n // One message for the whole list: a full LIST on a large\n // network is thousands of channels.\n const listObject = {\n type: \"channels\",\n items: this.__buffer[LIST] ?? [],\n };\n if (this.__listTruncated) {\n listObject.truncated = true;\n }\n ase.emitEvent(EVENT_INCOMING, {\n \"@context\": this.contexts,\n type: \"query\",\n actor: {\n type: \"service\",\n id: this.server,\n name: this.server,\n },\n object: listObject,\n });\n delete this.__buffer[LIST];\n this.__listTruncated = false;\n break;\n }\n\n // custom event indicating a channel mode has been updated, used to re-query user or channel\n case MODE: {\n const user_mode = pos2 || content;\n if (!channel) {\n break;\n } // don't handle cases with no channel defined\n if (!pos3) {\n break;\n } // we need target user\n role = MODES[user_mode[1]] || \"member\";\n type = \"add\";\n if (user_mode[0] === \"-\") {\n type = \"remove\";\n }\n ase.role(type, getNickFromServer(server), pos3, role, channel);\n break;\n }\n\n /** */\n case MOTD: // MOTD\n if (!this.__buffer[MOTD]) {\n this.__buffer[MOTD] = {\n \"@context\": this.contexts,\n type: \"update\",\n actor: {\n type: \"service\",\n id: this.server,\n name: this.server,\n },\n object: {\n type: \"topic\",\n content: trailingParam(content, pos2),\n },\n };\n } else {\n this.__buffer[MOTD].object.content +=\n ` ${trailingParam(content, pos2)}`;\n }\n break;\n case MOTD_END: // end of MOTD\n if (!this.__buffer[MOTD]) {\n break;\n }\n ase.emitEvent(EVENT_INCOMING, this.__buffer[MOTD]);\n delete this.__buffer[MOTD];\n break;\n\n /** */\n case NAMES: {\n // user list. A single nick has no spaces, so servers may omit\n // the trailing colon; `content` is then undefined and calling\n // `.split` on it throws, which kills the platform process.\n // Buffered per channel; one attendance message is emitted on\n // NAMES_END (see sockethub/sockethub#277).\n if (!channel) {\n break; // `channel` only recognises `#` rooms; skip others\n }\n const names = trailingParam(content, msg.join(\" \"));\n if (typeof names !== \"string\" || names.length === 0) {\n break;\n }\n const list = this.__buffer[NAMES][channel] || {\n members: [],\n roles: [],\n };\n for (const entry of names.split(\" \")) {\n const nick = entry.replace(NICK_PREFIXES, \"\");\n if (!nick) {\n continue; // empty, or prefixes with no nick\n }\n list.members.push(nick);\n for (const prefix of entry.slice(0, -nick.length)) {\n if (PREFIX_ROLE[prefix]) {\n list.roles.push([nick, PREFIX_ROLE[prefix]]);\n break; // highest prefix comes first\n }\n }\n }\n this.__buffer[NAMES][channel] = list;\n break;\n }\n\n /** */\n case NAMES_END: {\n if (!channel) {\n break;\n }\n const list = this.__buffer[NAMES][channel] || {\n members: [],\n roles: [],\n };\n // fromEntries defines own properties, so a nick named\n // `__proto__` keeps its role instead of setting the prototype.\n ase.attendance(\n channel,\n pos1,\n list.members,\n Object.fromEntries(list.roles),\n );\n delete this.__buffer[NAMES][channel];\n break;\n }\n\n /** */\n case NICK: // nick change\n // log(`- 2 nick: ${nick} from content: ${content}`);\n ase.nickChange(\n getNickFromServer(server),\n trailingParam(content, pos1),\n );\n break;\n\n /** */\n case NOTICE: // notice\n ase.notice(\n pos1,\n trailingParam(content, pos2),\n getNickFromServer(server),\n // nick!user@host is a user; a bare prefix is the server.\n server.includes(\"!\"),\n );\n break;\n\n /** */\n case PART: // leaving\n ase.userPart(channel, getNickFromServer(server));\n break;\n\n /** */\n case PONG: // ping response received\n this.events.emit(EVENT_PONG, `${Date.now()}`);\n break;\n\n /** */\n case PRIVMSG: // msg\n ase.privMsg(\n getNickFromServer(server),\n pos1,\n trailingParam(content, pos2),\n );\n break;\n\n /** */\n case QUIT: // quit user\n ase.userQuit(getNickFromServer(server));\n break;\n\n /** */\n case TOPIC_CHANGE: // topic changed now\n ase.topicChange(\n channel,\n getNickFromServer(server),\n trailingParam(content, pos2),\n );\n break;\n\n /** */\n case TOPIC_IS: // topic currently set to\n this.__buffer[TOPIC_IS] = {\n \"@context\": this.contexts,\n type: \"update\",\n actor: undefined,\n target: {\n type: \"room\",\n id: `${channel}@${this.server}`,\n name: channel,\n },\n object: {\n type: \"topic\",\n content: trailingParam(content, pos3),\n },\n };\n break;\n case TOPIC_SET_BY: {\n // current topic set by\n if (!this.__buffer[TOPIC_IS]) {\n break;\n }\n nick = pos3.split(\"!\")[0];\n this.__buffer[TOPIC_IS].actor = {\n type: \"person\",\n id: `${nick}@${this.server}`,\n name: nick,\n };\n // IRC RPL_TOPICWHOTIME (333) timestamp is Unix epoch seconds; normalize when valid\n const topicSetEpochSeconds = Number.parseInt(msg[0], 10);\n if (Number.isFinite(topicSetEpochSeconds)) {\n this.__buffer[TOPIC_IS].published = new Date(\n topicSetEpochSeconds * 1000,\n ).toISOString();\n }\n ase.emitEvent(EVENT_INCOMING, this.__buffer[TOPIC_IS]);\n delete this.__buffer[TOPIC_IS];\n break;\n }\n\n /** */\n case WHO:\n case WHO_OLD:\n nick = msg[3].length <= 2 ? msg[2] : msg[3];\n if (nick === \"undefined\") {\n break;\n }\n role = MODES[pos2[1]] || \"member\";\n ase.presence(nick, role, channel);\n break;\n\n /** */\n default:\n this.events.emit(EVENT_UNPROCESSED, incoming);\n break;\n }\n }\n}\n",
|
|
6
|
+
"const EVENT_INCOMING = \"incoming\";\nconst EVENT_ERROR = \"error\";\nconst EVENT_CTCP = \"ctcp\";\n\n// CTCP frames a command and optional argument in \\u0001 delimiters. Servers\n// with the legacy `identify-msg` capability (freenode-era) prefix the\n// payload with \"+\" or \"-\"; modern servers send the bare framing. The closing\n// delimiter is optional on input: servers truncate over-long lines, which\n// can drop it, and the CTCP spec says parsers should accept its absence.\n// biome-ignore lint/suspicious/noControlCharactersInRegex: CTCP framing uses control chars\nconst CTCP_FRAME = /^[+-]?\\u0001([^\\u0001 ]+)(?: ([\\s\\S]*?))?\\u0001?$/;\n\n/**\n * Returns `{ command, args }` when `content` is a CTCP frame, else null.\n * The command is upper-cased so callers can match it directly.\n */\nfunction parseCtcp(content) {\n const match = CTCP_FRAME.exec(content);\n if (!match) {\n return null;\n }\n return { command: match[1].toUpperCase(), args: match[2] ?? \"\" };\n}\n\nexport class ASEmitter {\n constructor(events, server, contexts) {\n if (!Array.isArray(contexts) || contexts.length === 0) {\n throw new Error(\n \"ASEmitter requires a non-empty contexts array from the caller\",\n );\n }\n this.server = server;\n this.events = events;\n this.contexts = [...contexts];\n }\n\n emitEvent(code, asObject) {\n if (typeof asObject === \"object\" && !asObject.published) {\n asObject.published = new Date().toISOString();\n }\n this.events.emit(code, asObject);\n }\n\n __generalError(nick, content) {\n return {\n \"@context\": this.contexts,\n type: \"update\",\n actor: {\n type: \"person\",\n id: `${nick}@${this.server}`,\n name: nick,\n },\n target: {\n type: \"service\",\n id: this.server,\n },\n error: content,\n };\n }\n\n presence(nick, role, channel) {\n this.emitEvent(EVENT_INCOMING, {\n \"@context\": this.contexts,\n type: \"update\",\n actor: {\n type: \"person\",\n id: `${nick}@${this.server}`,\n name: nick,\n },\n target: {\n type: \"room\",\n id: `${channel}@${this.server}`,\n name: channel,\n },\n object: {\n type: \"presence\",\n role: role,\n },\n });\n }\n\n // roles maps nick to owner/admin/participant; nicks absent from it are\n // plain members.\n attendance(channel, nick, members, roles) {\n this.emitEvent(EVENT_INCOMING, {\n \"@context\": this.contexts,\n type: \"query\",\n actor: {\n type: \"room\",\n id: `${channel}@${this.server}`,\n name: channel,\n },\n target: {\n type: \"person\",\n id: `${nick}@${this.server}`,\n name: nick,\n },\n object: {\n type: \"attendance\",\n members: members,\n roles: roles,\n },\n });\n }\n\n channelError(channel, nick, content) {\n this.emitEvent(EVENT_ERROR, {\n \"@context\": this.contexts,\n type: \"update\",\n actor: {\n type: \"person\",\n id: `${nick}@${this.server}`,\n },\n target: {\n type: \"room\",\n id: `${channel}@${this.server}`,\n },\n error: content,\n });\n }\n\n nickError(nick, content) {\n this.emitEvent(EVENT_ERROR, this.__generalError(nick, content));\n }\n\n notice(nick, content, from, fromUser) {\n // A CTCP frame in a NOTICE is the reply to a request we sent. It\n // is not a chat message, so never hand it to the client as one.\n const ctcp = parseCtcp(content);\n if (ctcp) {\n this.ctcp(\"reply\", from, nick, ctcp);\n return;\n }\n this.emitEvent(EVENT_INCOMING, {\n \"@context\": this.contexts,\n type: \"send\",\n actor: fromUser\n ? { type: \"person\", id: `${from}@${this.server}`, name: from }\n : { type: \"service\", id: this.server },\n object: {\n type: \"message\",\n content: content,\n },\n target: {\n type: nick.startsWith(\"#\") ? \"room\" : \"person\",\n id: `${nick}@${this.server}`,\n name: nick,\n },\n });\n }\n\n serviceError(nick, content) {\n this.emitEvent(EVENT_ERROR, this.__generalError(nick, content));\n }\n\n joinError(nick) {\n this.emitEvent(EVENT_ERROR, {\n \"@context\": this.contexts,\n type: \"join\",\n actor: {\n id: this.server,\n type: \"service\",\n },\n error: `no such channel ${nick}`,\n target: {\n id: `${nick}@${this.server}`,\n type: \"person\",\n },\n });\n }\n\n topicChange(channel, nick, content) {\n this.emitEvent(EVENT_INCOMING, {\n \"@context\": this.contexts,\n type: \"update\",\n actor: {\n type: \"person\",\n id: `${nick}@${this.server}`,\n name: nick,\n },\n target: {\n type: \"room\",\n id: `${channel}@${this.server}`,\n name: channel,\n },\n object: {\n type: \"topic\",\n content: content,\n },\n });\n }\n\n joinRoom(channel, nick) {\n this.emitEvent(EVENT_INCOMING, {\n \"@context\": this.contexts,\n type: \"join\",\n actor: {\n type: \"person\",\n id: `${nick}@${this.server}`,\n name: nick,\n },\n target: {\n type: \"room\",\n id: `${channel}@${this.server}`,\n name: channel,\n },\n });\n }\n\n userQuit(nick) {\n this.emitEvent(EVENT_INCOMING, {\n \"@context\": this.contexts,\n type: \"leave\",\n actor: {\n type: \"person\",\n id: `${nick}@${this.server}`,\n name: nick,\n },\n target: {\n type: \"service\",\n id: this.server,\n },\n object: {\n type: \"message\",\n content: \"user has quit\",\n },\n });\n }\n\n userPart(channel, nick) {\n this.emitEvent(EVENT_INCOMING, {\n \"@context\": this.contexts,\n type: \"leave\",\n actor: {\n type: \"person\",\n id: `${nick}@${this.server}`,\n name: nick,\n },\n target: {\n type: \"room\",\n id: `${channel}@${this.server}`,\n name: channel,\n },\n object: {\n type: \"message\",\n content: \"user has left the channel\",\n },\n });\n }\n\n privMsg(nick, target, content) {\n let type;\n let message;\n const ctcp = parseCtcp(content);\n if (ctcp?.command === \"ACTION\") {\n // CTCP ACTION (/me) is the one CTCP command that is a chat\n // message.\n type = \"me\";\n message = ctcp.args;\n } else if (ctcp) {\n // Any other CTCP frame in a PRIVMSG (VERSION, PING, TIME...) is a\n // request aimed at the client software, not at the user. Passing\n // it on as a message leaks raw control characters to the client\n // and opens a phantom conversation with the sender (#551).\n this.ctcp(\"request\", nick, target, ctcp);\n return;\n } else {\n type = \"message\";\n message = content;\n }\n this.emitEvent(EVENT_INCOMING, {\n \"@context\": this.contexts,\n type: \"send\",\n actor: {\n type: \"person\",\n id: `${nick}@${this.server}`,\n name: nick,\n },\n target: {\n type: target.startsWith(\"#\") ? \"room\" : \"person\",\n id: `${target}@${this.server}`,\n name: target,\n },\n object: {\n type: type,\n content: message,\n },\n });\n }\n\n /**\n * Emits a non-ACTION CTCP frame on the `ctcp` event. `kind` is \"request\"\n * for a PRIVMSG and \"reply\" for a NOTICE.\n */\n ctcp(kind, from, target, { command, args }) {\n this.events.emit(EVENT_CTCP, {\n kind: kind,\n command: command,\n args: args,\n from: from,\n target: target,\n });\n }\n\n role(type, nick, target, role, channel) {\n this.emitEvent(EVENT_INCOMING, {\n \"@context\": this.contexts,\n type: type,\n actor: {\n type: \"person\",\n id: `${nick}@${this.server}`,\n name: nick,\n },\n target: {\n type: \"person\",\n id: `${target}@${this.server}`,\n name: target,\n },\n object: {\n type: \"relationship\",\n relationship: \"role\",\n subject: {\n type: \"presence\",\n role: role,\n },\n object: {\n type: \"room\",\n id: `${channel}@${this.server}`,\n name: channel,\n },\n },\n });\n }\n\n nickChange(nick, content) {\n this.emitEvent(EVENT_INCOMING, {\n \"@context\": this.contexts,\n type: \"update\",\n actor: {\n type: \"person\",\n id: `${nick}@${this.server}`,\n name: nick,\n },\n target: {\n type: \"person\",\n id: `${content}@${this.server}`,\n name: content,\n },\n object: {\n type: \"address\",\n },\n });\n }\n}\n"
|
|
7
7
|
],
|
|
8
|
-
"mappings": "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",
|
|
9
|
-
"debugId": "
|
|
8
|
+
"mappings": "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",
|
|
9
|
+
"debugId": "4A9B03FD86D7D4C864756E2164756E21",
|
|
10
10
|
"names": []
|
|
11
11
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sockethub/irc2as",
|
|
3
|
-
"version": "4.0.0-beta.
|
|
3
|
+
"version": "4.0.0-beta.2",
|
|
4
4
|
"description": "IRC to ActivityStreams objects",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -45,8 +45,8 @@
|
|
|
45
45
|
"fast-deep-equal": "^3.1.3"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
|
-
"@sockethub/schemas": "^3.0.0-beta.
|
|
48
|
+
"@sockethub/schemas": "^3.0.0-beta.2"
|
|
49
49
|
},
|
|
50
|
-
"gitHead": "
|
|
50
|
+
"gitHead": "d241420f9743f66a15ed083a1390595b331a96ac",
|
|
51
51
|
"types": "./dist/index.d.ts"
|
|
52
52
|
}
|