Сделал простой NodeJS чат.
Хочется протестировать.
Если есть пара минут.
Зайдите по адресу
http://moc-081.ru/chat/done.html
Или запустите код
Надеюсь чат не слетит
https://github.com/mycoding/Simple-Chat
Когда работает чат выглядит так
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="http://moc-081.ru/ext/resources/css/ext-all.css" />
<script type="text/javascript" src="http://moc-081.ru/ext/adapter/ext/ext-base.js"></script>
<script type="text/javascript" src="http://moc-081.ru/ext/ext-all.js"></script>
<script src="http://vreshenie.ru/work/comet/cross-domain/extjs-cross-domain.js"></script>
<style>
.icon-user {
background-image: url("http://www.vreshenie.ru/resources/user.png") !important;
}
.icon-users {
background-image: url("http://www.vreshenie.ru/resources/group.png") !important;
}
.icon-pencil {
background-image: url("http://www.vreshenie.ru/resources/pencil.png") !important;
}
.icon-comments {
background-image: url("http://www.vreshenie.ru/resources/comments.png") !important;
}
</style>
<script>
var messages = [],
users_online = [];//,
//chat_property = {login:'',sid:''};
Ext.onReady(function(){
function sendMessage(login){
var msg = Ext.getCmp('idMsgChat').getValue();
if(msg.length!=0){
crossDomainRequest('sendMessage',{login:window.login,sid:window.sid,msg:msg,action:'sendMessage'})
}
}
function runLoginedChat(){
var win = Ext.getCmp('windowChat');
win.setTitle('Cross-domain comet chat on ExtJS+nodeJS');
var login = Ext.getCmp('login');
win.items.items[1].el.fadeOut({callback:function(){
login.hide();
}});
var buttonLogin = Ext.getCmp('idLoginButton');
buttonLogin.setText('Send');
buttonLogin.setIconClass('icon-pencil');
buttonLogin.setHandler(function(){
sendMessage(login);
Ext.getCmp('idMsgChat').setValue('');
});
var xy=win.getPosition();
var x = xy[0]-100;
var y = xy[1]-100;
win.el.shift({
x: x,
y: y,
duration:1,
//easing:effect,
callback:function(){
win.el.shift({
width:400,
callback:function(){
win.setWidth(400);
win.setHeight(300);
var str=' ';
for(var i=0;i<messages.length;i++){
str+=""+messages[i].login+":"+messages[i].msg+'</br>';
}
Ext.getCmp('serverMessage').update(str);
Ext.getCmp('idMsgChat').show();
Ext.getCmp('serverMessage').show();
Ext.getCmp('idUsersOnline').show();
var winUserOnline = Ext.getCmp('idWinUsersOnline'),
windowChatXY = Ext.getCmp('windowChat').getPosition(),
windowChatXYSize = Ext.getCmp('windowChat').getSize();
winUserOnline.setPosition(windowChatXY[0]+windowChatXYSize.width+50,windowChatXY[1]);
winUserOnline.show();
var treeUserOnline = Ext.getCmp('idTreeUserOnline');
for(var i=0;i<users_online.length;i++){
var newNode = new Ext.tree.TreeNode({id:"'"+users_online[i]+"'", text:users_online[i], leaf: true});
treeUserOnline.root.appendChild(newNode);
}
crossDomainRequest('getMessage',{login:window.login,sid:window.sid,action:'getMessage'});
}
});
}
});
}
function crossDomainRequest(action,params){
Ext.Ajax.request({
timeout:300,
url: 'http://node2.tw1.ru/',
//url: 'http://127.0.0.1:1337/',
params:params || {},
scriptTag: true,
success: function(r){
var message = r.responseObject.msg;
var login = r.responseObject.login;
//console.log(message);
//console.log(r);
if(action=='getMessage'){
if(!r.responseObject.reconnect){
if(login!='Server'){
messages.push({msg:message,login:login});
}
var str=' ';
for(var i=0;i<messages.length;i++){
str+=""+messages[i].login+":"+messages[i].msg+'</br>';
}
if(login=='Server'){
var action_server = r.responseObject.action_server;
switch(action_server){
case 'join':
str+="<b>Server</b>:"+message+' join</br>';
messages.push({msg:message+' join',login:'<b>'+login+'</b>'});
var newNode = new Ext.tree.TreeNode({id: "'"+message+"'", text: message , leaf: true});
Ext.getCmp('idTreeUserOnline').root.appendChild(newNode);
break;
case 'left':
str+="<b>Сервер</b>:"+message.join(',')+' left</br>';
var users_left = message;
messages.push({msg:message.join(',')+' left',login:'<b>'+login+'</b>'});
for(var i=0;i<users_left.length;i++){
var node = Ext.getCmp('idTreeUserOnline').getNodeById("'"+users_left[i]+"'");
if(node){
Ext.getCmp('idTreeUserOnline').root.removeChild(node);
}
}
break;
default:
}
}
Ext.getCmp('serverMessage').update(str);
}
crossDomainRequest('getMessage',{login:window.login,sid:window.sid,action:'getMessage'});
}
if(action=='login'){
if(r.responseObject.success){
messages = r.responseObject.msgs;
window.sid = r.responseObject.sid;
users_online = r.responseObject.users_online;
runLoginedChat();
}
else{
Ext.Msg.alert('Error', r.responseObject.error);
}
//console.log(r.responseObject);
}
if(action=='sendMessage'){}
if(action=='usersOnline'){
messages.push({login:r.responseObject.login,msg:r.responseObject.msg});
var str=' ';
for(var i=0;i<messages.length;i++){
str+=""+messages[i].login+":"+messages[i].msg+'</br>';
}
Ext.getCmp('serverMessage').update(str);
}
},
failure:function(){
console.log('failure');
Ext.Msg.alert('Error','Critical error on server');
if(action=='getMessage'){
crossDomainRequest('getMessage',{login:window.login,action:'getMessage'});
}
}
});
}
function chatLogin(){
var login = Ext.getCmp('login').getValue();
window.login=login;
crossDomainRequest('login',{login:login,action:'login'});
}
var w = new Ext.Window({
resizable:false,
closable:false,
id:'windowChat',
shadow:false,
iconCls:'icon-comments',
title:'Chat',
width:270,
height:95,
layout:'form',
bodyStyle:'padding:5px 5px 0',
items:[{
id:'serverMessage',
bodyStyle:'padding:5px 5px',
height:230,
hidden:true,
autoScroll:true,
html:'Place for massages'
},{
id:'login',
xtype:'textfield',
fieldLabel:'Input nick',
listeners: {
specialkey: function(field, e){
if (e.getKey() == e.ENTER){
chatLogin();
}
}
}
}],
bbar:[{
id:'idMsgChat',
xtype: 'textfield',
width:260,
hidden:true,
listeners: {
specialkey: function(field, e){
if (e.getKey() == e.ENTER){
var msg = Ext.getCmp('idMsgChat');
if(msg.getValue().length>0){
sendMessage(w.login);
Ext.getCmp('idMsgChat').setValue('');
}
}
}
}
},'->',{
id:'idUsersOnline',
text:'Users',
iconCls:'icon-users',
hidden:true,
handler:function(){
crossDomainRequest('usersOnline',{login:window.login,sid:window.sid,action:'getUsersOnline'});
}
},'','',{
id:'idLoginButton',
text:'Enter',
iconCls:'icon-user',
handler:chatLogin
}]
}).show();
new Ext.Window({
id:'idWinUsersOnline',
title:'Пользователи онлайн',
closeAction:'hide',
layout:'fit',
closable:false,
width:170,
height:195,
items:[{
xtype:'treepanel',
id:'idTreeUserOnline',
autoScroll: true,
root: new Ext.tree.AsyncTreeNode({
expanded: true,
children: []
}),
rootVisible: false,
listeners: {
click: function(n){
//console.log(n.attributes.id);
//var newNode = new Ext.tree.TreeNode({id: "5", text: "foo", leaf: true});
//Ext.getCmp('idTreeUserOnline').root.appendChild(newNode);
//var node = Ext.getCmp('idTreeUserOnline').getNodeById('2');
//if(node){
// Ext.getCmp('idTreeUserOnline').root.removeChild(node);
//}
}
}
}]
})
});
</script>
</head>
<body>
</body>
</html>