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)))); } }
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; } }
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; } }
public virtual void OnOperationResponse(IMClientPeer peer, OperationResponse response) { }
public abstract void OnOperationRequest(IMClientPeer peer, OperationRequest request);
private void OnFile(IMClientPeer peer, Dictionary <string, object> parameters, Chat chat) { //TODO }