package server;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.List;
import javax.imageio.ImageIO;
import model.Group;
import model.HibernateDataOperation;
import model.HibernateSessionFactory;
import model.ResultCode;
import model.User;
import observer.ObserverMessage_Login;
import org.apache.log4j.Logger;
import org.hibernate.Query;
import org.hibernate.Session;
import com.google.protobuf.InvalidProtocolBufferException;
import exception.NoIpException;
import protocol.ProtoHead;
import protocol.Data.GroupData.GroupItem;
import protocol.Data.UserData.UserItem;
import protocol.Msg.GetPersonalInfoMsg;
import protocol.Msg.LoginMsg;
import protocol.Msg.LogoutMsg;
import protocol.Msg.OffLineMsg;
import protocol.Msg.PersonalSettingsMsg;
import protocol.Msg.PersonalSettingsMsg.PersonalSettingsRsp;
import protocol.Msg.RegisterMsg.RegisterRsp;
import protocol.Msg.RegisterMsg;
import protocol.Msg.GetPersonalInfoMsg.GetPersonalInfoRsp;
import protocol.Msg.LoginMsg.LoginRsp;
import tools.GetImage;
/**
* 主服务器下的子服务器,负责处理用户相关事件
*
* @author Feng
*
*/
public class Server_User {
Logger logger = Logger.getLogger(Server_User.class);
private ServerModel serverModel;
private ServerNetwork serverNetwork;
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;
}
/**
* 对 用户心跳包回复 的处理 将online值设为True
*
* @param packetFromServer
* @author Feng
*/
public void keepAlive(NetworkPacket packetFromServer) {
// System.out.println((packetFromServer == null) + " " +
// (packetFromServer.ioSession == null));
// System.out.println(serverModel.clientUserTable.keySet().size());
// System.out.println("fuck " +
// serverModel.clientUserTable.containsKey(ServerModel.getIoSessionKey(packetFromServer.ioSession)));
// 如果ClientUser已经掉线被删除,那么就不管了
try {
// Debug.log("Server_User", "Deal with user's" +
// ServerModel.getIoSessionKey(packetFromServer.ioSession)
// + " 'keepAlivePacket' reply");
logger.info("Server_User : Deal with user's" + ServerModel.getIoSessionKey(packetFromServer.ioSession)
+ " 'keepAlivePacket' reply");
if (serverModel.getClientUserFromTable(packetFromServer.ioSession) == null) {
// Debug.log(Debug.LogType.EXCEPTION, "Server_User",
// "Can't find user in 'ClientUserTalbe'" +
// ServerModel.getIoSessionKey(packetFromServer.ioSession)
// + ",user's 'KeepAlivePacket' reply will be ignore!");
logger.warn("Server_User : Can't find user in 'ClientUserTalbe'"
+ ServerModel.getIoSessionKey(packetFromServer.ioSession)
+ ",user's 'KeepAlivePacket' reply will be ignore!");
return;
}
serverModel.getClientUserFromTable(packetFromServer.ioSession).onLine = true;
} catch (NullPointerException e) {
logger.error("Server_User: 异常,用户" + packetFromServer.ioSession + "已掉线,心跳回复不作处理!");
e.printStackTrace();
} catch (NoIpException e) {
e.printStackTrace();
}
}
/**
* 处理新用户注册事件
*
* @param packetFromServer
* @author Feng
* @throws NoIpException
*/
public void register(NetworkPacket packetFromServer) throws NoIpException {
logger.info("Server_User.register:begin to register");
RegisterMsg.RegisterRsp.Builder responseBuilder = RegisterMsg.RegisterRsp.newBuilder();
responseBuilder.setResultCode(RegisterRsp.ResultCode.USER_EXIST);
try {
RegisterMsg.RegisterReq registerObject = RegisterMsg.RegisterReq.parseFrom(packetFromServer.getMessageObjectBytes());
logger.info("Server_User" + "'RegisterEvent': Deal with user's"
+ ServerModel.getIoSessionKey(packetFromServer.ioSession) + " 'RegisterEvent'");
// 查找是否存在同名用户
ResultCode code = ResultCode.NULL;
List list = HibernateDataOperation.query("userId", registerObject.getUserId(), User.class, code);
if (code.getCode().equals(ResultCode.FAIL)) {
// 数据库查询出错
logger.error("Server_User.register:query from database fail");
} else if (list.size() > 0) { // 已存在
// 已存在相同账号用户,告诉客户端
// System.out.println("什么鬼?");
logger.info("Server_User" + "'RegisterEvent':User's" + ServerModel.getIoSessionKey(packetFromServer.ioSession)
+ " register userID repeated,response Error!");
responseBuilder.setResultCode(RegisterMsg.RegisterRsp.ResultCode.USER_EXIST);
} else { // 没问题,可以开始注册
User user = new User();
user.setUserId(registerObject.getUserId());
user.setUserName(registerObject.getUserName());
user.setUserPassword(registerObject.getUserPassword());
ResultCode code2 = ResultCode.NULL;
HibernateDataOperation.add(user, code2);
if (code2.getCode().equals(ResultCode.SUCCESS)) {
// 成功,设置回包码
logger.info("Server_User" + "'RegisterEvent':User's"
+ ServerModel.getIoSessionKey(packetFromServer.ioSession)
+ " Register Successful,response to Client!");
responseBuilder.setResultCode(RegisterMsg.RegisterRsp.ResultCode.SUCCESS);
}
}
} catch (InvalidProtocolBufferException e) {
logger.error("Server_User : 'RegisterEvent': Error was found when using Protobuf to deserialization "
+ ServerModel.getIoSessionKey(packetFromServer.ioSession) + "!");
} catch (IOException e) {
logger.error("Server_User : 'RegisterEvent': " + ServerModel.getIoSessionKey(packetFromServer.ioSession) + " 返回包时异常!");
logger.error(e.getStackTrace());
} catch (NoIpException e) {
logger.error(e.getStackTrace());
}
// 回复客户端
serverNetwork.sendToClient(new WaitClientResponse(packetFromServer.ioSession, new PacketFromServer(NetworkPacket
.getMessageID(packetFromServer.arrayBytes), ProtoHead.ENetworkMessage.REGISTER_RSP_VALUE, responseBuilder.build()
.toByteArray())));
// serverNetwork.sendMessageToClient(
// packetFromServer.ioSession,
// PacketFromClient.packMessage(ProtoHead.ENetworkMessage.REGISTER_RSP.getNumber(),
// packetFromServer.getMessageID(),
// responseBuilder.build().toByteArray()));
}
/**
* 处理Client的“登陆请求”
*
* @param packetFromServer
* @author Feng
* @throws NoIpException
*/
public void login(NetworkPacket networkPacket) throws NoIpException {
boolean success = false;
LoginMsg.LoginReq loginObject = null;
LoginMsg.LoginRsp.Builder loginBuilder = LoginMsg.LoginRsp.newBuilder();
loginBuilder.setResultCode(LoginRsp.ResultCode.FAIL);
ClientUser clientUser = serverModel.getClientUserFromTable(networkPacket.ioSession);
try {
// Debug.log(new String[] { "Server_User", "login" },
// "Deal with user's" +
// ServerModel.getIoSessionKey(networkPacket.ioSession) +
// " 'Login' event");
logger.info("Server_User : login : Deal with user's" + ServerModel.getIoSessionKey(networkPacket.ioSession)
+ " 'Login' event");
loginObject = LoginMsg.LoginReq.parseFrom(networkPacket.getMessageObjectBytes());
// 查找是否存在同名用户
ResultCode code = ResultCode.NULL;
List<User> list = HibernateDataOperation.query("userId", loginObject.getUserId(), User.class, code);
if (!code.getCode().equals(ResultCode.SUCCESS)) {
logger.error("Server_User.login:query from database fail");
loginBuilder.setResultCode(LoginMsg.LoginRsp.ResultCode.FAIL);
} else if (list.size() > 0) { // 已存在
// 用户存在,开始校验
User user = (User) list.get(0);
if (user.getUserPassword().equals(loginObject.getUserPassword())) { // 密码正确
// Debug.log(new String[] { "Server_User", "login" },
// "User " +
// ServerModel.getIoSessionKey(networkPacket.ioSession) +
// " Login successful!");
logger.debug("Server_User : login : User " + ServerModel.getIoSessionKey(networkPacket.ioSession)
+ " Login successful!");
// 检查是否有重复登陆
checkAnotherOnline(networkPacket, loginObject.getUserId());
// 记录到表中
if (clientUser != null)
serverModel.clientUserLogin(clientUser, loginObject.getUserId());
// 记录回复位
loginBuilder.setResultCode(LoginMsg.LoginRsp.ResultCode.SUCCESS);
success = true;
} else { // 密码错误
// Debug.log(new String[] { "Server_User", "login" },
// "User " +
// ServerModel.getIoSessionKey(networkPacket.ioSession) +
// " Login password Error!");
logger.debug("Server_User : login : User " + ServerModel.getIoSessionKey(networkPacket.ioSession)
+ " Login password Error!");
loginBuilder.setResultCode(LoginMsg.LoginRsp.ResultCode.FAIL);
}
} else { // 用户不存在
// Debug.log(new String[] { "Server_User", "login" },
// "User" + ServerModel.getIoSessionKey(networkPacket.ioSession)
// +
// " UserId not exist!");
logger.debug("Server_User : login : User" + ServerModel.getIoSessionKey(networkPacket.ioSession)
+ " UserId not exist!!");
loginBuilder.setResultCode(LoginMsg.LoginRsp.ResultCode.FAIL);
}
} catch (InvalidProtocolBufferException e) {
// System.err.println("Server_User : 'LoginEvent':Error was found when using Protobuf to deserialization "
// + ServerModel.getIoSessionKey(networkPacket.ioSession) + " !");
logger.error("Server_User : 'LoginEvent':Error was found when using Protobuf to deserialization "
+ ServerModel.getIoSessionKey(networkPacket.ioSession) + " !");
loginBuilder.setResultCode(LoginMsg.LoginRsp.ResultCode.FAIL);
e.printStackTrace();
} catch (IOException e) {
// System.err.println("Server_User : 'LoginEvent': Error was found when response to client"
// + ServerModel.getIoSessionKey(networkPacket.ioSession) + " !");
logger.error("Server_User : 'LoginEvent': Error was found when response to client"
+ ServerModel.getIoSessionKey(networkPacket.ioSession) + " !");
loginBuilder.setResultCode(LoginMsg.LoginRsp.ResultCode.FAIL);
e.printStackTrace();
} catch (NoIpException e) {
e.printStackTrace();
loginBuilder.setResultCode(LoginMsg.LoginRsp.ResultCode.FAIL);
}
// 回复给客户端
// Debug.log(new String[] { "Server_User", "login" },
// "Response User " +
// ServerModel.getIoSessionKey(networkPacket.ioSession) + " !");
logger.debug("Server_User : login : Response User " + ServerModel.getIoSessionKey(networkPacket.ioSession) + " !");
serverNetwork.sendToClient(new WaitClientResponse(networkPacket.ioSession, new PacketFromServer(networkPacket
.getMessageID(), ProtoHead.ENetworkMessage.LOGIN_RSP_VALUE, loginBuilder.build().toByteArray()), null));
// serverNetwork.sendMessageToClient(networkPacket.ioSession,
// networkPacket.packMessage(
// ProtoHead.ENetworkMessage.LOGIN_RSP.getNumber(),
// networkPacket.getMessageID(), loginBuilder.build()
// .toByteArray()));
// 广播“由用户登陆消息"
if (success) {
// Debug.log(new String[] { "Server_User", "login" },
// "Broadcast user" +
// ServerModel.getIoSessionKey(networkPacket.ioSession) +
// " Login successful event!");
logger.debug("Server_User : login : Broadcast user" + ServerModel.getIoSessionKey(networkPacket.ioSession)
+ " Login successful event!");
serverModel.setChange();
serverModel.notifyObservers(new ObserverMessage_Login(networkPacket.ioSession, loginObject.getUserId()));
}
}
/**
* 检查是否有另一个同账号的用户登陆,有的话踢下去
*
* @param packetFromServer
* @return
* @throws IOException
* @throws NoIpException
*/
private boolean checkAnotherOnline(NetworkPacket networkPacket, String userId) {
ClientUser user = serverModel.getClientUserByUserId(userId);
if (user == null)
return false;
try {
if (!ServerModel.getIoSessionKey(networkPacket.ioSession).equals(ServerModel.getIoSessionKey(user.ioSession))) {
// 发送有他人登陆消息
OffLineMsg.OffLineSync.Builder offLineMessage = OffLineMsg.OffLineSync.newBuilder();
offLineMessage.setCauseCode(OffLineMsg.OffLineSync.CauseCode.ANOTHER_LOGIN);
// byte[] objectBytes = offLineMessage.build().toByteArray();
try {
logger.info("Server_User : checkAnotherOnline : User " + user.userId + " has been login at other device,"
+ ServerModel.getIoSessionKey(user.ioSession) + "will be logout forced!");
} catch (NoIpException e) {
logger.error("Server_User : checkAnotherOnline : The user has been found which was offline,ignore event!");
return false;
}
// 向客户端发送消息
serverNetwork.sendToClient(new WaitClientResponse(user.ioSession, new PacketFromServer(
ProtoHead.ENetworkMessage.OFFLINE_SYNC_VALUE, offLineMessage.build().toByteArray()), null));
// 删除在线记录
serverModel.clientUserLogout(user);
user.onLine = false;
user.userId = null;
return true;
}
} catch (Exception e) {
logger.info("can't find user!");
}
return false;
}
/**
*
* 另一个人登陆,本用户被踢下的通知的回复
*
* @param packetFromServer
* @author Feng
* @throws NoIpException
*/
// public void clientOfflineResponse(networkPacket packetFromServer)
// throws
// NoIpException {
// ClientUser user =
// serverModel.getClientUserFromTable(packetFromServer.ioSession);
// Debug.log(new String[] { "Srever_User", "clientOfflineResponse" },
// "Client " + ServerModel.getIoSessionKey(packetFromServer.ioSession)
// + " get the 'logoutForcedEvent',now delete at Server!");
// // 删掉连接中用户信息表的登陆数据
// user.userId = null;
// }
/**
* 处理个人设置请求
*
* @param packetFromServer
* @author wangfei
* @throws NoIpException
* @throws
* @time 2015-03-21
*/
public void personalSettings(NetworkPacket networkPacket) throws NoIpException {
logger.info("Server_User.personalSettings deal with user:" + ServerModel.getIoSessionKey(networkPacket.ioSession));
PersonalSettingsMsg.PersonalSettingsRsp.Builder personalSettingsBuilder = PersonalSettingsMsg.PersonalSettingsRsp
.newBuilder();
personalSettingsBuilder.setResultCode(PersonalSettingsRsp.ResultCode.FAIL);
try {
PersonalSettingsMsg.PersonalSettingsReq personalSettingsObject = PersonalSettingsMsg.PersonalSettingsReq
.parseFrom(networkPacket.getMessageObjectBytes());
ClientUser clientUser = serverModel.getClientUserFromTable(networkPacket.ioSession);
ResultCode code = ResultCode.NULL;
// System.out.println("-----------------------------" + clientUser.userId);
List list = HibernateDataOperation.query("userId", clientUser.userId, User.class, code);
if (code.getCode().equals(ResultCode.SUCCESS) && list.size() > 0) {
User user = (User) list.get(0);
// 修改昵称
if (personalSettingsObject.getUserName() != null && personalSettingsObject.getUserName() != "") {
changeUserName(personalSettingsBuilder, networkPacket, user, personalSettingsObject.getUserName());
}
// 修改密码
if (personalSettingsObject.getUserPassword() != null && personalSettingsObject.getUserPassword() != "") {
changeUserPassword(personalSettingsBuilder, networkPacket, clientUser, user,
personalSettingsObject.getUserPassword());
}
// 修改头像
if (personalSettingsObject.getHeadIndex() >= 1 && personalSettingsObject.getHeadIndex() <= 6) {
changeHeadIndex(personalSettingsBuilder, networkPacket, clientUser, user,
personalSettingsObject.getHeadIndex());
}
} else if (code.getCode().equals(ResultCode.FAIL)) {
// Hibernate数据库处理出错
logger.error("Server_User.personalSettings: Hibernate error");
personalSettingsBuilder.setResultCode(PersonalSettingsMsg.PersonalSettingsRsp.ResultCode.FAIL);
} else if (list.size() < 1) {
// 用户不存在
logger.info("Server_User.personalSettings:User:" + ServerModel.getIoSessionKey(networkPacket.ioSession)
+ " not exist!");
personalSettingsBuilder.setResultCode(PersonalSettingsMsg.PersonalSettingsRsp.ResultCode.FAIL);
}
} catch (InvalidProtocolBufferException e) {
logger.error("Server_User.personalSettings:Error was found when using Protobuf to deserialization "
+ ServerModel.getIoSessionKey(networkPacket.ioSession) + " packet!");
logger.error(e.getStackTrace());
logger.error(e.getMessage());
personalSettingsBuilder.setResultCode(PersonalSettingsMsg.PersonalSettingsRsp.ResultCode.FAIL);
}
// 回复客户端
serverNetwork.sendToClient(new WaitClientResponse(networkPacket.ioSession, new PacketFromServer(networkPacket
.getMessageID(), ProtoHead.ENetworkMessage.PERSONALSETTINGS_RSP_VALUE, personalSettingsBuilder.build()
.toByteArray())));
// try {
// // 回复客户端
// serverNetwork.sendMessageToClient(
// networkPacket.ioSession,
// networkPacket.packMessage(ProtoHead.ENetworkMessage.PERSONALSETTINGS_RSP.getNumber(),
// networkPacket.getMessageID(),
// personalSettingsBuilder.build().toByteArray()));
// } catch (IOException e) {
// // 回复客户端出错
// logger.error("Server_User.personalSettings deal with user:" +
// ServerModel.getIoSessionKey(networkPacket.ioSession)
// + " Send result Fail!");
// logger.error(e.getStackTrace());
// }
}
/**
* 修改用户昵称
*
* @param builder
* @param packetFromServer
* @param u
* @param userName
* @author wangfei
*/
private void changeUserName(PersonalSettingsMsg.PersonalSettingsRsp.Builder builder, NetworkPacket packetFromServer, User u,
String userName) {
logger.info("Server_User.changeUserName:begin to change User:" + u.getUserId() + " userName to " + userName);
ResultCode code = ResultCode.NULL;
u.setUserName(userName);
// Hibernate更新数据库
HibernateDataOperation.update(u, code);
if (code.getCode().equals(ResultCode.SUCCESS))
builder.setResultCode(PersonalSettingsMsg.PersonalSettingsRsp.ResultCode.SUCCESS);
else if (code.getCode().equals(ResultCode.FAIL))
builder.setResultCode(PersonalSettingsMsg.PersonalSettingsRsp.ResultCode.FAIL);
}
/**
* 修改用户密码
*
* @param builder
* @param packetFromServer
* @param clientUser
* @param u
* @param userPassword
* @author WangFei
* @throws NoIpException
*/
private void changeUserPassword(PersonalSettingsMsg.PersonalSettingsRsp.Builder builder, NetworkPacket networkPacket,
ClientUser clientUser, User u, String userPassword) throws NoIpException {
logger.info("Server_User.changeUserPassword:begin to change User:" + u.getUserId() + " userPassword to " + userPassword);
ResultCode code = ResultCode.NULL;
u.setUserPassword(userPassword);
HibernateDataOperation.update(u, code);
if (code.getCode().equals(ResultCode.SUCCESS)) {
builder.setResultCode(PersonalSettingsMsg.PersonalSettingsRsp.ResultCode.SUCCESS);
// 向客户端发送消息 更改密码后客户端需要下线重新登录
OffLineMsg.OffLineSync.Builder offLineMessage = OffLineMsg.OffLineSync.newBuilder();
offLineMessage.setCauseCode(OffLineMsg.OffLineSync.CauseCode.CHANGE_PASSWORD);
byte[] objectBytes = offLineMessage.build().toByteArray();
byte[] messageBytes = null;
try {
messageBytes = NetworkPacket.packMessage(ProtoHead.ENetworkMessage.OFFLINE_SYNC.getNumber(), objectBytes);
} catch (IOException e) {
logger.error("Server_User.personalSettings deal with user:"
+ ServerModel.getIoSessionKey(networkPacket.ioSession) + " Send sync Fail!");
logger.error(e.getStackTrace());
}
clientUser.userId = null;
// 回复客户端
serverNetwork.sendToClient(new WaitClientResponse(networkPacket.ioSession, new PacketFromServer(networkPacket
.getMessageID(), ProtoHead.ENetworkMessage.OFFLINE_SYNC_VALUE, objectBytes)));
// serverNetwork.sendMessageToClient(clientUser.ioSession,
// messageBytes);
// 添加等待回复
// serverModel.addClientResponseListener(packetFromServer.ioSession,
// networkPacket.getMessageID(messageBytes),
// messageBytes, null);
} else if (code.getCode().equals(ResultCode.FAIL)) {
builder.setResultCode(PersonalSettingsMsg.PersonalSettingsRsp.ResultCode.FAIL);
}
}
/**
* 修改用户头像
*
* @param builder
* @param packetFromServer
* @param clientUser
* @param u
* @param headInx
* @author WangFei
*/
private void changeHeadIndex(PersonalSettingsMsg.PersonalSettingsRsp.Builder builder, NetworkPacket networkPacket,
ClientUser clientUser, User u, int headIndex) {
logger.info("Server_User.changeUserHeadIndex:begin to change User:" + u.getUserId() + " userHeadIndex to " + headIndex);
BufferedImage image = null;
ResultCode code = ResultCode.NULL;
u.setHeadIndex(headIndex);
HibernateDataOperation.update(u, code);
if (code.getCode().equals(ResultCode.SUCCESS)) {
// 从默认头像文件夹获取图片
image = GetImage.getImage(headIndex + ".png");
File file = new File(ResourcePath.getHeadPath());
// 检查保存头像的文件夹是否存在
if (!file.exists() && !file.isDirectory()) {
// 如果不存在 则创建文件夹
file.mkdir();
}
// 保存获取的默认头像到头像文件夹
File saveFile = new File(ResourcePath.getHeadPath() + clientUser.userId + ".png");
try {
ImageIO.write(image, "png", saveFile);
builder.setResultCode(PersonalSettingsMsg.PersonalSettingsRsp.ResultCode.SUCCESS);
} catch (IOException e) {
logger.error("Server_User.changeHeadIndex:save head image to " + saveFile.getAbsolutePath() + " fail");
logger.error(e.getStackTrace());
builder.setResultCode(PersonalSettingsMsg.PersonalSettingsRsp.ResultCode.FAIL);
}
} else if (code.getCode().equals(ResultCode.FAIL)) {
builder.setResultCode(PersonalSettingsMsg.PersonalSettingsRsp.ResultCode.FAIL);
}
}
/**
* 用户退出登录
*
* @param packetFromServer
* @author wangfei
* @time 2015-03-25
* @author WangFei
*/
public void logout(NetworkPacket networkPacket) {
// try {
ClientUser user = null;
LogoutMsg.LogoutRsp.Builder logoutBuilder = LogoutMsg.LogoutRsp.newBuilder();
logoutBuilder.setResultCode(LogoutMsg.LogoutRsp.ResultCode.FAIL);
try {
user = serverModel.getClientUserFromTable(networkPacket.ioSession);
logger.info("Srever_User.logout:" + ServerModel.getIoSessionKey(networkPacket.ioSession) + " logout!");
// 将登录的用户注销掉
serverModel.clientUserLogout(user);
logoutBuilder.setResultCode(LogoutMsg.LogoutRsp.ResultCode.SUCCESS);
} catch (NoIpException e) {
logoutBuilder.setResultCode(LogoutMsg.LogoutRsp.ResultCode.FAIL);
logger.info("Srever_User.logout:fail to logout");
logger.info(e.getStackTrace());
}
// 回复客户端
serverNetwork.sendToClient(new WaitClientResponse(networkPacket.ioSession, new PacketFromServer(networkPacket
.getMessageID(), ProtoHead.ENetworkMessage.LOGOUT_RSP_VALUE, logoutBuilder.build().toByteArray())));
// serverNetwork.sendMessageToClient(
// packetFromServer.ioSession,
// networkPacket.packMessage(ProtoHead.ENetworkMessage.LOGOUT_RSP.getNumber(),
// packetFromServer.getMessageID(),
// logoutBuilder.build().toByteArray()));
// } catch (IOException e) {
// logger.error("Server_User.logout:Send result Fail!");
// logger.error(e.getStackTrace());
// }
}
/**
* 获取个人信息 包括基本信息和好友列表
*
* @param packetFromServer
* @author WangFei
* @throws NoIpException
*/
public void getPersonalInfo(NetworkPacket packetFromServer) throws NoIpException {
logger.info("Server_User.getPersonalInfo:");
GetPersonalInfoMsg.GetPersonalInfoRsp.Builder getPersonalInfoBuilder = GetPersonalInfoMsg.GetPersonalInfoRsp.newBuilder();
getPersonalInfoBuilder.setResultCode(GetPersonalInfoRsp.ResultCode.FAIL);
//因为多次用到懒加载 所以通过openSession获取session并主动关闭
Session session = HibernateSessionFactory.sessionFactory.openSession();
try {
//
GetPersonalInfoMsg.GetPersonalInfoReq getPersonalInfoObject = GetPersonalInfoMsg.GetPersonalInfoReq
.parseFrom(packetFromServer.getMessageObjectBytes());
ClientUser user = serverModel.getClientUserFromTable(packetFromServer.ioSession);
ResultCode code = ResultCode.NULL;
List list = HibernateDataOperation.query("userId", user.userId, User.class, code, session);
if (code.getCode().equals(ResultCode.SUCCESS) && list.size() > 0) {
// 不支持模糊搜索 所以如果有搜索结果 只可能有一个结果
User u = (User) list.get(0);
getPersonalInfoBuilder.setResultCode(GetPersonalInfoMsg.GetPersonalInfoRsp.ResultCode.SUCCESS);
// 获取用户的基本信息
if (getPersonalInfoObject.getUserInfo() == true) {
UserItem.Builder userItemBuilder = UserItem.newBuilder();
userItemBuilder.setUserId(u.getUserId());
userItemBuilder.setUserName(u.getUserName());
userItemBuilder.setHeadIndex(u.getHeadIndex());
getPersonalInfoBuilder.setUserInfo(userItemBuilder);
}
// 获取用户的好友信息
if (getPersonalInfoObject.getFriendInfo() == true) {
for (User ui : u.getFriends()) {
UserItem.Builder userItemBuilder2 = UserItem.newBuilder();
userItemBuilder2.setUserId(ui.getUserId());
userItemBuilder2.setUserName(ui.getUserName());
userItemBuilder2.setHeadIndex(ui.getHeadIndex());
getPersonalInfoBuilder.addFriends(userItemBuilder2);
}
}
//获取用户加入的聊天群信息
if(getPersonalInfoObject.getGroupInfo() == true){
List groupList = u.getGroups();
for(int i=0;i<groupList.size();i++){
Group group =(Group) groupList.get(i);
GroupItem.Builder groupItemBuilder = GroupItem.newBuilder();
groupItemBuilder.setGroupId(Integer.toString(group.getGroupId()));
groupItemBuilder.setGroupName(group.getGroupName());
groupItemBuilder.setCreaterUserId(group.getCreaterId());
for(User us:group.getMemberList()){
groupItemBuilder.addMemberUserId(us.getUserId());
}
getPersonalInfoBuilder.addGroups(groupItemBuilder);
}
}
getPersonalInfoBuilder.setResultCode(GetPersonalInfoMsg.GetPersonalInfoRsp.ResultCode.SUCCESS);
} else if (code.getCode().equals(ResultCode.FAIL)) {
logger.error("Server_User.getPersonalInfo: Hibernate error");
getPersonalInfoBuilder.setResultCode(GetPersonalInfoMsg.GetPersonalInfoRsp.ResultCode.FAIL);
} else if (list.size() < 1) {
logger.info("Server_User.getPersonalInfo:User:" + ServerModel.getIoSessionKey(packetFromServer.ioSession)
+ " not exist!");
getPersonalInfoBuilder.setResultCode(GetPersonalInfoMsg.GetPersonalInfoRsp.ResultCode.FAIL);
}
session.close();
} catch (InvalidProtocolBufferException e) {
logger.error("Server_User.getPersonalInfo:Error was found when using Protobuf to deserialization "
+ ServerModel.getIoSessionKey(packetFromServer.ioSession) + " packet!");
logger.error(e.getStackTrace());
logger.error(e.getMessage());
getPersonalInfoBuilder.setResultCode(GetPersonalInfoMsg.GetPersonalInfoRsp.ResultCode.FAIL);
}
// 回复客户端
serverNetwork.sendToClient(new WaitClientResponse(packetFromServer.ioSession, new PacketFromServer(packetFromServer
.getMessageID(), ProtoHead.ENetworkMessage.GET_PERSONALINFO_RSP_VALUE, getPersonalInfoBuilder.build()
.toByteArray())));
}
/**
* 获取User对象
*
* @author Feng
*/
public User getUser(String userId, Session session) {
ResultCode resultCode = ResultCode.NULL;
List<User> userList = HibernateDataOperation.query(User.HQL_USER_ID, userId, User.class, resultCode, session);
if (resultCode.getCode() == resultCode.SUCCESS && userList.size() > 0)
return userList.get(0);
return null;
}
/**
* 获取User对象列表
*
* @author Feng
*/
public List<User> getUsers(List<String> userIds, Session session) {
String[] userList = new String[userIds.size()];
return getUsers(userIds.toArray(userList), session);
}
public List<User> getUsers(String[] userIds, Session session) {
StringBuffer hqlSB = new StringBuffer("from " + User.class.getSimpleName() + " where " + User.HQL_USER_ID + " in(");
for (String userId : userIds)
hqlSB.append("'" + userId + "',");
// String hql = hqlSB.substring(0, hqlSB.length()-1) + ")";
return session.createQuery(hqlSB.substring(0, hqlSB.length() - 1) + ")").list();
}
private User getUser(String userId){
ResultCode code = ResultCode.NULL;
List list = HibernateDataOperation.query("userId", userId, User.class,code);
if(code.getCode().equals(ResultCode.SUCCESS) && list.size()>0)
return (User)list.get(0);
return null;
}
private UserItem.Builder userToUserItem(User user){
UserItem.Builder userItem = UserItem.newBuilder();
userItem.setUserId(user.getUserId());
userItem.setUserName(user.getUserName());
userItem.setHeadIndex(user.getHeadIndex());
return userItem;
}
}