--- lbbs/src/bbs_main.c 2004/10/19 15:22:01 1.3 +++ lbbs/src/bbs_main.c 2005/03/17 10:48:46 1.16 @@ -1,5 +1,5 @@ /*************************************************************************** - bbsd.c - description + bbs_main.c - description ------------------- begin : Mon Oct 18 2004 copyright : (C) 2004 by Leaflet @@ -17,15 +17,236 @@ #include "bbs.h" #include "common.h" +#include "io.h" +#include "menu.h" +#include +#include +#include -//BBS enviroment -char BBS_name[50]; -int BBS_max_client = 256; +#define ACTIVE_BOARD_HEIGHT 8 int -bbs_main() +bbs_main () { - bbs_welcome(); - - return 0; + char temp[256]; + int ret; + + set_input_echo (0); + + bbs_info (); + + //Welcome + bbs_welcome (); + + //Login + ret = bbs_login (); + if (ret < 0) + return -1; + clearscr (); + + //BBS Top 10 + strcpy (temp, app_home_dir); + strcat (temp, "data/bbs_top.txt"); + display_file_ex (temp, 1, 1); + + //Main + bbs_center (); + + //Logout + bbs_exit (); + + return 0; +} + +int +bbs_info () +{ + prints ("»¶Ó­¹âÁÙ \033[1;33m%s \033[32m[%s] \033[37m( %s )\r\n", + BBS_name, BBS_server, app_version); + + iflush (); + + return 0; +} + +int +bbs_exit () +{ + char temp[256]; + + strcpy (temp, app_home_dir); + strcat (temp, "data/goodbye.txt"); + display_file_ex (temp, 1, 0); + + sleep (1); + + return 0; +} + +int +bbs_center () +{ + int ch, result; + char key; + time_t t_last_action; + fd_set inputs, testfds; + struct timeval timeout; + + FD_ZERO (&inputs); + FD_SET (0, &inputs); + + t_last_action = time (0); + + clearscr (); + + show_top ("²âÊÔ"); + show_active_board (); + display_menu (&bbs_main_menu); + show_bottom ("²âÊÔ"); + + while (1) + { + testfds = inputs; + timeout.tv_sec = 0; + timeout.tv_usec = 100000; + + result = select (FD_SETSIZE, &testfds, (fd_set *) NULL, + (fd_set *) NULL, &timeout); + + switch (result) + { + case 0: + break; + case -1: + log_error ("select() error!\n"); + break; + default: + if (FD_ISSET (0, &testfds)) + { + ch = igetch (); + + switch (ch) + { + case KEY_LEFT: + ch = 'G'; + default: + key = menu_control (&bbs_main_menu, ch); + switch (key) + { + case 'G': + return 0; + } + } + } + break; + } + if (time (0) - t_last_action >= 10) + { + t_last_action = time (0); + show_active_board (); + } + } + + return 0; +} + +int +show_top (char *status) +{ + char buffer[256]; + + str_space (buffer, 20 - strlen (BBS_current_section_name)); + + moveto (1, 0); + prints ("\033[1;44;33m%-20s \033[37m%20s" + " %s\033[33mÌÖÂÛÇø [%s]\033[m", + status, BBS_name, buffer, BBS_current_section_name); + iflush (); + + return 0; +} + +int +show_bottom (char *msg) +{ + char str_time[256], str_time_onine[20], buffer[256]; + time_t time_online; + struct tm *tm_online; + + get_time_str (str_time, 256); + str_space (buffer, 33 - strlen (BBS_username)); + + time_online = time (0) - BBS_login_tm; + tm_online = gmtime (&time_online); + + moveto (screen_lines, 0); + prints ("\033[1;44;33m[\033[36m%s\033[33m]" + "%sÕʺÅ[\033[36m%s\033[33m]" + "[\033[36m%1d\033[33m:\033[36m%2d\033[33m:\033[36m%2d\033[33m]\033[m", + str_time, buffer, BBS_username, tm_online->tm_mday - 1, + tm_online->tm_hour, tm_online->tm_min); + iflush (); + + return 0; +} + +int +show_active_board () +{ + char filename[256], buffer[260]; + FILE *fin; + int i, j; + static long int line; + + sprintf (filename, "%sdata/active_board.txt", app_home_dir); + + clrline (3, 2 + ACTIVE_BOARD_HEIGHT); + + moveto (3, 0); + + if ((fin = fopen (filename, "r")) != NULL) + { + for (j = 0; j < line; j++) + { + if (fgets (buffer, 255, fin) == NULL) + { + line = 0; + rewind (fin); + break; + } + } + + for (j = 0; j < ACTIVE_BOARD_HEIGHT; j++) + { + if (fgets (buffer, 255, fin) == NULL) + { + line = 0; + if (j == 0) + { + rewind (fin); + if (fgets (buffer, 255, fin) == NULL) + { + break; + } + } + else + { + break; + } + } + line++; + i = strlen (buffer); + if (buffer[i - 1] == '\n' && buffer[i - 2] != '\r') + { + buffer[i - 1] = '\r'; + buffer[i] = '\n'; + buffer[i + 1] = '\0'; + } + prints (buffer); + iflush (); + } + fclose (fin); + } + + return 0; }