btl_rank.cpp
5.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
#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);
}