From c09bebade4e8f12ac10c86008d882f6f70547d29 Mon Sep 17 00:00:00 2001 From: Michiel Broek Date: Mon, 24 Mar 2003 19:44:38 +0000 Subject: [PATCH] Updates for the chatserver --- ChangeLog | 11 +- mbmon/Makefile | 4 +- mbmon/mbmon.c | 170 +++++++++++++++++++++---- mbmon/mbmon.h | 2 +- mbmon/mutil.c | 1 + mbsebbs/timecheck.c | 7 +- mbsebbs/whoson.c | 6 +- mbtask/Makefile | 6 +- mbtask/mbtask.c | 2 + mbtask/taskchat.c | 301 ++++++++++++++++++++++++++++++++++++++++++++ mbtask/taskchat.h | 5 + mbtask/taskcomm.c | 66 ++++++++-- mbtask/taskregs.c | 71 +++-------- mbtask/taskregs.h | 4 +- 14 files changed, 549 insertions(+), 107 deletions(-) diff --git a/ChangeLog b/ChangeLog index 53233a8e..134a57ee 100644 --- a/ChangeLog +++ b/ChangeLog @@ -49,10 +49,9 @@ v0.37.2 23-Feb-2003. Added support for door32.sys dropfile. Fixed user idle logoff when new mailcheck took too long. Added email reply when reading new (e)mail. - With the CIPM and CSPM mbtask commands added the parameter for - the chat channel. To page the sysop, the CPAG and CCAN commands to mbtask are now - used. + used. Until the chatserver is ready, there is no buildin sysop + user chat. mbmon: Reports sysop available or left the system when mbmon starts @@ -65,17 +64,19 @@ v0.37.2 23-Feb-2003. The show lastcallers now adjusts the number of lines available. The show server clients screen now adjusts to the number of lines available. + Added chatserver client, this is more or less complete now and + does communicate with the development server. mbtask: Safer logging of user log messages. - The CSPM command has an extra channel parameter. - The CIPM reply has an extra channel parameter. In personal message text the text after a ; character is not ignored anymore. Added CSYS command to report if sysop is available. Added CPAG command to page the sysop. Added CCAN command to cancel the sysop page. Added CCKP command to check for a page. + Added CCON, CCLO, CPUT and CGET commands for chatserver. The + chatserver commands will be added and are in development. lang: Changed language prompts 15, 16 and 152. diff --git a/mbmon/Makefile b/mbmon/Makefile index b75d0a39..348bf7c8 100644 --- a/mbmon/Makefile +++ b/mbmon/Makefile @@ -57,7 +57,7 @@ depend: # DO NOT DELETE THIS LINE - MAKE DEPEND RELIES ON IT # Dependencies generated by make depend -mutil.o: ../config.h ../lib/libs.h ../lib/memwatch.h ../lib/mberrors.h common.h mutil.h -mbmon.o: ../config.h ../lib/libs.h ../lib/memwatch.h ../lib/mberrors.h common.h mutil.h +mutil.o: ../config.h ../lib/libs.h ../lib/memwatch.h ../lib/mberrors.h ../lib/structs.h common.h mutil.h +mbmon.o: ../config.h ../lib/libs.h ../lib/memwatch.h ../lib/mberrors.h ../lib/structs.h common.h mutil.h common.o: ../config.h ../lib/libs.h ../lib/memwatch.h ../lib/mberrors.h common.h # End of generated dependencies diff --git a/mbmon/mbmon.c b/mbmon/mbmon.c index 4d5b2556..11d0c7ff 100644 --- a/mbmon/mbmon.c +++ b/mbmon/mbmon.c @@ -33,6 +33,7 @@ #include "../lib/libs.h" #include "../lib/memwatch.h" #include "../lib/mberrors.h" +#include "../lib/structs.h" #include "common.h" #include "mutil.h" @@ -44,6 +45,13 @@ extern int bbs_free; extern int ttyfd; extern pid_t mypid; +struct sysconfig CFG; + + +char rbuf[50][80]; /* Chat receive buffer */ /* FIXME: must be a dynamic buffer */ +int rpointer = 0; /* Chat receive pointer */ +int rsize = 5; /* Chat receive size */ + static void die(int onsig) { @@ -416,46 +424,99 @@ void soft_info(void) +/* + * Display received chat message + */ +void DispMsg(char *); +void DispMsg(char *msg) +{ + int i; + + strncpy(rbuf[rpointer], msg, 80); + mvprintw(4+rpointer, 1, rbuf[rpointer]); + if (rpointer == rsize) { + /* + * Scroll buffer + */ + for (i = 0; i <= rsize; i++) { + locate(i+4,1); + clrtoeol(); + sprintf(rbuf[i], "%s", rbuf[i+1]); + mvprintw(i+4, 1, rbuf[i]); + } + } else { + rpointer++; + } + fflush(stdout); +} + + + /* * Sysop/user chat */ -void Chat(int channel) +void Chat(void) { - int curpos = 0, rline = 0; + int curpos = 0, stop = FALSE, data; unsigned char ch = 0; - char sbuf[81], rbuf[17][81], resp[128], from[36]; - static char buf[128]; + char sbuf[81], resp[128], *cnt, *msg; + static char buf[200]; clr_index(); + rsize = lines - 7; + rpointer = 0; + + sprintf(buf, "CCON,2,%d,%s", mypid, CFG.sysop); + Syslog('-', "> %s", buf); + if (socket_send(buf) == 0) { + strcpy(buf, socket_receive()); + Syslog('-', "< %s", buf); + if (strncmp(buf, "100:1,", 6) == 0) { + cnt = strtok(buf, ","); + msg = strtok(NULL, "\0"); + msg[strlen(msg)-1] = '\0'; + set_color(LIGHTRED, BLACK); + mvprintw(4, 1, msg); + working(2, 0, 0); + working(0, 0, 0); + center_addstr(lines -4, (char *)"Press any key"); + readkey(lines - 4, columns / 2 + 8, LIGHTGRAY, BLACK); + return; + } + } + locate(lines - 2, 1); set_color(WHITE, BLUE); clrtoeol(); - mvprintw(lines - 2, 2, "Sysop to user chat, press @ to exit"); + mvprintw(lines - 2, 2, "Chat, type \"/EXIT\" to exit"); set_color(LIGHTGRAY, BLACK); mvprintw(lines - 1, 1, ">"); memset(&sbuf, 0, sizeof(sbuf)); memset(&rbuf, 0, sizeof(rbuf)); - while (TRUE) { + Syslog('-', "Start loop"); + + while (stop == FALSE) { /* - * Check for new message + * Check for new message, loop fast until no more data available. */ - sprintf(buf, "CIPM:1,%d;", mypid); - if (socket_send(buf) == 0) { - strcpy(buf, socket_receive()); - if (strncmp(buf, "100:0;", 6)) { - Syslog('-', "%s", buf); - strncpy(resp, strtok(buf, ":"), 10); /* Should be 100 */ - strncpy(resp, strtok(NULL, ","), 5); /* Should be 3 */ - strncpy(resp, strtok(NULL, ","), 5); /* Should be our channel */ - if (atoi(resp) != channel) { - Syslog('+', "Message in channel %s instead of %d", resp, channel); - } else { - strncpy(from, strtok(NULL, ","), 36); /* From name */ - strncpy(resp, strtok(NULL, "\0"), 80); /* The message */ + data = TRUE; + while (data) { + sprintf(buf, "CGET:1,%d;", mypid); + if (socket_send(buf) == 0) { + strcpy(buf, socket_receive()); + if (strncmp(buf, "100:1,", 6) == 0) { + Syslog('-', "> CGET:1,%d;", mypid); + Syslog('-', "< %s", buf); + strncpy(resp, strtok(buf, ":"), 10); /* Should be 100 */ + strncpy(resp, strtok(NULL, ","), 5); /* Should be 1 */ + strncpy(resp, strtok(NULL, "\0"), 80); /* The message */ resp[strlen(resp)-1] = '\0'; + DispMsg(resp); + } else { + data = FALSE; } } } @@ -489,11 +550,20 @@ void Chat(int channel) putchar(7); } } else if ((ch == '\r') && curpos) { - sprintf(buf, "CSPM:4,%d,Sysop,-,%s;", channel, sbuf); - Syslog('-', "%s", buf); + if (strncasecmp(sbuf, "/exit", 5) == 0) + stop = TRUE; + sprintf(buf, "CPUT:2,%d,%s;", mypid, sbuf); + Syslog('-', "> %s", buf); if (socket_send(buf) == 0) { strcpy(buf, socket_receive()); - Syslog('-', "%s", buf); + Syslog('-', "< %s", buf); + if (strncmp(buf, "100:1,", 6) == 0) { + strncpy(resp, strtok(buf, ":"), 10); /* Should be 100 */ + strncpy(resp, strtok(NULL, ","), 5); /* Should be 1 */ + strncpy(resp, strtok(NULL, "\0"), 80); /* The message */ + resp[strlen(resp)-1] = '\0'; + DispMsg(resp); + } } curpos = 0; memset(&sbuf, 0, sizeof(sbuf)); @@ -502,6 +572,41 @@ void Chat(int channel) mvprintw(lines - 1, 1, ">"); } } + + /* + * Before sending the close command, purge all outstanding messages. + */ + data = TRUE; + while (data) { + sprintf(buf, "CGET:1,%d;", mypid); + if (socket_send(buf) == 0) { + strcpy(buf, socket_receive()); + if (strncmp(buf, "100:1,", 6) == 0) { + Syslog('-', "> CGET:1,%d;", mypid); + Syslog('-', "< %s", buf); + strncpy(resp, strtok(buf, ":"), 10); /* Should be 100 */ + strncpy(resp, strtok(NULL, ","), 5); /* Should be 1 */ + strncpy(resp, strtok(NULL, "\0"), 80); /* The message */ + resp[strlen(resp)-1] = '\0'; + DispMsg(resp); + } else { + data = FALSE; + } + } + } + + /* + * Close server connection + */ + sprintf(buf, "CCLO,1,%d", mypid); + Syslog('-', "> %s", buf); + if (socket_send(buf) == 0) { + strcpy(buf, socket_receive()); + Syslog('-', "< %s", buf); + if (strncmp(buf, "100:1,", 6)) { + } + } + sleep(1); } @@ -509,13 +614,28 @@ void Chat(int channel) int main(int argc, char *argv[]) { struct passwd *pw; - char buf[128]; + char buf[128], *temp; int rc; + FILE *fp; #ifdef MEMWATCH mwInit(); #endif + /* + * Read configuration + */ + temp = calloc(PATH_MAX, sizeof(char)); + sprintf(temp, "%s/etc/config.data", getenv("MBSE_ROOT")); + if ((fp = fopen(temp, "r")) == NULL) { + perror("\n\nFATAL ERROR: "); + printf(" Can't open %s", temp); + exit(1); + } + fread(&CFG, sizeof(CFG), 1, fp); + fclose(fp); + free(temp); + /* * Find out who is on the keyboard or automated the keyboard. */ @@ -597,7 +717,7 @@ int main(int argc, char *argv[]) ShowLastcaller(); break; case 6: - Chat(0); + Chat(); break; case 7: soft_info(); diff --git a/mbmon/mbmon.h b/mbmon/mbmon.h index 5c718733..01e6597b 100644 --- a/mbmon/mbmon.h +++ b/mbmon/mbmon.h @@ -10,6 +10,6 @@ void system_moni(void); void system_stat(void); void disk_stat(void); void soft_info(void); -void Chat(int); +void Chat(void); #endif diff --git a/mbmon/mutil.c b/mbmon/mutil.c index 286b4c19..1b2d195b 100644 --- a/mbmon/mutil.c +++ b/mbmon/mutil.c @@ -32,6 +32,7 @@ #include "../lib/libs.h" #include "../lib/memwatch.h" #include "../lib/mberrors.h" +#include "../lib/structs.h" #include "common.h" #include "mutil.h" diff --git a/mbsebbs/timecheck.c b/mbsebbs/timecheck.c index b8956292..a732c3b8 100644 --- a/mbsebbs/timecheck.c +++ b/mbsebbs/timecheck.c @@ -56,7 +56,7 @@ extern pid_t mypid; /* Pid of this program */ void Check_PM(void); void Check_PM(void) { - static char buf[128]; + static char buf[200]; char resp[128]; sprintf(buf, "CIPM:1,%d;", mypid); @@ -65,9 +65,8 @@ void Check_PM(void) if (strncmp(buf, "100:0;", 6) == 0) return; - strcpy(resp, strtok(buf, ":")); /* Should be 100 */ - strcpy(resp, strtok(NULL, ",")); /* Should be 3 */ - strcpy(resp, strtok(NULL, ",")); /* Should be channel -1 */ + strncpy(resp, strtok(buf, ":"), 5); /* Should be 100 */ + strncpy(resp, strtok(NULL, ","), 3); /* Should be 2 */ strncpy(resp, strtok(NULL, ","), 36); /* From Name */ colour(CYAN, BLACK); /* ** Message ** from */ diff --git a/mbsebbs/whoson.c b/mbsebbs/whoson.c index dcfcc756..2c5810e7 100644 --- a/mbsebbs/whoson.c +++ b/mbsebbs/whoson.c @@ -315,11 +315,11 @@ void SendOnlineMsg(char *OpData) if ((strcmp(String, "")) != 0) { buf[0] = '\0'; if ((strcasecmp(OpData, "/H") == 0) && strlen(exitinfo.sHandle)) - sprintf(buf, "CSPM:4,-1,%s,%s,%s;", exitinfo.sHandle, User, String); + sprintf(buf, "CSPM:3,%s,%s,%s;", exitinfo.sHandle, User, String); else if (strcasecmp(OpData, "/U") == 0) - sprintf(buf, "CSPM:4,-1,%s,%s,%s;", exitinfo.Name, User, String); + sprintf(buf, "CSPM:3,%s,%s,%s;", exitinfo.Name, User, String); else - sprintf(buf, "CSPM:4,-1,%s,%s,%s;", exitinfo.sUserName, User, String); + sprintf(buf, "CSPM:3,%s,%s,%s;", exitinfo.sUserName, User, String); if (socket_send(buf) == 0) { strcpy(buf, socket_receive()); diff --git a/mbtask/Makefile b/mbtask/Makefile index a28d67b0..53531f99 100644 --- a/mbtask/Makefile +++ b/mbtask/Makefile @@ -80,10 +80,10 @@ depend: # Dependencies generated by make depend callstat.o: ../config.h libs.h ../lib/structs.h taskutil.h callstat.h scanout.o: ../config.h libs.h ../lib/structs.h taskutil.h scanout.h -taskcomm.o: ../config.h libs.h ../lib/structs.h taskstat.h taskregs.h taskdisk.h taskinfo.h taskutil.h taskcomm.h +taskcomm.o: ../config.h libs.h ../lib/structs.h taskstat.h taskregs.h taskdisk.h taskinfo.h taskutil.h taskchat.h taskcomm.h taskinfo.o: ../config.h libs.h ../lib/structs.h taskinfo.h taskstat.o: ../config.h libs.h ../lib/structs.h ../lib/mberrors.h taskstat.h callstat.h outstat.h taskutil.h -mbtask.o: ../config.h libs.h ../lib/structs.h ../paths.h ../lib/mberrors.h signame.h taskstat.h taskutil.h taskregs.h taskcomm.h callstat.h outstat.h ../lib/nodelist.h ports.h calllist.h ping.h mbtask.h +mbtask.o: ../config.h libs.h ../lib/structs.h ../paths.h ../lib/mberrors.h signame.h taskstat.h taskutil.h taskregs.h taskcomm.h callstat.h outstat.h ../lib/nodelist.h ports.h calllist.h ping.h taskchat.h mbtask.h outstat.o: ../config.h libs.h ../lib/structs.h ../lib/mberrors.h taskutil.h taskstat.h scanout.h ../lib/nodelist.h callstat.h ports.h outstat.h signame.o: ../config.h signame.h taskdisk.o: ../config.h libs.h ../lib/structs.h taskdisk.h taskutil.h @@ -93,5 +93,5 @@ ports.o: ../config.h libs.h ../lib/structs.h taskutil.h ../lib/nodelist.h ports. calllist.o: ../config.h libs.h ../lib/structs.h taskstat.h taskutil.h callstat.h outstat.h mbtask.h calllist.h ping.o: ../config.h libs.h ../lib/structs.h ../lib/mberrors.h taskstat.h taskutil.h ping.h crc.o: ../config.h libs.h crc.h -taskchat.o: ../config.h libs.h ../lib/structs.h taskchat.h +taskchat.o: ../config.h libs.h ../lib/structs.h taskutil.h taskchat.h # End of generated dependencies diff --git a/mbtask/mbtask.c b/mbtask/mbtask.c index 4fa93ffe..00b11960 100644 --- a/mbtask/mbtask.c +++ b/mbtask/mbtask.c @@ -44,6 +44,7 @@ #include "ports.h" #include "calllist.h" #include "ping.h" +#include "taskchat.h" #include "mbtask.h" @@ -1315,6 +1316,7 @@ int main(int argc, char **argv) initnl(); load_ports(); check_ports(); + chat_init(); /* * Now that init is complete and this program is locked, it is diff --git a/mbtask/taskchat.c b/mbtask/taskchat.c index c2bd5ef9..627efe3d 100644 --- a/mbtask/taskchat.c +++ b/mbtask/taskchat.c @@ -31,6 +31,307 @@ #include "../config.h" #include "libs.h" #include "../lib/structs.h" +#include "taskutil.h" +#include "taskregs.h" #include "taskchat.h" +#define MAXCHANNELS 100 /* Maximum chat channels */ +#define MAXMESSAGES 100 /* Maximum ringbuffer for messages */ + + +typedef enum {CH_FREE, CH_PRIVATE, CH_PUBLIC} CHANNELTYPE; + + +/* + * Users connected to the chatserver. + */ +typedef struct _ch_user_rec { + pid_t pid; /* User's pid */ + char name[36]; /* His name used (may become nick) */ + time_t connected; /* Time connected */ + int channel; /* Connected channel or -1 */ + int pointer; /* Message pointer */ + unsigned chatting : 1; /* Is chatting in a channel */ + unsigned chanop : 1; /* Is a chanop */ +} _chat_users; + + + +/* + * Buffer for messages, this is the structure of a ringbuffer which will + * hold all messages, private public etc. There is one global input pointer + * which points to the current head of the ringbuffer. When a user connects + * to a channel, he will get the latest messages in the channel if they + * are present. + */ +typedef struct _chatmsg { + pid_t topid; /* Destination pid of message */ + char fromname[36]; /* Message from user */ + char message[81]; /* The message to display */ + time_t posted; /* Timestamp for posted message */ +} _chat_messages; + + + +/* + * List of banned users from a channel. This is a dynamic list. + */ +typedef struct _banned { + int channel; /* Channel the user is banned from */ + char user[36]; /* The user who is banned */ +} banned_users; + + +/* + * The buffers + */ +_chat_messages chat_messages[MAXMESSAGES]; +_chat_users chat_users[MAXCLIENT]; + + +int buffer_head = 0; /* Messages buffer head */ +extern struct sysconfig CFG; /* System configuration */ + + + +/* + * Put a system message into the chatbuffer + */ +void system_msg(pid_t, char *); +void system_msg(pid_t pid, char *msg) +{ + if (buffer_head < MAXMESSAGES) + buffer_head++; + else + buffer_head = 0; + + Syslog('-', "system_msg(%d, %s) ptr=%d", pid, msg, buffer_head); + memset(&chat_messages[buffer_head], 0, sizeof(_chat_messages)); + chat_messages[buffer_head].topid = pid; + sprintf(chat_messages[buffer_head].fromname, "Server"); + strncpy(chat_messages[buffer_head].message, msg, 80); + chat_messages[buffer_head].posted = time(NULL); +} + + + +/* + * Show help + */ +void chat_help(pid_t); +void chat_help(pid_t pid) +{ + system_msg(pid, (char *)"Topics available:"); + system_msg(pid, (char *)""); + system_msg(pid, (char *)" EXIT HELP"); +} + + + +void chat_init(void) +{ + memset(&chat_users, 0, sizeof(chat_users)); + memset(&chat_messages, 0, sizeof(chat_messages)); +} + + + +/* + * Connect a session to the chatserver. + */ +char *chat_connect(char *data) +{ + char *pid, *usr; + static char buf[200]; + int i, j, count = 0; + + Syslog('-', "CCON:%s", data); + memset(&buf, 0, sizeof(buf)); + + /* + * Search free userslot + */ + for (i = 0; i < MAXCLIENT; i++) { + if (chat_users[i].pid == 0) { + /* + * Oke, found + */ + pid = strtok(data, ","); /* Should be 2 */ + pid = strtok(NULL, ","); /* The pid */ + usr = strtok(NULL, ";"); /* Username */ + chat_users[i].pid = atoi(pid); + strncpy(chat_users[i].name, usr, 36); + chat_users[i].connected = time(NULL); + chat_users[i].pointer = buffer_head; + chat_users[i].channel = -1; + + Syslog('-', "Connected user %s (%s) with chatserver, slot %d", usr, pid, i); + + /* + * Now put welcome message into the ringbuffer and report success. + */ + sprintf(buf, "MBSE BBS v%s chat server; type /help for help", VERSION); + system_msg(chat_users[i].pid, buf); + sprintf(buf, "Welcome to the %s chat network", CFG.bbs_name); + system_msg(chat_users[i].pid, buf); + for (j = 0; j < MAXCLIENT; j++) + if (chat_users[j].pid) + count++; + sprintf(buf, "There %s %d user%s connected", (count != 1)?"are":"is", count, (count != 1)?"s":""); + system_msg(chat_users[i].pid, buf); + + sprintf(buf, "100:0;"); + return buf; + } + } + sprintf(buf, "100:1,Too many users connected;"); + return buf; +} + + + +char *chat_close(char *data) +{ + static char buf[200]; + char *pid; + int i; + + Syslog('-', "CCLO:%s", data); + memset(&buf, 0, sizeof(buf)); + pid = strtok(data, ","); + pid = strtok(NULL, ";"); + + for (i = 0; i < MAXCLIENT; i++) { + if (chat_users[i].pid == atoi(pid)) { + Syslog('-', "Closing chat for pid %s, slot %d", pid, i); + memset(&chat_users[i], 0, sizeof(_chat_users)); + sprintf(buf, "100:0;"); + return buf; + } + } + Syslog('-', "Pid %s was not connected to chatserver"); + sprintf(buf, "100:1,ERROR - Not connected to server;"); + return buf; +} + + + +char *chat_put(char *data) +{ + static char buf[200]; + char *pid, *msg, *cmd; + int i; + + Syslog('-', "CPUT:%s", data); + memset(&buf, 0, sizeof(buf)); + + pid = strtok(data, ","); + pid = strtok(NULL, ","); + msg = strtok(NULL, "\0"); + msg[strlen(msg)-1] = '\0'; + + for (i = 0; i < MAXCLIENT; i++) { + if (chat_users[i].pid == atoi(pid)) { + /* + * We are connected and known, first send the input back to ourself. + */ + system_msg(chat_users[i].pid, msg); + + if (msg[0] == '/') { + /* + * A command, process this + */ + if (strncasecmp(msg, "/help", 5) == 0) { + chat_help(atoi(pid)); + sprintf(buf, "100:0;"); + return buf; + } + if (strncasecmp(msg, "/exit", 5) == 0) { + /* + * Just send messages, the client should later do a + * real disconnect. + */ + sprintf(buf, "Goodbye"); + system_msg(chat_users[i].pid, buf); + sprintf(buf, "100:0;"); + return buf; + } + if (strncasecmp(msg, "/join", 5) == 0) { + cmd = strtok(msg, " \0"); + Syslog('-', "\"%s\"", cmd); + cmd = strtok(NULL, "\0"); + Syslog('-', "\"%s\"", cmd); + if ((cmd == NULL) || (cmd[0] != '#') || (strcmp(cmd, "#") == 0)) { + sprintf(buf, "Try /join #channel"); + system_msg(chat_users[i].pid, buf); + } else { + Syslog('-', "Trying to join channel %s", cmd); + } + sprintf(buf, "100:0;"); + return buf; + } + /* + * If still here, the command was not recognized. + */ + cmd = strtok(msg, " \t\r\n\0"); + sprintf(buf, "%s :Unknown command", cmd+1); + system_msg(chat_users[i].pid, buf); + sprintf(buf, "100:0;"); + return buf; + } + if (chat_users[i].channel == -1) { + /* + * Trying messages while not in a channel + */ + sprintf(buf, "No channel joined. Try /join #channel"); + system_msg(chat_users[i].pid, buf); + sprintf(buf, "100:0;"); + return buf; + } + sprintf(buf, "100:0;"); + return buf; + } + } + Syslog('-', "Pid %s was not connected to chatserver"); + sprintf(buf, "100:1,ERROR - Not connected to server;"); + return buf; +} + + + +char *chat_get(char *data) +{ + static char buf[200]; + char *pid; + int i; + + Syslog('-', "CGET:%s", data); + memset(&buf, 0, sizeof(buf)); + pid = strtok(data, ","); + pid = strtok(NULL, ";"); + + for (i = 0; i < MAXCLIENT; i++) { + if (atoi(pid) == chat_users[i].pid) { + while (chat_users[i].pointer != buffer_head) { + if (chat_users[i].pointer < MAXMESSAGES) + chat_users[i].pointer++; + else + chat_users[i].pointer = 0; + if (chat_users[i].pid == chat_messages[chat_users[i].pointer].topid) { + /* + * Message is for us. + */ + sprintf(buf, "100:1,%s;", chat_messages[chat_users[i].pointer].message); + Syslog('-', "%s", buf); + return buf; + } + } + sprintf(buf, "100:0;"); + return buf; + } + } + sprintf(buf, "100:1,ERROR - Not connected to server;"); + return buf; +} + diff --git a/mbtask/taskchat.h b/mbtask/taskchat.h index 967246a2..61e36e77 100644 --- a/mbtask/taskchat.h +++ b/mbtask/taskchat.h @@ -3,5 +3,10 @@ /* $Id$ */ +void chat_init(void); +char *chat_connect(char *); +char *chat_close(char *); +char *chat_put(char *); +char *chat_get(char *); #endif diff --git a/mbtask/taskcomm.c b/mbtask/taskcomm.c index 83ce206e..655789f4 100644 --- a/mbtask/taskcomm.c +++ b/mbtask/taskcomm.c @@ -36,6 +36,7 @@ #include "taskdisk.h" #include "taskinfo.h" #include "taskutil.h" +#include "taskchat.h" #include "taskcomm.h" @@ -239,14 +240,10 @@ char *exe_cmd(char *in) } /* - * The chat commands + * Check for personal message * - * Used channels: -1 Personal messages between ordinary users. - * 0 Sysop/user chat - * 1..99 Chatting channels - * - * CIPM:1,pid; (Is personal/chat message present) - * 100:3,channel,fromname,message; + * CIPM:1,pid; (Is personal message present) + * 100:2,fromname,message; * 100:0; */ if (strncmp(cmd, "CIPM", 4) == 0) { @@ -254,7 +251,7 @@ char *exe_cmd(char *in) } /* - * CSPM:3,channel,fromuser,touser,text; (Send personal/chat message). + * CSPM:3,fromuser,touser,text; (Send personal message). * 100:1,n; n: 1=donotdisturb 2=buffer full 3=error * 100:0; */ @@ -296,10 +293,63 @@ char *exe_cmd(char *in) return obuf; } + /* + * Check for sysop page (from mbmon) + * + * CCKP:0; + * 100:3,pid,1,reason; Page is active + * 100:3,pid,0,reason; Page is canceled, but user still online + * 100:0; No page active + */ if (strncmp(cmd, "CCKP", 4) == 0) { return reg_checkpage(token); } + /* + * Connect to chatserver + * + * CCON:2,pid,username; Connect to chatserver with username + * 100:1,error; If error + * 100:0; Ok + */ + if (strncmp(cmd, "CCON", 4) == 0) { + return chat_connect(token); + } + + /* + * Close chat session + * + * CCLO:1,pid; Leave chatserver + * 100:1,error; Error + * 100:0; Ok + */ + if (strncmp(cmd, "CCLO", 4) == 0) { + return chat_close(token); + } + + /* + * Put message on server + * + * CPUT:2,pid,message; Put message on server + * 100:1,error; Error + * 100:0; Ok + */ + if (strncmp(cmd, "CPUT", 4) == 0) { + return chat_put(token); + } + + /* + * Get message from server + * + * CGET:1,pid; Get message from server + * 100:1,message; If message present + * 100:0; No message + */ + if (strncmp(cmd, "CGET", 4) == 0) { + return chat_get(token); + } + + /* * The G(lobal) commands. * diff --git a/mbtask/taskregs.c b/mbtask/taskregs.c index 83f6aa5e..11e7c11e 100644 --- a/mbtask/taskregs.c +++ b/mbtask/taskregs.c @@ -406,12 +406,11 @@ char *reg_ipm(char *data) return buf; reginfo[rec].lastcon = time(NULL); - if (!reginfo[rec].ismsg || (reginfo[rec].channel != -1)) + if (!reginfo[rec].ismsg) return buf; buf[0] = '\0'; - sprintf(buf, "100:3,%d,%s,%s;", reginfo[rec].channel, - reginfo[rec].fname[reginfo[rec].ptr_out], reginfo[rec].msg[reginfo[rec].ptr_out]); + sprintf(buf, "100:2,%s,%s;", reginfo[rec].fname[reginfo[rec].ptr_out], reginfo[rec].msg[reginfo[rec].ptr_out]); if (reginfo[rec].ptr_out < RB) reginfo[rec].ptr_out++; else @@ -419,8 +418,7 @@ char *reg_ipm(char *data) if (reginfo[rec].ptr_out == reginfo[rec].ptr_in) reginfo[rec].ismsg = FALSE; - Syslog('+', "reg_ipm: ch=%d in=%d out=%d ismsg=%d", reginfo[rec].channel, - reginfo[rec].ptr_in, reginfo[rec].ptr_out, reginfo[rec].ismsg); + Syslog('+', "reg_ipm: in=%d out=%d ismsg=%d", reginfo[rec].ptr_in, reginfo[rec].ptr_out, reginfo[rec].ismsg); return buf; } @@ -432,41 +430,33 @@ char *reg_ipm(char *data) */ int reg_spm(char *data) { - char *cnt, *ch, *from, *too, *txt, *log; - int i, error = 0; + char *cnt, *from, *too, *txt, *log; + int i; cnt = strtok(data, ","); - ch = strtok(NULL, ","); from = strtok(NULL, ","); too = strtok(NULL, ","); txt = strtok(NULL, "\0"); txt[strlen(txt)-1] = '\0'; - Syslog('-', "SIPM:%s,%s,%s,%s,%s;", cnt, ch, from, too, txt); - log = calloc(PATH_MAX, sizeof(char)); - sprintf(log, "%s/log/%s", getenv("MBSE_ROOT"), CFG.chat_log); + Syslog('-', "SIPM:%s,%s,%s,%s;", cnt, from, too, txt); for (i = 0; i < MAXCLIENT; i++) { - /* - * Personal messages and sysop/user chat messages. - */ - if (reginfo[i].pid && - (((strcasecmp(reginfo[i].uname, too) == 0) && (atoi(ch) == -1)) || (atoi(ch) == 0)) && - (atoi(ch) == reginfo[i].channel)) { + if (reginfo[i].pid && (strcasecmp(reginfo[i].uname, too) == 0)) { /* * If the in and out pointers are the same and the * message present flag is still set, then this user * can't get anymore new messages. */ if (reginfo[i].ismsg && (reginfo[i].ptr_in == reginfo[i].ptr_out)) { - error = 2; + return 2; } /* * If user has the "do not distrurb" flag set, but the sysop ignore's this. */ - if (reginfo[i].silent && (atoi(ch) == -1)) { - error = 1; + if (reginfo[i].silent) { + return 1; } /* @@ -481,45 +471,18 @@ int reg_spm(char *data) reginfo[i].ismsg = TRUE; if (CFG.iAutoLog && strlen(CFG.chat_log)) { - ulog(log, (char *)"+", from, ch, txt); + log = calloc(PATH_MAX, sizeof(char)); + sprintf(log, "%s/log/%s", getenv("MBSE_ROOT"), CFG.chat_log); + ulog(log, (char *)"+", from, (char *)"-1", txt); + free(log); } Syslog('+', "reg_spm: rec=%d in=%d out=%d ismsg=%d", i, reginfo[i].ptr_in, reginfo[i].ptr_out, reginfo[i].ismsg); - } - if ((atoi(ch) == -1) || (atoi(ch) == 0)) { - free(log); - return error; - } - - /* - * Chat messages, they are send to each user that is chatting in the right channel. - */ - if (reginfo[i].pid && reginfo[i].chatting && reginfo[i].channel == atoi(ch)) { - if (reginfo[i].ismsg && (reginfo[i].ptr_in == reginfo[i].ptr_out)) { - Syslog('!', "reg_spm: buffer full for %s", reginfo[i].uname); - } else { - strncpy((char *)®info[i].fname[reginfo[i].ptr_in], from, 35); - strncpy((char *)®info[i].msg[reginfo[i].ptr_in], txt, 80); - if (reginfo[i].ptr_in < RB) - reginfo[i].ptr_in++; - else - reginfo[i].ptr_in = 0; - reginfo[i].ismsg = TRUE; - - if (CFG.iAutoLog && strlen(CFG.chat_log)) { - ulog(log, (char *)"+", from, ch, txt); - } - - Syslog('+', "reg_spm: user=%s in=%d out=%d ismsg=%d", reginfo[i].uname, reginfo[i].ptr_in, - reginfo[i].ptr_out, reginfo[i].ismsg); - } + return 0; } } - - free(log); - if ((atoi(ch) == -1) || (atoi(ch) == 0)) - return 3; // Error - return 0; // Ok + + return 3; // Error, user not found } diff --git a/mbtask/taskregs.h b/mbtask/taskregs.h index a4ed40df..2a5cfa39 100644 --- a/mbtask/taskregs.h +++ b/mbtask/taskregs.h @@ -51,8 +51,8 @@ int reg_timer(int, char *); int reg_tty(char *); int reg_user(char *); int reg_silent(char *); /* Set/Reset do not disturb */ -char *reg_ipm(char *); /* Check for personal/chat msg */ -int reg_spm(char *); /* Send personal/chat message */ +char *reg_ipm(char *); /* Check for personal message */ +int reg_spm(char *); /* Send personal message */ char *reg_fre(void); /* Check if system is free */ char *get_reginfo(int); /* Get registration info */ int reg_sysop(char *); /* Registrate sysop presence */