📄 jwchat.html
字号:
x.setAttribute('type','submit'); con.send(iq); } break; case '303': // nick change // display message if (!ouser.nick) return; var aMessage = new JSJaCMessage(); aMessage.setFrom(user.jid); aMessage.setBody(""+ouser.name+" is now known as "+htmlEnc(ouser.nick)); user.chatmsgs = user.chatmsgs.concat(aMessage); if (user.chatW && !user.chatW.closed && user.chatW.popMsgs) user.chatW.popMsgs(); // update nick if it's me if (ouser.name == htmlEnc(user.roster.nick)) user.roster.nick = ouser.nick; // remove old user var aChatW = ouser.chatW; user.roster.removeUser(ouser); // add new user ouser = new GroupchatRosterUser(presence.getFrom().substring(0,presence.getFrom().lastIndexOf('/')+1).concat(ouser.nick),ouser.nick); if (aChatW && !aChatW.closed) { ouser.chatW = aChatW; ouser.chatW.user = ouser; } user.roster.addUser(ouser); nickChanged = true; break; case '301': // user has been kicked var aMessage = new JSJaCMessage(); aMessage.setFrom(user.jid); var body; if (ouser.actor) body = ""+ouser.name+" has been banned by "+ouser.actor; else body = ""+ouser.name+" has been banned"; if (ouser.reason) body += ": " + ouser.reason; aMessage.setBody(body); user.chatmsgs = user.chatmsgs.concat(aMessage); if (user.chatW && !user.chatW.closed && user.chatW.popMsgs) user.chatW.popMsgs(); playSound('chat_recv'); break; case '307': // user has been kicked var aMessage = new JSJaCMessage(); aMessage.setFrom(user.jid); var body; if (ouser.actor) body = ""+ouser.name+" has been kicked by "+ouser.actor; else body = ""+ouser.name+" has been kicked"; if (ouser.reason) body += ": " + ouser.reason; aMessage.setBody(body); user.chatmsgs = user.chatmsgs.concat(aMessage); if (user.chatW && !user.chatW.closed && user.chatW.popMsgs) user.chatW.popMsgs(); playSound('chat_recv'); break; } } Debug.log("<"+ouser.name+"> affiliation:"+ouser.affiliation+", role:"+ouser.role,3); if (!user.roster.getUserByJID(presence.getFrom()) && !nickChanged) { // add user user.roster.addUser(ouser); // show join message var aMessage = new JSJaCMessage(); aMessage.setFrom(user.jid); aMessage.setBody(""+ouser.name+" has become available"); user.chatmsgs = user.chatmsgs.concat(aMessage); if (user.chatW && !user.chatW.closed && user.chatW.popMsgs) user.chatW.popMsgs(); playSound('online'); } else if (presence.getType() == 'unavailable' && !nickChanged) { // show part message var aMessage = new JSJaCMessage(); aMessage.setFrom(user.jid); var body = ""+ouser.name+" has left"; if (presence.getStatus()) body += ": " + presence.getStatus(); aMessage.setBody(body); user.chatmsgs = user.chatmsgs.concat(aMessage); if (user.chatW && !user.chatW.closed && user.chatW.popMsgs) user.chatW.popMsgs(); playSound('offline'); } else user.roster.updateGroups(); // relink roster and user aRoster = user.roster; user = ouser; } if (show) { if (user.status == 'unavailable') playSound('online'); // fix broken pressenc status if (show != 'chat' && show != 'away' && show != 'xa' && show != 'dnd') show = 'available'; user.status = show; } else if (type) { if (type == 'unsubscribe') { user.subscription = 'from'; user.status = 'stalker'; } else if (user.status != 'stalker') user.status = 'unavailable'; if (aRoster.name == 'GroupchatRoster' && !nickChanged) { // it's a groupchat roster // remove user if (!user.chatW || user.chatW.closed) aRoster.removeUser(user); // we don't need offline users in there } playSound('offline'); } else { if (user.status == 'unavailable') // user was offline before playSound('online'); user.status = 'available'; } var img = eval(user.status+"Led"); if (user.lastsrc) // message is pending user.lastsrc = img.src; // show away message if (status) user.statusMsg = status; else user.statusMsg = null; // update presence indicator of chat window if (user.chatW && !user.chatW.closed && user.chatW.updateUserPresence) user.chatW.updateUserPresence(); aRoster.print(); // update roster}/************************************************************************ * handleIQSet ************************************************************************ */function handleIQSet(iq) { if (iq.getType() != "set") { Debug.log("not handling iq:\n"+iq.getDoc().xml,3); return; } Debug.log("got iq type 'set':\n"+iq.getDoc().xml,2); if (iq.getQueryXMLNS() != 'jabber:iq:roster') { // only handle roster items so far Debug.log("not handling iq:\n"+iq.getDoc().xml,1); return; } for (var i=0; i<iq.getQuery().childNodes.length; i++) { var item = iq.getQuery().childNodes.item(i); var user = roster.getUserByJID(cutResource(item.getAttribute('jid'))); if (user) { user.subscription = item.getAttribute('subscription'); if (item.getAttribute('subscription') == 'remove') { Debug.log("removing user " + user.jid,2); roster.removeUser(user); } else { // update user user.name = item.getAttribute('name')? htmlEnc(item.getAttribute('name')) : item.getAttribute('jid'); user.groups = new Array(''); for (var j=0; j<item.childNodes.length; j++) if (item.childNodes.item(j).nodeName == 'group') user.groups = user.groups.concat(item.childNodes.item(j).firstChild.nodeValue); roster.updateGroups(); } } else {// got a new user if (isGateway(item.getAttribute('jid'))) { // auto add gateways // get name var name = cutResource(item.getAttribute('jid')); for (var i in disco) { if (typeof(disco[i]) != 'object') continue; if (i == cutResource(item.getAttribute('jid'))) name = disco[i].getQuery().getElementsByTagName('identity').item(0).getAttribute('name'); } // add to roster var aUser = new RosterUser(cutResource(item.getAttribute('jid')),item.getAttribute('subscription'),["Gateways"],name); //aUser.fulljid = item.getAttribute('jid'); roster.addUser(aUser); // set name and group var aIQ = new JSJaCIQ(); aIQ.setType('set'); var query = aIQ.setQuery('jabber:iq:roster'); var aItem = query.appendChild(aIQ.getDoc().createElement('item')); aItem.setAttribute('jid',item.getAttribute('jid')); aItem.setAttribute('name',name); aItem.appendChild(iq.getDoc().createElement('group')).appendChild(iq.getDoc().createTextNode('Gateways')); con.send(aIQ); } else { // new but not a gateway var name = item.getAttribute('name')? item.getAttribute('name') : item.getAttribute('jid'); if (name.indexOf('@') != -1) name = name.substring(0,name.indexOf('@')); item.setAttribute('name',name); var groups = new Array(''); for (var j=0; j<item.childNodes.length; j++) if (item.childNodes.item(j).nodeName == 'group') groups = groups.concat(item.childNodes.item(j).firstChild.nodeValue); roster.addUser(new RosterUser(cutResource(item.getAttribute('jid')),item.getAttribute('subscription'),groups,name)); var aIQ = new JSJaCIQ(); aIQ.setType('set'); var query = aIQ.setQuery('jabber:iq:roster'); var aItem = item.cloneNode(true); aItem.removeAttribute('subscription'); query.appendChild(aItem); con.send(aIQ); // set stripped name if (item.getAttribute('subscription') == "from" && item.getAttribute('ask') != 'subscribe') openSubscription(item.getAttribute('jid')); // subscribe to user } } } roster.print();}function handleConError(e) { switch (e.getAttribute('code')) { case '401': alert("Authorization failed"); if (!con.connected()) window.close(); break; case '409': alert("Registration failed!\n\nPlease choose a different username!"); break; case '503': alert("Service unavailable"); break; case '500': if (!con.connected() && !logoutCalled && onlstat != 'offline') if (confirm("Internal Server Error.\n\nDisconnected.\n\nReconnect?")) changeStatus(onlstat,onlmsg); break; default: alert("An Error Occured:\nCode: "+e.getAttribute('code')+"\nType: "+e.getAttribute('type')+"\nCondition: "+e.firstChild.nodeName); // this shouldn't happen :) break; }}function handleDisconnect() { if (logoutCalled || onlstat == 'offline') return; // disconnecting not with onunload handler triggered statusLed.src = unavailableLed.src; // offline icon statusMsg.value = ''; fmd.getElementById('roster').innerHTML = ''; // if (confirm("Disconnected\n\nReconnect?"))// changeStatus(onlstat,onlmsg);}function handleConnected() { Debug.log("Connected",0); if (register && opener && opener.document.forms[0] && opener.document.forms[0].register) opener.document.forms[0].register.checked = false; /* get/setup roster */ iq = new JSJaCIQ(); iq.setIQ(null,'get','roster_1'); iq.setQuery('jabber:iq:roster'); con.send(iq,getRoster); // cascading information retrieval}/* *** cascading onconnect handlers *** */function getRoster(iq) { if (!iq || iq.getType() != 'result') { if (iq) Debug.log("Error fetching roster:\n"+iq.getDoc().xml,1); else Debug.log("Error fetching roster",1); return; } Debug.log("got roster:\n"+iq.getDoc().xml,2); roster = new Roster(iq.getQuery().childNodes,fmd); roster.usersHidden = usersHidden; roster.nick = jid.substring(0,jid.indexOf('@')); // remember nick for 1:1 Chats // get saved state iq = new JSJaCIQ(); iq.setIQ(null,'get','jwchat_state'); var query = iq.setQuery('jabber:iq:private'); query.appendChild(iq.getDoc().createElement('jwchat')).setAttribute('xmlns','jwchat:state'); con.send(iq,getSavedState);}function getSavedState(iq) { if (!iq || iq.getType() != 'result') if (iq) Debug.log("Error retrieving saved state:\n"+iq.getDoc().xml,1); else Debug.log("Error retrieving saved state",1); if (iq && iq.getType() == 'result') { Debug.log(iq.getDoc().xml,3); var jNode = iq.getNode().getElementsByTagName('jwchat').item(0); for (var i=0; i<jNode.childNodes.length; i++) { var item = jNode.childNodes.item(i); if (item.nodeName == 'presence' && item.firstChild && onlstat == '' && item.firstChild.nodeValue != 'offline') onlstat = item.firstChild.nodeValue; if (item.nodeName == 'onlmsg' && item.firstChild && onlmsg == '') onlmsg = item.firstChild.nodeValue; if (item.nodeName == 'hiddenGroups' && item.firstChild) { var hiddenGroups = item.firstChild.nodeValue.split(','); for (var j=0; j<hiddenGroups.length; j++) if (hiddenGroups[j] != '') roster.hiddenGroups[hiddenGroups[j]] = true; } } } // get prefs iq = new JSJaCIQ(); iq.setIQ(null,'get','jwchat_prefs'); var query = iq.setQuery('jabber:iq:private'); query.appendChild(iq.getDoc().createElement('jwchat')).setAttribute('xmlns','jwchat:prefs'); con.send(iq,getPrefs);}function getPrefs(iq) { if (!iq || iq.getType() != 'result') if (iq) Debug.log("Error retrieving preferences:\n"+iq.getDoc().xml,1); else Debug.log("Error retrieving preferences",1); if (iq && iq.getType() == 'result') { Debug.log(iq.getDoc().xml,3); if (iq.getNode().getElementsByTagName('jwchat').item(0)) { var jNode = iq.getNode().getElementsByTagName('jwchat').item(0); for (var i=0; i<jNode.childNodes.length; i++) { switch (jNode.childNodes.item(i).nodeName) { case 'usersHidden': if (eval(jNode.childNodes.item(i).firstChild.nodeValue) != usersHidden) roster.toggleHide(); break; case 'timerval': timerval = eval(jNode.childNodes.item(i).firstChild.nodeValue); con.setPollInterval(timerval); break; case 'autoPopup': autoPopup = eval(jNode.childNodes.item(i).firstChild.nodeValue); break; case 'autoPopupAway': autoPopupAway = eval(jNode.childNodes.item(i).firstChild.nodeValue); break; case 'playSounds': playSounds = eval(jNode.childNodes.item(i).firstChild.nodeValue); break; case 'focusWindows': focusWindows = eval(jNode.childNodes.item(i).firstChild.nodeValue); break; case 'timestamps': timestamps = eval(jNode.childNodes.item(i).firstChild.nodeValue); break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -