public override void OnOperationRequest(IMClientPeer peer, OperationRequest request)
        {
            if (!request.Parameters.TryGetSubCode(out var subCode))
            {
                mLogger.ErrorFormat("消息错误!客户端{0},OperationCode:{1},获取SubCode失败", peer, OperationCode);
                peer.SendResponse(ReturnCode.SubCodeException,
                                  ESocketParameterTool.NewParameters.AddOperationCode(OperationCode));
                return;
            }
            switch (subCode)
            {
            case SubCode.Login_SignUp:
                OnSignUp(peer, request);
                break;

            case SubCode.Login_SignIn:
                OnSignIn(peer, request);
                break;

            case SubCode.Login_ResetPassword:
                OnResetPassword(peer, request);
                break;

            case SubCode.Login_ForgetPassword:
                OnForgetPassword(peer, request);
                break;

            default:
                mLogger.ErrorFormat("消息错误!客户端{0},SubCode未知:{1}", peer, subCode);
                peer.SendResponse(ReturnCode.SubCodeException,
                                  ESocketParameterTool.NewParameters.AddOperationCode(OperationCode));
                break;
            }
        }
        public override void OnOperationResponse(IMClientPeer peer, OperationResponse response)
        {
            if (!response.Parameters.TryGetSubCode(out var subCode))
            {
                mLogger.ErrorFormat("消息错误!客户端:{0},用户名:{1},OperationCode:{2},获取SubCode失败", peer, peer.LoginUser, OperationCode);
                peer.SendResponse(ReturnCode.SubCodeException,
                                  ESocketParameterTool.NewParameters.AddOperationCode(OperationCode));
                return;
            }
            if ((ReturnCode)response.ReturnCode != ReturnCode.Success)
            {
                mLogger.ErrorFormat("请求失败!客户端:{0},用户名:{1},SubCode:{2},ReturnCode:{3}", peer, peer.LoginUser, subCode, (ReturnCode)response.ReturnCode);
                return;
            }
            switch (subCode)
            {
            case SubCode.Contact_Add_Response:
                OnAddResponse(peer, response);
                break;

            default:
                mLogger.ErrorFormat("SubCode错误!客户端:{0},用户名:{1},SubCode:{2}", peer, peer.LoginUser, subCode);
                peer.SendResponse(ReturnCode.SubCodeException,
                                  ESocketParameterTool.NewParameters.AddOperationCode(OperationCode));
                break;
            }
        }
        private void OnRecord(IMClientPeer peer, OperationRequest request)
        {
            const SubCode subCode = SubCode.Chat_Record;

            if (!TryInitResponse(subCode, peer, request, out var parameters,
                                 ParameterKeys.CHAT_RECORD_REQUEST, out ChatRecordRequestModel model))
            {
                return;
            }
            //DB查询聊天记录
            var records = ChatManager.GetRecordsBySendAndRecUsername(peer.LoginUser?.Username, model.ReceiveUsername, model.MinDay, model.MaxDay);
            var tmpRec  = ChatManager.GetRecordsBySendAndRecUsername(model.ReceiveUsername, peer.LoginUser?.Username, model.MinDay, model.MaxDay);

            if (tmpRec != null)
            {
                if (records == null)
                {
                    records = tmpRec;
                }
                else
                {
                    records.AddRange(tmpRec);
                }
            }
            records?.Sort((left, right) => left.Time.CompareTo(right.Time));
            //响应
            peer.SendResponse(ReturnCode.Success, parameters.AddParameter(ParameterKeys.CHAT_RECORD_RESPONSE, new ChatRecordResponseModel(records)));
        }
        public override void OnOperationRequest(IMClientPeer peer, OperationRequest request)
        {
            if (!request.Parameters.TryGetSubCode(out var subCode))
            {
                mLogger.ErrorFormat("消息错误!客户端:{0},用户名:{1},OperationCode:{2},获取SubCode失败", peer, peer.LoginUser, OperationCode);
                peer.SendResponse(ReturnCode.SubCodeException,
                                  ESocketParameterTool.NewParameters.AddOperationCode(OperationCode));
                return;
            }
            switch (subCode)
            {
            case SubCode.Chat_Record:
                OnRecord(peer, request);
                break;

            case SubCode.Chat_Message:
                OnMessage(peer, request);
                break;

            default:
                mLogger.ErrorFormat("消息错误!客户端:{0},用户名:{1},SubCode未知:{2}", peer, peer.LoginUser, subCode);
                peer.SendResponse(ReturnCode.SubCodeException,
                                  ESocketParameterTool.NewParameters.AddOperationCode(OperationCode));
                break;
            }
        }
 //注册
 private void OnSignUp(IMClientPeer peer, OperationRequest request)
 {
     if (!TryInitResponse(SubCode.Login_SignUp, peer, request, out var parameters,
                          ParameterKeys.LOGIN_SIGN_UP_REQUEST, out SignUpRequestModel model))
     {
         return;
     }
     //用户名重复
     if (UserManager.GetUser(model.Username) != null)
     {
         peer.SendResponse(ReturnCode.UsernameRepetition, parameters);
         return;
     }
     //DB注册用户
     UserManager.AddUser(new User
     {
         Username = model.Username,
         Nickname = model.Nickname,
         //密码加盐SHA256加密
         Password = model.Password.SaltEncodeString(DigestUtil.EncodeType.SHA256, out var salt),
         //盐(随机字符串)
         Salt = salt,
         //注册时间
         SignUpTime = TimeUtil.GetCurrentUtcTime().GetTotalMilliseconds()
     });
        private void OnAddListRequest(IMClientPeer peer)
        {
            var requestList   = ContactAddRequestManager.GetContactAddRequestList(peer.LoginUser?.Username);
            var contactedList = ContactAddRequestManager.GetContactAddContactedList(peer.LoginUser?.Username);
            var parameters    = InitParameters(SubCode.Contact_Add_List);
            List <ContactAddServerResponseModel> list = new List <ContactAddServerResponseModel>();

            if (requestList != null)
            {
                foreach (var item in requestList)
                {
                    list.Add(new ContactAddServerResponseModel(true, item.GetResponseCode(), new UserModel(UserManager.GetUser(item.ContactUsername))));
                }
            }
            if (contactedList != null)
            {
                foreach (var item in contactedList)
                {
                    list.Add(new ContactAddServerResponseModel(false, item.GetResponseCode(), new UserModel(UserManager.GetUser(item.RequestUsername))));
                }
            }
            parameters.AddParameter(ParameterKeys.CONTACT_ADD_SERVER_RESPONSE_LIST, new ContactAddServerResponseModelList(list));
            //回应
            peer.SendResponse(ReturnCode.Success, parameters);
        }
        private void OnAddResponse(IMClientPeer peer, OperationResponse response)
        {
            const SubCode subCode = SubCode.Contact_Add_Response;

            if (!TryInitResponse(subCode, peer, response, out var parameters,
                                 ParameterKeys.CONTACT_ADD_CLIENT_RESPONSE, out ContactAddClientResponseModel model))
            {
                return;
            }
            if (peer.LoginUser == null)
            {
                mLogger.ErrorFormat("响应失败!客户端:{0}未登陆!", peer);
                return;
            }
            var contactAddRequest = ContactAddRequestManager.GetContactAddRequest(model.RequestUsername, peer.LoginUser.Username);

            if (contactAddRequest == null)
            {
                peer.SendResponse(ReturnCode.UsernameDoesNotExist, parameters);
                return;
            }

            var responseCode = model.Accept
                ? ContactAddRequest.ContactAddResponseCode.Accept
                : ContactAddRequest.ContactAddResponseCode.Refuse;

            //DB更新
            contactAddRequest.ResponseCode = (int)responseCode;
            ContactAddRequestManager.UpdateContactAddRequest(contactAddRequest);
            var requestUser = UserManager.GetUser(model.RequestUsername);

            if (model.Accept)
            {
                //DB添加
                ContactManager.AddContact(new Contact
                {
                    Username        = model.RequestUsername,
                    ContactUsername = peer.LoginUser.Username
                });
                ContactManager.AddContact(new Contact
                {
                    Username        = peer.LoginUser.Username,
                    ContactUsername = requestUser.Username
                });
            }
            //响应
            ContactAddServerResponseModel responseModel1 = new ContactAddServerResponseModel(false, responseCode, new UserModel(requestUser));

            peer.SendResponse(ReturnCode.Success, parameters.AddParameter(ParameterKeys.CONTACT_ADD_SERVER_RESPONSE, responseModel1));
            //如果请求方在线,发送响应
            if (IMApplication.Instance.TryGetPeerByUsername(model.RequestUsername, out var requestPeer))
            {
                ContactAddServerResponseModel responseModel2 = new ContactAddServerResponseModel(true, responseCode, new UserModel(peer.LoginUser));
                parameters[ParameterKeys.CONTACT_ADD_SERVER_RESPONSE] = responseModel2;
                requestPeer.SendRequest(parameters);
            }
        }
 private void OnWord(IMClientPeer peer, Dictionary <string, object> parameters, Chat chat)
 {
     //给发送方响应消息发送成功
     peer.SendResponse(ReturnCode.Success, parameters.AddParameter(ParameterKeys.CHAT_INFO, chat));
     //给接收方放发送消息
     if (IMApplication.Instance.TryGetPeerByUsername(chat.ReceiveUsername, out var receivePeer))
     {
         receivePeer.SendRequest(parameters);
     }
 }
 protected bool TryInitResponse <T>(SubCode subCode, IMClientPeer peer, OperationBase operation,
                                    out Dictionary <string, object> parameters, string key, out T model)
 {
     parameters = InitParameters(subCode);
     if (!operation.Parameters.TryGetParameter(key, out model) || model == null)
     {
         mLogger.ErrorFormat("消息错误!客户端{0},OperationCode:{1},SubCode:{2},ParameterKeys:{3}", peer, OperationCode, subCode, key);
         peer.SendResponse(ReturnCode.ParameterException, parameters.AddParameter(ParameterKeys.PARAMETER_KEY, key));
         return(false);
     }
     return(true);
 }
        private void OnAddRequest(IMClientPeer peer, OperationRequest request)
        {
            const SubCode subCode = SubCode.Contact_Add_Request;

            if (!TryInitResponse(subCode, peer, request, out var parameters,
                                 ParameterKeys.USERNAME, out string contactUsername))
            {
                return;
            }

            var       contactAddRequest = ContactAddRequestManager.GetContactAddRequest(peer.LoginUser?.Username, contactUsername);
            const int wait = (int)ContactAddRequest.ContactAddResponseCode.Waite;

            if (contactAddRequest != null)
            {
                //无需再次添加
                if (contactAddRequest.ResponseCode == wait)
                {
                    //回应
                    peer.SendResponse(ReturnCode.Success, parameters);
                    return;
                }
                //DB更新
                contactAddRequest.ResponseCode = wait;
                ContactAddRequestManager.UpdateContactAddRequest(contactAddRequest);
            }
            else
            {
                //DB添加请求
                ContactAddRequestManager.AddContactAddRequest(new ContactAddRequest
                {
                    RequestUsername = peer.LoginUser.Username,
                    ContactUsername = contactUsername,
                    ResponseCode    = wait
                });
            }

            //回应
            peer.SendResponse(ReturnCode.Success, parameters);
            //如果对方在线,直接发送请求
            if (IMApplication.Instance.TryGetPeerByUsername(contactUsername, out var contactPeer))
            {
                contactPeer.SendRequest(parameters
                                        .AddParameter(ParameterKeys.CONTACT_ADD_SERVER_RESPONSE,
                                                      new ContactAddServerResponseModel(false, ContactAddRequest.ContactAddResponseCode.Waite,
                                                                                        new UserModel(peer.LoginUser))));
            }
        }
Exemple #11
0
        private void OnMessage(IMClientPeer peer, OperationRequest request)
        {
            const SubCode subCode = SubCode.Chat_Message;

            if (!TryInitResponse(subCode, peer, request, out var parameters,
                                 ParameterKeys.CHAT_MESSAGE_REQUEST, out ChatMessageRequestModel model))
            {
                return;
            }
            Chat chat = new Chat
            {
                SendUsername    = peer.LoginUser?.Username,
                ReceiveUsername = model.ReceiveUsername,
                MessageType     = (int)model.MessageType,
                Message         = model.Message,
                Time            = TimeUtil.GetCurrentUtcTime().GetTotalMilliseconds()
            };

            switch (model.MessageType)
            {
            case Chat.MessageCode.Word:
                //记录到DB中
                ChatManager.AddChat(chat);
                OnWord(peer, parameters, chat);
                break;

            case Chat.MessageCode.Emoji:
                //记录到DB中
                ChatManager.AddChat(chat);
                OnEmoji(peer, parameters, chat);
                break;

            case Chat.MessageCode.File:
                //记录到DB中
                ChatManager.AddChat(chat);
                OnFile(peer, parameters, chat);
                break;

            default:
                mLogger.ErrorFormat("消息错误!客户端:{0},用户名:{1},mSubCode:{2},ChatMessageCode{3}", peer, peer.LoginUser, subCode, model.MessageType);
                peer.SendResponse(ReturnCode.ChatMessageCodeException,
                                  ESocketParameterTool.NewParameters.AddOperationCode(OperationCode));
                break;
            }
        }
Exemple #12
0
        private bool TryInitResponse <T>(SubCode subCode, IMClientPeer peer, OperationRequest request,
                                         out Dictionary <string, object> parameters, string key, out T model) where T : ChatRequestModelBase
        {
            if (!base.TryInitResponse(subCode, peer, request, out parameters, key, out model))
            {
                return(false);
            }
            //DB判断接收方有没有问题
            var user = UserManager.GetUser(model.ReceiveUsername);

            if (user == null)
            {
                mLogger.ErrorFormat("消息错误UsernameDoesNotExist!客户端:{0},用户名:{1},SubCode:{2},ReceiveUsername:{3}", peer, peer.LoginUser, subCode, model.ReceiveUsername);
                peer.SendResponse(ReturnCode.UsernameDoesNotExist, parameters);
                return(false);
            }
            return(true);
        }
        private void OnListRequest(IMClientPeer peer, OperationRequest request)
        {
            //DB查询联系人列表
            var contacts   = ContactManager.GetContactsByUsername(peer.LoginUser?.Username);
            var parameters = InitParameters(SubCode.Contact_List);

            if (contacts != null)
            {
                List <UserModel> users = new List <UserModel>();
                foreach (var c in contacts)
                {
                    users.Add(new UserModel(UserManager.GetUser(c.ContactUsername)));
                }
                parameters.AddParameter(ParameterKeys.USER_MODEL_LIST, new UserListModel(users));
            }
            //回应
            peer.SendResponse(ReturnCode.Success, parameters);
        }
        private void OnSearchRequest(IMClientPeer peer, OperationRequest request)
        {
            const SubCode subCode = SubCode.Contact_Search;

            if (!TryInitResponse(subCode, peer, request, out var parameters,
                                 ParameterKeys.USERNAME, out string contactUsername))
            {
                return;
            }
            //DB模糊查询
            var users = UserManager.FuzzySearchByUsername(contactUsername);

            if (users != null)
            {
                parameters.AddParameter(ParameterKeys.USER_MODEL_LIST, new UserListModel(users));
            }
            //回应
            peer.SendResponse(ReturnCode.Success, parameters);
        }
        private void OnDeleteRequest(IMClientPeer peer, OperationRequest request)
        {
            const SubCode subCode = SubCode.Contact_Delete;

            if (!TryInitResponse(subCode, peer, request, out var parameters,
                                 ParameterKeys.USERNAME, out string contactUsername))
            {
                return;
            }
            //DB删除
            ContactManager.DeleteContact(peer.LoginUser?.Username, contactUsername);
            ContactManager.DeleteContact(contactUsername, peer.LoginUser?.Username);
            //回应
            peer.SendResponse(ReturnCode.Success, parameters.AddParameter(ParameterKeys.USERNAME, contactUsername));
            //如果请求在线,发送响应
            if (IMApplication.Instance.TryGetPeerByUsername(contactUsername, out var responsePeer))
            {
                parameters[ParameterKeys.USERNAME] = peer.LoginUser.Username;
                responsePeer.SendRequest(parameters);
            }
        }
        public override void OnOperationRequest(IMClientPeer peer, OperationRequest request)
        {
            if (!request.Parameters.TryGetSubCode(out var subCode))
            {
                mLogger.ErrorFormat("消息错误!客户端:{0},用户名:{1},OperationCode:{2},获取SubCode失败", peer, peer.LoginUser, OperationCode);
                peer.SendResponse(ReturnCode.SubCodeException,
                                  ESocketParameterTool.NewParameters.AddOperationCode(OperationCode));
                return;
            }
            switch (subCode)
            {
            case SubCode.Contact_List:
                OnListRequest(peer, request);
                break;

            case SubCode.Contact_Search:
                OnSearchRequest(peer, request);
                break;

            case SubCode.Contact_Add_Request:
                OnAddRequest(peer, request);
                break;

            case SubCode.Contact_Delete:
                OnDeleteRequest(peer, request);
                break;

            case SubCode.Contact_Add_List:
                OnAddListRequest(peer);
                break;

            default:
                mLogger.ErrorFormat("消息错误!客户端:{0},用户名:{1},SubCode未知:{2}", peer, peer.LoginUser, subCode);
                peer.SendResponse(ReturnCode.SubCodeException,
                                  ESocketParameterTool.NewParameters.AddOperationCode(OperationCode));
                break;
            }
        }
Exemple #17
0
 public virtual void OnOperationResponse(IMClientPeer peer, OperationResponse response)
 {
 }
Exemple #18
0
 public abstract void OnOperationRequest(IMClientPeer peer, OperationRequest request);
Exemple #19
0
 private void OnFile(IMClientPeer peer, Dictionary <string, object> parameters, Chat chat)
 {
     //TODO
 }