user.h 2.48 KB
#pragma once

#include <common.h>
#include "event.h"
#include "item.h"
#include "task.h"
#include "sign.h"
#include "achievement.h"
#include "mail.h"
#include "login_reward.h"
#include "pet.h"
#include "btl.h"
#include "lobby.h"

class user_t : public el::lib_timer_base_t
{
public:
	user_t(el::lib_tcp_peer_info_t* peer_fd_info);
	virtual ~user_t();
	el::lib_tcp_peer_info_t* fd_info;
	uint32_t commect_sec;//连接的时间	
	uint32_t platform;
	std::string account;//帐号	
	std::string session;//登录验证时使用的session	
	std::string token;//登录时token
	std::string wx_unionid;//微信用户统一标识	

	share_msg::user_show_t user_show;

	// 上一次领取在线礼包的时间 	
	uint32_t last_get_online_reward_sec;

	E_USER_LOGIN_STATUS login_status;//登录状态		

	event_mgr_t event_mgr;
	item_mgr_t item_mgr;	
	task_mgr_t task_mgr;
	sign_mgr_t sign_mgr;
	achievement_mgr_t achievement_mgr;
	login_reward_mgr_t login_reward_mgr;
	mail_mgr_t mail_mgr;
	furniture_mgr_t furniture_mgr;
	pet_mgr_t pet_mgr;
	btl_mgr_t btl_mgr;
	lobby_mgr_t lobby_mgr;	

	uint32_t agent_level;

	std::vector<PET_ID> pet_truntable_vec;
	uint32_t pet_turntable_key;

	USER_ID uid();
	std::string nick();
	uint32_t head();
	uint32_t charm();

	EVENT_DATA gen_idx();
	bool is_vip_active();

	void send_msg(CMD_ID cmd_id, google::protobuf::Message* msg, 
		uint32_t seq = 0, USER_ID uid = 0);
	//给客户端发送回应包	
	void send_msg_res(google::protobuf::Message* msg);
	int send_err(CMD_ID cmd_id, uint32_t ret);

	el::lib_timer_t::lib_timer_sec_t* time_out_login_handle;
};

struct user_in_room_reconnect_data_t 
{
	GAME_ID game_id;
	uint32_t time_sec;
	user_in_room_reconnect_data_t(){
		this->game_id = 0;
		this->time_sec = el_async::get_now_sec();
	}
};

class user_mgr_t
{
public:
 	std::map<int, user_t*> user_connected_map;//key:fd信息, val:用户指针(创建,销毁用户使用这里的user_t*)	
 	std::map<USER_ID, user_t*> user_login_complete_map;//key:uid, val:用户信息(只包含登陆完成状态)	
	std::map<USER_ID, user_in_room_reconnect_data_t> user_in_room_reconnect_map;//key:uid, val:offline time 记录在玩游戏中断线等待重连的玩家UID	 	
	//创建一个fd信息的用户	
	void add_fd_user(el::lib_tcp_peer_info_t* peer_fd_info);
	void add_uid_user( USER_ID uid, user_t* user );
	user_t* find(USER_ID uid);
	user_t* find(int fd);
	void offline(int fd, bool is_active_close_peer);

private:
	//删除一个fd信息的用户	
	void del_fd_user(int fd);
};

extern user_mgr_t* g_user_mgr;