/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * The contents of this file are subject to the Mozilla Public * License Version 1.1 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. * * The Original Code is ChatZilla * * The Initial Developer of the Original Code is New Dimensions Consulting, * Inc. Portions created by New Dimensions Consulting, Inc. are * Copyright (C) 1999 New Dimenstions Consulting, Inc. All * Rights Reserved. * * Contributor(s): * Robert Ginda, rginda@ndcico.com, original author * Chiaki Koufugata chiaki@mozilla.gr.jp UI i18n */ function onTopicEditStart() { if (client.currentObject.TYPE != "IRCChannel") return; var text = client.statusBar["channel-topic"]; var edit = client.statusBar["channel-topicedit"]; text.setAttribute("collapsed", "true"); edit.removeAttribute("collapsed"); edit.value = client.currentObject.topic; edit.focus(); edit.selectionStart = 0; edit.selectionEnd = edit.value.length; } function onTopicEditEnd () { if (!("statusBar" in client)) return; var edit = client.statusBar["channel-topicedit"]; var text = client.statusBar["channel-topic"]; edit.setAttribute("collapsed", "true"); text.removeAttribute("collapsed"); focusInput(); } function onTopicKeyPress (e) { if (client.currentObject.TYPE != "IRCChannel") return; if (e.keyCode == 13) { var line = stringTrim(e.target.value); client.currentObject.setTopic (line); onTopicEditEnd(); } } function onInputFocus () { if (!("statusBar" in client)) return; var edit = client.statusBar["channel-topicedit"]; var text = client.statusBar["channel-topic"]; edit.setAttribute("collapsed", "true"); text.removeAttribute("collapsed"); } function onLoad() { initHost(client); readIRCPrefs(); setClientOutput(); frames[0].document.location.href = "chrome://chatzilla/content/outputwindow.html?" + client.DEFAULT_STYLE; initStatic(); client.userScripts = new Array(); if (client.INITIAL_SCRIPTS) { var urls = client.INITIAL_SCRIPTS.split (";"); for (var i = 0; i < urls.length; ++i) { client.userScripts[i] = new Object(); client.load(stringTrim(urls[i]), client.userScripts[i]); } } mainStep(); } function onClose() { if ("userClose" in client && client.userClose) return true; client.userClose = true; client.currentObject.display (getMsg("cli_closing"), "INFO"); if (client.getConnectionCount() == 0) /* if we're not connected to anything, just close the window */ return true; /* otherwise, try to close out gracefully */ client.quit (client.userAgent); return false; } function onUnload() { if (client.SAVE_SETTINGS) writeIRCPrefs(); } function onNotImplemented() { alert (getMsg("onNotImplementedMsg")); } /* tab click */ function onTabClick (id) { var tbi = document.getElementById (id); var view = client.viewsArray[tbi.getAttribute("viewKey")]; setCurrentObject (view.source); } function onMouseOver (e) { var i = 0; var target = e.target; var status = ""; while (!status && target && i < 5) { if ("getAttribute" in target) { status = target.getAttribute("href"); if (!status) status = target.getAttribute ("statusText"); } ++i; target = target.parentNode; } if (status) { client.status = status; } else { if (client && "defaultStatus" in client) client.status = client.defaultStatus; } } function onSimulateCommand (line) { onInputCompleteLine ({line: line}, true); } function onPopupSimulateCommand (line) { if ("user" in client._popupContext) { var nick = client._popupContext.user; if (nick.indexOf("ME!") != -1) { var details = getObjectDetails(client.currentObject); if ("server" in details) nick = details.server.me.properNick; } line = line.replace (/\$nick/ig, nick); } onInputCompleteLine ({line: line}, true); } function onPopupHighlight (ruleText) { var user = client._popupContext.user; var rec = findDynamicRule(".msg[msg-user=" + user + "]"); if (!ruleText) { if (rec) rec.sheet.deleteRule(rec.index); /* XXX just deleting it doesn't work */ addDynamicRule (".msg[msg-user=\"" + user + "\"] { }"); } else { if (rec) rec.sheet.deleteRule(rec.index); addDynamicRule (".msg[msg-user=\"" + user + "\"] " + "{" + ruleText + "}"); } } function onToggleMungerEntry(entryName) { client.munger.entries[entryName].enabled = !client.munger.entries[entryName].enabled; var item = document.getElementById("menu-munger-" + entryName); item.setAttribute ("checked", client.munger.entries[entryName].enabled); } function createPopupContext(event, target) { var targetType; client._popupContext = new Object(); client._popupContext.menu = event.originalTarget; if (!target) return "unknown"; switch (target.tagName.toLowerCase()) { case "html:a": var href = target.getAttribute("href"); client._popupContext.url = href; if (href.indexOf("irc://") == 0) { var obj = parseIRCUrl(href); if (obj) { if (obj.target) if (obj.isnick) { targetType="nick-ircurl"; client._popupContext.user = obj.target; } else targetType="channel-ircurl"; else targetType="untargeted-ircurl"; } else targetType="weburl"; } else targetType="weburl"; break; case "html:td": var user = target.getAttribute("msg-user"); if (user) { if (user.indexOf("ME!") != -1) client._popupContext.user = "ME!"; else client._popupContext.user = user; } targetType = target.getAttribute("msg-type"); break; } client._popupContext.targetType = targetType; client._popupContext.targetClass = target.getAttribute("class"); return targetType; } function onOutputContextMenuCreate(e) { function evalIfAttribute (node, attr) { var expr = node.getAttribute(attr); if (!expr) return true; expr = expr.replace (/\Wor\W/gi, " || "); expr = expr.replace (/\Wand\W/gi, " && "); return eval("(" + expr + ")"); } var target = document.popupNode; var foundSomethingUseful = false; do { if ("tagName" in target && (target.tagName == "html:a" || target.tagName == "html:td")) foundSomethingUseful = true; else target = target.parentNode; } while (target && !foundSomethingUseful); var targetType = createPopupContext(e, target); var targetClass = ("targetClass" in client._popupContext) ? client._popupContext.targetClass : ""; var viewType = client.currentObject.TYPE; var targetIsOp = "n/a"; var targetIsVoice = "n/a"; var iAmOp = "n/a"; var targetUser = ("user" in client._popupContext) ? String(client._popupContext.user) : ""; var details = getObjectDetails(client.currentObject); var targetServer = ("server" in details) ? details.server : ""; if (targetServer && targetUser == "ME!") { targetUser = targetServer.me.nick; } var targetProperNick = targetUser; if (targetServer && targetUser in targetServer.users) targetProperNick = targetServer.users[targetUser].properNick; if (viewType == "IRCChannel" && targetUser) { if (targetUser in client.currentObject.users) { var cuser = client.currentObject.users[targetUser]; targetIsOp = cuser.isOp ? "yes" : "no"; targetIsVoice = cuser.isVoice ? "yes" : "no"; } var server = getObjectDetails(client.currentObject).server; if (server && server.me.nick in client.currentObject.users && client.currentObject.users[server.me.nick].isOp) { iAmOp = "yes"; } else { iAmOp = "no"; } } var popup = document.getElementById ("outputContext"); var menuitem = popup.firstChild; do { if (evalIfAttribute(menuitem, "visibleif")) { menuitem.setAttribute ("hidden", "false"); } else { menuitem.setAttribute ("hidden", "true"); continue; } if (menuitem.hasAttribute("checkedif")) { if (evalIfAttribute(menuitem, "checkedif")) menuitem.setAttribute ("checked", "true"); else menuitem.setAttribute ("checked", "false"); } var format = menuitem.getAttribute("format"); if (format) { format = format.replace (/\$nick/gi, targetProperNick); format = format.replace (/\$viewname/gi, client.currentObject.name); menuitem.setAttribute ("label", format); } } while ((menuitem = menuitem.nextSibling)); return true; } /* popup click in user list */ function onUserListPopupClick (e) { var code = e.target.getAttribute("code"); var ary = code.substr(1, code.length).match (/(\S+)? ?(.*)/); if (!ary) return; var command = ary[1]; var ev = new CEvent ("client", "input-command", client, "onInputCommand"); ev.command = command; ev.inputData = ary[2] ? stringTrim(ary[2]) : ""; ev.target = client.currentObject; getObjectDetails (ev.target, ev); client.eventPump.addEvent (ev); } function onToggleTraceHook() { var h = client.eventPump.getHook ("event-tracer"); h.enabled = client.debugMode = !h.enabled; document.getElementById("menu-dmessages").setAttribute ("checked", h.enabled); if (h.enabled) client.currentObject.display (getMsg("debug_on"), "INFO"); else client.currentObject.display (getMsg("debug_off"), "INFO"); } function onToggleSaveOnExit() { client.SAVE_SETTINGS = !client.SAVE_SETTINGS; var m = document.getElementById ("menu-settings-autosave"); m.setAttribute ("checked", String(client.SAVE_SETTINGS)); var pref = Components.classes["@mozilla.org/preferences-service;1"] .getService(Components.interfaces.nsIPrefBranch); pref.setBoolPref ("extensions.irc.settings.autoSave", client.SAVE_SETTINGS); } function onToggleVisibility(thing) { var menu = document.getElementById("menu-view-" + thing); var ids = new Array(); switch (thing) { case "tabstrip": ids = ["view-tabs"]; break; case "info": ids = ["main-splitter", "user-list-box"]; break; case "header": ids = ["header-bar-tbox"]; break; case "status": ids = ["status-bar"]; break; default: dd ("** Unknown element ``" + menuId + "'' passed to onToggleVisibility. **"); return; } var newState; var elem = document.getElementById(ids[0]); var d = elem.getAttribute("collapsed"); if (d == "true") { newState = "false"; menu.setAttribute ("checked", "true"); client.uiState[thing] = true; } else { newState = "true"; menu.setAttribute ("checked", "false"); client.uiState[thing] = false; } for (var i in ids) { elem = document.getElementById(ids[i]); elem.setAttribute ("collapsed", newState); } updateTitle(); focusInput(); } function onDoStyleChange (newStyle) { if (newStyle == "other") newStyle = window.prompt (getMsg("onDoStyleChangeMsg")); if (newStyle) { setOutputStyle (newStyle); setCurrentObject(client.currentObject); } } function onHideCurrentView() { var tb = getTabForObject(client.currentObject); if (tb) { var i = deleteTab (tb); if (i != -1) { if (i >= client.viewsArray.length) i = client.viewsArray.length - 1; setCurrentObject (client.viewsArray[i].source); } } } function onDeleteView(view) { var tb = getTabForObject(view); if (client.viewsArray.length < 2) { view.display (getMsg("onDeleteViewMsg"), "ERROR"); return; } if (tb) { var i = deleteTab (tb); if (i != -1) { delete view.messageCount; delete view.messages; if (i >= client.viewsArray.length) i = client.viewsArray.length - 1; setCurrentObject (client.viewsArray[i].source); } } } function onClearCurrentView() { if (client.output.firstChild) client.output.removeChild (client.output.firstChild); client.currentObject.messages = null; client.currentObject.messageCount = 0; client.currentObject.display (getMsg("onClearCurrentViewMsg"), "INFO"); client.output.appendChild (client.currentObject.messages); } function onSortCol(sortColName) { const nsIXULSortService = Components.interfaces.nsIXULSortService; /* XXX remove the rdf version once 0.8 is a distant memory * 2/22/2001 */ const isupports_uri = (Components.classes["@mozilla.org/xul/xul-sort-service;1"]) ? "@mozilla.org/xul/xul-sort-service;1" : "@mozilla.org/rdf/xul-sort-service;1"; var node = document.getElementById(sortColName); if (!node) return false; // determine column resource to sort on var sortResource = node.getAttribute("resource"); var sortDirection = "ascending"; //node.setAttribute("sortActive", "true"); switch (sortColName) { case "usercol-op": document.getElementById("usercol-voice") .setAttribute("sortDirection", "natural"); document.getElementById("usercol-nick") .setAttribute("sortDirection", "natural"); break; case "usercol-voice": document.getElementById("usercol-op") .setAttribute("sortDirection", "natural"); document.getElementById("usercol-nick") .setAttribute("sortDirection", "natural"); break; case "usercol-nick": document.getElementById("usercol-voice") .setAttribute("sortDirection", "natural"); document.getElementById("usercol-op") .setAttribute("sortDirection", "natural"); break; } var currentDirection = node.getAttribute("sortDirection"); if (currentDirection == "ascending") sortDirection = "descending"; else if (currentDirection == "descending") sortDirection = "natural"; else sortDirection = "ascending"; node.setAttribute ("sortDirection", sortDirection); var xulSortService = Components.classes[isupports_uri].getService(nsIXULSortService); if (!xulSortService) return false; try { xulSortService.Sort(node, sortResource, sortDirection); } catch(ex) { //dd("Exception calling xulSortService.Sort()"); } return false; } function onToggleMunger() { client.munger.enabled = !client.munger.enabled; var item = document.getElementById("menu-munger-global"); item.setAttribute ("checked", !client.munger.enabled); } function onToggleColors() { client.enableColors = !client.enableColors; document.getElementById("menu-colors").setAttribute ("checked", client.enableColors); } function onMultilineInputKeyPress (e) { if ((e.ctrlKey || e.metaKey) && e.keyCode == 13) { /* meta-enter, execute buffer */ e.line = e.target.value; onInputCompleteLine (e); } else { if ((e.ctrlKey || e.metaKey) && e.keyCode == 40) { /* ctrl/meta-down, switch to single line mode */ multilineInputMode (false); } } } function onToggleMsgCollapse() { client.COLLAPSE_MSGS = !client.COLLAPSE_MSGS; } function onToggleCopyMessages() { client.COPY_MESSAGES = !client.COPY_MESSAGES; } function onToggleStartupURL() { var tb = getTabForObject (client.currentObject); if (!tb) return; var vk = Number(tb.getAttribute("viewKey")); var ary = client.INITIAL_URLS ? client.INITIAL_URLS.split(/\s*;\s*/) : new Array(); var url = client.currentObject.getURL(); var index = arrayIndexOf(ary, url); if (index != -1) arrayRemoveAt(ary, index); else ary.push(url); client.INITIAL_URLS = ary.join ("; "); } function onViewMenuShowing () { var loc = frames[0].document.location.href; loc = loc.substr (loc.indexOf("?") + 1); var val = (loc == "chrome://chatzilla/skin/output-default.css"); document.getElementById ("menu-view-default").setAttribute ("checked", val); val = (loc == "chrome://chatzilla/skin/output-dark.css"); document.getElementById ("menu-view-dark").setAttribute ("checked", val); val = (loc == "chrome://chatzilla/skin/output-light.css"); document.getElementById ("menu-view-light").setAttribute ("checked", val); val = client.COLLAPSE_MSGS; document.getElementById ("menu-view-collapse").setAttribute ("checked", val); val = client.COPY_MESSAGES; document.getElementById ("menu-view-copymsgs").setAttribute ("checked", val); val = isStartupURL(client.currentObject.getURL()); document.getElementById ("menu-view-startup").setAttribute ("checked", val); return true; } function onInputKeyPress (e) { switch (e.keyCode) { case 13: /* CR */ e.line = stringTrim(e.target.value); if (!e.line) return; onInputCompleteLine (e); e.target.value = ""; break; case 38: /* up */ if (e.ctrlKey || e.metaKey) { /* ctrl/meta-up, switch to multi line mode */ multilineInputMode (true); } else { if (client.lastHistoryReferenced == -2) { client.lastHistoryReferenced = -1; e.target.value = client.incompleteLine; } else if (client.lastHistoryReferenced < client.inputHistory.length - 1) { e.target.value = client.inputHistory[++client.lastHistoryReferenced]; } } break; case 40: /* down */ if (client.lastHistoryReferenced > 0) e.target.value = client.inputHistory[--client.lastHistoryReferenced]; else if (client.lastHistoryReferenced == -1) { e.target.value = ""; client.lastHistoryReferenced = -2; } else { client.lastHistoryReferenced = -1; e.target.value = client.incompleteLine; } break; default: client.lastHistoryReferenced = -1; client.incompleteLine = e.target.value; break; } } function onTest () { } function onTabCompleteRequest (e) { var elem = document.commandDispatcher.focusedElement; var singleInput = document.getElementById("input"); if (document.getBindingParent(elem) != singleInput) return; e.preventDefault(); var selStart = singleInput.selectionStart; var selEnd = singleInput.selectionEnd; var line = singleInput.value; if (!line) { if ("defaultCompletion" in client.currentObject) singleInput.value = client.currentObject.defaultCompletion; return; } if (selStart != selEnd) { /* text is highlighted, just move caret to end and exit */ singleInput.selectionStart = singleInput.selectionEnd = line.length; return; } var wordStart = line.substr(0, selStart).search(/\s\w*$/); if (wordStart == -1) wordStart = 0; else ++wordStart; var wordEnd = line.substr(selStart).search(/\s/); if (wordEnd == -1) wordEnd = line.length; else wordEnd += selStart; if ("performTabMatch" in client.currentObject) { var word = line.substring (wordStart, wordEnd); var matches = client.currentObject.performTabMatch (line, wordStart, wordEnd, word.toLowerCase(), selStart); /* if we get null back, we're supposed to fail silently */ if (!matches) return; var doubleTab = false; var date = new Date(); if ((date - client.lastTabUp) <= client.DOUBLETAB_TIME) doubleTab = true; else client.lastTabUp = date; if (doubleTab) { /* if the user hit tab twice quickly, */ if (matches.length > 0) { /* then list possible completions, */ client.currentObject.display(getMsg("tabCompleteList", [matches.length, word, matches.join(MSG_CSP)]), "INFO"); } else { /* or display an error if there are none. */ client.currentObject.display(getMsg("tabCompleteError", [word]), "ERROR"); } } else if (matches.length >= 1) { var match; if (matches.length == 1) match = matches[0]; else match = getCommonPfx(matches); singleInput.value = line.substr(0, wordStart) + match + line.substr(wordEnd); if (wordEnd < line.length) { /* if the word we completed was in the middle if the line * then move the cursor to the end of the completed word. */ var newpos = wordStart + match.length; if (matches.length == 1) { /* word was fully completed, move one additional space */ ++newpos; } singleInput.selectionEnd = e.target.selectionStart = newpos; } } } } function onWindowKeyPress (e) { var code = Number (e.keyCode); var w; var newOfs; switch (code) { case 112: /* F1 */ case 113: /* ... */ case 114: case 115: case 116: case 117: case 118: case 119: case 120: case 121: /* F10 */ var idx = code - 112; if ((idx in client.viewsArray) && (client.viewsArray[idx].source)) setCurrentObject(client.viewsArray[idx].source); break; case 33: /* pgup */ w = window.frames[0]; newOfs = w.pageYOffset - (w.innerHeight / 2); if (newOfs > 0) w.scrollTo (w.pageXOffset, newOfs); else w.scrollTo (w.pageXOffset, 0); e.preventDefault(); break; case 34: /* pgdn */ w = window.frames[0]; newOfs = w.pageYOffset + (w.innerHeight / 2); if (newOfs < (w.innerHeight + w.pageYOffset)) w.scrollTo (w.pageXOffset, newOfs); else w.scrollTo (w.pageXOffset, (w.innerHeight + w.pageYOffset)); e.preventDefault(); break; case 9: /* tab */ e.preventDefault(); break; default: } } function onInputCompleteLine(e, simulated) { if (!simulated) { if (client.inputHistory[0] != e.line) client.inputHistory.unshift (e.line); if (client.inputHistory.length > client.MAX_HISTORY) client.inputHistory.pop(); client.lastHistoryReferenced = -1; client.incompleteLine = ""; } if (e.line[0] == client.COMMAND_CHAR) { var ary = e.line.substr(1, e.line.length).match (/(\S+)? ?(.*)/); var command = ary[1].toLowerCase(); var ev = new CEvent ("client", "input-command", client, "onInputCommand"); ev.command = command; ev.inputData = ary[2] ? stringTrim(ary[2]) : ""; ev.line = e.line; ev.target = client.currentObject; getObjectDetails (ev.target, ev); client.eventPump.addEvent (ev); } else /* plain text */ { client.sayToCurrentTarget (e.line); } } function onNotifyTimeout () { for (var n in client.networks) { var net = client.networks[n]; if (net.isConnected()) { if ("notifyList" in net && net.notifyList.length > 0) { net.primServ.sendData ("ISON " + client.networks[n].notifyList.join(" ") + "\n"); } else { /* if the notify list is empty, just send a ping to see if we're * alive. */ net.primServ.sendData ("PING :ALIVECHECK\n"); } } } } client.onInputCancel = function cli_icancel (e) { if (client.currentObject.TYPE != "IRCNetwork") { client.currentObject.display (getMsg("cli_icancelMsg"), "ERROR"); return false; } if (!client.currentObject.connecting) { client.currentObject.display (getMsg("cli_icancelMsg2"), "ERROR"); return false; } client.currentObject.connectAttempt = client.currentObject.MAX_CONNECT_ATTEMPTS + 1; client.currentObject.display (getMsg("cli_icancelMsg3", client.currentObject.name), "INFO"); return true; } client.onInputCharset = function cli_icharset (e) { if (e.inputData) { if (!setCharset(e.inputData)) { client.currentObject.display (getMsg("cli_charsetError", e.inputData), "ERROR"); return false; } } client.currentObject.display (getMsg("cli_currentCharset", client.CHARSET), "INFO"); return true; } client.onInputCommand = function cli_icommand (e) { var ary = client.commands.list (e.command); if (ary.length == 0) { var o = getObjectDetails(client.currentObject); if (o.server) { client.currentObject.display (getMsg("cli_icommandMsg", e.command), "WARNING"); o.server.sendData (e.command + " " + e.inputData + "\n"); } else client.currentObject.display (getMsg("cli_icommandMsg2", e.command), "ERROR"); } else if (ary.length == 1 || ary[0].name == e.command) { if (typeof client[ary[0].func] == "undefined") client.currentObject.display (getMsg("cli_icommandMsg3", ary[0].name), "ERROR"); else { e.commandEntry = ary[0]; if (!client[ary[0].func](e)) client.currentObject.display (ary[0].name + " " + ary[0].usage, "USAGE"); } } else { client.currentObject.display (getMsg("cli_icommandMsg4", e.command), "ERROR"); var str = ""; for (var i in ary) str += str ? ", " + ary[i].name : ary[i].name; client.currentObject.display (getMsg("cli_icommandMsg5", [ary.length, str]), "ERROR"); } } client.onInputCSS = function cli_icss (e) { if (!e.inputData) return false; e.inputData = stringTrim(e.inputData); if (e.inputData.search(/^light$/i) != -1) e.inputData = "chrome://chatzilla/skin/output-light.css"; else if (e.inputData.search(/^dark$/i) != -1) e.inputData = "chrome://chatzilla/skin/output-dark.css"; else if (e.inputData.search(/^default$/i) != -1) e.inputData = "chrome://chatzilla/skin/output-default.css"; else if (e.inputData.search(/^none$/i) != -1) e.inputData = "chrome://chatzilla/content/output-base.css"; client.currentObject.display (getMsg("cli_icss", e.inputData), "INFO"); frames[0].document.location.href = "chrome://chatzilla/content/outputwindow.html?" + e.inputData; client.DEFAULT_STYLE = e.inputData; return true; } client.onInputSimpleCommand = function cli_iscommand (e) { var o = getObjectDetails(client.currentObject); if ("server" in o) { o.server.sendData (e.command + " " + e.inputData + "\n"); return true; } else { client.currentObject.display (getMsg("onInputSimpleCommandMsg", e.command),"WARNING"); return false; } } client.onInputStatus = function cli_istatus (e) { function serverStatus (s) { if (!s.connection.isConnected) { client.currentObject.display(getMsg("cli_istatusServerOff", s.parent.name), "STATUS"); return; } var serverType = (s.parent.primServ == s) ? getMsg("cli_istatusPrimary") : getMsg("cli_istatusSecondary"); client.currentObject.display(getMsg("cli_istatusServerOn", [s.parent.name, s.me.properNick, s.connection.host, s.connection.port, serverType]), "STATUS"); var connectTime = formatDateOffset ((new Date() - s.connection.connectDate) / 1000); var pingTime = (s.lastPing) ? formatDateOffset ((new Date() - s.lastPing) / 1000) : getMsg("na"); var lag = (s.lag >= 0) ? s.lag : getMsg("na"); client.currentObject.display(getMsg("cli_istatusServerDetail", [s.parent.name, connectTime, pingTime, lag]), "STATUS"); } function channelStatus (c) { var cu; var net = c.parent.parent.name; if ((cu = c.users[c.parent.me.nick])) { var mtype; if (cu.isOp && cu.isVoice) mtype = getMsg("cli_istatusBoth"); else if (cu.isOp) mtype = getMsg("cli_istatusOperator"); else if (cu.isVoice) mtype = getMsg("cli_istatusVoiced"); else mtype = getMsg("cli_istatusMember"); var mode = c.mode.getModeStr(); if (!mode) mode = getMsg("cli_istatusNoMode"); client.currentObject.display (getMsg("cli_istatusChannelOn", [net, mtype, c.name, mode, "irc://" + escape(net) + "/" + escape(c.name) + "/"]), "STATUS"); client.currentObject.display (getMsg("cli_istatusChannelDetail", [net, c.name, c.getUsersLength(), c.opCount, c.voiceCount]), "STATUS"); if (c.topic) client.currentObject.display (getMsg("cli_istatusChannelTopic", [net, c.name, c.topic]), "STATUS"); else client.currentObject.display (getMsg("cli_istatusChannelNoTopic", [net, c.name]), "STATUS"); } else client.currentObject.display (getMsg("cli_istatusChannelOff", [net, c.name]), "STATUS"); } client.currentObject.display (client.userAgent, "STATUS"); client.currentObject.display (getMsg("cli_istatusClient", [CIRCNetwork.prototype.INITIAL_NICK, CIRCNetwork.prototype.INITIAL_NAME, CIRCNetwork.prototype.INITIAL_DESC]), "STATUS"); var n, s, c; switch (client.currentObject.TYPE) { case "IRCNetwork": for (s in client.currentObject.servers) { serverStatus(client.currentObject.servers[s]); for (c in client.currentObject.servers[s].channels) channelStatus (client.currentObject.servers[s].channels[c]); } break; case "IRCChannel": serverStatus(client.currentObject.parent); channelStatus(client.currentObject); break; default: for (n in client.networks) for (s in client.networks[n].servers) { serverStatus(client.networks[n].servers[s]); for (c in client.networks[n].servers[s].channels) channelStatus (client.networks[n].servers[s].channels[c]); } break; } client.currentObject.display (getMsg("cli_istatusEnd"), "END_STATUS"); return true; } client.onInputHelp = function cli_ihelp (e) { var ary = client.commands.list (e.inputData); if (ary.length == 0) { client.currentObject.display (getMsg("cli_ihelpMsg", e.inputData), "ERROR"); return false; } var saveDir = client.PRINT_DIRECTION; client.PRINT_DIRECTION = 1; for (var i in ary) { client.currentObject.display (ary[i].name + " " + ary[i].usage, "USAGE"); client.currentObject.display (ary[i].help, "HELP"); } client.PRINT_DIRECTION = saveDir; return true; } client.onInputTestDisplay = function cli_testdisplay (e) { var o = getObjectDetails(client.currentObject); client.currentObject.display (getMsg("cli_testdisplayMsg"), "HELLO"); client.currentObject.display (getMsg("cli_testdisplayMsg2"), "INFO"); client.currentObject.display (getMsg("cli_testdisplayMsg3"), "ERROR"); client.currentObject.display (getMsg("cli_testdisplayMsg4"), "HELP"); client.currentObject.display (getMsg("cli_testdisplayMsg5"), "USAGE"); client.currentObject.display (getMsg("cli_testdisplayMsg6"), "STATUS"); if (o.server && o.server.me) { var me = o.server.me; var viewType = client.currentObject.TYPE; var sampleUser = {TYPE: "IRCUser", nick: "ircmonkey", name: "IRCMonkey", properNick: "IRCMonkey", host: ""}; var sampleChannel = {TYPE: "IRCChannel", name: "#mojo"}; function test (from, to) { var fromText = (from != me) ? from.TYPE + " ``" + from.name + "''" : getMsg("cli_testdisplayYou"); var toText = (to != me) ? to.TYPE + " ``" + to.name + "''" : getMsg("cli_testdisplayYou"); client.currentObject.display (getMsg("cli_testdisplayMsg7", [fromText, toText]), "PRIVMSG", from, to); client.currentObject.display (getMsg("cli_testdisplayMsg8", [fromText, toText]), "ACTION", from, to); client.currentObject.display (getMsg("cli_testdisplayMsg9", [fromText, toText]), "NOTICE", from, to); } test (sampleUser, me); /* from user to me */ test (me, sampleUser); /* me to user */ client.currentObject.display (getMsg("cli_testdisplayMsg10"), "PRIVMSG", sampleUser, me); client.currentObject.display (getMsg("cli_testdisplayMsg11"), "PRIVMSG", sampleUser, me); client.currentObject.display (getMsg("cli_testdisplayMsg12"), "PRIVMSG", sampleUser, me); client.currentObject.display (getMsg("cli_testdisplayMsg13"), "PRIVMSG", sampleUser, me); client.currentObject.display (unescape(getMsg("cli_testdisplayMsg20")), "PRIVMSG", sampleUser, me); client.currentObject.display (unescape(getMsg("cli_testdisplayMsg21")), "PRIVMSG", sampleUser, me); if (viewType == "IRCChannel") { test (sampleUser, sampleChannel); /* user to channel */ test (me, sampleChannel); /* me to channel */ client.currentObject.display (getMsg("cli_testdisplayMsg14"), "TOPIC", sampleUser, sampleChannel); client.currentObject.display (getMsg("cli_testdisplayMsg15"), "JOIN", sampleUser, sampleChannel); client.currentObject.display (getMsg("cli_testdisplayMsg16"), "PART", sampleUser, sampleChannel); client.currentObject.display (getMsg("cli_testdisplayMsg17"), "KICK", sampleUser, sampleChannel); client.currentObject.display (getMsg("cli_testdisplayMsg18"), "QUIT", sampleUser, sampleChannel); client.currentObject.display (getMsg("cli_testdisplayMsg19", me.nick), "PRIVMSG", sampleUser, sampleChannel); client.currentObject.display (getMsg("cli_testdisplayMsg11"), "PRIVMSG", me, sampleChannel); } } return true; } client.onInputNetwork = function cli_inetwork (e) { if (!e.inputData) return false; var net = client.networks[e.inputData]; if (net) { setCurrentObject (net); } else { client.currentObject.display (getMsg("cli_inetworkMsg",e.inputData), "ERROR"); return false; } return true; } client.onInputNetworks = function clie_ilistnets (e) { var span = document.createElementNS("http://www.w3.org/1999/xhtml", "html:span"); span.appendChild (newInlineText(getMsg("cli_listNetworks.a"))); var netnames = keys(client.networks).sort(); var lastname = netnames[netnames.length - 1]; for (n in netnames) { var net = client.networks[netnames[n]]; var a = document.createElementNS("http://www.w3.org/1999/xhtml", "html:a"); a.setAttribute ("class", "chatzilla-link"); a.setAttribute ("href", "irc://" + net.name); var t = newInlineText (net.name); a.appendChild (t); span.appendChild (a); if (netnames[n] != lastname) span.appendChild (newInlineText (MSG_CSP)); } span.appendChild (newInlineText(getMsg("cli_listNetworks.b"))); client.currentObject.display (span, "INFO"); return true; } client.onInputServer = function cli_iserver (e) { if (!e.inputData) return false; var ary = e.inputData.match(/^([^\s\:]+)[\s\:]?(?:(\d+)(?:\s+(\S+)|$)|(\S+)|$)/); var pass; if (3 in ary && ary[3]) pass = ary[3]; else if (4 in ary && ary[4]) pass = ary[4]; if (ary == null) return false; var port; if (2 in ary && ary[2]) port = ary[2]; else port = 6667; var net = null; for (var n in client.networks) { if (n == ary[1]) { if (client.networks[n].isConnected()) { client.currentObject.display (getMsg("cli_iserverMsg",ary[1]), "ERROR"); return false; } else { net = client.networks[n]; break; } } } if (!net) { /* if there wasn't already a network created for this server, * make one. */ client.networks[ary[1]] = new CIRCNetwork (ary[1], [{name: ary[1], port: port, password: pass}], client.eventPump); } else { /* if we've already created a network for this server, reinit the * serverList, in case the user changed the port or password */ net.serverList = [{name: ary[1], port: port, password: pass}]; } client.connectToNetwork (ary[1]); return true; } client.onInputQuit = function cli_quit (e) { if (!("server" in e)) { client.currentObject.display (getMsg("cli_quitMsg"), "ERROR"); return false; } if (!e.server.connection.isConnected) { client.currentObject.display (getMsg("cli_quitMsg2"), "ERROR"); return false; } e.server.logout (e.inputData); return true; } client.onInputExit = function cli_exit (e) { client.quit(e.inputData); window.close(); return true; } client.onInputDelete = function cli_idelete (e) { if ("inputData" in e && e.inputData) return false; onDeleteView(client.currentObject); return true; } client.onInputHide= function cli_ihide (e) { onHideCurrentView(); return true; } client.onInputClear = function cli_iclear (e) { onClearCurrentView(); return true; } client.onInputNames = function cli_inames (e) { var chan; if (!e.network) { client.currentObject.display (getMsg("cli_inamesMsg"), "ERROR"); return false; } if (e.inputData) { if (!e.network.isConnected()) { client.currentObject.display (getMsg("cli_inamesMsg2", e.network.name), "ERROR"); return false; } chan = e.inputData; } else { if (client.currentObject.TYPE != "IRCChannel") { client.currentObject.display (getMsg("cli_inamesMsg3"),"ERROR"); return false; } chan = e.channel.name; } client.currentObject.pendingNamesReply = true; e.server.sendData ("NAMES " + chan + "\n"); return true; } client.onInputInfobar = function cli_tinfo () { onToggleVisibility ("info"); return true; } client.onInputTabstrip = function cli_itabs () { onToggleVisibility ("tabstrip"); return true; } client.onInputStatusbar = function cli_isbar () { onToggleVisibility ("status"); return true; } client.onInputHeaders = function cli_isbar () { onToggleVisibility ("header"); return true; } client.onInputCommands = function cli_icommands (e) { client.currentObject.display (getMsg("cli_icommandsMsg"), "INFO"); var pattern = (e && e.inputData) ? e.inputData : ""; var matchResult = client.commands.listNames(pattern).join(MSG_CSP); if (pattern) client.currentObject.display (getMsg("cli_icommandsMsg2a", [pattern, matchResult]), "INFO"); else client.currentObject.display (getMsg("cli_icommandsMsg2b", matchResult), "INFO"); return true; } client.onInputAttach = function cli_iattach (e) { if (!e.inputData) { return false; } if (e.inputData.search(/irc:\/\//i) != 0) e.inputData = "irc://" + e.inputData; var url = parseIRCURL(e.inputData); if (!url) { client.currentObject.display (getMsg("badIRCURL", e.inputData), "ERROR"); return false; } gotoIRCURL (url); return true; } client.onInputMe = function cli_ime (e) { if (typeof client.currentObject.act != "function") { client.currentObject.display (getMsg("cli_imeMsg"), "ERROR"); return false; } e.inputData = filterOutput (e.inputData, "ACTION", "ME!"); client.currentObject.display (e.inputData, "ACTION", "ME!", client.currentObject); client.currentObject.act (fromUnicode(e.inputData)); return true; } client.onInputQuery = function cli_iquery (e) { if (!e.server.users) { client.currentObject.display (getMsg("cli_imsgMsg"), "ERROR"); return false; } var ary = e.inputData.match (/(\S+)\s*(.*)?/); if (ary == null) { client.currentObject.display (getMsg("cli_imsgMsg2"), "ERROR"); return false; } var tab = openQueryTab (e.server, ary[1]); setCurrentObject (tab); if (ary[2]) { var msg = filterOutput(ary[2], "PRIVMSG", "ME!"); tab.display (msg, "PRIVMSG", "ME!", tab); tab.say (fromUnicode(ary[2])); } e.user = tab; return true; } client.onInputMsg = function cli_imsg (e) { if (!e.network || !e.network.isConnected()) { client.currentObject.display (getMsg("cli_imsgMsg4"), "ERROR"); return false; } var ary = e.inputData.match (/(\S+)\s+(.*)/); if (ary == null) return false; var usr = e.network.primServ.addUser(ary[1].toLowerCase()); var msg = filterOutput(ary[2], "PRIVMSG", "ME!"); client.currentObject.display (msg, "PRIVMSG", "ME!", usr); usr.say (fromUnicode(ary[2])); return true; } client.onInputNick = function cli_inick (e) { if (!e.inputData) return false; if (e.server) e.server.sendData ("NICK " + e.inputData + "\n"); CIRCNetwork.prototype.INITIAL_NICK = e.inputData; return true; } client.onInputName = function cli_iname (e) { if (!e.inputData) return false; CIRCNetwork.prototype.INITIAL_NAME = e.inputData; return true; } client.onInputDesc = function cli_idesc (e) { if (!e.inputData) return false; CIRCNetwork.prototype.INITIAL_DESC = e.inputData; return true; } client.onInputQuote = function cli_iquote (e) { if (!e.network || !e.network.isConnected()) { client.currentObject.display (getMsg("cli_iquoteMsg"), "ERROR"); return false; } e.server.sendData (e.inputData + "\n"); return true; } client.onInputEval = function cli_ieval (e) { if (!e.inputData) return false; if (e.inputData.indexOf ("\n") != -1) e.inputData = "\n" + e.inputData + "\n"; try { client.currentObject.doEval = function (__s) { return eval(__s); } client.currentObject.display (e.inputData, "EVAL-IN"); var rv = String(client.currentObject.doEval (e.inputData)); client.currentObject.display (rv, "EVAL-OUT"); } catch (ex) { client.currentObject.display (String(ex), "ERROR"); } return true; } client.onInputCTCP = function cli_ictcp (e) { if (!e.inputData) return false; if (!e.server) { client.currentObject.display (getMsg("cli_ictcpMsg"), "ERROR"); return false; } var ary = e.inputData.match(/^(\S+) (\S+)\s?(.*)$/); if (ary == null) return false; e.server.ctcpTo (ary[1], ary[2], ary[3]); return true; } client.onInputJoin = function cli_ijoin (e) { if (!e.network || !e.network.isConnected()) { if (!e.network) client.currentObject.display (getMsg("cli_ijoinMsg"), "ERROR"); else client.currentObject.display (getMsg("cli_ijoinMsg2", e.network.name1), "ERROR"); return false; } var ary = e.inputData.match(/(\S+) ?(\S+)?/); var name; var key = ""; if (ary) { name = ary[1]; if (2 in ary) key = ary[2]; } else { if (client.currentObject.TYPE == "IRCChannel") name = client.currentObject.name; else return false; if (client.currentObject.mode.key) key = client.currentObject.mode.key } if ((name[0] != "#") && (name[0] != "&") && (name[0] != "+") && (name[0] != "!")) name = "#" + name; e.channel = e.server.addChannel (name); e.channel.join(key); if (!("messages" in e.channel)) e.channel.display (getMsg("cli_ijoinMsg3",e.channel.name), "INFO"); setCurrentObject(e.channel); return true; } client.onInputLeave = function cli_ipart (e) { if (!e.channel) { client.currentObject.display (getMsg("cli_ipartMsg"), "ERROR"); return false; } e.channel.part(); return true; } client.onInputZoom = function cli_izoom (e) { client.currentObject.display (getMsg("cli_izoomMsg"), "WARNING"); if (!e.inputData) return false; if (!e.channel) { client.currentObject.display (getMsg("cli_izoomMsg2"), "ERROR"); return false; } var cuser = e.channel.getUser(e.inputData); if (!cuser) { client.currentObject.display (getMsg("cli_izoomMsg3",e.inputData), "ERROR"); return false; } setCurrentObject(cuser); return true; } /** * Performs a whois on a user. */ client.onInputWhoIs = function cli_whois (e) { if (!e.network || !e.network.isConnected()) { client.currentObject.display (getMsg("cli_whoisMsg"), "ERROR"); return false; } if (!e.inputData) { var nicksAry = e.channel.getSelectedUsers(); if (nicksAry) { mapObjFunc(nicksAry, "whois", null); return true; } else { return false; } } // Otherwise, there is no guarantee that the username // is currently a user var nick = e.inputData.match( /\S+/ ); e.server.whois (nick); return true; } client.onInputTopic = function cli_itopic (e) { if (!e.channel) { client.currentObject.display (getMsg("cli_itopicMsg"), "ERROR"); return false; } if (!e.inputData) { e.server.sendData ("TOPIC " + e.channel.name + "\n"); } else { if (!e.channel.setTopic(fromUnicode(e.inputData))) client.currentObject.display (getMsg("cli_itopicMsg2"), "ERROR"); } return true; } client.onInputAbout = function cli_iabout (e) { client.currentObject.display (CIRCServer.prototype.VERSION_RPLY, "ABOUT"); client.currentObject.display (getMsg("aboutHomepage"), "ABOUT"); return true; } client.onInputAway = function cli_iaway (e) { if (!e.network || !e.network.isConnected()) { client.currentObject.display (getMsg("cli_iawayMsg"), "ERROR"); return false; } else if (!e.inputData) { e.server.sendData ("AWAY\n"); } else { e.server.sendData ("AWAY :" + e.inputData + "\n"); } return true; } /** * Removes operator status from a user. */ client.onInputDeop = function cli_ideop (e) { /* NOTE: See the next function for a well commented explanation of the general form of these Multiple-Target type functions */ if (!e.channel) { client.currentObject.display (getMsg("cli_ideopMsg"), "ERROR"); return false; } if (!e.inputData) { var nicksAry = e.channel.getSelectedUsers(); if (nicksAry) { mapObjFunc(nicksAry, "setOp", false); return true; } else { return false; } } var cuser = e.channel.getUser(e.inputData); if (!cuser) { /* use e.inputData so the case is retained */ client.currentObject.display (getMsg("cli_ideopMsg2",e.inputData), "ERROR"); return false; } cuser.setOp(false); return true; } /** * Gives operator status to a channel user. */ client.onInputOp = function cli_iop (e) { if (!e.channel) { client.currentObject.display (getMsg("cli_iopMsg"), "ERROR"); return false; } if (!e.inputData) { /* Since no param is passed, check for selection */ var nicksAry = e.channel.getSelectedUsers(); /* If a valid array of user objects, then call the mapObjFunc */ if (nicksAry) { /* See test3-utils.js: this simply applies the setOp function to every item in nicksAry with the parameter of "true" each time */ mapObjFunc(nicksAry, "setOp", true); return true; } else { /* If no input and no selection, return false to display the usage */ return false; } } /* We do have inputData, so use that, rather than any other option */ var cuser = e.channel.getUser(e.inputData); if (!cuser) { client.currentObject.display (getMsg("cli_iopMsg2",e.inputData),"ERROR"); return false; } cuser.setOp(true); return true; } client.onInputPing = function cli_iping (e) { if (!e.inputData) return false; onSimulateCommand("/ctcp " + e.inputData + " PING"); return true; } client.onInputVersion = function cli_iversion (e) { if (!e.inputData) return false; onSimulateCommand("/ctcp " + e.inputData + " VERSION"); return true; } /** * Gives voice status to a user. */ client.onInputVoice = function cli_ivoice (e) { if (!e.channel) { client.currentObject.display (getMsg("cli_ivoiceMsg"), "ERROR"); return false; } if (!e.inputData) { var nicksAry = e.channel.getSelectedUsers(); if (nicksAry) { mapObjFunc(nicksAry, "setVoice", true); return true; } else { return false; } } var cuser = e.channel.getUser(e.inputData); if (!cuser) { client.currentObject.display (getMsg("cli_ivoiceMsg2",e.inputData), "ERROR"); return false; } cuser.setVoice(true); return true; } /** * Removes voice status from a user. */ client.onInputDevoice = function cli_devoice (e) { if (!e.channel) { client.currentObject.display (getMsg("cli_devoiceMsg"), "ERROR"); return false; } if (!e.inputData) { var nicksAry = e.channel.getSelectedUsers(); if (nicksAry) { mapObjFunc(nicksAry, "setVoice", false); return true; } else { return false; } } var cuser = e.channel.getUser(e.inputData); if (!cuser) { client.currentObject.display (getMsg("cli_devoiceMsg2", e.inputData), "ERROR"); return false; } cuser.setVoice(false); return true; } /** * Displays input to the current view, but doesn't send it to the server. */ client.onInputEcho = function cli_iecho (e) { if (!e.inputData) { return false; } else { client.currentObject.display (e.inputData, "ECHO"); return true; } } client.onInputInvite = function cli_iinvite (e) { if (!e.network || !e.network.isConnected()) { client.currentObject.display (getMsg("cli_iinviteMsg"), "ERROR"); return false; } else if (!e.channel) { client.currentObject.display (getMsg("cli_iinviteMsg2"), "ERROR"); return false; } if (!e.inputData) { return false; } else { var ary = e.inputData.split( /\s+/ ); if (ary.length == 1) { e.channel.invite (ary[0]); } else { var chan = e.server.channels[ary[1].toLowerCase()]; if (chan == undefined) { client.currentObject.display (getMsg("cli_iinviteMsg3", ary[1]), "ERROR"); return false; } chan.invite (ary[0]); } return true; } } client.onInputKick = function cli_ikick (e) { if (!e.channel) { client.currentObject.display (getMsg("cli_ikickMsg"), "ERROR"); return false; } if (!e.inputData) { var nicksAry = e.channel.getSelectedUsers(); if (nicksAry) { mapObjFunc(nicksAry, "kick", ""); return true; } else { return false; } } var ary = e.inputData.match ( /(\S+)? ?(.*)/ ); var cuser = e.channel.getUser(ary[1]); if (!cuser) { client.currentObject.display (getMsg("cli_ikickMsg2", e.inputData), "ERROR"); return false; } if (ary.length > 2) { cuser.kick(ary[2]); } else cuser.kick(); return true; } client.onInputClient = function cli_iclient (e) { if (!client.messages) client.display (getMsg("cli_iclientMsg"), "INFO"); getTabForObject (client, true); setCurrentObject (client); return true; } client.onInputNotify = function cli_inotify (e) { if (!("network" in e) || !e.network) { client.currentObject.display (getMsg("cli_inotifyMsg"), "ERROR"); return false; } var net = e.network; if (!e.inputData) { if ("notifyList" in net && net.notifyList.length > 0) { /* delete the lists and force a ISON check, this will * print the current online/offline status when the server * responds */ delete net.onList; delete net.offList; onNotifyTimeout(); } else client.currentObject.display (getMsg("cli_inotifyMsg2"), "INFO"); } else { var adds = new Array(); var subs = new Array(); if (!("notifyList" in net)) net.notifyList = new Array(); var ary = e.inputData.toLowerCase().split(/\s+/); for (var i in ary) { var idx = arrayIndexOf (net.notifyList, ary[i]); if (idx == -1) { net.notifyList.push (ary[i]); adds.push(ary[i]); } else { arrayRemoveAt (net.notifyList, idx); subs.push(ary[i]); } } var msgname; if (adds.length > 0) { msgname = (adds.length == 1) ? "cli_inotifyMsg3a" : "cli_inotifyMsg3b"; client.currentObject.display (getMsg(msgname, arraySpeak(adds))); } if (subs.length > 0) { msgname = (subs.length == 1) ? "cli_inotifyMsg4a" : "cli_inotifyMsg4b"; client.currentObject.display (getMsg(msgname, arraySpeak(subs))); } delete net.onList; delete net.offList; onNotifyTimeout(); } return true; } client.onInputStalk = function cli_istalk (e) { if (!e.inputData) { if (client.stalkingVictims.length == 0) { client.currentObject.display(getMsg("cli_istalkMsg"), "STALK"); } else { client.currentObject.display (getMsg("cli_istalkMsg2", client.stalkingVictims.join(MSG_CSP)), "STALK"); } return true; } client.stalkingVictims[client.stalkingVictims.length] = e.inputData; client.currentObject.display(getMsg("cli_istalkMsg3",e.inputData), "STALK"); return true; } client.onInputUnstalk = function cli_iunstalk ( e ) { if (!e.inputData) return false; for (i in client.stalkingVictims) { if (client.stalkingVictims[i].match("^" + e.inputData +"$", "i")) { client.stalkingVictims.splice(i, 1); client.currentObject.display(getMsg("cli_iunstalkMsg", e.inputData), "UNSTALK"); return true; } } client.currentObject.display(getMsg("cli_iunstalkMsg2", e.inputData), "UNSTALK"); return true; } /* 'private' function, should only be used from inside */ CIRCChannel.prototype._addUserToGraph = function my_addtograph (user) { if (!user.TYPE) dd (getStackTrace()); client.rdf.Assert (this.getGraphResource(), client.rdf.resChanUser, user.getGraphResource(), true); } /* 'private' function, should only be used from inside */ CIRCChannel.prototype._removeUserFromGraph = function my_remfgraph (user) { client.rdf.Unassert (this.getGraphResource(), client.rdf.resChanUser, user.getGraphResource()); } CIRCNetwork.prototype.onInfo = function my_netinfo (e) { this.display (e.msg, "INFO"); } CIRCNetwork.prototype.onUnknown = function my_unknown (e) { e.params.shift(); /* remove the code */ e.params.shift(); /* and the dest. nick (always me) */ /* if it looks like some kind of "end of foo" code, and we don't * already have a mapping for it, make one up */ if (!(e.code in client.responseCodeMap) && e.meat.search (/^end of/i) != -1) client.responseCodeMap[e.code] = "---"; this.display (e.params.join(" ") + ": " + e.meat, e.code.toUpperCase()); } CIRCNetwork.prototype.on001 = /* Welcome! */ CIRCNetwork.prototype.on002 = /* your host is */ CIRCNetwork.prototype.on003 = /* server born-on date */ CIRCNetwork.prototype.on004 = /* server id */ CIRCNetwork.prototype.on005 = /* server features */ CIRCNetwork.prototype.on250 = /* highest connection count */ CIRCNetwork.prototype.on251 = /* users */ CIRCNetwork.prototype.on252 = /* opers online (in params[2]) */ CIRCNetwork.prototype.on254 = /* channels found (in params[2]) */ CIRCNetwork.prototype.on255 = /* link info */ CIRCNetwork.prototype.on265 = /* local user details */ CIRCNetwork.prototype.on266 = /* global user details */ CIRCNetwork.prototype.on375 = /* start of MOTD */ CIRCNetwork.prototype.on372 = /* MOTD line */ CIRCNetwork.prototype.on376 = /* end of MOTD */ function my_showtonet (e) { var p = (2 in e.params) ? e.params[2] + " " : ""; var str = ""; switch (e.code) { case "004": case "005": str = e.params.slice(3).join (" "); break; case "001": updateTitle(this); updateNetwork (this); if (client.currentObject == this) { var status = document.getElementById("offline-status"); status.removeAttribute ("offline"); } if ("pendingURLs" in this) { var url = this.pendingURLs.pop(); while (url) { gotoIRCURL(url); url = this.pendingURLs.pop(); } delete this.pendingURLs; } str = e.meat; break; case "372": case "375": case "376": if (this.IGNORE_MOTD) return; /* no break */ default: str = e.meat; break; } this.displayHere (p + str, e.code.toUpperCase()); } CIRCNetwork.prototype.onUnknownCTCPReply = function my_ctcprunk (e) { this.display (getMsg("my_ctcprunk", [e.CTCPCode, e.CTCPData, e.user.properNick]), "CTCP_REPLY", e.user, e.server.me); } CIRCNetwork.prototype.onNotice = function my_notice (e) { this.display (e.meat, "NOTICE", this, e.server.me); } CIRCNetwork.prototype.on303 = /* ISON (aka notify) reply */ function my_303 (e) { var onList = stringTrim(e.meat.toLowerCase()).split(/\s+/); var offList = new Array(); var newArrivals = new Array(); var newDepartures = new Array(); var o = getObjectDetails(client.currentObject); var displayTab; var i; if ("network" in o && o.network == this && client.currentObject != this) displayTab = client.currentObject; for (i in this.notifyList) if (!arrayContains(onList, this.notifyList[i])) /* user is not on */ offList.push (this.notifyList[i]); if ("onList" in this) { for (i in onList) if (!arrayContains(this.onList, onList[i])) /* we didn't know this person was on */ newArrivals.push(onList[i]); } else this.onList = newArrivals = onList; if ("offList" in this) { for (i in offList) if (!arrayContains(this.offList, offList[i])) /* we didn't know this person was off */ newDepartures.push(offList[i]); } else this.offList = newDepartures = offList; if (newArrivals.length > 0) { this.displayHere (arraySpeak (newArrivals, "is", "are") + " online.", "NOTIFY-ON"); if (displayTab) displayTab.displayHere (arraySpeak (newArrivals, "is", "are") + " online.", "NOTIFY-ON"); } if (newDepartures.length > 0) { this.displayHere (arraySpeak (newDepartures, "is", "are") + " offline.", "NOTIFY-OFF"); if (displayTab) displayTab.displayHere (arraySpeak (newDepartures, "is", "are") + " offline.", "NOTIFY-OFF"); } this.onList = onList; this.offList = offList; } CIRCNetwork.prototype.on321 = /* LIST reply header */ function my_321 (e) { this.displayHere (e.params[2] + " " + e.meat, "321"); if (client.currentObject != this) client.currentObject.display (getMsg("my_321", this.name), "INFO"); } CIRCNetwork.prototype.on323 = /* end of LIST reply */ function my_323 (e) { this.displayHere (e.params.join(" ") + ": " + e.meat, "323"); } CIRCNetwork.prototype.on322 = /* LIST reply */ function my_listrply (e) { this.displayHere (getMsg("my_322", [e.params[2], e.params[3], e.meat]), "322"); } /* end of WHO */ CIRCNetwork.prototype.on315 = function my_315 (e) { var matches; if ("whoMatches" in this) matches = this.whoMatches; else matches = 0; e.user.display (getMsg("my_315", [e.params[2], matches]), e.code); delete this.whoMatches; } CIRCNetwork.prototype.on352 = function my_352 (e) { //0-352 1-rginda_ 2-#chatzilla 3-chatzilla 4-h-64-236-139-254.aoltw.net 5-irc.mozilla.org 6-rginda 7-H var desc; var hops = "?"; var ary = e.meat.match(/(\d+)\s(.*)/); if (ary) { hops = Number(ary[1]); desc = ary[2]; } else { desc = e.meat; } var status = e.params[7]; if (e.params[7] == "G") status = getMsg("my_352.g"); else if (e.params[7] == "H") status = getMsg("my_352.h"); e.user.display (getMsg("my_352", [e.params[6], e.params[3], e.params[4], desc, status, e.params[2], e.params[5], hops]), e.code, e.user); updateTitle (e.user); if ("whoMatches" in this) ++this.whoMatches; else this.whoMatches = 1; } CIRCNetwork.prototype.on311 = /* whois name */ CIRCNetwork.prototype.on319 = /* whois channels */ CIRCNetwork.prototype.on312 = /* whois server */ CIRCNetwork.prototype.on317 = /* whois idle time */ CIRCNetwork.prototype.on318 = /* whois end of whois*/ function my_whoisreply (e) { var text = "egads!"; var nick = e.params[2]; switch (Number(e.code)) { case 311: text = getMsg("my_whoisreplyMsg", [nick, e.params[3], e.params[4], e.meat]); break; case 319: var ary = stringTrim(e.meat).split(" "); text = getMsg("my_whoisreplyMsg2",[nick, arraySpeak(ary)]); break; case 312: text = getMsg("my_whoisreplyMsg3", [nick, e.params[3], e.meat]); break; case 317: text = getMsg("my_whoisreplyMsg4", [nick, formatDateOffset(Number(e.params[3])), new Date(Number(e.params[4]) * 1000)]); break; case 318: text = getMsg("my_whoisreplyMsg5", nick); break; } if (nick in e.server.users && "messages" in e.server.users[nick]) { var user = e.server.users[nick]; updateTitle(user); user.display (text, e.code); } else { e.server.parent.display(text, e.code); } } CIRCNetwork.prototype.on341 = /* invite reply */ function my_341 (e) { this.display (getMsg("my_341", [e.params[2], e.params[3]]), "341"); } CIRCNetwork.prototype.onInvite = /* invite message */ function my_invite (e) { this.display (getMsg("my_Invite", [e.user.properNick, e.user.name, e.user.host, e.meat]), "INVITE"); } CIRCNetwork.prototype.on433 = /* nickname in use */ function my_433 (e) { if (e.params[2] == CIRCNetwork.prototype.INITIAL_NICK && this.connecting) { var newnick = CIRCNetwork.prototype.INITIAL_NICK + "_"; CIRCNetwork.prototype.INITIAL_NICK = newnick; e.server.parent.display (getMsg("my_433Retry", [e.params[2], newnick]), "433"); this.primServ.sendData("NICK " + newnick + "\n"); } else { this.display (getMsg("my_433Msg", e.params[2]), "433"); } } CIRCNetwork.prototype.onStartConnect = function my_sconnect (e) { this.display (getMsg("my_sconnect", [this.name, e.host, e.port, e.connectAttempt, this.MAX_CONNECT_ATTEMPTS]), "INFO"); } CIRCNetwork.prototype.onError = function my_neterror (e) { var msg; if (typeof e.errorCode != "undefined") { switch (e.errorCode) { case JSIRC_ERR_NO_SOCKET: msg = getMsg ("my_neterrorNoSocket"); break; case JSIRC_ERR_EXHAUSTED: msg = getMsg ("my_neterrorExhausted"); break; } } else msg = e.meat; this.display (msg, "ERROR"); } CIRCNetwork.prototype.onDisconnect = function my_netdisconnect (e) { var connection = e.server.connection; var msg; if (typeof e.disconnectStatus != "undefined") { switch (e.disconnectStatus) { case 0: msg = getMsg("my_netdisconnectConnectionClosed", [this.name, connection.host, connection.port]); break; case NS_ERROR_CONNECTION_REFUSED: msg = getMsg("my_netdisconnectConnectionRefused", [this.name, connection.host, connection.port]); break; case NS_ERROR_NET_TIMEOUT: msg = getMsg("my_netdisconnectConnectionTimeout", [this.name, connection.host, connection.port]); break; case NS_ERROR_UNKNOWN_HOST: msg = getMsg("my_netdisconnectUnknownHost", connection.host); break; default: msg = getMsg("my_netdisconnectConnectionClosedStatus", [this.name, connection.host, connection.port]); break; } } else { msg = getMsg("my_neterrorConnectionClosed", [this.name, connection.host, connection.port]); } for (var v in client.viewsArray) { var obj = client.viewsArray[v].source; if (obj != client) { var details = getObjectDetails(obj); if ("server" in details && details.server == e.server) obj.displayHere (msg, "ERROR"); } } for (var c in this.primServ.channels) { var channel = this.primServ.channels[c]; client.rdf.clearTargets(channel.getGraphResource(), client.rdf.resChanUser); } this.connecting = false; updateTitle(); if ("userClose" in client && client.userClose && client.getConnectionCount() == 0) window.close(); } CIRCNetwork.prototype.onCTCPReplyPing = function my_replyping (e) { var delay = formatDateOffset ((new Date() - new Date(Number(e.CTCPData))) / 1000); display (getMsg("my_replyping", [e.user.properNick, delay]), "INFO", e.user, "ME!"); } CIRCNetwork.prototype.onNick = function my_cnick (e) { if (userIsMe (e.user)) { if (client.currentObject == this) this.displayHere (getMsg("my_cnickMsg", e.user.properNick), "NICK", "ME!", e.user, this); updateNetwork(); } else this.display (getMsg("my_cnickMsg2", [e.oldNick, e.user.properNick]), "NICK", e.user, this); } CIRCNetwork.prototype.onPing = function my_netping (e) { updateNetwork (this); } CIRCNetwork.prototype.onPong = function my_netpong (e) { updateNetwork (this); } CIRCChannel.prototype.onPrivmsg = function my_cprivmsg (e) { this.display (e.meat, "PRIVMSG", e.user, this); if ((typeof client.prefix == "string") && e.meat.indexOf (client.prefix) == 0) { try { var v = eval(e.meat.substring (client.prefix.length, e.meat.length)); } catch (ex) { this.say (fromUnicode(e.user.nick + ": " + String(ex))); return false; } if (typeof (v) != "undefined") { if (v != null) v = String(v); else v = "null"; var rsp = getMsg("my_cprivmsgMsg", e.user.nick); if (v.indexOf ("\n") != -1) rsp += "\n"; else rsp += " "; this.display (rsp + v, "PRIVMSG", e.server.me, this); this.say (fromUnicode(rsp + v)); } } return true; } /* end of names */ CIRCChannel.prototype.on366 = function my_366 (e) { if (client.currentObject == this) /* hide the tree while we add (possibly tons) of nodes */ client.rdf.setTreeRoot("user-list", client.rdf.resNullChan); client.rdf.clearTargets(this.getGraphResource(), client.rdf.resChanUser); for (var u in this.users) { this.users[u].updateGraphResource(); this._addUserToGraph (this.users[u]); } if (client.currentObject == this) /* redisplay the tree */ client.rdf.setTreeRoot("user-list", this.getGraphResource()); if ("pendingNamesReply" in e.channel) { display (e.meat, "366"); e.channel.pendingNamesReply = false; } } CIRCChannel.prototype.onTopic = /* user changed topic */ CIRCChannel.prototype.on332 = /* TOPIC reply */ function my_topic (e) { if (e.code == "TOPIC") this.display (getMsg("my_topicMsg", [this.topicBy, this.topic]), "TOPIC"); if (e.code == "332") { if (this.topic) this.display (getMsg("my_topicMsg2", [this.name, this.topic]), "TOPIC"); else this.display (getMsg("my_topicMsg3", this.name), "TOPIC"); } updateChannel (this); updateTitle (this); } CIRCChannel.prototype.on333 = /* Topic setter information */ function my_topicinfo (e) { this.display (getMsg("my_topicinfoMsg", [this.name, this.topicBy, this.topicDate]), "TOPIC"); } CIRCChannel.prototype.on353 = /* names reply */ function my_topic (e) { if ("pendingNamesReply" in e.channel) e.channel.display (e.meat, "NAMES"); } CIRCChannel.prototype.onNotice = function my_notice (e) { this.display (e.meat, "NOTICE", e.user, this); } CIRCChannel.prototype.onCTCPAction = function my_caction (e) { this.display (e.CTCPData, "ACTION", e.user, this); } CIRCChannel.prototype.onUnknownCTCP = function my_unkctcp (e) { this.display (getMsg("my_unkctcpMsg", [e.CTCPCode, e.CTCPData, e.user.properNick]), "BAD-CTCP", e.user, this); } CIRCChannel.prototype.onJoin = function my_cjoin (e) { if (userIsMe (e.user)) { this.display (getMsg("my_cjoinMsg", e.channel.name), "JOIN", e.server.me, this); setCurrentObject(this); } else this.display(getMsg("my_cjoinmsg2", [e.user.properNick, e.user.name, e.user.host, e.channel.name]), "JOIN", e.user, this); this._addUserToGraph (e.user); updateChannel (e.channel); } CIRCChannel.prototype.onPart = function my_cpart (e) { this._removeUserFromGraph(e.user); if (userIsMe (e.user)) { this.display (getMsg("my_cpartMsg", e.channel.name), "PART", e.user, this); if (client.currentObject == this) /* hide the tree while we remove (possibly tons) of nodes */ client.rdf.setTreeRoot("user-list", client.rdf.resNullChan); client.rdf.clearTargets(this.getGraphResource(), client.rdf.resChanUser, true); if (client.currentObject == this) /* redisplay the tree */ client.rdf.setTreeRoot("user-list", this.getGraphResource()); if (client.DELETE_ON_PART) onDeleteView(this); } else this.display (getMsg("my_cpartMsg2", [e.user.properNick, e.channel.name]), "PART", e.user, this); updateChannel (e.channel); } CIRCChannel.prototype.onKick = function my_ckick (e) { if (userIsMe (e.lamer)) this.display (getMsg("my_ckickMsg", [e.channel.name, e.user.properNick, e.reason]), "KICK", e.user, this); else { var enforcerProper, enforcerNick; if (userIsMe (e.user)) { enforcerProper = "YOU"; enforcerNick = "ME!"; } else { enforcerProper = e.user.properNick; enforcerNick = e.user.nick; } this.display (getMsg("my_ckickMsg2", [e.lamer.properNick, e.channel.name, enforcerProper, e.reason]), "KICK", e.user, this); } this._removeUserFromGraph(e.lamer); updateChannel (e.channel); } CIRCChannel.prototype.onChanMode = function my_cmode (e) { if ("user" in e) this.display (getMsg("my_cmodeMsg", [e.params.slice(1).join(" "), e.user.properNick]), "MODE", e.user, this); for (var u in e.usersAffected) e.usersAffected[u].updateGraphResource(); updateChannel (e.channel); updateTitle (e.channel); } CIRCChannel.prototype.onNick = function my_cnick (e) { if (userIsMe (e.user)) { this.display (getMsg("my_cnickMsg", e.user.properNick), "NICK", "ME!", e.user, this); updateNetwork(); } else this.display (getMsg("my_cnickMsg2", e.oldNick, e.user.properNick), "NICK", e.user, this); /* dd ("updating resource " + e.user.getGraphResource().Value + " to new nickname " + e.user.properNick); */ e.user.updateGraphResource(); } CIRCChannel.prototype.onQuit = function my_cquit (e) { if (userIsMe(e.user)) /* I dont think this can happen */ this.display (getMsg("my_cquitMsg", [e.server.parent.name, e.reason]), "QUIT", e.user, this); else this.display (getMsg("my_cquitMsg2", [e.user.properNick, e.server.parent.name, e.reason]), "QUIT", e.user, this); this._removeUserFromGraph(e.user); updateChannel (e.channel); } CIRCUser.prototype.onPrivmsg = function my_cprivmsg (e) { if ("messages" in this) { playSounds(client.QUERY_BEEP); } else { playSounds(client.MSG_BEEP); if (client.NEW_TAB_THRESHOLD == 0 || client.viewsArray.length < client.NEW_TAB_THRESHOLD) { var tab = openQueryTab (e.server, e.user.nick); if (client.FOCUS_NEW_TAB) setCurrentObject(tab); } } this.display (e.meat, "PRIVMSG", e.user, e.server.me); } CIRCUser.prototype.onNick = function my_unick (e) { if (userIsMe(e.user)) { updateNetwork(); updateTitle (e.channel); } } CIRCUser.prototype.onNotice = function my_notice (e) { this.display (e.meat, "NOTICE", this, e.server.me); } CIRCUser.prototype.onCTCPAction = function my_uaction (e) { e.user.display (e.CTCPData, "ACTION", this, e.server.me); } CIRCUser.prototype.onUnknownCTCP = function my_unkctcp (e) { this.parent.parent.display (getMsg("my_unkctcpMsg", [e.CTCPCode, e.CTCPData, e.user.properNick]), "BAD-CTCP", this, e.server.me); }