コード例 #1
0
ファイル: Service16001.svc.cs プロジェクト: chenmj201601/UMP
        /// <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");
        }
コード例 #2
0
ファイル: Service16001.svc.cs プロジェクト: chenmj201601/UMP
        /// <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");
        }
コード例 #3
0
ファイル: Service16001.svc.cs プロジェクト: chenmj201601/UMP
 /// <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);
         }
     }
 }
コード例 #4
0
ファイル: Service16001.svc.cs プロジェクト: chenmj201601/UMP
        /// <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);
            }
        }