btl_rank.cpp 5.79 KB
#include "btl_rank.h"
#include "dbproxy.h"
#include <db.pb.h>
#include "gateway.h"
#include <gateway_msg.pb.h>
#include "user.h"

btl_rank_mgr_t* g_btl_rank_mgr;


int dbproxy_t::on_load_btl_rank_msg_res(el::lib_tcp_peer_info_t* peer_fd_info, 
									google::protobuf::Message* msg, 
									USER_ID uid, uint32_t seq, uint32_t ret,
									user_t* user){
	auto in = (db_msg::load_btl_rank_msg_res*)msg;

	FOREACH_PB(in->rank_user, index){
		const share_msg::btl_rank_user_t& ru = in->rank_user(index);

		btl_rank_user_t rank_user;
		rank_user.CopyFrom(ru);
		auto it = g_btl_rank_mgr->rank_map.find(ru.type());
		if (g_btl_rank_mgr->rank_map.end() == it){
			std::set<btl_rank_user_t> rank_user_set;
			rank_user_set.insert(rank_user);

			g_btl_rank_mgr->rank_map.insert(std::make_pair(ru.type(), rank_user_set));
		} else {
			std::set<btl_rank_user_t>& rank_user_set = it->second;
			rank_user_set.insert(rank_user);
		}
	}

	{// 清理掉多余排行[db,memory] 	
		FOREACH(g_btl_rank_mgr->rank_map, it_type){
			auto type = it_type->first;
			auto& rank_user_set = it_type->second;
			g_btl_rank_mgr->clear(rank_user_set);
		}
	}

	return SUCC;
}

int dbproxy_t::on_load_yesterday_btl_rank_msg_res(el::lib_tcp_peer_info_t* peer_fd_info, 
												  google::protobuf::Message* msg, 
												  USER_ID uid, uint32_t seq, uint32_t ret,
												  user_t* user){
	g_btl_rank_mgr->yesterday_rank_map.clear();

	auto in = (db_msg::load_yesterday_btl_rank_msg_res*)msg;

	FOREACH_PB(in->rank_user, index){
		const share_msg::btl_rank_user_t& ru = in->rank_user(index);
		
		btl_rank_user_t rank_user;
		rank_user.CopyFrom(ru);
		auto it = g_btl_rank_mgr->yesterday_rank_map.find(ru.type());
		if (g_btl_rank_mgr->yesterday_rank_map.end() == it){
			std::set<btl_rank_user_t> rank_user_set;
			rank_user_set.insert(rank_user);

			g_btl_rank_mgr->yesterday_rank_map.insert(std::make_pair(ru.type(), rank_user_set));
		} else {
			std::set<btl_rank_user_t>& rank_user_set = it->second;
			rank_user_set.insert(rank_user);
		}
	}

	return SUCC;
}

int gateway_t::on_get_btl_rank_msg(el::lib_tcp_peer_info_t* peer_fd_info,
									   google::protobuf::Message* msg,
									   user_t* user)
{
	gateway_msg::get_btl_rank_msg_res out;
	share_msg::btl_rank_t* gr = out.mutable_btl_rank();

	auto it = g_btl_rank_mgr->rank_map.find(share_msg::E_BTL_RANK_TYPE_COMMON);
	if (it != g_btl_rank_mgr->rank_map.end()){
		std::set<btl_rank_user_t>& ru_set = it->second;
		FOREACH(ru_set, it_set){
			const btl_rank_user_t& ru = *it_set;
			share_msg::btl_rank_user_t* p_ru = gr->add_rank_user();
			p_ru->CopyFrom(ru);
		}
	}
	user->send_msg_res(&out);
	
	return 0;
}

//////////////////////////////////////////////////////////////////////////
void btl_rank_mgr_t::clear( std::set<btl_rank_user_t>& rank_user_set )
{
	uint32_t no = 1;
	FOREACH(rank_user_set, it){
		const btl_rank_user_t& ru = *it;
		if (share_msg::E_BTL_RANK_MAX_CNT < no){	
			g_btl_rank_mgr->db_delete_user_rank(uint32_t(ru.type()), ru.user_show().uid());
		}
		no++;
	}

	if (share_msg::E_BTL_RANK_MAX_CNT < rank_user_set.size()){
		auto it_erase = rank_user_set.begin();
		for (uint32_t i = 0; i < share_msg::E_BTL_RANK_MAX_CNT; i++){
			it_erase++;
		}
		rank_user_set.erase(it_erase, rank_user_set.end());
	}
}

btl_rank_user_t* btl_rank_mgr_t::find( uint32_t type, USER_ID uid )
{
	btl_rank_user_t* rank_user = NULL;
	auto it = this->rank_map.find(type);
	if (this->rank_map.end() == it){
		return rank_user;
	}

	std::set<btl_rank_user_t>& ru_set = it->second;

	FOREACH(ru_set, it){
		const btl_rank_user_t* ru = &*it;
		if (ru->user_show().uid() == uid){
			rank_user = const_cast<btl_rank_user_t*>(ru);
			break;
		}
	}
	return rank_user;
}

const btl_rank_user_t* btl_rank_mgr_t::find_last( uint32_t type )
{
	auto it = this->rank_map.find(type);
	if (this->rank_map.end() == it){
		return NULL;
	}

	std::set<btl_rank_user_t>& ru_set = it->second;
	auto r_it = ru_set.rbegin();
	return &*r_it;
}

void btl_rank_mgr_t::db_update_rank( const share_msg::btl_rank_user_t& rank_user )
{
	db_msg::update_user_btl_rank_msg out;
	out.mutable_rank_user()->CopyFrom(rank_user);

	g_dbproxy->send_msg(&out, 0, db_update_user_btl_rank_msg_cmd);
}

void btl_rank_mgr_t::db_delete_user_rank( uint32_t type, USER_ID uid )
{
	db_msg::delete_user_btl_rank_msg out;
	out.set_type(type);
	out.set_uid(uid);
	g_dbproxy->send_msg(&out, 0, db_delete_user_btl_rank_msg_cmd);
}

bool btl_rank_mgr_t::has_uid( USER_ID uid )
{
	FOREACH(this->rank_map, it_type){
		auto& rank_user_set = it_type->second;
		FOREACH(rank_user_set, it_rank_user){
			auto& ru = *it_rank_user;
			if (ru.user_show().uid() == uid){
				return true;
			}
		}
	}
	return false;
}

void btl_rank_mgr_t::db_yesterday_update_rank( const share_msg::btl_rank_user_t& rank_user )
{
	db_msg::update_yesterday_btl_rank_msg out;
	out.mutable_rank_user()->CopyFrom(rank_user);

	g_dbproxy->send_msg(&out, 0, db_update_yesterday_btl_rank_msg_cmd);
}

void btl_rank_mgr_t::db_delete_yesterday_rank()
{
	db_msg::delete_yesterday_btl_rank_msg out;
	g_dbproxy->send_msg(&out, 0, db_delete_yesterday_btl_rank_msg_cmd);
}

btl_rank_user_t* btl_rank_mgr_t::find_yesterday( uint32_t type, USER_ID uid )
{
	btl_rank_user_t* rank_user = NULL;
	auto it = this->yesterday_rank_map.find(type);
	if (this->yesterday_rank_map.end() == it){
		return rank_user;
	}

	std::set<btl_rank_user_t>& ru_set = it->second;

	uint32_t idx = 0;
	FOREACH(ru_set, it){
		idx++;
		const btl_rank_user_t* ru = &*it;
		if (ru->user_show().uid() == uid){
			rank_user = const_cast<btl_rank_user_t*>(ru);
			rank_user->no = idx;
			break;
		}
	}
	return rank_user;
}

void btl_rank_mgr_t::pack( btl_rank_user_t& bru, uint32_t type, uint32_t win_cnt, uint32_t exp, user_t* user )
{
	bru.set_type(type);
	bru.set_win_cnt(win_cnt);
	bru.set_exp(exp);
	bru.set_tim(el_async::get_now_sec());
	bru.mutable_user_show()->CopyFrom(user->user_show);
}