inherit M_MESSAGES;
mapping permanent;
mapping colors;
mapping imud;
mapping guilds;
static mapping channels;
static mapping listeners;
#include <channel.h>
void restore_me( void );
void save_me( void );
void chan_new( string name, int flags );
void chan_join( string chan, object ob );
void chan_leave( string chan, object ob );
void chan_say( string chan, string what );
void chan_emote( string chan, string what );
void chan_who( string chan );
int query_subscribed( string chan );
void chan_make_permanent( string name );
void chan_set_color( string chan, string col );
void chan_set_guild( string chan, string guild );
void chan_set_flag( string chan, int flag );
void chan_imud( string chan, string name );
void create( void ) {
string *chans;
int i;
permanent = ([ ]);
channels = ([ ]);
listeners = ([ ]);
colors = ([ ]);
imud = ([ ]);
guilds = ([ ]);
restore_me();
chans = map_indices( permanent );
for( i = 0; i < sizeof( chans ); i++ ) {
channels[chans[i]] = permanent[chans[i]];
}
EVENT_D->subscribe_event( "player_login" );
EVENT_D->subscribe_event( "player_logout" );
EVENT_D->subscribe_event( "new_player" );
}
void chan_cmd( string chan, string cmd ) {
switch( cmd ) {
case "/on":
case "/join":
chan_join( chan, this_player() );
this_player()->add_channel( chan );
break;
case "/off":
case "/leave":
case "/quit":
chan_leave( chan, this_player() );
this_player()->remove_channel( chan );
write( "Not subscribed to " + chan + ".\n" );
break;
case "/new":
chan_new( chan, ALL );
break;
case "/admin":
chan_set_flag( chan, ADMIN_ONLY );
break;
case "/wiz":
chan_set_flag( chan, WIZ_ONLY );
break;
case "/readonly":
chan_set_flag( chan, READ_ONLY );
break;
case "/permanent":
chan_make_permanent( chan );
break;
case "":
case "/who":
case "/list":
chan_who( chan );
break;
case "/delete":
break;
case "/info":
break;
default:
if( strlen( cmd ) > 8 )
if( cmd[..5] == "/color" ) {
/* Let's change the color of the channel */
chan_set_color( chan, cmd[7..] );
break;
} else if( cmd[..4] == "/imud" ) {
chan_imud( chan, cmd[6..] );
break;
} else if( cmd[..5] == "/guild" ) {
chan_set_guild( chan, cmd[7..] );
break;
}
if( cmd[0] == ';' ) {
chan_emote( chan, cmd[1..] );
break;
}
chan_say( chan, cmd );
return;
}
}
void restore_me( void ) {
restore_object( "/daemons/data/channel_d.o" );
}
void save_me( void ) {
save_object( "/daemons/data/channel_d.o" );
}
void chan_set_flag( string chan, int flag ) {
channels[chan] = flag;
if( permanent[chan] )
permanent[chan] = channels[chan];
save_me();
}
void chan_make_permanent( string name ) {
if( SECURE_D->query_admin( this_player()->query_name() ) != 1 ) {
write( "Access denied.\n" );
return;
}
permanent[name] = channels[name];
save_me();
write( "Channel " + name + " is permanent.\n" );
}
void chan_imud( string chan, string name ) {
if( SECURE_D->query_admin( this_player()->query_name() ) != 1 ) {
write( "Access denied.\n" );
return;
}
if( channels[chan] == 0 ) {
write( "Channel doesn't exists.\n" );
return;
}
if( imud == 0 )
imud = ([ ]);
imud[name] = chan;
save_me();
}
void chan_new( string name, int flags ) {
name = lowercase( name );
if( SECURE_D->query_wiz( this_player()->query_name() ) != 1 ) {
write( "Access denied.\n" );
return;
}
if( channels[name] != 0 ) {
write( "Channel already exists.\n" );
return;
}
channels[name] = flags;
write( "Channel created.\n" );
}
void chan_join( string chan, object ob ) {
chan = lowercase( chan );
if( channels[chan] == 0 ) {
write( "No such channel." );
return;
}
if( channels[chan] < READ_ONLY ) {
if( SECURE_D->query_priv( ob->query_name() ) < channels[chan] - 1 ) {
write( "No such channel.\n" );
return;
}
}
if( guilds == 0 )
guilds = ([ ]);
if( guilds[chan] != 0 ) {
if( ob->guild_member( guilds[chan] ) == 0 ) {
write( "No such channel.\n" );
return;
}
}
if( listeners[chan] == 0 ) {
listeners[chan] = ({ });
}
listeners[chan] -= ({ ob });
listeners[chan] += ({ ob });
write( "Subscribed to " + chan + ".\n" );
ob->save_me();
}
void chan_leave( string chan, object ob ) {
chan = lowercase( chan );
if( channels[chan] == 0 ) {
write( "No such channel." );
return;
}
if( channels[chan] != READ_ONLY )
if( SECURE_D->query_priv( ob->query_name() ) < channels[chan] - 1 ) {
write( "No such channel.\n" );
return;
}
if( listeners[chan] == 0 ) {
listeners[chan] = ({ });
}
listeners[chan] -= ({ ob });
write( "No longer subscribed to " + chan + ".\n" );
}
void chan_who( string chan ) {
object *users;
int i;
chan = lowercase( chan );
if( listeners[chan] == 0 ) {
write( "No subscribers." );
return;
}
write( "Subscribed to " + chan + ":\n" );
users = listeners[chan];
for( i = 0; i < sizeof( users ); i ++ ) {
write( " " + capitalize( users[i]->query_name() ) + "\n" );
}
}
void chan_send_string( string chan, string str ) {
object *users;
string line;
int i;
if( colors == 0 ) {
colors = ([ ]);
}
if( colors[chan] != 0 ) {
line = colors[chan] + "[" + lowercase(chan) + "]%^RESET%^ " + str;
} else {
line = "[" + lowercase(chan) + "] " + str;
}
users = listeners[chan];
if( users != 0 )
for( i = 0; i < sizeof( users ); i++ ) {
users[i]->message( line );
}
}
void chan_imud_rcv_targetted( string chan, string who, string where,
string target, string targetmud, string what ) {
if( imud[chan] == 0 ) {
return;
}
what = replace_string( what, "$O", target + "@" + targetmud );
what = replace_string( what, "$N", who + "@" + where );
chan_send_string( imud[chan], what );
}
void chan_imud_rcv_emote( string chan, string who, string where,
string what ) {
if( imud[chan] == 0 ) {
return;
}
what = replace_string( what, "$N", who + "@" + where );
chan_send_string( imud[chan], what );
}
void chan_imud_rcv_say( string chan, string who, string where, string what ) {
if( imud[chan] == 0 ) {
chan_send_string( "wiz", "[" + chan + "] " + who + "@" + where + ": " + what );
return;
}
chan_send_string( imud[chan], who + "@" + where
+ ": " + what );
}
void chan_emote( string chan, string what ) {
string *ichans;
string *result;
int i;
string cmd;
string arg;
if( query_subscribed( chan ) == 0 ) {
write( "Not subscribed to channel " + chan + ".\n" );
return;
}
if( channels[chan] == READ_ONLY ) {
write( chan+ " is read only." );
return;
}
if( what == "" )
return;
if( sscanf( what, "%s %s", cmd, arg ) != 2 )
cmd = what;
if( EMOTE_D->is_emote( cmd ) ) {
string *rules;
string rule;
object target;
rules = EMOTE_D->query_rules( cmd );
/* Targetted emote? Find the target */
if( arg != 0 && arg != "" ) {
target = this_environment()->find_object( arg );
if( target == 0 ) {
target = USER_D->find_player( arg );
}
} else {
target = 0;
}
if( target != 0 ) {
/* We've found our target, check for the correct rule */
if( target->is_living() ) {
/* We're looking for a LIV rule */
if( member_array( "LIV", rules ) != -1 ) {
rule = "LIV";
} else {
rule = "";
}
} else {
/* We're looking for a OBJ rule */
if( member_array( "OBJ", rules ) != -1 ) {
rule = "OBJ";
} else {
rule = "";
}
}
} else {
/* Or are we just looking for a string? */
if( member_array( "STR", rules ) != -1 && arg != "" ) {
rule = "STR";
} else {
rule = "";
}
}
if( rule == "LIV" ) {
result = compose_message( this_player(), EMOTE_D->query_emote( cmd, rule ), target, 0 );
what = result[2];
} else if( rule == "OBJ" ) {
result = compose_message( this_player(), EMOTE_D->query_emote( cmd, rule), 0, ({ target }) );
what = result[2];
} else if( rule == "STR" ) {
result = compose_message( this_player(), EMOTE_D->query_emote( cmd, rule), 0, ({ arg }) );
what = result[2];
} else {
if( member_array( "", rules ) != -1 ) {
result = compose_message( this_player(), EMOTE_D->query_emote( cmd, rule),0, 0 );
what = result[2];
} else
write( "No such emote.\n" );
}
} else {
if( arg != 0 && arg != "" )
what = capitalize( this_player()->query_name() ) + " " + cmd + " " + arg;
else
what = capitalize( this_player()->query_name() ) + " " + cmd;
}
ichans = map_indices( imud );
for( i = 0; i < sizeof( ichans ); i++ ) {
if( imud[ichans[i]] == chan ) {
what = replace_string( what, capitalize( this_player()->query_name() ), "$N" );
/* Found an intermud channel */
IMUD_D->do_channel_e( ichans[i], what );
return;
}
}
chan_send_string( chan, what );
}
void chan_say( string chan, string what ) {
string *ichans;
int i;
if( query_subscribed( chan ) == 0 ) {
write( "Not subscribed to channel " + chan + ".\n" );
return;
}
if( channels[chan] == READ_ONLY ) {
write( chan+ " is read only." );
return;
}
if( what == "" )
return;
ichans = map_indices( imud );
for( i = 0; i < sizeof( ichans ); i++ ) {
if( imud[ichans[i]] == chan ) {
/* Found an intermud channel */
IMUD_D->do_channel_m( ichans[i], what );
return;
}
}
chan_send_string( chan, capitalize( this_player()->query_name() ) + ": " + capitalize( what ) );
}
void chan_set_color( string chan, string col ) {
if( SECURE_D->query_admin( this_player()->query_name() ) != 1 ) {
write( "Access denied.\n" );
return;
}
if( colors == 0 )
colors = ([ ]);
colors[chan] = "%^" + uppercase( col ) + "%^";
write( chan + " is now " + col + "\n" );
save_me();
}
void chan_set_guild( string chan, string guild ) {
if( SECURE_D->query_admin( this_player()->query_name() ) != 1 ) {
write( "Access denied.\n" );
return;
}
if( guilds == 0 )
guilds = ([ ]);
guilds[chan] = guild;
write( chan + " is now a " + guild + " only channel." );
save_me();
}
int query_priv( string chan ) {
return( channels[chan]-1 );
}
int query_channel( string chan ) {
if( guilds == 0 )
guilds = ([ ]);
if( channels[chan] != 0 ) {
if( channels[chan] == READ_ONLY )
return( 1 );
if( guilds[chan] != 0 ) {
/* Guild channel */
if( SECURE_D->query_priv( this_player()->query_name() ) > 0 ) {
/* A wiz can subscribe to all channels */
return( 1 );
} else {
return( this_player()->guild_member( guilds[chan] ) );
}
}
if( SECURE_D->query_priv( this_player()->query_name() ) >= channels[chan] - 1 )
return( 1 );
else
return( 0 );
} else
return( 0 );
}
string *query_channels( void ) {
return map_indices(channels);
}
int query_subscribed( string chan ) {
chan = lowercase( chan );
if( listeners[chan] != 0 ) {
if( member_array( this_player(), listeners[chan] ) != -1 ) {
return( 1 );
}
}
return( 0 );
}
void event_new_player( string *args ) {
if( channels["announce"] != 0 ) {
chan_send_string( "announce", "Trumpets sound as " + capitalize( args[0] ) + " joins the realm." );
}
}
void event_player_login( string *args ) {
if( channels["announce"] != 0 ) {
chan_send_string( "announce", capitalize(args[0]) + " logs in." );
}
}
void event_player_logout( string *args ) {
if( channels["announce"] != 0 ) {
chan_send_string( "announce", capitalize(args[0]) + " logs out." );
}
}
void event_player_join( string *args ) {
if( channels["announce"] != 0 ) {
chan_send_string( "announce", "Trumpets blast a fanfare as " + capitalize(args[0]) + " joins " + args[1] + "!" );
}
}