int x_lockscreen(void) { set_user_status(ST_LOCKSCREEN); screen_move(9, 0); screen_clrtobot(); screen_move(9, 0); prints("\033[1;37m" "\n _ _____ ___ _ _ ___ ___ __" "\n ( ) ( _ ) ( _`\\ ( ) ( ) ( _`\\ ( _`\\ | |" "\n | | | ( ) | | ( (_) | |/'/' | (_(_) | | ) | | |" "\n | | _ | | | | | | _ | , < | _)_ | | | ) | |" "\n | |_( ) | (_) | | (_( ) | |\\`\\ | (_( ) | |_) | |==|" "\n (____/' (_____) (____/' (_) (_) (____/' (____/' |__|\n" //% "\n\033[1;36m屏幕已在\033[33m %s\033[36m 时被%s暂时锁住了...\033[m", "\n\033[1;36m\xc6\xc1\xc4\xbb\xd2\xd1\xd4\xda\033[33m %s\033[36m \xca\xb1\xb1\xbb%s\xd4\xdd\xca\xb1\xcb\xf8\xd7\xa1\xc1\xcb...\033[m", format_time(fb_time(), TIME_FORMAT_ZH), currentuser.userid); char buf[PASSLEN + 1]; buf[0] = '\0'; while (*buf == '\0' || !passwd_check(currentuser.userid, buf)) { screen_move(18, 0); screen_clrtobot(); //% getdata(19, 0, "请输入您的密码以解锁: ", buf, PASSLEN, NOECHO, YEA); getdata(19, 0, "\xc7\xeb\xca\xe4\xc8\xeb\xc4\xfa\xb5\xc4\xc3\xdc\xc2\xeb\xd2\xd4\xbd\xe2\xcb\xf8: ", buf, PASSLEN, NOECHO, YEA); } return FULLUPDATE; }
// Register some signal handlers. static void system_init(void) { struct sigaction act; fb_signal(SIGHUP, terminal_schedule_exit); #ifndef lint fb_signal(SIGINT, SIG_IGN); fb_signal(SIGQUIT, SIG_IGN); fb_signal(SIGPIPE, SIG_IGN); #ifdef DOTIMEOUT set_user_status(ST_LOGIN); alarm(LOGIN_TIMEOUT); #else fb_signal(SIGALRM, SIG_SIG); #endif fb_signal(SIGTERM, SIG_IGN); fb_signal(SIGURG, SIG_IGN); fb_signal(SIGTSTP, SIG_IGN); fb_signal(SIGTTIN, SIG_IGN); #endif sigemptyset(&act.sa_mask); act.sa_flags = SA_NODEFER; act.sa_handler = msg_handler; sigaction(SIGUSR2, &act, NULL); { struct itimerval itv; memset(&itv,0, sizeof(struct itimerval)); itv.it_value.tv_sec = 2 * 60; setitimer(ITIMER_PROF, &itv, NULL); fb_signal(SIGPROF, exit); } }
// pager与msg设定 // int x_userdefine() { int id; unsigned int newlevel; set_user_status(ST_USERDEF); if (!(id = getuser(currentuser.userid))) { screen_move_clear(3); screen_printf("错误的使用者 ID..."); pressreturn(); screen_clear(); return 0; } screen_move(1, 0); screen_clrtobot(); screen_move(2, 0); use_define = 1; newlevel = setperms(lookupuser.userdefine, "参数", NUMDEFINES, showperminfo); screen_move(2, 0); if (newlevel == lookupuser.userdefine) screen_printf("参数没有修改...\n"); else { lookupuser.userdefine = newlevel; currentuser.userdefine = newlevel; substitut_record(PASSFILE, &lookupuser, sizeof(struct userec), id); screen_printf("新的参数设定完成...\n\n"); } pressreturn(); screen_clear(); use_define = 0; return 0; }
// pager与msg设定 // int x_userdefine() { int id; unsigned int newlevel; set_user_status(ST_USERDEF); if (!(id = getuser(currentuser.userid))) { screen_move_clear(3); //% prints("错误的使用者 ID..."); prints("\xb4\xed\xce\xf3\xb5\xc4\xca\xb9\xd3\xc3\xd5\xdf ID..."); pressreturn(); screen_clear(); return 0; } screen_move(1, 0); screen_clrtobot(); screen_move(2, 0); use_define = 1; //% newlevel = setperms(lookupuser.userdefine, "参数", NUMDEFINES, newlevel = setperms(lookupuser.userdefine, "\xb2\xce\xca\xfd", NUMDEFINES, showperminfo); screen_move(2, 0); if (newlevel == lookupuser.userdefine) //% prints("参数没有修改...\n"); prints("\xb2\xce\xca\xfd\xc3\xbb\xd3\xd0\xd0\xde\xb8\xc4...\n"); else { lookupuser.userdefine = newlevel; currentuser.userdefine = newlevel; substitut_record(PASSFILE, &lookupuser, sizeof(struct userec), id); //% prints("新的参数设定完成...\n\n"); prints("\xd0\xc2\xb5\xc4\xb2\xce\xca\xfd\xc9\xe8\xb6\xa8\xcd\xea\xb3\xc9...\n\n"); } pressreturn(); screen_clear(); use_define = 0; return 0; }
int t_query(const char *uname) { if (streq(currentuser.userid, "guest")) return DONOTHING; char userid[EXT_IDLEN + 1]; if (uname) { if (*uname == '\0') return DONOTHING; strlcpy(userid, uname, sizeof(userid)); strtok(userid, " "); } else { set_user_status(ST_QUERY); screen_flush(); screen_move(2, 0); screen_clrtobot(); screen_printf("<输入使用者代号, 按空白键可列出符合字串>"); user_complete(1, "查询谁: ", userid, sizeof(userid)); if (*userid == '\0') return FULLUPDATE; } if (tui_query_result(userid) != 0) { screen_move_clear(2); screen_printf("\033[1m不正确的使用者代号\033[m\n"); pressanykey(); return FULLUPDATE; } if (session_status() != ST_LUSERS && session_status() != ST_LAUSERS && session_status() != ST_FRIEND && session_status() != ST_GMENU) pressanykey(); return FULLUPDATE; }
//#define MY_DEBUG // 执行命令cmdfile,参数为param1 static void exec_cmd(int umode, int pager, char *cmdfile, char *param1) { char buf[160]; char *my_argv[18], *ptr; fb_signal(SIGALRM, SIG_IGN); set_user_status(umode); screen_clear(); screen_move(2, 0); if (!dashf(cmdfile)) { //% prints("文件 [%s] 不存在!\n", cmdfile); prints("\xce\xc4\xbc\xfe [%s] \xb2\xbb\xb4\xe6\xd4\xda\xa3\xa1\n", cmdfile); pressreturn(); return; } sprintf(buf, "%s %s %s %d", cmdfile, param1, currentuser.userid, getpid()); report(buf, currentuser.userid); my_argv[0] = cmdfile; strcpy(buf, param1); if (buf[0] != '\0') ptr = strtok(buf, " \t"); else ptr = NULL; for (int i = 1; i < 18; i++) { if (ptr) { my_argv[i] = ptr; ptr = strtok(NULL, " \t"); } else { my_argv[i] = NULL; } } #ifdef MY_DEBUG for (i = 0; i < 18; i++) { if (my_argv[i] != NULL) prints ("my_argv[%d] = %s\n", i, my_argv[i]); else prints ("my_argv[%d] = (none)\n", i); } pressanykey (); #else child_pid = fork(); if (child_pid == -1) { //% prints("资源紧缺,fork() 失败,请稍后再使用"); prints("\xd7\xca\xd4\xb4\xbd\xf4\xc8\xb1\xa3\xac""fork() \xca\xa7\xb0\xdc\xa3\xac\xc7\xeb\xc9\xd4\xba\xf3\xd4\xd9\xca\xb9\xd3\xc3"); child_pid = 0; pressreturn(); return; } if (child_pid == 0) { execv(cmdfile, my_argv); exit(0); } else { waitpid(child_pid, NULL, 0); } #endif child_pid = 0; screen_clear(); }
/** * The main entrance of bbswebd. * @return 0 on success, 1 on initialization error. */ int main(void) { fb_signal(SIGTERM, exit_handler); fb_signal(SIGUSR1, exit_handler); if (initialize() < 0) return EXIT_FAILURE; initialize_environment(INIT_CONV | INIT_DB | INIT_MDB); while (FCGI_Accept() >= 0) { if (!web_ctx_init()) return EXIT_FAILURE; const web_handler_t *h = _get_handler(); int code = BBS_ENOURL; if (h) { get_client_ip(); session_validate(); brc_reset(); if (session_get_id()) { if (h->status != ST_IDLE) set_user_status(h->status); session_set_idle(session_get_id(), fb_time()); if (h->status != ST_READING) session_set_board(0); } code = execute(h); } if (code > 0) web_respond(code); else check_bbserr(code); web_ctx_destroy(); } return 0; }
static tui_list_handler_t online_users_handler(tui_list_t *p, int ch) { online_users_t *up = p->data; online_user_info_t *ip = up->users + p->cur; p->valid = false; char buf[STRLEN]; switch (ch) { case 'h': case 'H': show_help("help/userlisthelp"); return FULLUPDATE; case 'm': case 'M': if (!HAS_PERM(PERM_MAIL)) return DONOTHING; m_send(ip->name); return FULLUPDATE; case 's': case 'S': if (streq(currentuser.userid, "guest") || !HAS_PERM(PERM_TALK) || !session_msgable(ip)) return DONOTHING; tui_send_msg(ip->name); return FULLUPDATE; case 'o': case 'O': return tui_follow_uname(ip->name); case 'd': case 'D': if (streq(currentuser.userid, "guest")) return DONOTHING; //% "确定不再关注 %s 吗?" snprintf(buf, sizeof(buf), "\xc8\xb7\xb6\xa8\xb2\xbb\xd4\xd9" "\xb9\xd8\xd7\xa2 %s \xc2\xf0?", ip->name); if (!askyn(buf, false, true)) return MINIUPDATE; { user_id_t uid = get_user_id(ip->name); if (uid > 0 && unfollow(session_get_user_id(), uid)) { //% "已取消关注 %s" snprintf(buf, sizeof(buf), "\xd2\xd1\xc8\xa1\xcf\xfb" "\xb9\xd8\xd7\xa2 %s", ip->name); presskeyfor(buf, -1); return PARTUPDATE; } } return MINIUPDATE; } if (p->in_query) return READ_AGAIN; switch (ch) { case 'Y': if (HAS_PERM(PERM_CLOAK)) { x_cloak(); up->uptime = 0; return PARTUPDATE; } return DONOTHING; case 'C': case 'c': return alter_nick(up); case 'k': case 'K': return kick_out(up, ip); case 'f': case 'F': up->follow = !up->follow; if (up->follow) set_user_status(ST_FRIEND); else set_user_status(ST_LUSERS); up->uptime = 0; return FULLUPDATE; case 'W': case 'w': if (streq(currentuser.userid, "guest")) return DONOTHING; up->show_note = !up->show_note; return PARTUPDATE; #if 0 case KEY_TAB: if (HAS_PERM(PERM_OCHAT)) { if (++(up->sort) > USRSORT_STATUS) up->sort = USRSORT_USERID; up->uptime = 0; return FULLUPDATE; } return DONOTHING; #endif case '\r': case '\n': case KEY_RIGHT: online_users_query(p); return DONOTHING; default: return READ_AGAIN; } }
//修改用户的档案 void x_edits() { char ans[7], buf[STRLEN]; int ch, num, confirm; const char *e_file[] = { "plans", "signatures", "notes", "logout", NULL }; //% "个人说明档", "签名档", "自己的备忘录", "离站的画面", //% "底部流动信息" const char *explain_file[] = { "\xb8\xf6\xc8\xcb\xcb\xb5\xc3\xf7\xb5\xb5", "\xc7\xa9\xc3\xfb\xb5\xb5", "\xd7\xd4\xbc\xba\xb5\xc4\xb1\xb8\xcd\xfc\xc2\xbc", "\xc0\xeb\xd5\xbe\xb5\xc4\xbb\xad\xc3\xe6", "\xb5\xd7\xb2\xbf\xc1\xf7\xb6\xaf\xd0\xc5\xcf\xa2", NULL }; set_user_status(ST_GMENU); screen_clear(); screen_move(1, 0); //% prints("编修个人档案\n\n"); prints("\xb1\xe0\xd0\xde\xb8\xf6\xc8\xcb\xb5\xb5\xb0\xb8\n\n"); for (num = 0; e_file[num] != NULL && explain_file[num] != NULL; num++) { prints("[[1;32m%d[m] %s\n", num + 1, explain_file[num]); } //% prints("[[1;32m%d[m] 都不想改\n", num + 1); prints("[[1;32m%d[m] \xb6\xbc\xb2\xbb\xcf\xeb\xb8\xc4\n", num + 1); //% getdata(num + 5, 0, "您要编修哪一项个人档案: ", ans, 2, DOECHO, YEA); getdata(num + 5, 0, "\xc4\xfa\xd2\xaa\xb1\xe0\xd0\xde\xc4\xc4\xd2\xbb\xcf\xee\xb8\xf6\xc8\xcb\xb5\xb5\xb0\xb8: ", ans, 2, DOECHO, YEA); if (ans[0] - '0' <= 0 || ans[0] - '0' > num || ans[0] == '\n' || ans[0] == '\0') return; ch = ans[0] - '0' - 1; setuserfile(genbuf, e_file[ch]); screen_move(3, 0); screen_clrtobot(); //% sprintf(buf, "(E)编辑 (D)删除 %s? [E]: ", explain_file[ch]); sprintf(buf, "(E)\xb1\xe0\xbc\xad (D)\xc9\xbe\xb3\xfd %s? [E]: ", explain_file[ch]); getdata(3, 0, buf, ans, 2, DOECHO, YEA); if (ans[0] == 'D' || ans[0] == 'd') { //% confirm = askyn("您确定要删除这个档案", NA, NA); confirm = askyn("\xc4\xfa\xc8\xb7\xb6\xa8\xd2\xaa\xc9\xbe\xb3\xfd\xd5\xe2\xb8\xf6\xb5\xb5\xb0\xb8", NA, NA); if (confirm != 1) { screen_move(5, 0); //% prints("取消删除行动\n"); prints("\xc8\xa1\xcf\xfb\xc9\xbe\xb3\xfd\xd0\xd0\xb6\xaf\n"); pressreturn(); screen_clear(); return; } unlink(genbuf); screen_move(5, 0); //% prints("%s 已删除\n", explain_file[ch]); prints("%s \xd2\xd1\xc9\xbe\xb3\xfd\n", explain_file[ch]); sprintf(buf, "delete %s", explain_file[ch]); report(buf, currentuser.userid); pressreturn(); screen_clear(); return; } set_user_status(ST_EDITUFILE); editor_e status = editor(genbuf, false, false, true, NULL); screen_clear(); if (status == EDITOR_SAVE) { //% prints("%s 更新过\n", explain_file[ch]); prints("%s \xb8\xfc\xd0\xc2\xb9\xfd\n", explain_file[ch]); sprintf(buf, "edit %s", explain_file[ch]); if (!strcmp(e_file[ch], "signatures")) { set_numofsig(); //% prints("系统重新设定以及读入您的签名档..."); prints("\xcf\xb5\xcd\xb3\xd6\xd8\xd0\xc2\xc9\xe8\xb6\xa8\xd2\xd4\xbc\xb0\xb6\xc1\xc8\xeb\xc4\xfa\xb5\xc4\xc7\xa9\xc3\xfb\xb5\xb5..."); } report(buf, currentuser.userid); } else { //% prints("%s 取消修改\n", explain_file[ch]); prints("%s \xc8\xa1\xcf\xfb\xd0\xde\xb8\xc4\n", explain_file[ch]); } pressreturn(); }
int main(int argc, char* argv[]) { int is_running = 1; int x_terminal_size, y_terminal_size; int is_lurking = 0; int is_yelling = 0; int in_deepsix = 0; int sending_im = 0; int i; /* josh-note: These need to be uncommented for the client connection to work. */ /* int client_id = init_client("Henry"); create a client. */ /* init_user_list(client_id); init the client size user list. */ log_init(); log_writeln(" --------------------------- "); log_writeln(" > Starting BlackChat"); signal(SIGALRM, scroll_ended_handler); for(i = 0; i < 26; i ++) { /* set our message to null */ memset(yell_messages[i], '\0', MAX_MESSAGE_LENGTH * sizeof(wchar_t)); } transcript_buffer = (wchar_t*)malloc(sizeof(wchar_t)*transcript_buffer_size); f_transcript_buffer = (wchar_t*)malloc(sizeof(wchar_t)*f_transcript_buffer_size); memset(client_buffer, '\0', sizeof(client_buffer)); memset(transcript_buffer, '\0', sizeof(transcript_buffer)); get_terminal_size(&x_terminal_size, &y_terminal_size); log_writeln(" > ... detecting current terminal size xy:(%d,%d)", x_terminal_size, y_terminal_size); log_writeln(" > ... initializing ncurses screen in raw mode"); initscr(); // start_color(); init_pair(0, COLOR_WHITE, COLOR_BLACK); init_pair(1, COLOR_GREEN, COLOR_BLACK); init_pair(2, COLOR_YELLOW, COLOR_BLACK); init_pair(3, COLOR_CYAN, COLOR_BLACK); init_pair(4, COLOR_MAGENTA, COLOR_BLACK); raw(); keypad(stdscr, TRUE); noecho(); color_set(0, NULL); log_writeln(" > ... creating transcript and client window"); transcript_window = newwin(TRANSCRIPT_MAX_ROWS,TRANSCRIPT_MAX_COLUMNS, 0,0); fullscreen_transcript_window = newwin(TRANSCRIPT_MAX_ROWS,TRANSCRIPT_MAX_COLUMNS*2, 0,0); client_chat_window = newwin(MAX_ROWS,MAX_COLUMNS,24,0); lurk_win = newwin(MAX_ROWS,MAX_COLUMNS,24,0); yell_win = newwin(23,40,0,0); deepsix_win = newwin(23,40,0,0); im_win = newwin(TRANSCRIPT_MAX_ROWS,TRANSCRIPT_MAX_COLUMNS, 0,0); status_win = newwin(3,40,21,40); info_win = newwin(3,40,0,40); // box(yell_win, '|', '-'); set_yell_message(0, L"Hello World"); set_yell_message(1, L"Yo dog!"); set_yell_message(2, L"Hey everyone!"); set_yell_message(3, L"Whats up?"); set_yell_message(12,L"I agree."); wcolor_set(lurk_win, 4, NULL); wcolor_set(transcript_window, 3, NULL); wcolor_set(client_chat_window, 4, NULL); wcolor_set(yell_win, 2, NULL); wprintw(lurk_win, "Lurking... Use CTRL-L to unLurk or CTRL-Q to quit."); log_writeln(" > ... creating other 9 windows"); init_other_windows(); log_writeln(" > ... [beginning transcript]"); write_to_transcript_window(L"***************************************"); write_to_transcript_window(L"******** Wecome to BlackChat! *********"); write_to_transcript_window(L"***************************************"); set_window_user_name(0, L"chris"); set_window_user_name(1, L"sue"); set_window_user_name(2, L"dan"); set_window_user_name(3, L"joe"); append_text_to_window(0, L"Sup!"); append_text_to_window(1, L"yo everyone, I'm in love with blackchat!"); append_text_to_window(2, L"hey, my name is Dan!"); append_text_to_window(3, L"Hey!?"); can_deepsix_user(0, 0); set_user_status(1, 'L'); set_user_status(2, 'L'); /* Set our info window text. */ wprintw(info_win, " Black Chat v1.0\n"); wprintw(info_win, "UI: Henry Stratmann|Client: Josh Hartman\n"); wprintw(info_win, "Server: Tyler Reid |Protocol: Tim Rhoads\n"); while(is_running) { int ch = getch(); /* wchar_t buf[512]; //get wchar_ts sprintf(buf, "key pressed: '%c' int value: %d\n", ch, ch); write_to_transcript_window(buf); */ //end get wchar_t /* Check if were in "Lurk" mode. */ if(is_lurking) { switch(ch) { case 12: /* lurk-off */ is_lurking = 0; print_client_chat_buffer(); break; case 17: /* quit */ is_running = 0; break; default: wrefresh(lurk_win); } } /* Check if were in IM mode. */ else if(sending_im) { /* TODO: Display list of users (like deepsix) to send IM to. All IM's will be displayed on the main transcript with some type of "marker" indicating that this was an IM. */ if(ch >= 48 && ch <= 57) { /* josh-note: Have josh send IM based on "ch" */ } /* quit */ if(ch == 17) { is_running = 0; } /* exit IM */ sending_im = 0; window_page_up(transcript_window, &transcript_current_line, TRANSCRIPT_MAX_COLUMNS, transcript_buffer); window_page_up(fullscreen_transcript_window, &transcript_current_line, TRANSCRIPT_MAX_COLUMNS*2, f_transcript_buffer); } /* Check if were in deepsix mode. */ else if(in_deepsix) { /* kick user */ if(ch >= 48 && ch <= 57) { /* josh-note: Have josh make a "kick_user(ch-48)" command. Also, have josh keep track of who user voted for and display message on transcript as to how user voted and/or if they already voted for the user. */ } /* quit */ if(ch == 17) { is_running = 0; } /* exit deepsix */ in_deepsix = 0; window_page_up(transcript_window, &transcript_current_line, TRANSCRIPT_MAX_COLUMNS, transcript_buffer); window_page_up(fullscreen_transcript_window, &transcript_current_line, TRANSCRIPT_MAX_COLUMNS*2, f_transcript_buffer); } /* Check if were yelling. */ else if(is_yelling) { // redrawwin(yell_win); // wrefresh(yell_win); int index = ch - 97; /* Write our comment to our transcript window. */ if(index >= 0 && index < 26) { if( yell_messages[index][0] != '\0' ) { write_to_transcript_window( yell_messages[index] ); } } is_yelling = 0; redrawwin(client_chat_window); wrefresh(client_chat_window); redrawwin(transcript_window); wrefresh(transcript_window); } else { /* Check what keys we pressed. */ switch(ch) { /* * Check if we pressed a control key. */ if(iscntrl(ch)) { case 7: /* CTRL-G */ gaudy_mode_on = (gaudy_mode_on == 1) ? 0 : 1; if(gaudy_mode_on) { client_buffer[ client_cursor_position++ ] = 2; } else { client_buffer[ client_cursor_position++ ] = 3; } /* Print out updates to the window. */ print_client_chat_buffer(); break; case 127:/* Backsapce Key (grok hack) */ case 8: /* CTRL-H */ client_buffer[ wcslen(client_buffer)-1 ] = '\0'; print_client_chat_buffer(); break; case 9: /* CTRL-I / TAB */ if(!sending_im) { sending_im = 1; draw_im_window(); } break; case 10: /* CTRL-J and CTRL-M */ /* UNCOMMENT ME FOR USE WITH SERVER */ { wchar_t *buf = NULL; /* If we had gaudy mode on, we need to disable it. */ if(gaudy_mode_on) { client_buffer[ client_cursor_position++ ] = 3; client_buffer[ client_cursor_position++ ] = ' '; gaudy_mode_on = 0; } /* Get our buffer togther to write to the transcript window. */ buf = (wchar_t*)malloc( (wcslen(L"[Client Says]: ")+wcslen(client_buffer)+1) * sizeof(wchar_t) ); write_to_transcript_window(L"[Client Says]: "); write_to_transcript_window(client_buffer); // sprintf(buf, "[Client Says]: %ls", client_buffer); // write_to_transcript_window(buf); } clear_text_from_client_typing_window(); /* write_out(client_id); enter key is pressed so send a message to the server. */ break; case 11: /* CTRL-K */ { int i; for(i = client_cursor_position+1; i < wcslen(client_buffer); i ++) { client_buffer[i] = '\0'; } } break; case 12: /* CTRL-L */ if(!is_lurking) { redrawwin(lurk_win); wrefresh(lurk_win); is_lurking = 1; } break; case 14: /* CTRL-N */ alarm(5); user_is_scrolling = 1; transcript_current_line ++; window_page_down( transcript_window, &transcript_current_line, TRANSCRIPT_MAX_COLUMNS, transcript_buffer ); window_page_down( fullscreen_transcript_window, &transcript_current_line, TRANSCRIPT_MAX_COLUMNS*2, f_transcript_buffer ); break; case 16: /* CTRL-P */ alarm(5); user_is_scrolling = 1; transcript_current_line --; window_page_up( transcript_window, &transcript_current_line, TRANSCRIPT_MAX_COLUMNS, transcript_buffer ); window_page_up( fullscreen_transcript_window, &transcript_current_line, TRANSCRIPT_MAX_COLUMNS*2, f_transcript_buffer ); break; case 17: /* CTRL-Q */ log_writeln(" > ... recived quit signal from client"); is_running = 0; break; case 20: /* CTRL-T */ if(transcript_maxed) { transcript_maxed = 0; window_page_up(transcript_window, &transcript_current_line, TRANSCRIPT_MAX_COLUMNS, transcript_buffer); wclear(fullscreen_transcript_window); wrefresh(fullscreen_transcript_window); } else { transcript_maxed = 1; window_page_up(fullscreen_transcript_window, &transcript_current_line, TRANSCRIPT_MAX_COLUMNS*2, f_transcript_buffer); wclear(transcript_window); wrefresh(transcript_window); } break; case 21: /* CTRL-U */ client_current_line = 0; client_cursor_position = 0; memset(client_buffer, '\0', wcslen(client_buffer)+1); print_client_chat_buffer(); break; case 23: /* CTRL-W */ delete_last_word_in_buffer(client_buffer); print_client_chat_buffer(); break; case 25: /* CTRL-Y */ { if(!is_yelling) { redrawwin(yell_win); wrefresh(yell_win); is_yelling = 1; } } break; case 29: /* CTRL-] */ alarm(0); user_is_scrolling = 0; print_transcript_chat_buffer(); break; case 30: /* CTRL-6 */ if(!in_deepsix) { draw_deepsix_window(); in_deepsix = 1; } break; /* * If we encountered an unkown escape wchar_tcter, break out of here so we don't * print it. */ break; /* TODO: Fix me! */ } #if 0 /* Scroll the clients typing window down. */ case KEY_DOWN: client_current_line ++; if(client_current_line*MAX_COLUMNS > wcslen(client_buffer)) client_current_line --; wclear(client_chat_window); wprintw(client_chat_window, &client_buffer[client_current_line*MAX_COLUMNS]); break; /* Scroll the clients typing window up. */ case KEY_UP: client_current_line --; if(client_current_line < 0) client_current_line = 0; wclear(client_chat_window); wprintw(client_chat_window, &client_buffer[client_current_line*MAX_COLUMNS]); break; #endif /* Delete the previous chracter. */ case KEY_BACKSPACE: /* Check if were deleting the last wchar_tacter. */ if( client_cursor_position == wcslen(client_buffer) ) { client_buffer[ client_cursor_position-1 ] = '\0'; client_cursor_position --; print_client_chat_buffer(); } else { /* If were here, that means were NOT deleting the last wchar_tacter. */ int i; for(i = client_cursor_position-1; i < wcslen(client_buffer); i ++) { client_buffer[i] = client_buffer[i+1]; } client_cursor_position --; print_client_chat_buffer(); } break; /* If were here, that means we didn't press any "special" keys so that means were * trying to write some generic wchar_tacters to our chat window. */ default: /* Make sure we don't print a control wchar_tacter. */ if(!iscntrl(ch)) { /* Check if were inserting a wchar_tacter before the end of our client * typing buffer. */ if( client_cursor_position != wcslen(client_buffer) ) { /* Move all wchar_tacters in front of the cursor up one. */ int i; for(i = wcslen(client_buffer)+1; i > client_cursor_position; i --) { client_buffer[i] = client_buffer[i-1]; } } /* Add the wchar_tacter to our buffer. */ client_buffer[ client_cursor_position++ ] = ch; /* Print our new/updated buffer. */ print_client_chat_buffer(); break; } } } /* Read from the server. */ /* josh-note Uncomment this! */ /* read_from_server(client_id); */ refresh_all_windows(is_lurking); } log_writeln(" > ... [ending transcript]"); log_writeln(" > ... freeing resources"); free_other_windows(); free(transcript_buffer); delwin(transcript_window); delwin(fullscreen_transcript_window); delwin(client_chat_window); delwin(status_win); delwin(info_win); delwin(im_win); delwin(deepsix_win); delwin(yell_win); endwin(); /* josh-note This should be uncommented to close down the client socket. */ /* close_client(client_id); */ log_writeln(" > ... closing client log"); log_writeln(" > ... bye bye for now!"); log_close(); return 0; }
int fill_reg_form(void) { reginfo_t reg; if (!strcmp("guest", currentuser.userid)) return 0; set_user_status(ST_NEW); screen_clear(); screen_move(2, 0); screen_clrtobot(); if (currentuser.userlevel & PERM_REGISTER) { //% prints("您已经完成本站的使用者注册手续, 欢迎加入本站的行列."); prints("\xc4\xfa\xd2\xd1\xbe\xad\xcd\xea\xb3\xc9\xb1\xbe\xd5\xbe\xb5\xc4\xca\xb9\xd3\xc3\xd5\xdf\xd7\xa2\xb2\xe1\xca\xd6\xd0\xf8, \xbb\xb6\xd3\xad\xbc\xd3\xc8\xeb\xb1\xbe\xd5\xbe\xb5\xc4\xd0\xd0\xc1\xd0."); pressreturn(); return 0; } if (is_reg_pending(currentuser.userid)) { //% prints("站长尚未处理您的注册申请单, 您先到处看看吧."); prints("\xd5\xbe\xb3\xa4\xc9\xd0\xce\xb4\xb4\xa6\xc0\xed\xc4\xfa\xb5\xc4\xd7\xa2\xb2\xe1\xc9\xea\xc7\xeb\xb5\xa5, \xc4\xfa\xcf\xc8\xb5\xbd\xb4\xa6\xbf\xb4\xbf\xb4\xb0\xc9."); pressreturn(); return 0; } memset(®, 0, sizeof(reg)); strlcpy(reg.userid, currentuser.userid, sizeof(reg.userid)); strlcpy(reg.email, currentuser.email, sizeof(reg.email)); while (1) { screen_move(3, 0); clrtoeol(); //% prints("%s 您好, 请据实填写以下的资料:\n", currentuser.userid); prints("%s \xc4\xfa\xba\xc3, \xc7\xeb\xbe\xdd\xca\xb5\xcc\xee\xd0\xb4\xd2\xd4\xcf\xc2\xb5\xc4\xd7\xca\xc1\xcf:\n", currentuser.userid); do { //% getfield(6, "请用中文", "真实姓名", getfield(6, "\xc7\xeb\xd3\xc3\xd6\xd0\xce\xc4", "\xd5\xe6\xca\xb5\xd0\xd5\xc3\xfb", reg.realname, sizeof(reg.realname)); } while (strlen(reg.realname) < 4); do { //% getfield(8, "学校系级或所在单位", "学校系级", getfield(8, "\xd1\xa7\xd0\xa3\xcf\xb5\xbc\xb6\xbb\xf2\xcb\xf9\xd4\xda\xb5\xa5\xce\xbb", "\xd1\xa7\xd0\xa3\xcf\xb5\xbc\xb6", reg.dept, sizeof(reg.dept)); } while (strlen(reg.dept) < 6); do { //% getfield(10, "包括寝室或门牌号码", "目前住址", getfield(10, "\xb0\xfc\xc0\xa8\xc7\xde\xca\xd2\xbb\xf2\xc3\xc5\xc5\xc6\xba\xc5\xc2\xeb", "\xc4\xbf\xc7\xb0\xd7\xa1\xd6\xb7", reg.addr, sizeof(reg.addr)); } while (strlen(reg.addr) < 10); do { //% getfield(12, "包括可联络时间", "联络电话", getfield(12, "\xb0\xfc\xc0\xa8\xbf\xc9\xc1\xaa\xc2\xe7\xca\xb1\xbc\xe4", "\xc1\xaa\xc2\xe7\xb5\xe7\xbb\xb0", reg.phone, sizeof(reg.phone)); } while (strlen(reg.phone) < 8); //% getfield(14, "校友会或毕业学校", "校 友 会", getfield(14, "\xd0\xa3\xd3\xd1\xbb\xe1\xbb\xf2\xb1\xcf\xd2\xb5\xd1\xa7\xd0\xa3", "\xd0\xa3 \xd3\xd1 \xbb\xe1", reg.assoc, sizeof(reg.assoc)); char ans[3]; getdata(-1, 0, //% "以上资料是否正确, 按 Q 放弃注册 (Y/N/Quit)? [Y]: ", "\xd2\xd4\xc9\xcf\xd7\xca\xc1\xcf\xca\xc7\xb7\xf1\xd5\xfd\xc8\xb7, \xb0\xb4 Q \xb7\xc5\xc6\xfa\xd7\xa2\xb2\xe1 (Y/N/Quit)? [Y]: ", ans, sizeof(ans), DOECHO, YEA); if (ans[0] == 'Q' || ans[0] == 'q') return 0; if (ans[0] != 'N' && ans[0] != 'n') break; } reg.regdate = time(NULL); append_reg_list(®); return 0; }