diff --git a/ChangeLog b/ChangeLog index 134a57ee..46497ebf 100644 --- a/ChangeLog +++ b/ChangeLog @@ -12,6 +12,10 @@ v0.37.2 23-Feb-2003. general: System prepared for setting the official FTSC product code, this will be 0x11FF. The code is not yet activated. + Removed external (sysop) chat, chat paging times and other + chat stuff that is of no use anymore. The sysop shows his + presence by running mbmon. The mbchat program is obsolete. + Menu item 22 is added, this is user chat session. common.a: New function to get the real case of a filename. @@ -52,6 +56,9 @@ v0.37.2 23-Feb-2003. To page the sysop, the CPAG and CCAN commands to mbtask are now used. Until the chatserver is ready, there is no buildin sysop user chat. + Removed all old chat code that worked on the tty device. + Added chat client site. This is more or less complete but does + not yet respond to sysop chat requests. mbmon: Reports sysop available or left the system when mbmon starts diff --git a/html/Makefile b/html/Makefile index e083cf2d..f48158b8 100644 --- a/html/Makefile +++ b/html/Makefile @@ -59,8 +59,7 @@ H_MISC = misc/dropfile.html misc/fileid.html misc/index.htm \ misc/ftpserver.html misc/ipmailer.html misc/outbound.html \ misc/usleep.html misc/webserver.html -H_PROGS = programs/mbchat.html \ - programs/mbfido.html programs/mbmon.html \ +H_PROGS = programs/mbfido.html programs/mbmon.html \ programs/mbtoberep.html programs/mblogin.html \ programs/index.htm programs/mbcico.html \ programs/mbfile.html programs/mbmsg.html \ diff --git a/html/index.htm b/html/index.htm index c8bfeb7d..f1fa9e91 100755 --- a/html/index.htm +++ b/html/index.htm @@ -13,10 +13,10 @@
-

MBSE BBS System Guide v0.37.01

+

MBSE BBS System Guide v0.37.02


-
Last update 02-Mar-2003
+
Last update 23-Mar-2003

@@ -92,7 +92,6 @@

  1. mbaff, Announce newfiles and filefind
  2. mball, Allfiles and newfiles list creator
  3. -
  4. mbchat, Sysop to user chat utility
  5. mbcico, The Fidonet mailer ala ifcico
  6. mbdiff, Nodelist difference processor
  7. mbfido, Fidonet mail and files procesor
  8. diff --git a/html/menus/menu0.html b/html/menus/menu0.html index d1dc17b1..0dc699e9 100644 --- a/html/menus/menu0.html +++ b/html/menus/menu0.html @@ -12,7 +12,7 @@
    -
    Last update 23-Feb-2003
    +
    Last update 01-Apr-2003

    MBSE BBS Global Menus


    @@ -160,6 +160,13 @@ even if the display line is empty. In that case an empty line is displayed.
    Optional data: None.

    + +

  9. Chat session This connects the user to the + chatserver. The user is connected with his unix name as default name. The chat + server is a very simple IRC look alike server.
    + Optional data: None yet, maybe the channel later.
    +

    +


diff --git a/html/programs/index.htm b/html/programs/index.htm index d9896b9f..cc9e334f 100644 --- a/html/programs/index.htm +++ b/html/programs/index.htm @@ -12,16 +12,13 @@
-
Last update 10-May-2002
-

 

- -

MBSE BBS Programs.

+
Last update 23-Mar-2003
+

MBSE BBS Programs.

  1. mbaff, Announce newfiles and filefind
  2. mball, Allfiles and newfiles list creator -
  3. mbchat, Sysop to user chat utility
  4. mbcico, The Fidonet mailer ala ifcico
  5. mbdiff, Nodelist difference processor
  6. mbfido, Fidonet mail and files procesor diff --git a/html/setup/global.html b/html/setup/global.html index 2e08f9fe..08c0539c 100644 --- a/html/setup/global.html +++ b/html/setup/global.html @@ -12,7 +12,7 @@
    -
    Last update 02-Feb-2003
    +
    Last update 01-Apr-2003

    MBSE BBS Setup - Global Setup

    @@ -159,43 +159,22 @@ menu.

    -

    1.9. Safe cracker door.

    +

    1.9. Sysop paging

    -This is a door I found in RapidBBS, it is a simple number guessing game. +For sysop chat a protocol is used to communicate with the mbtask daemon which +has a very simple IRC like chatserver. For sysop/user chat a forced channel +with the name #sysop is used.

    -Digit 1           The first digit to guess
    -Digit 2           The second digit to guess
    -Digit 3           The third digit to guess
    -Max trys          The maximum number of trys per day
    -Max numb          The highest number to guess
    -Num gen           Automatic number generation
    -Prize             The prize to win
    -Welcome           The welcome file to display
    -Opened            The file to display to the winner
    -
    -

    - -

    1.10. Sysop paging

    -

    -For sysop chat we use a program that will connect to the users tty. This is -not a nice solution because it will not work over a network, but at least -it works. -

    -Ext. chat         External chat program, not in use!
    -Chat device       The device where the sysop is called (beeped)
    -Call script       For future use
     Page length       The length of a page in seconds
     Page times        Maximum number of times a user may page the sysop
     Sysop area        Message from user to Sysop area number
     Ask reason        Ask reason for chat, this will be logged
    -Use Extern        Use external chat 
     Log Chat          Log the chat conversation
     Prompt Chk.       Check at menu prompts for Sysop breaking in
     Freeze Time       Freeze users time during chat
    -Sunday..Saturday  The times the Sysop is normal available
     

    -

    1.11. Fileecho Processing.

    +

    1.10. Fileecho Processing.

    A note, when you change the number of Systems or Groups, the databases affected will be updated automatic. @@ -221,7 +200,7 @@ the file /opt/mbse/english/macro/filemgr.help to reflect the new settings. Default all these switches are set to Yes.

    -

    1.12. Edit Fidonet mail and echomail processing.

    +

    1.11. Edit Fidonet mail and echomail processing.

    Note that the first 2 mailboards must also exist in the normal mail areas if you want to see what is in them. Here they are defined for quick access of the @@ -278,10 +257,10 @@ if they are larger then 32 KBytes. Splitting is used for newfiles reports and gated news articles to Fidonet.

    -

    1.13. Edit Internet mail and news processing.

    +

    1.12. Edit Internet mail and news processing.

    Email and news is setup here. There are three possible configurations which you -can set with 1.15.11: +can set with 1.12.11:

    • No internet. If you don't have any connection to the internet use this setting. Email will come from the default Fidonet UUCP gate and will be send out @@ -347,7 +326,7 @@ In UUCP mode the NNTP entries are replaced by:

      -

      1.14. Allfiles and Newfiles lists.

      +

      1.13. Allfiles and Newfiles lists.

      These are the settings that affect the generation of newfiles and allfiles reports.

      @@ -356,7 +335,7 @@ These are the settings that affect the generation of newfiles and allfiles repor
       Groups            The number of newfile groups the newfiles database can hold
       

      -

      1.15. Mailer Setup.

      +

      1.14. Mailer Setup.

      Note that you can't disable FTS-0001 sessions as that is a mandatory session protocol in Fidonet. There are 40 phonenumber translations present, this is for @@ -385,7 +364,7 @@ XX,CM and TCP/IP systems (internet) should use the XX,CM,IBN,IFC flags. Max. MBytes Maximum MBytes to request, 0 is unlimited -

      1.16. FTPD Settings.

      +

      1.15. FTPD Settings.

      A new program is mbftpd. This is a replacement for the normal ftp server for Linux with special futures for MBSE BBS. This is not working @@ -411,7 +390,7 @@ yet and is not included in the distribution. Setting it up is adviced. User mbse If user mbse is allowed. Dangerous! -

      1.17. Edit HTML pages setup.

      +

      1.16. Edit HTML pages setup.

      Here you setup the HTML pages that can be created with the mbfile web command. These are HTML pages of your download @@ -444,7 +423,7 @@ there is no user authentication yet available.

      -

      1.18. Manager flag Descriptions.

      +

      1.17. Manager flag Descriptions.

      In this menu you can give the 32 area-/filemgr flags a meaningfull description.

      diff --git a/lib/structs.h b/lib/structs.h index 100fb052..e5913cda 100644 --- a/lib/structs.h +++ b/lib/structs.h @@ -633,15 +633,15 @@ struct sysconfig { int iMaxPageTimes; /* Max Pages per call */ unsigned iAskReason : 1; /* Ask Reason */ int iSysopArea; /* Msg Area if Sysop not in */ - unsigned iExternalChat : 1; /* Use External Chat */ - char sExternalChat[50]; /* External Chat Program */ - unsigned iAutoLog : 1; /* Log Chats ? */ - char sChatDevice[20]; /* Chat Device */ + unsigned xxExternalChat : 1; + char xExternalChat[50]; + unsigned iAutoLog : 1; /* Log Chats */ + char xChatDevice[20]; unsigned iChatPromptChk; /* Check for chat at prompt */ unsigned iStopChatTime; /* Stop time during chat */ - char cStartTime[7][6]; /* Starting Times */ - char cStopTime[7][6]; /* Stop Times */ - char sCallScript[51]; /* Sysop External Call scr. */ + char xStartTime[7][6]; + char xStopTime[7][6]; + char xCallScript[51]; /* Mail Options */ char xquotestr[11]; /* Quote String */ diff --git a/mbsebbs/Makefile b/mbsebbs/Makefile index 31cc61bb..c8ab9b47 100644 --- a/mbsebbs/Makefile +++ b/mbsebbs/Makefile @@ -155,7 +155,7 @@ menu.o: ../config.h ../lib/libs.h ../lib/memwatch.h ../lib/mbse.h ../lib/structs pop3.o: ../config.h ../lib/libs.h ../lib/memwatch.h ../lib/mbse.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h ../lib/mbinet.h ../lib/msgtext.h ../lib/msg.h msgutil.h pop3.h lastcallers.o: ../config.h ../lib/libs.h ../lib/memwatch.h ../lib/mbse.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/clcomm.h ../lib/common.h input.h language.h lastcallers.h timeout.o: ../config.h ../lib/libs.h ../lib/memwatch.h ../lib/mbse.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h ../lib/msg.h timeout.h funcs.h bye.h filesub.h language.h -chat.o: ../config.h ../lib/libs.h ../lib/memwatch.h ../lib/mbse.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h chat.h funcs.h input.h language.h misc.h whoson.h +chat.o: ../config.h ../lib/libs.h ../lib/ansi.h ../lib/memwatch.h ../lib/mbse.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h ../lib/mberrors.h chat.h funcs.h input.h language.h misc.h whoson.h file.o: ../config.h ../lib/libs.h ../lib/memwatch.h ../lib/mbse.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h filesub.h file.h funcs.h input.h language.h misc.h timeout.h exitinfo.h whoson.h change.h mbstat.o: ../config.h ../lib/libs.h ../lib/memwatch.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/common.h ../lib/clcomm.h ../lib/dbcfg.h ../lib/mberrors.h mbstat.h misc.o: ../config.h ../lib/libs.h ../lib/memwatch.h ../lib/mbse.h ../lib/structs.h ../lib/users.h ../lib/records.h ../lib/clcomm.h ../lib/common.h ../lib/mberrors.h funcs.h input.h language.h misc.h timeout.h exitinfo.h diff --git a/mbsebbs/chat.c b/mbsebbs/chat.c index 575f33bb..37a97455 100644 --- a/mbsebbs/chat.c +++ b/mbsebbs/chat.c @@ -4,7 +4,7 @@ * Purpose ...............: Sysop to user chat utility * ***************************************************************************** - * Copyright (C) 1997-2002 + * Copyright (C) 1997-2003 * * Michiel Broek FIDO: 2:280/2802 * Beekmansbos 10 @@ -30,6 +30,7 @@ #include "../config.h" #include "../lib/libs.h" +#include "../lib/ansi.h" #include "../lib/memwatch.h" #include "../lib/mbse.h" #include "../lib/structs.h" @@ -37,6 +38,7 @@ #include "../lib/records.h" #include "../lib/common.h" #include "../lib/clcomm.h" +#include "../lib/mberrors.h" #include "chat.h" #include "funcs.h" #include "input.h" @@ -45,150 +47,286 @@ #include "whoson.h" - -#define DEVICE "/tmp/chatdev" +int chat_with_sysop = FALSE; /* Global sysop chat flag */ +int chatting = FALSE; /* Global chatting flag */ +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 */ +extern pid_t mypid; -void Chat(int channel) +void DispMsg(char *); +void clrtoeol(void); +unsigned char testkey(int, int); + + + +unsigned char testkey(int y, int x) { - FILE *pGetDev, *pLog, *pBusy, *pChat; - int ch; - int iLetter = 0; - char sDevice[20]; - char *sLog = NULL; - char temp[81] = ""; + int rc; + unsigned char ch = 0; - if (CFG.iAutoLog) - sLog = calloc(56, sizeof(char)); + Nopper(); + locate(y, x); + fflush(stdout); - WhosDoingWhat(SYSOPCHAT); + if ((ttyfd = open("/dev/tty", O_RDWR|O_NONBLOCK)) < 0) { + perror("open /dev/tty"); + exit(MBERR_TTYIO_ERROR); + } + Setraw(); - clear(); - - if((pGetDev = fopen(DEVICE,"r")) == NULL) - WriteError("Can't open file:", DEVICE); - else { - fscanf(pGetDev, "%19s", sDevice); - fclose(pGetDev); - } - - if(( pChat = fopen(sDevice,"w")) == NULL) - perror("Error"); - - /* - * Check to see if it must load a external chat program - * Check the length of the chat program is greater than Zero - * Check if user has execute permisson on the chat program - */ - if(!CFG.iExternalChat || (strlen(CFG.sExternalChat) < 1) || \ - (access(CFG.sExternalChat, X_OK) != 0)) { - if ((pBusy = fopen("/tmp/.BusyChatting", "w")) == NULL) - WriteError("Unable to open BusyChatting file", "/tmp/.BusyChatting"); - else { - fprintf(pBusy, "%s", pTTY); - fclose(pBusy); - } - - sprintf(temp, "/tmp/.chat.%s", pTTY); - if(( pBusy = fopen(temp, "w")) == NULL) - WriteError("Unable to open chat.tty file", temp); - else - fclose(pBusy); - - colour(10, 0); - printf("%s\n\r", (char *) Language(59)); - fflush(stdout); - Setraw(); - - sleep(2); - - Syslog('+', "Sysop chat started"); - - fprintf(pChat, "%s is ready ... \n\r",exitinfo.sUserName); - - while (1) { - ch = getc(stdin); - ch &= '\377'; - /* The next statement doesn't work, the chat will start again */ - if (ch == '\007') { - Syslog('+', "Sysop chat ended - User exited chat"); - unlink("/tmp/chatdev"); - sprintf(temp, "/tmp/.chat.%s", pTTY); - unlink(temp); - unlink("/tmp/.BusyChatting"); - Unsetraw(); - break; - } - putchar(ch); - putc(ch, pChat); - - if(CFG.iAutoLog) { - if(ch != '\b') - iLetter++; /* Count the letters user presses for logging */ - sprintf(sLog, "%s%c", sLog, ch); - } - - if (ch == '\n') { - ch = '\r'; - putchar(ch); - putc(ch, pChat); - } - - if (ch == '\r') { - ch = '\n'; - putchar(ch); - putc(ch, pChat); - } - - if (ch == '\b') { - ch = ' '; - putchar(ch); - putc(ch, pChat); - ch = '\b'; - putchar(ch); - putc(ch, pChat); - - if(CFG.iAutoLog) - sLog[--iLetter] = '\0'; - } - - /* Check if log chat is on and if so log chat to disk */ - if(CFG.iAutoLog) { - if(iLetter >= 55 || ch == '\n') { - iLetter = 0; - sprintf(temp, "%s/etc/%s", getenv("MBSE_ROOT"), CFG.chat_log); - if(( pLog = fopen(temp, "a+")) != NULL) { - fflush(pLog); - fprintf(pLog, "%s [%s]: %s\n", exitinfo.sUserName, (char *) GetLocalHM(), sLog); - fclose(pLog); - strcpy(sLog, ""); - } - } - } - - if(access("/tmp/chatdev", R_OK) != 0) { - colour(10, 0); - printf("\n\n\n%s\n\n\r", (char *) Language(60)); - Syslog('+', "Sysop chat ended"); - sprintf(temp, "/tmp/.chat.%s", pTTY); - unlink(temp); - unlink("/tmp/.BusyChatting"); - Unsetraw(); - Pause(); - break; - } - } - /* End of ExternalChat Check */ - } else { - system(CFG.sExternalChat); - printf("\n\n"); - Pause(); - } - - if(CFG.iAutoLog) - free(sLog); - - fclose(pChat); + rc = Waitchar(&ch, 50); + if (rc == 1) { + if (ch == KEY_ESCAPE) + rc = Escapechar(&ch); + } + Unsetraw(); + close(ttyfd); + if (rc == 1) + return ch; + else + return '\0'; +} + + + +/* + * Display received chat message in the chat window. + */ +void DispMsg(char *msg) +{ + int i; + + strncpy(rbuf[rpointer], msg, 80); + mvprintw(2 + rpointer, 1, rbuf[rpointer]); + if (rpointer == rsize) { + /* + * Scroll buffer + */ + for (i = 0; i <= rsize; i++) { + locate(i + 2, 1); + clrtoeol(); + sprintf(rbuf[i], "%s", rbuf[i+1]); + mvprintw(i + 2, 1, rbuf[i]); + } + } else { + rpointer++; + } + fflush(stdout); +} + + + +/* + * Clear to End Of Line + */ +void clrtoeol(void) +{ + fprintf(stdout, ANSI_CLREOL); +} + + + +/* + * Chat, if the parameters are not NULL, a connection with the named + * channel is made with the give username which will be forced to the + * used nick name. This mode is used for forced sysop chat. + * If the parameters are NULL, then it's up to the user what happens. + */ +void Chat(char *username, char *channel) +{ + int curpos = 0, stop = FALSE, data; + unsigned char ch; + char sbuf[81], resp[128], *cnt, *msg; + static char buf[200]; + + WhosDoingWhat(SYSOPCHAT); + clear(); + + rsize = exitinfo.iScreenLen - 5; + rpointer = 0; + + if (username && channel) { + colour(LIGHTGREEN, BLACK); + /* *** Sysop is starting chat *** */ + printf("\007%s\n\r", (char *) Language(59)); + fflush(stdout); + sleep(1); + printf("\007"); + fflush(stdout); + sleep(1); + printf("\007"); + fflush(stdout); + Syslog('+', "Sysop chat started"); + chat_with_sysop = TRUE; + } else { + Syslog('+', "User started chatting"); + } + + /* + * Setup the screen, this is only possible in ANSI mode. + */ + clear(); + locate(1, 1); + colour(WHITE, BLUE); + clrtoeol(); + mvprintw(1, 2, "MBSE BBS Chat Server"); + + 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'; + colour(LIGHTRED, BLACK); + mvprintw(4, 1, msg); + sleep(2); + Pause(); + return; + chat_with_sysop = FALSE; + } + } + + locate(exitinfo.iScreenLen - 2, 1); + colour(WHITE, BLUE); + clrtoeol(); + mvprintw(exitinfo.iScreenLen - 2, 2, "Chat, type \"/EXIT\" to exit"); + + colour(LIGHTGRAY, BLACK); + mvprintw(exitinfo.iScreenLen - 1, 1, ">"); + memset(&sbuf, 0, sizeof(sbuf)); + memset(&rbuf, 0, sizeof(rbuf)); + + Syslog('-', "Start loop"); + chatting = TRUE; + + while (stop == FALSE) { + + /* + * Check for new message, loop fast until no more data available. + */ + 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; + } + } + } + + /* + * Check for a pressed key, if so then process it + */ + ch = testkey(exitinfo.iScreenLen -1, curpos + 2); + if (ch == '@') { + break; + } else if (isprint(ch)) { + if (curpos < 77) { + putchar(ch); + fflush(stdout); + sbuf[curpos] = ch; + curpos++; + } else { + putchar(7); + fflush(stdout); + } + } else if ((ch == KEY_BACKSPACE) || (ch == KEY_RUBOUT) || (ch == KEY_DEL)) { + if (curpos) { + curpos--; + sbuf[curpos] = '\0'; + printf("\b \b"); + } else { + putchar(7); + } + } else if ((ch == '\r') && curpos) { + 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); + 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)); + locate(exitinfo.iScreenLen - 1, 2); + clrtoeol(); + mvprintw(exitinfo.iScreenLen - 1, 1, ">"); + } + } + chatting = FALSE; + + + /* + * 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; + } + } + } + + if (username && channel) { + /* + * Disjoin sysop channel + */ + + /* *** Sysop has terminated chat *** */ + sprintf(buf, "%s", (char *) Language(60)); + DispMsg(buf); + Syslog('+', "Sysop chat ended"); + chat_with_sysop = FALSE; + } else { + Syslog('+', "User chat ended"); + } + + /* + * 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(2); + clear(); } diff --git a/mbsebbs/chat.h b/mbsebbs/chat.h index 29d347be..7f1d5157 100644 --- a/mbsebbs/chat.h +++ b/mbsebbs/chat.h @@ -3,6 +3,6 @@ /* $Id$ */ -void Chat(int); /* Chat Function */ +void Chat(char *, char *); /* Chat Function */ #endif diff --git a/mbsebbs/mbsebbs.c b/mbsebbs/mbsebbs.c index a793ca23..d9b81d88 100644 --- a/mbsebbs/mbsebbs.c +++ b/mbsebbs/mbsebbs.c @@ -4,7 +4,7 @@ * Purpose ...............: Main startup * ***************************************************************************** - * Copyright (C) 1997-2002 + * Copyright (C) 1997-2003 * * Michiel Broek FIDO: 2:280/2802 * Beekmansbos 10 @@ -157,10 +157,6 @@ int main(int argc, char **argv) */ TermInit(1); - sprintf(temp, "chat.%s", pTTY); - if (access(temp, F_OK) == 0) - unlink(temp); - /* * Now it's time to check if the bbs is open. If not, we * log the user off. diff --git a/mbsebbs/menu.c b/mbsebbs/menu.c index 5daf86e3..8c61d180 100644 --- a/mbsebbs/menu.c +++ b/mbsebbs/menu.c @@ -67,6 +67,8 @@ #include "signature.h" +extern pid_t mypid; + /* * Menu stack, 50 levels deep. @@ -93,7 +95,7 @@ void menu() { FILE *pMenuFile; int iFoundKey = FALSE, Key, IsANSI; - char *Input, *Semfile, *sMenuPathFileName; + char *Input, *Semfile, *sMenuPathFileName, buf[81]; Input = calloc(PATH_MAX, sizeof(char)); sMenuPathFileName = calloc(PATH_MAX, sizeof(char)); @@ -191,19 +193,23 @@ void menu() free(Semfile); /* - * Check if SysOp wants to chat to user everytime user - * gets prompt. Make sure /tmp/chatdev exists before - * before calling chat(). Make sure if a second user - * logs in, that .BusyChatting does exist. + * Check if SysOp wants to chat to user everytime user gets prompt. */ - if (CFG.iChatPromptChk && (access("/tmp/chatdev", R_OK) == 0) && (access("/tmp/.BusyChatting", F_OK) != 0)) - Chat(0); + if (CFG.iChatPromptChk) { + sprintf(buf, "CISC:1,%d", mypid); + if (socket_send(buf) == 0) { + strcpy(buf, socket_receive()); + if (strcmp(buf, "100:1,1;") == 0) { + Syslog('+', "Forced sysop/user chat"); + Chat(exitinfo.Name, (char *)"#sysop"); + } + } + } /* * Check users timeleft */ TimeCheck(); - alarm_on(); if (exitinfo.HotKeys) { @@ -409,6 +415,11 @@ void DoMenu(int Type) /* display menuline only */ break; + case 22: + /* Chat with any user */ + Chat(NULL, NULL); + break; + case 101: FileArea_List(menus.OptionalData); break; diff --git a/mbsebbs/newuser.c b/mbsebbs/newuser.c index 30b32452..1a09113e 100644 --- a/mbsebbs/newuser.c +++ b/mbsebbs/newuser.c @@ -5,7 +5,7 @@ * BBS and unix accounts. * ***************************************************************************** - * Copyright (C) 1997-2002 + * Copyright (C) 1997-2003 * * Michiel Broek FIDO: 2:280/2802 * Beekmansbos 10 @@ -66,6 +66,7 @@ char UnixName[9]; /* Unix Name */ extern char *ieHandle; /* Users Handle */ extern time_t t_start; /* Program starttime */ int do_mailout = FALSE; /* Just for linking */ +int chat_with_sysop = FALSE; /* Just for linking */ diff --git a/mbsebbs/page.c b/mbsebbs/page.c index f76ed1c4..d62c1778 100644 --- a/mbsebbs/page.c +++ b/mbsebbs/page.c @@ -5,7 +5,7 @@ * Todo ..................: Implement new config settings. * ***************************************************************************** - * Copyright (C) 1997-2002 + * Copyright (C) 1997-2003 * * Michiel Broek FIDO: 2:280/2802 * Beekmansbos 10 @@ -191,10 +191,22 @@ void Page_Sysop(char *String) fflush(stdout); sleep(1); - // if drop into chat - // Chat(); - // free(Reason); - // return; + sprintf(buf, "CISC:1,%d", mypid); + if (socket_send(buf) == 0) { + strcpy(buf, socket_receive()); + if (strcmp(buf, "100:1,1;") == 0) { + /* + * First cancel page request + */ + sprintf(buf, "CCAN:1,%d", mypid); + socket_send(buf); + socket_receive(); + Syslog('+', "Sysop responded to paging request"); + Chat(exitinfo.Name, (char *)"#sysop"); + free(Reason); + return; + } + } } /* diff --git a/mbsebbs/timecheck.c b/mbsebbs/timecheck.c index a732c3b8..bbb89b62 100644 --- a/mbsebbs/timecheck.c +++ b/mbsebbs/timecheck.c @@ -4,7 +4,7 @@ * Purpose ...............: Timecheck functions * ***************************************************************************** - * Copyright (C) 1997-2002 + * Copyright (C) 1997-2003 * * Michiel Broek FIDO: 2:280/2802 * Beekmansbos 10 Internet: mbroek@users.sourceforge.net @@ -46,10 +46,11 @@ #include "input.h" -extern pid_t mypid; /* Pid of this program */ +extern pid_t mypid; /* Pid of this program */ +extern int chat_with_sysop; /* True if chatting with sysop */ -/* +/* * Check for a personal message, this will go via mbsed. If there * is a message, it will be displayed, else nothing happens. */ @@ -103,11 +104,10 @@ void TimeCheck(void) iUserTimeLeft -= Elapsed; sprintf(sUserTimeleft, "%d", iUserTimeLeft); - sprintf(temp, "/tmp/.chat.%s", pTTY); /* * Update users counter if not chatting */ - if(!CFG.iStopChatTime || (access(temp, F_OK) != 0)) { + if (!CFG.iStopChatTime || (! chat_with_sysop)) { exitinfo.iTimeLeft -= Elapsed; exitinfo.iConnectTime += Elapsed; exitinfo.iTimeUsed += Elapsed; diff --git a/mbsetup/ledit.c b/mbsetup/ledit.c index 98df08a9..284ce7cb 100644 --- a/mbsetup/ledit.c +++ b/mbsetup/ledit.c @@ -2086,6 +2086,7 @@ char *getmenutype(int val) case 19: return (char *)"Display textfile with more"; case 20: return (char *)"Display .A?? file with Enter"; case 21: return (char *)"Display Text Only"; + case 22: return (char *)"User chat session"; case 101: return (char *)"Select new file area"; case 102: return (char *)"List files in current area"; diff --git a/mbsetup/m_global.c b/mbsetup/m_global.c index e011e854..741e1bf8 100644 --- a/mbsetup/m_global.c +++ b/mbsetup/m_global.c @@ -4,7 +4,7 @@ * Purpose ...............: Global Setup Program * ***************************************************************************** - * Copyright (C) 1997-2002 + * Copyright (C) 1997-2003 * * Michiel Broek FIDO: 2:280/2802 * Beekmansbos 10 @@ -547,98 +547,39 @@ void e_colors(void) void e_paging(void) { - clr_index(); + clr_index(); + set_color(WHITE, BLACK); + mvprintw( 5, 2, "1.9 EDIT SYSOP PAGING"); + set_color(CYAN, BLACK); + mvprintw( 7, 2, "1. Page Length"); + mvprintw( 8, 2, "2. Page Times"); + mvprintw( 9, 2, "3. Sysop Area"); + mvprintw(10, 2, "4. Ask Reason"); + mvprintw(11, 2, "5. Log Chat"); + mvprintw(12, 2, "6. Prompt Chk."); + mvprintw(13, 2, "7. Freeze Time"); + + for (;;) { set_color(WHITE, BLACK); - mvprintw( 5, 2, "1.9 EDIT SYSOP PAGING"); - set_color(CYAN, BLACK); - mvprintw( 7, 2, "1. Ext. Chat"); - mvprintw( 8, 2, "2. Chat Device"); - mvprintw( 9, 2, "3. Call Script"); - mvprintw(10, 2, "4. Page Length"); - mvprintw(11, 2, "5. Page Times"); - mvprintw(12, 2, "6. Sysop Area"); - mvprintw(13, 2, "7. Ask Reason"); - mvprintw(14, 2, "8. Use Extern"); - mvprintw(15, 2, "9. Log Chat"); - mvprintw(16, 2, "10. Prompt Chk."); - mvprintw(17, 2, "11. Freeze Time"); + show_int( 7,20, CFG.iPageLength); + show_int( 8,20, CFG.iMaxPageTimes); + show_int( 9,20, CFG.iSysopArea); + show_bool(10,20, CFG.iAskReason); + show_bool(11,20, CFG.iAutoLog); + show_bool(12,20, CFG.iChatPromptChk); + show_bool(13,20, CFG.iStopChatTime); - mvprintw(11,42, "12. Sunday"); - mvprintw(12,42, "13. Monday"); - mvprintw(13,42, "14. Tuesday"); - mvprintw(14,42, "15. Wednesday"); - mvprintw(15,42, "16. Thursday"); - mvprintw(16,42, "17. Friday"); - mvprintw(17,42, "18. Saterday"); - - for (;;) { - set_color(WHITE, BLACK); - show_str( 7,20,49, CFG.sExternalChat); - show_str( 8,20,19, CFG.sChatDevice); - show_str( 9,20,50, CFG.sCallScript); - show_int(10,20, CFG.iPageLength); - show_int(11,20, CFG.iMaxPageTimes); - show_int(12,20, CFG.iSysopArea); - show_bool(13,20, CFG.iAskReason); - show_bool(14,20, CFG.iExternalChat); - show_bool(15,20, CFG.iAutoLog); - show_bool(16,20, CFG.iChatPromptChk); - show_bool(17,20, CFG.iStopChatTime); - - show_str(11,58,5, CFG.cStartTime[0]); - show_str(12,58,5, CFG.cStartTime[1]); - show_str(13,58,5, CFG.cStartTime[2]); - show_str(14,58,5, CFG.cStartTime[3]); - show_str(15,58,5, CFG.cStartTime[4]); - show_str(16,58,5, CFG.cStartTime[5]); - show_str(17,58,5, CFG.cStartTime[6]); - - show_str(11,65,5, CFG.cStopTime[0]); - show_str(12,65,5, CFG.cStopTime[1]); - show_str(13,65,5, CFG.cStopTime[2]); - show_str(14,65,5, CFG.cStopTime[3]); - show_str(15,65,5, CFG.cStopTime[4]); - show_str(16,65,5, CFG.cStopTime[5]); - show_str(17,65,5, CFG.cStopTime[6]); - - switch(select_menu(18)) { - case 0: return; - - case 1: E_STR( 7,20,49, CFG.sExternalChat, "The name of the ^External Chat^ program.") - case 2: E_STR( 8,20,19, CFG.sChatDevice, "The ^device^ to use for chat") - case 3: E_STR( 9,20,50, CFG.sCallScript, "The ^Call Script^ to connect to remote sysop") - case 4: E_INT( 10,20, CFG.iPageLength, "The ^Length^ of paging in seconds") - case 5: E_INT( 11,20, CFG.iMaxPageTimes, "The ^Maximum times^ a user may page in a session") - case 6: E_INT( 12,20, CFG.iSysopArea, "The ^Message Area^ for ^Message to sysop^ when page fails") - case 7: E_BOOL(13,20, CFG.iAskReason, "Ask the user the ^reason for chat^") - case 8: E_BOOL(14,20, CFG.iExternalChat, "Use ^External Chat^ program") - case 9: E_BOOL(15,20, CFG.iAutoLog, "^Automatic log^ chat sessions") - case 10:E_BOOL(16,20, CFG.iChatPromptChk, "Check for chat at the ^prompt^") - case 11:E_BOOL(17,20, CFG.iStopChatTime, "^Stop^ users time during chat") - case 12:strcpy(CFG.cStartTime[0], edit_str(11,58,5, CFG.cStartTime[0], (char *)"Start Time paging on ^Sunday^")); - strcpy(CFG.cStopTime[0], edit_str(11,65,5, CFG.cStopTime[0], (char *)"Stop Time paging on ^Sunday^")); - break; - case 13:strcpy(CFG.cStartTime[1], edit_str(12,58,5, CFG.cStartTime[1], (char *)"Start Time paging on ^Monday^")); - strcpy(CFG.cStopTime[1], edit_str(12,65,5, CFG.cStopTime[1], (char *)"Stop Time paging on ^Monday^")); - break; - case 14:strcpy(CFG.cStartTime[2], edit_str(13,58,5, CFG.cStartTime[2], (char *)"Start Time paging on ^Tuesday^")); - strcpy(CFG.cStopTime[2], edit_str(13,65,5, CFG.cStopTime[2], (char *)"Stop Time paging on ^Tuesday^")); - break; - case 15:strcpy(CFG.cStartTime[3], edit_str(14,58,5, CFG.cStartTime[3], (char *)"Start Time paging on ^Wednesday^")); - strcpy(CFG.cStopTime[3], edit_str(14,65,5, CFG.cStopTime[3], (char *)"Stop Time paging on ^Wednesday^")); - break; - case 16:strcpy(CFG.cStartTime[4], edit_str(15,58,5, CFG.cStartTime[4], (char *)"Start Time paging on ^Thursday^")); - strcpy(CFG.cStopTime[4], edit_str(15,65,5, CFG.cStopTime[4], (char *)"Stop Time paging on ^Thursday^")); - break; - case 17: - strcpy(CFG.cStartTime[5], edit_str(16,58,5, CFG.cStartTime[5], (char *)"Start Time paging on ^Friday^")); - strcpy(CFG.cStopTime[5], edit_str(16,65,5, CFG.cStopTime[5], (char *)"Stop Time paging on ^Friday^")); - break; - case 18:strcpy(CFG.cStartTime[6], edit_str(17,58,5, CFG.cStartTime[6], (char *)"Start Time paging on ^Saterday^")); - strcpy(CFG.cStopTime[6], edit_str(17,65,5, CFG.cStopTime[6], (char *)"Stop Time paging on ^Saterday^")); - break; - } - }; + switch(select_menu(7)) { + case 0: return; + case 1: E_INT( 7,20, CFG.iPageLength, "The ^Length^ of paging in seconds") + case 2: E_INT( 8,20, CFG.iMaxPageTimes, "The ^Maximum times^ a user may page in a session") + case 3: E_INT( 9,20, CFG.iSysopArea, "The ^Message Area^ for ^Message to sysop^ when page fails") + case 4: E_BOOL(10,20, CFG.iAskReason, "Ask the user the ^reason for chat^") + case 5: E_BOOL(11,20, CFG.iAutoLog, "^Automatic log^ chat sessions") + case 6: E_BOOL(12,20, CFG.iChatPromptChk, "Check for chat at the ^prompt^") + case 7: E_BOOL(13,20, CFG.iStopChatTime, "^Stop^ users time during chat") + } + } } @@ -1882,28 +1823,14 @@ int global_doc(FILE *fp, FILE *toc, int page) page = newpage(fp, page); addtoc(fp, toc, 1, 10, page, (char *)"Sysop paging"); - fprintf(fp, " Ext. Chat program %s\n", CFG.sExternalChat); - fprintf(fp, " Chat device %s\n", CFG.sChatDevice); - fprintf(fp, " Call sysop script %s\n", CFG.sCallScript); fprintf(fp, " Page length %d seconds\n", CFG.iPageLength); fprintf(fp, " Page times %d\n", CFG.iMaxPageTimes); fprintf(fp, " Sysop msg area %d\n", CFG.iSysopArea); fprintf(fp, " Ask chat reason %s\n", getboolean(CFG.iAskReason)); - fprintf(fp, " Use external chat %s\n", getboolean(CFG.iExternalChat)); fprintf(fp, " Log chat %s\n", getboolean(CFG.iAutoLog)); fprintf(fp, " Check at prompt %s\n", getboolean(CFG.iChatPromptChk)); fprintf(fp, " Freeze online time %s\n", getboolean(CFG.iStopChatTime)); - fprintf(fp, "\n Weekday Start Stop\n"); - fprintf(fp, " ------------- ----- -----\n"); - fprintf(fp, " Sunday %s %s\n", CFG.cStartTime[0], CFG.cStopTime[0]); - fprintf(fp, " Monday %s %s\n", CFG.cStartTime[1], CFG.cStopTime[1]); - fprintf(fp, " Tuesday %s %s\n", CFG.cStartTime[2], CFG.cStopTime[2]); - fprintf(fp, " Wednesday %s %s\n", CFG.cStartTime[3], CFG.cStopTime[3]); - fprintf(fp, " Thursday %s %s\n", CFG.cStartTime[4], CFG.cStopTime[4]); - fprintf(fp, " Friday %s %s\n", CFG.cStartTime[5], CFG.cStopTime[5]); - fprintf(fp, " Saterday %s %s\n", CFG.cStartTime[6], CFG.cStopTime[6]); - addtoc(fp, toc, 1, 11, page, (char *)"Fileecho processing"); fprintf(fp, " Keep days on hold %d\n", CFG.tic_days); diff --git a/mbsetup/m_menu.c b/mbsetup/m_menu.c index c69a766c..0bf83c07 100644 --- a/mbsetup/m_menu.c +++ b/mbsetup/m_menu.c @@ -195,7 +195,7 @@ int GetMenuType(void) mvprintw(12, 6, "6. BBS List menus"); switch (select_menu(6)) { - case 1: return GetSubmenu(1, 21); + case 1: return GetSubmenu(1, 22); case 2: return GetSubmenu(101, 19); case 3: return GetSubmenu(201, 21); case 4: return GetSubmenu(301, 20); diff --git a/mbtask/Makefile b/mbtask/Makefile index 53531f99..06219681 100644 --- a/mbtask/Makefile +++ b/mbtask/Makefile @@ -87,11 +87,11 @@ mbtask.o: ../config.h libs.h ../lib/structs.h ../paths.h ../lib/mberrors.h signa 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 -taskregs.o: ../config.h libs.h ../lib/structs.h taskstat.h taskregs.h taskutil.h +taskregs.o: ../config.h libs.h ../lib/structs.h taskstat.h taskregs.h taskchat.h taskutil.h taskutil.o: ../config.h libs.h ../lib/structs.h signame.h scanout.h crc.h taskutil.h ports.o: ../config.h libs.h ../lib/structs.h taskutil.h ../lib/nodelist.h ports.h 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 taskutil.h taskchat.h +taskchat.o: ../config.h libs.h ../lib/structs.h taskutil.h taskregs.h taskchat.h # End of generated dependencies diff --git a/mbtask/mbtask.c b/mbtask/mbtask.c index 00b11960..1b1dca74 100644 --- a/mbtask/mbtask.c +++ b/mbtask/mbtask.c @@ -258,16 +258,9 @@ void load_maincfg(void) CFG.iMaxPageTimes = 5; CFG.iAskReason = TRUE; CFG.iSysopArea = 1; - CFG.iExternalChat = FALSE; - strcpy(CFG.sExternalChat, "/usr/local/bin/chat"); CFG.iAutoLog = TRUE; - strcpy(CFG.sChatDevice, "/dev/tty01"); CFG.iChatPromptChk = TRUE; CFG.iStopChatTime = TRUE; - for (i = 0; i < 7; i++) { - sprintf(CFG.cStartTime[i], "18:00"); - sprintf(CFG.cStopTime[i], "23:59"); - } /* * Fill ticconf defaults diff --git a/mbtask/taskchat.c b/mbtask/taskchat.c index 627efe3d..0a8a9cd3 100644 --- a/mbtask/taskchat.c +++ b/mbtask/taskchat.c @@ -35,7 +35,7 @@ #include "taskregs.h" #include "taskchat.h" -#define MAXCHANNELS 100 /* Maximum chat channels */ +#define MAXCHANNELS 10 /* Maximum chat channels */ #define MAXMESSAGES 100 /* Maximum ringbuffer for messages */ @@ -73,6 +73,19 @@ typedef struct _chatmsg { +/* + * List of channels + */ +typedef struct _channel_rec { + char name[21]; /* Channel name */ + pid_t owner; /* Channel owner */ + int users; /* Users in channel */ + time_t created; /* Creation time */ + unsigned active : 1; /* Channel active */ +} _channel; + + + /* * List of banned users from a channel. This is a dynamic list. */ @@ -82,17 +95,42 @@ typedef struct _banned { } banned_users; + /* * The buffers */ -_chat_messages chat_messages[MAXMESSAGES]; -_chat_users chat_users[MAXCLIENT]; +_chat_messages chat_messages[MAXMESSAGES]; +_chat_users chat_users[MAXCLIENT]; +_channel chat_channels[MAXCHANNELS]; int buffer_head = 0; /* Messages buffer head */ extern struct sysconfig CFG; /* System configuration */ +/* + * Prototypes + */ +void chat_msg(int, char *, char *); + + + + +void chat_dump(void) +{ + int i; + + for (i = 0; i < MAXCLIENT; i++) + if (chat_users[i].pid) + Syslog('u', "%5d %-36s %2d %s", chat_users[i].pid, chat_users[i].name, chat_users[i].channel, + chat_users[i].chatting?"True":"False"); + for (i = 0; i < MAXCHANNELS; i++) + if (chat_channels[i].owner) + Syslog('c', "%-20s %5d %3d %s", chat_channels[i].name, chat_channels[i].owner, chat_channels[i].users, + chat_channels[i].active?"True":"False"); +} + + /* * Put a system message into the chatbuffer @@ -128,10 +166,158 @@ void chat_help(pid_t pid) +/* + * Join a channel + */ +int join(pid_t, char *); +int join(pid_t pid, char *channel) +{ + int i, j; + char buf[81]; + + Syslog('-', "Join pid %d to channel %s", pid, channel); + for (i = 0; i < MAXCHANNELS; i++) { + if (strcasecmp(chat_channels[i].name, channel) == 0) { + /* + * Excisting channel, add user to channel. + */ + chat_channels[i].users++; + for (j = 0; j < MAXCLIENT; j++) { + if (chat_users[j].pid == pid) { + chat_users[j].channel = i; + chat_users[j].chatting = TRUE; + Syslog('-', "Added user %d to channel %d", j, i); + chat_dump(); + sprintf(buf, "%s has joined channel #%s, now %d users", chat_users[j].name, channel, chat_channels[i].users); + chat_msg(i, NULL, buf); + return TRUE; + } + } + } + } + + /* + * No matching channel found, add a new channel. + */ + for (i = 0; i < MAXCHANNELS; i++) { + if (chat_channels[i].active == FALSE) { + /* + * Got one, register channel. + */ + strncpy(chat_channels[i].name, channel, 20); + chat_channels[i].owner = pid; + chat_channels[i].users = 1; + chat_channels[i].created = time(NULL); + chat_channels[i].active = TRUE; + Syslog('-', "Created channel %d", i); + /* + * Register user to channel + */ + for (j = 0; j < MAXCLIENT; j++) { + if (chat_users[j].pid == pid) { + chat_users[j].channel = i; + chat_users[j].chatting = TRUE; + Syslog('-', "Added user %d to channel %d", j, i); + sprintf(buf, "Created channel #%s", channel); + chat_msg(i, NULL, buf); + } + } + chat_dump(); + return TRUE; + } + } + + /* + * No matching or free channels + */ + Syslog('+', "Cannot create chat channel %s, no free channels", channel); + return FALSE; +} + + + +/* + * Part from a channel + */ +int part(pid_t, char*); +int part(pid_t pid, char *reason) +{ + int i; + char buf[81]; + + Syslog('-', "Part pid %d from channel, reason %s", pid, reason); + + for (i = 0; i < MAXCLIENT; i++) { + if ((chat_users[i].pid == pid) && chat_users[i].chatting) { + chat_channels[chat_users[i].channel].users--; + + /* + * Inform other users + */ + if (reason != NULL) + chat_msg(chat_users[i].channel, chat_users[i].name, reason); + sprintf(buf, "%s has left channel #%s, %d users left", chat_users[i].name, chat_channels[chat_users[i].channel].name, + chat_channels[chat_users[i].channel].users); + chat_msg(chat_users[i].channel, NULL, buf); + + /* + * First clean channel + */ + Syslog('-', "User leaves channel %s", chat_channels[chat_users[i].channel].name); + if (chat_channels[chat_users[i].channel].users == 0) { + /* + * Last user from channel, clear channel + */ + Syslog('-', "Remove channel %s, no more users left", chat_channels[chat_users[i].channel].name); + memset(&chat_channels[chat_users[i].channel], 0, sizeof(_channel)); + } + chat_users[i].channel = -1; + chat_users[i].chatting = FALSE; + chat_dump(); + return TRUE; + } + } + Syslog('-', "No channel found"); + return FALSE; +} + + + void chat_init(void) { memset(&chat_users, 0, sizeof(chat_users)); memset(&chat_messages, 0, sizeof(chat_messages)); + memset(&chat_channels, 0, sizeof(chat_channels)); +} + + + +void chat_cleanuser(pid_t pid) +{ + part(pid, (char *)"I'm hanging up!"); +} + + + +/* + * Send message into channel + */ +void chat_msg(int channel, char *nick, char *msg) +{ + int i; + char buf[128]; + + if (nick == NULL) + sprintf(buf, "%s", msg); + else + sprintf(buf, "<%s> %s", nick, msg); + buf[79] = '\0'; + + for (i = 0; i < MAXCLIENT; i++) { + if ((chat_users[i].channel == channel) && chat_users[i].chatting) { + system_msg(chat_users[i].pid, buf); + } + } } @@ -243,18 +429,19 @@ char *chat_put(char *data) */ if (strncasecmp(msg, "/help", 5) == 0) { chat_help(atoi(pid)); - sprintf(buf, "100:0;"); - return buf; + goto ack; } - if (strncasecmp(msg, "/exit", 5) == 0) { + if ((strncasecmp(msg, "/exit", 5) == 0) || + (strncasecmp(msg, "/quit", 5) == 0) || + (strncasecmp(msg, "/bye", 4) == 0)) { + part(chat_users[i].pid, (char *)"Quitting"); /* * 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; + goto ack; } if (strncasecmp(msg, "/join", 5) == 0) { cmd = strtok(msg, " \0"); @@ -266,9 +453,20 @@ char *chat_put(char *data) system_msg(chat_users[i].pid, buf); } else { Syslog('-', "Trying to join channel %s", cmd); + join(chat_users[i].pid, cmd+1); } - sprintf(buf, "100:0;"); - return buf; + goto ack; + } + if (strncasecmp(msg, "/part", 5) == 0) { + cmd = strtok(msg, " \0"); + Syslog('-', "\"%s\"", cmd); + cmd = strtok(NULL, "\0"); + Syslog('-', "\"%s\"", cmd); + if (part(chat_users[i].pid, cmd) == FALSE) { + sprintf(buf, "Not in a channel"); + system_msg(chat_users[i].pid, buf); + } + goto ack; } /* * If still here, the command was not recognized. @@ -276,8 +474,7 @@ char *chat_put(char *data) 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; + goto ack; } if (chat_users[i].channel == -1) { /* @@ -285,16 +482,22 @@ char *chat_put(char *data) */ sprintf(buf, "No channel joined. Try /join #channel"); system_msg(chat_users[i].pid, buf); - sprintf(buf, "100:0;"); - return buf; + chat_dump(); + goto ack; + } else { + chat_msg(chat_users[i].channel, chat_users[i].name, msg); + chat_dump(); } - sprintf(buf, "100:0;"); - return buf; + goto ack; } } Syslog('-', "Pid %s was not connected to chatserver"); sprintf(buf, "100:1,ERROR - Not connected to server;"); return buf; + +ack: + sprintf(buf, "100:0;"); + return buf; } @@ -305,7 +508,7 @@ char *chat_get(char *data) char *pid; int i; - Syslog('-', "CGET:%s", data); +// Syslog('-', "CGET:%s", data); memset(&buf, 0, sizeof(buf)); pid = strtok(data, ","); pid = strtok(NULL, ";"); diff --git a/mbtask/taskchat.h b/mbtask/taskchat.h index 61e36e77..bf9735cb 100644 --- a/mbtask/taskchat.h +++ b/mbtask/taskchat.h @@ -4,6 +4,7 @@ /* $Id$ */ void chat_init(void); +void chat_cleanuser(pid_t); char *chat_connect(char *); char *chat_close(char *); char *chat_put(char *); diff --git a/mbtask/taskregs.c b/mbtask/taskregs.c index 11e7c11e..8b73e399 100644 --- a/mbtask/taskregs.c +++ b/mbtask/taskregs.c @@ -33,6 +33,7 @@ #include "../lib/structs.h" #include "taskstat.h" #include "taskregs.h" +#include "taskchat.h" #include "taskutil.h" extern reg_info reginfo[MAXCLIENT]; /* Array with clients */ @@ -130,6 +131,9 @@ int reg_closecon(char *data) mailers--; if (reginfo[rec].istcp) ipmailers--; + if ((strcmp(reginfo[rec].prg, (char *)"mbsebbs") == 0) || (strcmp(reginfo[rec].prg, (char *)"mbmon") == 0)) + chat_cleanuser(atoi(pid)); + Syslog('-', "Unregistered client pgm \"%s\", pid %s, slot %d, mailers %d, TCP/IP %d", reginfo[rec].prg, pid, rec, mailers, ipmailers); memset(®info[rec], 0, sizeof(reg_info)); @@ -156,11 +160,11 @@ void reg_check(void) mailers--; if (reginfo[i].istcp) ipmailers--; + if ((strcmp(reginfo[i].prg, (char *)"mbsebbs") == 0) || (strcmp(reginfo[i].prg, (char *)"mbmon") == 0)) + chat_cleanuser(reginfo[i].pid); + Syslog('?', "Stale registration found for pid %d (%s), mailers now %d, TCP/IP now %d", reginfo[i].pid, reginfo[i].prg, mailers, ipmailers); - - // FIXME: If this was a moderators chat channel, kill the whole channel - memset(®info[i], 0, sizeof(reg_info)); stat_dec_clients(); }