lima-1.0b5/
lima-1.0b5/driver/
lima-1.0b5/driver/ChangeLog.old/
lima-1.0b5/driver/Win32/
lima-1.0b5/driver/compat/
lima-1.0b5/driver/include/
lima-1.0b5/driver/testsuite/
lima-1.0b5/driver/testsuite/clone/
lima-1.0b5/driver/testsuite/command/
lima-1.0b5/driver/testsuite/data/
lima-1.0b5/driver/testsuite/etc/
lima-1.0b5/driver/testsuite/include/
lima-1.0b5/driver/testsuite/inherit/
lima-1.0b5/driver/testsuite/inherit/master/
lima-1.0b5/driver/testsuite/log/
lima-1.0b5/driver/testsuite/single/
lima-1.0b5/driver/testsuite/single/tests/compiler/
lima-1.0b5/driver/testsuite/single/tests/efuns/
lima-1.0b5/driver/testsuite/single/tests/operators/
lima-1.0b5/driver/testsuite/u/
lima-1.0b5/driver/tmp/
lima-1.0b5/etc/
lima-1.0b5/lib/WWW/help/
lima-1.0b5/lib/cmds/
lima-1.0b5/lib/cmds/create/
lima-1.0b5/lib/cmds/player/attic/
lima-1.0b5/lib/contrib/bboard/
lima-1.0b5/lib/contrib/boards/
lima-1.0b5/lib/contrib/marriage/
lima-1.0b5/lib/contrib/roommaker/
lima-1.0b5/lib/contrib/transient_effect/
lima-1.0b5/lib/daemons/channel/
lima-1.0b5/lib/daemons/imud/
lima-1.0b5/lib/data/
lima-1.0b5/lib/data/config/
lima-1.0b5/lib/data/links/
lima-1.0b5/lib/data/news/
lima-1.0b5/lib/data/players/
lima-1.0b5/lib/data/secure/
lima-1.0b5/lib/domains/
lima-1.0b5/lib/domains/std/2.4.5/maze1/
lima-1.0b5/lib/domains/std/2.4.5/npc/
lima-1.0b5/lib/domains/std/2.4.5/post_dir/
lima-1.0b5/lib/domains/std/2.4.5/sub/
lima-1.0b5/lib/domains/std/camera/
lima-1.0b5/lib/domains/std/config/
lima-1.0b5/lib/domains/std/cult/
lima-1.0b5/lib/domains/std/effects/
lima-1.0b5/lib/domains/std/misc/
lima-1.0b5/lib/domains/std/monsters/
lima-1.0b5/lib/domains/std/recorder/
lima-1.0b5/lib/domains/std/rooms/
lima-1.0b5/lib/domains/std/rooms/beach/
lima-1.0b5/lib/domains/std/rooms/labyrinth/
lima-1.0b5/lib/domains/std/school/
lima-1.0b5/lib/domains/std/school/O/
lima-1.0b5/lib/domains/std/spells/
lima-1.0b5/lib/domains/std/spells/stock-mage/
lima-1.0b5/lib/domains/std/spells/stock-priest/
lima-1.0b5/lib/help/
lima-1.0b5/lib/help/admin/
lima-1.0b5/lib/help/hints/General_Questions/
lima-1.0b5/lib/help/hints/Pirate_Quest/
lima-1.0b5/lib/help/player/
lima-1.0b5/lib/help/player/bin/
lima-1.0b5/lib/help/player/quests/
lima-1.0b5/lib/help/wizard/
lima-1.0b5/lib/help/wizard/coding/guilds/
lima-1.0b5/lib/help/wizard/coding/rooms/
lima-1.0b5/lib/help/wizard/lib/daemons/
lima-1.0b5/lib/help/wizard/lib/lfun/
lima-1.0b5/lib/help/wizard/lib/std/
lima-1.0b5/lib/help/wizard/mudos_doc/
lima-1.0b5/lib/help/wizard/mudos_doc/applies/
lima-1.0b5/lib/help/wizard/mudos_doc/applies/interactive/
lima-1.0b5/lib/help/wizard/mudos_doc/applies/parsing/
lima-1.0b5/lib/help/wizard/mudos_doc/concepts/
lima-1.0b5/lib/help/wizard/mudos_doc/driver/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/arrays/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/buffers/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/compile/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/filesystem/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/floats/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/functions/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/general/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/mappings/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/mixed/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/numbers/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/parsing/
lima-1.0b5/lib/help/wizard/mudos_doc/lpc/constructs/
lima-1.0b5/lib/help/wizard/mudos_doc/lpc/types/
lima-1.0b5/lib/include/driver/
lima-1.0b5/lib/log/
lima-1.0b5/lib/obj/admtool/
lima-1.0b5/lib/obj/admtool/internal/
lima-1.0b5/lib/obj/admtool/mudinfo/
lima-1.0b5/lib/obj/admtool/secure/
lima-1.0b5/lib/obj/secure/
lima-1.0b5/lib/obj/secure/cmd/
lima-1.0b5/lib/obj/secure/mailers/
lima-1.0b5/lib/obj/secure/shell/
lima-1.0b5/lib/obj/secure/shell/classes/
lima-1.0b5/lib/obj/tasktool/
lima-1.0b5/lib/obj/tasktool/internal/
lima-1.0b5/lib/open/
lima-1.0b5/lib/secure/
lima-1.0b5/lib/secure/cgi/
lima-1.0b5/lib/secure/modules/
lima-1.0b5/lib/secure/simul_efun/
lima-1.0b5/lib/std/adversary/
lima-1.0b5/lib/std/adversary/advancement/
lima-1.0b5/lib/std/adversary/armor/
lima-1.0b5/lib/std/adversary/blows/
lima-1.0b5/lib/std/adversary/death/
lima-1.0b5/lib/std/adversary/formula/
lima-1.0b5/lib/std/adversary/health/
lima-1.0b5/lib/std/adversary/pulse/
lima-1.0b5/lib/std/adversary/wield/
lima-1.0b5/lib/std/classes/event_info/
lima-1.0b5/lib/std/container/
lima-1.0b5/lib/std/living/
lima-1.0b5/lib/std/modules/contrib/
lima-1.0b5/lib/std/patterns/
lima-1.0b5/lib/std/race/
lima-1.0b5/lib/std/race/restricted/
lima-1.0b5/lib/std/room/
lima-1.0b5/lib/tmp/
lima-1.0b5/lib/trans/
lima-1.0b5/lib/trans/admincmds/
lima-1.0b5/lib/trans/obj/
lima-1.0b5/lib/wiz/
/* Do not remove the headers from this file! see /USAGE for more info. */

/*
** moderation.c -- channel moderation facilities
**
** 960115, Deathblade: created
*/

#include <classes.h>

//### this file is currently included into the channel daemon (rather than
//### inherited cuz we can't do this inherit (driver)
inherit CLASS_CHANNEL_INFO;

class channel_info query_channel_info(string channel_name);
string user_channel_name(string channel_name);
void deliver_notice(string channel_name, string message);
nomask string make_name_list(mixed * list);


/*
** print_mod_info()
**
** Print moderator/speak infor for a moderated channel.
*/
protected nomask void print_mod_info(string channel_name)
{
    class channel_info ci = query_channel_info(channel_name);

    if ( !ci->moderator )
	return;

    printf("It is being moderated by %s.\n", ci->moderator->query_name());

    if ( ci->speaker )
	printf("The current speaker is %s.\n", ci->speaker->query_name());
    else
	printf("There is no current speaker.\n");

    if ( ci->moderator == this_body() )
    {
	if ( !ci->requestors ||
	    !sizeof(ci->requestors) )
	    printf("There are no requestors.\n");
	else
	    tell(this_user(), sprintf("Requestors are: %s.\n",
                 make_name_list(ci->requestors)), MSG_INDENT);
    }
    else if ( member_array(this_body(), ci->requestors) != -1 )
    {
	printf("Your hand is raised to speak.\n");
    }
}


/* this is used when signing off from a channel... */
protected nomask void moderation_signoff(string channel_name)
{
    class channel_info ci = query_channel_info(channel_name);

    if ( !ci )
	return;

    if ( this_body() == ci->moderator )
    {
	ci->moderator = ci->speaker = ci->requestors = 0;

	deliver_notice(channel_name, "This channel is now unmoderated");
    }
    else if ( this_body() == ci->speaker )
    {
	ci->speaker = 0;
	deliver_notice(channel_name,
		       sprintf("%s is no longer speaking",
			       this_body()->query_name()));
    }
}

protected nomask int cmd_moderation(string channel_name, string arg)
{
    class channel_info ci = query_channel_info(channel_name);
    string user_channel_name = user_channel_name(channel_name);
    object tb = this_body();
    string sender_name = tb->query_name();

    if ( arg == "/raise" )
    {
	if ( !ci->moderator )
	{
	    printf("'%s' is not moderated.\n", user_channel_name);
	}
	else if ( tb == ci->speaker )
	{
	    printf("You are already speaking on '%s'.\n", user_channel_name);
	}
	else if ( member_array(tb, ci->requestors) == -1 )
	{
	    printf("Your raise your hand to speak on '%s'.\n",
		   user_channel_name);
	    ci->requestors += ({ tb });
	    ci->moderator->channel_rcv_string(channel_name,
					  sprintf("[%s] (%s raises a hand to speak)\n",
						  user_channel_name,
						  sender_name));
	}
	else
	{
	    printf("You already have your hand raised to speak on '%s'.\n",
		   user_channel_name);
	}
    }
    else if ( arg == "/lower" )
    {
	if ( !ci->moderator )
	{
	    printf("'%s' is not moderated.\n", user_channel_name);
	}
	else if ( member_array(tb, ci->requestors) != -1 )
	{
	    printf("Your lower your hand to avoid speaking on '%s'.\n",
		   user_channel_name);
	    ci->requestors -= ({ tb });
	    ci->moderator->channel_rcv_string(channel_name,
					  sprintf("[%s] (%s lowers a hand)\n",
						  user_channel_name,
						  sender_name));
	}
	else
	{
	    printf("Your hand is not raised to speak on '%s'.\n",
		   user_channel_name);
	}
    }
    else if ( arg[0..4] == "/call" )
    {
	arg = lower_case(trim_spaces(arg[5..]));
	if ( !ci->moderator )
	{
	    printf("'%s' is not moderated.\n", user_channel_name);
	}
	else if ( ci->moderator != tb )
	{
	    printf("You are not the moderator of '%s'.\n", user_channel_name);
	}
	else if ( arg == "" )
	{
	    if ( sizeof(ci->requestors) == 0 )
	    {
		printf("Nobody has their hand raised.\n");
	    }
	    else
	    {
		ci->speaker = ci->requestors[0];
		ci->requestors = ci->requestors[1..];
		deliver_notice(channel_name,
			       sprintf("%s will now speak",
				       ci->speaker->query_name()));
	    }
	}
	else
	{
	    object * spkr;

	    spkr = filter_array(ci->requestors,
				(: $(arg) == lower_case($1->query_name()) :));
	    if ( sizeof(spkr) == 0 )
	    {
		printf("'%s' was not found (or did not have their hand raised.\n",
		       capitalize(arg));
	    }
	    else
	    {
		ci->speaker = spkr[0];
		ci->requestors -= ({ spkr[0] });
		deliver_notice(channel_name,
			       sprintf("%s will now speak",
				       ci->speaker->query_name()));
	    }
	}
    }
    else if ( arg == "/moderate" )
    {
	if ( adminp(this_user()) ||
	    GROUP_D->member_group(this_user()->query_userid(), "moderators") )
	{
	    ci->moderator = tb;
	    if ( !ci->requestors )
		ci->requestors = ({ });
	    deliver_notice(channel_name,
			   sprintf("%s is now moderating", sender_name));
	}
	else
	{
	    printf("You are not allowed to moderate this channel.\n");
	}
    }
    else
    {
	/* not handled */
	return 0;
    }

    /* handled */
    return 1;
}