| 14 |
* * |
* * |
| 15 |
***************************************************************************/ |
***************************************************************************/ |
| 16 |
|
|
| 17 |
|
#include "bbs.h" |
| 18 |
#include "ip_mask.h" |
#include "ip_mask.h" |
| 19 |
#include "lml.h" |
#include "lml.h" |
| 20 |
#include "log.h" |
#include "log.h" |
| 31 |
#define BBS_max_sessions_per_user 10 |
#define BBS_max_sessions_per_user 10 |
| 32 |
#define LAST_LOGIN_DT_MAX_LEN 50 |
#define LAST_LOGIN_DT_MAX_LEN 50 |
| 33 |
|
|
|
static const int astro_dates[] = { |
|
|
21, 20, 21, 21, 22, 22, 23, 24, 24, 24, 23, 22}; |
|
|
|
|
|
static const char *astro_names[] = { |
|
|
"摩羯", "水瓶", "双鱼", "白羊", "金牛", "双子", "巨蟹", "狮子", "处女", "天秤", "天蝎", "射手", "摩羯"}; |
|
|
|
|
|
const char *get_astro_name(time_t birthday) |
|
|
{ |
|
|
struct tm tm_birth; |
|
|
|
|
|
localtime_r(&birthday, &tm_birth); |
|
|
|
|
|
if (tm_birth.tm_mon < 1 || tm_birth.tm_mon > 12 || tm_birth.tm_mday < 1 || tm_birth.tm_mday > 31) |
|
|
{ |
|
|
return astro_names[0]; |
|
|
} |
|
|
|
|
|
if (tm_birth.tm_mday < astro_dates[tm_birth.tm_mon - 1]) |
|
|
{ |
|
|
return astro_names[tm_birth.tm_mon - 1]; |
|
|
} |
|
|
|
|
|
return astro_names[tm_birth.tm_mon]; |
|
|
} |
|
|
|
|
|
static const int user_level_points[] = { |
|
|
INT_MIN, // 0 |
|
|
50, // 1 |
|
|
200, // 2 |
|
|
500, // 3 |
|
|
1000, // 4 |
|
|
2000, // 5 |
|
|
5000, // 6 |
|
|
10000, // 7 |
|
|
20000, // 8 |
|
|
30000, // 9 |
|
|
50000, // 10 |
|
|
60000, // 11 |
|
|
70000, // 12 |
|
|
80000, // 13 |
|
|
90000, // 14 |
|
|
100000, // 15 |
|
|
INT_MAX, // 16 |
|
|
}; |
|
|
|
|
|
static const char *user_level_names[] = { |
|
|
"新手上路", // 0 |
|
|
"初来乍练", // 1 |
|
|
"白手起家", // 2 |
|
|
"略懂一二", // 3 |
|
|
"小有作为", // 4 |
|
|
"对答如流", // 5 |
|
|
"精于此道", // 6 |
|
|
"博大精深", // 7 |
|
|
"登峰造极", // 8 |
|
|
"论坛砥柱", // 9 |
|
|
"☆☆☆☆☆", // 10 |
|
|
"★☆☆☆☆", // 11 |
|
|
"★★☆☆☆", // 12 |
|
|
"★★★☆☆", // 13 |
|
|
"★★★★☆", // 14 |
|
|
"★★★★★", // 15 |
|
|
}; |
|
|
|
|
|
static const int user_level_cnt = sizeof(user_level_names) / sizeof(const char *); |
|
|
|
|
|
static const char *get_user_level_name(int point) |
|
|
{ |
|
|
int left; |
|
|
int right; |
|
|
int mid; |
|
|
|
|
|
left = 0; |
|
|
right = user_level_cnt - 1; |
|
|
|
|
|
while (left < right) |
|
|
{ |
|
|
mid = (left + right) / 2; |
|
|
if (point < user_level_points[mid + 1]) |
|
|
{ |
|
|
right = mid; |
|
|
} |
|
|
else if (point > user_level_points[mid + 1]) |
|
|
{ |
|
|
left = mid + 1; |
|
|
} |
|
|
else // if (point == user_level_points[mid]) |
|
|
{ |
|
|
left = mid + 1; |
|
|
break; |
|
|
} |
|
|
} |
|
|
|
|
|
return user_level_names[left]; |
|
|
} |
|
|
|
|
| 34 |
static int display_user_info_key_handler(int *p_key, DISPLAY_CTX *p_ctx) |
static int display_user_info_key_handler(int *p_key, DISPLAY_CTX *p_ctx) |
| 35 |
{ |
{ |
| 36 |
return 0; |
return 0; |
| 49 |
char str_last_logout_dt[LAST_LOGIN_DT_MAX_LEN + 1]; |
char str_last_logout_dt[LAST_LOGIN_DT_MAX_LEN + 1]; |
| 50 |
char login_ip[IP_ADDR_LEN]; |
char login_ip[IP_ADDR_LEN]; |
| 51 |
int ip_mask_level; |
int ip_mask_level; |
| 52 |
|
const char *p_action_title; |
| 53 |
char action_str[LINE_BUFFER_LEN]; |
char action_str[LINE_BUFFER_LEN]; |
| 54 |
const char *user_level_name; |
const char *user_level_name; |
| 55 |
char intro_f[BBS_user_intro_max_len]; |
char intro_f[BBS_user_intro_max_len]; |
| 110 |
p = action_str; |
p = action_str; |
| 111 |
for (i = 0; i < session_cnt; i++) |
for (i = 0; i < session_cnt; i++) |
| 112 |
{ |
{ |
| 113 |
if (p + strlen(sessions[i].current_action_title) + 4 >= action_str + sizeof(action_str)) // buffer overflow |
p_action_title = (sessions[i].current_action_title != NULL |
| 114 |
|
? sessions[i].current_action_title |
| 115 |
|
: sessions[i].current_action); |
| 116 |
|
|
| 117 |
|
if (p + strlen(p_action_title) + 4 >= action_str + sizeof(action_str)) // buffer overflow |
| 118 |
{ |
{ |
| 119 |
log_error("action_str of user(uid=%d) truncated at i=%d\n", p_user_info->uid, i); |
log_error("action_str of user(uid=%d) truncated at i=%d\n", p_user_info->uid, i); |
| 120 |
break; |
break; |
| 121 |
} |
} |
| 122 |
*p++ = '['; |
*p++ = '['; |
| 123 |
for (q = sessions[i].current_action_title; *q != '\0';) |
for (q = p_action_title; *q != '\0';) |
| 124 |
{ |
{ |
| 125 |
*p++ = *q++; |
*p++ = *q++; |
| 126 |
} |
} |