(function(){ var WebSocketServer=require('ws').Server; var wss=new WebSocketServer({port:8080}); var bannedKeys=[]; var bannedIps=[]; var rooms=[]; var events=[]; var clients={}; var bannedKeyWords=[]; var messages={ create:function(key,nickname,avatar,config,mode){ if(this.onlineKey!=key) return; this.nickname=util.getNickname(nickname); this.avatar=avatar; var room={}; rooms.push(room); this.room=room; delete this.status; room.owner=this; room.key=key; this.sendl('createroom',key); }, enter:function(key,nickname,avatar){ this.nickname=util.getNickname(nickname); this.avatar=avatar; var room=false; for(var i of rooms){ if(i.key==key){ room=i; break; } } if(!room){ this.sendl('enterroomfailed'); return; } this.room=room; delete this.status; if(room.owner){ if(room.servermode&&!room.owner._onconfig&&config&&mode){ room.owner.sendl('createroom',index,config,mode); room.owner._onconfig=this; room.owner.nickname=util.getNickname(nickname); room.owner.avatar=avatar; } else if(!room.config||(room.config.gameStarted&&(!room.config.observe||!room.config.observeReady))){ this.sendl('enterroomfailed'); } else{ this.owner=room.owner; this.owner.sendl('onconnection',this.wsid); } util.updaterooms(); } }, changeAvatar:function(nickname,avatar){ this.nickname=util.getNickname(nickname); this.avatar=avatar; util.updateclients(); }, server:function(cfg){ if(cfg){ this.servermode=true; var room=rooms[cfg[0]]; if(!room||room.owner){ this.sendl('reloadroom',true); } else{ room.owner=this; this.room=room; this.nickname=util.getNickname(cfg[1]); this.avatar=cfg[2]; this.sendl('createroom',cfg[0],{},'auto') } } else{ for(var i=0;i=20){ this.sendl('eventsdenied','total'); } else if(cfg.utc<=time){ this.sendl('eventsdenied','time'); } else if(util.isBanned(cfg.content)){ this.sendl('eventsdenied','ban'); } else{ cfg.nickname=util.getNickname(cfg.nickname); cfg.avatar=cfg.nickname||'caocao'; cfg.creator=id; cfg.id=util.getid(); cfg.members=[id]; events.unshift(cfg); changed=true; } } } if(changed){ util.updateevents(); } }, config:function(config){ var room=this.room; if(room&&room.owner==this){ if(room.servermode){ room.servermode=false; if(this._onconfig){ if(clients[this._onconfig.wsid]){ this._onconfig.owner=this; this.sendl('onconnection',this._onconfig.wsid); } delete this._onconfig; } } room.config=config; } util.updaterooms(); }, status:function(str){ if(typeof str=='string'){ this.status=str; } else{ delete this.status; } util.updateclients(); }, send:function(id,message){ if(clients[id]&&clients[id].owner==this){ try{ clients[id].send(message); } catch(e){ clients[id].close(); } } }, close:function(id){ if(clients[id]&&clients[id].owner==this){ clients[id].close(); } }, }; var util={ getNickname:function(str){ return typeof str=='string'?(str.slice(0,12)):'无名玩家'; }, isBanned:function(str){ for(var i of bannedKeyWords){ if(str.indexOf(i)!=-1) return true; } return false; }, sendl:function(){ var args=[]; for(var i=0;i