/* Do not remove the headers from this file! see /USAGE for more info. */ /* ** channel/cmd.c ** ** Part of the CHANNEL_D to handle channel command processing. */ #include <classes.h> #include <channel.h> inherit CLASS_CHANNEL_INFO; void create_channel(string channel_name); class channel_info query_channel_info(string channel_name); string user_channel_name(string channel_name); void test_for_purge(string channel_name); void set_permanent(string channel_name, int is_perm); void set_flags(string channel_name, int flags); void deliver_emote(string channel_name, string sender_name, string message); void deliver_tell(string channel_name, string sender_name, string message); void deliver_soul(string channel_name, mixed * soul); string make_name_list(mixed * list); int cmd_moderation(string channel_name, string arg); void moderation_signoff(string channel_name); void print_mod_info(string channel_name); /* ** cmd_channel() ** ** Standard channel processing command for player input. Most channel- ** oriented systems will use this to get standardized channel manipulation. ** ** channel_type is: ** 0 normal ** 1 intermud */ varargs nomask void cmd_channel(string channel_name, string arg, int channel_type) { class channel_info ci = query_channel_info(channel_name); object user=this_user(); int listening; string user_channel_name; string sender_name; listening = member_array(channel_name, user->query_channel_list()) != -1; user_channel_name = user_channel_name(channel_name); if ( !arg || arg == "" ) { if ( listening ) { printf("You are presently listening to '%s'.\n", user_channel_name); print_mod_info(channel_name); } else { printf("You are not listening to '%s'.\n", user_channel_name); } return; } if ( arg[0..3] == "/new" ) { string * options = explode(arg[4..], " "); if ( ci ) { if ( sizeof(options) ) printf("'%s' already exists; modifying options...\n", user_channel_name); else printf("'%s' already exists.\n", user_channel_name); } else { create_channel(channel_name); printf("'%s' has been created.\n", user_channel_name); } ci = query_channel_info(channel_name); foreach ( string option in options ) { switch ( option ) { case "admin": if ( !adminp(user) ) { printf("Only admins can create admin channels.\n"); return; } set_flags(channel_name, CHANNEL_ADMIN_ONLY); printf(" --> only admins may tune in\n"); break; case "wiz": case "wizard": /* ### need better security? */ if ( (ci->flags & CHANNEL_ADMIN_ONLY) && !adminp(user) ) { printf("Only admins can turn off admin-only.\n"); return; } else if ( !wizardp(user) ) { printf("Only wizards can create wizard channels.\n"); return; } set_flags(channel_name, CHANNEL_WIZ_ONLY); printf(" --> only wizards may tune in\n"); break; case "permanent": /* ### need better security? */ if ( !adminp(user) ) { printf("Only admins can tweak permanent channels.\n"); return; } set_permanent(channel_name, 1); printf(" --> the channel is permanent\n"); break; case "nopermanent": case "goaway": /* ### need better security? */ if ( !adminp(user) ) { printf("Only admins can tweak permanent channels.\n"); return; } set_permanent(channel_name, 0); printf(" --> the channel may now go away\n"); test_for_purge(channel_name); break; } } /* tune the channel in now */ arg = "/on"; } if ( arg == "/on" ) { if ( listening ) { printf("You are already listening to '%s'.\n", user_channel_name); } else if ( !ci ) { printf("'%s' does not exist. Use /new to create it.\n", user_channel_name); return; } else { /* enforce the channel restrictions now */ /* ### not super secure, but screw it :-) */ if ( (ci->flags & CHANNEL_WIZ_ONLY) && !wizardp(user) ) { printf("Sorry, but '%s' is for wizards only.\n", user_channel_name); return; } if ( (ci->flags & CHANNEL_ADMIN_ONLY) && !adminp(user) && member_array(user->query_userid(), SECURE_D->query_domain_members("admin-channels")) == -1) { printf("Sorry, but '%s' is for admins only.\n", user_channel_name); return; } user->add_channel(channel_name); printf("You are now listening to '%s'.\n", user_channel_name); } print_mod_info(channel_name); return; } /* ** All the following "commands" need to have the player listening */ if ( !listening ) { printf( "You are not listening to %s.\n", channel_name ); return; } sender_name = user->query_name(); if ( arg == "/off" ) { user->remove_channel(channel_name); printf("You are no longer listening to '%s'.\n", user_channel_name); moderation_signoff(channel_name); } else if ( arg == "/list" || arg == "/who" ) { tell(user, sprintf("Users listening to '%s': %s.\n", user_channel_name, make_name_list(ci->listeners)), MSG_INDENT); } else if( arg == "/last" || arg == "/history" ) { string history = implode(ci->history, ""); if ( history == "" ) history = "<none>\n"; more(sprintf("History of channel '%s':\n%s\n", user_channel_name, history)); } else if( arg == "/clear" ) { if ( adminp(user) || user = ci->moderator ) { ci->history = ({}); write("Channel cleared.\n"); } else error("Illegal attempt to clear channel " + user_channel_name + " by " + capitalize(this_body()->query_userid()) + "."); } else if ( cmd_moderation(channel_name, arg) ) { /* it was handled */ } else if ( arg[0] == ';' || arg[0] == ':' ) { if ( ci->moderator && ci->speaker && user != ci->moderator && user != ci->speaker ) { printf("You are not the speaker on '%s'.\n", user_channel_name); } else if ( channel_type == CHANNEL_TYPE_IMUD ) { mixed * soul; string the_soul; if (sscanf(arg[1..],"%s %*s",the_soul)!=2) the_soul=arg[1..]; if (SOUL_D->query_emote(the_soul)) soul = SOUL_D->parse_imud_soul(arg[1..]); if ( soul ) deliver_soul(channel_name, soul); else deliver_emote(channel_name, sender_name, arg[1..]); } else { mixed * soul; string the_soul; if (sscanf(arg[1..],"%s %*s",the_soul)!=2) the_soul=arg[1..]; if (SOUL_D->query_emote(the_soul)) soul = SOUL_D->parse_soul(arg[1..]); if ( soul ) deliver_soul(channel_name, soul); else deliver_emote(channel_name, sender_name, arg[1..]); } } else { if ( ci->moderator && ci->speaker && user != ci->moderator && user != ci->speaker ) { printf("You are not the speaker on '%s'.\n", user_channel_name); } else { deliver_tell(channel_name, sender_name, arg); } } }