📄 jwchat.html
字号:
statusMsg.value = away; else statusMsg.value = onlstatus[val];}/************************************************************************ * ***** EVENT - HANDLER ***** ************************************************************************ *//************************************************************************ * handleMessage ************************************************************************ */function handleMessage(aMessage) { Debug.log(aMessage.getDoc().xml,2); if (aMessage.getType() == 'error') return; /* check if this is a groupchat invite */ var x; for (var i=0; i<aMessage.getNode().getElementsByTagName('x').length; i++) if (aMessage.getNode().getElementsByTagName('x').item(i).getAttribute('xmlns') == 'http://jabber.org/protocol/muc#user') { x = aMessage.getNode().getElementsByTagName('x').item(i); break; } if (x) { var from, to, reason, pass; to = aMessage.getFrom(); var aInvite = x.getElementsByTagName('invite').item(0); from = aInvite.getAttribute('from'); if (aInvite.firstChild && aInvite.firstChild.nodeName == 'reason' && aInvite.firstChild.firstChild) reason = aInvite.firstChild.firstChild.nodeValue; if (x.getElementsByTagName('password').item(0)) pass = x.getElementsByTagName('password').item(0).firstChild.nodeValue; Debug.log("You have been invited to " + jid + " pass " + pass + " by " + from + "\nreason:" + reason,2); var user = roster.getUserByJID(cutResource(from)); if (!user) {// users not in roster (yet) Debug.log("creating new user "+from,3); user = roster.addUser(new RosterUser(cutResource(from))); user.lastsrc = eval(user.status + "Led").src; roster.print(); } if (typeof(user.iwArr) == 'undefined') user.iwArr = new Array(); user.iwArr[to] = open("groupchat_invite.html?to="+escape(to)+"&from="+escape(from)+"&pass="+escape(pass)+"&reason="+escape(reason),"iw"+makeWindowName(to),"width=320,height=320,resizable=yes"); return; } var from = cutResource(aMessage.getFrom()); var type = aMessage.getType(); Debug.log("from: "+from+"\naMessage.getFrom(): "+aMessage.getFrom(),3); var user = roster.getUserByJID(from); if (user == null) {// users not in roster (yet) Debug.log("creating new user "+from,3); user = roster.addUser(new RosterUser(from)); user.lastsrc = eval(user.status + "Led").src; roster.print(); } Debug.log("got user jid: "+user.jid,3); var aRoster = roster; if (type != 'groupchat' && user.roster && from != aMessage.getFrom()) { // private groupchat message aRoster = user.roster; from = aMessage.getFrom(); // use from with resource (had been cut off first) user = user.roster.getUserByJID(from); } /* change icon in roster - but not if it's a groupchat item */ if (type != 'groupchat') { if (!user.lastsrc) user.lastsrc = eval(user.status + "Led").src; var images = aRoster.getUserIcons(from); for (var i=0; i<images.length; i++) images[i].src = messageImg.src; /* user is not visible right now - make him pop up (lastsrc changed!) */ if (aRoster.usersHidden && user.status == 'unavailable') aRoster.print(); } // set current timestamp var x; for (var i=0; i<aMessage.getNode().getElementsByTagName('x').length; i++) if (aMessage.getNode().getElementsByTagName('x').item(i).getAttribute('xmlns') == 'jabber:x:delay') { x = aMessage.getNode().getElementsByTagName('x').item(i); break; } if (x) { Debug.log("found offline message: "+x.getAttribute('stamp'),3); var stamp = x.getAttribute('stamp'); aMessage.jwcTimestamp = new Date(Date.UTC(stamp.substring(0,4),stamp.substring(4,6)-1,stamp.substring(6,8),stamp.substring(9,11),stamp.substring(12,14),stamp.substring(15,17))); } else aMessage.jwcTimestamp = new Date(); if (type == 'chat') { user.chatmsgs = user.chatmsgs.concat(aMessage); if (user.chatW && !user.chatW.closed && user.chatW.popMsgs) { user.chatW.popMsgs(); playSound('chat_recv'); } else if (autoPopup && (autoPopupAway || onlstat == "available" || onlstat == "chat")) { aRoster.openChat(from); playSound('chat_recv'); } else { if (focusWindows) window.focus(); playSound('chat_queue'); // let arrow blink for toggled groups for (var i=0; i<user.groups.length; i++) { if (user.groups[i] != '') { if (roster.hiddenGroups[user.groups[i]]) fmd.images[user.groups[i]+"Img"].src = arrow_right_blinking.src; } } } } else if (type == 'groupchat') { /* handle groupchat message */ user.chatmsgs = user.chatmsgs.concat(aMessage); if (user.chatW && !user.chatW.closed && user.chatW.srcW && typeof(user.chatW.srcW.roster) != 'undefined' && user.chatW.popMsgs) { user.chatW.popMsgs(); } playSound('chat_recv'); } else { user.messages = user.messages.concat(aMessage); if (autoPopup && (autoPopupAway || onlstat == "available" || onlstat == "chat") && (!user.mW || user.mW.closed)) { aRoster.openMessage(from); playSound('message_recv'); } else if (user.mW && !user.mW.closed && user.messages.length > 0 && user.mW.document.forms[0]) { user.mW.document.forms[0].nextButton.disabled = false; if (focusWindows) user.mW.focus(); playSound('message_recv'); } else { if (focusWindows) window.focus(); playSound('message_queue'); // let arrow blink for toggled groups for (var i=0; i<user.groups.length; i++) { if (user.groups[i] != '') { if (roster.hiddenGroups[user.groups[i]]) fmd.images[user.groups[i]+"Img"].src = arrow_right_blinking.src; } } } // [TODO] zeank 2005-10-26 // archiving of single/plain messages }}/************************************************************************ * handleMessageError ************************************************************************ */var error_messages = new Array();var errorW;function handleMessageError(aJSJaCPacket) { if (aJSJaCPacket.getType() != 'error') return; Debug.log(aJSJaCPacket.getDoc().xml,2); var user = roster.getUserByJID(cutResource(aJSJaCPacket.getFrom())); if (user.chatW && !user.chatW.closed && user.chatW.putMsgHTML) { var error = aJSJaCPacket.getNode().getElementsByTagName('error').item(0); if (error) { if (error.getElementsByTagName('text').item(0)) { user.chatW.putMsgHTML(aJSJaCPacket); playSound('error'); return; } } } error_messages = error_messages.concat(aJSJaCPacket); if (!errorW || errorW.closed) errorW = open("error_message.html","errorW"+makeWindowName(jid),"width=360,height=270,dependent=yes,resizable=yes"); else if (error_messages.length > 0 && errorW.document.forms[0]) errorW.document.forms[0].nextButton.disabled = false; playSound('error'); errorW.focus();}/************************************************************************ * handlePresence ************************************************************************ */function handlePresence(presence) { Debug.log(presence.getDoc().xml,2); var from = cutResource(presence.getFrom()); var type = presence.getType(); var show = presence.getShow(); var status = presence.getStatus(); var aRoster = roster; // roster subscriptions synchronisation var x; if (isGateway(from.substring(from.indexOf('@')+1))) { for (var i=0; i<presence.getNode().getElementsByTagName('x').length; i++) if (presence.getNode().getElementsByTagName('x').item(i).getAttribute('xmlns') == 'http://jabber.org/protocol/roster-subsync' || presence.getNode().getElementsByTagName('x').item(i).getAttribute('xmlns') == 'http://delx.cjb.net/protocol/roster-subsync') { x = presence.getNode().getElementsByTagName('x').item(i); break; } if (x) { Debug.log("detected roster-subsync presence",2); var items = x.getElementsByTagName("item"); for (var i=0; i<items.length; i++) { var aItem = items.item(i); if (type == 'subscribe' && aItem.getAttribute("subscription") == 'both') { // insert into roster var aIQ = new JSJaCIQ(); aIQ.setType('set'); var query = aIQ.setQuery('jabber:iq:roster'); var bItem = query.appendChild(aIQ.getDoc().createElement('item')); bItem.setAttribute('jid',from); if (aItem.getAttribute('name') && aItem.getAttribute('name') != '') bItem.setAttribute('name',aItem.getAttribute('name')); else bItem.setAttribute('name',from.substring(0,from.lastIndexOf('@')).replace(/%/,'@')); var itemGroups = aItem.getElementsByTagName("group"); for (var j=0; j<itemGroups.length; j++) bItem.appendChild(itemGroups.item(j)); Debug.log("roster-subsync setting roster:"+aIQ.xml(),2); con.send(aIQ); // Approve Subscription Request var aPresence = new JSJaCPresence(); aPresence.setTo(from); aPresence.setType('subscribed'); con.send(aPresence); // Subscribe to gateway contact's presence var bPresence = new JSJaCPresence(); bPresence.setTo(from); bPresence.setType('subscribe'); con.send(bPresence); } } return; } } switch (type) { case null: case '': break; case 'subscribe': if (isGateway(from)) { // automatically subscribe gateways // Approve Subscription Request var aPresence = new JSJaCPresence(); aPresence.setTo(presence.getFrom()); aPresence.setType('subscribed'); con.send(aPresence); // Subscribe to Gateway's Presence var bPresence = new JSJaCPresence(); bPresence.setTo(presence.getFrom()); bPresence.setType('subscribe'); con.send(bPresence); } else { if (status) window.open("subscriptionRequest.html?jid="+escape(from)+"&msg="+escape(status),"sr"+makeWindowName(from),"width=320,height=240"); else window.open("subscriptionRequest.html?jid="+escape(from),"sr"+makeWindowName(from),"width=320,height=240"); } return; case 'unsubscribe': if (!isGateway(from)) alert("You have been unsubscribed from "+presence.getFrom()); /* [TODO] don't use alert here */ break; case 'error': var user = roster.getUserByJID(from); if (user && user.chatW && !user.chatW.closed && user.chatW.putMsgHTML) { if (presence.getNode().getElementsByTagName('error').item(0)) { var error = presence.getNode().getElementsByTagName('error').item(0); if (error.getElementsByTagName('text').item(0)) user.chatW.putMsgHTML(presence); else if (error.firstChild && error.firstChild.nodeValue) user.chatW.putMsgHTML(error.firstChild.nodeValue,new Date(),from,null,true); } } } var user = roster.getUserByJID(from); if (!user) { // presence from unsubscribed user Debug.log("presence from "+from+" not found on roster", 2); return; } /* handle presence for MUC */ x = null; // reset for (var i=0; i<presence.getNode().getElementsByTagName('x').length; i++) if (presence.getNode().getElementsByTagName('x').item(i).getAttribute('xmlns') == 'http://jabber.org/protocol/muc#user') { x = presence.getNode().getElementsByTagName('x').item(i); break; } if (user.roster && x) { Debug.log("muc presence detected", 2); var ofrom = presence.getFrom().substring(presence.getFrom().indexOf('/')+1); Debug.log("jabber.from:"+presence.getFrom()+", ofrom:"+ofrom,3); var ouser = user.roster.getUserByJID(presence.getFrom()); if (!ouser) // no user? create one! ouser = new GroupchatRosterUser(presence.getFrom(),ofrom); var item = x.getElementsByTagName('item').item(0); ouser.affiliation = item.getAttribute('affiliation'); ouser.role = item.getAttribute('role'); ouser.nick = item.getAttribute('nick'); ouser.realjid = item.getAttribute('jid'); if (item.getElementsByTagName('reason').item(0)) ouser.reason = item.getElementsByTagName('reason').item(0).firstChild.nodeValue; if (actor = item.getElementsByTagName('actor').item(0)) { if (actor.getAttribute('jid') != null) ouser.actor = actor.getAttribute('jid'); else if (item.getElementsByTagName('actor').item(0).firstChild != null) ouser.actor = item.getElementsByTagName('actor').item(0).firstChild.nodeValue; } if (ouser.role != '') { ouser.add2Group(ouser.role+'s'); /* check if it is our own presence * must be done here cause we want to be sure that role != '' */ if (ouser.name == htmlEnc(user.roster.nick)) { // seems to be me user.roster.me = ouser; // store this reference if (user.chatW.updateMe) user.chatW.updateMe(); } } Debug.log("ouser.jid: "+ ouser.jid + ", ouser.fulljid:" + ouser.fulljid + ", ouser.name:"+ouser.name+", user.roster.nick:"+user.roster.nick,3); var nickChanged = false; if (x.getElementsByTagName('status').item(0)) { var code = x.getElementsByTagName('status').item(0).getAttribute('code'); switch (code) { case '201': // room created /* popup dialog to ask for whether to accept default * configuration or make a custom room */ if (confirm("A new room has been created but it awaits configuration from you. Do you want to do a custom configuration now?\nNote: Click on 'Cancel' to start with a default configuration!")) user.chatW.openConfig(); else { var iq = new JSJaCIQ(); iq.setType('set'); iq.setTo(user.jid); var query = iq.setQuery('http://jabber.org/protocol/muc#owner'); var x = query.appendChild(iq.getDoc().createElement('x')); x.setAttribute('xmlns','jabber:x:data');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -