package server; import java.util.List; import model.HibernateDataOperation; import model.HibernateSessionFactory; import model.ResultCode; import model.User; import org.apache.log4j.Logger; import org.hibernate.Session; import protocol.ProtoHead; import protocol.Data.UserData; import protocol.Data.UserData.UserItem; import protocol.Msg.AddFriendMsg; import protocol.Msg.ChangeFriendMsg; import protocol.Msg.DeleteFriendMsg; import protocol.Msg.GetUserInfoMsg; import protocol.Msg.DeleteFriendMsg.DeleteFriendRsp; import protocol.Msg.GetUserInfoMsg.GetUserInfoRsp; import com.google.protobuf.InvalidProtocolBufferException; import exception.NoIpException; /** * 主服务器下的子服务器 负责通讯录相关事件 * * @author wangfei * */ public class Server_Friend { Logger logger = Logger.getLogger(Server_Friend.class); private ServerModel serverModel; private ServerNetwork serverNetwork; private Server_Chatting server_Chatting; public ServerModel getServerModel() { return serverModel; } public void setServerModel(ServerModel serverModel) { this.serverModel = serverModel; } public ServerNetwork getServerNetwork() { return serverNetwork; } public void setServerNetwork(ServerNetwork serverNetwork) { this.serverNetwork = serverNetwork; } public Server_Chatting getServer_Chatting() { return server_Chatting; } public void setServer_Chatting(Server_Chatting server_Chatting) { this.server_Chatting = server_Chatting; } /** * 搜索用户 * * @param networkPacket * @author wangfei * @throws NoIpException * @time 2015-03-23 */ public void getUserInfo(NetworkPacket networkPacket) throws NoIpException { logger.info("Server_Friend.getUserInfo:begin to getUserInfo!"); GetUserInfoMsg.GetUserInfoRsp.Builder getUserInfoBuilder = GetUserInfoMsg.GetUserInfoRsp.newBuilder(); try { GetUserInfoMsg.GetUserInfoReq getUserInfoObject = GetUserInfoMsg.GetUserInfoReq.parseFrom(networkPacket .getMessageObjectBytes()); ResultCode code = ResultCode.NULL; List list; for (String userId : getUserInfoObject.getTargetUserIdList()) { list = HibernateDataOperation.query("userId", userId, User.class, code); if (code.getCode().equals(ResultCode.SUCCESS) && list.size() > 0) { // 不支持模糊搜索 所以如果有搜索结果 只可能有一个结果 User user = (User) list.get(0); UserData.UserItem.Builder userBuilder = UserData.UserItem.newBuilder(); userBuilder.setUserId(user.getUserId()); userBuilder.setUserName(user.getUserName()); userBuilder.setHeadIndex(user.getHeadIndex()); getUserInfoBuilder.addUserItem(userBuilder); getUserInfoBuilder.setResultCode(GetUserInfoMsg.GetUserInfoRsp.ResultCode.SUCCESS); } else if (code.getCode().equals(ResultCode.FAIL)) { logger.error("Server_Friend.getUserInfo: Hibernate error"); getUserInfoBuilder.setResultCode(GetUserInfoMsg.GetUserInfoRsp.ResultCode.FAIL); } else if (list.size() < 1) { logger.info("Server_Friend.getUserInfo:User:" + ServerModel.getIoSessionKey(networkPacket.ioSession) + " not exist!"); getUserInfoBuilder.setResultCode(GetUserInfoMsg.GetUserInfoRsp.ResultCode.USER_NOT_EXIST); } } } catch (InvalidProtocolBufferException e) { logger.error("Server_Friend.getUserInfo:Error was found when using Protobuf to deserialization " + ServerModel.getIoSessionKey(networkPacket.ioSession) + " packet!"); logger.error(e.getStackTrace()); logger.error(e.getMessage()); getUserInfoBuilder.setResultCode(GetUserInfoMsg.GetUserInfoRsp.ResultCode.FAIL); } // 回复客户端 serverNetwork.sendToClient(new WaitClientResponse(networkPacket.ioSession, new PacketFromServer(networkPacket .getMessageID(), ProtoHead.ENetworkMessage.GET_USERINFO_RSP_VALUE, getUserInfoBuilder.build().toByteArray()))); } /** * 添加好友 * * @param networkPacket * @author wangfei * @throws NoIpException * @time 2015-03-24 */ public void addFriend(NetworkPacket networkPacket) throws NoIpException { logger.info("Server_Friend.addFriend:begin to add friend!"); AddFriendMsg.AddFriendRsp.Builder addFriendBuilder = AddFriendMsg.AddFriendRsp.newBuilder(); Session session = HibernateSessionFactory.getSession(); try { AddFriendMsg.AddFriendReq addFriendObject = AddFriendMsg.AddFriendReq.parseFrom(networkPacket .getMessageObjectBytes()); ClientUser clientUser = serverModel.getClientUserFromTable(networkPacket.ioSession.getRemoteAddress().toString()); User friend = null; ResultCode code1 = ResultCode.NULL; ResultCode code2 = ResultCode.NULL; List list1 = HibernateDataOperation.query("userId", clientUser.userId, User.class, code1,session); List list2 = HibernateDataOperation.query("userId", addFriendObject.getFriendUserId(), User.class, code2,session); if (code1.getCode().equals(ResultCode.FAIL) || code2.getCode().equals(ResultCode.FAIL)) { // 数据库查询失败 出现异常 logger.error("Server_Friend.addFriend:Hibernate query fail"); addFriendBuilder.setResultCode(AddFriendMsg.AddFriendRsp.ResultCode.FAIL); } else if (list1.size() < 1 || list2.size() < 1) { // 用户不存在 logger.error("Server_Friend.addFriend:user or friend not exist " + list1.size() + " " + list2.size()); addFriendBuilder.setResultCode(AddFriendMsg.AddFriendRsp.ResultCode.FAIL); } else { // 查询结果正常 开始处理 User u = (User) list1.get(0); friend = (User) list2.get(0); add(u, friend, clientUser, addFriendBuilder); // 回复客户端 serverNetwork.sendToClient(new WaitClientResponse(networkPacket.ioSession, new PacketFromServer(networkPacket .getMessageID(), ProtoHead.ENetworkMessage.ADD_FRIEND_RSP_VALUE, addFriendBuilder.build().toByteArray()))); // 通知系统消息 server_Chatting.sendSystemMessage(u.getUserId() + " 已经和您成为好友", friend.getUserId()); server_Chatting.sendSystemMessage(friend.getUserId() + " 已经和您成为好友", u.getUserId()); return; } } catch (InvalidProtocolBufferException e) { logger.error("Server_Friend.addFriend:Error was found when using Protobuf to deserialization " + ServerModel.getIoSessionKey(networkPacket.ioSession) + " packet!"); logger.error(e.getStackTrace()); logger.error(e.getMessage()); addFriendBuilder.setResultCode(AddFriendMsg.AddFriendRsp.ResultCode.FAIL); } // 回复客户端 serverNetwork.sendToClient(new WaitClientResponse(networkPacket.ioSession, new PacketFromServer(networkPacket .getMessageID(), ProtoHead.ENetworkMessage.ADD_FRIEND_RSP_VALUE, addFriendBuilder.build().toByteArray()))); } private void add(User u, User friend, ClientUser clientUser, AddFriendMsg.AddFriendRsp.Builder addFriendBuilder) { // 检测双方是否已经是好友关系 boolean exist1 = false, exist2 = false; for (User user : u.getFriends()) { if (user.getUserId().equals(friend.getUserId())) { exist1 = true; break; } } for (User user : friend.getFriends()) { if (user.getUserId().equals(u.getUserId())) { exist2 = true; break; } } // 如果不存在好友关系 则添加好友 ResultCode code1 = ResultCode.NULL; ResultCode code2 = ResultCode.NULL; if (!exist1) { u.getFriends().add(friend); HibernateDataOperation.update(u, code1); // 给添加好友的用户发送Sync if (code1.getCode().equals(ResultCode.SUCCESS)) sendSync(clientUser, friend, ChangeFriendMsg.ChangeFriendSync.ChangeType.ADD); } if (!exist2) { friend.getFriends().add(u); HibernateDataOperation.update(friend, code2); ClientUser friendUser = serverModel.getClientUserByUserId(friend.getUserId()); if (null != friendUser && code2.getCode().equals(ResultCode.SUCCESS)) { // 如果对方在线 需要发消息给对方通知好友添加 sendSync(friendUser, u, ChangeFriendMsg.ChangeFriendSync.ChangeType.ADD); } } if (code1.getCode().equals(ResultCode.SUCCESS) && code2.getCode().equals(ResultCode.SUCCESS)) addFriendBuilder.setResultCode(AddFriendMsg.AddFriendRsp.ResultCode.SUCCESS); else addFriendBuilder.setResultCode(AddFriendMsg.AddFriendRsp.ResultCode.FAIL); } /** * 删除好友 * * @param networkPacket * @author wangfei * @throws NoIpException * @time 2015-03-24 */ public void deleteFriend(NetworkPacket networkPacket) throws NoIpException { logger.info("Server_Friend.deleteFriend:begin to delete friend!"); DeleteFriendMsg.DeleteFriendRsp.Builder deleteFriendBuilder = DeleteFriendMsg.DeleteFriendRsp.newBuilder(); Session session = HibernateSessionFactory.getSession(); try { DeleteFriendMsg.DeleteFriendReq deleteFriendObject = DeleteFriendMsg.DeleteFriendReq.parseFrom(networkPacket .getMessageObjectBytes()); ClientUser clientUser = serverModel.getClientUserFromTable(networkPacket.ioSession.getRemoteAddress().toString()); User friend = null; ResultCode code1 = ResultCode.NULL; ResultCode code2 = ResultCode.NULL; List list1 = HibernateDataOperation.query("userId", clientUser.userId, User.class, code1,session); List list2 = HibernateDataOperation.query("userId", deleteFriendObject.getFriendUserId(), User.class, code2,session); if (code1.getCode().equals(ResultCode.FAIL) || code2.getCode().equals(ResultCode.FAIL)) { // 数据库查询失败 出现异常 logger.error("Server_Friend.deleteFriend:Hibernate query fail"); deleteFriendBuilder.setResultCode(DeleteFriendMsg.DeleteFriendRsp.ResultCode.FAIL); } else if (list1.size() < 1 || list2.size() < 1) { // 用户不存在 logger.error("Server_Friend.deleteFriend:user or friend not exist " + list1.size() + " " + list2.size()); deleteFriendBuilder.setResultCode(DeleteFriendMsg.DeleteFriendRsp.ResultCode.FAIL); } else { //查询结果正常 开始处理 User u = (User) list1.get(0); friend = (User) list2.get(0); delete(u, friend, clientUser, deleteFriendBuilder); } } catch (InvalidProtocolBufferException e) { logger.error("Server_Friend.deleteFriend:Error was found when using Protobuf to deserialization " + ServerModel.getIoSessionKey(networkPacket.ioSession) + " packet!"); logger.error(e.getStackTrace()); logger.error(e.getMessage()); deleteFriendBuilder.setResultCode(DeleteFriendMsg.DeleteFriendRsp.ResultCode.FAIL); } // 回复客户端 serverNetwork.sendToClient(new WaitClientResponse(networkPacket.ioSession, new PacketFromServer(networkPacket .getMessageID(), ProtoHead.ENetworkMessage.DELETE_FRIEND_RSP_VALUE, deleteFriendBuilder.build().toByteArray()))); } private void delete(User u, User friend, ClientUser clientUser, DeleteFriendMsg.DeleteFriendRsp.Builder deleteFriendBuilder) { // 检测双方之前是否是好友关系 User x = null, y = null; for (User a : u.getFriends()) { if (a.getUserId().equals(friend.getUserId())) x = a; } for (User b : friend.getFriends()) { if (b.getUserId().equals(u.getUserId())) y = b; } // 如果是存在好友关系 则删除 ResultCode code1 = ResultCode.NULL; ResultCode code2 = ResultCode.NULL; if (null != x) { u.getFriends().remove(x); HibernateDataOperation.update(u, code1); if (code1.getCode().equals(ResultCode.SUCCESS)) // 给删除好友的用户发送Sync sendSync(clientUser, friend, ChangeFriendMsg.ChangeFriendSync.ChangeType.DELETE); } if (null != y) { friend.getFriends().remove(y); HibernateDataOperation.update(friend, code2); ClientUser friendUser = serverModel.getClientUserByUserId(friend.getUserId()); if (null != friendUser && code2.getCode().equals(ResultCode.SUCCESS)) // 如果被删除的用户在线 则给其发送Sync sendSync(friendUser, u, ChangeFriendMsg.ChangeFriendSync.ChangeType.DELETE); } if (code1.getCode().equals(ResultCode.SUCCESS) && code2.getCode().equals(ResultCode.SUCCESS)) deleteFriendBuilder.setResultCode(DeleteFriendMsg.DeleteFriendRsp.ResultCode.SUCCESS); else deleteFriendBuilder.setResultCode(DeleteFriendMsg.DeleteFriendRsp.ResultCode.FAIL); } private void sendSync(ClientUser clientUser, User user, ChangeFriendMsg.ChangeFriendSync.ChangeType type) { UserItem.Builder uib = UserItem.newBuilder(); uib.setUserId(user.getUserId()); uib.setUserName(user.getUserName()); uib.setHeadIndex(user.getHeadIndex()); ChangeFriendMsg.ChangeFriendSync.Builder cfb = ChangeFriendMsg.ChangeFriendSync.newBuilder(); cfb.setChangeType(type); cfb.setUserItem(uib); // 向客户端发送消息 serverNetwork.sendToClient(new WaitClientResponse(clientUser.ioSession, new PacketFromServer( ProtoHead.ENetworkMessage.CHANGE_FRIEND_SYNC_VALUE, cfb.build().toByteArray()))); } }