package com.dwrchat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.directwebremoting.ScriptBuffer;
import org.directwebremoting.ScriptSession;
import org.directwebremoting.ServerContext;
import org.directwebremoting.ServerContextFactory;
import org.directwebremoting.WebContext;
import org.directwebremoting.WebContextFactory;
import org.directwebremoting.proxy.dwr.Util;
/**
?* 处理聊天相关
?*
?* @author lhq
?*
?*/
public class ChatManager {
?/** 保存当前在线用户列表 */
?public static List<User> users = new ArrayList<User>();//保存所有在线用户
?public static String pageUrl="/Kindergarden/chatroom/chatroom.jsp";
?
?/**
? * 更新在线用户列表
? * @param username 待添加到列表的用户名
? * @param flag 是添加用户到列表,还是只获得当前列表
? * @param request
? * @return 用户userid
? */
?public String updateUsersList(String username, boolean flag, HttpServletRequest request) {
??WebContext webContext = WebContextFactory.get();??
??HttpSession session = webContext.getSession();
??HttpServletResponse response = webContext.getHttpServletResponse();
?? ScriptSession myScSession = webContext.getScriptSession();
??User user = null;
??String result="";
??ServletContext app = webContext.getServletContext();
??boolean resultflag=true;
??if (flag) {?
????
????for(User speaker : users)
????{
//如果有重名的用户则返回错误
?????if(username.equals(speaker.getUsername()))
?????{
??????result="nameerror";
??????return result;
?????}
????}
?????user = new User(String.valueOf(myScSession.hashCode()), username);
?????//保存用户到列表
?????users.add(user);
?????session.setAttribute("speaker",username);
?????session.setAttribute("userid",myScSession.hashCode());
?????// 这里取会话(HttpSession)的id为用户id
?????//将用户id和页面脚本session绑定
?????
?????this.setScriptSessionFlag(user.getUserid());
????
??}
??//更新聊天室
??refresh(request);
???
??ServletContext sc = request.getSession().getServletContext();
??ServerContext sctx = ServerContextFactory.get(sc);
??Collection<ScriptSession> collsession1 = sctx.getScriptSessionsByPage("/Kindergarden/chatroom/chatroom.jsp");
??ScriptBuffer script = new ScriptBuffer();
??script.appendScript("AddMsg(")
??.appendData("消息")
??.appendScript(",")
??.appendData("")
??.appendScript(",")
??.appendData(app.getAttribute("allContent"))
??.appendScript(",")
??.appendData("")
???? .appendScript(");");
??????? for (ScriptSession ss : collsession1) {
????? ss.addScript(script);
??? }
??/**滚屏函数***/
??????? Collection<ScriptSession> collsessionscroll = sctx.getScriptSessionsByPage("/Kindergarden/chatroom/chatroom.jsp");
??ScriptBuffer scriptscroll = new ScriptBuffer();
??scriptscroll.appendScript("Scroll(")
???? .appendScript(");");
??????? for (ScriptSession ss : collsessionscroll) {
??????? ?String xuserid = (String) ss.getAttribute("userid");
????? ss.addScript(scriptscroll);
??? }
??if(!flag){
???return null;
??}
??return user.getUserid();
?}
?/**更新聊天室***/
?public void refresh( HttpServletRequest request)
?{
??ServletContext sc = request.getSession().getServletContext();
??ServerContext sctx = ServerContextFactory.get(sc);
??//获得当前浏览 index.jsp 页面的所有脚本session,得到所有登录到该页面的session然后将所有的页面进行更新
??Collection sessions = sctx.getScriptSessionsByPage("/Kindergarden/chatroom/chatroom.jsp");
??Util util = new Util(sessions);
??
??util.removeAllOptions("users");
??util.addOptions("users", users, "username");
??util.removeAllOptions("receiver");
??util.addOptions("receiver", users,"userid","username");
??
??/**更新在线人数*/
??int totalOnLine=0;
??if(users.size()!=0)
??{
???totalOnLine=users.size();
??}
??util.setValue("WinOnLineNum",totalOnLine);
??
?}
?/**
? * 将用户id和页面脚本session绑定
? * @param userid
? */
?public void setScriptSessionFlag(String userid) {
??if(((String)WebContextFactory.get().getScriptSession().getAttribute("userid"))==null)
??{
???
???WebContextFactory.get().getScriptSession().setAttribute("userid", userid);
??}
??else
??{
???System.out.println("设置User为空");
??}
??
??
?}
?/**
? * 根据用户id获得指定用户的页面脚本session
? * @param userid
? * @param request
? * @return
? */
?
?public ScriptSession getScriptSession(String userid, HttpServletRequest request) {
??
??ScriptSession scriptSessions = null;
??Collection<ScriptSession> collsession1 = new HashSet<ScriptSession>();
??collsession1.addAll(ServerContextFactory.get(request.getSession().getServletContext())
????.getScriptSessionsByPage("/Kindergarden/chatroom/chatroom.jsp"));
??/*WebContext context = WebContextFactory.get();
??Collection<ScriptSession> collsession1 = context.getScriptSessionsByPage("/Kindergarden/chatroom/chatroom.jsp");*/
??for (ScriptSession ss : collsession1) {
???String xuserid = (String) ss.getAttribute("userid");
???
???if (xuserid != null && xuserid.equals(userid)) {
????
????scriptSessions = ss;
???}
??}
??return scriptSessions;
?}
?
?/**
? * 发送消息
? * @param sender 发送者
? * @param receiverid 接收者id
? * @param msg 消息内容
? * @param request
? */
?public void send(String sender,String msg,String nocolormsg,HttpServletRequest request){
??SimpleDateFormat wf = new SimpleDateFormat("EEE");
??java.util.Date date = new java.util.Date();
??java.text.SimpleDateFormat df = new java.text.SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒 E");
??String strDate = df.format(date); //当天日期
??WebContext webContext = WebContextFactory.get();??
??HttpSession session = webContext.getSession();
??ServletContext application = webContext.getServletContext();
??String showChat = (String)application.getAttribute("allContent");
??
??if(msg != null)
??{
???String speaker = sender;
???????????????? if(showChat==null||showChat=="")
???????????????? {
?????????????????? int totalMessage=1;
?????????????????? application.setAttribute("allContent",speaker +" 发送时间:"+strDate+" \t\n" + "<br/>"+" \t\n"+msg + "\t\n"+"<br/><br/>");
?????????????????? application.setAttribute("totalMessage",totalMessage);
???????????????? }
???????????????? else
???????????????? {
?????????????????? int lastMessage = (Integer)application.getAttribute("totalMessage");
?????????????????
?????????????????? if(lastMessage<=101)
?????????????????? {
???????????????? ??
???????????????? ?? application.setAttribute("totalMessage",lastMessage+1);
???????????????? ?? application.setAttribute("allContent",showChat + speaker +" 发送时间:"+strDate+ "<br/>"+" \t\n"+msg + "\t\n"+"<br/><br/>");
???????????????? ?
?????????????????? }
?????????????????? else
?????????????????? {
???????????????? ?? application.setAttribute("totalMessage",0);
???????????????? ?? application.setAttribute("allContent","");
???????????????? ?? application.setAttribute("allContent",speaker +" 发送时间:"+strDate+" \t\n" + "<br/>"+" \t\n"+msg + "\t\n"+"<br/>");
?????????????????? }
???????????????? }
???
??}
????
??ServletContext sc = request.getSession().getServletContext();
??ServerContext sctx = ServerContextFactory.get(sc);
??Collection sessions = sctx.getScriptSessionsByPage("/Kindergarden/chatroom/chatroom.jsp");
??Util util = new Util(sessions);
??//util.setValue("says", application.getAttribute("allContent"));
??
??
??Collection<ScriptSession> collsession1 = sctx.getScriptSessionsByPage("/Kindergarden/chatroom/chatroom.jsp");
??ScriptBuffer script = new ScriptBuffer();
??script.appendScript("AddMsg(")
??.appendData("消息")
??.appendScript(",")
??.appendData("")
??.appendScript(",")
??.appendData(application.getAttribute("allContent"))
??.appendScript(",")
??.appendData("")
???? .appendScript(");");
??????? for (ScriptSession ss : collsession1) {
????? ss.addScript(script);
??? }
?????
??????? Collection<ScriptSession> collsession2 = sctx.getScriptSessionsByPage("/Kindergarden/chatroom/chatroom.jsp");
??ScriptBuffer script2 = new ScriptBuffer();
??script2.appendScript("changeTitle(")
??.appendData(sender+"说:"+nocolormsg)
???? .appendScript(");");
??????? for (ScriptSession ss : collsession2) {
????? ss.addScript(script2);
??? }
?}
?//私聊的发送
?public String privateSend(String sender,String receiverid,String msg,HttpServletRequest request){
??SimpleDateFormat wf = new SimpleDateFormat("EEE");
??java.util.Date date = new java.util.Date();
??java.text.SimpleDateFormat df = new java.text.SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒 E");
??String strDate = df.format(date); //当天日期
??ServletContext sc = request.getSession().getServletContext();
??ServerContext sctx = ServerContextFactory.get(sc);
??ScriptSession session = this.getScriptSession(receiverid, request);
??Collection<ScriptSession> collsession1 = sctx.getScriptSessionsByPage("/Kindergarden/chatroom/chatroom.jsp");
??ScriptBuffer script = new ScriptBuffer();
??script.appendScript("showView(")
??.appendData(sender)
??.appendScript(",")
??.appendData(receiverid)
??.appendScript(",")
??.appendData(msg)
??.appendScript(",")
??.appendData(strDate)
???? .appendScript(");");
??????? for (ScriptSession ss : collsession1) {
????? ss.addScript(script);
??? }
??/*ScriptSession session = this.getScriptSession(receiverid, request);
??Util util = new Util(session);
??util.addFunctionCall("showView", sender, receiverid, msg, strDate);
?//?util.setValue("MyContent", sender);
*/??return "";
?}
?public String exit(String userid,String username,HttpServletRequest request)
?{
??
??int num=0;
??for(int i=0;i<users.size();i++)
??{
???User user = (User)users.get(i);
???if(userid.equals(user.getUserid()))
???{
????num=i;
???}
??}
??users.remove(num);
??HttpSession session = request.getSession();
??session.invalidate();
??refresh(request);
?
??return userid;
?}
?
?/**
? * 修改昵称
? */
?public String changeName(String userid,String name,HttpServletRequest request)
?{
??String result = "";
??try {
???int num = 0;
???for (int i = 0; i < users.size(); i++) {
????User user = (User) users.get(i);
????if (userid.equals(user.getUserid())) {
?????num = i;
????}
???}
???User user = users.get(num);
???user.setUsername(name);
???refresh(request);
???result="success";
??} catch (Exception e) {
???result="false";
???e.printStackTrace();
??}
??return result;
?}
?
?
?
?public void exitGame(){
??? try {
??
???? WebContext context = WebContextFactory.get();
???? HttpSession httpSession = context.getSession();
???? Integer myScSession = (Integer)httpSession.getAttribute("userid");
???? if (myScSession != null){
????? Collection<ScriptSession> sessions = context.getScriptSessionsByPage("/Kindergarden/chatroom/chatroom.jsp");
????? for (ScriptSession s : sessions){
?????? if (s.hashCode() == myScSession){
??????? s.invalidate();return;
?????? }
?????? else
?????? {
????? ?// System.out.println("myScSession:"+myScSession);
????? ?// System.out.println("hashCode:"+s.hashCode());
????? ?// s.invalidate();
?????? }
????? }
???? }
??? } catch (Exception e) {
???? e.printStackTrace();
??? }
?? }
}