| 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_mday < astro_dates[tm_birth.tm_mon]) |
|
|
{ |
|
|
return astro_names[tm_birth.tm_mon]; |
|
|
} |
|
|
|
|
|
return astro_names[tm_birth.tm_mon + 1]; |
|
|
} |
|
|
|
|
|
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; |
| 85 |
} |
} |
| 86 |
|
|
| 87 |
localtime_r(&(p_user_info->last_login_dt), &tm_last_login); |
localtime_r(&(p_user_info->last_login_dt), &tm_last_login); |
| 88 |
strftime(str_last_login_dt, sizeof(str_last_login_dt), "%c", &tm_last_login); |
strftime(str_last_login_dt, sizeof(str_last_login_dt), "%F %H:%M", &tm_last_login); |
| 89 |
if (p_user_info->last_logout_dt <= p_user_info->last_login_dt) |
if (p_user_info->last_logout_dt <= p_user_info->last_login_dt) |
| 90 |
{ |
{ |
| 91 |
strncpy(str_last_logout_dt, str_last_login_dt, sizeof(str_last_logout_dt) - 1); |
strncpy(str_last_logout_dt, str_last_login_dt, sizeof(str_last_logout_dt) - 1); |
| 94 |
else |
else |
| 95 |
{ |
{ |
| 96 |
localtime_r(&(p_user_info->last_logout_dt), &tm_last_logout); |
localtime_r(&(p_user_info->last_logout_dt), &tm_last_logout); |
| 97 |
strftime(str_last_logout_dt, sizeof(str_last_logout_dt), "%c", &tm_last_logout); |
strftime(str_last_logout_dt, sizeof(str_last_logout_dt), "%F %H:%M", &tm_last_logout); |
| 98 |
} |
} |
| 99 |
|
|
| 100 |
action_str[0] = '\0'; |
action_str[0] = '\0'; |