// Path: GameServer/src/main/java/com/zhaoxiaodan/mirserver/gameserver/entities/User.java
// @Entity
// public class User {
// 
//     @Id
//     @GeneratedValue
//     public int id;
// 
//     @Column(unique = true)
//     public String loginId;
//     public String password;
//     public String username;
//     public Date lastLoginTime;
//     @OneToOne(fetch = FetchType.EAGER)
//     @JoinColumn(name = "selectServerId")
//     public ServerInfo selectServer;
//     public byte certification;
// 
//     @OneToMany(mappedBy = "user", cascade = CascadeType.REMOVE)
//     public List<Player> players;
// }
// 
// Path: Core/src/main/java/com/zhaoxiaodan/mirserver/network/Handler.java
// public abstract class Handler {
// 	protected Logger logger = LogManager.getLogger(this.getClass().getName());
// 	protected Session session;
// 
// 	protected void exce(ChannelHandlerContext ctx, ClientPacket packet) throws Exception {
// 		session = Session.getSession(ctx);
// 		if(null == session){
// 			logger.debug("new session for {}",ctx);
// 			session = Session.create(ctx);
// 		}
// 		DB.getSession().getTransaction().begin();
// 		try{
// 			onPacket(packet);
// 			if(DB.getSession().getTransaction().getStatus().isOneOf(TransactionStatus.ACTIVE))
// 				DB.getSession().getTransaction().commit();
// 		}catch(Exception e){
// 			logger.error("onPacket error, {}", packet.protocol , e);
// 			if(DB.getSession().isOpen())
// 				DB.getSession().getTransaction().rollback();
// 		}
// 
// 	}
// 
// 	protected void onDisconnect(ChannelHandlerContext ctx) throws Exception{
// 		session = Session.getSession(ctx);
// 		if(null == session){
// 			logger.error("session already remove for {}",ctx);
// 			return;
// 		}
// 
// 		session.remove();
// 		DB.getSession().getTransaction().begin();
// 		try{
// 			onDisconnect();
// 			DB.getSession().getTransaction().commit();
// 		}catch(Exception e){
// 			if(DB.getSession().isOpen())
// 				DB.getSession().getTransaction().rollback();
// 		}
// 	}
// 
// 	public abstract void onPacket(ClientPacket packet) throws Exception;
// 	public void onDisconnect() throws Exception{
// 		logger.error("overwrite it !!");
// 	}
// }
// 
// Path: Core/src/main/java/com/zhaoxiaodan/mirserver/network/Session.java
// public class Session {
// 
// 	private static Logger logger = LogManager.getLogger(Session.class);
// 	private static final Map<String, Session> sessions = new ConcurrentHashMap<String, Session>();
// 
// 	private final Map<String, Object> values = new ConcurrentHashMap<String, Object>();
// 	private final ChannelHandlerContext socket;
// 
// 	private Session(ChannelHandlerContext ctx){
// 		this.socket = ctx;
// 	}
// 
// 	public void remove() {
// 		logger.debug("remove session for {}", socket.toString());
// 		sessions.remove(socket.channel().remoteAddress().toString());
// 	}
// 
// 	public void sendPacket(ServerPacket msg){
// 		socket.writeAndFlush(msg);
// 	}
// 
// 	public void put(String key, Object value) {
// 		values.put(key, value);
// 	}
// 
// 	public Object get(String key) {
// 		return values.get(key);
// 	}
// 
// 	public static Session getSession(ChannelHandlerContext ctx) {
// 		return sessions.get(ctx.channel().remoteAddress().toString());
// 	}
// 
// 	public static Session create(ChannelHandlerContext ctx) {
// 		logger.debug("create session for {}", ctx.toString());
// 		Session session = new Session(ctx);
// 		sessions.put(ctx.channel().remoteAddress().toString(), session);
// 		return session;
// 	}
// 
// 	public static int size() {
// 		return sessions.size();
// 	}
// 
// 	public String toString(){
// 		return socket.toString();
// 	}
// }
// 
// Path: Core/src/main/java/com/zhaoxiaodan/mirserver/network/packets/ClientPacket.java
// public class ClientPacket extends Packet {
// 
// 	public byte cmdIndex;  // #号后面紧跟的序号, 响应包的序号要跟请求一直
// 
// 	public ClientPacket() {}
// 
// 	public ClientPacket(Protocol pid, byte cmdIndex) {
// 		super(0, pid, (short) 0, (short) 0, (short) 0);
// 		this.cmdIndex = cmdIndex;
// 	}
// 
// 	@Override
// 	public void readPacket(ByteBuf in) throws Parcelable.WrongFormatException {
// 		cmdIndex = in.readByte();
// 		cmdIndex = (byte) (cmdIndex - '0');
// 		super.readPacket(in);
// 	}
// 
// 	@Override
// 	public void writePacket(ByteBuf out) {
// 		out.writeByte(cmdIndex + '0');
// 		super.writePacket(out);
// 	}
// }


import com.zhaoxiaodan.mirserver.gameserver.entities.User;
import com.zhaoxiaodan.mirserver.network.Handler;
import com.zhaoxiaodan.mirserver.network.Session;
import com.zhaoxiaodan.mirserver.network.packets.ClientPacket;
package com.zhaoxiaodan.mirserver.loginserver.handlers;


public class DisconnectHandler extends Handler {

	@Override
	public void onPacket(ClientPacket packet) throws Exception {

	}

	@Override
	public void onDisconnect() throws Exception {
		User user = (User) session.get("user");
		if(null != user){
// Path: GameServer/src/main/java/com/zhaoxiaodan/mirserver/gameserver/entities/User.java
// @Entity
// public class User {
// 
//     @Id
//     @GeneratedValue
//     public int id;
// 
//     @Column(unique = true)
//     public String loginId;
//     public String password;
//     public String username;
//     public Date lastLoginTime;
//     @OneToOne(fetch = FetchType.EAGER)
//     @JoinColumn(name = "selectServerId")
//     public ServerInfo selectServer;
//     public byte certification;
// 
//     @OneToMany(mappedBy = "user", cascade = CascadeType.REMOVE)
//     public List<Player> players;
// }
// 
// Path: Core/src/main/java/com/zhaoxiaodan/mirserver/network/Handler.java
// public abstract class Handler {
// 	protected Logger logger = LogManager.getLogger(this.getClass().getName());
// 	protected Session session;
// 
// 	protected void exce(ChannelHandlerContext ctx, ClientPacket packet) throws Exception {
// 		session = Session.getSession(ctx);
// 		if(null == session){
// 			logger.debug("new session for {}",ctx);
// 			session = Session.create(ctx);
// 		}
// 		DB.getSession().getTransaction().begin();
// 		try{
// 			onPacket(packet);
// 			if(DB.getSession().getTransaction().getStatus().isOneOf(TransactionStatus.ACTIVE))
// 				DB.getSession().getTransaction().commit();
// 		}catch(Exception e){
// 			logger.error("onPacket error, {}", packet.protocol , e);
// 			if(DB.getSession().isOpen())
// 				DB.getSession().getTransaction().rollback();
// 		}
// 
// 	}
// 
// 	protected void onDisconnect(ChannelHandlerContext ctx) throws Exception{
// 		session = Session.getSession(ctx);
// 		if(null == session){
// 			logger.error("session already remove for {}",ctx);
// 			return;
// 		}
// 
// 		session.remove();
// 		DB.getSession().getTransaction().begin();
// 		try{
// 			onDisconnect();
// 			DB.getSession().getTransaction().commit();
// 		}catch(Exception e){
// 			if(DB.getSession().isOpen())
// 				DB.getSession().getTransaction().rollback();
// 		}
// 	}
// 
// 	public abstract void onPacket(ClientPacket packet) throws Exception;
// 	public void onDisconnect() throws Exception{
// 		logger.error("overwrite it !!");
// 	}
// }
// 
// Path: Core/src/main/java/com/zhaoxiaodan/mirserver/network/Session.java
// public class Session {
// 
// 	private static Logger logger = LogManager.getLogger(Session.class);
// 	private static final Map<String, Session> sessions = new ConcurrentHashMap<String, Session>();
// 
// 	private final Map<String, Object> values = new ConcurrentHashMap<String, Object>();
// 	private final ChannelHandlerContext socket;
// 
// 	private Session(ChannelHandlerContext ctx){
// 		this.socket = ctx;
// 	}
// 
// 	public void remove() {
// 		logger.debug("remove session for {}", socket.toString());
// 		sessions.remove(socket.channel().remoteAddress().toString());
// 	}
// 
// 	public void sendPacket(ServerPacket msg){
// 		socket.writeAndFlush(msg);
// 	}
// 
// 	public void put(String key, Object value) {
// 		values.put(key, value);
// 	}
// 
// 	public Object get(String key) {
// 		return values.get(key);
// 	}
// 
// 	public static Session getSession(ChannelHandlerContext ctx) {
// 		return sessions.get(ctx.channel().remoteAddress().toString());
// 	}
// 
// 	public static Session create(ChannelHandlerContext ctx) {
// 		logger.debug("create session for {}", ctx.toString());
// 		Session session = new Session(ctx);
// 		sessions.put(ctx.channel().remoteAddress().toString(), session);
// 		return session;
// 	}
// 
// 	public static int size() {
// 		return sessions.size();
// 	}
// 
// 	public String toString(){
// 		return socket.toString();
// 	}
// }
// 
// Path: Core/src/main/java/com/zhaoxiaodan/mirserver/network/packets/ClientPacket.java
// public class ClientPacket extends Packet {
// 
// 	public byte cmdIndex;  // #号后面紧跟的序号, 响应包的序号要跟请求一直
// 
// 	public ClientPacket() {}
// 
// 	public ClientPacket(Protocol pid, byte cmdIndex) {
// 		super(0, pid, (short) 0, (short) 0, (short) 0);
// 		this.cmdIndex = cmdIndex;
// 	}
// 
// 	@Override
// 	public void readPacket(ByteBuf in) throws Parcelable.WrongFormatException {
// 		cmdIndex = in.readByte();
// 		cmdIndex = (byte) (cmdIndex - '0');
// 		super.readPacket(in);
// 	}
// 
// 	@Override
// 	public void writePacket(ByteBuf out) {
// 		out.writeByte(cmdIndex + '0');
// 		super.writePacket(out);
// 	}
// }


// Path: LoginServer/src/main/java/com/zhaoxiaodan/mirserver/loginserver/handlers/DisconnectHandler.java
import com.zhaoxiaodan.mirserver.gameserver.entities.User;
import com.zhaoxiaodan.mirserver.network.Handler;
import com.zhaoxiaodan.mirserver.network.Session;
import com.zhaoxiaodan.mirserver.network.packets.ClientPacket;

package com.zhaoxiaodan.mirserver.loginserver.handlers;


public class DisconnectHandler extends Handler {

	@Override
	public void onPacket(ClientPacket packet) throws Exception {

	}

	@Override
	public void onDisconnect() throws Exception {
		User user = (User) session.get("user");
		if(null != user){
			logger.info("user {} disconnect, online count : {}" ,user.loginId, Session.size());