online_reward.cpp 5.15 KB
#include "online_reward.h"
#include "gateway.h"
#include "item.h"
#include "user.h"

online_reward_cfg_mgr_t* g_online_reward_cfg_mgr;

//////////////////////////////////////////////////////////////////////////
//online_reward config
//////////////////////////////////////////////////////////////////////////

void online_reward_cfg_mgr_t::init()
{
	this->reward_map.clear();
}

bool online_reward_cfg_mgr_t::load_cfg()
{
	const std::string cfg_path = "./cfg/online_reward.xml";

	el::lib_xmlparser_t xml;
	int ret = xml.open(cfg_path.c_str());
	if (SUCC != ret){
		ALERT_LOG("open");
		return false;
	}

	this->init();

	xml.move2children_node();
	xmlNodePtr cur = xml.node_ptr;
	while (cur) {
		if (!xmlStrcmp(cur->name, (const xmlChar *)"reward")) {
			uint32_t id = 0;
			xml.get_xml_prop(cur, id, "id");
			online_reward_element_t ore;
			xml.get_xml_prop(cur, ore.time_sec, "time_sec");

			{
				std::string str_def;
				std::string str_item;
				xml.get_xml_prop_def(cur, str_item, "reward_item", str_def);

				std::vector<uint_pair> uint_pair_val;
				str_split_uint(str_item, uint_pair_val);
				FOREACH(uint_pair_val, it) {
					if (NULL == g_item_cfg_mgr->find(it->key)){
						ALERT_LOG("[item_id:%u]", it->key);
						return false;
					}
					share_msg::item_t item;
					item.set_id(it->key);
					item.set_cnt(it->val);
					ore.reward_vec.push_back(item);
				}
			}
			{
				std::string str_def;
				std::string str_item;
				xml.get_xml_prop_def(cur, str_item, "vip_reward_item", str_def);

				std::vector<uint_pair> uint_pair_val;
				str_split_uint(str_item, uint_pair_val);
				FOREACH(uint_pair_val, it) {
					if (NULL == g_item_cfg_mgr->find(it->key)){
						ALERT_LOG("[item_id:%u]", it->key);
						return false;
					}
					share_msg::item_t item;
					item.set_id(it->key);
					item.set_cnt(it->val);
					ore.vip_reward_vec.push_back(item);
				}
			}
			this->reward_map.insert(std::make_pair(id, ore));
		}
		cur = cur->next;
	}//while

 	return true;
}

void online_reward_cfg_mgr_t::gen_next_time_sec( user_t* user, gateway_msg::online_reward_t* online_reward )
{
	uint32_t now_sec = el_async::get_now_sec();
	uint32_t this_online_sec = now_sec - user->last_get_online_reward_sec;
	EVENT_DATA save_sec = user->event_mgr.find_data(common_msg::DAILY_EVENT_ONLINE_REWARD_TIME_SEC);
	uint32_t all_time_sec = this_online_sec + (uint32_t)save_sec;

	uint32_t id = (uint32_t)user->event_mgr.find_data(common_msg::DAILY_EVENT_ONLINE_REWARD);

	online_reward->set_id(id);

	uint32_t next_id = id + 1;
	auto it = this->reward_map.find(next_id);
	if (this->reward_map.end() == it){
		return;
	}

	online_reward_element_t& next_ore = it->second;
	if (all_time_sec < next_ore.time_sec){
		online_reward->set_time_sec(next_ore.time_sec - all_time_sec);
	}
}

void online_reward_cfg_mgr_t::offline_save_time_sec( user_t* user )
{
	uint32_t save_sec = (uint32_t)user->event_mgr.find_data(common_msg::DAILY_EVENT_ONLINE_REWARD_TIME_SEC);
	save_sec += el_async::get_now_sec() - user->last_get_online_reward_sec;

	user->event_mgr.update_event(user->uid(), common_msg::DAILY_EVENT_ONLINE_REWARD_TIME_SEC, 0, save_sec, el::lib_time_t::tomorrow_start_time()-1);
}

//////////////////////////////////////////////////////////////////////////

int gateway_t::on_get_online_reward_msg(el::lib_tcp_peer_info_t* peer_fd_info,
									  google::protobuf::Message* msg,
									  user_t* user)
{
	gateway_msg::get_online_reward_msg_res out;
	gateway_msg::online_reward_t* online_reward = out.mutable_online_reward();

 	uint32_t now_sec = el_async::get_now_sec();
 	uint32_t this_online_sec = now_sec - user->last_get_online_reward_sec;
 	uint32_t save_sec = (uint32_t)user->event_mgr.find_data(common_msg::DAILY_EVENT_ONLINE_REWARD_TIME_SEC);
 	uint32_t all_time_sec = this_online_sec + save_sec;

	uint32_t id = (uint32_t)user->event_mgr.find_data(common_msg::DAILY_EVENT_ONLINE_REWARD);

	uint32_t reward_id = id + 1;
	auto it = g_online_reward_cfg_mgr->reward_map.find(reward_id);
	if (g_online_reward_cfg_mgr->reward_map.end() != it){
		online_reward_element_t& reward_ore = it->second;
		if (all_time_sec < reward_ore.time_sec){
			return share_msg::EC_VALUE_INVALID;
		}
		user->last_get_online_reward_sec = el_async::get_now_sec();
		uint32_t exprie_time = el::lib_time_t::tomorrow_start_time() - 1;
		user->event_mgr.update_event(user->uid(), common_msg::DAILY_EVENT_ONLINE_REWARD, 0, reward_id, exprie_time);
		user->event_mgr.update_event(user->uid(), common_msg::DAILY_EVENT_ONLINE_REWARD_TIME_SEC, 0, 0, exprie_time);

		if (user->is_vip_active()){
			FOREACH(reward_ore.vip_reward_vec, it_item){
				share_msg::item_t& item = *it_item;
				user->item_mgr.add(item.id(), item.cnt());
			}
		} else {
			FOREACH(reward_ore.reward_vec, it_item){
				share_msg::item_t& item = *it_item;
				user->item_mgr.add(item.id(), item.cnt());
			}
		}

		online_reward->set_id(reward_id);
		uint32_t next_id = reward_id + 1;
		auto it_next = g_online_reward_cfg_mgr->reward_map.find(next_id);
		if (g_online_reward_cfg_mgr->reward_map.end() != it_next){
			online_reward_element_t& next_ore = it_next->second;
			online_reward->set_time_sec(next_ore.time_sec);
		}
	} else {
		return share_msg::EC_VALUE_INVALID;
	}

	{
		user->send_msg_res(&out);
	}
	return 0;
}