/* /daemon/chat.c
* from the Nightmare 3.2 Mudlib
* daemon to handle all mud chat channels
* created by Descartes of Borg 931220
*/
#include <lib.h>
#include <daemons.h>
#include <origin.h>
#include "chat.h"
inherit LIB_DAEMON;
static private mapping Channels;
static void create() {
object pl;
daemon::create();
SetNoClean(1);
Channels = ([]);
foreach(pl in users()) {
string channel;
foreach(channel in (string *)pl->GetChannels()) {
if( !Channels[channel] ) Channels[channel] = ({});
Channels[channel] = distinct_array(Channels[channel] + ({ pl }));
}
}
}
string *eventRegisterMember(string *chans) {
string *tmp;
object ob;
string channel;
if( !living(ob = previous_object()) ) return ({});
tmp = ({});
foreach(channel in chans) {
/* just check out for secure channels */
switch(channel) {
case "admin":
if( !archp(ob) ) break;
case "cre": case "intercre": case "gossip": case "intergossip":
case "interchat":
if( !creatorp(ob) ) break;
default:
if( !Channels[channel]) Channels[channel] = ({});
Channels[channel] = distinct_array(Channels[channel] + ({ ob }));
tmp += ({ channel });
}
}
return tmp;
}
string *eventRemoveMember(string *chans) {
object ob;
string channel;
if( !living(ob = previous_object()) ) return({});
foreach(channel in chans) {
if( !Channels[channel] ) continue;
else Channels[channel] -= ({ ob });
if( !sizeof(Channels[channel]) ) map_delete(Channels, channel);
}
return chans;
}
int cmdChannel(string verb, string str) {
string msg, name, rc;
int emote;
if( verb == "list" ) {
string *who;
string ch, mud;
if( !str ) return 0;
if( sscanf(str, "%s@%s", ch, mud) == 2 ) {
if( !Channels[ch] ) return 0;
if( member_array(this_player(), Channels[ch]) == -1 ) return 0;
if( ch == (ch = GetRemoteChannel(ch)) ) return 0;
if( !(mud = (string)INTERMUD_D->GetMudName(mud)) ) {
message("system", "No such MUD is known.", this_player());
return 1;
}
SERVICES_D->eventSendChannelWhoRequest(ch, mud);
message(ch, "Remote listing request sent.", this_player());
return 1;
}
else ch = str;
if( !Channels[ch] ) return 0;
if( member_array(this_player(), Channels[str]) == -1 ) return 0;
who = GetChannelList(str);
msg = "Online: " + implode(who, " ");
message(str, msg, this_player());
return 1;
}
if( !Channels[verb] ) {
if( sscanf(verb, "%semote", verb) ) {
emote = 1;
if( strsrch(str, "$N") == -1 ) str = "$N " + str;
}
else return 0;
if( !Channels[verb] ) return 0;
}
rc = GetRemoteChannel(verb);
if( member_array(this_player(), Channels[verb]) == -1 ) return 0;
if( !str || str == "" ) {
this_player()->SetBlocked(verb);
return 1;
}
if( (int)this_player()->GetBlocked(verb) ) {
if( (int)this_player()->GetBlocked("all") ) {
message(verb, "You cannot chat while totally blocked.",
this_player());
return 1;
}
this_player()->SetBlocked(verb);
}
if( verb == "admin" || verb=="cre" ) {
if( !(name = (string)this_player()->GetCapName()) )
name = capitalize((string)this_player()->GetKeyName());
}
else name = (string)this_player()->GetName();
eventSendChannel(name, verb, str, emote, 0, 0);
if( rc != verb )
SERVICES_D->eventSendChannel(name, rc, str, emote, 0, 0);
return 1;
}
varargs void eventSendChannel(string who, string ch, string msg, int emote,
string target, string targmsg) {
if( file_name(previous_object()) == SERVICES_D) {
ch = GetLocalChannel(ch);
if( emote ) msg = replace_string(msg, "$N", who);
}
else if( origin() != ORIGIN_LOCAL && previous_object() != master() )
return;
if( !Channels[ch] ) return;
if( emote ) {
object ob;
string this_msg;
if( target ) {
ob = find_player(target);
target = (string)ob->GetName();
}
this_msg = "%^MAGENTA%^<" + ch + ">%^RESET%^ ";
msg = replace_string(msg, "$N", who);
if( target ) {
msg = replace_string(msg, "$O", target);
targmsg = replace_string(targmsg, "$N", who);
targmsg = capitalize(replace_string(targmsg, "$O", "you"));
}
message(ch, this_msg + msg, Channels[ch], (ob ? ({ ob }) : ({})));
if( ob ) message(ch, this_msg + targmsg, ob);
}
else {
msg = who + " %^MAGENTA%^<" + ch + ">%^RESET%^ " + msg;
message(ch, msg, Channels[ch]);
}
}
string *GetChannelList(string ch) {
string list;
int i;
if( file_name(previous_object()) == SERVICES_D ) ch = GetLocalChannel(ch);
else if( origin() != ORIGIN_LOCAL ) return ({});
if( !Channels[ch] ) return ({});
return map(filter(Channels[ch], (: $1 && !((int)$1->GetInvis()) :)),
(: (string)$1->GetName() :));
}
string GetLocalChannel(string ch) {
switch(ch) {
case "imud_code":
return "intercre";
case "imud_gossip":
return "intergossip";
case "ie_flibcode":
return "foundation";
case "ichat":
return "interchat";
}
return ch;
}
string GetRemoteChannel(string ch) {
switch(ch) {
case "intercre":
return "imud_code";
case "intergossip":
return "imud_gossip";
case "foundation":
return "ie_flibcode";
case "interchat":
return "ichat";
}
return ch;
}