4 * Functions which implement the chat and paging facilities.
10 * display the form for paging (x-messaging) another user
12 void display_page(void)
16 strcpy(recp, bstr("recp"));
18 output_headers(1, 1, 2, 0, 0, 0);
19 wprintf("<div id=\"banner\">\n"
20 "<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#444455\"><TR><TD>"
21 "<SPAN CLASS=\"titlebar\">");
22 wprintf(_("Send instant message"));
24 "</TD></TR></TABLE>\n"
25 "</div>\n<div id=\"content\">\n"
28 wprintf("<div id=\"fix_scrollbar_bug\">"
29 "<table border=0 width=100%% bgcolor=\"#ffffff\"><tr><td>\n");
31 wprintf(_("Send an instant message to: "));
35 wprintf("<FORM METHOD=\"POST\" action=\"page_user\">\n");
37 wprintf("<TABLE border=0 width=100%%><TR><TD>\n");
39 wprintf("<INPUT TYPE=\"hidden\" NAME=\"recp\" VALUE=\"");
43 wprintf("<INPUT TYPE=\"hidden\" NAME=\"closewin\" VALUE=\"");
44 escputs(bstr("closewin"));
47 wprintf(_("Enter message text:"));
50 wprintf("<TEXTAREA NAME=\"msgtext\" wrap=soft ROWS=5 COLS=40 "
51 "WIDTH=40></TEXTAREA>\n");
53 wprintf("</TD></TR></TABLE><br />\n");
55 wprintf("<INPUT TYPE=\"submit\" NAME=\"send_button\" VALUE=\"%s\">", _("Send message"));
56 wprintf("<br /><a href=\"javascript:window.close();\"%s</A>\n", _("Cancel"));
58 wprintf("</FORM></CENTER>\n");
59 wprintf("</td></tr></table></div>\n");
72 output_headers(1, 1, 2, 0, 0, 0);
73 wprintf("<div id=\"banner\">\n"
74 "<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#444455\"><TR><TD>"
75 "<SPAN CLASS=\"titlebar\">");
76 wprintf(_("Add or edit an event"));
78 "</TD></TR></TABLE>\n"
79 "</div>\n<div id=\"content\">\n"
82 strcpy(recp, bstr("recp"));
83 strcpy(closewin, bstr("closewin"));
85 if (strlen(bstr("send_button")) == 0) {
87 wprintf(_("Message was not sent."));
88 wprintf("</EM><br />\n");
90 serv_printf("SEXP %s|-", recp);
91 serv_getln(buf, sizeof buf);
94 text_to_server(bstr("msgtext"), 0);
97 wprintf(_("Message has been sent to "));
99 wprintf(".</EM><br />\n");
102 wprintf("<EM>%s</EM><br />\n", &buf[4]);
106 if (!strcasecmp(closewin, "yes")) {
107 wprintf("<CENTER><a href=\"javascript:window.close();\">");
108 wprintf(_("[ close window ]"));
109 wprintf("</A></CENTER>\n");
124 /* First, check to make sure we're still allowed in this room. */
125 serv_printf("GOTO %s", WC->wc_roomname);
126 serv_getln(buf, sizeof buf);
128 smart_goto("_BASEROOM_");
132 /* If the chat socket is still open from a previous chat,
133 * close it -- because it might be stale or in the wrong room.
135 if (WC->chat_sock < 0) {
136 close(WC->chat_sock);
137 WC->chat_sock = (-1);
140 /* WebCit Chat works by having transmit, receive, and refresh
141 * frames. Load the frameset. (This isn't AJAX but the headers
142 * output by begin_ajax_response() happen to be the ones we need.)
144 begin_ajax_response();
145 do_template("chatframeset");
152 * If there are instant messages waiting, and we notice that we haven't checked them in
153 * a while, it probably means that we need to open the instant messenger window.
155 void page_popup(void)
159 /* First, do the check as part of our page load. */
161 serv_getln(buf, sizeof buf);
163 if ((time(NULL) - WC->last_pager_check) > 60) {
164 wprintf("<script type=\"text/javascript\">"
165 " window.open('static/instant_messenger.html', 'CTDL_MESSENGER', "
166 " 'width=700,height=400');"
172 /* Then schedule it to happen again a minute from now if the user is idle. */
173 wprintf("<script type=\"text/javascript\"> \n"
174 " function HandleSslp(sslg_xmlresponse) { \n"
175 " sslg_response = sslg_xmlresponse.responseText.substr(0, 1); \n"
176 " if (sslg_response == 'Y') { \n"
177 " window.open('static/instant_messenger.html', 'CTDL_MESSENGER', \n"
178 " 'width=700,height=400'); \n"
181 " function CheckPager() { \n"
182 " new Ajax.Request('sslg', { method: 'get', parameters: Math.random(), \n"
183 " onSuccess: HandleSslp } ); \n"
185 " new PeriodicalExecuter(CheckPager, 30); \n"
193 * Support function for chat -- make sure the chat socket is connected
196 int setup_chat_socket(void) {
199 int good_chatmode = 0;
201 if (WC->chat_sock < 0) {
203 if (!strcasecmp(ctdlhost, "uds")) {
204 /* unix domain socket */
205 sprintf(buf, "%s/citadel.socket", ctdlport);
206 WC->chat_sock = uds_connectsock(buf);
210 WC->chat_sock = tcp_connectsock(ctdlhost, ctdlport);
213 if (WC->chat_sock < 0) {
217 /* Temporarily swap the serv and chat sockets during chat talk */
219 WC->serv_sock = WC->chat_sock;
222 serv_getln(buf, sizeof buf);
224 serv_printf("USER %s", WC->wc_username);
225 serv_getln(buf, sizeof buf);
227 serv_printf("PASS %s", WC->wc_password);
228 serv_getln(buf, sizeof buf);
230 serv_printf("GOTO %s", WC->wc_roomname);
231 serv_getln(buf, sizeof buf);
234 serv_getln(buf, sizeof buf);
243 /* Unswap the sockets. */
245 WC->serv_sock = WC->chat_sock;
248 if (!good_chatmode) close(WC->serv_sock);
257 * Receiving side of the chat window. This is implemented in a
258 * tiny hidden IFRAME that just does JavaScript writes to
259 * other frames whenever it refreshes and finds new data.
261 void chat_recv(void) {
265 int end_chat_now = 0;
269 char *output_data = NULL;
271 output_headers(0, 0, 0, 0, 0, 0);
273 wprintf("Content-type: text/html; charset=utf-8\n");
277 "<meta http-equiv=\"refresh\" content=\"3\" />\n"
280 "<body bgcolor=\"#FFFFFF\">\n"
283 if (setup_chat_socket() != 0) {
284 wprintf(_("An error occurred while setting up the chat socket."));
285 wprintf("</BODY></HTML>\n");
291 * See if there is any chat data waiting.
293 output_data = strdup("");
296 pf.fd = WC->chat_sock;
299 if (poll(&pf, 1, 1) > 0) if (pf.revents & POLLIN) {
302 /* Temporarily swap the serv and chat sockets during chat talk */
304 WC->serv_sock = WC->chat_sock;
307 serv_getln(buf, sizeof buf);
309 if (!strcmp(buf, "000")) {
311 strcat(buf, _("Now exiting chat mode."));
315 /* Unswap the sockets. */
317 WC->serv_sock = WC->chat_sock;
320 /* Append our output data */
321 output_data = realloc(output_data, strlen(output_data) + strlen(buf) + 4);
322 strcat(output_data, buf);
323 strcat(output_data, "\n");
326 } while ( (got_data) && (!end_chat_now) );
329 close(WC->chat_sock);
330 WC->chat_sock = (-1);
331 wprintf("<img src=\"static/blank.gif\" onLoad=\"parent.window.close();\">\n");
334 if (strlen(output_data) > 0) {
336 if (output_data[strlen(output_data)-1] == '\n') {
337 output_data[strlen(output_data)-1] = 0;
340 /* Output our fun to the other frame. */
341 wprintf("<img src=\"static/blank.gif\" WIDTH=1 HEIGHT=1\n"
345 for (i=0; i<num_tokens(output_data, '\n'); ++i) {
346 extract_token(buf, output_data, i, '\n', sizeof buf);
347 extract_token(cl_user, buf, 0, '|', sizeof cl_user);
348 extract_token(cl_text, buf, 1, '|', sizeof cl_text);
350 if (strcasecmp(cl_text, "NOOP")) {
352 wprintf("parent.chat_transcript.document.write('");
354 if (strcasecmp(cl_user, WC->last_chat_user)) {
355 wprintf("<TABLE border=0 WIDTH=100%% "
356 "CELLSPACING=1 CELLPADDING=0 "
357 "BGCOLOR="#FFFFFF">"
358 "<TR><TD></TR></TD></TABLE>"
363 wprintf("<TABLE border=0 WIDTH=100%% "
364 "CELLSPACING=0 CELLPADDING=0 "
365 "BGCOLOR="#EEEEEE">");
369 if (!strcasecmp(cl_user, ":")) {
373 if (strcasecmp(cl_user, WC->last_chat_user)) {
376 if (!strcasecmp(cl_user, WC->wc_username)) {
377 wprintf("<FONT COLOR="#FF0000">");
380 wprintf("<FONT COLOR="#0000FF">");
384 wprintf("</FONT>: </B>");
387 wprintf(" ");
390 if (!strcasecmp(cl_user, ":")) {
394 wprintf("</TD></TR></TABLE>");
397 strcpy(WC->last_chat_user, cl_user);
401 wprintf("parent.chat_transcript.scrollTo(999999,999999);\">\n");
406 wprintf("</BODY></HTML>\n");
412 * sending side of the chat window
414 void chat_send(void) {
419 output_headers(0, 0, 0, 0, 0, 0);
420 wprintf("Content-type: text/html; charset=utf-8\n");
423 "<BODY onLoad=\"document.chatsendform.send_this.focus();\" >"
426 if (bstr("send_this") != NULL) {
427 strcpy(send_this, bstr("send_this"));
430 strcpy(send_this, "");
433 if (strlen(bstr("help_button")) > 0) {
434 strcpy(send_this, "/help");
437 if (strlen(bstr("list_button")) > 0) {
438 strcpy(send_this, "/who");
441 if (strlen(bstr("exit_button")) > 0) {
442 strcpy(send_this, "/quit");
445 if (setup_chat_socket() != 0) {
446 wprintf(_("An error occurred while setting up the chat socket."));
447 wprintf("</BODY></HTML>\n");
452 /* Temporarily swap the serv and chat sockets during chat talk */
454 WC->serv_sock = WC->chat_sock;
457 while (strlen(send_this) > 0) {
458 if (strlen(send_this) < 67) {
459 serv_puts(send_this);
460 strcpy(send_this, "");
463 for (i=55; i<67; ++i) {
464 if (send_this[i] == ' ') break;
466 strncpy(buf, send_this, i);
468 strcpy(send_this, &send_this[i]);
473 /* Unswap the sockets. */
475 WC->serv_sock = WC->chat_sock;
478 wprintf("<FORM METHOD=\"POST\" action=\"chat_send\" NAME=\"chatsendform\">\n");
479 wprintf("<INPUT TYPE=\"text\" SIZE=\"80\" MAXLENGTH=\"%d\" "
480 "NAME=\"send_this\">\n", SIZ-10);
482 wprintf("<INPUT TYPE=\"submit\" NAME=\"send_button\" VALUE=\"%s\">\n", _("Send"));
483 wprintf("<INPUT TYPE=\"submit\" NAME=\"help_button\" VALUE=\"%s\">\n", _("Help"));
484 wprintf("<INPUT TYPE=\"submit\" NAME=\"list_button\" VALUE=\"%s\">\n", _("List users"));
485 wprintf("<INPUT TYPE=\"submit\" NAME=\"exit_button\" VALUE=\"%s\">\n", _("Exit"));
486 wprintf("</FORM>\n");
488 wprintf("</BODY></HTML>\n");