X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fclient_chat.c;h=c1cc8f44fdaf54ba71957bbe1cac228fdda99c4e;hb=12a85fff011904123f3ad00f3392ddd74eb82b30;hp=a5a2f45898531e91b27f4d8d1f1601789d2b88c7;hpb=5c726c0fc290dcbc8a89c34573856b7b46b24d41;p=citadel.git diff --git a/citadel/client_chat.c b/citadel/client_chat.c index a5a2f4589..c1cc8f44f 100644 --- a/citadel/client_chat.c +++ b/citadel/client_chat.c @@ -1,11 +1,9 @@ /* - * Citadel/UX - * - * client_chat.c -- front end for chat mode - * (the "single process" version - no more fork() anymore) - * * $Id$ * + * front end for chat mode + * (the "single process" version - no more fork() anymore) + * */ #include "sysdep.h" @@ -17,17 +15,28 @@ #include #include #include -#include + +#if TIME_WITH_SYS_TIME +# include +# include +#else +# if HAVE_SYS_TIME_H +# include +# else +# include +# endif +#endif + #include #ifdef HAVE_SYS_SELECT_H #include #endif #include #include "citadel.h" +#include "citadel_ipc.h" #include "client_chat.h" #include "commands.h" #include "routines.h" -#include "ipc.h" #include "citadel_decls.h" #include "tools.h" #include "rooms.h" @@ -35,270 +44,274 @@ #ifndef HAVE_SNPRINTF #include "snprintf.h" #endif +#include "screen.h" #define MIN(a, b) ((a) < (b) ? (a) : (b)) -extern struct CtdlServInfo serv_info; extern char temp[]; -void getline(char *, int); +void ctdl_getline(char *, int); + +char last_paged[SIZ] = ""; -void chatmode(void) { - char wbuf[256]; - char buf[256]; - char c_user[256]; - char c_text[256]; - char c_room[256]; - char last_user[256]; +void chatmode(CtdlIPC *ipc) +{ + char wbuf[SIZ]; + char buf[SIZ]; + char c_user[SIZ]; + char c_text[SIZ]; + char c_room[SIZ]; + char last_user[SIZ]; int send_complete_line; int recv_complete_line; char ch; - int a,pos; - + int a, pos; + time_t last_transmit; + fd_set rfds; struct timeval tv; int retval; - serv_puts("CHAT"); - serv_gets(buf); - if (buf[0]!='8') { - printf("%s\n",&buf[4]); + CtdlIPC_chat_send(ipc, "CHAT"); + CtdlIPC_chat_recv(ipc, buf); + if (buf[0] != '8') { + scr_printf("%s\n", &buf[4]); return; - } - - printf("Entering chat mode (type /quit to exit, /help for other cmds)\n"); - set_keepalives(KA_CHAT); + } + scr_printf("Entering chat mode " + "(type /quit to exit, /help for other cmds)\n"); + set_keepalives(KA_NO); + last_transmit = time(NULL); - strcpy(buf,""); - strcpy(wbuf,""); + strcpy(buf, ""); + strcpy(wbuf, ""); color(BRIGHT_YELLOW); - printf("> "); + sln_printf_if("\n"); + sln_printf("> "); send_complete_line = 0; recv_complete_line = 0; - while(1) { - fflush(stdout); - FD_ZERO(&rfds); - FD_SET(0,&rfds); - FD_SET(getsockfd(),&rfds); - tv.tv_sec = S_KEEPALIVE; - tv.tv_usec = 0; - retval = select(getsockfd()+1, &rfds, NULL, NULL, &tv); + while (1) { + sln_flush(); + FD_ZERO(&rfds); + FD_SET(0, &rfds); + FD_SET(CtdlIPC_getsockfd(ipc), &rfds); + tv.tv_sec = S_KEEPALIVE; + tv.tv_usec = 0; + retval = select(CtdlIPC_getsockfd(ipc) + 1, &rfds, + NULL, NULL, &tv); - if (FD_ISSET(getsockfd(), &rfds)) { - ch = serv_getc(); - if (ch == 10) { + /* If there's data from the server... */ + if (FD_ISSET(CtdlIPC_getsockfd(ipc), &rfds)) { + CtdlIPC_chat_recv(ipc, buf); recv_complete_line = 1; - goto RCL; /* ugly, but we've gotta get out! */ - } - else { - buf[strlen(buf) + 1] = 0; - buf[strlen(buf)] = ch; - } - goto RCL; + goto RCL; /* ugly, but we've gotta get out! */ } - if (FD_ISSET(0, &rfds)) { - ch = inkey(); - if ((ch == 10) || (ch == 13)) { - send_complete_line = 1; - } - else if ((ch == 8) || (ch == 127)) { - if (strlen(wbuf) > 0) { - wbuf[strlen(wbuf)-1] = 0; - printf("%c %c",8,8); + /* If there's data from the keyboard... */ + if (FD_ISSET(0, &rfds)) { + ch = scr_getc(SCR_BLOCK); + if ((ch == 10) || (ch == 13)) { + send_complete_line = 1; + } else if ((ch == 8) || (ch == 127)) { + if (strlen(wbuf) > 0) { + wbuf[strlen(wbuf) - 1] = 0; + sln_printf("%c %c", 8, 8); } - } - else { - putc(ch,stdout); - wbuf[strlen(wbuf) + 1] = 0; - wbuf[strlen(wbuf)] = ch; + } else { + sln_putc(ch); + wbuf[strlen(wbuf) + 1] = 0; + wbuf[strlen(wbuf)] = ch; } } - - /* if the user hit return, send the line */ -RCL: if (send_complete_line) { - serv_puts(wbuf); - strcpy(wbuf,""); - send_complete_line = 0; - } - - /* if it's time to word wrap, send a partial line */ - if ( strlen(wbuf) >= (77-strlen(fullname)) ) { - pos = 0; - for (a=0; a= (77 - strlen(fullname))) { + pos = 0; + for (a = 0; a < strlen(wbuf); ++a) { + if (wbuf[a] == 32) + pos = a; } - else { - wbuf[pos] = 0; - serv_puts(wbuf); - strcpy(wbuf,&wbuf[pos+1]); + if (pos == 0) { + CtdlIPC_chat_send(ipc, wbuf); + last_transmit = time(NULL); + strcpy(wbuf, ""); + send_complete_line = 0; + } else { + wbuf[pos] = 0; + CtdlIPC_chat_send(ipc, wbuf); + last_transmit = time(NULL); + strcpy(wbuf, &wbuf[pos + 1]); } } - if (recv_complete_line) { - printf("\r%79s\r",""); - if (!strcmp(buf,"000")) { - color(BRIGHT_WHITE); - printf("Exiting chat mode\n"); - - fflush(stdout); - set_keepalives(KA_YES); - + if (recv_complete_line) { + sln_printf("\r%79s\r", ""); + if (!strcmp(buf, "000")) { + color(BRIGHT_WHITE); + sln_printf("\rExiting chat mode\n"); + sln_flush(); + set_keepalives(KA_YES); - /* Some users complained about the client and server - * losing protocol synchronization when exiting chat. - * This little dialog forces everything to be - * hunky-dory. - */ - serv_puts("ECHO __ExitingChat__"); - do { - serv_gets(buf); - } while (strcmp(buf, "200 __ExitingChat__")); - - - return; + /* Some users complained about the client and + * server losing protocol synchronization when + * exiting chat. This little dialog forces + * everything to be hunky-dory. + */ + CtdlIPC_chat_send(ipc, "ECHO __ExitingChat__"); + do { + CtdlIPC_chat_recv(ipc, buf); + } while (strcmp(buf, "200 __ExitingChat__")); + return; } - if (num_parms(buf)>=2) { - extract(c_user,buf,0); - extract(c_text,buf,1); - if (num_parms(buf)>2) - { - extract(c_room,buf,2); - printf("Got room %s\n", c_room); - } - - if (strucmp(c_text,"NOOP")) { - if (!strcmp(c_user, fullname)) { - color(BRIGHT_YELLOW); - } - else if (!strcmp(c_user,":")) { - color(BRIGHT_RED); - } - else { - color(BRIGHT_GREEN); - } - if (strcmp(c_user,last_user)) { - snprintf(buf,sizeof buf,"%s: %s",c_user,c_text); + if (num_parms(buf) >= 2) { + extract_token(c_user, buf, 0, '|', sizeof c_user); + extract_token(c_text, buf, 1, '|', sizeof c_text); + if (num_parms(buf) > 2) { + extract_token(c_room, buf, 2, '|', sizeof c_room); + scr_printf("Got room %s\n", c_room); + } + if (strcasecmp(c_text, "NOOP")) { + if (!strcmp(c_user, fullname)) { + color(BRIGHT_YELLOW); + } else if (!strcmp(c_user, ":")) { + color(BRIGHT_RED); + } else { + color(BRIGHT_GREEN); } - else { - size_t i = MIN(sizeof buf - 1, - strlen(c_user) + 2); + if (strcmp(c_user, last_user)) { + snprintf(buf, sizeof buf, "%s: %s", c_user, c_text); + } else { + size_t i = MIN(sizeof buf - 1, + strlen(c_user) + 2); - memset(buf, ' ', i); - safestrncpy(&buf[i], c_text, - sizeof buf - i); + memset(buf, ' ', i); + safestrncpy(&buf[i], c_text, + sizeof buf - i); } - while (strlen(buf)<79) strcat(buf," "); - if (strcmp(c_user,last_user)) { - printf("\r%79s\n",""); - strcpy(last_user,c_user); + while (strlen(buf) < 79) + strcat(buf, " "); + if (strcmp(c_user, last_user)) { + sln_printf("\r%79s\n", ""); + strcpy(last_user, c_user); } - printf("\r%s\n",buf); - fflush(stdout); + scr_printf("\r%s\n", buf); + scr_flush(); } } - color(BRIGHT_YELLOW); - printf("> %s",wbuf); - recv_complete_line = 0; - strcpy(buf,""); + color(BRIGHT_YELLOW); + sln_printf("\r> %s", wbuf); + sln_flush(); + recv_complete_line = 0; + strcpy(buf, ""); } - } + + /* If the user is sitting idle, send a half-keepalive to the + * server to prevent session timeout. + */ + if ((time(NULL) - last_transmit) >= S_KEEPALIVE) { + CtdlIPC_chat_send(ipc, "NOOP"); + last_transmit = time(NULL); + } + } +} /* - * send an express message + * send an instant message */ -void page_user() { - static char last_paged[32] = ""; - char buf[256], touser[256], msg[256]; +void page_user(CtdlIPC *ipc) +{ + char buf[SIZ], touser[SIZ], msg[SIZ]; FILE *pagefp; strcpy(touser, last_paged); strprompt("Page who", touser, 30); /* old server -- use inline paging */ - if (serv_info.serv_paging_level == 0) { - newprompt("Message: ", msg, 69); - snprintf(buf,sizeof buf,"SEXP %s|%s",touser,msg); - serv_puts(buf); - serv_gets(buf); + if (ipc->ServInfo.paging_level == 0) { + newprompt("Message: ", msg, 69); + snprintf(buf, sizeof buf, "SEXP %s|%s", touser, msg); + CtdlIPC_chat_send(ipc, buf); + CtdlIPC_chat_recv(ipc, buf); if (!strncmp(buf, "200", 3)) { - strcpy(last_paged, touser); - } - printf("%s\n", &buf[4]); + strcpy(last_paged, touser); + } + scr_printf("%s\n", &buf[4]); return; } - - /* new server -- use extended paging */ - else if (serv_info.serv_paging_level >= 1) { + /* new server -- use extended paging */ + else if (ipc->ServInfo.paging_level >= 1) { snprintf(buf, sizeof buf, "SEXP %s||", touser); - serv_puts(buf); - serv_gets(buf); + CtdlIPC_chat_send(ipc, buf); + CtdlIPC_chat_recv(ipc, buf); if (buf[0] != '2') { - printf("%s\n", &buf[4]); + scr_printf("%s\n", &buf[4]); return; - } - - if ( make_message(temp, touser, 0, 0, 0) != 0 ) { - printf("No message sent.\n"); + } + if (client_make_message(ipc, temp, touser, 0, 0, 0, NULL) != 0) { + scr_printf("No message sent.\n"); return; } - pagefp = fopen(temp, "r"); unlink(temp); snprintf(buf, sizeof buf, "SEXP %s|-", touser); - serv_puts(buf); - serv_gets(buf); - if (buf[0]=='4') { - strcpy(last_paged, touser); - while (fgets(buf, 256, pagefp) != NULL) { - buf[strlen(buf)-1] = 0; - serv_puts(buf); - } + CtdlIPC_chat_send(ipc, buf); + CtdlIPC_chat_recv(ipc, buf); + if (buf[0] == '4') { + strcpy(last_paged, touser); + while (fgets(buf, sizeof buf, pagefp) != NULL) { + buf[strlen(buf) - 1] = 0; + CtdlIPC_chat_send(ipc, buf); + } fclose(pagefp); - serv_puts("000"); - printf("Message sent.\n"); - } - else { - printf("%s\n", &buf[4]); + CtdlIPC_chat_send(ipc, "000"); + scr_printf("Message sent.\n"); + } else { + scr_printf("%s\n", &buf[4]); } } } +void quiet_mode(CtdlIPC *ipc) +{ + static int quiet = 0; + char cret[SIZ]; + int r; + r = CtdlIPCEnableInstantMessageReceipt(ipc, !quiet, cret); + if (r / 100 == 2) { + quiet = !quiet; + scr_printf("Quiet mode %sabled (%sother users may page you)\n", + (quiet) ? "en" : "dis", + (quiet) ? "no " : ""); + } else { + scr_printf("Unable to change quiet mode: %s\n", cret); + } +} -void quiet_mode(void) { - int qstate; - char buf[256]; - serv_puts("DEXP 2"); - serv_gets(buf); - if (buf[0]!='2') { - printf("%s\n", &buf[4]); - return; - } - qstate = atoi(&buf[4]); - if (qstate == 0) qstate = 1; - else qstate = 0; - sprintf(buf, "DEXP %d", qstate); - serv_puts(buf); - serv_gets(buf); - if (buf[0]!='2') { - printf("%s\n", &buf[4]); - return; - } - qstate = atoi(&buf[4]); - if (qstate) { - printf("Quiet mode enabled (no other users may page you)\n"); - } - else { - printf("Quiet mode disabled (other users may page you)\n"); +void stealth_mode(CtdlIPC *ipc) +{ + static int stealth = 0; + char cret[SIZ]; + int r; + + r = CtdlIPCStealthMode(ipc, !stealth, cret); + if (r / 100 == 2) { + stealth = !stealth; + scr_printf("Stealth mode %sabled (you are %s)\n", + (stealth) ? "en" : "dis", + (stealth) ? "invisible" : "listed as online"); + } else { + scr_printf("Unable to change stealth mode: %s\n", cret); } }