--- lbbs/src/bbs.c 2025/06/18 02:29:54 1.25 +++ lbbs/src/bbs.c 2025/10/23 14:49:24 1.32 @@ -17,6 +17,7 @@ #include "bbs.h" #include "common.h" #include "user_priv.h" +#include #include #include #include @@ -32,8 +33,15 @@ char BBS_address[BBS_address_max_len + 1 in_port_t BBS_port[2] = {BBS_port_default, BBS_ssh_port_default}; int BBS_max_client = MAX_CLIENT_LIMIT; int BBS_max_client_per_ip = MAX_CLIENT_PER_IP_LIMIT; -int BBS_max_user = BBS_MAX_USER_LIMIT; -char BBS_start_dt[BBS_start_dt_max_len + 1] = "2000 1 1"; +char BBS_start_dt[BBS_start_dt_max_len + 1] = "2000年 1月 1日"; +int BBS_sys_id = 1; + +const int BBS_section_list_load_interval = 5; // second + +// User +const int BBS_user_list_load_interval = 60; // 1 minute +const int BBS_user_online_list_load_interval = 5; // 5 seconds +const int BBS_user_off_line = 900; // 15 minutes char BBS_username[BBS_username_max_len + 1]; char BBS_nickname[BBS_nickname_max_len + 1]; @@ -44,6 +52,100 @@ time_t BBS_login_tm; time_t BBS_last_access_tm; char BBS_current_action[BBS_current_action_max_len + 1]; +time_t BBS_current_action_tm; + +const int BBS_current_action_refresh_interval = 60; // 1 minute + +static const int astro_dates[] = { + 21, 20, 21, 21, 22, 22, 23, 24, 24, 24, 23, 22}; + +static const char *astro_names[] = { + "摩羯", "水瓶", "双鱼", "白羊", "金牛", "双子", "巨蟹", "狮子", "处女", "天秤", "天蝎", "射手", "摩羯"}; + +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 *); + +const char *get_astro_name(time_t birthday) +{ + struct tm tm_birth; + + gmtime_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]; +} + +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]; +} char *setuserfile(char *buf, size_t len, const char *filename) {