package com.metazion.jgd.task;
import java.util.HashMap;
import com.metazion.jgd.AppLogin;
import com.metazion.jgd.dao.DaoService;
import com.metazion.jgd.dao.DbUser;
import com.metazion.jgd.info.ServerInfo;
import com.metazion.jgd.info.ServerInfoManager;
import com.metazion.jgd.model.UserData;
import com.metazion.jgd.protocal.cl.UserLoginCL;
import com.metazion.jgd.protocal.cl.UserLoginLC;
import com.metazion.jgd.util.JgdLogger;
import com.metazion.jm.net.TransmitSession;
import com.metazion.jm.task.Task;
import com.metazion.object.User;
public class TaskLoadUser extends Task {
private TransmitSession sessionIn = null;
private UserLoginCL reqIn = null;
private UserLoginLC rspOut = new UserLoginLC();
private volatile UserData userDataOut = null;
public TaskLoadUser(TransmitSession sessionIn, UserLoginCL req) {
this.sessionIn = sessionIn;
this.reqIn = req;
}
@Override
public void execute() {
setResult(UserLoginLC.SUCCESS);
incDesire();
if (userDataOut != null) {
decDesire();
return;
}
DaoService.execute(() -> {
do {
final String username = reqIn.username;
UserData userData = DbUser.getUserDataByName(username);
// 用户不存在
if (userData == null) {
setResult(UserLoginLC.ERROR_NOUSER);
JgdLogger.getLogger().error("Task load user execute: no data in db");
break;
}
userDataOut = userData;
} while (false);
decDesire();
});
}
@Override
public void onFinish() {
if (result != UserLoginLC.SUCCESS) {
rollback();
failResponse();
return;
}
succeedResponse();
}
@Override
public void onTimeout() {
setResult(UserLoginLC.TIMEOUT);
rollback();
failResponse();
}
public void setUserData(UserData userData) {
this.userDataOut = userData;
}
private void rollback() {
// Noting to do
}
private void succeedResponse() {
JgdLogger.getLogger().info("Task load user successful: seq[{}] result[{}] req username[{}] user id[{}]", seq, result, reqIn.username, userDataOut.id);
// 检查密码
if (!reqIn.password.equals(userDataOut.password)) {
JgdLogger.getLogger().error("Task load user post failed: seq[{}] user[{}:{}] password wrong", seq, userDataOut.id, userDataOut.username);
rspOut.result = UserLoginLC.ERROR_WRONGPWD;
sessionIn.send(rspOut);
return;
}
final int userId = userDataOut.id;
// TODO: Generate Token
final String token = "THIS IS TOKEN";
User user = AppLogin.getLogicService().getUserManager().getUser(userId);
if (user == null) {
user = new User();
}
user.setUserData(userDataOut);
user.setToken(token);
AppLogin.getLogicService().getUserManager().putUserMapping(user);
// 记录上线时间
DaoService.execute(() -> {
userDataOut.lastLoginTime = System.currentTimeMillis();
DbUser.updateUserData(userDataOut);
});
JgdLogger.getLogger().info("Task load user post successful: seq[{}] user[{}:{}] token[{}]", seq, userDataOut.id, userDataOut.username, token);
rspOut.result = (byte) result;
rspOut.userId = userId;
rspOut.token = token;
HashMap<Integer, ServerInfo> servers = ServerInfoManager.getInstance().getAllServerInfo();
for (ServerInfo serverInfo : servers.values()) {
rspOut.serverList.add(serverInfo.serverBean);
}
sessionIn.send(rspOut);
}
private void failResponse() {
JgdLogger.getLogger().info("Task load user failed: seq[{}] result[{}] req username[{}]", seq, result, reqIn.username);
rspOut.result = (byte) result;
sessionIn.send(rspOut);
}
}