/* 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;
}