foundation2_fluffos_v1/
foundation2_fluffos_v1/bin/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/ChangeLog.old/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/Win32/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/compat/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/compat/simuls/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/include/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/clone/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/command/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/data/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/etc/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/include/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/inherit/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/inherit/master/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/log/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/single/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/single/tests/compiler/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/single/tests/efuns/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/single/tests/operators/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/u/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/tmp/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/windows/
foundation2_fluffos_v1/lib/cfg/
foundation2_fluffos_v1/lib/cmds/adm/
foundation2_fluffos_v1/lib/daemon/save/
foundation2_fluffos_v1/lib/daemon/services/
foundation2_fluffos_v1/lib/daemon/soul/
foundation2_fluffos_v1/lib/doc/build/
foundation2_fluffos_v1/lib/doc/classes/
foundation2_fluffos_v1/lib/doc/driver/
foundation2_fluffos_v1/lib/doc/driver/applies/
foundation2_fluffos_v1/lib/doc/driver/applies/interactive/
foundation2_fluffos_v1/lib/doc/driver/concepts/
foundation2_fluffos_v1/lib/doc/driver/driver/
foundation2_fluffos_v1/lib/doc/driver/efuns/arrays/
foundation2_fluffos_v1/lib/doc/driver/efuns/buffers/
foundation2_fluffos_v1/lib/doc/driver/efuns/calls/
foundation2_fluffos_v1/lib/doc/driver/efuns/compile/
foundation2_fluffos_v1/lib/doc/driver/efuns/filesystem/
foundation2_fluffos_v1/lib/doc/driver/efuns/floats/
foundation2_fluffos_v1/lib/doc/driver/efuns/functions/
foundation2_fluffos_v1/lib/doc/driver/efuns/general/
foundation2_fluffos_v1/lib/doc/driver/efuns/mappings/
foundation2_fluffos_v1/lib/doc/driver/efuns/numbers/
foundation2_fluffos_v1/lib/doc/driver/efuns/parsing/
foundation2_fluffos_v1/lib/doc/driver/lpc/constructs/
foundation2_fluffos_v1/lib/doc/driver/lpc/types/
foundation2_fluffos_v1/lib/doc/driver/platforms/
foundation2_fluffos_v1/lib/doc/efun/
foundation2_fluffos_v1/lib/doc/etc/
foundation2_fluffos_v1/lib/doc/faq/
foundation2_fluffos_v1/lib/doc/help/creator/
foundation2_fluffos_v1/lib/doc/help/player/
foundation2_fluffos_v1/lib/doc/lpc/basic/
foundation2_fluffos_v1/lib/doc/lpc/data_types/
foundation2_fluffos_v1/lib/doc/lpc/etc/
foundation2_fluffos_v1/lib/doc/lpc/intermediate/
foundation2_fluffos_v1/lib/doc/lpc/types/
foundation2_fluffos_v1/lib/doc/mudlib/
foundation2_fluffos_v1/lib/doc/mudlib/Features/
foundation2_fluffos_v1/lib/domains/Examples/armour/
foundation2_fluffos_v1/lib/domains/Examples/etc/
foundation2_fluffos_v1/lib/domains/Examples/npc/
foundation2_fluffos_v1/lib/domains/Examples/room/
foundation2_fluffos_v1/lib/domains/Examples/virtual/
foundation2_fluffos_v1/lib/domains/Examples/virtual/exaA/
foundation2_fluffos_v1/lib/domains/Examples/virtual/exaB/
foundation2_fluffos_v1/lib/domains/Examples/weapon/
foundation2_fluffos_v1/lib/domains/School/doc/
foundation2_fluffos_v1/lib/domains/School/room/
foundation2_fluffos_v1/lib/domains/School/room/Classes/
foundation2_fluffos_v1/lib/domains/School/room/Offices/
foundation2_fluffos_v1/lib/domains/Standard/
foundation2_fluffos_v1/lib/domains/Standard/pools/
foundation2_fluffos_v1/lib/domains/Standard/std/
foundation2_fluffos_v1/lib/domains/Standard/xtra/
foundation2_fluffos_v1/lib/include/
foundation2_fluffos_v1/lib/lib/obj/
foundation2_fluffos_v1/lib/news/
foundation2_fluffos_v1/lib/save/
foundation2_fluffos_v1/lib/secure/cfg/
foundation2_fluffos_v1/lib/secure/cmds/player/
foundation2_fluffos_v1/lib/secure/lib/
foundation2_fluffos_v1/old/
foundation2_fluffos_v1/win32/
/*    /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;
}