AmendHub

jcs

/

subtext

/

amendments

/

550

session: Note each session's current area, show it in 'who' menu


jcs made amendment 550 20 days ago
--- console.c Mon Apr 10 22:23:29 2023 +++ console.c Fri Nov 17 11:24:43 2023 @@ -83,6 +83,11 @@ console_init(void) return NULL; } + strlcpy(console->session->location, "Console", + sizeof(console->session->location)); + strlcpy(console->session->log.location, console->session->location, + sizeof(console->session->log.location)); + memset(console->chars, ' ', sizeof(console->chars)); console->ncolumns = DEFAULT_TERMINAL_COLUMNS; console->nlines = DEFAULT_TERMINAL_LINES; --- session.c Thu Aug 3 09:03:02 2023 +++ session.c Fri Nov 17 11:32:32 2023 @@ -46,6 +46,21 @@ static char session_log_tbuf[256]; static const char invalid_option_help[] = "Invalid option (press {{B}}?{{/B}} for help)\r\n"; +/* must match session_area order */ +static const char area_labels[][12] = { + "Main Menu", + "MOTD", + "Boards", + "FTN Boards", + "Chat", + "Mail", + "Files", + "Who", + "Recents", + "Settings", + "Signup" +}; + void session_run(struct uthread *uthread, void *arg); void session_print_menu(struct session *session, bool short_menu); short session_login(struct session *s); @@ -84,6 +99,9 @@ session_create(char *node, char *via, struct node_func strlcpy(session->node, node, sizeof(session->node)); strlcpy(session->log.node, node, sizeof(session->log.node)); strlcpy(session->via, via, sizeof(session->via)); + strlcpy(session->location, "Unknown", sizeof(session->location)); + strlcpy(session->log.location, session->location, + sizeof(session->log.location)); session->last_input_at = session->established_at = Time; session->obuf_canary = 0xffffffff; @@ -125,6 +143,7 @@ session_run(struct uthread *uthread, void *arg) /* until we negotiate otherwise */ s->terminal_columns = DEFAULT_TERMINAL_COLUMNS; s->terminal_lines = DEFAULT_TERMINAL_LINES; + s->area = SESSION_AREA_MAIN_MENU; if (main_menu_options == NULL) panic("No main menu!"); @@ -220,14 +239,17 @@ session_run(struct uthread *uthread, void *arg) } } + s->area = SESSION_AREA_MOTD; session_print_motd(s, false); main_menu: + s->area = SESSION_AREA_MAIN_MENU; session_output(s, "\r\n", 2); session_print_menu(s, false); session_flush(s); while (!done && !s->ending) { + s->area = SESSION_AREA_MAIN_MENU; session_printf(s, "{{B}}Main Menu>{{/B}} "); session_flush(s); @@ -284,12 +306,15 @@ get_another_char: switch (action) { case ACTION_BOARD_SHOW_FIRST: + s->area = SESSION_AREA_BOARDS; board_show(s, 1, NULL); break; case ACTION_CHAT: + s->area = SESSION_AREA_CHAT; chat_start(s, NULL); break; case ACTION_FILES_MENU: + s->area = SESSION_AREA_FILES; folder_list(s); break; case ACTION_GOODBYE: @@ -299,15 +324,19 @@ get_another_char: done = true; break; case ACTION_RECENT_LOGINS: + s->area = SESSION_AREA_RECENT_LOGINS; session_recents(s); break; case ACTION_MAIL_MENU: + s->area = SESSION_AREA_MAIL; mail_menu(s); break; case ACTION_MAIL_COMPOSE: + s->area = SESSION_AREA_MAIL; mail_compose(s, NULL, NULL, NULL, NULL); break; case ACTION_MOTD: + s->area = SESSION_AREA_MOTD; session_print_motd(s, true); break; case ACTION_PAGE_ANSWER: @@ -316,16 +345,20 @@ get_another_char: session_flush(s); break; } + s->area = SESSION_AREA_CHAT; session_answer_page(s); break; case ACTION_PAGE_SEND: session_page_sysop(s); break; case ACTION_SETTINGS: - if (s->user) + if (s->user) { + s->area = SESSION_AREA_SETTINGS; user_settings_menu(s); + } break; case ACTION_SIGNUP: + s->area = SESSION_AREA_SIGNUP; if ((s->user = signup(s))) { session_printf(s, "\r\n" "Welcome, {{B}}%s{{/B}}!\r\n", s->user->username); @@ -333,42 +366,55 @@ get_another_char: } break; case ACTION_WHOS_ONLINE: + s->area = SESSION_AREA_WHO; session_who(s); break; case ACTION_BOARD_LIST_BOARDS: + s->area = SESSION_AREA_BOARDS; board_list_boards(s); break; case ACTION_BOARD_LIST_FTN_AREAS: + s->area = SESSION_AREA_FTN; board_list_ftn_areas(s); break; case ACTION_BOARD_SHOW_1: + s->area = SESSION_AREA_BOARDS; board_show(s, 1, NULL); break; case ACTION_BOARD_SHOW_2: + s->area = SESSION_AREA_BOARDS; board_show(s, 2, NULL); break; case ACTION_BOARD_SHOW_3: + s->area = SESSION_AREA_BOARDS; board_show(s, 3, NULL); break; case ACTION_BOARD_SHOW_4: + s->area = SESSION_AREA_BOARDS; board_show(s, 4, NULL); break; case ACTION_BOARD_SHOW_5: + s->area = SESSION_AREA_BOARDS; board_show(s, 5, NULL); break; case ACTION_BOARD_SHOW_6: + s->area = SESSION_AREA_BOARDS; board_show(s, 6, NULL); break; case ACTION_BOARD_SHOW_7: + s->area = SESSION_AREA_BOARDS; board_show(s, 7, NULL); break; case ACTION_BOARD_SHOW_8: + s->area = SESSION_AREA_BOARDS; board_show(s, 8, NULL); break; case ACTION_BOARD_SHOW_9: + s->area = SESSION_AREA_BOARDS; board_show(s, 9, NULL); break; case ACTION_BOARD_SHOW_10: + s->area = SESSION_AREA_BOARDS; board_show(s, 10, NULL); break; case ACTION_SYSOP_MENU: @@ -1689,7 +1735,7 @@ session_who(struct session *s) session_printf(s, "{{B}}Who's Online{{/B}}\r\n"); session_printf(s, - "{{B}}Node User Via Speed Idle Location{{/B}}\r\n"); + "{{B}}Node User Via Speed Cur Area Idle Location{{/B}}\r\n"); session_flush(s); for (n = 0; n < MAX_SESSIONS; n++) { @@ -1698,23 +1744,24 @@ session_who(struct session *s) idle = Time - sessions[n]->last_input_at; if (idle < 60) - sprintf(idle_s, "%lus", idle); + snprintf(idle_s, sizeof(idle_s), "%lus", idle); else if (idle < (60 * 60)) - sprintf(idle_s, "%lum", idle / 60); + snprintf(idle_s, sizeof(idle_s), "%lum", idle / 60); else if (idle < (60 * 60 * 24)) - sprintf(idle_s, "%luh", idle / (60 * 60)); + snprintf(idle_s, sizeof(idle_s), "%luh", idle / (60 * 60)); else - sprintf(idle_s, "%lud", idle / (60 * 60 * 24)); + snprintf(idle_s, sizeof(idle_s), "%lud", idle / (60 * 60 * 24)); snprintf(username, sizeof(username), "%s%s", sessions[n]->user ? sessions[n]->user->username : GUEST_USERNAME, sessions[n]->user && sessions[n]->user->is_sysop ? " (sysop)" : ""); - session_printf(s, "%-7s %-17s %-7s %-6u %-5s %-32s\r\n", + session_printf(s, "%-7s %-17s %-7s %-6u %-10s %-5s %-22s\r\n", sessions[n]->node, username, sessions[n]->via, sessions[n]->tspeed, + area_labels[sessions[n]->area], idle_s, sessions[n]->location); } --- session.h Wed Jun 14 16:48:55 2023 +++ session.h Fri Nov 17 10:55:03 2023 @@ -29,6 +29,21 @@ enum session_input_state { SESSION_INPUT_CHAR }; +/* must keep sessions area_labels[] in sync */ +enum session_area { + SESSION_AREA_MAIN_MENU, + SESSION_AREA_MOTD, + SESSION_AREA_BOARDS, + SESSION_AREA_FTN, + SESSION_AREA_CHAT, + SESSION_AREA_MAIL, + SESSION_AREA_FILES, + SESSION_AREA_WHO, + SESSION_AREA_RECENT_LOGINS, + SESSION_AREA_SETTINGS, + SESSION_AREA_SIGNUP +}; + #define DEFAULT_TERMINAL_COLUMNS 80 #define DEFAULT_TERMINAL_LINES 24 #define MIN_TERMINAL_COLUMNS 20 @@ -102,6 +117,7 @@ struct session { char chatting_with_node[16]; char chat_username[DB_USERNAME_LENGTH + 1]; bool chatting; + short area; struct session_log log; struct user *user; void *cookie;