/****************************************************************************
* ResortMUD Version 5.0 was mainly programmed by Ntanel, Garinan, Josh, *
* Badastaz, Digifuzz, Senir, Kratas, Scion, Shogar and Tagith. *
* ------------------------------------------------------------------------ *
* Copyright (C) 1996 - 2001 Haslage Net Electronics: MudWorld of Lorain, *
* Ohio. ALL RIGHTS RESERVED See /doc/RMLicense.txt for more details. *
****************************************************************************/
/*
* Original concept by Garil, modified by Senir.
*
* This code currently does not function, below is the inserted bits which exist in
* other files and is commented out. Do not uncomment the below bits in the
* other files until the code is made fully funtional.
*
* Uncomment in do.h
* DECLARE_DO_FUN( do_intermud );
* void imud_recv_message();
*
* Uncomment in comm.c
* imud_recv_message();
*
* Add to the Makefile - C_FILES
* mudmsg.c
*/
#include <sys/ipc.h>
#include <sys/msg.h>
#include <errno.h>
#include "mud.h"
#define INTERMUDCHAN_FORMAT "&C&W[&RIntermud&W] &w%s@%s&W: &R%s\r\n"
#define INTERMUDCHAN_LEVEL 2
/* Increment MAX_MUD_PORTS by one and add a new port for each new mud added */
#define MAX_MUD_PORTS 2
int mudports[MAX_MUD_PORTS];
struct mud_msgbuf
{
long mtype;
char mtext[2048];
};
short clearq = 0;
void do_intermud( CHAR_DATA * ch, char *argument )
{
struct mud_msgbuf qbuf[MAX_MUD_PORTS];
int qid = -1;
short i = 1;
mudports[0] = 4000;
mudports[1] = 7000;
if( !argument || argument[0] == '\0' )
{
send_to_char_color( "&C&wWhat do you want to communicate?\r\n", ch );
return;
}
if( ( qid = msgget( 89798, IPC_CREAT | 0660 ) ) == -1 )
{
bug( "Unable to msgget id for intermud chan sending.", 0 );
return;
}
for( i = 0; i < MAX_MUD_PORTS; i++ )
{
if( mudports[i] == 0 )
continue;
qbuf[i].mtype = mudports[i];
qbuf[i].mtext[0] = '\0';
sprintf( qbuf[i].mtext, "\"%s\" \"%s\" %s", sysdata.mud_name, capitalize( ch->name ), argument );
if( ( msgsnd( qid, ( struct msgbuf * )&qbuf[i], sizeof( struct mud_msgbuf ), 0 ) ) == -1 )
bug( "Unable to queue intermud chan msg for sending to mud at port %d.", mudports[i] );
}
clearq = 3;
}
void recv_text_handler( char *str )
{
DESCRIPTOR_DATA *d = NULL;
CHAR_DATA *och = NULL;
char mname[MAX_INPUT_LENGTH];
char pname[MAX_INPUT_LENGTH];
str = one_argument( str, mname );
str = one_argument( str, pname );
for( d = first_descriptor; d; d = d->next )
{
och = d->original ? d->original : d->character;
if( !och || d->connected != CON_PLAYING
// || IS_SET(och->deaf, CHANNEL_INTERMUD)
|| get_trust( och ) < INTERMUDCHAN_LEVEL )
continue;
ch_printf( och, INTERMUDCHAN_FORMAT, pname, mname, str );
}
return;
}
void imud_recv_message( )
{
struct mud_msgbuf qbuf;
int ret;
int qid = -1;
if( ( qid = msgget( 89798, IPC_CREAT | 0660 ) ) == -1 )
{
//bug("Unable to msgget id for intermud chan receiving.", 0);
return;
}
while( ( ret = msgrcv( qid, ( struct msgbuf * )&qbuf, sizeof( struct mud_msgbuf ), port, IPC_NOWAIT ) ) > 0 )
recv_text_handler( qbuf.mtext );
if( ret == -1 && errno != ENOMSG )
bug( "Error in receiving intermud msg from queue.", 0 );
if( clearq > 0 )
{
if( --clearq > 0 )
return;
msgctl( qid, IPC_RMID, 0 );
}
}