| 22 |
#include "user_list.h" |
#include "user_list.h" |
| 23 |
#include "user_info_display.h" |
#include "user_info_display.h" |
| 24 |
#include "user_priv.h" |
#include "user_priv.h" |
| 25 |
|
#include <ctype.h> |
| 26 |
#include <string.h> |
#include <string.h> |
| 27 |
#include <time.h> |
#include <time.h> |
| 28 |
#include <sys/param.h> |
#include <sys/param.h> |
| 30 |
#define BBS_max_sessions_per_user 10 |
#define BBS_max_sessions_per_user 10 |
| 31 |
#define LAST_LOGIN_DT_MAX_LEN 50 |
#define LAST_LOGIN_DT_MAX_LEN 50 |
| 32 |
|
|
| 33 |
static int display_user_intro_key_handler(int *p_key, DISPLAY_CTX *p_ctx) |
static const int astro_dates[] = { |
| 34 |
|
21, 20, 21, 21, 22, 22, 23, 24, 24, 24, 23, 22}; |
| 35 |
|
|
| 36 |
|
static const char *astro_names[] = { |
| 37 |
|
"摩羯", "水瓶", "双鱼", "白羊", "金牛", "双子", "巨蟹", "狮子", "处女", "天秤", "天蝎", "射手", "摩羯"}; |
| 38 |
|
|
| 39 |
|
const char *get_astro_name(time_t birthday) |
| 40 |
|
{ |
| 41 |
|
struct tm tm_birth; |
| 42 |
|
|
| 43 |
|
localtime_r(&birthday, &tm_birth); |
| 44 |
|
|
| 45 |
|
if (tm_birth.tm_mon < 1 || tm_birth.tm_mon > 12 || tm_birth.tm_mday < 1 || tm_birth.tm_mday > 31) |
| 46 |
|
{ |
| 47 |
|
return astro_names[0]; |
| 48 |
|
} |
| 49 |
|
|
| 50 |
|
if (tm_birth.tm_mday < astro_dates[tm_birth.tm_mon - 1]) |
| 51 |
|
{ |
| 52 |
|
return astro_names[tm_birth.tm_mon - 1]; |
| 53 |
|
} |
| 54 |
|
|
| 55 |
|
return astro_names[tm_birth.tm_mon]; |
| 56 |
|
} |
| 57 |
|
|
| 58 |
|
static int display_user_info_key_handler(int *p_key, DISPLAY_CTX *p_ctx) |
| 59 |
{ |
{ |
| 60 |
return 0; |
return 0; |
| 61 |
} |
} |
| 65 |
USER_ONLINE_INFO sessions[BBS_max_sessions_per_user]; |
USER_ONLINE_INFO sessions[BBS_max_sessions_per_user]; |
| 66 |
int session_cnt = BBS_max_sessions_per_user; |
int session_cnt = BBS_max_sessions_per_user; |
| 67 |
int article_cnt; |
int article_cnt; |
| 68 |
|
const char *astro_name; |
| 69 |
|
char astro_str[LINE_BUFFER_LEN]; |
| 70 |
struct tm tm_last_login; |
struct tm tm_last_login; |
| 71 |
char str_last_login_dt[LAST_LOGIN_DT_MAX_LEN + 1]; |
char str_last_login_dt[LAST_LOGIN_DT_MAX_LEN + 1]; |
| 72 |
struct tm tm_last_logout; |
struct tm tm_last_logout; |
| 86 |
|
|
| 87 |
article_cnt = get_user_article_cnt(p_user_info->uid); |
article_cnt = get_user_article_cnt(p_user_info->uid); |
| 88 |
|
|
| 89 |
|
astro_name = get_astro_name(p_user_info->birthday); |
| 90 |
|
if (p_user_info->gender_pub && toupper(p_user_info->gender) == 'M') |
| 91 |
|
{ |
| 92 |
|
snprintf(astro_str, sizeof(astro_str), |
| 93 |
|
"\033[1;36m%s座\033[m", |
| 94 |
|
astro_name); |
| 95 |
|
} |
| 96 |
|
else if (p_user_info->gender_pub && toupper(p_user_info->gender) == 'F') |
| 97 |
|
{ |
| 98 |
|
snprintf(astro_str, sizeof(astro_str), |
| 99 |
|
"\033[1;35m%s座\033[m", |
| 100 |
|
astro_name); |
| 101 |
|
} |
| 102 |
|
else |
| 103 |
|
{ |
| 104 |
|
snprintf(astro_str, sizeof(astro_str), |
| 105 |
|
"\033[1;33m%s座\033[m", |
| 106 |
|
astro_name); |
| 107 |
|
} |
| 108 |
|
|
| 109 |
localtime_r(&(p_user_info->last_login_dt), &tm_last_login); |
localtime_r(&(p_user_info->last_login_dt), &tm_last_login); |
| 110 |
strftime(str_last_login_dt, sizeof(str_last_login_dt), "%c", &tm_last_login); |
strftime(str_last_login_dt, sizeof(str_last_login_dt), "%c", &tm_last_login); |
| 111 |
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) |
| 112 |
{ |
{ |
| 113 |
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); |
| 114 |
str_last_logout_dt[sizeof(str_last_logout_dt) - 1] = '\0'; |
str_last_logout_dt[sizeof(str_last_logout_dt) - 1] = '\0'; |
| 166 |
snprintf(user_info_f, sizeof(user_info_f), |
snprintf(user_info_f, sizeof(user_info_f), |
| 167 |
"\n%s (%s) 上站 [%d] 发文 [%d]\n" |
"\n%s (%s) 上站 [%d] 发文 [%d]\n" |
| 168 |
"上次在 [%s] 从 [%s] 访问本站 经验值 [%d]\n" |
"上次在 [%s] 从 [%s] 访问本站 经验值 [%d]\n" |
| 169 |
"离线于 [%s] 等级 [%s]\n" |
"离线于 [%s] 等级 [%s] 星座 [%s]\n" |
| 170 |
"%s\033[1m%s\033[m" |
"%s\033[1m%s\033[m" |
| 171 |
"%s\n%s\n", |
"%s\n%s\n", |
| 172 |
p_user_info->username, p_user_info->nickname, p_user_info->visit_count, article_cnt, |
p_user_info->username, p_user_info->nickname, p_user_info->visit_count, article_cnt, |
| 173 |
str_last_login_dt, (session_cnt > 0 ? login_ip : "未知"), p_user_info->exp, |
str_last_login_dt, (session_cnt > 0 ? login_ip : "未知"), p_user_info->exp, |
| 174 |
(session_cnt > 0 ? "在线或因断线不详" : str_last_logout_dt), "?", |
(session_cnt > 0 ? "在线或因断线不详" : str_last_logout_dt), "?", astro_str, |
| 175 |
(session_cnt > 0 ? "目前在线,状态如下:\n" : ""), (session_cnt > 0 ? action_str : ""), |
(session_cnt > 0 ? "目前在线,状态如下:\n" : ""), (session_cnt > 0 ? action_str : ""), |
| 176 |
(intro_len > 0 ? "\033[0;36m个人说明档如下:\033[m" : "\033[0;36m没有个人说明档\033[m"), |
(intro_len > 0 ? "\033[0;36m个人说明档如下:\033[m" : "\033[0;36m没有个人说明档\033[m"), |
| 177 |
intro_f); |
intro_f); |
| 179 |
lines = split_data_lines(user_info_f, SCREEN_COLS, line_offsets, MIN(SCREEN_ROWS - 1, BBS_user_intro_max_line + 8), 1, NULL); |
lines = split_data_lines(user_info_f, SCREEN_COLS, line_offsets, MIN(SCREEN_ROWS - 1, BBS_user_intro_max_line + 8), 1, NULL); |
| 180 |
|
|
| 181 |
clearscr(); |
clearscr(); |
| 182 |
display_data(user_info_f, lines, line_offsets, 1, display_user_intro_key_handler, DATA_READ_HELP); |
display_data(user_info_f, lines, line_offsets, 1, display_user_info_key_handler, DATA_READ_HELP); |
| 183 |
|
|
| 184 |
return 0; |
return 0; |
| 185 |
} |
} |