--- lbbs/src/bbs_main.c 2025/05/15 14:34:13 1.48 +++ lbbs/src/bbs_main.c 2025/06/08 09:25:24 1.68 @@ -20,36 +20,46 @@ #include "user_priv.h" #include "common.h" #include "database.h" +#include "article_view_log.h" #include "log.h" #include "io.h" #include "screen.h" #include "menu.h" #include "bbs_cmd.h" +#include "section_list.h" +#include "trie_dict.h" #include #include #include +#include int bbs_info() { prints("欢迎光临 \033[1;33m%s \033[32m[%s] \033[37m( %s )\r\n", - BBS_name, BBS_server, app_version); + BBS_name, BBS_server, APP_NAME_VER); return iflush(); } -int bbs_welcome(MYSQL *db) +int bbs_welcome(void) { char sql[SQL_BUFFER_LEN]; u_int32_t u_online = 0; u_int32_t u_anonymous = 0; u_int32_t u_total = 0; - u_int32_t max_u_online = 0; u_int32_t u_login_count = 0; + MYSQL *db; MYSQL_RES *rs; MYSQL_ROW row; + db = db_open(); + if (db == NULL) + { + return -1; + } + snprintf(sql, sizeof(sql), "SELECT COUNT(*) AS cc FROM " "(SELECT DISTINCT SID FROM user_online " @@ -57,12 +67,14 @@ int bbs_welcome(MYSQL *db) BBS_user_off_line); if (mysql_query(db, sql) != 0) { - log_error("Query user_online failed\n"); + log_error("Query user_online error: %s\n", mysql_error(db)); + mysql_close(db); return -2; } if ((rs = mysql_store_result(db)) == NULL) { log_error("Get user_online data failed\n"); + mysql_close(db); return -2; } if ((row = mysql_fetch_row(rs))) @@ -78,12 +90,14 @@ int bbs_welcome(MYSQL *db) BBS_user_off_line); if (mysql_query(db, sql) != 0) { - log_error("Query user_online failed\n"); + log_error("Query user_online error: %s\n", mysql_error(db)); + mysql_close(db); return -2; } if ((rs = mysql_store_result(db)) == NULL) { log_error("Get user_online data failed\n"); + mysql_close(db); return -2; } if ((row = mysql_fetch_row(rs))) @@ -95,12 +109,14 @@ int bbs_welcome(MYSQL *db) snprintf(sql, sizeof(sql), "SELECT COUNT(UID) AS cc FROM user_list WHERE enable"); if (mysql_query(db, sql) != 0) { - log_error("Query user_list failed\n"); + log_error("Query user_list error: %s\n", mysql_error(db)); + mysql_close(db); return -2; } if ((rs = mysql_store_result(db)) == NULL) { log_error("Get user_list data failed\n"); + mysql_close(db); return -2; } if ((row = mysql_fetch_row(rs))) @@ -112,12 +128,14 @@ int bbs_welcome(MYSQL *db) snprintf(sql, sizeof(sql), "SELECT ID FROM user_login_log ORDER BY ID LIMIT 1"); if (mysql_query(db, sql) != 0) { - log_error("Query user_login_log failed\n"); + log_error("Query user_login_log error: %s\n", mysql_error(db)); + mysql_close(db); return -2; } if ((rs = mysql_store_result(db)) == NULL) { log_error("Get user_login_log data failed\n"); + mysql_close(db); return -2; } if ((row = mysql_fetch_row(rs))) @@ -126,55 +144,49 @@ int bbs_welcome(MYSQL *db) } mysql_free_result(rs); - // Log max user_online - FILE *fin, *fout; - if ((fin = fopen(VAR_MAX_USER_ONLINE, "r")) != NULL) - { - fscanf(fin, "%d", &max_u_online); - fclose(fin); - } - if (u_online > max_u_online) - { - max_u_online = u_online; - if ((fout = fopen(VAR_MAX_USER_ONLINE, "w")) == NULL) - { - log_error("Open max_user_online.dat failed\n"); - return -3; - } - fprintf(fout, "%d\n", max_u_online); - fclose(fout); - } + mysql_close(db); // Count current user before login u_online++; u_anonymous++; // Display logo - display_file_ex(DATA_WELCOME, 1, 0); + display_file(DATA_WELCOME, 2); // Display welcome message prints("\r\033[1;35m欢迎光临\033[33m 【 %s 】 \033[35mBBS\r\n" "\033[32m目前上站人数 [\033[36m%d/%d\033[32m] " "匿名游客[\033[36m%d\033[32m] " "注册用户数[\033[36m%d/%d\033[32m]\r\n" - "从 [\033[36m%s\033[32m] 起,最高人数记录:" - "[\033[36m%d\033[32m],累计访问人次:[\033[36m%d\033[32m]\r\n", + "从 [\033[36m%s\033[32m] 起,累计访问人次:[\033[36m%d\033[32m]\033[m\r\n", BBS_name, u_online, BBS_max_client, u_anonymous, u_total, - BBS_max_user, BBS_start_dt, max_u_online, u_login_count); + BBS_max_user, BBS_start_dt, u_login_count); + + iflush(); return 0; } -int bbs_logout(MYSQL *db) +int bbs_logout(void) { - if (user_online_del(db) < 0) + MYSQL *db; + + db = db_open(); + if (db == NULL) { return -1; } - display_file_ex(DATA_GOODBYE, 1, 0); + if (user_online_del(db) < 0) + { + return -2; + } - log_std("User logout\n"); + mysql_close(db); + + display_file(DATA_GOODBYE, 1); + + log_common("User logout\n"); return 0; } @@ -188,20 +200,24 @@ int bbs_center() clearscr(); - show_top(""); + show_top("", BBS_name, ""); show_active_board(); show_bottom(""); display_menu(p_bbs_menu); + iflush(); while (!SYS_server_exit) { ch = igetch(100); - if (time(0) - t_last_action >= 10) + if (p_bbs_menu->choose_step == 0 && time(0) - t_last_action >= 10) { t_last_action = time(0); + show_active_board(); show_bottom(""); + display_menu_cursor(p_bbs_menu, 1); + iflush(); } switch (ch) @@ -222,8 +238,9 @@ int bbs_center() case EXITBBS: return 0; case REDRAW: + t_last_action = time(0); clearscr(); - show_top(""); + show_top("", BBS_name, ""); show_active_board(); show_bottom(""); display_menu(p_bbs_menu); @@ -233,7 +250,9 @@ int bbs_center() default: break; } + iflush(); } + BBS_last_access_tm = time(0); } @@ -242,59 +261,89 @@ int bbs_center() int bbs_main() { - MYSQL *db; + // Set data pools in shared memory readonly + if (set_trie_dict_shm_readonly() < 0) + { + goto cleanup; + } + if (set_article_block_shm_readonly() < 0) + { + goto cleanup; + } + if (set_section_list_shm_readonly() < 0) + { + goto cleanup; + } + + // Load menu in shared memory + if (set_menu_shm_readonly(p_bbs_menu) < 0) + { + goto cleanup; + } set_input_echo(0); // System info if (bbs_info() < 0) { - return -1; + goto cleanup; } - db = db_open(); - if (db == NULL) + // Welcome + if (bbs_welcome() < 0) { - prints("无法连接数据库\n"); - return -2; + goto cleanup; } - // Welcome - if (bbs_welcome(db) < 0) + // User login + if (SSH_v2) { - mysql_close(db); - return -3; + prints("\033[1m%s 欢迎使用ssh方式访问 \033[1;33m按任意键继续...\033[m", BBS_username); + iflush(); + igetch_t(MAX_DELAY_TIME); + } + else if (bbs_login() < 0) + { + goto cleanup; } - // User login - if (bbs_login(db) < 0) + // Load article view log + if (article_view_log_load(BBS_priv.uid, &BBS_article_view_log, 0) < 0) { - mysql_close(db); - return -4; + log_error("article_view_log_load() error\n"); + goto cleanup; } + clearscr(); // BBS Top 10 - display_file_ex("./var/bbs_top.txt", 1, 1); + display_file(VAR_BBS_TOP, 1); - // Load menu in shared memory - if (load_menu_shm(p_bbs_menu) < 0) + // Main + bbs_center(); + + // Logout + bbs_logout(); + + // Save incremental article view log + if (article_view_log_save_inc(&BBS_article_view_log) < 0) { - return -5; + log_error("article_view_log_save_inc() error\n"); } - // Main - bbs_center(); +cleanup: + // Unload article view log + article_view_log_unload(&BBS_article_view_log); - // Unload menu in shared memory - unload_menu_shm(p_bbs_menu); + // Detach menu in shared memory + detach_menu_shm(p_bbs_menu); free(p_bbs_menu); p_bbs_menu = NULL; - // Logout - bbs_logout(db); - - mysql_close(db); + // Detach data pools shm + detach_section_list_shm(); + detach_article_block_shm(); + detach_trie_dict_shm(); return 0; }