+163
| import Parser from "slate-irc-parser"; | ||
| import { EventEmitter } from "node:events"; | ||
| import { Duplex } from "node:stream"; | ||
| //#region src/types.d.ts | ||
| interface IrcMessage { | ||
| prefix: string; | ||
| command: string; | ||
| params: string; | ||
| trailing: string; | ||
| string: string; | ||
| [key: string]: unknown; | ||
| } | ||
| interface Hostmask { | ||
| nick: string; | ||
| username?: string; | ||
| hostname?: string; | ||
| string: string; | ||
| } | ||
| interface NamesUser { | ||
| name: string; | ||
| mode: string; | ||
| } | ||
| interface AwayEvent { | ||
| nick?: string | undefined; | ||
| message: string; | ||
| } | ||
| interface ErrorEvent { | ||
| cmd: string; | ||
| message: string; | ||
| } | ||
| interface InviteEvent { | ||
| from: string; | ||
| hostmask: Hostmask; | ||
| to: string; | ||
| channel: string; | ||
| } | ||
| interface JoinEvent { | ||
| nick: string; | ||
| hostmask: Hostmask; | ||
| channel: string; | ||
| } | ||
| interface KickEvent { | ||
| nick: string; | ||
| hostmask: Hostmask; | ||
| channel: string; | ||
| client: string; | ||
| message: string; | ||
| } | ||
| interface ModeEvent { | ||
| nick: string; | ||
| target?: string | undefined; | ||
| mode: string; | ||
| client?: string | undefined; | ||
| } | ||
| interface MotdEvent { | ||
| motd: string[]; | ||
| } | ||
| interface NamesEvent { | ||
| channel: string; | ||
| names: NamesUser[]; | ||
| } | ||
| interface NickEvent { | ||
| nick: string; | ||
| hostmask: Hostmask; | ||
| new: string; | ||
| } | ||
| interface NoticeEvent { | ||
| from: string; | ||
| hostmask: Hostmask; | ||
| to: string; | ||
| message: string; | ||
| } | ||
| interface PartEvent { | ||
| nick: string; | ||
| hostmask: Hostmask; | ||
| channels: string[]; | ||
| message: string; | ||
| } | ||
| interface PrivmsgEvent { | ||
| from: string; | ||
| hostmask: Hostmask; | ||
| to: string; | ||
| message: string; | ||
| } | ||
| interface QuitEvent { | ||
| nick: string; | ||
| hostmask: Hostmask; | ||
| message: string; | ||
| } | ||
| interface TopicEvent { | ||
| nick?: string | undefined; | ||
| hostmask: Hostmask; | ||
| channel: string; | ||
| topic: string; | ||
| } | ||
| interface WhoisData { | ||
| nickname?: string | undefined; | ||
| username?: string | undefined; | ||
| hostname?: string | undefined; | ||
| realname?: string | undefined; | ||
| channels: string[]; | ||
| oper: boolean; | ||
| server?: string | undefined; | ||
| away?: string | undefined; | ||
| idle?: string | undefined; | ||
| sign?: string | undefined; | ||
| } | ||
| type AnyFn = (...args: unknown[]) => void; | ||
| type NamesQueryCallback = (err: null, names: NamesUser[]) => void; | ||
| type WhoisQueryCallback = (err: string | null | undefined, data: WhoisData | null) => void; | ||
| type WriteCallback = (err?: Error | null) => void; | ||
| type IrcStream = Duplex & { | ||
| setTimeout?: (ms: number) => void; | ||
| }; | ||
| type IrcClient = EventEmitter & { | ||
| stream: IrcStream; | ||
| parser: Parser; | ||
| me?: string; | ||
| names: (channel: string, fn?: NamesQueryCallback) => void; | ||
| whois: (target: string, mask?: string | WhoisQueryCallback, fn?: WhoisQueryCallback) => void; | ||
| nameCallbacks: Record<string, ((event: NamesEvent) => void) | undefined>; | ||
| whoisCallbacks: Record<string, WhoisQueryCallback | undefined>; | ||
| writeUnsafe: (str: string, fn?: WriteCallback) => void; | ||
| write: (str: string, fn?: WriteCallback) => void; | ||
| pass: (pass: string, fn?: WriteCallback) => void; | ||
| webirc: (password: string, username: string, hostname: string, ip: string, fn?: WriteCallback) => void; | ||
| nick: (nick: string, fn?: WriteCallback) => void; | ||
| user: (username: string, realname: string, fn?: WriteCallback) => void; | ||
| invite: (name: string, channel: string, fn?: WriteCallback) => void; | ||
| send: (target: string | string[], msg: string, fn?: WriteCallback) => void; | ||
| action: (target: string, msg: string, fn?: WriteCallback) => void; | ||
| notice: (target: string, msg: string, fn?: WriteCallback) => void; | ||
| ctcp: (target: string, msg: string, fn?: WriteCallback) => void; | ||
| join: (channels: string | string[], keys?: string | string[] | WriteCallback, fn?: WriteCallback) => void; | ||
| part: (channels: string | string[], msg?: string | WriteCallback, fn?: WriteCallback) => void; | ||
| away: (msg?: string, fn?: WriteCallback) => void; | ||
| back: (fn?: WriteCallback) => void; | ||
| topic: (channel: string, topic?: string | WriteCallback, fn?: WriteCallback) => void; | ||
| kick: (channels: string | string[], nicks: string | string[], msg?: string | WriteCallback, fn?: WriteCallback) => void; | ||
| quit: (msg?: string, fn?: WriteCallback) => void; | ||
| oper: (name: string, password: string, fn?: WriteCallback) => void; | ||
| mode: (target: string, flags: string, params?: string | WriteCallback, fn?: WriteCallback) => void; | ||
| use: (fn: Plugin) => IrcClient; | ||
| onmessage: (msg: IrcMessage) => void; | ||
| }; | ||
| type Plugin = (irc: IrcClient) => void; | ||
| type PluginFactory = () => Plugin; | ||
| //#endregion | ||
| //#region src/index.d.ts | ||
| /** | ||
| * Initialize a new IRC client with the | ||
| * given duplex `stream`. | ||
| * | ||
| * @param {Stream} stream | ||
| * @param {Parser} [parser] | ||
| * @param {String} [encoding] | ||
| */ | ||
| type ClientFactory = (stream: IrcStream, parser?: Parser, encoding?: BufferEncoding) => IrcClient; | ||
| declare function Client(stream: IrcStream, parser?: Parser, encoding?: BufferEncoding): IrcClient; | ||
| //#endregion | ||
| export { type AnyFn, type AwayEvent, ClientFactory, type ErrorEvent, type Hostmask, type InviteEvent, type IrcClient, type IrcMessage, type IrcStream, type JoinEvent, type KickEvent, type ModeEvent, type MotdEvent, type NamesEvent, type NamesQueryCallback, type NamesUser, type NickEvent, type NoticeEvent, type PartEvent, type Plugin, type PluginFactory, type PrivmsgEvent, type QuitEvent, type TopicEvent, type WhoisData, type WhoisQueryCallback, type WriteCallback, Client as default }; | ||
| //# sourceMappingURL=index.d.mts.map |
| import{EventEmitter as e}from"events";import t from"debug";import n from"slate-irc-parser";var r={"001":`RPL_WELCOME`,"002":`RPL_YOURHOST`,"003":`RPL_CREATED`,"004":`RPL_MYINFO`,"005":`RPL_ISUPPORT`,"010":`RPL_BOUNCE`,"015":`RPL_MAP`,"017":`RPL_MAPEND`,"018":`RPL_MAPSTART`,"020":`RPL_HELLO`,"042":`RPL_YOURID`,"043":`RPL_SAVENICK`,200:`RPL_TRACELINK`,201:`RPL_TRACECONNECTING`,202:`RPL_TRACEHANDSHAKE`,203:`RPL_TRACEUNKNOWN`,204:`RPL_TRACEOPERATOR`,205:`RPL_TRACEUSER`,206:`RPL_TRACESERVER`,207:`RPL_TRACESERVICE`,208:`RPL_TRACENEWTYPE`,209:`RPL_TRACECLASS`,211:`RPL_STATSLINKINFO`,212:`RPL_STATSCOMMANDS`,213:`RPL_STATSCLINE`,214:`RPL_STATSNLINE`,215:`RPL_STATSILINE`,216:`RPL_STATSKLINE`,217:`RPL_STATSQLINE`,218:`RPL_STATSYLINE`,219:`RPL_ENDOFSTATS`,221:`RPL_UMODEIS`,231:`RPL_SERVICEINFO`,232:`RPL_ENDOFSERVICES`,233:`RPL_SERVICE`,234:`RPL_SERVLIST`,235:`RPL_SERVLISTEND`,239:`RPL_STATSIAUTH`,240:`RPL_STATSVLINE`,241:`RPL_STATSLLINE`,242:`RPL_STATSUPTIME`,243:`RPL_STATSOLINE`,244:`RPL_STATSHLINE`,245:`RPL_STATSSLINE`,246:`RPL_STATSPING`,247:`RPL_STATSBLINE`,248:`RPL_STATSDEFINE`,249:`RPL_STATSDEBUG`,250:`RPL_STATSDLINE`,251:`RPL_LUSERCLIENT`,252:`RPL_LUSEROP`,253:`RPL_LUSERUNKNOWN`,254:`RPL_LUSERCHANNELS`,255:`RPL_LUSERME`,256:`RPL_ADMINME`,257:`RPL_ADMINLOC1`,258:`RPL_ADMINLOC2`,259:`RPL_ADMINEMAIL`,261:`RPL_TRACELOG`,262:`RPL_TRACEEND`,263:`RPL_TRYAGAIN`,265:`RPL_LOCALUSERS`,266:`RPL_GLOBALUSERS`,300:`RPL_NONE`,301:`RPL_AWAY`,302:`RPL_USERHOST`,303:`RPL_ISON`,304:`RPL_TEXT`,305:`RPL_UNAWAY`,306:`RPL_NOWAWAY`,311:`RPL_WHOISUSER`,312:`RPL_WHOISSERVER`,313:`RPL_WHOISOPERATOR`,314:`RPL_WHOWASUSER`,315:`RPL_ENDOFWHO`,316:`RPL_WHOISCHANOP`,317:`RPL_WHOISIDLE`,318:`RPL_ENDOFWHOIS`,319:`RPL_WHOISCHANNELS`,321:`RPL_LISTSTART`,322:`RPL_LIST`,323:`RPL_LISTEND`,324:`RPL_CHANNELMODEIS`,325:`RPL_UNIQOPIS`,331:`RPL_NOTOPIC`,332:`RPL_TOPIC`,333:`RPL_TOPIC_WHO_TIME`,341:`RPL_INVITING`,342:`RPL_SUMMONING`,344:`RPL_REOPLIST`,345:`RPL_ENDOFREOPLIST`,346:`RPL_INVITELIST`,347:`RPL_ENDOFINVITELIST`,348:`RPL_EXCEPTLIST`,349:`RPL_ENDOFEXCEPTLIST`,351:`RPL_VERSION`,352:`RPL_WHOREPLY`,353:`RPL_NAMREPLY`,361:`RPL_KILLDONE`,362:`RPL_CLOSING`,363:`RPL_CLOSEEND`,364:`RPL_LINKS`,365:`RPL_ENDOFLINKS`,366:`RPL_ENDOFNAMES`,367:`RPL_BANLIST`,368:`RPL_ENDOFBANLIST`,369:`RPL_ENDOFWHOWAS`,371:`RPL_INFO`,372:`RPL_MOTD`,373:`RPL_INFOSTART`,374:`RPL_ENDOFINFO`,375:`RPL_MOTDSTART`,376:`RPL_ENDOFMOTD`,381:`RPL_YOUREOPER`,382:`RPL_REHASHING`,383:`RPL_YOURESERVICE`,384:`RPL_MYPORTIS`,385:`RPL_NOTOPERANYMORE`,391:`RPL_TIME`,392:`RPL_USERSSTART`,393:`RPL_USERS`,394:`RPL_ENDOFUSERS`,395:`RPL_NOUSERS`,401:`ERR_NOSUCHNICK`,402:`ERR_NOSUCHSERVER`,403:`ERR_NOSUCHCHANNEL`,404:`ERR_CANNOTSENDTOCHAN`,405:`ERR_TOOMANYCHANNELS`,406:`ERR_WASNOSUCHNICK`,407:`ERR_TOOMANYTARGETS`,408:`ERR_NOSUCHSERVICE`,409:`ERR_NOORIGIN`,411:`ERR_NORECIPIENT`,412:`ERR_NOTEXTTOSEND`,413:`ERR_NOTOPLEVEL`,414:`ERR_WILDTOPLEVEL`,415:`ERR_BADMASK`,416:`ERR_TOOMANYMATCHES`,421:`ERR_UNKNOWNCOMMAND`,422:`ERR_NOMOTD`,423:`ERR_NOADMININFO`,424:`ERR_FILEERROR`,431:`ERR_NONICKNAMEGIVEN`,432:`ERR_ERRONEOUSNICKNAME`,433:`ERR_NICKNAMEINUSE`,434:`ERR_SERVICENAMEINUSE`,435:`ERR_SERVICECONFUSED`,436:`ERR_NICKCOLLISION`,437:`ERR_UNAVAILRESOURCE`,441:`ERR_USERNOTINCHANNEL`,442:`ERR_NOTONCHANNEL`,443:`ERR_USERONCHANNEL`,444:`ERR_NOLOGIN`,445:`ERR_SUMMONDISABLED`,446:`ERR_USERSDISABLED`,451:`ERR_NOTREGISTERED`,461:`ERR_NEEDMOREPARAMS`,462:`ERR_ALREADYREGISTRED`,463:`ERR_NOPERMFORHOST`,464:`ERR_PASSWDMISMATCH`,465:`ERR_YOUREBANNEDCREEP`,466:`ERR_YOUWILLBEBANNED`,467:`ERR_KEYSET`,471:`ERR_CHANNELISFULL`,472:`ERR_UNKNOWNMODE`,473:`ERR_INVITEONLYCHAN`,474:`ERR_BANNEDFROMCHAN`,475:`ERR_BADCHANNELKEY`,476:`ERR_BADCHANMASK`,477:`ERR_NOCHANMODES`,478:`ERR_BANLISTFULL`,481:`ERR_NOPRIVILEGES`,482:`ERR_CHANOPRIVSNEEDED`,483:`ERR_CANTKILLSERVER`,484:`ERR_RESTRICTED`,485:`ERR_UNIQOPRIVSNEEDED`,491:`ERR_NOOPERHOST`,492:`ERR_NOSERVICEHOST`,499:`ERR_STATSKLINE`,501:`ERR_UMODEUNKNOWNFLAG`,502:`ERR_USERSDONTMATCH`,708:`RPL_ETRACEFULL`,759:`RPL_ETRACEEND`};function i(){return e=>{e.on(`data`,t=>{if(t.command!==`RPL_AWAY`&&t.command!==`RPL_NOWAWAY`&&t.command!==`RPL_UNAWAY`)return;let n=t.params.split(` `),r={message:t.trailing};t.command===`RPL_NOWAWAY`||t.command===`RPL_UNAWAY`?r.nick=n[0]:r.nick=n[1],e.emit(`away`,r)})}}function a(){return e=>{let t=e.stream;t.on(`close`,()=>{e.emit(`disconnect`)}),!(t.setTimeout===void 0||t.setTimeout===null)&&(t.setTimeout(6e4),t.on(`timeout`,()=>{let n=!0,r=Date.now();e.write(`PING :${r}`),e.once(`pong`,e=>{String(e)===String(r)&&(n=!1)}),setTimeout(()=>{n&&t.destroy()},5e3)}))}}function o(){return e=>{e.on(`data`,t=>{if(t.command.indexOf(`ERR_`)!==0)return;let n={cmd:t.command,message:t.trailing};e.emit(`errors`,n)})}}function s(e){return e.split(`,`).map(e=>e.toLowerCase())}function c(e){return e.prefix.split(`!`)[0]}function l(e){let t={nick:``,string:e.prefix},n=e.prefix.split(`!`);t.nick=n[0];try{n=n[1].split(`@`),t.username=n[0],t.hostname=n[1]}catch{}return t}function u(){return e=>{e.on(`data`,t=>{if(t.command!==`INVITE`)return;let n={from:c(t),hostmask:l(t),to:t.params.toLowerCase(),channel:t.trailing};e.emit(`invite`,n)})}}function d(){return e=>{e.on(`data`,t=>{if(t.command!==`JOIN`)return;let n={nick:c(t),hostmask:l(t),channel:(t.params||t.trailing).toLowerCase()};e.emit(`join`,n)})}}function f(){return e=>{e.on(`data`,t=>{if(t.command!==`KICK`)return;let n=t.params.split(` `),r={nick:c(t),hostmask:l(t),channel:n[0].toLowerCase(),client:n[1],message:t.trailing};e.emit(`kick`,r)})}}function p(){return e=>{e.on(`data`,t=>{if(t.command!==`MODE`)return;let n=t.params.split(` `),r={nick:c(t),target:n[0],mode:n[1]||t.trailing,client:n[2]};e.emit(`mode`,r)})}}function m(){return e=>{let t={motd:[]};e.on(`data`,n=>{switch(n.command){case`RPL_MOTDSTART`:t.motd.length=0,t.motd.push(n.trailing);break;case`RPL_ENDOFMOTD`:case`RPL_MOTD`:t.motd.push(n.trailing);break}n.command===`RPL_ENDOFMOTD`&&e.emit(`motd`,t)})}}const h=t(`slate-irc:names`);function g(){return e=>{let t={};e.names=_,e.nameCallbacks={},e.on(`data`,n=>{switch(n.command){case`RPL_NAMREPLY`:{let e=n.params.split(/ [=@*] /)[1].toLowerCase(),r=n.trailing.split(` `),i=[];r.forEach(e=>{let t=e.split(/([~&@%+])/),n=t.pop(),r=t.pop();i.push({name:n,mode:r||``})}),t[e]=(t[e]||[]).concat(i),h(`add %s %j`,e,i);break}case`RPL_ENDOFNAMES`:{let r=n.params.split(` `)[1].toLowerCase();h(`emit "names" for %s`,r);let i={channel:r,names:t[r]||[]},a=e.nameCallbacks[r];a?a(i):e.emit(`names`,i),delete t[r];break}}})}}function _(e,t){e=e.toLowerCase(),t&&(this.nameCallbacks[e]=n=>{delete this.nameCallbacks[e],t(null,n.names)}),this.write(`NAMES ${e}`)}function v(){return e=>{e.on(`data`,t=>{if(t.command!==`NICK`)return;let n={nick:c(t),hostmask:l(t),new:t.trailing};n.new||=t.params,n.nick===e.me&&(e.me=n.new),e.emit(`nick`,n)})}}function y(){return e=>{e.on(`data`,t=>{if(t.command!==`NOTICE`)return;let n={from:c(t),hostmask:l(t),to:t.params.toLowerCase(),message:t.trailing};e.emit(`notice`,n)})}}function b(){return e=>{e.on(`data`,t=>{if(t.command!==`PART`)return;let n={nick:c(t),hostmask:l(t),channels:s(t.params),message:t.trailing};e.emit(`part`,n)})}}function x(){return e=>{e.on(`data`,t=>{t.command===`PONG`&&e.emit(`pong`,t.trailing),t.command===`PING`&&e.write(`PONG :${t.trailing}`)})}}function S(){return e=>{e.on(`data`,t=>{if(t.command!==`PRIVMSG`)return;let n={from:c(t),hostmask:l(t),to:t.params.toLowerCase(),message:t.trailing};e.emit(`message`,n)})}}function C(){return e=>{e.on(`data`,t=>{if(t.command!==`QUIT`)return;let n={nick:c(t),hostmask:l(t),message:t.trailing};e.emit(`quit`,n)})}}function w(){return e=>{let t;e.on(`data`,n=>{switch(n.command){case`RPL_NOTOPIC`:case`RPL_TOPIC`:t=n.params.split(` `)[1];break;case`TOPIC`:t=n.params;break;default:return}let r={hostmask:l(n),channel:t.toLowerCase(),topic:n.trailing};n.command===`TOPIC`&&(r.nick=c(n)),e.emit(`topic`,r)})}}function T(){return e=>{e.on(`data`,t=>{t.command===`RPL_WELCOME`&&(e.me=t.params,e.emit(`welcome`,e.me))})}}function E(){return e=>{let t={},n;e.whois=D,e.whoisCallbacks={},e.on(`data`,r=>{switch(r.command){case`RPL_WHOISUSER`:{let e=r.params.split(` `),n=e[1].toLowerCase();t[n]=t[n]||{channels:[],oper:!1},t[n].nickname=e[1],t[n].username=e[2],t[n].hostname=e[3],t[n].realname=r.trailing,t[n].channels=[],t[n].oper=!1;break}case`RPL_WHOISCHANNELS`:{let e=r.params.split(` `)[1].toLowerCase(),n=r.trailing.split(` `);t[e].channels=t[e].channels.concat(n);break}case`RPL_WHOISSERVER`:{let e=r.params.split(` `),n=e[1].toLowerCase();t[n].server=e[2];break}case`RPL_AWAY`:{let e=r.params.split(` `)[1].toLowerCase();if(!t[e])return;t[e].away=r.trailing;break}case`RPL_WHOISOPERATOR`:{let e=r.params.split(` `)[1].toLowerCase();t[e].oper=!0;break}case`RPL_WHOISIDLE`:{let e=r.params.split(` `),n=e[1].toLowerCase();t[n].idle=e[2],t[n].sign=e[3];break}case`RPL_ENDOFWHOIS`:{let i=r.params.split(` `)[1].toLowerCase();if(!t[i])return;let a=e.whoisCallbacks[i];a?a(n,t[i]):e.emit(`whois`,null,t[i]),t={};break}case`ERR_NEEDMOREPARAMS`:{n=`Not enough parameters`;let t=r.params.split(` `)[1].toLowerCase();if(t!==`whois`)return;let i=e.whoisCallbacks[t];i?i(n,null):e.emit(`whois`,n,null);break}case`ERR_NOSUCHSERVER`:{n=`No such server`;let t=r.params.split(` `)[1].toLowerCase(),i=e.whoisCallbacks[t];i?i(n,null):e.emit(`whois`,n,null);break}case`ERR_NOSUCHNICK`:{n=`No such nick/channel`;let t=r.params.split(` `)[1].toLowerCase(),i=e.whoisCallbacks[t];i?i(n,null):e.emit(`whois`,n,null);break}}})}}function D(e,t,n){typeof t==`function`&&(n=t,t=``),e=e.toLowerCase(),n&&(this.whoisCallbacks[e]=(t,r)=>{delete this.whoisCallbacks[e],n(t,r)}),this.write([`WHOIS`,e,t].filter(Boolean).join(` `))}var O=class s extends e{static debug=t(`slate-irc`);stream;parser;me;names;whois;nameCallbacks;whoisCallbacks;constructor(e,t,r){super(),e.setEncoding(r||`utf8`),this.stream=e,this.parser=t||new n,this.parser.on(`message`,this.onmessage.bind(this)),e.pipe(this.parser),this.setMaxListeners(100),this.use(i()),this.use(a()),this.use(o()),this.use(u()),this.use(d()),this.use(f()),this.use(p()),this.use(m()),this.use(g()),this.use(v()),this.use(y()),this.use(b()),this.use(x()),this.use(S()),this.use(C()),this.use(w()),this.use(T()),this.use(E())}writeUnsafe(e,t){this.stream.write(`${e}\r\n`,t)}write(e,t){if(e.includes(` | ||
| `)||e.includes(`\r`)){t&&t(Error(`The parameter to write() must not contain any '\\n' or '\\r'.`));return}this.writeUnsafe(e,t)}pass(e,t){this.write(`PASS ${e}`,t)}webirc(e,t,n,r,i){let a=[e,t,n,r].join(` `);this.write(`WEBIRC ${a}`,i)}nick(e,t){this.write(`NICK ${e}`,t)}user(e,t,n){this.write(`USER ${e} 0 * :${t}`,n)}invite(e,t,n){this.write(`INVITE ${e} ${t}`,n)}send(e,t,n){this.write(`PRIVMSG ${A(e).join(`,`)} :${t}`,n)}action(e,t,n){this.send(e,`\u0001ACTION ${t}\u0001`,n)}notice(e,t,n){this.write(`NOTICE ${e} :${t}`,n)}ctcp(e,t,n){this.notice(e,`\x01${t}\x01`,n)}join(e,t,n){typeof t==`function`&&(n=t,t=``),this.write(`JOIN ${A(e).join(`,`)} ${A(t).join(`,`)}`,n)}part(e,t,n){typeof t==`function`&&(n=t,t=``);let r=`PART ${A(e).join(`,`)}`;t&&(r+=` :${t}`),this.write(r,n)}away(e,t){let n=e||`Talk to you later!`;this.write(`AWAY :${n}`,t)}back(e){this.write(`AWAY`,e)}topic(e,t,n){typeof t==`function`&&(n=t,t=``),t&&=` :${t}`,this.write(`TOPIC ${e}${t}`,n)}kick(e,t,n,r){typeof n==`function`&&(r=n,n=``);let i=`KICK ${A(e).join(`,`)} ${A(t).join(`,`)}`;n&&(i+=` :${n}`),this.write(i,r)}quit(e,t){let n=e||`Bye!`;this.write(`QUIT :${n}`,t)}oper(e,t,n){this.write(`OPER ${e} ${t}`,n)}mode(e,t,n,r){typeof n==`function`&&(r=n,n=``),n?this.write(`MODE ${e} ${t} ${n}`,r):this.write(`MODE ${e} ${t}`,r)}use(e){return e(this),this}onmessage(e){e.command=r[e.command]||e.command,s.debug(`message %s %s`,e.command,e.string),this.emit(`data`,e)}};function k(e,t,n){return new O(e,t,n)}function A(e){return Array.isArray(e)?e:[e]}export{k as default}; | ||
| //# sourceMappingURL=index.mjs.map |
| {"version":3,"file":"index.mjs","names":["nick","utils.nick","utils.hostmask","utils.nick","utils.hostmask","utils.nick","utils.hostmask","utils.nick","utils.nick","utils.hostmask","utils.nick","utils.hostmask","utils.nick","utils.hostmask","utils.channelList","utils.nick","utils.hostmask","utils.nick","utils.hostmask","utils.hostmask","utils.nick","Emitter","names","whois","replies"],"sources":["../node_modules/.pnpm/irc-replies@2.0.1/node_modules/irc-replies/replies.json","../src/plugins/away.ts","../src/plugins/disconnect.ts","../src/plugins/errors.ts","../src/utils.ts","../src/plugins/invite.ts","../src/plugins/join.ts","../src/plugins/kick.ts","../src/plugins/mode.ts","../src/plugins/motd.ts","../src/plugins/names.ts","../src/plugins/nick.ts","../src/plugins/notice.ts","../src/plugins/part.ts","../src/plugins/pong.ts","../src/plugins/privmsg.ts","../src/plugins/quit.ts","../src/plugins/topic.ts","../src/plugins/welcome.ts","../src/plugins/whois.ts","../src/index.ts"],"sourcesContent":["","import type { AwayEvent, IrcClient, IrcMessage, Plugin } from \"../types\";\n\n/**\n * AWAY plugin to emit \"away\" events.\n *\n * @return {Function}\n */\n\nexport default function away(): Plugin {\n return (irc: IrcClient): void => {\n irc.on(\"data\", (msg: IrcMessage) => {\n if (\n msg.command !== \"RPL_AWAY\" &&\n msg.command !== \"RPL_NOWAWAY\" &&\n msg.command !== \"RPL_UNAWAY\"\n ) {\n return;\n }\n const params = msg.params.split(\" \");\n const e: AwayEvent = {\n message: msg.trailing,\n };\n if (msg.command === \"RPL_NOWAWAY\" || msg.command === \"RPL_UNAWAY\") {\n e.nick = params[0];\n } else {\n e.nick = params[1];\n }\n irc.emit(\"away\", e);\n });\n };\n}\n","import type { IrcClient, Plugin } from \"../types\";\n\n/**\n * DISCONNECT plugin to emit \"disconnect\" events.\n *\n * @return {Function}\n */\n\nexport default function disconnect(): Plugin {\n return (irc: IrcClient): void => {\n const stream = irc.stream;\n const ms = 60 * 1000;\n\n stream.on(\"close\", () => {\n irc.emit(\"disconnect\");\n });\n\n // Do nothing when given stream cannot perform setTimeout() operation\n if (stream.setTimeout === undefined || stream.setTimeout === null) {\n return;\n }\n\n stream.setTimeout(ms);\n\n stream.on(\"timeout\", () => {\n let timeout = true;\n const time = Date.now();\n\n irc.write(`PING :${time}`);\n\n irc.once(\"pong\", (res: string | number) => {\n if (String(res) === String(time)) {\n timeout = false;\n }\n });\n\n setTimeout(() => {\n if (timeout) {\n stream.destroy();\n }\n }, 5000);\n });\n };\n}\n","import type { ErrorEvent, IrcClient, IrcMessage, Plugin } from \"../types\";\n\n/**\n * ERRORS plugin to emit \"errors\" events.\n *\n * List of possible errors:\n * https://github.com/williamwicks/irc-replies/blob/master/replies.json#L113-L170\n *\n * @return {Function}\n */\n\nexport default function errors(): Plugin {\n return (irc: IrcClient): void => {\n irc.on(\"data\", (msg: IrcMessage) => {\n if (msg.command.indexOf(\"ERR_\") !== 0) return;\n const e: ErrorEvent = {\n cmd: msg.command,\n message: msg.trailing,\n };\n irc.emit(\"errors\", e);\n });\n };\n}\n","import type { Hostmask, IrcMessage } from \"./types\";\n\n/**\n * Parse channel list `str`.\n *\n * @param {String} str\n * @return {Array}\n */\n\nexport function channelList(str: string): string[] {\n return str.split(\",\").map((chan: string) => chan.toLowerCase());\n}\n\n/**\n * Parse nick from `msg`.\n *\n * @param {Object} msg\n * @return {String}\n */\n\nexport function nick(msg: IrcMessage): string {\n return msg.prefix.split(\"!\")[0]!;\n}\n\n/**\n * Parse hostmask from `msg`.\n *\n * @param {Object} msg\n * @return {Object}\n */\n\nexport function hostmask(msg: IrcMessage): Hostmask {\n const mask: Hostmask = {\n nick: \"\",\n string: msg.prefix,\n };\n let parts = msg.prefix.split(\"!\");\n mask.nick = parts[0]!;\n\n try {\n parts = parts[1]!.split(\"@\");\n mask.username = parts[0]!;\n mask.hostname = parts[1]!;\n } catch {\n // ..\n }\n\n return mask;\n}\n\n/**\n * Merge the contents of two objects together into the first object.\n *\n * @param {Object} a\n * @param {Object} b\n * @return {Object}\n */\n\nexport function extend<A extends Record<string, unknown>, B extends Record<string, unknown>>(\n a: A,\n b: B,\n): A & B {\n for (const prop in b) {\n (a as Record<string, unknown>)[prop] = b[prop];\n }\n return a as A & B;\n}\n","/**\n * Module dependencies.\n */\n\nimport type { InviteEvent, IrcClient, IrcMessage, Plugin } from \"../types\";\nimport * as utils from \"../utils\";\n\n/**\n * INVITE plugin to emit \"invite\" events.\n *\n * @return {Function}\n */\n\nexport default function invite(): Plugin {\n return (irc: IrcClient): void => {\n irc.on(\"data\", (msg: IrcMessage) => {\n if (msg.command !== \"INVITE\") return;\n const e: InviteEvent = {\n from: utils.nick(msg),\n hostmask: utils.hostmask(msg),\n to: msg.params.toLowerCase(),\n channel: msg.trailing,\n };\n irc.emit(\"invite\", e);\n });\n };\n}\n","/**\n * Module dependencies.\n */\n\nimport type { IrcClient, IrcMessage, JoinEvent, Plugin } from \"../types\";\nimport * as utils from \"../utils\";\n\n/**\n * JOIN plugin to emit \"join\" events.\n *\n * @return {Function}\n */\n\nexport default function join(): Plugin {\n return (irc: IrcClient): void => {\n irc.on(\"data\", (msg: IrcMessage) => {\n if (msg.command !== \"JOIN\") return;\n const e: JoinEvent = {\n nick: utils.nick(msg),\n hostmask: utils.hostmask(msg),\n channel: (msg.params || msg.trailing).toLowerCase(),\n };\n irc.emit(\"join\", e);\n });\n };\n}\n","/**\n * Module dependencies.\n */\n\nimport type { IrcClient, IrcMessage, KickEvent, Plugin } from \"../types\";\nimport * as utils from \"../utils\";\n\n/**\n * KICK plugin to emit \"kick\" events.\n *\n * @return {Function}\n */\n\nexport default function kick(): Plugin {\n return (irc: IrcClient): void => {\n irc.on(\"data\", (msg: IrcMessage) => {\n if (msg.command !== \"KICK\") return;\n const params = msg.params.split(\" \");\n const e: KickEvent = {\n nick: utils.nick(msg),\n hostmask: utils.hostmask(msg),\n channel: params[0]!.toLowerCase(),\n client: params[1]!,\n message: msg.trailing,\n };\n irc.emit(\"kick\", e);\n });\n };\n}\n","/**\n * Module dependencies.\n */\n\nimport type { IrcClient, IrcMessage, ModeEvent, Plugin } from \"../types\";\nimport * as utils from \"../utils\";\n\n/**\n * MODE plugin to emit \"mode\" events.\n *\n * @return {Function}\n */\n\nexport default function mode(): Plugin {\n return (irc: IrcClient): void => {\n irc.on(\"data\", (msg: IrcMessage) => {\n if (msg.command !== \"MODE\") return;\n const params = msg.params.split(\" \");\n const e: ModeEvent = {\n nick: utils.nick(msg),\n target: params[0],\n mode: params[1] || msg.trailing,\n client: params[2],\n };\n irc.emit(\"mode\", e);\n });\n };\n}\n","import type { IrcClient, IrcMessage, MotdEvent, Plugin } from \"../types\";\n\n/**\n * MOTD plugin to emit \"motd\" events.\n *\n * @return {Function}\n */\n\nexport default function motd(): Plugin {\n return (irc: IrcClient): void => {\n const e: MotdEvent = {\n motd: [],\n };\n\n irc.on(\"data\", (msg: IrcMessage) => {\n switch (msg.command) {\n case \"RPL_MOTDSTART\":\n e.motd.length = 0;\n e.motd.push(msg.trailing);\n break;\n case \"RPL_ENDOFMOTD\":\n case \"RPL_MOTD\":\n e.motd.push(msg.trailing);\n break;\n }\n\n if (msg.command === \"RPL_ENDOFMOTD\") {\n irc.emit(\"motd\", e);\n }\n });\n };\n}\n","/**\n * Module dependencies.\n */\n\nimport debugModule from \"debug\";\n\nimport type {\n IrcClient,\n IrcMessage,\n NamesEvent,\n NamesQueryCallback,\n NamesUser,\n Plugin,\n} from \"../types\";\n\nconst debug = debugModule(\"slate-irc:names\");\n\n/**\n * NAMES plugin to emit `name event`.\n *\n * @return {Function}\n */\n\nexport default function namesPlugin(): Plugin {\n return (irc: IrcClient): void => {\n const map: Record<string, NamesUser[]> = {};\n irc.names = names;\n irc.nameCallbacks = {};\n\n irc.on(\"data\", (msg: IrcMessage) => {\n switch (msg.command) {\n case \"RPL_NAMREPLY\": {\n const chan = msg.params.split(/ [=@*] /)[1]!.toLowerCase();\n const names = msg.trailing.split(\" \");\n const users: NamesUser[] = [];\n\n names.forEach((n: string) => {\n const user = n.split(/([~&@%+])/);\n const name = user.pop()!;\n const mode = user.pop();\n users.push({ name, mode: mode || \"\" });\n });\n\n map[chan] = (map[chan] || []).concat(users);\n debug(\"add %s %j\", chan, users);\n break;\n }\n\n case \"RPL_ENDOFNAMES\": {\n const chan = msg.params.split(\" \")[1]!.toLowerCase();\n debug('emit \"names\" for %s', chan);\n const e: NamesEvent = { channel: chan, names: map[chan] || [] };\n const cb = irc.nameCallbacks[chan];\n\n if (cb) cb(e);\n else irc.emit(\"names\", e);\n\n delete map[chan];\n break;\n }\n }\n });\n };\n}\n\n/**\n * Fetch names for `channel` and invoke `fn(err, names)`.\n *\n * @param {String} channel\n * @param {Function} fn\n */\n\nfunction names(this: IrcClient, channel: string, fn?: NamesQueryCallback): void {\n channel = channel.toLowerCase();\n\n if (fn) {\n this.nameCallbacks[channel] = (e: NamesEvent) => {\n delete this.nameCallbacks[channel];\n fn(null, e.names);\n };\n }\n\n this.write(`NAMES ${channel}`);\n}\n","/**\n * Module dependencies.\n */\n\nimport type { IrcClient, IrcMessage, NickEvent, Plugin } from \"../types\";\nimport * as utils from \"../utils\";\n\n/**\n * NICK plugin to emit \"nick\" events.\n *\n * @return {Function}\n */\n\nexport default function nick(): Plugin {\n return (irc: IrcClient): void => {\n irc.on(\"data\", (msg: IrcMessage) => {\n if (msg.command !== \"NICK\") return;\n const e: NickEvent = {\n nick: utils.nick(msg),\n hostmask: utils.hostmask(msg),\n new: msg.trailing,\n };\n if (!e.new) e.new = msg.params;\n if (e.nick === irc.me) irc.me = e.new;\n irc.emit(\"nick\", e);\n });\n };\n}\n","/**\n * Module dependencies.\n */\n\nimport type { IrcClient, IrcMessage, NoticeEvent, Plugin } from \"../types\";\nimport * as utils from \"../utils\";\n\n/**\n * NOTICE plugin to emit \"notice\" events.\n *\n * @return {Function}\n */\n\nexport default function notice(): Plugin {\n return (irc: IrcClient): void => {\n irc.on(\"data\", (msg: IrcMessage) => {\n if (msg.command !== \"NOTICE\") return;\n const e: NoticeEvent = {\n from: utils.nick(msg),\n hostmask: utils.hostmask(msg),\n to: msg.params.toLowerCase(),\n message: msg.trailing,\n };\n irc.emit(\"notice\", e);\n });\n };\n}\n","/**\n * Module dependencies.\n */\n\nimport type { IrcClient, IrcMessage, PartEvent, Plugin } from \"../types\";\nimport * as utils from \"../utils\";\n\n/**\n * PART plugin to emit \"part\" events.\n *\n * @return {Function}\n */\n\nexport default function part(): Plugin {\n return (irc: IrcClient): void => {\n irc.on(\"data\", (msg: IrcMessage) => {\n if (msg.command !== \"PART\") return;\n const e: PartEvent = {\n nick: utils.nick(msg),\n hostmask: utils.hostmask(msg),\n channels: utils.channelList(msg.params),\n message: msg.trailing,\n };\n irc.emit(\"part\", e);\n });\n };\n}\n","import type { IrcClient, IrcMessage, Plugin } from \"../types\";\n\n/**\n * PONG plugin to reply to PING events.\n *\n * @return {Function}\n */\n\nexport default function pong(): Plugin {\n return (irc: IrcClient): void => {\n irc.on(\"data\", (msg: IrcMessage) => {\n if (msg.command === \"PONG\") irc.emit(\"pong\", msg.trailing);\n if (msg.command !== \"PING\") return;\n irc.write(`PONG :${msg.trailing}`);\n });\n };\n}\n","/**\n * Module dependencies.\n */\n\nimport type { IrcClient, IrcMessage, Plugin, PrivmsgEvent } from \"../types\";\nimport * as utils from \"../utils\";\n\n/**\n * PRIVMSG plugin to emit \"message\" events.\n *\n * @return {Function}\n */\n\nexport default function privmsg(): Plugin {\n return (irc: IrcClient): void => {\n irc.on(\"data\", (msg: IrcMessage) => {\n if (msg.command !== \"PRIVMSG\") return;\n const e: PrivmsgEvent = {\n from: utils.nick(msg),\n hostmask: utils.hostmask(msg),\n to: msg.params.toLowerCase(),\n message: msg.trailing,\n };\n irc.emit(\"message\", e);\n });\n };\n}\n","/**\n * Module dependencies.\n */\n\nimport type { IrcClient, IrcMessage, Plugin, QuitEvent } from \"../types\";\nimport * as utils from \"../utils\";\n\n/**\n * QUIT plugin to emit \"quit\" events.\n *\n * @return {Function}\n */\n\nexport default function quit(): Plugin {\n return (irc: IrcClient): void => {\n irc.on(\"data\", (msg: IrcMessage) => {\n if (msg.command !== \"QUIT\") return;\n const e: QuitEvent = {\n nick: utils.nick(msg),\n hostmask: utils.hostmask(msg),\n message: msg.trailing,\n };\n irc.emit(\"quit\", e);\n });\n };\n}\n","/**\n * Module dependencies.\n */\n\nimport type { IrcClient, IrcMessage, Plugin, TopicEvent } from \"../types\";\nimport * as utils from \"../utils\";\n\n/**\n * TOPIC plugin to emit \"topic\" events.\n *\n * @return {Function}\n */\n\nexport default function topic(): Plugin {\n return (irc: IrcClient): void => {\n let channel: string | undefined;\n irc.on(\"data\", (msg: IrcMessage) => {\n switch (msg.command) {\n case \"RPL_NOTOPIC\":\n case \"RPL_TOPIC\":\n channel = msg.params.split(\" \")[1]!;\n break;\n\n case \"TOPIC\":\n channel = msg.params;\n break;\n\n default:\n return;\n }\n\n const e: TopicEvent = {\n hostmask: utils.hostmask(msg),\n channel: channel!.toLowerCase(),\n topic: msg.trailing,\n };\n if (msg.command === \"TOPIC\") e.nick = utils.nick(msg);\n irc.emit(\"topic\", e);\n });\n };\n}\n","import type { IrcClient, IrcMessage, Plugin } from \"../types\";\n\n/**\n * RPL_WELCOME plugin to set `irc.me`.\n *\n * @return {Function}\n */\n\nexport default function welcome(): Plugin {\n return (irc: IrcClient): void => {\n irc.on(\"data\", (msg: IrcMessage) => {\n if (msg.command !== \"RPL_WELCOME\") return;\n irc.me = msg.params;\n irc.emit(\"welcome\", irc.me);\n });\n };\n}\n","/**\n * Module dependencies.\n */\nimport type { IrcClient, IrcMessage, Plugin, WhoisData, WhoisQueryCallback } from \"../types\";\n\n/**\n * WHOIS plugin to emit \"whois\" events.\n *\n * @return {Function}\n */\n\nexport default function whoisPlugin(): Plugin {\n return (irc: IrcClient): void => {\n let map: Record<string, WhoisData> = {};\n let err: string | undefined;\n irc.whois = whois;\n irc.whoisCallbacks = {};\n\n irc.on(\"data\", (msg: IrcMessage) => {\n switch (msg.command) {\n case \"RPL_WHOISUSER\": {\n const params = msg.params.split(\" \");\n const target = params[1]!.toLowerCase();\n map[target] = map[target] || { channels: [], oper: false };\n map[target]!.nickname = params[1];\n map[target]!.username = params[2];\n map[target]!.hostname = params[3];\n map[target]!.realname = msg.trailing;\n map[target]!.channels = [];\n map[target]!.oper = false;\n break;\n }\n case \"RPL_WHOISCHANNELS\": {\n const params = msg.params.split(\" \");\n const target = params[1]!.toLowerCase();\n const channels = msg.trailing.split(\" \");\n map[target]!.channels = map[target]!.channels.concat(channels);\n break;\n }\n case \"RPL_WHOISSERVER\": {\n const params = msg.params.split(\" \");\n const target = params[1]!.toLowerCase();\n map[target]!.server = params[2];\n break;\n }\n case \"RPL_AWAY\": {\n const params = msg.params.split(\" \");\n const target = params[1]!.toLowerCase();\n if (!map[target]) return;\n map[target]!.away = msg.trailing;\n break;\n }\n case \"RPL_WHOISOPERATOR\": {\n const params = msg.params.split(\" \");\n const target = params[1]!.toLowerCase();\n map[target]!.oper = true;\n break;\n }\n case \"RPL_WHOISIDLE\": {\n const params = msg.params.split(\" \");\n const target = params[1]!.toLowerCase();\n map[target]!.idle = params[2]; // new Date(now - (n * 1000))\n map[target]!.sign = params[3]; // new Date(n * 1000)\n break;\n }\n case \"RPL_ENDOFWHOIS\": {\n const params = msg.params.split(\" \");\n const target = params[1]!.toLowerCase();\n if (!map[target]) return;\n const cb = irc.whoisCallbacks[target];\n if (cb) cb(err, map[target]!);\n else irc.emit(\"whois\", null, map[target]!);\n map = {};\n break;\n }\n case \"ERR_NEEDMOREPARAMS\": {\n err = \"Not enough parameters\";\n const params = msg.params.split(\" \");\n const target = params[1]!.toLowerCase();\n if (target !== \"whois\") return;\n const cb = irc.whoisCallbacks[target];\n if (cb) cb(err, null);\n else irc.emit(\"whois\", err, null);\n break;\n }\n case \"ERR_NOSUCHSERVER\": {\n err = \"No such server\";\n const params = msg.params.split(\" \");\n const target = params[1]!.toLowerCase();\n const cb = irc.whoisCallbacks[target];\n if (cb) cb(err, null);\n else irc.emit(\"whois\", err, null);\n break;\n }\n case \"ERR_NOSUCHNICK\": {\n err = \"No such nick/channel\";\n const params = msg.params.split(\" \");\n const target = params[1]!.toLowerCase();\n const cb = irc.whoisCallbacks[target];\n if (cb) cb(err, null);\n else irc.emit(\"whois\", err, null);\n break;\n }\n }\n });\n };\n}\n\n/**\n * Fetch whois data and invoke `fn(err, data)`.\n *\n * @param {String} target\n * @param {String} mask\n * @param {Function} fn\n */\n\nfunction whois(\n this: IrcClient,\n target: string,\n mask?: string | WhoisQueryCallback,\n fn?: WhoisQueryCallback,\n): void {\n if (typeof mask === \"function\") {\n fn = mask;\n mask = \"\";\n }\n\n target = target.toLowerCase();\n\n if (fn) {\n this.whoisCallbacks[target] = (err: string | null | undefined, data: WhoisData | null) => {\n delete this.whoisCallbacks[target];\n fn(err, data);\n };\n }\n\n this.write([\"WHOIS\", target, mask].filter(Boolean).join(\" \"));\n}\n","/**\n * Module dependencies.\n */\n\nimport { EventEmitter as Emitter } from \"events\";\n\nimport debugModule from \"debug\";\nimport replies from \"irc-replies\";\nimport Parser from \"slate-irc-parser\";\n\nimport type { IrcClient, IrcMessage, IrcStream, Plugin, WriteCallback } from \"./types\";\nexport type {\n AwayEvent,\n AnyFn,\n ErrorEvent,\n Hostmask,\n IrcClient,\n IrcMessage,\n IrcStream,\n InviteEvent,\n JoinEvent,\n KickEvent,\n ModeEvent,\n MotdEvent,\n NamesEvent,\n NamesQueryCallback,\n NamesUser,\n NickEvent,\n NoticeEvent,\n PartEvent,\n Plugin,\n PluginFactory,\n PrivmsgEvent,\n QuitEvent,\n TopicEvent,\n WhoisData,\n WhoisQueryCallback,\n WriteCallback,\n} from \"./types\";\n\n/**\n * Core plugins.\n */\n\nimport away from \"./plugins/away\";\nimport disconnect from \"./plugins/disconnect\";\nimport errors from \"./plugins/errors\";\nimport invite from \"./plugins/invite\";\nimport join from \"./plugins/join\";\nimport kick from \"./plugins/kick\";\nimport mode from \"./plugins/mode\";\nimport motd from \"./plugins/motd\";\nimport names from \"./plugins/names\";\nimport nick from \"./plugins/nick\";\nimport notice from \"./plugins/notice\";\nimport part from \"./plugins/part\";\nimport pong from \"./plugins/pong\";\nimport privmsg from \"./plugins/privmsg\";\nimport quit from \"./plugins/quit\";\nimport topic from \"./plugins/topic\";\nimport welcome from \"./plugins/welcome\";\nimport whois from \"./plugins/whois\";\n\n/**\n * Initialize a new IRC client with the\n * given duplex `stream`.\n *\n * @param {Stream} stream\n * @param {Parser} [parser]\n * @param {String} [encoding]\n */\n\nexport type ClientFactory = (\n stream: IrcStream,\n parser?: Parser,\n encoding?: BufferEncoding,\n) => IrcClient;\n\nclass ClientImpl extends Emitter {\n private static readonly debug = debugModule(\"slate-irc\");\n\n stream!: IrcStream;\n parser!: Parser;\n me?: string;\n names!: IrcClient[\"names\"];\n whois!: IrcClient[\"whois\"];\n nameCallbacks!: IrcClient[\"nameCallbacks\"];\n whoisCallbacks!: IrcClient[\"whoisCallbacks\"];\n\n constructor(stream: IrcStream, parser?: Parser, encoding?: BufferEncoding) {\n super();\n stream.setEncoding(encoding || \"utf8\");\n this.stream = stream;\n this.parser = parser || new Parser();\n this.parser.on(\"message\", this.onmessage.bind(this));\n stream.pipe(this.parser as unknown as NodeJS.WritableStream);\n this.setMaxListeners(100);\n this.use(away());\n this.use(disconnect());\n this.use(errors());\n this.use(invite());\n this.use(join());\n this.use(kick());\n this.use(mode());\n this.use(motd());\n this.use(names());\n this.use(nick());\n this.use(notice());\n this.use(part());\n this.use(pong());\n this.use(privmsg());\n this.use(quit());\n this.use(topic());\n this.use(welcome());\n this.use(whois());\n }\n\n writeUnsafe(str: string, fn?: WriteCallback): void {\n this.stream.write(`${str}\\r\\n`, fn);\n }\n\n write(str: string, fn?: WriteCallback): void {\n if (str.includes(\"\\n\") || str.includes(\"\\r\")) {\n if (fn) fn(new Error(\"The parameter to write() must not contain any '\\\\n' or '\\\\r'.\"));\n return;\n }\n this.writeUnsafe(str, fn);\n }\n\n pass(pass: string, fn?: WriteCallback): void {\n this.write(`PASS ${pass}`, fn);\n }\n\n webirc(\n password: string,\n username: string,\n hostname: string,\n ip: string,\n fn?: WriteCallback,\n ): void {\n const message = [password, username, hostname, ip].join(\" \");\n this.write(`WEBIRC ${message}`, fn);\n }\n\n nick(nick: string, fn?: WriteCallback): void {\n this.write(`NICK ${nick}`, fn);\n }\n\n user(username: string, realname: string, fn?: WriteCallback): void {\n this.write(`USER ${username} 0 * :${realname}`, fn);\n }\n\n invite(name: string, channel: string, fn?: WriteCallback): void {\n this.write(`INVITE ${name} ${channel}`, fn);\n }\n\n send(target: string | string[], msg: string, fn?: WriteCallback): void {\n this.write(`PRIVMSG ${toArray(target).join(\",\")} :${msg}`, fn);\n }\n\n action(target: string, msg: string, fn?: WriteCallback): void {\n this.send(target, `\\u0001ACTION ${msg}\\u0001`, fn);\n }\n\n notice(target: string, msg: string, fn?: WriteCallback): void {\n this.write(`NOTICE ${target} :${msg}`, fn);\n }\n\n ctcp(target: string, msg: string, fn?: WriteCallback): void {\n this.notice(target, `\\x01${msg}\\x01`, fn);\n }\n\n join(\n channels: string | string[],\n keys?: string | string[] | WriteCallback,\n fn?: WriteCallback,\n ): void {\n if (typeof keys === \"function\") {\n fn = keys;\n keys = \"\";\n }\n\n this.write(`JOIN ${toArray(channels).join(\",\")} ${toArray(keys).join(\",\")}`, fn);\n }\n\n part(channels: string | string[], msg?: string | WriteCallback, fn?: WriteCallback): void {\n if (typeof msg === \"function\") {\n fn = msg;\n msg = \"\";\n }\n\n let part = `PART ${toArray(channels).join(\",\")}`;\n if (msg) {\n part += ` :${msg}`;\n }\n this.write(part, fn);\n }\n\n away(msg?: string, fn?: WriteCallback): void {\n const awayMessage = msg || \"Talk to you later!\";\n this.write(`AWAY :${awayMessage}`, fn);\n }\n\n back(fn?: WriteCallback): void {\n this.write(\"AWAY\", fn);\n }\n\n topic(channel: string, topic?: string | WriteCallback, fn?: WriteCallback): void {\n if (typeof topic === \"function\") {\n fn = topic;\n topic = \"\";\n }\n\n if (topic) {\n topic = ` :${topic}`;\n }\n\n this.write(`TOPIC ${channel}${topic}`, fn);\n }\n\n kick(\n channels: string | string[],\n nicks: string | string[],\n msg?: string | WriteCallback,\n fn?: WriteCallback,\n ): void {\n if (typeof msg === \"function\") {\n fn = msg;\n msg = \"\";\n }\n\n let kick = `KICK ${toArray(channels).join(\",\")} ${toArray(nicks).join(\",\")}`;\n if (msg) {\n kick += ` :${msg}`;\n }\n this.write(kick, fn);\n }\n\n quit(msg?: string, fn?: WriteCallback): void {\n const quitMessage = msg || \"Bye!\";\n this.write(`QUIT :${quitMessage}`, fn);\n }\n\n oper(name: string, password: string, fn?: WriteCallback): void {\n this.write(`OPER ${name} ${password}`, fn);\n }\n\n mode(target: string, flags: string, params?: string | WriteCallback, fn?: WriteCallback): void {\n if (typeof params === \"function\") {\n fn = params;\n params = \"\";\n }\n\n if (params) {\n this.write(`MODE ${target} ${flags} ${params}`, fn);\n } else {\n this.write(`MODE ${target} ${flags}`, fn);\n }\n }\n\n use(fn: Plugin): IrcClient {\n fn(this as unknown as IrcClient);\n return this as unknown as IrcClient;\n }\n\n onmessage(msg: IrcMessage): void {\n msg.command = replies[msg.command as keyof typeof replies] || msg.command;\n ClientImpl.debug(\"message %s %s\", msg.command, msg.string);\n this.emit(\"data\", msg);\n }\n}\n\nfunction Client(stream: IrcStream, parser?: Parser, encoding?: BufferEncoding): IrcClient {\n return new ClientImpl(stream, parser, encoding) as unknown as IrcClient;\n}\n\nexport default Client;\n\n/**\n * Array helper.\n */\n\nfunction toArray<T>(val: T | T[]): T[] {\n return Array.isArray(val) ? val : [val];\n}\n"],"x_google_ignoreList":[0],"mappings":"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"} |
+285
| /** | ||
| * Module dependencies. | ||
| */ | ||
| import { EventEmitter as Emitter } from "events"; | ||
| import debugModule from "debug"; | ||
| import replies from "irc-replies"; | ||
| import Parser from "slate-irc-parser"; | ||
| import type { IrcClient, IrcMessage, IrcStream, Plugin, WriteCallback } from "./types"; | ||
| export type { | ||
| AwayEvent, | ||
| AnyFn, | ||
| ErrorEvent, | ||
| Hostmask, | ||
| IrcClient, | ||
| IrcMessage, | ||
| IrcStream, | ||
| InviteEvent, | ||
| JoinEvent, | ||
| KickEvent, | ||
| ModeEvent, | ||
| MotdEvent, | ||
| NamesEvent, | ||
| NamesQueryCallback, | ||
| NamesUser, | ||
| NickEvent, | ||
| NoticeEvent, | ||
| PartEvent, | ||
| Plugin, | ||
| PluginFactory, | ||
| PrivmsgEvent, | ||
| QuitEvent, | ||
| TopicEvent, | ||
| WhoisData, | ||
| WhoisQueryCallback, | ||
| WriteCallback, | ||
| } from "./types"; | ||
| /** | ||
| * Core plugins. | ||
| */ | ||
| import away from "./plugins/away"; | ||
| import disconnect from "./plugins/disconnect"; | ||
| import errors from "./plugins/errors"; | ||
| import invite from "./plugins/invite"; | ||
| import join from "./plugins/join"; | ||
| import kick from "./plugins/kick"; | ||
| import mode from "./plugins/mode"; | ||
| import motd from "./plugins/motd"; | ||
| import names from "./plugins/names"; | ||
| import nick from "./plugins/nick"; | ||
| import notice from "./plugins/notice"; | ||
| import part from "./plugins/part"; | ||
| import pong from "./plugins/pong"; | ||
| import privmsg from "./plugins/privmsg"; | ||
| import quit from "./plugins/quit"; | ||
| import topic from "./plugins/topic"; | ||
| import welcome from "./plugins/welcome"; | ||
| import whois from "./plugins/whois"; | ||
| /** | ||
| * Initialize a new IRC client with the | ||
| * given duplex `stream`. | ||
| * | ||
| * @param {Stream} stream | ||
| * @param {Parser} [parser] | ||
| * @param {String} [encoding] | ||
| */ | ||
| export type ClientFactory = ( | ||
| stream: IrcStream, | ||
| parser?: Parser, | ||
| encoding?: BufferEncoding, | ||
| ) => IrcClient; | ||
| class ClientImpl extends Emitter { | ||
| private static readonly debug = debugModule("slate-irc"); | ||
| stream!: IrcStream; | ||
| parser!: Parser; | ||
| me?: string; | ||
| names!: IrcClient["names"]; | ||
| whois!: IrcClient["whois"]; | ||
| nameCallbacks!: IrcClient["nameCallbacks"]; | ||
| whoisCallbacks!: IrcClient["whoisCallbacks"]; | ||
| constructor(stream: IrcStream, parser?: Parser, encoding?: BufferEncoding) { | ||
| super(); | ||
| stream.setEncoding(encoding || "utf8"); | ||
| this.stream = stream; | ||
| this.parser = parser || new Parser(); | ||
| this.parser.on("message", this.onmessage.bind(this)); | ||
| stream.pipe(this.parser as unknown as NodeJS.WritableStream); | ||
| this.setMaxListeners(100); | ||
| this.use(away()); | ||
| this.use(disconnect()); | ||
| this.use(errors()); | ||
| this.use(invite()); | ||
| this.use(join()); | ||
| this.use(kick()); | ||
| this.use(mode()); | ||
| this.use(motd()); | ||
| this.use(names()); | ||
| this.use(nick()); | ||
| this.use(notice()); | ||
| this.use(part()); | ||
| this.use(pong()); | ||
| this.use(privmsg()); | ||
| this.use(quit()); | ||
| this.use(topic()); | ||
| this.use(welcome()); | ||
| this.use(whois()); | ||
| } | ||
| writeUnsafe(str: string, fn?: WriteCallback): void { | ||
| this.stream.write(`${str}\r\n`, fn); | ||
| } | ||
| write(str: string, fn?: WriteCallback): void { | ||
| if (str.includes("\n") || str.includes("\r")) { | ||
| if (fn) fn(new Error("The parameter to write() must not contain any '\\n' or '\\r'.")); | ||
| return; | ||
| } | ||
| this.writeUnsafe(str, fn); | ||
| } | ||
| pass(pass: string, fn?: WriteCallback): void { | ||
| this.write(`PASS ${pass}`, fn); | ||
| } | ||
| webirc( | ||
| password: string, | ||
| username: string, | ||
| hostname: string, | ||
| ip: string, | ||
| fn?: WriteCallback, | ||
| ): void { | ||
| const message = [password, username, hostname, ip].join(" "); | ||
| this.write(`WEBIRC ${message}`, fn); | ||
| } | ||
| nick(nick: string, fn?: WriteCallback): void { | ||
| this.write(`NICK ${nick}`, fn); | ||
| } | ||
| user(username: string, realname: string, fn?: WriteCallback): void { | ||
| this.write(`USER ${username} 0 * :${realname}`, fn); | ||
| } | ||
| invite(name: string, channel: string, fn?: WriteCallback): void { | ||
| this.write(`INVITE ${name} ${channel}`, fn); | ||
| } | ||
| send(target: string | string[], msg: string, fn?: WriteCallback): void { | ||
| this.write(`PRIVMSG ${toArray(target).join(",")} :${msg}`, fn); | ||
| } | ||
| action(target: string, msg: string, fn?: WriteCallback): void { | ||
| this.send(target, `\u0001ACTION ${msg}\u0001`, fn); | ||
| } | ||
| notice(target: string, msg: string, fn?: WriteCallback): void { | ||
| this.write(`NOTICE ${target} :${msg}`, fn); | ||
| } | ||
| ctcp(target: string, msg: string, fn?: WriteCallback): void { | ||
| this.notice(target, `\x01${msg}\x01`, fn); | ||
| } | ||
| join( | ||
| channels: string | string[], | ||
| keys?: string | string[] | WriteCallback, | ||
| fn?: WriteCallback, | ||
| ): void { | ||
| if (typeof keys === "function") { | ||
| fn = keys; | ||
| keys = ""; | ||
| } | ||
| this.write(`JOIN ${toArray(channels).join(",")} ${toArray(keys).join(",")}`, fn); | ||
| } | ||
| part(channels: string | string[], msg?: string | WriteCallback, fn?: WriteCallback): void { | ||
| if (typeof msg === "function") { | ||
| fn = msg; | ||
| msg = ""; | ||
| } | ||
| let part = `PART ${toArray(channels).join(",")}`; | ||
| if (msg) { | ||
| part += ` :${msg}`; | ||
| } | ||
| this.write(part, fn); | ||
| } | ||
| away(msg?: string, fn?: WriteCallback): void { | ||
| const awayMessage = msg || "Talk to you later!"; | ||
| this.write(`AWAY :${awayMessage}`, fn); | ||
| } | ||
| back(fn?: WriteCallback): void { | ||
| this.write("AWAY", fn); | ||
| } | ||
| topic(channel: string, topic?: string | WriteCallback, fn?: WriteCallback): void { | ||
| if (typeof topic === "function") { | ||
| fn = topic; | ||
| topic = ""; | ||
| } | ||
| if (topic) { | ||
| topic = ` :${topic}`; | ||
| } | ||
| this.write(`TOPIC ${channel}${topic}`, fn); | ||
| } | ||
| kick( | ||
| channels: string | string[], | ||
| nicks: string | string[], | ||
| msg?: string | WriteCallback, | ||
| fn?: WriteCallback, | ||
| ): void { | ||
| if (typeof msg === "function") { | ||
| fn = msg; | ||
| msg = ""; | ||
| } | ||
| let kick = `KICK ${toArray(channels).join(",")} ${toArray(nicks).join(",")}`; | ||
| if (msg) { | ||
| kick += ` :${msg}`; | ||
| } | ||
| this.write(kick, fn); | ||
| } | ||
| quit(msg?: string, fn?: WriteCallback): void { | ||
| const quitMessage = msg || "Bye!"; | ||
| this.write(`QUIT :${quitMessage}`, fn); | ||
| } | ||
| oper(name: string, password: string, fn?: WriteCallback): void { | ||
| this.write(`OPER ${name} ${password}`, fn); | ||
| } | ||
| mode(target: string, flags: string, params?: string | WriteCallback, fn?: WriteCallback): void { | ||
| if (typeof params === "function") { | ||
| fn = params; | ||
| params = ""; | ||
| } | ||
| if (params) { | ||
| this.write(`MODE ${target} ${flags} ${params}`, fn); | ||
| } else { | ||
| this.write(`MODE ${target} ${flags}`, fn); | ||
| } | ||
| } | ||
| use(fn: Plugin): IrcClient { | ||
| fn(this as unknown as IrcClient); | ||
| return this as unknown as IrcClient; | ||
| } | ||
| onmessage(msg: IrcMessage): void { | ||
| msg.command = replies[msg.command as keyof typeof replies] || msg.command; | ||
| ClientImpl.debug("message %s %s", msg.command, msg.string); | ||
| this.emit("data", msg); | ||
| } | ||
| } | ||
| function Client(stream: IrcStream, parser?: Parser, encoding?: BufferEncoding): IrcClient { | ||
| return new ClientImpl(stream, parser, encoding) as unknown as IrcClient; | ||
| } | ||
| export default Client; | ||
| /** | ||
| * Array helper. | ||
| */ | ||
| function toArray<T>(val: T | T[]): T[] { | ||
| return Array.isArray(val) ? val : [val]; | ||
| } |
| import type { AwayEvent, IrcClient, IrcMessage, Plugin } from "../types"; | ||
| /** | ||
| * AWAY plugin to emit "away" events. | ||
| * | ||
| * @return {Function} | ||
| */ | ||
| export default function away(): Plugin { | ||
| return (irc: IrcClient): void => { | ||
| irc.on("data", (msg: IrcMessage) => { | ||
| if ( | ||
| msg.command !== "RPL_AWAY" && | ||
| msg.command !== "RPL_NOWAWAY" && | ||
| msg.command !== "RPL_UNAWAY" | ||
| ) { | ||
| return; | ||
| } | ||
| const params = msg.params.split(" "); | ||
| const e: AwayEvent = { | ||
| message: msg.trailing, | ||
| }; | ||
| if (msg.command === "RPL_NOWAWAY" || msg.command === "RPL_UNAWAY") { | ||
| e.nick = params[0]; | ||
| } else { | ||
| e.nick = params[1]; | ||
| } | ||
| irc.emit("away", e); | ||
| }); | ||
| }; | ||
| } |
| import type { IrcClient, Plugin } from "../types"; | ||
| /** | ||
| * DISCONNECT plugin to emit "disconnect" events. | ||
| * | ||
| * @return {Function} | ||
| */ | ||
| export default function disconnect(): Plugin { | ||
| return (irc: IrcClient): void => { | ||
| const stream = irc.stream; | ||
| const ms = 60 * 1000; | ||
| stream.on("close", () => { | ||
| irc.emit("disconnect"); | ||
| }); | ||
| // Do nothing when given stream cannot perform setTimeout() operation | ||
| if (stream.setTimeout === undefined || stream.setTimeout === null) { | ||
| return; | ||
| } | ||
| stream.setTimeout(ms); | ||
| stream.on("timeout", () => { | ||
| let timeout = true; | ||
| const time = Date.now(); | ||
| irc.write(`PING :${time}`); | ||
| irc.once("pong", (res: string | number) => { | ||
| if (String(res) === String(time)) { | ||
| timeout = false; | ||
| } | ||
| }); | ||
| setTimeout(() => { | ||
| if (timeout) { | ||
| stream.destroy(); | ||
| } | ||
| }, 5000); | ||
| }); | ||
| }; | ||
| } |
| import type { ErrorEvent, IrcClient, IrcMessage, Plugin } from "../types"; | ||
| /** | ||
| * ERRORS plugin to emit "errors" events. | ||
| * | ||
| * List of possible errors: | ||
| * https://github.com/williamwicks/irc-replies/blob/master/replies.json#L113-L170 | ||
| * | ||
| * @return {Function} | ||
| */ | ||
| export default function errors(): Plugin { | ||
| return (irc: IrcClient): void => { | ||
| irc.on("data", (msg: IrcMessage) => { | ||
| if (msg.command.indexOf("ERR_") !== 0) return; | ||
| const e: ErrorEvent = { | ||
| cmd: msg.command, | ||
| message: msg.trailing, | ||
| }; | ||
| irc.emit("errors", e); | ||
| }); | ||
| }; | ||
| } |
| /** | ||
| * Module dependencies. | ||
| */ | ||
| import type { InviteEvent, IrcClient, IrcMessage, Plugin } from "../types"; | ||
| import * as utils from "../utils"; | ||
| /** | ||
| * INVITE plugin to emit "invite" events. | ||
| * | ||
| * @return {Function} | ||
| */ | ||
| export default function invite(): Plugin { | ||
| return (irc: IrcClient): void => { | ||
| irc.on("data", (msg: IrcMessage) => { | ||
| if (msg.command !== "INVITE") return; | ||
| const e: InviteEvent = { | ||
| from: utils.nick(msg), | ||
| hostmask: utils.hostmask(msg), | ||
| to: msg.params.toLowerCase(), | ||
| channel: msg.trailing, | ||
| }; | ||
| irc.emit("invite", e); | ||
| }); | ||
| }; | ||
| } |
| /** | ||
| * Module dependencies. | ||
| */ | ||
| import type { IrcClient, IrcMessage, JoinEvent, Plugin } from "../types"; | ||
| import * as utils from "../utils"; | ||
| /** | ||
| * JOIN plugin to emit "join" events. | ||
| * | ||
| * @return {Function} | ||
| */ | ||
| export default function join(): Plugin { | ||
| return (irc: IrcClient): void => { | ||
| irc.on("data", (msg: IrcMessage) => { | ||
| if (msg.command !== "JOIN") return; | ||
| const e: JoinEvent = { | ||
| nick: utils.nick(msg), | ||
| hostmask: utils.hostmask(msg), | ||
| channel: (msg.params || msg.trailing).toLowerCase(), | ||
| }; | ||
| irc.emit("join", e); | ||
| }); | ||
| }; | ||
| } |
| /** | ||
| * Module dependencies. | ||
| */ | ||
| import type { IrcClient, IrcMessage, KickEvent, Plugin } from "../types"; | ||
| import * as utils from "../utils"; | ||
| /** | ||
| * KICK plugin to emit "kick" events. | ||
| * | ||
| * @return {Function} | ||
| */ | ||
| export default function kick(): Plugin { | ||
| return (irc: IrcClient): void => { | ||
| irc.on("data", (msg: IrcMessage) => { | ||
| if (msg.command !== "KICK") return; | ||
| const params = msg.params.split(" "); | ||
| const e: KickEvent = { | ||
| nick: utils.nick(msg), | ||
| hostmask: utils.hostmask(msg), | ||
| channel: params[0]!.toLowerCase(), | ||
| client: params[1]!, | ||
| message: msg.trailing, | ||
| }; | ||
| irc.emit("kick", e); | ||
| }); | ||
| }; | ||
| } |
| /** | ||
| * Module dependencies. | ||
| */ | ||
| import type { IrcClient, IrcMessage, ModeEvent, Plugin } from "../types"; | ||
| import * as utils from "../utils"; | ||
| /** | ||
| * MODE plugin to emit "mode" events. | ||
| * | ||
| * @return {Function} | ||
| */ | ||
| export default function mode(): Plugin { | ||
| return (irc: IrcClient): void => { | ||
| irc.on("data", (msg: IrcMessage) => { | ||
| if (msg.command !== "MODE") return; | ||
| const params = msg.params.split(" "); | ||
| const e: ModeEvent = { | ||
| nick: utils.nick(msg), | ||
| target: params[0], | ||
| mode: params[1] || msg.trailing, | ||
| client: params[2], | ||
| }; | ||
| irc.emit("mode", e); | ||
| }); | ||
| }; | ||
| } |
| import type { IrcClient, IrcMessage, MotdEvent, Plugin } from "../types"; | ||
| /** | ||
| * MOTD plugin to emit "motd" events. | ||
| * | ||
| * @return {Function} | ||
| */ | ||
| export default function motd(): Plugin { | ||
| return (irc: IrcClient): void => { | ||
| const e: MotdEvent = { | ||
| motd: [], | ||
| }; | ||
| irc.on("data", (msg: IrcMessage) => { | ||
| switch (msg.command) { | ||
| case "RPL_MOTDSTART": | ||
| e.motd.length = 0; | ||
| e.motd.push(msg.trailing); | ||
| break; | ||
| case "RPL_ENDOFMOTD": | ||
| case "RPL_MOTD": | ||
| e.motd.push(msg.trailing); | ||
| break; | ||
| } | ||
| if (msg.command === "RPL_ENDOFMOTD") { | ||
| irc.emit("motd", e); | ||
| } | ||
| }); | ||
| }; | ||
| } |
| /** | ||
| * Module dependencies. | ||
| */ | ||
| import debugModule from "debug"; | ||
| import type { | ||
| IrcClient, | ||
| IrcMessage, | ||
| NamesEvent, | ||
| NamesQueryCallback, | ||
| NamesUser, | ||
| Plugin, | ||
| } from "../types"; | ||
| const debug = debugModule("slate-irc:names"); | ||
| /** | ||
| * NAMES plugin to emit `name event`. | ||
| * | ||
| * @return {Function} | ||
| */ | ||
| export default function namesPlugin(): Plugin { | ||
| return (irc: IrcClient): void => { | ||
| const map: Record<string, NamesUser[]> = {}; | ||
| irc.names = names; | ||
| irc.nameCallbacks = {}; | ||
| irc.on("data", (msg: IrcMessage) => { | ||
| switch (msg.command) { | ||
| case "RPL_NAMREPLY": { | ||
| const chan = msg.params.split(/ [=@*] /)[1]!.toLowerCase(); | ||
| const names = msg.trailing.split(" "); | ||
| const users: NamesUser[] = []; | ||
| names.forEach((n: string) => { | ||
| const user = n.split(/([~&@%+])/); | ||
| const name = user.pop()!; | ||
| const mode = user.pop(); | ||
| users.push({ name, mode: mode || "" }); | ||
| }); | ||
| map[chan] = (map[chan] || []).concat(users); | ||
| debug("add %s %j", chan, users); | ||
| break; | ||
| } | ||
| case "RPL_ENDOFNAMES": { | ||
| const chan = msg.params.split(" ")[1]!.toLowerCase(); | ||
| debug('emit "names" for %s', chan); | ||
| const e: NamesEvent = { channel: chan, names: map[chan] || [] }; | ||
| const cb = irc.nameCallbacks[chan]; | ||
| if (cb) cb(e); | ||
| else irc.emit("names", e); | ||
| delete map[chan]; | ||
| break; | ||
| } | ||
| } | ||
| }); | ||
| }; | ||
| } | ||
| /** | ||
| * Fetch names for `channel` and invoke `fn(err, names)`. | ||
| * | ||
| * @param {String} channel | ||
| * @param {Function} fn | ||
| */ | ||
| function names(this: IrcClient, channel: string, fn?: NamesQueryCallback): void { | ||
| channel = channel.toLowerCase(); | ||
| if (fn) { | ||
| this.nameCallbacks[channel] = (e: NamesEvent) => { | ||
| delete this.nameCallbacks[channel]; | ||
| fn(null, e.names); | ||
| }; | ||
| } | ||
| this.write(`NAMES ${channel}`); | ||
| } |
| /** | ||
| * Module dependencies. | ||
| */ | ||
| import type { IrcClient, IrcMessage, NickEvent, Plugin } from "../types"; | ||
| import * as utils from "../utils"; | ||
| /** | ||
| * NICK plugin to emit "nick" events. | ||
| * | ||
| * @return {Function} | ||
| */ | ||
| export default function nick(): Plugin { | ||
| return (irc: IrcClient): void => { | ||
| irc.on("data", (msg: IrcMessage) => { | ||
| if (msg.command !== "NICK") return; | ||
| const e: NickEvent = { | ||
| nick: utils.nick(msg), | ||
| hostmask: utils.hostmask(msg), | ||
| new: msg.trailing, | ||
| }; | ||
| if (!e.new) e.new = msg.params; | ||
| if (e.nick === irc.me) irc.me = e.new; | ||
| irc.emit("nick", e); | ||
| }); | ||
| }; | ||
| } |
| /** | ||
| * Module dependencies. | ||
| */ | ||
| import type { IrcClient, IrcMessage, NoticeEvent, Plugin } from "../types"; | ||
| import * as utils from "../utils"; | ||
| /** | ||
| * NOTICE plugin to emit "notice" events. | ||
| * | ||
| * @return {Function} | ||
| */ | ||
| export default function notice(): Plugin { | ||
| return (irc: IrcClient): void => { | ||
| irc.on("data", (msg: IrcMessage) => { | ||
| if (msg.command !== "NOTICE") return; | ||
| const e: NoticeEvent = { | ||
| from: utils.nick(msg), | ||
| hostmask: utils.hostmask(msg), | ||
| to: msg.params.toLowerCase(), | ||
| message: msg.trailing, | ||
| }; | ||
| irc.emit("notice", e); | ||
| }); | ||
| }; | ||
| } |
| /** | ||
| * Module dependencies. | ||
| */ | ||
| import type { IrcClient, IrcMessage, PartEvent, Plugin } from "../types"; | ||
| import * as utils from "../utils"; | ||
| /** | ||
| * PART plugin to emit "part" events. | ||
| * | ||
| * @return {Function} | ||
| */ | ||
| export default function part(): Plugin { | ||
| return (irc: IrcClient): void => { | ||
| irc.on("data", (msg: IrcMessage) => { | ||
| if (msg.command !== "PART") return; | ||
| const e: PartEvent = { | ||
| nick: utils.nick(msg), | ||
| hostmask: utils.hostmask(msg), | ||
| channels: utils.channelList(msg.params), | ||
| message: msg.trailing, | ||
| }; | ||
| irc.emit("part", e); | ||
| }); | ||
| }; | ||
| } |
| import type { IrcClient, IrcMessage, Plugin } from "../types"; | ||
| /** | ||
| * PONG plugin to reply to PING events. | ||
| * | ||
| * @return {Function} | ||
| */ | ||
| export default function pong(): Plugin { | ||
| return (irc: IrcClient): void => { | ||
| irc.on("data", (msg: IrcMessage) => { | ||
| if (msg.command === "PONG") irc.emit("pong", msg.trailing); | ||
| if (msg.command !== "PING") return; | ||
| irc.write(`PONG :${msg.trailing}`); | ||
| }); | ||
| }; | ||
| } |
| /** | ||
| * Module dependencies. | ||
| */ | ||
| import type { IrcClient, IrcMessage, Plugin, PrivmsgEvent } from "../types"; | ||
| import * as utils from "../utils"; | ||
| /** | ||
| * PRIVMSG plugin to emit "message" events. | ||
| * | ||
| * @return {Function} | ||
| */ | ||
| export default function privmsg(): Plugin { | ||
| return (irc: IrcClient): void => { | ||
| irc.on("data", (msg: IrcMessage) => { | ||
| if (msg.command !== "PRIVMSG") return; | ||
| const e: PrivmsgEvent = { | ||
| from: utils.nick(msg), | ||
| hostmask: utils.hostmask(msg), | ||
| to: msg.params.toLowerCase(), | ||
| message: msg.trailing, | ||
| }; | ||
| irc.emit("message", e); | ||
| }); | ||
| }; | ||
| } |
| /** | ||
| * Module dependencies. | ||
| */ | ||
| import type { IrcClient, IrcMessage, Plugin, QuitEvent } from "../types"; | ||
| import * as utils from "../utils"; | ||
| /** | ||
| * QUIT plugin to emit "quit" events. | ||
| * | ||
| * @return {Function} | ||
| */ | ||
| export default function quit(): Plugin { | ||
| return (irc: IrcClient): void => { | ||
| irc.on("data", (msg: IrcMessage) => { | ||
| if (msg.command !== "QUIT") return; | ||
| const e: QuitEvent = { | ||
| nick: utils.nick(msg), | ||
| hostmask: utils.hostmask(msg), | ||
| message: msg.trailing, | ||
| }; | ||
| irc.emit("quit", e); | ||
| }); | ||
| }; | ||
| } |
| /** | ||
| * Module dependencies. | ||
| */ | ||
| import type { IrcClient, IrcMessage, Plugin, TopicEvent } from "../types"; | ||
| import * as utils from "../utils"; | ||
| /** | ||
| * TOPIC plugin to emit "topic" events. | ||
| * | ||
| * @return {Function} | ||
| */ | ||
| export default function topic(): Plugin { | ||
| return (irc: IrcClient): void => { | ||
| let channel: string | undefined; | ||
| irc.on("data", (msg: IrcMessage) => { | ||
| switch (msg.command) { | ||
| case "RPL_NOTOPIC": | ||
| case "RPL_TOPIC": | ||
| channel = msg.params.split(" ")[1]!; | ||
| break; | ||
| case "TOPIC": | ||
| channel = msg.params; | ||
| break; | ||
| default: | ||
| return; | ||
| } | ||
| const e: TopicEvent = { | ||
| hostmask: utils.hostmask(msg), | ||
| channel: channel!.toLowerCase(), | ||
| topic: msg.trailing, | ||
| }; | ||
| if (msg.command === "TOPIC") e.nick = utils.nick(msg); | ||
| irc.emit("topic", e); | ||
| }); | ||
| }; | ||
| } |
| import type { IrcClient, IrcMessage, Plugin } from "../types"; | ||
| /** | ||
| * RPL_WELCOME plugin to set `irc.me`. | ||
| * | ||
| * @return {Function} | ||
| */ | ||
| export default function welcome(): Plugin { | ||
| return (irc: IrcClient): void => { | ||
| irc.on("data", (msg: IrcMessage) => { | ||
| if (msg.command !== "RPL_WELCOME") return; | ||
| irc.me = msg.params; | ||
| irc.emit("welcome", irc.me); | ||
| }); | ||
| }; | ||
| } |
| /** | ||
| * Module dependencies. | ||
| */ | ||
| import type { IrcClient, IrcMessage, Plugin, WhoisData, WhoisQueryCallback } from "../types"; | ||
| /** | ||
| * WHOIS plugin to emit "whois" events. | ||
| * | ||
| * @return {Function} | ||
| */ | ||
| export default function whoisPlugin(): Plugin { | ||
| return (irc: IrcClient): void => { | ||
| let map: Record<string, WhoisData> = {}; | ||
| let err: string | undefined; | ||
| irc.whois = whois; | ||
| irc.whoisCallbacks = {}; | ||
| irc.on("data", (msg: IrcMessage) => { | ||
| switch (msg.command) { | ||
| case "RPL_WHOISUSER": { | ||
| const params = msg.params.split(" "); | ||
| const target = params[1]!.toLowerCase(); | ||
| map[target] = map[target] || { channels: [], oper: false }; | ||
| map[target]!.nickname = params[1]; | ||
| map[target]!.username = params[2]; | ||
| map[target]!.hostname = params[3]; | ||
| map[target]!.realname = msg.trailing; | ||
| map[target]!.channels = []; | ||
| map[target]!.oper = false; | ||
| break; | ||
| } | ||
| case "RPL_WHOISCHANNELS": { | ||
| const params = msg.params.split(" "); | ||
| const target = params[1]!.toLowerCase(); | ||
| const channels = msg.trailing.split(" "); | ||
| map[target]!.channels = map[target]!.channels.concat(channels); | ||
| break; | ||
| } | ||
| case "RPL_WHOISSERVER": { | ||
| const params = msg.params.split(" "); | ||
| const target = params[1]!.toLowerCase(); | ||
| map[target]!.server = params[2]; | ||
| break; | ||
| } | ||
| case "RPL_AWAY": { | ||
| const params = msg.params.split(" "); | ||
| const target = params[1]!.toLowerCase(); | ||
| if (!map[target]) return; | ||
| map[target]!.away = msg.trailing; | ||
| break; | ||
| } | ||
| case "RPL_WHOISOPERATOR": { | ||
| const params = msg.params.split(" "); | ||
| const target = params[1]!.toLowerCase(); | ||
| map[target]!.oper = true; | ||
| break; | ||
| } | ||
| case "RPL_WHOISIDLE": { | ||
| const params = msg.params.split(" "); | ||
| const target = params[1]!.toLowerCase(); | ||
| map[target]!.idle = params[2]; // new Date(now - (n * 1000)) | ||
| map[target]!.sign = params[3]; // new Date(n * 1000) | ||
| break; | ||
| } | ||
| case "RPL_ENDOFWHOIS": { | ||
| const params = msg.params.split(" "); | ||
| const target = params[1]!.toLowerCase(); | ||
| if (!map[target]) return; | ||
| const cb = irc.whoisCallbacks[target]; | ||
| if (cb) cb(err, map[target]!); | ||
| else irc.emit("whois", null, map[target]!); | ||
| map = {}; | ||
| break; | ||
| } | ||
| case "ERR_NEEDMOREPARAMS": { | ||
| err = "Not enough parameters"; | ||
| const params = msg.params.split(" "); | ||
| const target = params[1]!.toLowerCase(); | ||
| if (target !== "whois") return; | ||
| const cb = irc.whoisCallbacks[target]; | ||
| if (cb) cb(err, null); | ||
| else irc.emit("whois", err, null); | ||
| break; | ||
| } | ||
| case "ERR_NOSUCHSERVER": { | ||
| err = "No such server"; | ||
| const params = msg.params.split(" "); | ||
| const target = params[1]!.toLowerCase(); | ||
| const cb = irc.whoisCallbacks[target]; | ||
| if (cb) cb(err, null); | ||
| else irc.emit("whois", err, null); | ||
| break; | ||
| } | ||
| case "ERR_NOSUCHNICK": { | ||
| err = "No such nick/channel"; | ||
| const params = msg.params.split(" "); | ||
| const target = params[1]!.toLowerCase(); | ||
| const cb = irc.whoisCallbacks[target]; | ||
| if (cb) cb(err, null); | ||
| else irc.emit("whois", err, null); | ||
| break; | ||
| } | ||
| } | ||
| }); | ||
| }; | ||
| } | ||
| /** | ||
| * Fetch whois data and invoke `fn(err, data)`. | ||
| * | ||
| * @param {String} target | ||
| * @param {String} mask | ||
| * @param {Function} fn | ||
| */ | ||
| function whois( | ||
| this: IrcClient, | ||
| target: string, | ||
| mask?: string | WhoisQueryCallback, | ||
| fn?: WhoisQueryCallback, | ||
| ): void { | ||
| if (typeof mask === "function") { | ||
| fn = mask; | ||
| mask = ""; | ||
| } | ||
| target = target.toLowerCase(); | ||
| if (fn) { | ||
| this.whoisCallbacks[target] = (err: string | null | undefined, data: WhoisData | null) => { | ||
| delete this.whoisCallbacks[target]; | ||
| fn(err, data); | ||
| }; | ||
| } | ||
| this.write(["WHOIS", target, mask].filter(Boolean).join(" ")); | ||
| } |
| declare module "debug" { | ||
| type Debugger = { | ||
| (...args: unknown[]): void; | ||
| enabled: boolean; | ||
| extend(namespace: string, delimiter?: string): Debugger; | ||
| }; | ||
| export default function debug(namespace: string): Debugger; | ||
| } | ||
| declare module "irc-replies" { | ||
| const replies: Record<string, string>; | ||
| export default replies; | ||
| } | ||
| declare module "websocket-stream" { | ||
| import type { Duplex } from "node:stream"; | ||
| type WebsocketFactory = { | ||
| (target: string, protocol?: string): Duplex; | ||
| new (target: string, protocol?: string): Duplex; | ||
| }; | ||
| const websocket: WebsocketFactory; | ||
| export default websocket; | ||
| } | ||
| declare module "slate-irc" { | ||
| import type Parser from "slate-irc-parser"; | ||
| import type { | ||
| IrcClient, | ||
| IrcMessage, | ||
| IrcStream, | ||
| Plugin, | ||
| PluginFactory, | ||
| WriteCallback, | ||
| } from "./types"; | ||
| type ClientFactory = (stream: IrcStream, parser?: Parser, encoding?: BufferEncoding) => IrcClient; | ||
| const createClient: ClientFactory; | ||
| export default createClient; | ||
| export type { | ||
| ClientFactory, | ||
| IrcClient, | ||
| IrcMessage, | ||
| IrcStream, | ||
| Plugin, | ||
| PluginFactory, | ||
| WriteCallback, | ||
| }; | ||
| } |
+192
| import type { EventEmitter } from "node:events"; | ||
| import type { Duplex } from "node:stream"; | ||
| import type Parser from "slate-irc-parser"; | ||
| export interface IrcMessage { | ||
| prefix: string; | ||
| command: string; | ||
| params: string; | ||
| trailing: string; | ||
| string: string; | ||
| [key: string]: unknown; | ||
| } | ||
| export interface Hostmask { | ||
| nick: string; | ||
| username?: string; | ||
| hostname?: string; | ||
| string: string; | ||
| } | ||
| export interface NamesUser { | ||
| name: string; | ||
| mode: string; | ||
| } | ||
| export interface AwayEvent { | ||
| nick?: string | undefined; | ||
| message: string; | ||
| } | ||
| export interface ErrorEvent { | ||
| cmd: string; | ||
| message: string; | ||
| } | ||
| export interface InviteEvent { | ||
| from: string; | ||
| hostmask: Hostmask; | ||
| to: string; | ||
| channel: string; | ||
| } | ||
| export interface JoinEvent { | ||
| nick: string; | ||
| hostmask: Hostmask; | ||
| channel: string; | ||
| } | ||
| export interface KickEvent { | ||
| nick: string; | ||
| hostmask: Hostmask; | ||
| channel: string; | ||
| client: string; | ||
| message: string; | ||
| } | ||
| export interface ModeEvent { | ||
| nick: string; | ||
| target?: string | undefined; | ||
| mode: string; | ||
| client?: string | undefined; | ||
| } | ||
| export interface MotdEvent { | ||
| motd: string[]; | ||
| } | ||
| export interface NamesEvent { | ||
| channel: string; | ||
| names: NamesUser[]; | ||
| } | ||
| export interface NickEvent { | ||
| nick: string; | ||
| hostmask: Hostmask; | ||
| new: string; | ||
| } | ||
| export interface NoticeEvent { | ||
| from: string; | ||
| hostmask: Hostmask; | ||
| to: string; | ||
| message: string; | ||
| } | ||
| export interface PartEvent { | ||
| nick: string; | ||
| hostmask: Hostmask; | ||
| channels: string[]; | ||
| message: string; | ||
| } | ||
| export interface PrivmsgEvent { | ||
| from: string; | ||
| hostmask: Hostmask; | ||
| to: string; | ||
| message: string; | ||
| } | ||
| export interface QuitEvent { | ||
| nick: string; | ||
| hostmask: Hostmask; | ||
| message: string; | ||
| } | ||
| export interface TopicEvent { | ||
| nick?: string | undefined; | ||
| hostmask: Hostmask; | ||
| channel: string; | ||
| topic: string; | ||
| } | ||
| export interface WhoisData { | ||
| nickname?: string | undefined; | ||
| username?: string | undefined; | ||
| hostname?: string | undefined; | ||
| realname?: string | undefined; | ||
| channels: string[]; | ||
| oper: boolean; | ||
| server?: string | undefined; | ||
| away?: string | undefined; | ||
| idle?: string | undefined; | ||
| sign?: string | undefined; | ||
| } | ||
| export type AnyFn = (...args: unknown[]) => void; | ||
| export type NamesQueryCallback = (err: null, names: NamesUser[]) => void; | ||
| export type WhoisQueryCallback = (err: string | null | undefined, data: WhoisData | null) => void; | ||
| export type WriteCallback = (err?: Error | null) => void; | ||
| export type IrcStream = Duplex & { | ||
| setTimeout?: (ms: number) => void; | ||
| }; | ||
| export type IrcClient = EventEmitter & { | ||
| stream: IrcStream; | ||
| parser: Parser; | ||
| me?: string; | ||
| names: (channel: string, fn?: NamesQueryCallback) => void; | ||
| whois: (target: string, mask?: string | WhoisQueryCallback, fn?: WhoisQueryCallback) => void; | ||
| nameCallbacks: Record<string, ((event: NamesEvent) => void) | undefined>; | ||
| whoisCallbacks: Record<string, WhoisQueryCallback | undefined>; | ||
| writeUnsafe: (str: string, fn?: WriteCallback) => void; | ||
| write: (str: string, fn?: WriteCallback) => void; | ||
| pass: (pass: string, fn?: WriteCallback) => void; | ||
| webirc: ( | ||
| password: string, | ||
| username: string, | ||
| hostname: string, | ||
| ip: string, | ||
| fn?: WriteCallback, | ||
| ) => void; | ||
| nick: (nick: string, fn?: WriteCallback) => void; | ||
| user: (username: string, realname: string, fn?: WriteCallback) => void; | ||
| invite: (name: string, channel: string, fn?: WriteCallback) => void; | ||
| send: (target: string | string[], msg: string, fn?: WriteCallback) => void; | ||
| action: (target: string, msg: string, fn?: WriteCallback) => void; | ||
| notice: (target: string, msg: string, fn?: WriteCallback) => void; | ||
| ctcp: (target: string, msg: string, fn?: WriteCallback) => void; | ||
| join: ( | ||
| channels: string | string[], | ||
| keys?: string | string[] | WriteCallback, | ||
| fn?: WriteCallback, | ||
| ) => void; | ||
| part: (channels: string | string[], msg?: string | WriteCallback, fn?: WriteCallback) => void; | ||
| away: (msg?: string, fn?: WriteCallback) => void; | ||
| back: (fn?: WriteCallback) => void; | ||
| topic: (channel: string, topic?: string | WriteCallback, fn?: WriteCallback) => void; | ||
| kick: ( | ||
| channels: string | string[], | ||
| nicks: string | string[], | ||
| msg?: string | WriteCallback, | ||
| fn?: WriteCallback, | ||
| ) => void; | ||
| quit: (msg?: string, fn?: WriteCallback) => void; | ||
| oper: (name: string, password: string, fn?: WriteCallback) => void; | ||
| mode: ( | ||
| target: string, | ||
| flags: string, | ||
| params?: string | WriteCallback, | ||
| fn?: WriteCallback, | ||
| ) => void; | ||
| use: (fn: Plugin) => IrcClient; | ||
| onmessage: (msg: IrcMessage) => void; | ||
| }; | ||
| export type Plugin = (irc: IrcClient) => void; | ||
| export type PluginFactory = () => Plugin; |
+67
| import type { Hostmask, IrcMessage } from "./types"; | ||
| /** | ||
| * Parse channel list `str`. | ||
| * | ||
| * @param {String} str | ||
| * @return {Array} | ||
| */ | ||
| export function channelList(str: string): string[] { | ||
| return str.split(",").map((chan: string) => chan.toLowerCase()); | ||
| } | ||
| /** | ||
| * Parse nick from `msg`. | ||
| * | ||
| * @param {Object} msg | ||
| * @return {String} | ||
| */ | ||
| export function nick(msg: IrcMessage): string { | ||
| return msg.prefix.split("!")[0]!; | ||
| } | ||
| /** | ||
| * Parse hostmask from `msg`. | ||
| * | ||
| * @param {Object} msg | ||
| * @return {Object} | ||
| */ | ||
| export function hostmask(msg: IrcMessage): Hostmask { | ||
| const mask: Hostmask = { | ||
| nick: "", | ||
| string: msg.prefix, | ||
| }; | ||
| let parts = msg.prefix.split("!"); | ||
| mask.nick = parts[0]!; | ||
| try { | ||
| parts = parts[1]!.split("@"); | ||
| mask.username = parts[0]!; | ||
| mask.hostname = parts[1]!; | ||
| } catch { | ||
| // .. | ||
| } | ||
| return mask; | ||
| } | ||
| /** | ||
| * Merge the contents of two objects together into the first object. | ||
| * | ||
| * @param {Object} a | ||
| * @param {Object} b | ||
| * @return {Object} | ||
| */ | ||
| export function extend<A extends Record<string, unknown>, B extends Record<string, unknown>>( | ||
| a: A, | ||
| b: B, | ||
| ): A & B { | ||
| for (const prop in b) { | ||
| (a as Record<string, unknown>)[prop] = b[prop]; | ||
| } | ||
| return a as A & B; | ||
| } |
+2
-2
@@ -1,3 +0,3 @@ | ||
| Copyright 2013-2025 TJ Holowaychuk | ||
| Copyright 2016-2025 Hyeon Kim | ||
| Copyright 2013-2026 TJ Holowaychuk | ||
| Copyright 2016-2026 Jihyeon Kim | ||
@@ -4,0 +4,0 @@ Permission is hereby granted, free of charge, to any |
+23
-16
| { | ||
| "name": "slate-irc", | ||
| "version": "0.9.6", | ||
| "version": "0.9.7", | ||
| "description": "General purpose IRC client", | ||
| "keywords": [ | ||
| "irc", | ||
| "chat", | ||
| "client", | ||
| "chat" | ||
| "irc" | ||
| ], | ||
@@ -17,25 +17,32 @@ "homepage": "https://github.com/slate/slate-irc", | ||
| "TJ Holowaychuk <tj@apex.sh>", | ||
| "Hyeon Kim <simnalamburt@gmail.com> (https://hyeon.me)" | ||
| "Jihyeon Kim <simnalamburt@gmail.com> (https://hyeon.me)" | ||
| ], | ||
| "repository": "slate/slate-irc", | ||
| "files": [ | ||
| "src", | ||
| "dist" | ||
| ], | ||
| "type": "module", | ||
| "types": "dist/index.d.mts", | ||
| "exports": "./dist/index.mjs", | ||
| "dependencies": { | ||
| "debug": "^4.4.3", | ||
| "slate-irc-parser": "^0.1.9" | ||
| "slate-irc-parser": "^0.1.11" | ||
| }, | ||
| "devDependencies": { | ||
| "@biomejs/biome": "^2.3.11", | ||
| "irc-replies": "^2.0.1", | ||
| "microbundle": "^0.15.1", | ||
| "vitest": "^4.0.17" | ||
| "oxfmt": "^0.33.0", | ||
| "oxlint": "^1.48.0", | ||
| "tsdown": "^0.20.3", | ||
| "typedoc": "^0.28.17", | ||
| "typescript": "^5.9.3", | ||
| "vitest": "^4.0.18" | ||
| }, | ||
| "main": "dist/slate-irc.js", | ||
| "module": "dist/slate-irc.modern.mjs", | ||
| "files": [ | ||
| "dist/*" | ||
| ], | ||
| "scripts": { | ||
| "build": "microbundle -f cjs,modern --target node --compress", | ||
| "test": "vitest --run && biome format", | ||
| "fmt": "biome format --write" | ||
| "build": "tsdown", | ||
| "ci": "tsc && vitest --run && oxlint && oxfmt --check", | ||
| "doc": "typedoc", | ||
| "fix": "oxlint --fix", | ||
| "fmt": "oxfmt" | ||
| } | ||
| } |
+22
-21
@@ -1,3 +0,3 @@ | ||
| slate-irc [![version] ![downloads]][npm] | ||
| ======== | ||
| # slate-irc [![version] ![downloads]][npm] | ||
| General purpose IRC client for nodejs. See **[documentation]** for the details. | ||
@@ -13,33 +13,35 @@ | ||
| ``` | ||
| ```js | ||
| import irc from 'slate-irc' | ||
| import { connect } from 'node:tls' | ||
| import irc from "slate-irc"; | ||
| import { connect } from "node:tls"; | ||
| const stream = connect({ | ||
| port: 6697, | ||
| host: 'irc.libera.chat', | ||
| }) | ||
| host: "irc.libera.chat", | ||
| }); | ||
| const client = irc(stream) | ||
| const client = irc(stream); | ||
| // logger | ||
| client.use((irc) => { | ||
| irc.stream.pipe(process.stdout) | ||
| }) | ||
| irc.stream.pipe(process.stdout); | ||
| }); | ||
| client.pass('pass') | ||
| client.nick('tobi') | ||
| client.user('tobi', 'Tobi Ferret') | ||
| client.join('#express') | ||
| client.names('#express', (_err, names) => { | ||
| console.log(names) | ||
| }) | ||
| client.pass("pass"); | ||
| client.nick("tobi"); | ||
| client.user("tobi", "Tobi Ferret"); | ||
| client.join("#express"); | ||
| client.names("#express", (_err, names) => { | ||
| console.log(names); | ||
| }); | ||
| ``` | ||
| To see more examples, please check the [`examples`](examples) directory. | ||
| To see more examples, please check the [`examples`] directory. | ||
| | ||
| -------- | ||
| *slate-irc* is primarily distributed under the terms of the [MIT license]. See | ||
| --- | ||
| _slate-irc_ is primarily distributed under the terms of the [MIT license]. See | ||
| [COPYRIGHT] for details. | ||
@@ -50,7 +52,6 @@ | ||
| [npm]: https://npmjs.org/package/slate-irc | ||
| [documentation]: docs.md | ||
| [DEBUG]: https://github.com/visionmedia/debug | ||
| [`examples`]: https://github.com/slate/slate-irc/tree/main/examples | ||
| [MIT license]: LICENSE | ||
| [COPYRIGHT]: COPYRIGHT |
| var t=require("events"),R=require("debug"),n=require("slate-irc-parser");function e(t){return t&&"object"==typeof t&&"default"in t?t:{default:t}}var i=/*#__PURE__*/e(R),a=/*#__PURE__*/e(n),o={200:"RPL_TRACELINK",201:"RPL_TRACECONNECTING",202:"RPL_TRACEHANDSHAKE",203:"RPL_TRACEUNKNOWN",204:"RPL_TRACEOPERATOR",205:"RPL_TRACEUSER",206:"RPL_TRACESERVER",207:"RPL_TRACESERVICE",208:"RPL_TRACENEWTYPE",209:"RPL_TRACECLASS",211:"RPL_STATSLINKINFO",212:"RPL_STATSCOMMANDS",213:"RPL_STATSCLINE",214:"RPL_STATSNLINE",215:"RPL_STATSILINE",216:"RPL_STATSKLINE",217:"RPL_STATSQLINE",218:"RPL_STATSYLINE",219:"RPL_ENDOFSTATS",221:"RPL_UMODEIS",231:"RPL_SERVICEINFO",232:"RPL_ENDOFSERVICES",233:"RPL_SERVICE",234:"RPL_SERVLIST",235:"RPL_SERVLISTEND",239:"RPL_STATSIAUTH",240:"RPL_STATSVLINE",241:"RPL_STATSLLINE",242:"RPL_STATSUPTIME",243:"RPL_STATSOLINE",244:"RPL_STATSHLINE",245:"RPL_STATSSLINE",246:"RPL_STATSPING",247:"RPL_STATSBLINE",248:"RPL_STATSDEFINE",249:"RPL_STATSDEBUG",250:"RPL_STATSDLINE",251:"RPL_LUSERCLIENT",252:"RPL_LUSEROP",253:"RPL_LUSERUNKNOWN",254:"RPL_LUSERCHANNELS",255:"RPL_LUSERME",256:"RPL_ADMINME",257:"RPL_ADMINLOC1",258:"RPL_ADMINLOC2",259:"RPL_ADMINEMAIL",261:"RPL_TRACELOG",262:"RPL_TRACEEND",263:"RPL_TRYAGAIN",265:"RPL_LOCALUSERS",266:"RPL_GLOBALUSERS",300:"RPL_NONE",301:"RPL_AWAY",302:"RPL_USERHOST",303:"RPL_ISON",304:"RPL_TEXT",305:"RPL_UNAWAY",306:"RPL_NOWAWAY",311:"RPL_WHOISUSER",312:"RPL_WHOISSERVER",313:"RPL_WHOISOPERATOR",314:"RPL_WHOWASUSER",315:"RPL_ENDOFWHO",316:"RPL_WHOISCHANOP",317:"RPL_WHOISIDLE",318:"RPL_ENDOFWHOIS",319:"RPL_WHOISCHANNELS",321:"RPL_LISTSTART",322:"RPL_LIST",323:"RPL_LISTEND",324:"RPL_CHANNELMODEIS",325:"RPL_UNIQOPIS",331:"RPL_NOTOPIC",332:"RPL_TOPIC",333:"RPL_TOPIC_WHO_TIME",341:"RPL_INVITING",342:"RPL_SUMMONING",344:"RPL_REOPLIST",345:"RPL_ENDOFREOPLIST",346:"RPL_INVITELIST",347:"RPL_ENDOFINVITELIST",348:"RPL_EXCEPTLIST",349:"RPL_ENDOFEXCEPTLIST",351:"RPL_VERSION",352:"RPL_WHOREPLY",353:"RPL_NAMREPLY",361:"RPL_KILLDONE",362:"RPL_CLOSING",363:"RPL_CLOSEEND",364:"RPL_LINKS",365:"RPL_ENDOFLINKS",366:"RPL_ENDOFNAMES",367:"RPL_BANLIST",368:"RPL_ENDOFBANLIST",369:"RPL_ENDOFWHOWAS",371:"RPL_INFO",372:"RPL_MOTD",373:"RPL_INFOSTART",374:"RPL_ENDOFINFO",375:"RPL_MOTDSTART",376:"RPL_ENDOFMOTD",381:"RPL_YOUREOPER",382:"RPL_REHASHING",383:"RPL_YOURESERVICE",384:"RPL_MYPORTIS",385:"RPL_NOTOPERANYMORE",391:"RPL_TIME",392:"RPL_USERSSTART",393:"RPL_USERS",394:"RPL_ENDOFUSERS",395:"RPL_NOUSERS",401:"ERR_NOSUCHNICK",402:"ERR_NOSUCHSERVER",403:"ERR_NOSUCHCHANNEL",404:"ERR_CANNOTSENDTOCHAN",405:"ERR_TOOMANYCHANNELS",406:"ERR_WASNOSUCHNICK",407:"ERR_TOOMANYTARGETS",408:"ERR_NOSUCHSERVICE",409:"ERR_NOORIGIN",411:"ERR_NORECIPIENT",412:"ERR_NOTEXTTOSEND",413:"ERR_NOTOPLEVEL",414:"ERR_WILDTOPLEVEL",415:"ERR_BADMASK",416:"ERR_TOOMANYMATCHES",421:"ERR_UNKNOWNCOMMAND",422:"ERR_NOMOTD",423:"ERR_NOADMININFO",424:"ERR_FILEERROR",431:"ERR_NONICKNAMEGIVEN",432:"ERR_ERRONEOUSNICKNAME",433:"ERR_NICKNAMEINUSE",434:"ERR_SERVICENAMEINUSE",435:"ERR_SERVICECONFUSED",436:"ERR_NICKCOLLISION",437:"ERR_UNAVAILRESOURCE",441:"ERR_USERNOTINCHANNEL",442:"ERR_NOTONCHANNEL",443:"ERR_USERONCHANNEL",444:"ERR_NOLOGIN",445:"ERR_SUMMONDISABLED",446:"ERR_USERSDISABLED",451:"ERR_NOTREGISTERED",461:"ERR_NEEDMOREPARAMS",462:"ERR_ALREADYREGISTRED",463:"ERR_NOPERMFORHOST",464:"ERR_PASSWDMISMATCH",465:"ERR_YOUREBANNEDCREEP",466:"ERR_YOUWILLBEBANNED",467:"ERR_KEYSET",471:"ERR_CHANNELISFULL",472:"ERR_UNKNOWNMODE",473:"ERR_INVITEONLYCHAN",474:"ERR_BANNEDFROMCHAN",475:"ERR_BADCHANNELKEY",476:"ERR_BADCHANMASK",477:"ERR_NOCHANMODES",478:"ERR_BANLISTFULL",481:"ERR_NOPRIVILEGES",482:"ERR_CHANOPRIVSNEEDED",483:"ERR_CANTKILLSERVER",484:"ERR_RESTRICTED",485:"ERR_UNIQOPRIVSNEEDED",491:"ERR_NOOPERHOST",492:"ERR_NOSERVICEHOST",499:"ERR_STATSKLINE",501:"ERR_UMODEUNKNOWNFLAG",502:"ERR_USERSDONTMATCH",708:"RPL_ETRACEFULL",759:"RPL_ETRACEEND","001":"RPL_WELCOME","002":"RPL_YOURHOST","003":"RPL_CREATED","004":"RPL_MYINFO","005":"RPL_ISUPPORT","010":"RPL_BOUNCE","015":"RPL_MAP","017":"RPL_MAPEND","018":"RPL_MAPSTART","020":"RPL_HELLO","042":"RPL_YOURID","043":"RPL_SAVENICK"};function E(t){return t.prefix.split("!")[0]}function s(t){var R={},n=t.prefix.split("!");R.nick=n[0];try{n=n[1].split("@"),R.username=n[0],R.hostname=n[1]}catch(t){}return R.string=t.prefix,R}const L=i.default("slate-irc:names");function r(t,R){var n=this;t=t.toLowerCase(),R&&(this.nameCallbacks[t]=function(e){delete n.nameCallbacks[t],R(null,e.names)}),this.write("NAMES "+t)}function N(t,R,n){"function"==typeof R&&(n=R,R="");var e=this;t=t.toLowerCase(),n&&(this.whoisCallbacks[t]=function(R,i){delete e.whoisCallbacks[t],n(R,i)}),this.write(["WHOIS",t,R].filter(Boolean).join(" "))}i.default("slate-irc:whois");const _=i.default("slate-irc");function c(t,R,n){if(!(this instanceof c))return new c(t,R,n);t.setEncoding(n||"utf8"),this.stream=t,this.parser=R||new a.default,this.parser.on("message",this.onmessage.bind(this)),t.pipe(this.parser),this.setMaxListeners(100),this.use(function(t){t.on("data",function(R){if("RPL_AWAY"==R.command||"RPL_NOWAWAY"==R.command||"RPL_UNAWAY"==R.command){var n=R.params.split(" "),e={};e.nick="RPL_NOWAWAY"==R.command||"RPL_UNAWAY"==R.command?n[0]:n[1],e.message=R.trailing,t.emit("away",e)}})}),this.use(function(t){var R=t.stream;R.on("close",function(){t.emit("disconnect")}),null!=R.setTimeout&&(R.setTimeout(6e4),R.on("timeout",function(){var n=!0,e=(new Date).getTime();t.write("PING :"+e),t.once("pong",function(t){t==e&&(n=!1)}),setTimeout(function(){n&&R.destroy()},5e3)}))}),this.use(function(t){t.on("data",function(R){if(0===R.command.indexOf("ERR_")){var n={};n.cmd=R.command,n.message=R.trailing,t.emit("errors",n)}})}),this.use(function(t){t.on("data",function(R){if("INVITE"==R.command){var n={};n.from=E(R),n.hostmask=s(R),n.to=R.params.toLowerCase(),n.channel=R.trailing,t.emit("invite",n)}})}),this.use(function(t){t.on("data",function(R){if("JOIN"==R.command){var n={};n.nick=E(R),n.hostmask=s(R),n.channel=(R.params||R.trailing).toLowerCase(),t.emit("join",n)}})}),this.use(function(t){t.on("data",function(R){if("KICK"==R.command){var n={},e=R.params.split(" ");n.nick=E(R),n.hostmask=s(R),n.channel=e[0].toLowerCase(),n.client=e[1],n.message=R.trailing,t.emit("kick",n)}})}),this.use(function(t){t.on("data",function(R){if("MODE"==R.command){var n=R.params.split(" "),e={};e.nick=E(R),e.target=n[0],e.mode=n[1]||R.trailing,e.client=n[2],t.emit("mode",e)}})}),this.use(function(t){var R={motd:[]};t.on("data",function(n){switch(n.command){case"RPL_MOTDSTART":R.motd.length=0;case"RPL_ENDOFMOTD":case"RPL_MOTD":R.motd.push(n.trailing)}"RPL_ENDOFMOTD"==n.command&&t.emit("motd",R)})}),this.use(function(t){var R={};t.names=r,t.nameCallbacks={},t.on("data",function(n){switch(n.command){case"RPL_NAMREPLY":var e=n.params.split(/ [=@*] /)[1].toLowerCase(),i=n.trailing.split(" "),a=[];i.forEach(function(t){var R=t.split(/([~&@%+])/),n=R.pop(),e=R.pop();a.push({name:n,mode:e||""})}),R[e]=(R[e]||[]).concat(a),L("add %s %j",e,a);break;case"RPL_ENDOFNAMES":e=n.params.split(" ")[1].toLowerCase(),L('emit "names" for %s',e);var o={channel:e,names:R[e]||[]},E=t.nameCallbacks[e];E?E(o):t.emit("names",o),delete R[e]}})}),this.use(function(t){t.on("data",function(R){if("NICK"==R.command){var n={};n.nick=E(R),n.hostmask=s(R),n.new=R.trailing,n.new||(n.new=R.params),n.nick==t.me&&(t.me=n.new),t.emit("nick",n)}})}),this.use(function(t){t.on("data",function(R){if("NOTICE"==R.command){var n={};n.from=E(R),n.hostmask=s(R),n.to=R.params.toLowerCase(),n.message=R.trailing,t.emit("notice",n)}})}),this.use(function(t){t.on("data",function(R){if("PART"==R.command){var n={};n.nick=E(R),n.hostmask=s(R),n.channels=R.params.split(",").map(function(t){return t.toLowerCase()}),n.message=R.trailing,t.emit("part",n)}})}),this.use(function(t){t.on("data",function(R){"PONG"==R.command&&t.emit("pong",R.trailing),"PING"==R.command&&t.write("PONG :"+R.trailing)})}),this.use(function(t){t.on("data",function(R){if("PRIVMSG"==R.command){var n={};n.from=E(R),n.hostmask=s(R),n.to=R.params.toLowerCase(),n.message=R.trailing,t.emit("message",n)}})}),this.use(function(t){t.on("data",function(R){if("QUIT"==R.command){var n={};n.nick=E(R),n.hostmask=s(R),n.message=R.trailing,t.emit("quit",n)}})}),this.use(function(t){var R;t.on("data",function(n){switch(n.command){case"RPL_NOTOPIC":case"RPL_TOPIC":R=n.params.split(" ")[1];break;case"TOPIC":R=n.params;break;default:return}var e={};"TOPIC"==n.command&&(e.nick=E(n)),e.hostmask=s(n),e.channel=R.toLowerCase(),e.topic=n.trailing,t.emit("topic",e)})}),this.use(function(t){t.on("data",function(R){"RPL_WELCOME"==R.command&&(t.me=R.params,t.emit("welcome",t.me))})}),this.use(function(t){var R={};t.whois=N,t.whoisCallbacks={},t.on("data",function(n){switch(n.command){case"RPL_WHOISUSER":var e=(o=n.params.split(" "))[1].toLowerCase();R[e]=R[e]||{},R[e].nickname=o[1],R[e].username=o[2],R[e].hostname=o[3],R[e].realname=n.trailing,R[e].channels=[],R[e].oper=!1;break;case"RPL_WHOISCHANNELS":e=(o=n.params.split(" "))[1].toLowerCase();var i=n.trailing.split(" ");R[e].channels=R[e].channels.concat(i);break;case"RPL_WHOISSERVER":e=(o=n.params.split(" "))[1].toLowerCase(),R[e].server=o[2];break;case"RPL_AWAY":if(e=(o=n.params.split(" "))[1].toLowerCase(),!R[e])return;R[e].away=n.trailing;break;case"RPL_WHOISOPERATOR":e=(o=n.params.split(" "))[1].toLowerCase(),R[e].oper=!0;break;case"RPL_WHOISIDLE":e=(o=n.params.split(" "))[1].toLowerCase(),R[e].idle=o[2],R[e].sign=o[3];break;case"RPL_ENDOFWHOIS":if(e=(o=n.params.split(" "))[1].toLowerCase(),!R[e])return;(E=t.whoisCallbacks[e])?E(a,R[e]):t.emit("whois",null,R[e]),R={};break;case"ERR_NEEDMOREPARAMS":var a="Not enough parameters";if("whois"!==(e=(o=n.params.split(" "))[1].toLowerCase()))return;(E=t.whoisCallbacks[e])?E(a,null):t.emit("whois",a,null);break;case"ERR_NOSUCHSERVER":a="No such server",e=(o=n.params.split(" "))[1].toLowerCase(),(E=t.whoisCallbacks[e])?E(a,null):t.emit("whois",a,null);break;case"ERR_NOSUCHNICK":var o,E;a="No such nick/channel",e=(o=n.params.split(" "))[1].toLowerCase(),(E=t.whoisCallbacks[e])?E(a,null):t.emit("whois",a,null)}})})}function P(t){return Array.isArray(t)?t:[t]}c.prototype.__proto__=t.EventEmitter.prototype,c.prototype.writeUnsafe=function(t,R){this.stream.write(t+"\r\n",R)},c.prototype.write=function(t,R){-1==t.indexOf("\n")&&-1==t.indexOf("\r")?this.writeUnsafe(t,R):R&&R(new Error("The parameter to write() must not contain any '\\n' or '\\r'."))},c.prototype.pass=function(t,R){this.write("PASS "+t,R)},c.prototype.webirc=function(t,R,n,e,i){var a=[t,R,n,e].join(" ");this.write("WEBIRC "+a,i)},c.prototype.nick=function(t,R){this.write("NICK "+t,R)},c.prototype.user=function(t,R,n){this.write("USER "+t+" 0 * :"+R,n)},c.prototype.invite=function(t,R,n){this.write("INVITE "+t+" "+R,n)},c.prototype.send=function(t,R,n){this.write("PRIVMSG "+P(t).join(",")+" :"+R,n)},c.prototype.action=function(t,R,n){this.send(t,"ACTION "+R+"",n)},c.prototype.notice=function(t,R,n){this.write("NOTICE "+t+" :"+R,n)},c.prototype.ctcp=function(t,R,n){this.notice(t,""+R+"",n)},c.prototype.join=function(t,R,n){"function"==typeof R&&(n=R,R=""),this.write("JOIN "+P(t).join(",")+" "+P(R).join(","),n)},c.prototype.part=function(t,R,n){"function"==typeof R&&(n=R,R="");var e="PART "+P(t).join(",");R&&(e+=" :"+R),this.write(e,n)},c.prototype.away=function(t,R){this.write("AWAY :"+(t=t||"Talk to you later!"),R)},c.prototype.back=function(t){this.write("AWAY",t)},c.prototype.topic=function(t,R,n){"function"==typeof R&&(n=R,R=""),R&&(R=" :"+R),this.write("TOPIC "+t+R,n)},c.prototype.kick=function(t,R,n,e){"function"==typeof n&&(e=n,n="");var i="KICK "+P(t).join(",")+" "+P(R).join(",");n&&(i+=" :"+n),this.write(i,e)},c.prototype.quit=function(t,R){this.write("QUIT :"+(t=t||"Bye!"),R)},c.prototype.oper=function(t,R,n){this.write("OPER "+t+" "+R,n)},c.prototype.mode=function(t,R,n,e){"function"==typeof n&&(e=n,n=""),this.write(n?"MODE "+t+" "+R+" "+n:"MODE "+t+" "+R,e)},c.prototype.use=function(t){return t(this),this},c.prototype.onmessage=function(t){t.command=o[t.command]||t.command,_("message %s %s",t.command,t.string),this.emit("data",t)},module.exports=c; | ||
| //# sourceMappingURL=slate-irc.js.map |
| {"version":3,"file":"slate-irc.js","sources":["../lib/utils.js","../lib/plugins/names.js","../lib/plugins/whois.js","../index.js","../lib/plugins/away.js","../lib/plugins/disconnect.js","../lib/plugins/errors.js","../lib/plugins/invite.js","../lib/plugins/join.js","../lib/plugins/kick.js","../lib/plugins/mode.js","../lib/plugins/motd.js","../lib/plugins/nick.js","../lib/plugins/notice.js","../lib/plugins/part.js","../lib/plugins/pong.js","../lib/plugins/privmsg.js","../lib/plugins/quit.js","../lib/plugins/topic.js","../lib/plugins/welcome.js"],"sourcesContent":["/**\n * Parse channel list `str`.\n *\n * @param {String} str\n * @return {Array}\n * @api public\n */\n\nexport function channelList(str) {\n return str.split(',').map(function (chan) {\n return chan.toLowerCase()\n })\n}\n\n/**\n * Parse nick from `msg`.\n *\n * @param {Object} msg\n * @return {String}\n * @api public\n */\n\nexport function nick(msg) {\n return msg.prefix.split('!')[0]\n}\n\n/**\n * Parse hostmask from `msg`.\n *\n * @param {Object} msg\n * @return {Object}\n * @api public\n */\n\nexport function hostmask(msg) {\n var hostmask = {}\n var parts = msg.prefix.split('!')\n hostmask.nick = parts[0]\n\n try {\n parts = parts[1].split('@')\n hostmask.username = parts[0]\n hostmask.hostname = parts[1]\n } catch (e) {\n // ..\n }\n\n hostmask.string = msg.prefix\n return hostmask\n}\n\n/**\n * Merge the contents of two objects together into the first object.\n *\n * @param {Object} a\n * @param {Object} b\n * @return {Object}\n * @api public\n */\n\nexport function extend(a, b) {\n for (var prop in b) {\n a[prop] = b[prop]\n }\n return a\n}\n","/**\n * Module dependencies.\n */\n\nimport debugModule from 'debug'\nimport * as utils from '../utils'\n\nconst debug = debugModule('slate-irc:names')\n\n/**\n * NAMES plugin to emit `name event`.\n *\n * @return {Function}\n * @api public\n */\n\nexport default function () {\n return function (irc) {\n var map = {}\n irc.names = names\n irc.nameCallbacks = {}\n\n irc.on('data', function (msg) {\n switch (msg.command) {\n case 'RPL_NAMREPLY':\n var chan = msg.params.split(/ [=@*] /)[1].toLowerCase()\n var names = msg.trailing.split(' ')\n var users = []\n\n names.forEach(function (n) {\n var user = n.split(/([~&@%+])/)\n var name = user.pop()\n var mode = user.pop()\n users.push({ name: name, mode: mode || '' })\n })\n\n map[chan] = (map[chan] || []).concat(users)\n debug('add %s %j', chan, users)\n break\n\n case 'RPL_ENDOFNAMES':\n var chan = msg.params.split(' ')[1].toLowerCase()\n debug('emit \"names\" for %s', chan)\n var e = { channel: chan, names: map[chan] || [] }\n var cb = irc.nameCallbacks[chan]\n\n if (cb) cb(e)\n else irc.emit('names', e)\n\n delete map[chan]\n break\n }\n })\n }\n}\n\n/**\n * Fetch names for `channel` and invoke `fn(err, names)`.\n *\n * @param {String} channel\n * @param {Function} fn\n * @api public\n */\n\nfunction names(channel, fn) {\n var self = this\n channel = channel.toLowerCase()\n\n if (fn) {\n this.nameCallbacks[channel] = function (e) {\n delete self.nameCallbacks[channel]\n fn(null, e.names)\n }\n }\n\n this.write('NAMES ' + channel)\n}\n","/**\n * Module dependencies.\n */\n\nimport debugModule from 'debug'\nimport * as utils from '../utils'\n\nconst debug = debugModule('slate-irc:whois')\n\n/**\n * WHOIS plugin to emit \"whois\" events.\n *\n * @return {Function}\n * @api public\n */\n\nexport default function () {\n return function (irc) {\n var map = {}\n irc.whois = whois\n irc.whoisCallbacks = {}\n\n irc.on('data', function (msg) {\n switch (msg.command) {\n case 'RPL_WHOISUSER':\n var params = msg.params.split(' ')\n var target = params[1].toLowerCase()\n map[target] = map[target] || {}\n map[target].nickname = params[1]\n map[target].username = params[2]\n map[target].hostname = params[3]\n map[target].realname = msg.trailing\n map[target].channels = []\n map[target].oper = false\n break\n case 'RPL_WHOISCHANNELS':\n var params = msg.params.split(' ')\n var target = params[1].toLowerCase()\n var channels = msg.trailing.split(' ')\n map[target].channels = map[target].channels.concat(channels)\n break\n case 'RPL_WHOISSERVER':\n var params = msg.params.split(' ')\n var target = params[1].toLowerCase()\n map[target].server = params[2]\n break\n case 'RPL_AWAY':\n var params = msg.params.split(' ')\n var target = params[1].toLowerCase()\n if (!map[target]) return\n map[target].away = msg.trailing\n break\n case 'RPL_WHOISOPERATOR':\n var params = msg.params.split(' ')\n var target = params[1].toLowerCase()\n map[target].oper = true\n break\n case 'RPL_WHOISIDLE':\n var params = msg.params.split(' ')\n var target = params[1].toLowerCase()\n map[target].idle = params[2] // new Date(now - (n * 1000))\n map[target].sign = params[3] // new Date(n * 1000)\n break\n case 'RPL_ENDOFWHOIS':\n var params = msg.params.split(' ')\n var target = params[1].toLowerCase()\n if (!map[target]) return\n var cb = irc.whoisCallbacks[target]\n if (cb) cb(err, map[target])\n else irc.emit('whois', null, map[target])\n map = {}\n break\n case 'ERR_NEEDMOREPARAMS':\n var err = 'Not enough parameters'\n var params = msg.params.split(' ')\n var target = params[1].toLowerCase()\n if (target !== 'whois') return\n var cb = irc.whoisCallbacks[target]\n if (cb) cb(err, null)\n else irc.emit('whois', err, null)\n break\n case 'ERR_NOSUCHSERVER':\n var err = 'No such server'\n var params = msg.params.split(' ')\n var target = params[1].toLowerCase()\n var cb = irc.whoisCallbacks[target]\n if (cb) cb(err, null)\n else irc.emit('whois', err, null)\n break\n case 'ERR_NOSUCHNICK':\n var err = 'No such nick/channel'\n var params = msg.params.split(' ')\n var target = params[1].toLowerCase()\n var cb = irc.whoisCallbacks[target]\n if (cb) cb(err, null)\n else irc.emit('whois', err, null)\n break\n }\n })\n }\n}\n\n/**\n * Fetch whois data and invoke `fn(err, data)`.\n *\n * @param {String} target\n * @param {String} mask\n * @param {Function} fn\n * @api public\n */\n\nfunction whois(target, mask, fn) {\n if ('function' == typeof mask) {\n fn = mask\n mask = ''\n }\n\n var self = this\n target = target.toLowerCase()\n\n if (fn) {\n this.whoisCallbacks[target] = function (err, data) {\n delete self.whoisCallbacks[target]\n fn(err, data)\n }\n }\n\n this.write(['WHOIS', target, mask].filter(Boolean).join(' '))\n}\n","/**\n * Module dependencies.\n */\n\nimport { EventEmitter as Emitter } from 'events'\nimport debugModule from 'debug'\nimport Parser from 'slate-irc-parser'\nimport replies from 'irc-replies'\n\nconst debug = debugModule('slate-irc')\n\n/**\n * Core plugins.\n */\n\nimport away from './lib/plugins/away'\nimport disconnect from './lib/plugins/disconnect'\nimport errors from './lib/plugins/errors'\nimport invite from './lib/plugins/invite'\nimport join from './lib/plugins/join'\nimport kick from './lib/plugins/kick'\nimport mode from './lib/plugins/mode'\nimport motd from './lib/plugins/motd'\nimport names from './lib/plugins/names'\nimport nick from './lib/plugins/nick'\nimport notice from './lib/plugins/notice'\nimport part from './lib/plugins/part'\nimport pong from './lib/plugins/pong'\nimport privmsg from './lib/plugins/privmsg'\nimport quit from './lib/plugins/quit'\nimport topic from './lib/plugins/topic'\nimport welcome from './lib/plugins/welcome'\nimport whois from './lib/plugins/whois'\n\n/**\n * Initialize a new IRC client with the\n * given duplex `stream`.\n *\n * @param {Stream} stream\n * @param {Parser} [parser]\n * @param {String} [encoding]\n * @api public\n */\n\nexport default function Client(stream, parser, encoding) {\n if (!(this instanceof Client)) return new Client(stream, parser, encoding)\n stream.setEncoding(encoding || 'utf8')\n this.stream = stream\n this.parser = parser || new Parser()\n this.parser.on('message', this.onmessage.bind(this))\n stream.pipe(this.parser)\n this.setMaxListeners(100)\n this.use(away())\n this.use(disconnect())\n this.use(errors())\n this.use(invite())\n this.use(join())\n this.use(kick())\n this.use(mode())\n this.use(motd())\n this.use(names())\n this.use(nick())\n this.use(notice())\n this.use(part())\n this.use(pong())\n this.use(privmsg())\n this.use(quit())\n this.use(topic())\n this.use(welcome())\n this.use(whois())\n}\n\n/**\n * Inherit from `Emitter.prototype`.\n */\n\nClient.prototype.__proto__ = Emitter.prototype\n\n/**\n * Write `str` without checking for '\\r' or '\\n' and invoke `fn(err)`.\n *\n * @param {String} str\n * @param {Function} [fn]\n * @api public\n */\n\nClient.prototype.writeUnsafe = function (str, fn) {\n this.stream.write(str + '\\r\\n', fn)\n}\n\n/**\n * Write `str` and invoke `fn(err)`.\n *\n * @param {String} str\n * @param {Function} [fn]\n * @api public\n */\n\nClient.prototype.write = function (str, fn) {\n if (str.indexOf('\\n') != -1 || str.indexOf('\\r') != -1) {\n fn &&\n fn(\n new Error(\n \"The parameter to write() must not contain any '\\\\n' or '\\\\r'.\",\n ),\n )\n return\n }\n this.writeUnsafe(str, fn)\n}\n\n/**\n * PASS <pass>\n *\n * @param {String} pass\n * @param {Function} [fn]\n * @api public\n */\n\nClient.prototype.pass = function (pass, fn) {\n this.write('PASS ' + pass, fn)\n}\n\n/**\n * WEBIRC <password> <username> <hostname> <ip>\n * See https://www.irc.wiki/WebIRC\n *\n * @param {String} password\n * @param {String} username\n * @param {String} hostname\n * @param {String} ip\n * @param {Function} [fn]\n * @api public\n */\n\nClient.prototype.webirc = function (password, username, hostname, ip, fn) {\n var message = [password, username, hostname, ip].join(' ')\n this.write('WEBIRC ' + message, fn)\n}\n\n/**\n * NICK <nick>\n *\n * @param {String} nick\n * @param {Function} [fn]\n * @api public\n */\n\nClient.prototype.nick = function (nick, fn) {\n this.write('NICK ' + nick, fn)\n}\n\n/**\n * USER <username> <realname>\n *\n * @param {String} username\n * @param {String} realname\n * @param {Function} [fn]\n * @api public\n */\n\nClient.prototype.user = function (username, realname, fn) {\n this.write('USER ' + username + ' 0 * :' + realname, fn)\n}\n\n/**\n * Send an invite to `name`, for a `channel`.\n *\n * @param {String} name\n * @param {String} channel\n * @param {Function} [fn]\n * @api public\n */\n\nClient.prototype.invite = function (name, channel, fn) {\n this.write('INVITE ' + name + ' ' + channel, fn)\n}\n\n/**\n * Send `msg` to `target`, where `target`\n * is a channel or user name.\n *\n * @param {String|Array} target\n * @param {String} msg\n * @param {Function} [fn]\n * @api public\n */\n\nClient.prototype.send = function (target, msg, fn) {\n this.write('PRIVMSG ' + toArray(target).join(',') + ' :' + msg, fn)\n}\n\n/**\n * Send `msg` to `target` as an ACTION, where `target`\n * is a channel or user name.\n *\n * An action is a PRIVMSG with a syntax\n * like this:\n *\n * PRIVMSG <target> :\\u0001ACTION <msg>\\u0001\n *\n * @param {String} target\n * @param {String} msg\n * @param {Function} [fn]\n * @api public\n */\n\nClient.prototype.action = function (target, msg, fn) {\n this.send(target, '\\u0001' + 'ACTION ' + msg + '\\u0001', fn)\n}\n\n/**\n * Send `msg` to `target` as a NOTICE, where `target`\n * is a channel or user name.\n *\n * @param {String} target\n * @param {String} msg\n * @param {Function} [fn]\n * @api public\n */\n\nClient.prototype.notice = function (target, msg, fn) {\n this.write('NOTICE ' + target + ' :' + msg, fn)\n}\n\n/**\n * Send `msg` to `target` as a CTCP notice, where `target`\n * is a user name.\n *\n * @param {String} target\n * @param {String} msg\n * @param {Function} [fn]\n * @api public\n */\n\nClient.prototype.ctcp = function (target, msg, fn) {\n this.notice(target, '\\x01' + msg + '\\x01', fn)\n}\n\n/**\n * Join channel(s).\n *\n * @param {String|Array} channels\n * @param {String|Array|Function} [keys or fn]\n * @param {Function} [fn]\n * @api public\n */\n\nClient.prototype.join = function (channels, keys, fn) {\n if ('function' == typeof keys) {\n fn = keys\n keys = ''\n }\n\n this.write(\n 'JOIN ' + toArray(channels).join(',') + ' ' + toArray(keys).join(','),\n fn,\n )\n}\n\n/**\n * Leave channel(s) with optional `msg`.\n *\n * @param {String|Array} channels\n * @param {String|Function} [msg or fn]\n * @param {Function} [fn]\n * @api public\n */\n\nClient.prototype.part = function (channels, msg, fn) {\n if ('function' == typeof msg) {\n fn = msg\n msg = ''\n }\n\n var part = 'PART ' + toArray(channels).join(',')\n\n if (msg) {\n part += ' :' + msg\n }\n\n this.write(part, fn)\n}\n\n/**\n * Set the user's away message\n *\n * @param {String} [msg = 'Talk to you later!']\n * @param {Function} [fn]\n * @api public\n */\n\nClient.prototype.away = function (msg, fn) {\n msg = msg || 'Talk to you later!'\n this.write('AWAY :' + msg, fn)\n}\n\n/**\n * Remove user's away message\n *\n * @param {Function} [fn]\n * @api public\n */\n\nClient.prototype.back = function (fn) {\n this.write('AWAY', fn)\n}\n\n/**\n * Get channel topic or set the topic to `topic`.\n *\n * @param {String} channel\n * @param {String|Function} [topic or fn]\n * @param {Function} [fn]\n * @api public\n */\n\nClient.prototype.topic = function (channel, topic, fn) {\n if ('function' == typeof topic) {\n fn = topic\n topic = ''\n }\n\n if (topic) {\n topic = ' :' + topic\n }\n\n this.write('TOPIC ' + channel + topic, fn)\n}\n\n/**\n * Kick nick(s) from channel(s) with optional `msg`.\n *\n * @param {String|Array} channels\n * @param {String|Array} nicks\n * @param {String|Function} [msg or fn]\n * @param {Function} [fn]\n * @api public\n */\n\nClient.prototype.kick = function (channels, nicks, msg, fn) {\n if ('function' == typeof msg) {\n fn = msg\n msg = ''\n }\n\n var kick =\n 'KICK ' + toArray(channels).join(',') + ' ' + toArray(nicks).join(',')\n\n if (msg) {\n kick += ' :' + msg\n }\n\n this.write(kick, fn)\n}\n\n/**\n * Disconnect from the server with `msg`.\n *\n * @param {String} [msg]\n * @param {Function} [fn]\n * @api public\n */\n\nClient.prototype.quit = function (msg, fn) {\n msg = msg || 'Bye!'\n this.write('QUIT :' + msg, fn)\n}\n\n/**\n * Used to obtain operator privileges.\n * The combination of `name` and `password` are required\n * to gain Operator privileges. Upon success, a `'mode'`\n * event will be emitted.\n *\n * @param {String} name\n * @param {String} password\n * @param {Function} [fn]\n * @api public\n */\n\nClient.prototype.oper = function (name, password, fn) {\n this.write('OPER ' + name + ' ' + password, fn)\n}\n\n/**\n * Used to set a user's mode or channel's mode for a user;\n *\n * @param {String} [nick or channel]\n * @param {String} flags\n * @param {String} params [nick - if setting channel mode]\n * @param {Function} [fn]\n * @api public\n */\n\nClient.prototype.mode = function (target, flags, params, fn) {\n if ('function' === typeof params) {\n fn = params\n params = ''\n }\n if (params) {\n this.write('MODE ' + target + ' ' + flags + ' ' + params, fn)\n } else {\n this.write('MODE ' + target + ' ' + flags, fn)\n }\n}\n\n/**\n * Use the given plugin `fn`.\n *\n * @param {Function} fn\n * @return {Client} self\n * @api public\n */\n\nClient.prototype.use = function (fn) {\n fn(this)\n return this\n}\n\n/**\n * Handle messages.\n *\n * Emit \"message\" (msg).\n *\n * @api private\n */\n\nClient.prototype.onmessage = function (msg) {\n msg.command = replies[msg.command] || msg.command\n debug('message %s %s', msg.command, msg.string)\n this.emit('data', msg)\n}\n\n/**\n * Array helper.\n */\n\nfunction toArray(val) {\n return Array.isArray(val) ? val : [val]\n}\n","/*\n * Module dependencies.\n */\n\nimport * as utils from '../utils'\n\n/**\n * AWAY plugin to emit \"away\" events.\n *\n * @return {Function}\n * @api public\n */\n\nexport default function () {\n return function (irc) {\n irc.on('data', function (msg) {\n if (\n 'RPL_AWAY' != msg.command &&\n 'RPL_NOWAWAY' != msg.command &&\n 'RPL_UNAWAY' != msg.command\n )\n return\n var params = msg.params.split(' ')\n var e = {}\n if ('RPL_NOWAWAY' == msg.command || 'RPL_UNAWAY' == msg.command) {\n e.nick = params[0]\n } else {\n e.nick = params[1]\n }\n e.message = msg.trailing\n irc.emit('away', e)\n })\n }\n}\n","/**\n * DISCONNECT plugin to emit \"disconnect\" events.\n *\n * @return {Function}\n * @api public\n */\n\nexport default function () {\n return function (irc) {\n var stream = irc.stream\n var ms = 60 * 1000\n\n stream.on('close', function () {\n irc.emit('disconnect')\n })\n\n // Do nothing when given stream cannot perform setTimeout() operation\n if (stream.setTimeout == null) {\n return\n }\n\n stream.setTimeout(ms)\n\n stream.on('timeout', function () {\n var timeout = true\n var time = new Date().getTime()\n\n irc.write('PING :' + time)\n\n irc.once('pong', function (res) {\n if (res == time) {\n timeout = false\n }\n })\n\n setTimeout(function () {\n if (timeout) {\n stream.destroy()\n }\n }, 5000)\n })\n }\n}\n","/**\n * ERRORS plugin to emit \"errors\" events.\n *\n * List of possible errors:\n * https://github.com/williamwicks/irc-replies/blob/master/replies.json#L113-L170\n *\n * @return {Function}\n * @api public\n */\n\nexport default function () {\n return function (irc) {\n irc.on('data', function (msg) {\n if (msg.command.indexOf('ERR_') !== 0) return\n var e = {}\n e.cmd = msg.command\n e.message = msg.trailing\n irc.emit('errors', e)\n })\n }\n}\n","/**\n * Module dependencies.\n */\n\nimport * as utils from '../utils'\n\n/**\n * INVITE plugin to emit \"invite\" events.\n *\n * @return {Function}\n * @api public\n */\n\nexport default function () {\n return function (irc) {\n irc.on('data', function (msg) {\n if ('INVITE' != msg.command) return\n var e = {}\n e.from = utils.nick(msg)\n e.hostmask = utils.hostmask(msg)\n e.to = msg.params.toLowerCase()\n e.channel = msg.trailing\n irc.emit('invite', e)\n })\n }\n}\n","/**\n * Module dependencies.\n */\n\nimport * as utils from '../utils'\n\n/**\n * JOIN plugin to emit \"join\" events.\n *\n * @return {Function}\n * @api public\n */\n\nexport default function () {\n return function (irc) {\n irc.on('data', function (msg) {\n if ('JOIN' != msg.command) return\n var e = {}\n e.nick = utils.nick(msg)\n e.hostmask = utils.hostmask(msg)\n e.channel = (msg.params || msg.trailing).toLowerCase()\n irc.emit('join', e)\n })\n }\n}\n","/**\n * Module dependencies.\n */\n\nimport * as utils from '../utils'\n\n/**\n * KICK plugin to emit \"kick\" events.\n *\n * @return {Function}\n * @api public\n */\n\nexport default function () {\n return function (irc) {\n irc.on('data', function (msg) {\n if ('KICK' != msg.command) return\n var e = {}\n var params = msg.params.split(' ')\n e.nick = utils.nick(msg)\n e.hostmask = utils.hostmask(msg)\n e.channel = params[0].toLowerCase()\n e.client = params[1]\n e.message = msg.trailing\n irc.emit('kick', e)\n })\n }\n}\n","/**\n * Module dependencies.\n */\n\nimport * as utils from '../utils'\n\n/**\n * MODE plugin to emit \"mode\" events.\n *\n * @return {Function}\n * @api public\n */\n\nexport default function () {\n return function (irc) {\n irc.on('data', function (msg) {\n if ('MODE' != msg.command) return\n var params = msg.params.split(' ')\n var e = {}\n e.nick = utils.nick(msg)\n e.target = params[0]\n e.mode = params[1] || msg.trailing\n e.client = params[2]\n irc.emit('mode', e)\n })\n }\n}\n","/**\n * MOTD plugin to emit \"motd\" events.\n *\n * @return {Function}\n * @api public\n */\n\nexport default function () {\n return function (irc) {\n var e = {}\n e.motd = []\n\n irc.on('data', function (msg) {\n switch (msg.command) {\n case 'RPL_MOTDSTART':\n e.motd.length = 0\n case 'RPL_ENDOFMOTD':\n case 'RPL_MOTD':\n e.motd.push(msg.trailing)\n break\n }\n\n if (msg.command == 'RPL_ENDOFMOTD') {\n irc.emit('motd', e)\n }\n })\n }\n}\n","/**\n * Module dependencies.\n */\n\nimport * as utils from '../utils'\n\n/**\n * NICK plugin to emit \"nick\" events.\n *\n * @return {Function}\n * @api public\n */\n\nexport default function () {\n return function (irc) {\n irc.on('data', function (msg) {\n if ('NICK' != msg.command) return\n var e = {}\n e.nick = utils.nick(msg)\n e.hostmask = utils.hostmask(msg)\n e.new = msg.trailing\n if (!e.new) e.new = msg.params\n if (e.nick == irc.me) irc.me = e.new\n irc.emit('nick', e)\n })\n }\n}\n","/**\n * Module dependencies.\n */\n\nimport * as utils from '../utils'\n\n/**\n * NOTICE plugin to emit \"notice\" events.\n *\n * @return {Function}\n * @api public\n */\n\nexport default function () {\n return function (irc) {\n irc.on('data', function (msg) {\n if ('NOTICE' != msg.command) return\n var e = {}\n e.from = utils.nick(msg)\n e.hostmask = utils.hostmask(msg)\n e.to = msg.params.toLowerCase()\n e.message = msg.trailing\n irc.emit('notice', e)\n })\n }\n}\n","/**\n * Module dependencies.\n */\n\nimport * as utils from '../utils'\n\n/**\n * PART plugin to emit \"part\" events.\n *\n * @return {Function}\n * @api public\n */\n\nexport default function () {\n return function (irc) {\n irc.on('data', function (msg) {\n if ('PART' != msg.command) return\n var e = {}\n e.nick = utils.nick(msg)\n e.hostmask = utils.hostmask(msg)\n e.channels = utils.channelList(msg.params)\n e.message = msg.trailing\n irc.emit('part', e)\n })\n }\n}\n","/**\n * PONG plugin to reply to PING events.\n *\n * @return {Function}\n * @api public\n */\n\nexport default function () {\n return function (irc) {\n irc.on('data', function (msg) {\n if ('PONG' == msg.command) irc.emit('pong', msg.trailing)\n if ('PING' != msg.command) return\n irc.write('PONG :' + msg.trailing)\n })\n }\n}\n","/**\n * Module dependencies.\n */\n\nimport * as utils from '../utils'\n\n/**\n * PRIVMSG plugin to emit \"message\" events.\n *\n * @return {Function}\n * @api public\n */\n\nexport default function () {\n return function (irc) {\n irc.on('data', function (msg) {\n if ('PRIVMSG' != msg.command) return\n var e = {}\n e.from = utils.nick(msg)\n e.hostmask = utils.hostmask(msg)\n e.to = msg.params.toLowerCase()\n e.message = msg.trailing\n irc.emit('message', e)\n })\n }\n}\n","/**\n * Module dependencies.\n */\n\nimport * as utils from '../utils'\n\n/**\n * QUIT plugin to emit \"quit\" events.\n *\n * @return {Function}\n * @api public\n */\n\nexport default function () {\n return function (irc) {\n irc.on('data', function (msg) {\n if ('QUIT' != msg.command) return\n var e = {}\n e.nick = utils.nick(msg)\n e.hostmask = utils.hostmask(msg)\n e.message = msg.trailing\n irc.emit('quit', e)\n })\n }\n}\n","/**\n * Module dependencies.\n */\n\nimport * as utils from '../utils'\n\n/**\n * TOPIC plugin to emit \"topic\" events.\n *\n * @return {Function}\n * @api public\n */\n\nexport default function () {\n return function (irc) {\n var channel\n irc.on('data', function (msg) {\n switch (msg.command) {\n case 'RPL_NOTOPIC':\n case 'RPL_TOPIC':\n channel = msg.params.split(' ')[1]\n break\n\n case 'TOPIC':\n channel = msg.params\n break\n\n default:\n return\n }\n\n var e = {}\n if ('TOPIC' == msg.command) e.nick = utils.nick(msg)\n e.hostmask = utils.hostmask(msg)\n e.channel = channel.toLowerCase()\n e.topic = msg.trailing\n irc.emit('topic', e)\n })\n }\n}\n","/**\n * RPL_WELCOME plugin to set `irc.me`.\n *\n * @return {Function}\n * @api public\n */\n\nexport default function () {\n return function (irc) {\n irc.on('data', function (msg) {\n if ('RPL_WELCOME' != msg.command) return\n irc.me = msg.params\n irc.emit('welcome', irc.me)\n })\n }\n}\n"],"names":["nick","msg","prefix","split","hostmask","parts","username","hostname","e","string","debug","debugModule","names","channel","fn","self","this","toLowerCase","nameCallbacks","write","whois","target","mask","whoisCallbacks","err","data","filter","Boolean","join","Client","stream","parser","encoding","setEncoding","Parser","on","onmessage","bind","pipe","setMaxListeners","use","irc","command","params","message","trailing","emit","setTimeout","timeout","time","Date","getTime","once","res","destroy","indexOf","cmd","from","utils","to","client","mode","motd","length","push","map","chan","users","forEach","n","user","name","pop","concat","cb","new","me","channels","topic","nickname","realname","oper","server","away","idle","sign","toArray","val","Array","isArray","prototype","__proto__","Emitter","EventEmitter","writeUnsafe","str","Error","pass","webirc","password","ip","invite","send","action","notice","ctcp","keys","part","back","kick","nicks","quit","flags","replies"],"mappings":"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"} |
| import{EventEmitter as t}from"events";import R from"debug";import n from"slate-irc-parser";var i={200:"RPL_TRACELINK",201:"RPL_TRACECONNECTING",202:"RPL_TRACEHANDSHAKE",203:"RPL_TRACEUNKNOWN",204:"RPL_TRACEOPERATOR",205:"RPL_TRACEUSER",206:"RPL_TRACESERVER",207:"RPL_TRACESERVICE",208:"RPL_TRACENEWTYPE",209:"RPL_TRACECLASS",211:"RPL_STATSLINKINFO",212:"RPL_STATSCOMMANDS",213:"RPL_STATSCLINE",214:"RPL_STATSNLINE",215:"RPL_STATSILINE",216:"RPL_STATSKLINE",217:"RPL_STATSQLINE",218:"RPL_STATSYLINE",219:"RPL_ENDOFSTATS",221:"RPL_UMODEIS",231:"RPL_SERVICEINFO",232:"RPL_ENDOFSERVICES",233:"RPL_SERVICE",234:"RPL_SERVLIST",235:"RPL_SERVLISTEND",239:"RPL_STATSIAUTH",240:"RPL_STATSVLINE",241:"RPL_STATSLLINE",242:"RPL_STATSUPTIME",243:"RPL_STATSOLINE",244:"RPL_STATSHLINE",245:"RPL_STATSSLINE",246:"RPL_STATSPING",247:"RPL_STATSBLINE",248:"RPL_STATSDEFINE",249:"RPL_STATSDEBUG",250:"RPL_STATSDLINE",251:"RPL_LUSERCLIENT",252:"RPL_LUSEROP",253:"RPL_LUSERUNKNOWN",254:"RPL_LUSERCHANNELS",255:"RPL_LUSERME",256:"RPL_ADMINME",257:"RPL_ADMINLOC1",258:"RPL_ADMINLOC2",259:"RPL_ADMINEMAIL",261:"RPL_TRACELOG",262:"RPL_TRACEEND",263:"RPL_TRYAGAIN",265:"RPL_LOCALUSERS",266:"RPL_GLOBALUSERS",300:"RPL_NONE",301:"RPL_AWAY",302:"RPL_USERHOST",303:"RPL_ISON",304:"RPL_TEXT",305:"RPL_UNAWAY",306:"RPL_NOWAWAY",311:"RPL_WHOISUSER",312:"RPL_WHOISSERVER",313:"RPL_WHOISOPERATOR",314:"RPL_WHOWASUSER",315:"RPL_ENDOFWHO",316:"RPL_WHOISCHANOP",317:"RPL_WHOISIDLE",318:"RPL_ENDOFWHOIS",319:"RPL_WHOISCHANNELS",321:"RPL_LISTSTART",322:"RPL_LIST",323:"RPL_LISTEND",324:"RPL_CHANNELMODEIS",325:"RPL_UNIQOPIS",331:"RPL_NOTOPIC",332:"RPL_TOPIC",333:"RPL_TOPIC_WHO_TIME",341:"RPL_INVITING",342:"RPL_SUMMONING",344:"RPL_REOPLIST",345:"RPL_ENDOFREOPLIST",346:"RPL_INVITELIST",347:"RPL_ENDOFINVITELIST",348:"RPL_EXCEPTLIST",349:"RPL_ENDOFEXCEPTLIST",351:"RPL_VERSION",352:"RPL_WHOREPLY",353:"RPL_NAMREPLY",361:"RPL_KILLDONE",362:"RPL_CLOSING",363:"RPL_CLOSEEND",364:"RPL_LINKS",365:"RPL_ENDOFLINKS",366:"RPL_ENDOFNAMES",367:"RPL_BANLIST",368:"RPL_ENDOFBANLIST",369:"RPL_ENDOFWHOWAS",371:"RPL_INFO",372:"RPL_MOTD",373:"RPL_INFOSTART",374:"RPL_ENDOFINFO",375:"RPL_MOTDSTART",376:"RPL_ENDOFMOTD",381:"RPL_YOUREOPER",382:"RPL_REHASHING",383:"RPL_YOURESERVICE",384:"RPL_MYPORTIS",385:"RPL_NOTOPERANYMORE",391:"RPL_TIME",392:"RPL_USERSSTART",393:"RPL_USERS",394:"RPL_ENDOFUSERS",395:"RPL_NOUSERS",401:"ERR_NOSUCHNICK",402:"ERR_NOSUCHSERVER",403:"ERR_NOSUCHCHANNEL",404:"ERR_CANNOTSENDTOCHAN",405:"ERR_TOOMANYCHANNELS",406:"ERR_WASNOSUCHNICK",407:"ERR_TOOMANYTARGETS",408:"ERR_NOSUCHSERVICE",409:"ERR_NOORIGIN",411:"ERR_NORECIPIENT",412:"ERR_NOTEXTTOSEND",413:"ERR_NOTOPLEVEL",414:"ERR_WILDTOPLEVEL",415:"ERR_BADMASK",416:"ERR_TOOMANYMATCHES",421:"ERR_UNKNOWNCOMMAND",422:"ERR_NOMOTD",423:"ERR_NOADMININFO",424:"ERR_FILEERROR",431:"ERR_NONICKNAMEGIVEN",432:"ERR_ERRONEOUSNICKNAME",433:"ERR_NICKNAMEINUSE",434:"ERR_SERVICENAMEINUSE",435:"ERR_SERVICECONFUSED",436:"ERR_NICKCOLLISION",437:"ERR_UNAVAILRESOURCE",441:"ERR_USERNOTINCHANNEL",442:"ERR_NOTONCHANNEL",443:"ERR_USERONCHANNEL",444:"ERR_NOLOGIN",445:"ERR_SUMMONDISABLED",446:"ERR_USERSDISABLED",451:"ERR_NOTREGISTERED",461:"ERR_NEEDMOREPARAMS",462:"ERR_ALREADYREGISTRED",463:"ERR_NOPERMFORHOST",464:"ERR_PASSWDMISMATCH",465:"ERR_YOUREBANNEDCREEP",466:"ERR_YOUWILLBEBANNED",467:"ERR_KEYSET",471:"ERR_CHANNELISFULL",472:"ERR_UNKNOWNMODE",473:"ERR_INVITEONLYCHAN",474:"ERR_BANNEDFROMCHAN",475:"ERR_BADCHANNELKEY",476:"ERR_BADCHANMASK",477:"ERR_NOCHANMODES",478:"ERR_BANLISTFULL",481:"ERR_NOPRIVILEGES",482:"ERR_CHANOPRIVSNEEDED",483:"ERR_CANTKILLSERVER",484:"ERR_RESTRICTED",485:"ERR_UNIQOPRIVSNEEDED",491:"ERR_NOOPERHOST",492:"ERR_NOSERVICEHOST",499:"ERR_STATSKLINE",501:"ERR_UMODEUNKNOWNFLAG",502:"ERR_USERSDONTMATCH",708:"RPL_ETRACEFULL",759:"RPL_ETRACEEND","001":"RPL_WELCOME","002":"RPL_YOURHOST","003":"RPL_CREATED","004":"RPL_MYINFO","005":"RPL_ISUPPORT","010":"RPL_BOUNCE","015":"RPL_MAP","017":"RPL_MAPEND","018":"RPL_MAPSTART","020":"RPL_HELLO","042":"RPL_YOURID","043":"RPL_SAVENICK"};function e(t){return t.prefix.split("!")[0]}function a(t){var R={},n=t.prefix.split("!");R.nick=n[0];try{n=n[1].split("@"),R.username=n[0],R.hostname=n[1]}catch(t){}return R.string=t.prefix,R}const o=R("slate-irc:names");function E(t,R){var n=this;t=t.toLowerCase(),R&&(this.nameCallbacks[t]=function(i){delete n.nameCallbacks[t],R(null,i.names)}),this.write("NAMES "+t)}function s(t,R,n){"function"==typeof R&&(n=R,R="");var i=this;t=t.toLowerCase(),n&&(this.whoisCallbacks[t]=function(R,e){delete i.whoisCallbacks[t],n(R,e)}),this.write(["WHOIS",t,R].filter(Boolean).join(" "))}R("slate-irc:whois");const L=R("slate-irc");function r(t,R,i){if(!(this instanceof r))return new r(t,R,i);t.setEncoding(i||"utf8"),this.stream=t,this.parser=R||new n,this.parser.on("message",this.onmessage.bind(this)),t.pipe(this.parser),this.setMaxListeners(100),this.use(function(t){t.on("data",function(R){if("RPL_AWAY"==R.command||"RPL_NOWAWAY"==R.command||"RPL_UNAWAY"==R.command){var n=R.params.split(" "),i={};i.nick="RPL_NOWAWAY"==R.command||"RPL_UNAWAY"==R.command?n[0]:n[1],i.message=R.trailing,t.emit("away",i)}})}),this.use(function(t){var R=t.stream;R.on("close",function(){t.emit("disconnect")}),null!=R.setTimeout&&(R.setTimeout(6e4),R.on("timeout",function(){var n=!0,i=(new Date).getTime();t.write("PING :"+i),t.once("pong",function(t){t==i&&(n=!1)}),setTimeout(function(){n&&R.destroy()},5e3)}))}),this.use(function(t){t.on("data",function(R){if(0===R.command.indexOf("ERR_")){var n={};n.cmd=R.command,n.message=R.trailing,t.emit("errors",n)}})}),this.use(function(t){t.on("data",function(R){if("INVITE"==R.command){var n={};n.from=e(R),n.hostmask=a(R),n.to=R.params.toLowerCase(),n.channel=R.trailing,t.emit("invite",n)}})}),this.use(function(t){t.on("data",function(R){if("JOIN"==R.command){var n={};n.nick=e(R),n.hostmask=a(R),n.channel=(R.params||R.trailing).toLowerCase(),t.emit("join",n)}})}),this.use(function(t){t.on("data",function(R){if("KICK"==R.command){var n={},i=R.params.split(" ");n.nick=e(R),n.hostmask=a(R),n.channel=i[0].toLowerCase(),n.client=i[1],n.message=R.trailing,t.emit("kick",n)}})}),this.use(function(t){t.on("data",function(R){if("MODE"==R.command){var n=R.params.split(" "),i={};i.nick=e(R),i.target=n[0],i.mode=n[1]||R.trailing,i.client=n[2],t.emit("mode",i)}})}),this.use(function(t){var R={motd:[]};t.on("data",function(n){switch(n.command){case"RPL_MOTDSTART":R.motd.length=0;case"RPL_ENDOFMOTD":case"RPL_MOTD":R.motd.push(n.trailing)}"RPL_ENDOFMOTD"==n.command&&t.emit("motd",R)})}),this.use(function(t){var R={};t.names=E,t.nameCallbacks={},t.on("data",function(n){switch(n.command){case"RPL_NAMREPLY":var i=n.params.split(/ [=@*] /)[1].toLowerCase(),e=n.trailing.split(" "),a=[];e.forEach(function(t){var R=t.split(/([~&@%+])/),n=R.pop(),i=R.pop();a.push({name:n,mode:i||""})}),R[i]=(R[i]||[]).concat(a),o("add %s %j",i,a);break;case"RPL_ENDOFNAMES":i=n.params.split(" ")[1].toLowerCase(),o('emit "names" for %s',i);var E={channel:i,names:R[i]||[]},s=t.nameCallbacks[i];s?s(E):t.emit("names",E),delete R[i]}})}),this.use(function(t){t.on("data",function(R){if("NICK"==R.command){var n={};n.nick=e(R),n.hostmask=a(R),n.new=R.trailing,n.new||(n.new=R.params),n.nick==t.me&&(t.me=n.new),t.emit("nick",n)}})}),this.use(function(t){t.on("data",function(R){if("NOTICE"==R.command){var n={};n.from=e(R),n.hostmask=a(R),n.to=R.params.toLowerCase(),n.message=R.trailing,t.emit("notice",n)}})}),this.use(function(t){t.on("data",function(R){if("PART"==R.command){var n={};n.nick=e(R),n.hostmask=a(R),n.channels=R.params.split(",").map(function(t){return t.toLowerCase()}),n.message=R.trailing,t.emit("part",n)}})}),this.use(function(t){t.on("data",function(R){"PONG"==R.command&&t.emit("pong",R.trailing),"PING"==R.command&&t.write("PONG :"+R.trailing)})}),this.use(function(t){t.on("data",function(R){if("PRIVMSG"==R.command){var n={};n.from=e(R),n.hostmask=a(R),n.to=R.params.toLowerCase(),n.message=R.trailing,t.emit("message",n)}})}),this.use(function(t){t.on("data",function(R){if("QUIT"==R.command){var n={};n.nick=e(R),n.hostmask=a(R),n.message=R.trailing,t.emit("quit",n)}})}),this.use(function(t){var R;t.on("data",function(n){switch(n.command){case"RPL_NOTOPIC":case"RPL_TOPIC":R=n.params.split(" ")[1];break;case"TOPIC":R=n.params;break;default:return}var i={};"TOPIC"==n.command&&(i.nick=e(n)),i.hostmask=a(n),i.channel=R.toLowerCase(),i.topic=n.trailing,t.emit("topic",i)})}),this.use(function(t){t.on("data",function(R){"RPL_WELCOME"==R.command&&(t.me=R.params,t.emit("welcome",t.me))})}),this.use(function(t){var R={};t.whois=s,t.whoisCallbacks={},t.on("data",function(n){switch(n.command){case"RPL_WHOISUSER":var i=(o=n.params.split(" "))[1].toLowerCase();R[i]=R[i]||{},R[i].nickname=o[1],R[i].username=o[2],R[i].hostname=o[3],R[i].realname=n.trailing,R[i].channels=[],R[i].oper=!1;break;case"RPL_WHOISCHANNELS":i=(o=n.params.split(" "))[1].toLowerCase();var e=n.trailing.split(" ");R[i].channels=R[i].channels.concat(e);break;case"RPL_WHOISSERVER":i=(o=n.params.split(" "))[1].toLowerCase(),R[i].server=o[2];break;case"RPL_AWAY":if(i=(o=n.params.split(" "))[1].toLowerCase(),!R[i])return;R[i].away=n.trailing;break;case"RPL_WHOISOPERATOR":i=(o=n.params.split(" "))[1].toLowerCase(),R[i].oper=!0;break;case"RPL_WHOISIDLE":i=(o=n.params.split(" "))[1].toLowerCase(),R[i].idle=o[2],R[i].sign=o[3];break;case"RPL_ENDOFWHOIS":if(i=(o=n.params.split(" "))[1].toLowerCase(),!R[i])return;(E=t.whoisCallbacks[i])?E(a,R[i]):t.emit("whois",null,R[i]),R={};break;case"ERR_NEEDMOREPARAMS":var a="Not enough parameters";if("whois"!==(i=(o=n.params.split(" "))[1].toLowerCase()))return;(E=t.whoisCallbacks[i])?E(a,null):t.emit("whois",a,null);break;case"ERR_NOSUCHSERVER":a="No such server",i=(o=n.params.split(" "))[1].toLowerCase(),(E=t.whoisCallbacks[i])?E(a,null):t.emit("whois",a,null);break;case"ERR_NOSUCHNICK":var o,E;a="No such nick/channel",i=(o=n.params.split(" "))[1].toLowerCase(),(E=t.whoisCallbacks[i])?E(a,null):t.emit("whois",a,null)}})})}function N(t){return Array.isArray(t)?t:[t]}r.prototype.__proto__=t.prototype,r.prototype.writeUnsafe=function(t,R){this.stream.write(t+"\r\n",R)},r.prototype.write=function(t,R){-1==t.indexOf("\n")&&-1==t.indexOf("\r")?this.writeUnsafe(t,R):R&&R(new Error("The parameter to write() must not contain any '\\n' or '\\r'."))},r.prototype.pass=function(t,R){this.write("PASS "+t,R)},r.prototype.webirc=function(t,R,n,i,e){var a=[t,R,n,i].join(" ");this.write("WEBIRC "+a,e)},r.prototype.nick=function(t,R){this.write("NICK "+t,R)},r.prototype.user=function(t,R,n){this.write("USER "+t+" 0 * :"+R,n)},r.prototype.invite=function(t,R,n){this.write("INVITE "+t+" "+R,n)},r.prototype.send=function(t,R,n){this.write("PRIVMSG "+N(t).join(",")+" :"+R,n)},r.prototype.action=function(t,R,n){this.send(t,"ACTION "+R+"",n)},r.prototype.notice=function(t,R,n){this.write("NOTICE "+t+" :"+R,n)},r.prototype.ctcp=function(t,R,n){this.notice(t,""+R+"",n)},r.prototype.join=function(t,R,n){"function"==typeof R&&(n=R,R=""),this.write("JOIN "+N(t).join(",")+" "+N(R).join(","),n)},r.prototype.part=function(t,R,n){"function"==typeof R&&(n=R,R="");var i="PART "+N(t).join(",");R&&(i+=" :"+R),this.write(i,n)},r.prototype.away=function(t,R){this.write("AWAY :"+(t=t||"Talk to you later!"),R)},r.prototype.back=function(t){this.write("AWAY",t)},r.prototype.topic=function(t,R,n){"function"==typeof R&&(n=R,R=""),R&&(R=" :"+R),this.write("TOPIC "+t+R,n)},r.prototype.kick=function(t,R,n,i){"function"==typeof n&&(i=n,n="");var e="KICK "+N(t).join(",")+" "+N(R).join(",");n&&(e+=" :"+n),this.write(e,i)},r.prototype.quit=function(t,R){this.write("QUIT :"+(t=t||"Bye!"),R)},r.prototype.oper=function(t,R,n){this.write("OPER "+t+" "+R,n)},r.prototype.mode=function(t,R,n,i){"function"==typeof n&&(i=n,n=""),this.write(n?"MODE "+t+" "+R+" "+n:"MODE "+t+" "+R,i)},r.prototype.use=function(t){return t(this),this},r.prototype.onmessage=function(t){t.command=i[t.command]||t.command,L("message %s %s",t.command,t.string),this.emit("data",t)};export{r as default}; | ||
| //# sourceMappingURL=slate-irc.modern.mjs.map |
| {"version":3,"file":"slate-irc.modern.mjs","sources":["../lib/utils.js","../lib/plugins/names.js","../lib/plugins/whois.js","../index.js","../lib/plugins/away.js","../lib/plugins/disconnect.js","../lib/plugins/errors.js","../lib/plugins/invite.js","../lib/plugins/join.js","../lib/plugins/kick.js","../lib/plugins/mode.js","../lib/plugins/motd.js","../lib/plugins/nick.js","../lib/plugins/notice.js","../lib/plugins/part.js","../lib/plugins/pong.js","../lib/plugins/privmsg.js","../lib/plugins/quit.js","../lib/plugins/topic.js","../lib/plugins/welcome.js"],"sourcesContent":["/**\n * Parse channel list `str`.\n *\n * @param {String} str\n * @return {Array}\n * @api public\n */\n\nexport function channelList(str) {\n return str.split(',').map(function (chan) {\n return chan.toLowerCase()\n })\n}\n\n/**\n * Parse nick from `msg`.\n *\n * @param {Object} msg\n * @return {String}\n * @api public\n */\n\nexport function nick(msg) {\n return msg.prefix.split('!')[0]\n}\n\n/**\n * Parse hostmask from `msg`.\n *\n * @param {Object} msg\n * @return {Object}\n * @api public\n */\n\nexport function hostmask(msg) {\n var hostmask = {}\n var parts = msg.prefix.split('!')\n hostmask.nick = parts[0]\n\n try {\n parts = parts[1].split('@')\n hostmask.username = parts[0]\n hostmask.hostname = parts[1]\n } catch (e) {\n // ..\n }\n\n hostmask.string = msg.prefix\n return hostmask\n}\n\n/**\n * Merge the contents of two objects together into the first object.\n *\n * @param {Object} a\n * @param {Object} b\n * @return {Object}\n * @api public\n */\n\nexport function extend(a, b) {\n for (var prop in b) {\n a[prop] = b[prop]\n }\n return a\n}\n","/**\n * Module dependencies.\n */\n\nimport debugModule from 'debug'\nimport * as utils from '../utils'\n\nconst debug = debugModule('slate-irc:names')\n\n/**\n * NAMES plugin to emit `name event`.\n *\n * @return {Function}\n * @api public\n */\n\nexport default function () {\n return function (irc) {\n var map = {}\n irc.names = names\n irc.nameCallbacks = {}\n\n irc.on('data', function (msg) {\n switch (msg.command) {\n case 'RPL_NAMREPLY':\n var chan = msg.params.split(/ [=@*] /)[1].toLowerCase()\n var names = msg.trailing.split(' ')\n var users = []\n\n names.forEach(function (n) {\n var user = n.split(/([~&@%+])/)\n var name = user.pop()\n var mode = user.pop()\n users.push({ name: name, mode: mode || '' })\n })\n\n map[chan] = (map[chan] || []).concat(users)\n debug('add %s %j', chan, users)\n break\n\n case 'RPL_ENDOFNAMES':\n var chan = msg.params.split(' ')[1].toLowerCase()\n debug('emit \"names\" for %s', chan)\n var e = { channel: chan, names: map[chan] || [] }\n var cb = irc.nameCallbacks[chan]\n\n if (cb) cb(e)\n else irc.emit('names', e)\n\n delete map[chan]\n break\n }\n })\n }\n}\n\n/**\n * Fetch names for `channel` and invoke `fn(err, names)`.\n *\n * @param {String} channel\n * @param {Function} fn\n * @api public\n */\n\nfunction names(channel, fn) {\n var self = this\n channel = channel.toLowerCase()\n\n if (fn) {\n this.nameCallbacks[channel] = function (e) {\n delete self.nameCallbacks[channel]\n fn(null, e.names)\n }\n }\n\n this.write('NAMES ' + channel)\n}\n","/**\n * Module dependencies.\n */\n\nimport debugModule from 'debug'\nimport * as utils from '../utils'\n\nconst debug = debugModule('slate-irc:whois')\n\n/**\n * WHOIS plugin to emit \"whois\" events.\n *\n * @return {Function}\n * @api public\n */\n\nexport default function () {\n return function (irc) {\n var map = {}\n irc.whois = whois\n irc.whoisCallbacks = {}\n\n irc.on('data', function (msg) {\n switch (msg.command) {\n case 'RPL_WHOISUSER':\n var params = msg.params.split(' ')\n var target = params[1].toLowerCase()\n map[target] = map[target] || {}\n map[target].nickname = params[1]\n map[target].username = params[2]\n map[target].hostname = params[3]\n map[target].realname = msg.trailing\n map[target].channels = []\n map[target].oper = false\n break\n case 'RPL_WHOISCHANNELS':\n var params = msg.params.split(' ')\n var target = params[1].toLowerCase()\n var channels = msg.trailing.split(' ')\n map[target].channels = map[target].channels.concat(channels)\n break\n case 'RPL_WHOISSERVER':\n var params = msg.params.split(' ')\n var target = params[1].toLowerCase()\n map[target].server = params[2]\n break\n case 'RPL_AWAY':\n var params = msg.params.split(' ')\n var target = params[1].toLowerCase()\n if (!map[target]) return\n map[target].away = msg.trailing\n break\n case 'RPL_WHOISOPERATOR':\n var params = msg.params.split(' ')\n var target = params[1].toLowerCase()\n map[target].oper = true\n break\n case 'RPL_WHOISIDLE':\n var params = msg.params.split(' ')\n var target = params[1].toLowerCase()\n map[target].idle = params[2] // new Date(now - (n * 1000))\n map[target].sign = params[3] // new Date(n * 1000)\n break\n case 'RPL_ENDOFWHOIS':\n var params = msg.params.split(' ')\n var target = params[1].toLowerCase()\n if (!map[target]) return\n var cb = irc.whoisCallbacks[target]\n if (cb) cb(err, map[target])\n else irc.emit('whois', null, map[target])\n map = {}\n break\n case 'ERR_NEEDMOREPARAMS':\n var err = 'Not enough parameters'\n var params = msg.params.split(' ')\n var target = params[1].toLowerCase()\n if (target !== 'whois') return\n var cb = irc.whoisCallbacks[target]\n if (cb) cb(err, null)\n else irc.emit('whois', err, null)\n break\n case 'ERR_NOSUCHSERVER':\n var err = 'No such server'\n var params = msg.params.split(' ')\n var target = params[1].toLowerCase()\n var cb = irc.whoisCallbacks[target]\n if (cb) cb(err, null)\n else irc.emit('whois', err, null)\n break\n case 'ERR_NOSUCHNICK':\n var err = 'No such nick/channel'\n var params = msg.params.split(' ')\n var target = params[1].toLowerCase()\n var cb = irc.whoisCallbacks[target]\n if (cb) cb(err, null)\n else irc.emit('whois', err, null)\n break\n }\n })\n }\n}\n\n/**\n * Fetch whois data and invoke `fn(err, data)`.\n *\n * @param {String} target\n * @param {String} mask\n * @param {Function} fn\n * @api public\n */\n\nfunction whois(target, mask, fn) {\n if ('function' == typeof mask) {\n fn = mask\n mask = ''\n }\n\n var self = this\n target = target.toLowerCase()\n\n if (fn) {\n this.whoisCallbacks[target] = function (err, data) {\n delete self.whoisCallbacks[target]\n fn(err, data)\n }\n }\n\n this.write(['WHOIS', target, mask].filter(Boolean).join(' '))\n}\n","/**\n * Module dependencies.\n */\n\nimport { EventEmitter as Emitter } from 'events'\nimport debugModule from 'debug'\nimport Parser from 'slate-irc-parser'\nimport replies from 'irc-replies'\n\nconst debug = debugModule('slate-irc')\n\n/**\n * Core plugins.\n */\n\nimport away from './lib/plugins/away'\nimport disconnect from './lib/plugins/disconnect'\nimport errors from './lib/plugins/errors'\nimport invite from './lib/plugins/invite'\nimport join from './lib/plugins/join'\nimport kick from './lib/plugins/kick'\nimport mode from './lib/plugins/mode'\nimport motd from './lib/plugins/motd'\nimport names from './lib/plugins/names'\nimport nick from './lib/plugins/nick'\nimport notice from './lib/plugins/notice'\nimport part from './lib/plugins/part'\nimport pong from './lib/plugins/pong'\nimport privmsg from './lib/plugins/privmsg'\nimport quit from './lib/plugins/quit'\nimport topic from './lib/plugins/topic'\nimport welcome from './lib/plugins/welcome'\nimport whois from './lib/plugins/whois'\n\n/**\n * Initialize a new IRC client with the\n * given duplex `stream`.\n *\n * @param {Stream} stream\n * @param {Parser} [parser]\n * @param {String} [encoding]\n * @api public\n */\n\nexport default function Client(stream, parser, encoding) {\n if (!(this instanceof Client)) return new Client(stream, parser, encoding)\n stream.setEncoding(encoding || 'utf8')\n this.stream = stream\n this.parser = parser || new Parser()\n this.parser.on('message', this.onmessage.bind(this))\n stream.pipe(this.parser)\n this.setMaxListeners(100)\n this.use(away())\n this.use(disconnect())\n this.use(errors())\n this.use(invite())\n this.use(join())\n this.use(kick())\n this.use(mode())\n this.use(motd())\n this.use(names())\n this.use(nick())\n this.use(notice())\n this.use(part())\n this.use(pong())\n this.use(privmsg())\n this.use(quit())\n this.use(topic())\n this.use(welcome())\n this.use(whois())\n}\n\n/**\n * Inherit from `Emitter.prototype`.\n */\n\nClient.prototype.__proto__ = Emitter.prototype\n\n/**\n * Write `str` without checking for '\\r' or '\\n' and invoke `fn(err)`.\n *\n * @param {String} str\n * @param {Function} [fn]\n * @api public\n */\n\nClient.prototype.writeUnsafe = function (str, fn) {\n this.stream.write(str + '\\r\\n', fn)\n}\n\n/**\n * Write `str` and invoke `fn(err)`.\n *\n * @param {String} str\n * @param {Function} [fn]\n * @api public\n */\n\nClient.prototype.write = function (str, fn) {\n if (str.indexOf('\\n') != -1 || str.indexOf('\\r') != -1) {\n fn &&\n fn(\n new Error(\n \"The parameter to write() must not contain any '\\\\n' or '\\\\r'.\",\n ),\n )\n return\n }\n this.writeUnsafe(str, fn)\n}\n\n/**\n * PASS <pass>\n *\n * @param {String} pass\n * @param {Function} [fn]\n * @api public\n */\n\nClient.prototype.pass = function (pass, fn) {\n this.write('PASS ' + pass, fn)\n}\n\n/**\n * WEBIRC <password> <username> <hostname> <ip>\n * See https://www.irc.wiki/WebIRC\n *\n * @param {String} password\n * @param {String} username\n * @param {String} hostname\n * @param {String} ip\n * @param {Function} [fn]\n * @api public\n */\n\nClient.prototype.webirc = function (password, username, hostname, ip, fn) {\n var message = [password, username, hostname, ip].join(' ')\n this.write('WEBIRC ' + message, fn)\n}\n\n/**\n * NICK <nick>\n *\n * @param {String} nick\n * @param {Function} [fn]\n * @api public\n */\n\nClient.prototype.nick = function (nick, fn) {\n this.write('NICK ' + nick, fn)\n}\n\n/**\n * USER <username> <realname>\n *\n * @param {String} username\n * @param {String} realname\n * @param {Function} [fn]\n * @api public\n */\n\nClient.prototype.user = function (username, realname, fn) {\n this.write('USER ' + username + ' 0 * :' + realname, fn)\n}\n\n/**\n * Send an invite to `name`, for a `channel`.\n *\n * @param {String} name\n * @param {String} channel\n * @param {Function} [fn]\n * @api public\n */\n\nClient.prototype.invite = function (name, channel, fn) {\n this.write('INVITE ' + name + ' ' + channel, fn)\n}\n\n/**\n * Send `msg` to `target`, where `target`\n * is a channel or user name.\n *\n * @param {String|Array} target\n * @param {String} msg\n * @param {Function} [fn]\n * @api public\n */\n\nClient.prototype.send = function (target, msg, fn) {\n this.write('PRIVMSG ' + toArray(target).join(',') + ' :' + msg, fn)\n}\n\n/**\n * Send `msg` to `target` as an ACTION, where `target`\n * is a channel or user name.\n *\n * An action is a PRIVMSG with a syntax\n * like this:\n *\n * PRIVMSG <target> :\\u0001ACTION <msg>\\u0001\n *\n * @param {String} target\n * @param {String} msg\n * @param {Function} [fn]\n * @api public\n */\n\nClient.prototype.action = function (target, msg, fn) {\n this.send(target, '\\u0001' + 'ACTION ' + msg + '\\u0001', fn)\n}\n\n/**\n * Send `msg` to `target` as a NOTICE, where `target`\n * is a channel or user name.\n *\n * @param {String} target\n * @param {String} msg\n * @param {Function} [fn]\n * @api public\n */\n\nClient.prototype.notice = function (target, msg, fn) {\n this.write('NOTICE ' + target + ' :' + msg, fn)\n}\n\n/**\n * Send `msg` to `target` as a CTCP notice, where `target`\n * is a user name.\n *\n * @param {String} target\n * @param {String} msg\n * @param {Function} [fn]\n * @api public\n */\n\nClient.prototype.ctcp = function (target, msg, fn) {\n this.notice(target, '\\x01' + msg + '\\x01', fn)\n}\n\n/**\n * Join channel(s).\n *\n * @param {String|Array} channels\n * @param {String|Array|Function} [keys or fn]\n * @param {Function} [fn]\n * @api public\n */\n\nClient.prototype.join = function (channels, keys, fn) {\n if ('function' == typeof keys) {\n fn = keys\n keys = ''\n }\n\n this.write(\n 'JOIN ' + toArray(channels).join(',') + ' ' + toArray(keys).join(','),\n fn,\n )\n}\n\n/**\n * Leave channel(s) with optional `msg`.\n *\n * @param {String|Array} channels\n * @param {String|Function} [msg or fn]\n * @param {Function} [fn]\n * @api public\n */\n\nClient.prototype.part = function (channels, msg, fn) {\n if ('function' == typeof msg) {\n fn = msg\n msg = ''\n }\n\n var part = 'PART ' + toArray(channels).join(',')\n\n if (msg) {\n part += ' :' + msg\n }\n\n this.write(part, fn)\n}\n\n/**\n * Set the user's away message\n *\n * @param {String} [msg = 'Talk to you later!']\n * @param {Function} [fn]\n * @api public\n */\n\nClient.prototype.away = function (msg, fn) {\n msg = msg || 'Talk to you later!'\n this.write('AWAY :' + msg, fn)\n}\n\n/**\n * Remove user's away message\n *\n * @param {Function} [fn]\n * @api public\n */\n\nClient.prototype.back = function (fn) {\n this.write('AWAY', fn)\n}\n\n/**\n * Get channel topic or set the topic to `topic`.\n *\n * @param {String} channel\n * @param {String|Function} [topic or fn]\n * @param {Function} [fn]\n * @api public\n */\n\nClient.prototype.topic = function (channel, topic, fn) {\n if ('function' == typeof topic) {\n fn = topic\n topic = ''\n }\n\n if (topic) {\n topic = ' :' + topic\n }\n\n this.write('TOPIC ' + channel + topic, fn)\n}\n\n/**\n * Kick nick(s) from channel(s) with optional `msg`.\n *\n * @param {String|Array} channels\n * @param {String|Array} nicks\n * @param {String|Function} [msg or fn]\n * @param {Function} [fn]\n * @api public\n */\n\nClient.prototype.kick = function (channels, nicks, msg, fn) {\n if ('function' == typeof msg) {\n fn = msg\n msg = ''\n }\n\n var kick =\n 'KICK ' + toArray(channels).join(',') + ' ' + toArray(nicks).join(',')\n\n if (msg) {\n kick += ' :' + msg\n }\n\n this.write(kick, fn)\n}\n\n/**\n * Disconnect from the server with `msg`.\n *\n * @param {String} [msg]\n * @param {Function} [fn]\n * @api public\n */\n\nClient.prototype.quit = function (msg, fn) {\n msg = msg || 'Bye!'\n this.write('QUIT :' + msg, fn)\n}\n\n/**\n * Used to obtain operator privileges.\n * The combination of `name` and `password` are required\n * to gain Operator privileges. Upon success, a `'mode'`\n * event will be emitted.\n *\n * @param {String} name\n * @param {String} password\n * @param {Function} [fn]\n * @api public\n */\n\nClient.prototype.oper = function (name, password, fn) {\n this.write('OPER ' + name + ' ' + password, fn)\n}\n\n/**\n * Used to set a user's mode or channel's mode for a user;\n *\n * @param {String} [nick or channel]\n * @param {String} flags\n * @param {String} params [nick - if setting channel mode]\n * @param {Function} [fn]\n * @api public\n */\n\nClient.prototype.mode = function (target, flags, params, fn) {\n if ('function' === typeof params) {\n fn = params\n params = ''\n }\n if (params) {\n this.write('MODE ' + target + ' ' + flags + ' ' + params, fn)\n } else {\n this.write('MODE ' + target + ' ' + flags, fn)\n }\n}\n\n/**\n * Use the given plugin `fn`.\n *\n * @param {Function} fn\n * @return {Client} self\n * @api public\n */\n\nClient.prototype.use = function (fn) {\n fn(this)\n return this\n}\n\n/**\n * Handle messages.\n *\n * Emit \"message\" (msg).\n *\n * @api private\n */\n\nClient.prototype.onmessage = function (msg) {\n msg.command = replies[msg.command] || msg.command\n debug('message %s %s', msg.command, msg.string)\n this.emit('data', msg)\n}\n\n/**\n * Array helper.\n */\n\nfunction toArray(val) {\n return Array.isArray(val) ? val : [val]\n}\n","/*\n * Module dependencies.\n */\n\nimport * as utils from '../utils'\n\n/**\n * AWAY plugin to emit \"away\" events.\n *\n * @return {Function}\n * @api public\n */\n\nexport default function () {\n return function (irc) {\n irc.on('data', function (msg) {\n if (\n 'RPL_AWAY' != msg.command &&\n 'RPL_NOWAWAY' != msg.command &&\n 'RPL_UNAWAY' != msg.command\n )\n return\n var params = msg.params.split(' ')\n var e = {}\n if ('RPL_NOWAWAY' == msg.command || 'RPL_UNAWAY' == msg.command) {\n e.nick = params[0]\n } else {\n e.nick = params[1]\n }\n e.message = msg.trailing\n irc.emit('away', e)\n })\n }\n}\n","/**\n * DISCONNECT plugin to emit \"disconnect\" events.\n *\n * @return {Function}\n * @api public\n */\n\nexport default function () {\n return function (irc) {\n var stream = irc.stream\n var ms = 60 * 1000\n\n stream.on('close', function () {\n irc.emit('disconnect')\n })\n\n // Do nothing when given stream cannot perform setTimeout() operation\n if (stream.setTimeout == null) {\n return\n }\n\n stream.setTimeout(ms)\n\n stream.on('timeout', function () {\n var timeout = true\n var time = new Date().getTime()\n\n irc.write('PING :' + time)\n\n irc.once('pong', function (res) {\n if (res == time) {\n timeout = false\n }\n })\n\n setTimeout(function () {\n if (timeout) {\n stream.destroy()\n }\n }, 5000)\n })\n }\n}\n","/**\n * ERRORS plugin to emit \"errors\" events.\n *\n * List of possible errors:\n * https://github.com/williamwicks/irc-replies/blob/master/replies.json#L113-L170\n *\n * @return {Function}\n * @api public\n */\n\nexport default function () {\n return function (irc) {\n irc.on('data', function (msg) {\n if (msg.command.indexOf('ERR_') !== 0) return\n var e = {}\n e.cmd = msg.command\n e.message = msg.trailing\n irc.emit('errors', e)\n })\n }\n}\n","/**\n * Module dependencies.\n */\n\nimport * as utils from '../utils'\n\n/**\n * INVITE plugin to emit \"invite\" events.\n *\n * @return {Function}\n * @api public\n */\n\nexport default function () {\n return function (irc) {\n irc.on('data', function (msg) {\n if ('INVITE' != msg.command) return\n var e = {}\n e.from = utils.nick(msg)\n e.hostmask = utils.hostmask(msg)\n e.to = msg.params.toLowerCase()\n e.channel = msg.trailing\n irc.emit('invite', e)\n })\n }\n}\n","/**\n * Module dependencies.\n */\n\nimport * as utils from '../utils'\n\n/**\n * JOIN plugin to emit \"join\" events.\n *\n * @return {Function}\n * @api public\n */\n\nexport default function () {\n return function (irc) {\n irc.on('data', function (msg) {\n if ('JOIN' != msg.command) return\n var e = {}\n e.nick = utils.nick(msg)\n e.hostmask = utils.hostmask(msg)\n e.channel = (msg.params || msg.trailing).toLowerCase()\n irc.emit('join', e)\n })\n }\n}\n","/**\n * Module dependencies.\n */\n\nimport * as utils from '../utils'\n\n/**\n * KICK plugin to emit \"kick\" events.\n *\n * @return {Function}\n * @api public\n */\n\nexport default function () {\n return function (irc) {\n irc.on('data', function (msg) {\n if ('KICK' != msg.command) return\n var e = {}\n var params = msg.params.split(' ')\n e.nick = utils.nick(msg)\n e.hostmask = utils.hostmask(msg)\n e.channel = params[0].toLowerCase()\n e.client = params[1]\n e.message = msg.trailing\n irc.emit('kick', e)\n })\n }\n}\n","/**\n * Module dependencies.\n */\n\nimport * as utils from '../utils'\n\n/**\n * MODE plugin to emit \"mode\" events.\n *\n * @return {Function}\n * @api public\n */\n\nexport default function () {\n return function (irc) {\n irc.on('data', function (msg) {\n if ('MODE' != msg.command) return\n var params = msg.params.split(' ')\n var e = {}\n e.nick = utils.nick(msg)\n e.target = params[0]\n e.mode = params[1] || msg.trailing\n e.client = params[2]\n irc.emit('mode', e)\n })\n }\n}\n","/**\n * MOTD plugin to emit \"motd\" events.\n *\n * @return {Function}\n * @api public\n */\n\nexport default function () {\n return function (irc) {\n var e = {}\n e.motd = []\n\n irc.on('data', function (msg) {\n switch (msg.command) {\n case 'RPL_MOTDSTART':\n e.motd.length = 0\n case 'RPL_ENDOFMOTD':\n case 'RPL_MOTD':\n e.motd.push(msg.trailing)\n break\n }\n\n if (msg.command == 'RPL_ENDOFMOTD') {\n irc.emit('motd', e)\n }\n })\n }\n}\n","/**\n * Module dependencies.\n */\n\nimport * as utils from '../utils'\n\n/**\n * NICK plugin to emit \"nick\" events.\n *\n * @return {Function}\n * @api public\n */\n\nexport default function () {\n return function (irc) {\n irc.on('data', function (msg) {\n if ('NICK' != msg.command) return\n var e = {}\n e.nick = utils.nick(msg)\n e.hostmask = utils.hostmask(msg)\n e.new = msg.trailing\n if (!e.new) e.new = msg.params\n if (e.nick == irc.me) irc.me = e.new\n irc.emit('nick', e)\n })\n }\n}\n","/**\n * Module dependencies.\n */\n\nimport * as utils from '../utils'\n\n/**\n * NOTICE plugin to emit \"notice\" events.\n *\n * @return {Function}\n * @api public\n */\n\nexport default function () {\n return function (irc) {\n irc.on('data', function (msg) {\n if ('NOTICE' != msg.command) return\n var e = {}\n e.from = utils.nick(msg)\n e.hostmask = utils.hostmask(msg)\n e.to = msg.params.toLowerCase()\n e.message = msg.trailing\n irc.emit('notice', e)\n })\n }\n}\n","/**\n * Module dependencies.\n */\n\nimport * as utils from '../utils'\n\n/**\n * PART plugin to emit \"part\" events.\n *\n * @return {Function}\n * @api public\n */\n\nexport default function () {\n return function (irc) {\n irc.on('data', function (msg) {\n if ('PART' != msg.command) return\n var e = {}\n e.nick = utils.nick(msg)\n e.hostmask = utils.hostmask(msg)\n e.channels = utils.channelList(msg.params)\n e.message = msg.trailing\n irc.emit('part', e)\n })\n }\n}\n","/**\n * PONG plugin to reply to PING events.\n *\n * @return {Function}\n * @api public\n */\n\nexport default function () {\n return function (irc) {\n irc.on('data', function (msg) {\n if ('PONG' == msg.command) irc.emit('pong', msg.trailing)\n if ('PING' != msg.command) return\n irc.write('PONG :' + msg.trailing)\n })\n }\n}\n","/**\n * Module dependencies.\n */\n\nimport * as utils from '../utils'\n\n/**\n * PRIVMSG plugin to emit \"message\" events.\n *\n * @return {Function}\n * @api public\n */\n\nexport default function () {\n return function (irc) {\n irc.on('data', function (msg) {\n if ('PRIVMSG' != msg.command) return\n var e = {}\n e.from = utils.nick(msg)\n e.hostmask = utils.hostmask(msg)\n e.to = msg.params.toLowerCase()\n e.message = msg.trailing\n irc.emit('message', e)\n })\n }\n}\n","/**\n * Module dependencies.\n */\n\nimport * as utils from '../utils'\n\n/**\n * QUIT plugin to emit \"quit\" events.\n *\n * @return {Function}\n * @api public\n */\n\nexport default function () {\n return function (irc) {\n irc.on('data', function (msg) {\n if ('QUIT' != msg.command) return\n var e = {}\n e.nick = utils.nick(msg)\n e.hostmask = utils.hostmask(msg)\n e.message = msg.trailing\n irc.emit('quit', e)\n })\n }\n}\n","/**\n * Module dependencies.\n */\n\nimport * as utils from '../utils'\n\n/**\n * TOPIC plugin to emit \"topic\" events.\n *\n * @return {Function}\n * @api public\n */\n\nexport default function () {\n return function (irc) {\n var channel\n irc.on('data', function (msg) {\n switch (msg.command) {\n case 'RPL_NOTOPIC':\n case 'RPL_TOPIC':\n channel = msg.params.split(' ')[1]\n break\n\n case 'TOPIC':\n channel = msg.params\n break\n\n default:\n return\n }\n\n var e = {}\n if ('TOPIC' == msg.command) e.nick = utils.nick(msg)\n e.hostmask = utils.hostmask(msg)\n e.channel = channel.toLowerCase()\n e.topic = msg.trailing\n irc.emit('topic', e)\n })\n }\n}\n","/**\n * RPL_WELCOME plugin to set `irc.me`.\n *\n * @return {Function}\n * @api public\n */\n\nexport default function () {\n return function (irc) {\n irc.on('data', function (msg) {\n if ('RPL_WELCOME' != msg.command) return\n irc.me = msg.params\n irc.emit('welcome', irc.me)\n })\n }\n}\n"],"names":["nick","msg","prefix","split","hostmask","parts","username","hostname","e","string","debug","debugModule","names","channel","fn","self","this","toLowerCase","nameCallbacks","write","whois","target","mask","whoisCallbacks","err","data","filter","Boolean","join","Client","stream","parser","encoding","setEncoding","Parser","on","onmessage","bind","pipe","setMaxListeners","use","irc","command","params","message","trailing","emit","setTimeout","timeout","time","Date","getTime","once","res","destroy","indexOf","cmd","from","utils","to","client","mode","motd","length","push","map","chan","users","forEach","n","user","name","pop","concat","cb","new","me","channels","topic","nickname","realname","oper","server","away","idle","sign","toArray","val","Array","isArray","prototype","__proto__","Emitter","writeUnsafe","str","Error","pass","webirc","password","ip","invite","send","action","notice","ctcp","keys","part","back","kick","nicks","quit","flags","replies"],"mappings":"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"} |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 1 instance in 1 package
28
300%1151
1098.96%2
-33.33%56
1.82%Yes
NaN87915
-13.45%7
75%2
100%1
Infinity%Updated