Beispiel #1
0
        /// <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);
            }
        }
Beispiel #2
0
 public Service16001()
 {
     currCallback = OperationContext.Current.GetCallbackChannel <IService16001CallBack>();
 }