role.cpp 10.4 KB
#include <lib_err_code.h>
#include "func_rount.h"
#include "role.h"

#include <share_msg.pb.h>

role_t::role_t(el::lib_mysql_if* db) : 
	el::lib_mysql_table_route10x10(db, g_gen_db_name("USER"), "t_role")
{
}

int role_t::create( USER_ID uid, USER_HEAD_ID head, const std::string& nick )
{
	GEN_MYSQL_STRING(nick_mysql_string, nick.c_str(), 
		get_valid_len(nick.c_str(), NICK_LEN));
	uint32_t now_sec = el_async::get_now_sec();

	GEN_SQLSTR(this->sqlstr, "insert into %s (uid, nick, last_logout_time, ct_time, last_login_time, head)"
		" values(%" PRIu64 ", '%s', 0, %u, %u, %u)",
		this->get_table_name(uid),
		uid, nick_mysql_string,
		now_sec, now_sec, head);

	return this->exec_insert_sql(this->sqlstr, el::ERR_DB::KEY_EXIST);
}

int role_t::load( USER_ID uid, std::string& nick, USER_HEAD_ID& head )
{
	GEN_SQLSTR(this->sqlstr, "select nick,head"
		" from %s where uid=%" PRIu64, this->get_table_name(uid), uid);
	STD_QUERY_ONE_BEGIN(this->sqlstr, SUCC);

	static char buf[NICK_LEN];
	::memset(buf, 0, sizeof(buf));
	GET_NEXT_FIELD_BIN(buf, sizeof(buf));
	nick = buf;

	USER_HEAD_ID t_head = 0;
	GET_FIELD_UINT64(t_head);
	head = t_head;

	STD_QUERY_ONE_END_WITHOUT_RETURN();

	return SUCC;
}

int role_t::update_last_logout_time( USER_ID uid, uint32_t last_logout_time )
{
	GEN_SQLSTR(this->sqlstr, "update %s set last_logout_time=%u  where uid=%" PRIu64, 
		this->get_table_name(uid), last_logout_time, uid);

	this->exec_update_sqls(this->sqlstr);
	return SUCC;
}

int role_t::update_last_login_time( USER_ID uid )
{
	uint32_t now_sec = el_async::get_now_sec();
	GEN_SQLSTR(this->sqlstr, "update %s set last_login_time=%u where uid=%" PRIu64, 
		this->get_table_name(uid), now_sec, uid);

	this->exec_update_sqls(this->sqlstr);
	return SUCC;
}

int role_t::change_nick(USER_ID uid, const std::string& nick)
{
	GEN_MYSQL_STRING(str_nick, nick.c_str(), get_valid_len(nick.c_str(), NICK_LEN));

	GEN_SQLSTR(this->sqlstr, "update %s set nick='%s' where uid=%" PRIu64, this->get_table_name(uid), str_nick, uid);
	this->exec_update_sql(this->sqlstr, el::ERR_DB::KEY_INEXIST);

	return SUCC;
}

int role_t::update_head( USER_ID uid, uint32_t head )
{
	GEN_SQLSTR(this->sqlstr, "update %s set head=%u  where uid=%" PRIu64, 
		this->get_table_name(uid), head, uid);

	this->exec_update_sqls(this->sqlstr);
	return SUCC;
}

int Cfunc_route::on_load_user_msg(USER_ID uid, google::protobuf::Message* msg)
{
	this->head.id = uid;
	db_msg::load_user_msg_res out;

	std::string nick;
	USER_HEAD_ID head = 0;
	this->ret = role.load(uid, nick, head);
	if (SUCC != this->ret){
		return this->ret;
	}
	out.set_nick(nick);
	out.set_head(head);

	this->ret = this->user_event.get(uid, &out);
	if (SUCC != this->ret){
		return this->ret;
	}

	this->ret = this->item.get(uid, &out);
	if (SUCC != this->ret){
		return this->ret;
	}

	this->ret = this->furniture.get(uid, &out);
	if (SUCC != this->ret){
		return this->ret;
	}

	this->ret = this->role.update_last_login_time(uid);
	if (SUCC != this->ret){
		return this->ret;
	}

	this->ret = this->pet.get(uid, &out);
	if (SUCC != this->ret){
		return this->ret;
	}

	this->ret = this->mail.get(uid, &out);
	if (this->ret == SUCC){
		this->encode_msg2sendbuf(&out);
	}
	return this->ret;
}

int Cfunc_route::on_logout_user_msg(USER_ID uid, google::protobuf::Message* msg)
{
	auto in = (db_msg::logout_user_msg*)msg;
	this->ret = this->role.update_last_logout_time(uid, in->last_logout_time());
	if (SUCC != this->ret){
		return this->ret;
	}

	return this->ret;
}


int Cfunc_route::on_change_head_msg(USER_ID uid, google::protobuf::Message* msg)
{
	auto in = (db_msg::change_head_msg*)msg;
	this->ret = this->role.update_head(uid, in->head());
	if (SUCC != this->ret){
		return this->ret;
	}

	return this->ret;
}

int Cfunc_route::on_get_user_show_msg(USER_ID uid, google::protobuf::Message* msg)
{
	auto in = (db_msg::get_user_show_msg*)msg;

	USER_ID peer_uid = in->uid();
	db_msg::get_user_show_msg_res out;
	auto user_show = out.mutable_user_show();
	user_show->set_uid(peer_uid);

	this->ret = this->account.check_uid_existed(peer_uid);
	if (SUCC != this->ret){
		return this->ret;
	}

	std::string nick;
	USER_HEAD_ID head = 0;
	this->role.load(peer_uid, nick, head);
	user_show->set_nick(nick);
	user_show->set_head(head);

//	uint32_t sex = 0;
//	this->account.load(peer_uid, nick);

	EVENT_DATA head_frame = 0;
	this->user_event.get_user_data(peer_uid, common_msg::FOREVER_EVENT_HEAD_FRAME, 0, head_frame);
	user_show->set_head_frame(head_frame);

	EVENT_STR_DATA head_url;
	this->user_event.get_user_str_data(peer_uid, common_msg::FOREVER_EVENT_WX_HEAD_URL, 0, head_url);
	user_show->set_head_url(head_url);

	EVENT_BIN_DATA head_data;
	this->user_event.get_user_bin_data(peer_uid, common_msg::FOREVER_EVENT_WX_HEAD_IMG, 0, head_data);
	user_show->set_head_data(head_data);

	this->encode_msg2sendbuf(&out);
	return this->ret;
}


int Cfunc_route::on_get_peer_user_show_msg(USER_ID uid, google::protobuf::Message* msg)
{
	auto in = (db_msg::get_peer_user_show_msg*)msg;

	USER_ID peer_uid = in->uid();
	db_msg::get_peer_user_show_msg_res out;

	auto user_info = out.mutable_peer_user_info();
	auto user_show = user_info->mutable_user_show();

	{
		ITEM_CNT flower_cnt = 0;
		this->item.get_item_cnt(peer_uid, share_msg::E_ITEM_ID_FLOWER, flower_cnt);
		user_show->set_flower(flower_cnt);
	}

	user_show->set_uid(peer_uid);

	this->ret = this->account.check_uid_existed(peer_uid);
	if (SUCC != this->ret){
		return this->ret;
	}

	std::string nick;
	USER_HEAD_ID head = 0;
	this->role.load(peer_uid, nick, head);
	user_show->set_nick(nick);
	user_show->set_head(head);

	EVENT_DATA head_frame = 0;
	this->user_event.get_user_data(peer_uid, common_msg::FOREVER_EVENT_HEAD_FRAME, 0, head_frame);
	user_show->set_head_frame(head_frame);

	EVENT_STR_DATA head_url;
	this->user_event.get_user_str_data(peer_uid, common_msg::FOREVER_EVENT_WX_HEAD_URL, 0, head_url);
	user_show->set_head_url(head_url);

	EVENT_BIN_DATA head_data;
	this->user_event.get_user_bin_data(peer_uid, common_msg::FOREVER_EVENT_WX_HEAD_IMG, 0, head_data);
	user_show->set_head_data(head_data);

	uint32_t vip_exp = 0;
	this->item.get_item_cnt(peer_uid, share_msg::E_ITEM_ID_VIP_EXP, vip_exp);
	user_show->set_vip_exp(vip_exp);

	{
		EVENT_DATA data;
		EVENT_TIME time;

		this->user_event.get_user_data_time(peer_uid, common_msg::FOREVER_EVENT_GAME_PK_CNT, 0, data, time);
		user_show->set_pk_cnt(data);
		user_show->set_pk_win_cnt(time);
	}

	{
		EVENT_DATA face = 0;//脸
		this->user_event.get_user_data(peer_uid, common_msg::FOREVER_EVENT_ROLE_CLOTHES, 1, face);
		user_show->add_body(face);
		EVENT_DATA hair = 0;//发
		this->user_event.get_user_data(peer_uid, common_msg::FOREVER_EVENT_ROLE_CLOTHES, 2, hair);
		user_show->add_body(hair);
		EVENT_DATA jacket = 0;//上衣
		this->user_event.get_user_data(peer_uid, common_msg::FOREVER_EVENT_ROLE_CLOTHES, 3, jacket);
		user_show->add_body(jacket);
		EVENT_DATA trousers = 0;//裤子
		this->user_event.get_user_data(peer_uid, common_msg::FOREVER_EVENT_ROLE_CLOTHES, 4, trousers);
		user_show->add_body(trousers);
		EVENT_DATA shoes = 0;//鞋
		this->user_event.get_user_data(peer_uid, common_msg::FOREVER_EVENT_ROLE_CLOTHES, 5, shoes);
		user_show->add_body(shoes);
		EVENT_DATA bottom = 0;//下部
		this->user_event.get_user_data(peer_uid, common_msg::FOREVER_EVENT_ROLE_CLOTHES, 6, bottom);
		user_show->add_body(bottom);
		EVENT_DATA toys = 0;//玩具
		this->user_event.get_user_data(peer_uid, common_msg::FOREVER_EVENT_ROLE_CLOTHES, 7, toys);
		user_show->add_body(toys);
	}
	{
		uint32_t cnt = 0;
		this->pet.get_type_cnt(peer_uid, cnt);
		user_info->set_pet_cnt(cnt);
	}

	// 成就 [2018/12/28 Administrator]	
	{
		uint32_t cnt = 0;
		std::vector<EVENT_TYPE> et;
		this->user_event.get_type(peer_uid, common_msg::FOREVER_EVENT_ACHIEVEMENT, common_msg::FOREVER_EVENT_ACHIEVEMENT+999, et);
		FOREACH(et, it){
			EVENT_TYPE t = *it;
			std::string str;
			this->user_event.get_user_str_data(peer_uid, t, 0, str);

			std::vector<uint32_t> data_vec;
			el::g_cat_string(data_vec, str);
			cnt += data_vec.size();
		}
		user_info->set_achievement_cnt(cnt);

	}
	{// 服装数量	[800000,900000) [2018/12/28 Administrator]	
		uint32_t cnt = 0;
		this->item.get_type_cnt(peer_uid, 800000, 900000, cnt);
		user_info->set_clothes_cnt(cnt);
	}
	{// 家具数量	 [2018/12/28 Administrator]	
		uint32_t cnt = 0;
		this->furniture.get_type_cnt(peer_uid, cnt);
		user_info->set_furniture_cnt(cnt);
	}
	{// 墙纸数量	[700000,800000) [2018/12/28 Administrator]	
		uint32_t cnt = 0;
		this->item.get_type_cnt(peer_uid, 700000, 800000, cnt);
		user_info->set_wall_cnt(cnt);
	}

	{
		{//宠物满级数量
			EVENT_DATA cnt = 0;
			this->user_event.get_user_data(peer_uid, common_msg::FOREVER_EVENT_PET_LEVEL_MAX_CNT, 0, cnt);
			user_info->set_pet_level_max_cnt(cnt);
		}
		{
			//擅长游戏ID(0:无)
			//弱项游戏ID(0:无)
			EVENT_DATA data = 0;
			EVENT_TIME time = 0;
			this->user_event.get_user_data_time(peer_uid, common_msg::FOREVER_EVENT_GAME_VAL, 0, data, time);
			user_info->set_shanchang_game_id(data);
			user_info->set_ruoxiang_game_id(time);
		}
		{
			EVENT_DATA cnt = 0;
			int r = this->user_event.get_user_data(peer_uid, common_msg::FOREVER_EVENT_GAME_PK_VAL, 0, cnt);
			if (el::ERR_DB::KEY_INEXIST == r){
				user_info->set_game_pk_val(share_msg::E_GAME_PK_VAL_DEF);
			} else {
				user_info->set_game_pk_val(cnt);
			}
		}
	}
	this->encode_msg2sendbuf(&out);
	return this->ret;
}

int Cfunc_route::on_get_peer_user_home_msg(USER_ID uid, google::protobuf::Message* msg)
{
	auto in = (db_msg::get_peer_user_show_msg*)msg;

	USER_ID peer_uid = in->uid();
	
	db_msg::get_peer_user_home_msg_res out;

	share_msg::user_home_t* user_home = out.mutable_user_home();
	user_home->set_uid(peer_uid);

	{
		ITEM_CNT flower_cnt = 0;
		this->item.get_item_cnt(peer_uid, share_msg::E_ITEM_ID_FLOWER, flower_cnt);
		user_home->set_flower(flower_cnt);
	}
	{// 游戏分数 [2019/1/4 Administrator]
		std::vector<common_msg::event_t> e_out;
		this->user_event.get(peer_uid, common_msg::FOREVER_EVENT_GAME_SCORE, e_out);
		FOREACH(e_out, it){
			common_msg::event_t& r = *it;
			share_msg::key_val_t* game_score = user_home->add_game_score();
			game_score->set_key(r.id());
			game_score->set_val1(r.data());
		}
	}

	{// 家具	 [2018/12/28 Administrator]	
		this->furniture.get_home(peer_uid, user_home);
	}
	
	{// 墙纸	[2018/12/28 Administrator]	
		EVENT_DATA wall = 0;
		this->user_event.get_user_data(peer_uid, common_msg::FOREVER_EVENT_ROLE_WALL, 0, wall);
	}

	this->user_event.get_id_data(peer_uid, common_msg::FOREVER_EVENT_IN_ROOM_PET, user_home);

	this->encode_msg2sendbuf(&out);

	return this->ret;
}