Updates for chat from the bbs

This commit is contained in:
Michiel Broek 2003-04-01 21:41:36 +00:00
parent c1f5ccef3c
commit 58ea13aff8
23 changed files with 628 additions and 353 deletions

View File

@ -12,6 +12,10 @@ v0.37.2 23-Feb-2003.
general: general:
System prepared for setting the official FTSC product code, System prepared for setting the official FTSC product code,
this will be 0x11FF. The code is not yet activated. 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: common.a:
New function to get the real case of a filename. 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 To page the sysop, the CPAG and CCAN commands to mbtask are now
used. Until the chatserver is ready, there is no buildin sysop used. Until the chatserver is ready, there is no buildin sysop
user chat. 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: mbmon:
Reports sysop available or left the system when mbmon starts Reports sysop available or left the system when mbmon starts

View File

@ -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/ftpserver.html misc/ipmailer.html misc/outbound.html \
misc/usleep.html misc/webserver.html misc/usleep.html misc/webserver.html
H_PROGS = programs/mbchat.html \ H_PROGS = programs/mbfido.html programs/mbmon.html \
programs/mbfido.html programs/mbmon.html \
programs/mbtoberep.html programs/mblogin.html \ programs/mbtoberep.html programs/mblogin.html \
programs/index.htm programs/mbcico.html \ programs/index.htm programs/mbcico.html \
programs/mbfile.html programs/mbmsg.html \ programs/mbfile.html programs/mbmsg.html \

View File

@ -13,10 +13,10 @@
<BODY> <BODY>
<BLOCKQUOTE> <BLOCKQUOTE>
<center><img SRC="images/mbse.jpg" BORDER=0></center> <center><img SRC="images/mbse.jpg" BORDER=0></center>
<div align=center><h1>MBSE BBS System Guide v0.37.01</h1></div> <div align=center><h1>MBSE BBS System Guide v0.37.02</h1></div>
<HR> <HR>
<div align=right><h5>Last update 02-Mar-2003</h5></div> <div align=right><h5>Last update 23-Mar-2003</h5></div>
<P> <P>
@ -92,7 +92,6 @@
<ol> <ol>
<li><a href="programs/mbaff.html">mbaff, Announce newfiles and filefind</a></li> <li><a href="programs/mbaff.html">mbaff, Announce newfiles and filefind</a></li>
<li><a href="programs/mball.html">mball, Allfiles and newfiles list creator</a></li> <li><a href="programs/mball.html">mball, Allfiles and newfiles list creator</a></li>
<li><a href="programs/mbchat.html">mbchat, Sysop to user chat utility</a></li>
<li><a href="programs/mbcico.html">mbcico, The Fidonet mailer ala ifcico</a></li> <li><a href="programs/mbcico.html">mbcico, The Fidonet mailer ala ifcico</a></li>
<li><a href="programs/mbdiff.html">mbdiff, Nodelist difference processor</a></li> <li><a href="programs/mbdiff.html">mbdiff, Nodelist difference processor</a></li>
<li><a href="programs/mbfido.html">mbfido, Fidonet mail and files procesor</a></li> <li><a href="programs/mbfido.html">mbfido, Fidonet mail and files procesor</a></li>

View File

@ -12,7 +12,7 @@
</HEAD> </HEAD>
<BODY> <BODY>
<BLOCKQUOTE> <BLOCKQUOTE>
<DIV align=right><h5>Last update 23-Feb-2003</h5></DIV> <DIV align=right><h5>Last update 01-Apr-2003</h5></DIV>
<DIV align=center><h1>MBSE BBS Global Menus</h1></DIV> <DIV align=center><h1>MBSE BBS Global Menus</h1></DIV>
<hr> <hr>
@ -160,6 +160,13 @@
even if the display line is empty. In that case an empty line is displayed.<br> even if the display line is empty. In that case an empty line is displayed.<br>
<strong>Optional data:</strong> None.<br> <strong>Optional data:</strong> None.<br>
<P> <P>
<LI value="22"><strong>Chat session</strong> 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.<br>
<strong>Optional data:</strong> None yet, maybe the channel later.<br>
<P>
</OL> </OL>
<HR> <HR>

View File

@ -12,16 +12,13 @@
</HEAD> </HEAD>
<BODY> <BODY>
<BLOCKQUOTE> <BLOCKQUOTE>
<h5>Last update 10-May-2002</h5> <div align=right><h5>Last update 23-Mar-2003</h5></div>
<P>&nbsp;<P> <div align=center><h1>MBSE BBS Programs.</h1></div>
<h1>MBSE BBS Programs.</h1>
<ol> <ol>
<li><A HREF="mbaff.html">mbaff, Announce newfiles and filefind</A> <li><A HREF="mbaff.html">mbaff, Announce newfiles and filefind</A>
<li><A HREF="mball.html">mball, Allfiles and newfiles list creator</A> <li><A HREF="mball.html">mball, Allfiles and newfiles list creator</A>
<li><A HREF="mbchat.html">mbchat, Sysop to user chat utility</A>
<li><A HREF="mbcico.html">mbcico, The Fidonet mailer ala ifcico</A> <li><A HREF="mbcico.html">mbcico, The Fidonet mailer ala ifcico</A>
<li><A HREF="mbdiff.html">mbdiff, Nodelist difference processor</A> <li><A HREF="mbdiff.html">mbdiff, Nodelist difference processor</A>
<li><A HREF="mbfido.html">mbfido, Fidonet mail and files procesor</A> <li><A HREF="mbfido.html">mbfido, Fidonet mail and files procesor</A>

View File

@ -12,7 +12,7 @@
</HEAD> </HEAD>
<BODY> <BODY>
<BLOCKQUOTE> <BLOCKQUOTE>
<div align="right"><h5>Last update 02-Feb-2003</h5></div> <div align="right"><h5>Last update 01-Apr-2003</h5></div>
<div align="center"><H1>MBSE BBS Setup - Global Setup</H1></div> <div align="center"><H1>MBSE BBS Setup - Global Setup</H1></div>
<P> <P>
@ -159,43 +159,22 @@ menu.
<IMG SRC="../images/mbsetup1.6.S.gif" width="589" height="343"> <IMG SRC="../images/mbsetup1.6.S.gif" width="589" height="343">
<P> <P>
<h3>1.9. Safe cracker door.</h3> <h3>1.9. Sysop paging</h3>
<p> <p>
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.
<pre> <pre>
<strong>Digit 1 </strong>The first digit to guess
<strong>Digit 2 </strong>The second digit to guess
<strong>Digit 3 </strong>The third digit to guess
<strong>Max trys </strong>The maximum number of trys per day
<strong>Max numb </strong>The highest number to guess
<strong>Num gen </strong>Automatic number generation
<strong>Prize </strong>The prize to win
<strong>Welcome </strong>The welcome file to display
<strong>Opened </strong>The file to display to the winner
</pre>
<p>
<h3>1.10. Sysop paging</h3>
<p>
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.
<pre>
<strong>Ext. chat </strong>External chat program, not in use!
<strong>Chat device </strong>The device where the sysop is called (beeped)
<strong>Call script </strong>For future use
<strong>Page length </strong>The length of a page in seconds <strong>Page length </strong>The length of a page in seconds
<strong>Page times </strong>Maximum number of times a user may page the sysop <strong>Page times </strong>Maximum number of times a user may page the sysop
<strong>Sysop area </strong>Message from user to Sysop area number <strong>Sysop area </strong>Message from user to Sysop area number
<strong>Ask reason </strong>Ask reason for chat, this will be logged <strong>Ask reason </strong>Ask reason for chat, this will be logged
<strong>Use Extern </strong>Use external chat
<strong>Log Chat </strong>Log the chat conversation <strong>Log Chat </strong>Log the chat conversation
<strong>Prompt Chk. </strong>Check at menu prompts for Sysop breaking in <strong>Prompt Chk. </strong>Check at menu prompts for Sysop breaking in
<strong>Freeze Time </strong>Freeze users time during chat <strong>Freeze Time </strong>Freeze users time during chat
<strong>Sunday..Saturday </strong>The times the Sysop is normal available
</pre><p> </pre><p>
<h3>1.11. Fileecho Processing.</h3> <h3>1.10. Fileecho Processing.</h3>
<p> <p>
A note, when you change the number of Systems or Groups, the databases affected A note, when you change the number of Systems or Groups, the databases affected
will be updated automatic. 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. Default all these switches are set to Yes.
<p> <p>
<h3>1.12. Edit Fidonet mail and echomail processing.</h3> <h3>1.11. Edit Fidonet mail and echomail processing.</h3>
<p> <p>
Note that the first 2 mailboards must also exist in the normal mail areas if 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 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. and gated news articles to Fidonet.
<P> <P>
<h3>1.13. Edit Internet mail and news processing.</h3> <h3>1.12. Edit Internet mail and news processing.</h3>
<p> <p>
Email and news is setup here. There are three possible configurations which you 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:
<ul> <ul>
<li><strong>No internet</strong>. If you don't have any connection to the internet <li><strong>No internet</strong>. 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 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:
<P> <P>
<h3>1.14. Allfiles and Newfiles lists.</h3> <h3>1.13. Allfiles and Newfiles lists.</h3>
<p> <p>
These are the settings that affect the generation of newfiles and allfiles reports. These are the settings that affect the generation of newfiles and allfiles reports.
<pre> <pre>
@ -356,7 +335,7 @@ These are the settings that affect the generation of newfiles and allfiles repor
<strong>Groups </strong>The number of newfile groups the newfiles database can hold <strong>Groups </strong>The number of newfile groups the newfiles database can hold
</pre><p> </pre><p>
<h3>1.15. Mailer Setup.</h3> <h3>1.14. Mailer Setup.</h3>
<p> <p>
Note that you can't disable FTS-0001 sessions as that is a mandatory session 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 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.
<strong>Max. MBytes </strong>Maximum MBytes to request, 0 is unlimited <strong>Max. MBytes </strong>Maximum MBytes to request, 0 is unlimited
</pre> </pre>
<h3>1.16. FTPD Settings.</h3> <h3>1.15. FTPD Settings.</h3>
<p> <p>
A new program is <strong>mbftpd</strong>. This is a replacement for the normal A new program is <strong>mbftpd</strong>. This is a replacement for the normal
ftp server for Linux with special futures for MBSE BBS. This is not working 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.
<strong>User mbse </strong>If user <strong>mbse</strong> is allowed. Dangerous! <strong>User mbse </strong>If user <strong>mbse</strong> is allowed. Dangerous!
</pre> </pre>
<h3>1.17. Edit HTML pages setup.</h3> <h3>1.16. Edit HTML pages setup.</h3>
<p> <p>
Here you setup the HTML pages that can be created with the <strong> Here you setup the HTML pages that can be created with the <strong>
mbfile web</strong> command. These are HTML pages of your download mbfile web</strong> command. These are HTML pages of your download
@ -444,7 +423,7 @@ there is no user authentication yet available.
</pre> </pre>
<P> <P>
<h3>1.18. Manager flag Descriptions.</h3> <h3>1.17. Manager flag Descriptions.</h3>
<p> <p>
In this menu you can give the 32 area-/filemgr flags a meaningfull description. In this menu you can give the 32 area-/filemgr flags a meaningfull description.
<p> <p>

View File

@ -633,15 +633,15 @@ struct sysconfig {
int iMaxPageTimes; /* Max Pages per call */ int iMaxPageTimes; /* Max Pages per call */
unsigned iAskReason : 1; /* Ask Reason */ unsigned iAskReason : 1; /* Ask Reason */
int iSysopArea; /* Msg Area if Sysop not in */ int iSysopArea; /* Msg Area if Sysop not in */
unsigned iExternalChat : 1; /* Use External Chat */ unsigned xxExternalChat : 1;
char sExternalChat[50]; /* External Chat Program */ char xExternalChat[50];
unsigned iAutoLog : 1; /* Log Chats ? */ unsigned iAutoLog : 1; /* Log Chats */
char sChatDevice[20]; /* Chat Device */ char xChatDevice[20];
unsigned iChatPromptChk; /* Check for chat at prompt */ unsigned iChatPromptChk; /* Check for chat at prompt */
unsigned iStopChatTime; /* Stop time during chat */ unsigned iStopChatTime; /* Stop time during chat */
char cStartTime[7][6]; /* Starting Times */ char xStartTime[7][6];
char cStopTime[7][6]; /* Stop Times */ char xStopTime[7][6];
char sCallScript[51]; /* Sysop External Call scr. */ char xCallScript[51];
/* Mail Options */ /* Mail Options */
char xquotestr[11]; /* Quote String */ char xquotestr[11]; /* Quote String */

View File

@ -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 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 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 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 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 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 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

View File

@ -4,7 +4,7 @@
* Purpose ...............: Sysop to user chat utility * Purpose ...............: Sysop to user chat utility
* *
***************************************************************************** *****************************************************************************
* Copyright (C) 1997-2002 * Copyright (C) 1997-2003
* *
* Michiel Broek FIDO: 2:280/2802 * Michiel Broek FIDO: 2:280/2802
* Beekmansbos 10 * Beekmansbos 10
@ -30,6 +30,7 @@
#include "../config.h" #include "../config.h"
#include "../lib/libs.h" #include "../lib/libs.h"
#include "../lib/ansi.h"
#include "../lib/memwatch.h" #include "../lib/memwatch.h"
#include "../lib/mbse.h" #include "../lib/mbse.h"
#include "../lib/structs.h" #include "../lib/structs.h"
@ -37,6 +38,7 @@
#include "../lib/records.h" #include "../lib/records.h"
#include "../lib/common.h" #include "../lib/common.h"
#include "../lib/clcomm.h" #include "../lib/clcomm.h"
#include "../lib/mberrors.h"
#include "chat.h" #include "chat.h"
#include "funcs.h" #include "funcs.h"
#include "input.h" #include "input.h"
@ -45,150 +47,286 @@
#include "whoson.h" #include "whoson.h"
int chat_with_sysop = FALSE; /* Global sysop chat flag */
#define DEVICE "/tmp/chatdev" 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 rc;
int ch; unsigned char ch = 0;
int iLetter = 0;
char sDevice[20];
char *sLog = NULL;
char temp[81] = "";
if (CFG.iAutoLog) Nopper();
sLog = calloc(56, sizeof(char)); 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(); rc = Waitchar(&ch, 50);
if (rc == 1) {
if((pGetDev = fopen(DEVICE,"r")) == NULL) if (ch == KEY_ESCAPE)
WriteError("Can't open file:", DEVICE); rc = Escapechar(&ch);
else { }
fscanf(pGetDev, "%19s", sDevice); Unsetraw();
fclose(pGetDev); close(ttyfd);
} if (rc == 1)
return ch;
if(( pChat = fopen(sDevice,"w")) == NULL) else
perror("Error"); return '\0';
}
/*
* 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 /*
*/ * Display received chat message in the chat window.
if(!CFG.iExternalChat || (strlen(CFG.sExternalChat) < 1) || \ */
(access(CFG.sExternalChat, X_OK) != 0)) { void DispMsg(char *msg)
if ((pBusy = fopen("/tmp/.BusyChatting", "w")) == NULL) {
WriteError("Unable to open BusyChatting file", "/tmp/.BusyChatting"); int i;
else {
fprintf(pBusy, "%s", pTTY); strncpy(rbuf[rpointer], msg, 80);
fclose(pBusy); mvprintw(2 + rpointer, 1, rbuf[rpointer]);
} if (rpointer == rsize) {
/*
sprintf(temp, "/tmp/.chat.%s", pTTY); * Scroll buffer
if(( pBusy = fopen(temp, "w")) == NULL) */
WriteError("Unable to open chat.tty file", temp); for (i = 0; i <= rsize; i++) {
else locate(i + 2, 1);
fclose(pBusy); clrtoeol();
sprintf(rbuf[i], "%s", rbuf[i+1]);
colour(10, 0); mvprintw(i + 2, 1, rbuf[i]);
printf("%s\n\r", (char *) Language(59)); }
fflush(stdout); } else {
Setraw(); rpointer++;
}
sleep(2); fflush(stdout);
}
Syslog('+', "Sysop chat started");
fprintf(pChat, "%s is ready ... \n\r",exitinfo.sUserName);
/*
while (1) { * Clear to End Of Line
ch = getc(stdin); */
ch &= '\377'; void clrtoeol(void)
/* The next statement doesn't work, the chat will start again */ {
if (ch == '\007') { fprintf(stdout, ANSI_CLREOL);
Syslog('+', "Sysop chat ended - User exited chat"); }
unlink("/tmp/chatdev");
sprintf(temp, "/tmp/.chat.%s", pTTY);
unlink(temp);
unlink("/tmp/.BusyChatting"); /*
Unsetraw(); * Chat, if the parameters are not NULL, a connection with the named
break; * channel is made with the give username which will be forced to the
} * used nick name. This mode is used for forced sysop chat.
putchar(ch); * If the parameters are NULL, then it's up to the user what happens.
putc(ch, pChat); */
void Chat(char *username, char *channel)
if(CFG.iAutoLog) { {
if(ch != '\b') int curpos = 0, stop = FALSE, data;
iLetter++; /* Count the letters user presses for logging */ unsigned char ch;
sprintf(sLog, "%s%c", sLog, ch); char sbuf[81], resp[128], *cnt, *msg;
} static char buf[200];
if (ch == '\n') { WhosDoingWhat(SYSOPCHAT);
ch = '\r'; clear();
putchar(ch);
putc(ch, pChat); rsize = exitinfo.iScreenLen - 5;
} rpointer = 0;
if (ch == '\r') { if (username && channel) {
ch = '\n'; colour(LIGHTGREEN, BLACK);
putchar(ch); /* *** Sysop is starting chat *** */
putc(ch, pChat); printf("\007%s\n\r", (char *) Language(59));
} fflush(stdout);
sleep(1);
if (ch == '\b') { printf("\007");
ch = ' '; fflush(stdout);
putchar(ch); sleep(1);
putc(ch, pChat); printf("\007");
ch = '\b'; fflush(stdout);
putchar(ch); Syslog('+', "Sysop chat started");
putc(ch, pChat); chat_with_sysop = TRUE;
} else {
if(CFG.iAutoLog) Syslog('+', "User started chatting");
sLog[--iLetter] = '\0'; }
}
/*
/* Check if log chat is on and if so log chat to disk */ * Setup the screen, this is only possible in ANSI mode.
if(CFG.iAutoLog) { */
if(iLetter >= 55 || ch == '\n') { clear();
iLetter = 0; locate(1, 1);
sprintf(temp, "%s/etc/%s", getenv("MBSE_ROOT"), CFG.chat_log); colour(WHITE, BLUE);
if(( pLog = fopen(temp, "a+")) != NULL) { clrtoeol();
fflush(pLog); mvprintw(1, 2, "MBSE BBS Chat Server");
fprintf(pLog, "%s [%s]: %s\n", exitinfo.sUserName, (char *) GetLocalHM(), sLog);
fclose(pLog); sprintf(buf, "CCON,2,%d,%s", mypid, CFG.sysop);
strcpy(sLog, ""); Syslog('-', "> %s", buf);
} if (socket_send(buf) == 0) {
} strcpy(buf, socket_receive());
} Syslog('-', "< %s", buf);
if (strncmp(buf, "100:1,", 6) == 0) {
if(access("/tmp/chatdev", R_OK) != 0) { cnt = strtok(buf, ",");
colour(10, 0); msg = strtok(NULL, "\0");
printf("\n\n\n%s\n\n\r", (char *) Language(60)); msg[strlen(msg)-1] = '\0';
Syslog('+', "Sysop chat ended"); colour(LIGHTRED, BLACK);
sprintf(temp, "/tmp/.chat.%s", pTTY); mvprintw(4, 1, msg);
unlink(temp); sleep(2);
unlink("/tmp/.BusyChatting"); Pause();
Unsetraw(); return;
Pause(); chat_with_sysop = FALSE;
break; }
} }
}
/* End of ExternalChat Check */ locate(exitinfo.iScreenLen - 2, 1);
} else { colour(WHITE, BLUE);
system(CFG.sExternalChat); clrtoeol();
printf("\n\n"); mvprintw(exitinfo.iScreenLen - 2, 2, "Chat, type \"/EXIT\" to exit");
Pause();
} colour(LIGHTGRAY, BLACK);
mvprintw(exitinfo.iScreenLen - 1, 1, ">");
if(CFG.iAutoLog) memset(&sbuf, 0, sizeof(sbuf));
free(sLog); memset(&rbuf, 0, sizeof(rbuf));
fclose(pChat); 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();
} }

View File

@ -3,6 +3,6 @@
/* $Id$ */ /* $Id$ */
void Chat(int); /* Chat Function */ void Chat(char *, char *); /* Chat Function */
#endif #endif

View File

@ -4,7 +4,7 @@
* Purpose ...............: Main startup * Purpose ...............: Main startup
* *
***************************************************************************** *****************************************************************************
* Copyright (C) 1997-2002 * Copyright (C) 1997-2003
* *
* Michiel Broek FIDO: 2:280/2802 * Michiel Broek FIDO: 2:280/2802
* Beekmansbos 10 * Beekmansbos 10
@ -157,10 +157,6 @@ int main(int argc, char **argv)
*/ */
TermInit(1); 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 * Now it's time to check if the bbs is open. If not, we
* log the user off. * log the user off.

View File

@ -67,6 +67,8 @@
#include "signature.h" #include "signature.h"
extern pid_t mypid;
/* /*
* Menu stack, 50 levels deep. * Menu stack, 50 levels deep.
@ -93,7 +95,7 @@ void menu()
{ {
FILE *pMenuFile; FILE *pMenuFile;
int iFoundKey = FALSE, Key, IsANSI; int iFoundKey = FALSE, Key, IsANSI;
char *Input, *Semfile, *sMenuPathFileName; char *Input, *Semfile, *sMenuPathFileName, buf[81];
Input = calloc(PATH_MAX, sizeof(char)); Input = calloc(PATH_MAX, sizeof(char));
sMenuPathFileName = calloc(PATH_MAX, sizeof(char)); sMenuPathFileName = calloc(PATH_MAX, sizeof(char));
@ -191,19 +193,23 @@ void menu()
free(Semfile); free(Semfile);
/* /*
* Check if SysOp wants to chat to user everytime user * Check if SysOp wants to chat to user everytime user gets prompt.
* gets prompt. Make sure /tmp/chatdev exists before
* before calling chat(). Make sure if a second user
* logs in, that .BusyChatting does exist.
*/ */
if (CFG.iChatPromptChk && (access("/tmp/chatdev", R_OK) == 0) && (access("/tmp/.BusyChatting", F_OK) != 0)) if (CFG.iChatPromptChk) {
Chat(0); 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 * Check users timeleft
*/ */
TimeCheck(); TimeCheck();
alarm_on(); alarm_on();
if (exitinfo.HotKeys) { if (exitinfo.HotKeys) {
@ -409,6 +415,11 @@ void DoMenu(int Type)
/* display menuline only */ /* display menuline only */
break; break;
case 22:
/* Chat with any user */
Chat(NULL, NULL);
break;
case 101: case 101:
FileArea_List(menus.OptionalData); FileArea_List(menus.OptionalData);
break; break;

View File

@ -5,7 +5,7 @@
* BBS and unix accounts. * BBS and unix accounts.
* *
***************************************************************************** *****************************************************************************
* Copyright (C) 1997-2002 * Copyright (C) 1997-2003
* *
* Michiel Broek FIDO: 2:280/2802 * Michiel Broek FIDO: 2:280/2802
* Beekmansbos 10 * Beekmansbos 10
@ -66,6 +66,7 @@ char UnixName[9]; /* Unix Name */
extern char *ieHandle; /* Users Handle */ extern char *ieHandle; /* Users Handle */
extern time_t t_start; /* Program starttime */ extern time_t t_start; /* Program starttime */
int do_mailout = FALSE; /* Just for linking */ int do_mailout = FALSE; /* Just for linking */
int chat_with_sysop = FALSE; /* Just for linking */

View File

@ -5,7 +5,7 @@
* Todo ..................: Implement new config settings. * Todo ..................: Implement new config settings.
* *
***************************************************************************** *****************************************************************************
* Copyright (C) 1997-2002 * Copyright (C) 1997-2003
* *
* Michiel Broek FIDO: 2:280/2802 * Michiel Broek FIDO: 2:280/2802
* Beekmansbos 10 * Beekmansbos 10
@ -191,10 +191,22 @@ void Page_Sysop(char *String)
fflush(stdout); fflush(stdout);
sleep(1); sleep(1);
// if drop into chat sprintf(buf, "CISC:1,%d", mypid);
// Chat(); if (socket_send(buf) == 0) {
// free(Reason); strcpy(buf, socket_receive());
// return; 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;
}
}
} }
/* /*

View File

@ -4,7 +4,7 @@
* Purpose ...............: Timecheck functions * Purpose ...............: Timecheck functions
* *
***************************************************************************** *****************************************************************************
* Copyright (C) 1997-2002 * Copyright (C) 1997-2003
* *
* Michiel Broek FIDO: 2:280/2802 * Michiel Broek FIDO: 2:280/2802
* Beekmansbos 10 Internet: mbroek@users.sourceforge.net * Beekmansbos 10 Internet: mbroek@users.sourceforge.net
@ -46,10 +46,11 @@
#include "input.h" #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 * Check for a personal message, this will go via mbsed. If there
* is a message, it will be displayed, else nothing happens. * is a message, it will be displayed, else nothing happens.
*/ */
@ -103,11 +104,10 @@ void TimeCheck(void)
iUserTimeLeft -= Elapsed; iUserTimeLeft -= Elapsed;
sprintf(sUserTimeleft, "%d", iUserTimeLeft); sprintf(sUserTimeleft, "%d", iUserTimeLeft);
sprintf(temp, "/tmp/.chat.%s", pTTY);
/* /*
* Update users counter if not chatting * Update users counter if not chatting
*/ */
if(!CFG.iStopChatTime || (access(temp, F_OK) != 0)) { if (!CFG.iStopChatTime || (! chat_with_sysop)) {
exitinfo.iTimeLeft -= Elapsed; exitinfo.iTimeLeft -= Elapsed;
exitinfo.iConnectTime += Elapsed; exitinfo.iConnectTime += Elapsed;
exitinfo.iTimeUsed += Elapsed; exitinfo.iTimeUsed += Elapsed;

View File

@ -2086,6 +2086,7 @@ char *getmenutype(int val)
case 19: return (char *)"Display textfile with more"; case 19: return (char *)"Display textfile with more";
case 20: return (char *)"Display .A?? file with Enter"; case 20: return (char *)"Display .A?? file with Enter";
case 21: return (char *)"Display Text Only"; case 21: return (char *)"Display Text Only";
case 22: return (char *)"User chat session";
case 101: return (char *)"Select new file area"; case 101: return (char *)"Select new file area";
case 102: return (char *)"List files in current area"; case 102: return (char *)"List files in current area";

View File

@ -4,7 +4,7 @@
* Purpose ...............: Global Setup Program * Purpose ...............: Global Setup Program
* *
***************************************************************************** *****************************************************************************
* Copyright (C) 1997-2002 * Copyright (C) 1997-2003
* *
* Michiel Broek FIDO: 2:280/2802 * Michiel Broek FIDO: 2:280/2802
* Beekmansbos 10 * Beekmansbos 10
@ -547,98 +547,39 @@ void e_colors(void)
void e_paging(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); set_color(WHITE, BLACK);
mvprintw( 5, 2, "1.9 EDIT SYSOP PAGING"); show_int( 7,20, CFG.iPageLength);
set_color(CYAN, BLACK); show_int( 8,20, CFG.iMaxPageTimes);
mvprintw( 7, 2, "1. Ext. Chat"); show_int( 9,20, CFG.iSysopArea);
mvprintw( 8, 2, "2. Chat Device"); show_bool(10,20, CFG.iAskReason);
mvprintw( 9, 2, "3. Call Script"); show_bool(11,20, CFG.iAutoLog);
mvprintw(10, 2, "4. Page Length"); show_bool(12,20, CFG.iChatPromptChk);
mvprintw(11, 2, "5. Page Times"); show_bool(13,20, CFG.iStopChatTime);
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");
mvprintw(11,42, "12. Sunday"); switch(select_menu(7)) {
mvprintw(12,42, "13. Monday"); case 0: return;
mvprintw(13,42, "14. Tuesday"); case 1: E_INT( 7,20, CFG.iPageLength, "The ^Length^ of paging in seconds")
mvprintw(14,42, "15. Wednesday"); case 2: E_INT( 8,20, CFG.iMaxPageTimes, "The ^Maximum times^ a user may page in a session")
mvprintw(15,42, "16. Thursday"); case 3: E_INT( 9,20, CFG.iSysopArea, "The ^Message Area^ for ^Message to sysop^ when page fails")
mvprintw(16,42, "17. Friday"); case 4: E_BOOL(10,20, CFG.iAskReason, "Ask the user the ^reason for chat^")
mvprintw(17,42, "18. Saterday"); 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^")
for (;;) { case 7: E_BOOL(13,20, CFG.iStopChatTime, "^Stop^ users time during chat")
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;
}
};
} }
@ -1882,28 +1823,14 @@ int global_doc(FILE *fp, FILE *toc, int page)
page = newpage(fp, page); page = newpage(fp, page);
addtoc(fp, toc, 1, 10, page, (char *)"Sysop paging"); 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 length %d seconds\n", CFG.iPageLength);
fprintf(fp, " Page times %d\n", CFG.iMaxPageTimes); fprintf(fp, " Page times %d\n", CFG.iMaxPageTimes);
fprintf(fp, " Sysop msg area %d\n", CFG.iSysopArea); fprintf(fp, " Sysop msg area %d\n", CFG.iSysopArea);
fprintf(fp, " Ask chat reason %s\n", getboolean(CFG.iAskReason)); 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, " Log chat %s\n", getboolean(CFG.iAutoLog));
fprintf(fp, " Check at prompt %s\n", getboolean(CFG.iChatPromptChk)); fprintf(fp, " Check at prompt %s\n", getboolean(CFG.iChatPromptChk));
fprintf(fp, " Freeze online time %s\n", getboolean(CFG.iStopChatTime)); 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"); addtoc(fp, toc, 1, 11, page, (char *)"Fileecho processing");
fprintf(fp, " Keep days on hold %d\n", CFG.tic_days); fprintf(fp, " Keep days on hold %d\n", CFG.tic_days);

View File

@ -195,7 +195,7 @@ int GetMenuType(void)
mvprintw(12, 6, "6. BBS List menus"); mvprintw(12, 6, "6. BBS List menus");
switch (select_menu(6)) { switch (select_menu(6)) {
case 1: return GetSubmenu(1, 21); case 1: return GetSubmenu(1, 22);
case 2: return GetSubmenu(101, 19); case 2: return GetSubmenu(101, 19);
case 3: return GetSubmenu(201, 21); case 3: return GetSubmenu(201, 21);
case 4: return GetSubmenu(301, 20); case 4: return GetSubmenu(301, 20);

View File

@ -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 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 signame.o: ../config.h signame.h
taskdisk.o: ../config.h libs.h ../lib/structs.h taskdisk.h taskutil.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 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 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 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 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 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 # End of generated dependencies

View File

@ -258,16 +258,9 @@ void load_maincfg(void)
CFG.iMaxPageTimes = 5; CFG.iMaxPageTimes = 5;
CFG.iAskReason = TRUE; CFG.iAskReason = TRUE;
CFG.iSysopArea = 1; CFG.iSysopArea = 1;
CFG.iExternalChat = FALSE;
strcpy(CFG.sExternalChat, "/usr/local/bin/chat");
CFG.iAutoLog = TRUE; CFG.iAutoLog = TRUE;
strcpy(CFG.sChatDevice, "/dev/tty01");
CFG.iChatPromptChk = TRUE; CFG.iChatPromptChk = TRUE;
CFG.iStopChatTime = 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 * Fill ticconf defaults

View File

@ -35,7 +35,7 @@
#include "taskregs.h" #include "taskregs.h"
#include "taskchat.h" #include "taskchat.h"
#define MAXCHANNELS 100 /* Maximum chat channels */ #define MAXCHANNELS 10 /* Maximum chat channels */
#define MAXMESSAGES 100 /* Maximum ringbuffer for messages */ #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. * List of banned users from a channel. This is a dynamic list.
*/ */
@ -82,17 +95,42 @@ typedef struct _banned {
} banned_users; } banned_users;
/* /*
* The buffers * The buffers
*/ */
_chat_messages chat_messages[MAXMESSAGES]; _chat_messages chat_messages[MAXMESSAGES];
_chat_users chat_users[MAXCLIENT]; _chat_users chat_users[MAXCLIENT];
_channel chat_channels[MAXCHANNELS];
int buffer_head = 0; /* Messages buffer head */ int buffer_head = 0; /* Messages buffer head */
extern struct sysconfig CFG; /* System configuration */ 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 * 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) void chat_init(void)
{ {
memset(&chat_users, 0, sizeof(chat_users)); memset(&chat_users, 0, sizeof(chat_users));
memset(&chat_messages, 0, sizeof(chat_messages)); 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) { if (strncasecmp(msg, "/help", 5) == 0) {
chat_help(atoi(pid)); chat_help(atoi(pid));
sprintf(buf, "100:0;"); goto ack;
return buf;
} }
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 * Just send messages, the client should later do a
* real disconnect. * real disconnect.
*/ */
sprintf(buf, "Goodbye"); sprintf(buf, "Goodbye");
system_msg(chat_users[i].pid, buf); system_msg(chat_users[i].pid, buf);
sprintf(buf, "100:0;"); goto ack;
return buf;
} }
if (strncasecmp(msg, "/join", 5) == 0) { if (strncasecmp(msg, "/join", 5) == 0) {
cmd = strtok(msg, " \0"); cmd = strtok(msg, " \0");
@ -266,9 +453,20 @@ char *chat_put(char *data)
system_msg(chat_users[i].pid, buf); system_msg(chat_users[i].pid, buf);
} else { } else {
Syslog('-', "Trying to join channel %s", cmd); Syslog('-', "Trying to join channel %s", cmd);
join(chat_users[i].pid, cmd+1);
} }
sprintf(buf, "100:0;"); goto ack;
return buf; }
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. * If still here, the command was not recognized.
@ -276,8 +474,7 @@ char *chat_put(char *data)
cmd = strtok(msg, " \t\r\n\0"); cmd = strtok(msg, " \t\r\n\0");
sprintf(buf, "%s :Unknown command", cmd+1); sprintf(buf, "%s :Unknown command", cmd+1);
system_msg(chat_users[i].pid, buf); system_msg(chat_users[i].pid, buf);
sprintf(buf, "100:0;"); goto ack;
return buf;
} }
if (chat_users[i].channel == -1) { if (chat_users[i].channel == -1) {
/* /*
@ -285,16 +482,22 @@ char *chat_put(char *data)
*/ */
sprintf(buf, "No channel joined. Try /join #channel"); sprintf(buf, "No channel joined. Try /join #channel");
system_msg(chat_users[i].pid, buf); system_msg(chat_users[i].pid, buf);
sprintf(buf, "100:0;"); chat_dump();
return buf; goto ack;
} else {
chat_msg(chat_users[i].channel, chat_users[i].name, msg);
chat_dump();
} }
sprintf(buf, "100:0;"); goto ack;
return buf;
} }
} }
Syslog('-', "Pid %s was not connected to chatserver"); Syslog('-', "Pid %s was not connected to chatserver");
sprintf(buf, "100:1,ERROR - Not connected to server;"); sprintf(buf, "100:1,ERROR - Not connected to server;");
return buf; return buf;
ack:
sprintf(buf, "100:0;");
return buf;
} }
@ -305,7 +508,7 @@ char *chat_get(char *data)
char *pid; char *pid;
int i; int i;
Syslog('-', "CGET:%s", data); // Syslog('-', "CGET:%s", data);
memset(&buf, 0, sizeof(buf)); memset(&buf, 0, sizeof(buf));
pid = strtok(data, ","); pid = strtok(data, ",");
pid = strtok(NULL, ";"); pid = strtok(NULL, ";");

View File

@ -4,6 +4,7 @@
/* $Id$ */ /* $Id$ */
void chat_init(void); void chat_init(void);
void chat_cleanuser(pid_t);
char *chat_connect(char *); char *chat_connect(char *);
char *chat_close(char *); char *chat_close(char *);
char *chat_put(char *); char *chat_put(char *);

View File

@ -33,6 +33,7 @@
#include "../lib/structs.h" #include "../lib/structs.h"
#include "taskstat.h" #include "taskstat.h"
#include "taskregs.h" #include "taskregs.h"
#include "taskchat.h"
#include "taskutil.h" #include "taskutil.h"
extern reg_info reginfo[MAXCLIENT]; /* Array with clients */ extern reg_info reginfo[MAXCLIENT]; /* Array with clients */
@ -130,6 +131,9 @@ int reg_closecon(char *data)
mailers--; mailers--;
if (reginfo[rec].istcp) if (reginfo[rec].istcp)
ipmailers--; 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", Syslog('-', "Unregistered client pgm \"%s\", pid %s, slot %d, mailers %d, TCP/IP %d",
reginfo[rec].prg, pid, rec, mailers, ipmailers); reginfo[rec].prg, pid, rec, mailers, ipmailers);
memset(&reginfo[rec], 0, sizeof(reg_info)); memset(&reginfo[rec], 0, sizeof(reg_info));
@ -156,11 +160,11 @@ void reg_check(void)
mailers--; mailers--;
if (reginfo[i].istcp) if (reginfo[i].istcp)
ipmailers--; 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", Syslog('?', "Stale registration found for pid %d (%s), mailers now %d, TCP/IP now %d",
reginfo[i].pid, reginfo[i].prg, mailers, ipmailers); reginfo[i].pid, reginfo[i].prg, mailers, ipmailers);
// FIXME: If this was a moderators chat channel, kill the whole channel
memset(&reginfo[i], 0, sizeof(reg_info)); memset(&reginfo[i], 0, sizeof(reg_info));
stat_dec_clients(); stat_dec_clients();
} }