/// <summary> /// 结束会话 并通知消息接收方 对话已经结束 /// </summary> /// lstParams[0] : cookieID /// lstParams[1] : 消息发送人ID /// lstParams[2] : 消息接收人ID 用于通知 /// <param name="lstParams"></param> public void EndCookieByID(List <string> lstParams) { //LogOperation.WriteLog("End cookie " + lstParams[0]); long lUserID = long.Parse(lstParams[1]); SessionInfo session = null; if (!lstLoginUsers.Keys.Contains(lUserID)) { //LogOperation.WriteLog("EndCookieByID error ," + lUserID + " is offline"); return; } session = currentUser.UserSession; var dbInfo = session.DatabaseInfo; if (dbInfo != null) { dbInfo.RealPassword = WCF16001EncryptOperation.DecryptWithM004(dbInfo.Password); session.DBConnectionString = dbInfo.GetConnectionString(); } List <string> lstEndCookieParams = new List <string>(); lstEndCookieParams.Add(lstParams[0]); OperationReturn optReturn = ChatMessageOperation.EndCookie(session, lstEndCookieParams); if (!optReturn.Result) { return; } long lReceiverID = long.Parse(lstParams[2]); if (!lstLoginUsers.Keys.Contains(lReceiverID)) { //如果对方已经下线 不需要通知 return; } //如果对方还在线 需要通知对方会话已经结束 lstEndCookieParams.Clear(); lstEndCookieParams.Add(lstLoginUsers[lUserID].UserName); lstEndCookieParams.Add(lUserID.ToString()); if (lstLoginUsers.Keys.Contains(lReceiverID)) { try { lstLoginUsers[lReceiverID].CallBack.SendSysMessage(S1600MessageType.EndCookie, lstEndCookieParams); } catch (Exception ex) { lstLoginUsers.Remove(lReceiverID); //LogOperation.WriteLog("End cookie, and send message to " + lReceiverID + " failed:" + ex.Message); } } //LogOperation.WriteLog("End cookie done"); }
/// <summary> /// 发送聊天消息 /// </summary> /// <param name="msgObj"></param> /// <param name="bNewCookie">是否新会话</param> public void SendChatMessage(ChatMessage msgObj, bool bNewCookie) { //如果是新cookie 需要获得一个新cookie 写入数据库 并返回给客户端 List <string> lstParams = new List <string>(); lstParams.Add(bNewCookie == true ? "0" : "1"); //判断消息接收人是否在线 在线 则写入在线消息表 离线 则写入离线消息表 bool bReceiverOnLine = lstLoginUsers.Keys.Contains(msgObj.ReceiverID); lstParams.Add(bReceiverOnLine ? "2" : "3"); OperationReturn optReturn = ChatMessageOperation.WriteChatMsg(lstLoginUsers[msgObj.SenderID].UserSession, msgObj, lstParams); if (!optReturn.Result) { //如果写入数据库出错 则给发送者发消息说发送失败 List <string> lstReturn = new List <string>(); lstReturn.Add(msgObj.MsgContent); lstReturn.Add(msgObj.ReceiverName); lstLoginUsers[msgObj.SenderID].CallBack.SendSysMessage(S1600MessageType.SendMsgError, lstReturn); return; } long cookieID = 0; long.TryParse(optReturn.Data.ToString(), out cookieID); //LogOperation.WriteLog("CookieID = " + cookieID); if (bNewCookie) { lstParams.Clear(); lstParams.Add(msgObj.ReceiverID.ToString()); lstParams.Add(cookieID.ToString()); lstLoginUsers[msgObj.SenderID].CallBack.SendSysMessage(S1600MessageType.CookieID, lstParams); // LogOperation.WriteLog("Send cookieID to " + msgObj.SenderName); } msgObj.CookieID = cookieID; //如果写入数据库成功 则发给接收者 并告诉发送者cookieid try { if (lstLoginUsers.Keys.Contains(msgObj.ReceiverID)) { lstLoginUsers[msgObj.ReceiverID].CallBack.ReceiveChatMsg(msgObj); } } catch (Exception ex) { lstLoginUsers.Remove(msgObj.ReceiverID); LogOff(lstLoginUsers[msgObj.ReceiverID].UserSession); //LogOperation.WriteLog("Send chat message to " + msgObj.ReceiverName + " failed," + ex.Message + ","); } //LogOperation.WriteLog("Send message to " + msgObj.ReceiverName + ",done"); }
/// <summary> /// 发送离线消息 /// </summary> /// <param name="lstMsgs"></param> private void SendOfflineMsg(Dictionary <long, ChatMessage> dicMsgs) { foreach (KeyValuePair <long, ChatMessage> pair in dicMsgs) { try { currCallback.ReceiveChatMsg(pair.Value); //删掉已经发送的离线消息 List <string> lstParams = new List <string>(); lstParams.Add(pair.Key.ToString()); ChatMessageOperation.DelteOfflineMsg(currentUser.UserSession, lstParams); } catch (Exception ex) { LogOff(currentUser.UserSession); lstLoginUsers.Remove(currentUser.UserID); //LogOperation.WriteLog("Send offline msg error,account abnormal exit: " + ex.Message); } } }
/// <summary> /// 登录 /// </summary> /// <param name="session"></param> /// <param name="lstParams"> /// </param> public void LoginSystem(SessionInfo session) { List <string> lstSysMsg = new List <string>(); try { //判断传过来的参数不为空 if (session == null) { currCallback.SendSysMessage(S1600MessageType.LoginFailed, lstSysMsg); return; } var dbInfo = session.DatabaseInfo; if (dbInfo != null) { dbInfo.RealPassword = WCF16001EncryptOperation.DecryptWithM004(dbInfo.Password); session.DBConnectionString = dbInfo.GetConnectionString(); } string s = string.Empty; foreach (KeyValuePair <long, LoginUserInfo> pair in lstLoginUsers) { s = WCF16001EncryptOperation.DecryptWithM004(pair.Value.UserName) + " | "; } //LogOperation.WriteLog(s); currentUser = new LoginUserInfo(); currentUser.UserID = session.UserID; currentUser.UserSession = session; currentUser.UserName = session.UserInfo.Account; currentUser.CallBack = currCallback; //如果不包含这个用户 则加入该对象 //lstLoginUsers.Remove(currentUser.UserID); if (!lstLoginUsers.Keys.Contains(currentUser.UserID)) { lstLoginUsers.Add(currentUser.UserID, currentUser); s = "User Login : "******"User Logined : " + WCF16001EncryptOperation.DecryptWithM004(currentUser.UserName); // LogOperation.WriteLog(s); } catch (Exception ex) { //此处无需做任何操作 因为无论消息发送是否成功 该通道都要被删掉 s = "User Login send OffLine msg failed : " + WCF16001EncryptOperation.DecryptWithM004(currentUser.UserName) + ",\t" + ex.Message; //LogOperation.WriteLog(s); } lstLoginUsers.Remove(currentUser.UserID); //此处不可缺 删掉原来的callback 添加进现在的callback 用来更新callback通道 lstLoginUsers.Add(currentUser.UserID, currentUser); //LogOperation.WriteLog("Delete old and add new "); } currCallback.SendSysMessage(S1600MessageType.LoginSuceess, lstSysMsg); //更新数据库中的用户在线属性 OperationReturn optReturn = ResourceOperations.ChangeUserStatus(session, "1"); if (!optReturn.Result) { lstSysMsg.Clear(); lstSysMsg.Add("code = " + optReturn.Code + " ; message = " + optReturn.Message); currCallback.SendSysMessage(S1600MessageType.LoginFailed, lstSysMsg); return; } // currCallback.SendSysMessage(MessageType.TestMsg, "Message = " + optReturn.Message); //获得联系人 optReturn = PermissionFuncs.GetContacters(session); if (!optReturn.Result) { lstSysMsg.Clear(); lstSysMsg.Add("code = " + optReturn.Code + " ; message = " + optReturn.Message); currCallback.SendSysMessage(S1600MessageType.GetFriendFailed, lstSysMsg); return; } currCallback.InitFriendList(optReturn.Data as List <string>); //给在线的用户发送上线通知 foreach (KeyValuePair <long, LoginUserInfo> user in lstLoginUsers) { //通知每个用户 我上线啦 我本人就不用发了 if (user.Key != currentUser.UserID) { lstSysMsg.Clear(); lstSysMsg.Add(currentUser.UserID.ToString()); user.Value.CallBack.SendSysMessage(S1600MessageType.FriendOnline, lstSysMsg); } } //开始接收离线消息 List <string> lstParam = new List <string>(); lstParam.Add(currentUser.UserID.ToString()); optReturn = ChatMessageOperation.GetAllOffLineMsg(session, lstParam); if (optReturn.Result) { //LogOperation.WriteLog("Send offline message to " + currentUser.UserName); SendOfflineMsg(optReturn.Data as Dictionary <long, ChatMessage>); } } catch (Exception ex) { //LogOperation.WriteLog("Login error: " + ex.Message); } }