#include #include #include #include #include #include "bbs.h" #include "lua/lua.h" #include "lua/lualib.h" #include "lua/lauxlib.h" extern struct bbs_config conf; extern struct user_record *gUser; extern int mynode; void display_bulletins() { int i; char buffer[PATH_MAX]; struct stat s; i = 0; sprintf(buffer, "%s/bulletin%d.ans", conf.ansi_path, i); while (stat(buffer, &s) == 0) { s_printf("\e[2J\e[1;1H"); s_displayansi_pause(buffer, 1); s_printf(get_string(185)); s_getc(); s_printf("\r\n"); i++; sprintf(buffer, "%s/bulletin%d.ans", conf.ansi_path, i); } } void active_nodes() { int i; struct stat s; char buffer[PATH_MAX]; FILE *fptr; for (i = 0; i < conf.nodes; i++) { snprintf(buffer, PATH_MAX, "%s/nodeinuse.%d", conf.bbs_path, i + 1); if (stat(buffer, &s) == 0) { fptr = fopen(buffer, "r"); if (fptr) { fgets(buffer, PATH_MAX, fptr); fclose(fptr); chomp(buffer); s_printf(get_string(216), i + 1, buffer); } } } } void send_node_msg() { char buffer[PATH_MAX]; char msg[257]; int nodetomsg = 0; struct stat s; FILE *fptr; s_printf(get_string(217)); active_nodes(); s_readstring(buffer, 4); nodetomsg = atoi(buffer); if (nodetomsg < 1 || nodetomsg > conf.nodes) { s_printf(get_string(218)); return; } s_printf(get_string(219)); s_readstring(msg, 256); snprintf(buffer, PATH_MAX, "%s/node%d", conf.bbs_path, nodetomsg); if (stat(buffer, &s) != 0) { mkdir(buffer, 0755); } snprintf(buffer, PATH_MAX, "%s/node%d/nodemsg.txt", conf.bbs_path, nodetomsg); fptr = fopen(buffer, "a"); if (fptr) { fprintf(fptr, get_string(220), gUser->loginname, mynode, msg); fclose(fptr); } } void display_textfiles() { int i; int redraw = 1; int start = 0; int selected = 0; char c; if (ptr_vector_len(&conf.text_files) == 0) { s_printf("\e[2J\e[1;1H"); s_printf(get_string(148)); s_printf(get_string(185)); s_getc(); s_printf("\r\n"); return; } while (1) { if (redraw) { s_printf("\e[2J\e[1;1H"); s_printf(get_string(143)); s_printf(get_string(144)); for (size_t i = start; i < start + 22 && i < ptr_vector_len(&conf.text_files); i++) { struct text_file *file = ptr_vector_get(&conf.text_files, i); s_printf(get_string(i == selected ? 249 : 250), i - start + 2, i, file->name); } s_printf("\e[%d;5H", selected - start + 2); redraw = 0; } c = s_getchar(); if (tolower(c) == 'q') { break; } else if (c == 27) { c = s_getchar(); if (c == 91) { c = s_getchar(); if (c == 66) { // down if (selected + 1 >= start + 22) { start += 22; if (start >= ptr_vector_len(&conf.text_files)) { start = ptr_vector_len(&conf.text_files) - 22; } redraw = 1; } selected++; if (selected >= ptr_vector_len(&conf.text_files)) { selected = ptr_vector_len(&conf.text_files) - 1; } else { if (!redraw) { struct text_file *prev_file = ptr_vector_get(&conf.text_files, selected - 1); struct text_file *file = ptr_vector_get(&conf.text_files, selected); assert(prev_file != NULL); assert(file != NULL); s_printf(get_string(250), selected - start + 1, selected - 1, prev_file->name); s_printf(get_string(249), selected - start + 2, selected, file->name); s_printf("\e[%d;5H", selected - start + 2); } } } else if (c == 65) { // up if (selected - 1 < start) { start -= 22; if (start < 0) { start = 0; } redraw = 1; } selected--; if (selected < 0) { selected = 0; } else { if (!redraw) { struct text_file *file = ptr_vector_get(&conf.text_files, selected); struct text_file *next_file = ptr_vector_get(&conf.text_files, selected + 1); s_printf(get_string(249), selected - start + 2, selected, file->name); s_printf(get_string(250), selected - start + 3, selected + 1, next_file->name); s_printf("\e[%d;5H", selected - start + 2); } } } else if (c == 75) { // END KEY selected = ptr_vector_len(&conf.text_files) - 1; start = selected - 21; if (start < 0) { start = 0; } redraw = 1; } else if (c == 72) { // HOME KEY selected = 0; start = 0; redraw = 1; } else if (c == 86 || c == '5') { if (c == '5') { s_getchar(); } // PAGE UP selected = selected - 22; if (selected < 0) { selected = 0; } start = selected; redraw = 1; } else if (c == 85 || c == '6') { if (c == '6') { s_getchar(); } // PAGE DOWN selected = selected + 22; if (selected >= ptr_vector_len(&conf.text_files)) { selected = ptr_vector_len(&conf.text_files) - 1; } start = selected; redraw = 1; } } } else if (c == 13) { struct text_file *file = ptr_vector_get(&conf.text_files, selected); assert(file != NULL); s_printf("\e[2J\e[1;1H"); s_displayansi_p(file->path); s_printf(get_string(185)); s_getc(); s_printf("\r\n"); redraw = 1; } } }