Updates for the chatserver

This commit is contained in:
Michiel Broek 2003-03-24 19:44:38 +00:00
parent 3d157ec16a
commit c09bebade4
14 changed files with 549 additions and 107 deletions

View File

@ -49,10 +49,9 @@ v0.37.2 23-Feb-2003.
Added support for door32.sys dropfile. Added support for door32.sys dropfile.
Fixed user idle logoff when new mailcheck took too long. Fixed user idle logoff when new mailcheck took too long.
Added email reply when reading new (e)mail. Added email reply when reading new (e)mail.
With the CIPM and CSPM mbtask commands added the parameter for
the chat channel.
To page the sysop, the CPAG and CCAN commands to mbtask are now To page the sysop, the CPAG and CCAN commands to mbtask are now
used. used. Until the chatserver is ready, there is no buildin sysop
user chat.
mbmon: mbmon:
Reports sysop available or left the system when mbmon starts Reports sysop available or left the system when mbmon starts
@ -65,17 +64,19 @@ v0.37.2 23-Feb-2003.
The show lastcallers now adjusts the number of lines available. The show lastcallers now adjusts the number of lines available.
The show server clients screen now adjusts to the number of The show server clients screen now adjusts to the number of
lines available. lines available.
Added chatserver client, this is more or less complete now and
does communicate with the development server.
mbtask: mbtask:
Safer logging of user log messages. Safer logging of user log messages.
The CSPM command has an extra channel parameter.
The CIPM reply has an extra channel parameter.
In personal message text the text after a ; character is not In personal message text the text after a ; character is not
ignored anymore. ignored anymore.
Added CSYS command to report if sysop is available. Added CSYS command to report if sysop is available.
Added CPAG command to page the sysop. Added CPAG command to page the sysop.
Added CCAN command to cancel the sysop page. Added CCAN command to cancel the sysop page.
Added CCKP command to check for a page. Added CCKP command to check for a page.
Added CCON, CCLO, CPUT and CGET commands for chatserver. The
chatserver commands will be added and are in development.
lang: lang:
Changed language prompts 15, 16 and 152. Changed language prompts 15, 16 and 152.

View File

@ -57,7 +57,7 @@ depend:
# DO NOT DELETE THIS LINE - MAKE DEPEND RELIES ON IT # DO NOT DELETE THIS LINE - MAKE DEPEND RELIES ON IT
# Dependencies generated by make depend # Dependencies generated by make depend
mutil.o: ../config.h ../lib/libs.h ../lib/memwatch.h ../lib/mberrors.h common.h mutil.h mutil.o: ../config.h ../lib/libs.h ../lib/memwatch.h ../lib/mberrors.h ../lib/structs.h common.h mutil.h
mbmon.o: ../config.h ../lib/libs.h ../lib/memwatch.h ../lib/mberrors.h common.h mutil.h mbmon.o: ../config.h ../lib/libs.h ../lib/memwatch.h ../lib/mberrors.h ../lib/structs.h common.h mutil.h
common.o: ../config.h ../lib/libs.h ../lib/memwatch.h ../lib/mberrors.h common.h common.o: ../config.h ../lib/libs.h ../lib/memwatch.h ../lib/mberrors.h common.h
# End of generated dependencies # End of generated dependencies

View File

@ -33,6 +33,7 @@
#include "../lib/libs.h" #include "../lib/libs.h"
#include "../lib/memwatch.h" #include "../lib/memwatch.h"
#include "../lib/mberrors.h" #include "../lib/mberrors.h"
#include "../lib/structs.h"
#include "common.h" #include "common.h"
#include "mutil.h" #include "mutil.h"
@ -44,6 +45,13 @@ extern int bbs_free;
extern int ttyfd; extern int ttyfd;
extern pid_t mypid; extern pid_t mypid;
struct sysconfig CFG;
char rbuf[50][80]; /* Chat receive buffer */ /* FIXME: must be a dynamic buffer */
int rpointer = 0; /* Chat receive pointer */
int rsize = 5; /* Chat receive size */
static void die(int onsig) static void die(int onsig)
{ {
@ -416,46 +424,99 @@ void soft_info(void)
/*
* Display received chat message
*/
void DispMsg(char *);
void DispMsg(char *msg)
{
int i;
strncpy(rbuf[rpointer], msg, 80);
mvprintw(4+rpointer, 1, rbuf[rpointer]);
if (rpointer == rsize) {
/*
* Scroll buffer
*/
for (i = 0; i <= rsize; i++) {
locate(i+4,1);
clrtoeol();
sprintf(rbuf[i], "%s", rbuf[i+1]);
mvprintw(i+4, 1, rbuf[i]);
}
} else {
rpointer++;
}
fflush(stdout);
}
/* /*
* Sysop/user chat * Sysop/user chat
*/ */
void Chat(int channel) void Chat(void)
{ {
int curpos = 0, rline = 0; int curpos = 0, stop = FALSE, data;
unsigned char ch = 0; unsigned char ch = 0;
char sbuf[81], rbuf[17][81], resp[128], from[36]; char sbuf[81], resp[128], *cnt, *msg;
static char buf[128]; static char buf[200];
clr_index(); clr_index();
rsize = lines - 7;
rpointer = 0;
sprintf(buf, "CCON,2,%d,%s", mypid, CFG.sysop);
Syslog('-', "> %s", buf);
if (socket_send(buf) == 0) {
strcpy(buf, socket_receive());
Syslog('-', "< %s", buf);
if (strncmp(buf, "100:1,", 6) == 0) {
cnt = strtok(buf, ",");
msg = strtok(NULL, "\0");
msg[strlen(msg)-1] = '\0';
set_color(LIGHTRED, BLACK);
mvprintw(4, 1, msg);
working(2, 0, 0);
working(0, 0, 0);
center_addstr(lines -4, (char *)"Press any key");
readkey(lines - 4, columns / 2 + 8, LIGHTGRAY, BLACK);
return;
}
}
locate(lines - 2, 1); locate(lines - 2, 1);
set_color(WHITE, BLUE); set_color(WHITE, BLUE);
clrtoeol(); clrtoeol();
mvprintw(lines - 2, 2, "Sysop to user chat, press @ to exit"); mvprintw(lines - 2, 2, "Chat, type \"/EXIT\" to exit");
set_color(LIGHTGRAY, BLACK); set_color(LIGHTGRAY, BLACK);
mvprintw(lines - 1, 1, ">"); mvprintw(lines - 1, 1, ">");
memset(&sbuf, 0, sizeof(sbuf)); memset(&sbuf, 0, sizeof(sbuf));
memset(&rbuf, 0, sizeof(rbuf)); memset(&rbuf, 0, sizeof(rbuf));
while (TRUE) { Syslog('-', "Start loop");
while (stop == FALSE) {
/* /*
* Check for new message * Check for new message, loop fast until no more data available.
*/ */
sprintf(buf, "CIPM:1,%d;", mypid); data = TRUE;
if (socket_send(buf) == 0) { while (data) {
strcpy(buf, socket_receive()); sprintf(buf, "CGET:1,%d;", mypid);
if (strncmp(buf, "100:0;", 6)) { if (socket_send(buf) == 0) {
Syslog('-', "%s", buf); strcpy(buf, socket_receive());
strncpy(resp, strtok(buf, ":"), 10); /* Should be 100 */ if (strncmp(buf, "100:1,", 6) == 0) {
strncpy(resp, strtok(NULL, ","), 5); /* Should be 3 */ Syslog('-', "> CGET:1,%d;", mypid);
strncpy(resp, strtok(NULL, ","), 5); /* Should be our channel */ Syslog('-', "< %s", buf);
if (atoi(resp) != channel) { strncpy(resp, strtok(buf, ":"), 10); /* Should be 100 */
Syslog('+', "Message in channel %s instead of %d", resp, channel); strncpy(resp, strtok(NULL, ","), 5); /* Should be 1 */
} else { strncpy(resp, strtok(NULL, "\0"), 80); /* The message */
strncpy(from, strtok(NULL, ","), 36); /* From name */
strncpy(resp, strtok(NULL, "\0"), 80); /* The message */
resp[strlen(resp)-1] = '\0'; resp[strlen(resp)-1] = '\0';
DispMsg(resp);
} else {
data = FALSE;
} }
} }
} }
@ -489,11 +550,20 @@ void Chat(int channel)
putchar(7); putchar(7);
} }
} else if ((ch == '\r') && curpos) { } else if ((ch == '\r') && curpos) {
sprintf(buf, "CSPM:4,%d,Sysop,-,%s;", channel, sbuf); if (strncasecmp(sbuf, "/exit", 5) == 0)
Syslog('-', "%s", buf); stop = TRUE;
sprintf(buf, "CPUT:2,%d,%s;", mypid, sbuf);
Syslog('-', "> %s", buf);
if (socket_send(buf) == 0) { if (socket_send(buf) == 0) {
strcpy(buf, socket_receive()); strcpy(buf, socket_receive());
Syslog('-', "%s", buf); Syslog('-', "< %s", buf);
if (strncmp(buf, "100:1,", 6) == 0) {
strncpy(resp, strtok(buf, ":"), 10); /* Should be 100 */
strncpy(resp, strtok(NULL, ","), 5); /* Should be 1 */
strncpy(resp, strtok(NULL, "\0"), 80); /* The message */
resp[strlen(resp)-1] = '\0';
DispMsg(resp);
}
} }
curpos = 0; curpos = 0;
memset(&sbuf, 0, sizeof(sbuf)); memset(&sbuf, 0, sizeof(sbuf));
@ -502,6 +572,41 @@ void Chat(int channel)
mvprintw(lines - 1, 1, ">"); mvprintw(lines - 1, 1, ">");
} }
} }
/*
* Before sending the close command, purge all outstanding messages.
*/
data = TRUE;
while (data) {
sprintf(buf, "CGET:1,%d;", mypid);
if (socket_send(buf) == 0) {
strcpy(buf, socket_receive());
if (strncmp(buf, "100:1,", 6) == 0) {
Syslog('-', "> CGET:1,%d;", mypid);
Syslog('-', "< %s", buf);
strncpy(resp, strtok(buf, ":"), 10); /* Should be 100 */
strncpy(resp, strtok(NULL, ","), 5); /* Should be 1 */
strncpy(resp, strtok(NULL, "\0"), 80); /* The message */
resp[strlen(resp)-1] = '\0';
DispMsg(resp);
} else {
data = FALSE;
}
}
}
/*
* Close server connection
*/
sprintf(buf, "CCLO,1,%d", mypid);
Syslog('-', "> %s", buf);
if (socket_send(buf) == 0) {
strcpy(buf, socket_receive());
Syslog('-', "< %s", buf);
if (strncmp(buf, "100:1,", 6)) {
}
}
sleep(1);
} }
@ -509,13 +614,28 @@ void Chat(int channel)
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
struct passwd *pw; struct passwd *pw;
char buf[128]; char buf[128], *temp;
int rc; int rc;
FILE *fp;
#ifdef MEMWATCH #ifdef MEMWATCH
mwInit(); mwInit();
#endif #endif
/*
* Read configuration
*/
temp = calloc(PATH_MAX, sizeof(char));
sprintf(temp, "%s/etc/config.data", getenv("MBSE_ROOT"));
if ((fp = fopen(temp, "r")) == NULL) {
perror("\n\nFATAL ERROR: ");
printf(" Can't open %s", temp);
exit(1);
}
fread(&CFG, sizeof(CFG), 1, fp);
fclose(fp);
free(temp);
/* /*
* Find out who is on the keyboard or automated the keyboard. * Find out who is on the keyboard or automated the keyboard.
*/ */
@ -597,7 +717,7 @@ int main(int argc, char *argv[])
ShowLastcaller(); ShowLastcaller();
break; break;
case 6: case 6:
Chat(0); Chat();
break; break;
case 7: case 7:
soft_info(); soft_info();

View File

@ -10,6 +10,6 @@ void system_moni(void);
void system_stat(void); void system_stat(void);
void disk_stat(void); void disk_stat(void);
void soft_info(void); void soft_info(void);
void Chat(int); void Chat(void);
#endif #endif

View File

@ -32,6 +32,7 @@
#include "../lib/libs.h" #include "../lib/libs.h"
#include "../lib/memwatch.h" #include "../lib/memwatch.h"
#include "../lib/mberrors.h" #include "../lib/mberrors.h"
#include "../lib/structs.h"
#include "common.h" #include "common.h"
#include "mutil.h" #include "mutil.h"

View File

@ -56,7 +56,7 @@ extern pid_t mypid; /* Pid of this program */
void Check_PM(void); void Check_PM(void);
void Check_PM(void) void Check_PM(void)
{ {
static char buf[128]; static char buf[200];
char resp[128]; char resp[128];
sprintf(buf, "CIPM:1,%d;", mypid); sprintf(buf, "CIPM:1,%d;", mypid);
@ -65,9 +65,8 @@ void Check_PM(void)
if (strncmp(buf, "100:0;", 6) == 0) if (strncmp(buf, "100:0;", 6) == 0)
return; return;
strcpy(resp, strtok(buf, ":")); /* Should be 100 */ strncpy(resp, strtok(buf, ":"), 5); /* Should be 100 */
strcpy(resp, strtok(NULL, ",")); /* Should be 3 */ strncpy(resp, strtok(NULL, ","), 3); /* Should be 2 */
strcpy(resp, strtok(NULL, ",")); /* Should be channel -1 */
strncpy(resp, strtok(NULL, ","), 36); /* From Name */ strncpy(resp, strtok(NULL, ","), 36); /* From Name */
colour(CYAN, BLACK); colour(CYAN, BLACK);
/* ** Message ** from */ /* ** Message ** from */

View File

@ -315,11 +315,11 @@ void SendOnlineMsg(char *OpData)
if ((strcmp(String, "")) != 0) { if ((strcmp(String, "")) != 0) {
buf[0] = '\0'; buf[0] = '\0';
if ((strcasecmp(OpData, "/H") == 0) && strlen(exitinfo.sHandle)) if ((strcasecmp(OpData, "/H") == 0) && strlen(exitinfo.sHandle))
sprintf(buf, "CSPM:4,-1,%s,%s,%s;", exitinfo.sHandle, User, String); sprintf(buf, "CSPM:3,%s,%s,%s;", exitinfo.sHandle, User, String);
else if (strcasecmp(OpData, "/U") == 0) else if (strcasecmp(OpData, "/U") == 0)
sprintf(buf, "CSPM:4,-1,%s,%s,%s;", exitinfo.Name, User, String); sprintf(buf, "CSPM:3,%s,%s,%s;", exitinfo.Name, User, String);
else else
sprintf(buf, "CSPM:4,-1,%s,%s,%s;", exitinfo.sUserName, User, String); sprintf(buf, "CSPM:3,%s,%s,%s;", exitinfo.sUserName, User, String);
if (socket_send(buf) == 0) { if (socket_send(buf) == 0) {
strcpy(buf, socket_receive()); strcpy(buf, socket_receive());

View File

@ -80,10 +80,10 @@ depend:
# Dependencies generated by make depend # Dependencies generated by make depend
callstat.o: ../config.h libs.h ../lib/structs.h taskutil.h callstat.h callstat.o: ../config.h libs.h ../lib/structs.h taskutil.h callstat.h
scanout.o: ../config.h libs.h ../lib/structs.h taskutil.h scanout.h scanout.o: ../config.h libs.h ../lib/structs.h taskutil.h scanout.h
taskcomm.o: ../config.h libs.h ../lib/structs.h taskstat.h taskregs.h taskdisk.h taskinfo.h taskutil.h taskcomm.h taskcomm.o: ../config.h libs.h ../lib/structs.h taskstat.h taskregs.h taskdisk.h taskinfo.h taskutil.h taskchat.h taskcomm.h
taskinfo.o: ../config.h libs.h ../lib/structs.h taskinfo.h taskinfo.o: ../config.h libs.h ../lib/structs.h taskinfo.h
taskstat.o: ../config.h libs.h ../lib/structs.h ../lib/mberrors.h taskstat.h callstat.h outstat.h taskutil.h taskstat.o: ../config.h libs.h ../lib/structs.h ../lib/mberrors.h taskstat.h callstat.h outstat.h taskutil.h
mbtask.o: ../config.h libs.h ../lib/structs.h ../paths.h ../lib/mberrors.h signame.h taskstat.h taskutil.h taskregs.h taskcomm.h callstat.h outstat.h ../lib/nodelist.h ports.h calllist.h ping.h mbtask.h mbtask.o: ../config.h libs.h ../lib/structs.h ../paths.h ../lib/mberrors.h signame.h taskstat.h taskutil.h taskregs.h taskcomm.h callstat.h outstat.h ../lib/nodelist.h ports.h calllist.h ping.h taskchat.h mbtask.h
outstat.o: ../config.h libs.h ../lib/structs.h ../lib/mberrors.h taskutil.h taskstat.h scanout.h ../lib/nodelist.h callstat.h ports.h outstat.h 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
@ -93,5 +93,5 @@ ports.o: ../config.h libs.h ../lib/structs.h taskutil.h ../lib/nodelist.h ports.
calllist.o: ../config.h libs.h ../lib/structs.h taskstat.h taskutil.h callstat.h outstat.h mbtask.h calllist.h 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 taskchat.h taskchat.o: ../config.h libs.h ../lib/structs.h taskutil.h taskchat.h
# End of generated dependencies # End of generated dependencies

View File

@ -44,6 +44,7 @@
#include "ports.h" #include "ports.h"
#include "calllist.h" #include "calllist.h"
#include "ping.h" #include "ping.h"
#include "taskchat.h"
#include "mbtask.h" #include "mbtask.h"
@ -1315,6 +1316,7 @@ int main(int argc, char **argv)
initnl(); initnl();
load_ports(); load_ports();
check_ports(); check_ports();
chat_init();
/* /*
* Now that init is complete and this program is locked, it is * Now that init is complete and this program is locked, it is

View File

@ -31,6 +31,307 @@
#include "../config.h" #include "../config.h"
#include "libs.h" #include "libs.h"
#include "../lib/structs.h" #include "../lib/structs.h"
#include "taskutil.h"
#include "taskregs.h"
#include "taskchat.h" #include "taskchat.h"
#define MAXCHANNELS 100 /* Maximum chat channels */
#define MAXMESSAGES 100 /* Maximum ringbuffer for messages */
typedef enum {CH_FREE, CH_PRIVATE, CH_PUBLIC} CHANNELTYPE;
/*
* Users connected to the chatserver.
*/
typedef struct _ch_user_rec {
pid_t pid; /* User's pid */
char name[36]; /* His name used (may become nick) */
time_t connected; /* Time connected */
int channel; /* Connected channel or -1 */
int pointer; /* Message pointer */
unsigned chatting : 1; /* Is chatting in a channel */
unsigned chanop : 1; /* Is a chanop */
} _chat_users;
/*
* Buffer for messages, this is the structure of a ringbuffer which will
* hold all messages, private public etc. There is one global input pointer
* which points to the current head of the ringbuffer. When a user connects
* to a channel, he will get the latest messages in the channel if they
* are present.
*/
typedef struct _chatmsg {
pid_t topid; /* Destination pid of message */
char fromname[36]; /* Message from user */
char message[81]; /* The message to display */
time_t posted; /* Timestamp for posted message */
} _chat_messages;
/*
* List of banned users from a channel. This is a dynamic list.
*/
typedef struct _banned {
int channel; /* Channel the user is banned from */
char user[36]; /* The user who is banned */
} banned_users;
/*
* The buffers
*/
_chat_messages chat_messages[MAXMESSAGES];
_chat_users chat_users[MAXCLIENT];
int buffer_head = 0; /* Messages buffer head */
extern struct sysconfig CFG; /* System configuration */
/*
* Put a system message into the chatbuffer
*/
void system_msg(pid_t, char *);
void system_msg(pid_t pid, char *msg)
{
if (buffer_head < MAXMESSAGES)
buffer_head++;
else
buffer_head = 0;
Syslog('-', "system_msg(%d, %s) ptr=%d", pid, msg, buffer_head);
memset(&chat_messages[buffer_head], 0, sizeof(_chat_messages));
chat_messages[buffer_head].topid = pid;
sprintf(chat_messages[buffer_head].fromname, "Server");
strncpy(chat_messages[buffer_head].message, msg, 80);
chat_messages[buffer_head].posted = time(NULL);
}
/*
* Show help
*/
void chat_help(pid_t);
void chat_help(pid_t pid)
{
system_msg(pid, (char *)"Topics available:");
system_msg(pid, (char *)"");
system_msg(pid, (char *)" EXIT HELP");
}
void chat_init(void)
{
memset(&chat_users, 0, sizeof(chat_users));
memset(&chat_messages, 0, sizeof(chat_messages));
}
/*
* Connect a session to the chatserver.
*/
char *chat_connect(char *data)
{
char *pid, *usr;
static char buf[200];
int i, j, count = 0;
Syslog('-', "CCON:%s", data);
memset(&buf, 0, sizeof(buf));
/*
* Search free userslot
*/
for (i = 0; i < MAXCLIENT; i++) {
if (chat_users[i].pid == 0) {
/*
* Oke, found
*/
pid = strtok(data, ","); /* Should be 2 */
pid = strtok(NULL, ","); /* The pid */
usr = strtok(NULL, ";"); /* Username */
chat_users[i].pid = atoi(pid);
strncpy(chat_users[i].name, usr, 36);
chat_users[i].connected = time(NULL);
chat_users[i].pointer = buffer_head;
chat_users[i].channel = -1;
Syslog('-', "Connected user %s (%s) with chatserver, slot %d", usr, pid, i);
/*
* Now put welcome message into the ringbuffer and report success.
*/
sprintf(buf, "MBSE BBS v%s chat server; type /help for help", VERSION);
system_msg(chat_users[i].pid, buf);
sprintf(buf, "Welcome to the %s chat network", CFG.bbs_name);
system_msg(chat_users[i].pid, buf);
for (j = 0; j < MAXCLIENT; j++)
if (chat_users[j].pid)
count++;
sprintf(buf, "There %s %d user%s connected", (count != 1)?"are":"is", count, (count != 1)?"s":"");
system_msg(chat_users[i].pid, buf);
sprintf(buf, "100:0;");
return buf;
}
}
sprintf(buf, "100:1,Too many users connected;");
return buf;
}
char *chat_close(char *data)
{
static char buf[200];
char *pid;
int i;
Syslog('-', "CCLO:%s", data);
memset(&buf, 0, sizeof(buf));
pid = strtok(data, ",");
pid = strtok(NULL, ";");
for (i = 0; i < MAXCLIENT; i++) {
if (chat_users[i].pid == atoi(pid)) {
Syslog('-', "Closing chat for pid %s, slot %d", pid, i);
memset(&chat_users[i], 0, sizeof(_chat_users));
sprintf(buf, "100:0;");
return buf;
}
}
Syslog('-', "Pid %s was not connected to chatserver");
sprintf(buf, "100:1,ERROR - Not connected to server;");
return buf;
}
char *chat_put(char *data)
{
static char buf[200];
char *pid, *msg, *cmd;
int i;
Syslog('-', "CPUT:%s", data);
memset(&buf, 0, sizeof(buf));
pid = strtok(data, ",");
pid = strtok(NULL, ",");
msg = strtok(NULL, "\0");
msg[strlen(msg)-1] = '\0';
for (i = 0; i < MAXCLIENT; i++) {
if (chat_users[i].pid == atoi(pid)) {
/*
* We are connected and known, first send the input back to ourself.
*/
system_msg(chat_users[i].pid, msg);
if (msg[0] == '/') {
/*
* A command, process this
*/
if (strncasecmp(msg, "/help", 5) == 0) {
chat_help(atoi(pid));
sprintf(buf, "100:0;");
return buf;
}
if (strncasecmp(msg, "/exit", 5) == 0) {
/*
* Just send messages, the client should later do a
* real disconnect.
*/
sprintf(buf, "Goodbye");
system_msg(chat_users[i].pid, buf);
sprintf(buf, "100:0;");
return buf;
}
if (strncasecmp(msg, "/join", 5) == 0) {
cmd = strtok(msg, " \0");
Syslog('-', "\"%s\"", cmd);
cmd = strtok(NULL, "\0");
Syslog('-', "\"%s\"", cmd);
if ((cmd == NULL) || (cmd[0] != '#') || (strcmp(cmd, "#") == 0)) {
sprintf(buf, "Try /join #channel");
system_msg(chat_users[i].pid, buf);
} else {
Syslog('-', "Trying to join channel %s", cmd);
}
sprintf(buf, "100:0;");
return buf;
}
/*
* If still here, the command was not recognized.
*/
cmd = strtok(msg, " \t\r\n\0");
sprintf(buf, "%s :Unknown command", cmd+1);
system_msg(chat_users[i].pid, buf);
sprintf(buf, "100:0;");
return buf;
}
if (chat_users[i].channel == -1) {
/*
* Trying messages while not in a channel
*/
sprintf(buf, "No channel joined. Try /join #channel");
system_msg(chat_users[i].pid, buf);
sprintf(buf, "100:0;");
return buf;
}
sprintf(buf, "100:0;");
return buf;
}
}
Syslog('-', "Pid %s was not connected to chatserver");
sprintf(buf, "100:1,ERROR - Not connected to server;");
return buf;
}
char *chat_get(char *data)
{
static char buf[200];
char *pid;
int i;
Syslog('-', "CGET:%s", data);
memset(&buf, 0, sizeof(buf));
pid = strtok(data, ",");
pid = strtok(NULL, ";");
for (i = 0; i < MAXCLIENT; i++) {
if (atoi(pid) == chat_users[i].pid) {
while (chat_users[i].pointer != buffer_head) {
if (chat_users[i].pointer < MAXMESSAGES)
chat_users[i].pointer++;
else
chat_users[i].pointer = 0;
if (chat_users[i].pid == chat_messages[chat_users[i].pointer].topid) {
/*
* Message is for us.
*/
sprintf(buf, "100:1,%s;", chat_messages[chat_users[i].pointer].message);
Syslog('-', "%s", buf);
return buf;
}
}
sprintf(buf, "100:0;");
return buf;
}
}
sprintf(buf, "100:1,ERROR - Not connected to server;");
return buf;
}

View File

@ -3,5 +3,10 @@
/* $Id$ */ /* $Id$ */
void chat_init(void);
char *chat_connect(char *);
char *chat_close(char *);
char *chat_put(char *);
char *chat_get(char *);
#endif #endif

View File

@ -36,6 +36,7 @@
#include "taskdisk.h" #include "taskdisk.h"
#include "taskinfo.h" #include "taskinfo.h"
#include "taskutil.h" #include "taskutil.h"
#include "taskchat.h"
#include "taskcomm.h" #include "taskcomm.h"
@ -239,14 +240,10 @@ char *exe_cmd(char *in)
} }
/* /*
* The chat commands * Check for personal message
* *
* Used channels: -1 Personal messages between ordinary users. * CIPM:1,pid; (Is personal message present)
* 0 Sysop/user chat * 100:2,fromname,message;
* 1..99 Chatting channels
*
* CIPM:1,pid; (Is personal/chat message present)
* 100:3,channel,fromname,message;
* 100:0; * 100:0;
*/ */
if (strncmp(cmd, "CIPM", 4) == 0) { if (strncmp(cmd, "CIPM", 4) == 0) {
@ -254,7 +251,7 @@ char *exe_cmd(char *in)
} }
/* /*
* CSPM:3,channel,fromuser,touser,text; (Send personal/chat message). * CSPM:3,fromuser,touser,text; (Send personal message).
* 100:1,n; n: 1=donotdisturb 2=buffer full 3=error * 100:1,n; n: 1=donotdisturb 2=buffer full 3=error
* 100:0; * 100:0;
*/ */
@ -296,10 +293,63 @@ char *exe_cmd(char *in)
return obuf; return obuf;
} }
/*
* Check for sysop page (from mbmon)
*
* CCKP:0;
* 100:3,pid,1,reason; Page is active
* 100:3,pid,0,reason; Page is canceled, but user still online
* 100:0; No page active
*/
if (strncmp(cmd, "CCKP", 4) == 0) { if (strncmp(cmd, "CCKP", 4) == 0) {
return reg_checkpage(token); return reg_checkpage(token);
} }
/*
* Connect to chatserver
*
* CCON:2,pid,username; Connect to chatserver with username
* 100:1,error; If error
* 100:0; Ok
*/
if (strncmp(cmd, "CCON", 4) == 0) {
return chat_connect(token);
}
/*
* Close chat session
*
* CCLO:1,pid; Leave chatserver
* 100:1,error; Error
* 100:0; Ok
*/
if (strncmp(cmd, "CCLO", 4) == 0) {
return chat_close(token);
}
/*
* Put message on server
*
* CPUT:2,pid,message; Put message on server
* 100:1,error; Error
* 100:0; Ok
*/
if (strncmp(cmd, "CPUT", 4) == 0) {
return chat_put(token);
}
/*
* Get message from server
*
* CGET:1,pid; Get message from server
* 100:1,message; If message present
* 100:0; No message
*/
if (strncmp(cmd, "CGET", 4) == 0) {
return chat_get(token);
}
/* /*
* The G(lobal) commands. * The G(lobal) commands.
* *

View File

@ -406,12 +406,11 @@ char *reg_ipm(char *data)
return buf; return buf;
reginfo[rec].lastcon = time(NULL); reginfo[rec].lastcon = time(NULL);
if (!reginfo[rec].ismsg || (reginfo[rec].channel != -1)) if (!reginfo[rec].ismsg)
return buf; return buf;
buf[0] = '\0'; buf[0] = '\0';
sprintf(buf, "100:3,%d,%s,%s;", reginfo[rec].channel, sprintf(buf, "100:2,%s,%s;", reginfo[rec].fname[reginfo[rec].ptr_out], reginfo[rec].msg[reginfo[rec].ptr_out]);
reginfo[rec].fname[reginfo[rec].ptr_out], reginfo[rec].msg[reginfo[rec].ptr_out]);
if (reginfo[rec].ptr_out < RB) if (reginfo[rec].ptr_out < RB)
reginfo[rec].ptr_out++; reginfo[rec].ptr_out++;
else else
@ -419,8 +418,7 @@ char *reg_ipm(char *data)
if (reginfo[rec].ptr_out == reginfo[rec].ptr_in) if (reginfo[rec].ptr_out == reginfo[rec].ptr_in)
reginfo[rec].ismsg = FALSE; reginfo[rec].ismsg = FALSE;
Syslog('+', "reg_ipm: ch=%d in=%d out=%d ismsg=%d", reginfo[rec].channel, Syslog('+', "reg_ipm: in=%d out=%d ismsg=%d", reginfo[rec].ptr_in, reginfo[rec].ptr_out, reginfo[rec].ismsg);
reginfo[rec].ptr_in, reginfo[rec].ptr_out, reginfo[rec].ismsg);
return buf; return buf;
} }
@ -432,41 +430,33 @@ char *reg_ipm(char *data)
*/ */
int reg_spm(char *data) int reg_spm(char *data)
{ {
char *cnt, *ch, *from, *too, *txt, *log; char *cnt, *from, *too, *txt, *log;
int i, error = 0; int i;
cnt = strtok(data, ","); cnt = strtok(data, ",");
ch = strtok(NULL, ",");
from = strtok(NULL, ","); from = strtok(NULL, ",");
too = strtok(NULL, ","); too = strtok(NULL, ",");
txt = strtok(NULL, "\0"); txt = strtok(NULL, "\0");
txt[strlen(txt)-1] = '\0'; txt[strlen(txt)-1] = '\0';
Syslog('-', "SIPM:%s,%s,%s,%s,%s;", cnt, ch, from, too, txt); Syslog('-', "SIPM:%s,%s,%s,%s;", cnt, from, too, txt);
log = calloc(PATH_MAX, sizeof(char));
sprintf(log, "%s/log/%s", getenv("MBSE_ROOT"), CFG.chat_log);
for (i = 0; i < MAXCLIENT; i++) { for (i = 0; i < MAXCLIENT; i++) {
/* if (reginfo[i].pid && (strcasecmp(reginfo[i].uname, too) == 0)) {
* Personal messages and sysop/user chat messages.
*/
if (reginfo[i].pid &&
(((strcasecmp(reginfo[i].uname, too) == 0) && (atoi(ch) == -1)) || (atoi(ch) == 0)) &&
(atoi(ch) == reginfo[i].channel)) {
/* /*
* If the in and out pointers are the same and the * If the in and out pointers are the same and the
* message present flag is still set, then this user * message present flag is still set, then this user
* can't get anymore new messages. * can't get anymore new messages.
*/ */
if (reginfo[i].ismsg && (reginfo[i].ptr_in == reginfo[i].ptr_out)) { if (reginfo[i].ismsg && (reginfo[i].ptr_in == reginfo[i].ptr_out)) {
error = 2; return 2;
} }
/* /*
* If user has the "do not distrurb" flag set, but the sysop ignore's this. * If user has the "do not distrurb" flag set, but the sysop ignore's this.
*/ */
if (reginfo[i].silent && (atoi(ch) == -1)) { if (reginfo[i].silent) {
error = 1; return 1;
} }
/* /*
@ -481,45 +471,18 @@ int reg_spm(char *data)
reginfo[i].ismsg = TRUE; reginfo[i].ismsg = TRUE;
if (CFG.iAutoLog && strlen(CFG.chat_log)) { if (CFG.iAutoLog && strlen(CFG.chat_log)) {
ulog(log, (char *)"+", from, ch, txt); log = calloc(PATH_MAX, sizeof(char));
sprintf(log, "%s/log/%s", getenv("MBSE_ROOT"), CFG.chat_log);
ulog(log, (char *)"+", from, (char *)"-1", txt);
free(log);
} }
Syslog('+', "reg_spm: rec=%d in=%d out=%d ismsg=%d", i, reginfo[i].ptr_in, reginfo[i].ptr_out, reginfo[i].ismsg); Syslog('+', "reg_spm: rec=%d in=%d out=%d ismsg=%d", i, reginfo[i].ptr_in, reginfo[i].ptr_out, reginfo[i].ismsg);
} return 0;
if ((atoi(ch) == -1) || (atoi(ch) == 0)) {
free(log);
return error;
}
/*
* Chat messages, they are send to each user that is chatting in the right channel.
*/
if (reginfo[i].pid && reginfo[i].chatting && reginfo[i].channel == atoi(ch)) {
if (reginfo[i].ismsg && (reginfo[i].ptr_in == reginfo[i].ptr_out)) {
Syslog('!', "reg_spm: buffer full for %s", reginfo[i].uname);
} else {
strncpy((char *)&reginfo[i].fname[reginfo[i].ptr_in], from, 35);
strncpy((char *)&reginfo[i].msg[reginfo[i].ptr_in], txt, 80);
if (reginfo[i].ptr_in < RB)
reginfo[i].ptr_in++;
else
reginfo[i].ptr_in = 0;
reginfo[i].ismsg = TRUE;
if (CFG.iAutoLog && strlen(CFG.chat_log)) {
ulog(log, (char *)"+", from, ch, txt);
}
Syslog('+', "reg_spm: user=%s in=%d out=%d ismsg=%d", reginfo[i].uname, reginfo[i].ptr_in,
reginfo[i].ptr_out, reginfo[i].ismsg);
}
} }
} }
free(log); return 3; // Error, user not found
if ((atoi(ch) == -1) || (atoi(ch) == 0))
return 3; // Error
return 0; // Ok
} }

View File

@ -51,8 +51,8 @@ int reg_timer(int, char *);
int reg_tty(char *); int reg_tty(char *);
int reg_user(char *); int reg_user(char *);
int reg_silent(char *); /* Set/Reset do not disturb */ int reg_silent(char *); /* Set/Reset do not disturb */
char *reg_ipm(char *); /* Check for personal/chat msg */ char *reg_ipm(char *); /* Check for personal message */
int reg_spm(char *); /* Send personal/chat message */ int reg_spm(char *); /* Send personal message */
char *reg_fre(void); /* Check if system is free */ char *reg_fre(void); /* Check if system is free */
char *get_reginfo(int); /* Get registration info */ char *get_reginfo(int); /* Get registration info */
int reg_sysop(char *); /* Registrate sysop presence */ int reg_sysop(char *); /* Registrate sysop presence */