/** * Chat daemon from the Nightmare mudlib ... "borrowed" by Sibbis 12/10/1994 * Modified extensively for the Cyningdom of Suvangi by Sibbis 12/10/1994 * Cleaned up and modified for new intermud(3) client; Galileo, 2/4/99 * Modified for the Skylib Mudlib: Shaydz 2001 */ #define MAX_HISTORY 50 #include <drinks.h> #include <network.h> int show_channel(string); int show_ichannel(string); string query_channel_name(string); private mapping channels, chan_history; void create() { object *obs; channels = ([ ]); chan_history = ([ ]); seteuid( master()->creator_file( file_name(TO) ) ); obs = users(); foreach( object ob in obs ) { string *chans; if( !pointerp( chans = ob->query_channels() ) ) continue; if( !adminp(ob) ) chans -= ({"admin"}); if( !lordp(ob) ) chans -= ({"lord"}); if( !seniorp(ob) ) chans -= ({"senior"}); foreach( string chan in chans ) { if( pointerp( channels[chan] ) ) { if( member_array( ob, channels[chan] ) == -1 ) channels[chan] += ({ ob }); } else { channels[chan] = ({ ob }); } } } } /* create() */ /** @ignore yes */ varargs string channel_syntax( string verb, int flag ) { string ret, pad; if( verb == "cwho") { printf("cwho <channel> - List all players on the channel.\n"); return 0; } pad = repeat_string(" ", sizeof(verb) ); ret = "Syntax: "+verb+" <message> - Normal\n" " "+verb+" @<message> - Emoted\n" " "+verb+" :<message> - Emoted\n"; if( lordp(TP) ) ret += " "+verb+" !<message> - Forced\n"; ret += " "+verb+" off - Channel Off\n" " "+verb+" on - Channel On\n\n" " history "+verb+" - Show last "+MAX_HISTORY+" messages.\n" " channels"+pad+" - Show all available channels.\n" " cwho "+verb+" - List all players on the channel.\n"; // if( INTERMUD_H->available_channel( query_channel_name(verb) ) ) // ret += " ishow "+verb+" - List all players on the " // "intermud channel.\n"; if( flag ) return ret; tell_object( TP, ret ); return 0; } /* channel_syntax */ /** * This method returns the list of users for the specified channel. * @param channel the channel to get the users list for */ string *query_users( string channel ) { string *tmp; if( !sizeof( tmp = channels[channel] ) ) return ({ }); return filter( tmp, (: !$1->query_property( $2+"_off") && reference_allowed( $1, $3 ) :), channel, TP ); } /* query_users() */ /** @ignore yes */ int update_users( string channel ) { if( pointerp( channels[channel] ) ) { channels[channel] -= ({ 0 }); return 1; } return 0; } /* update_users() */ /** @ignore yes */ mixed query_history( string channel ) { int i, cols; mixed hist; if( base_name(PO) != "/cmds/player/hi_story") return 0; hist = HISTORY_H->query_chat_history(channel); if( !pointerp(hist) || !sizeof(hist) ) return notify_fail("Nobody has said anything on the "+ channel+" channel.\n"); write("The "+channel+" channel history is:\n"); cols = TP->query_cols(); for( i = 0; i < sizeof(hist); i++ ) { if( sizeof( hist[i]) > 2 ) tell_object( TP, TP->fix_string( sprintf("*%s* %s%-=*s\n", ctime(hist[i][2])[11..18], hist[i][0], cols - strlen( hist[i][0] ) - 11, hist[i][1] ) ) ); else tell_object( TP, TP->fix_string( sprintf("%s%-=*s\n", hist[i][0], cols - strlen( hist[i][0] ), hist[i][1] ) ) ); } return 1; } /* query_history() */ /** @ignore yes */ int add_user( string *chans ) { if( !pointerp(chans) ) return 0; if( !adminp(TP) ) chans -= ({"admin"}); if( !lordp(TP) ) chans -= ({"lord"}); if( !seniorp(TP) ) chans -= ({"senior"}); foreach( string chan in chans ) { if( pointerp( channels[chan] ) ) { if( member_array( TP, channels[chan] ) == -1 ) channels[chan] += ({ TP }); } else { channels[chan] = ({ TP }); } } return 1; } /* add_user() */ /** @ignore yes */ void remove_user() { object ob; ob = PO; foreach( string key in keys(channels) ) if( !sizeof( channels[key] -= ({ 0, ob }) ) ) map_delete( channels, key ); } /* remove_user() */ private int send_chat( object *obs, string verb, string color, string str, int emote, int force, string who ) { string header; if( !obs && !( obs = channels[verb] ) ) return 0; update_users(verb); header = CAP(who); if( emote ) { str = ( str[0..1] == "$N" ? str[3..] : str ); if( emote == 2 ) who = 0; header += " "; } else { header += ": "; } if( !channel_silenced(TP) ) HISTORY_H->add_chat_history( verb, header, str ); foreach( object ob in obs ) if( objectp(ob) ) ob->event_chat( ob, who, verb, str, emote, force ); } /* send_chat() */ /** @ignore yes */ int do_chat( string verb, string str ) { string s1; int emote, force; if( !TP || member_array( TP, previous_object(-1) ) == -1 ) return 0; if( verb == "channels") return show_channel(""); if( verb == "cwho") { if( !str || str == "") { channel_syntax(verb); return 1; } return show_channel(str); } // if( verb == "ishow") // return show_ichannel(str); if( member_array( verb, ( sizeof( TP->query_channels() ) ? TP->query_channels() : ({ }) ) ) == -1 ) return 0; if( !channels[verb] ) return 0; if( !str || str == "") { channel_syntax(verb); return 1; } if( member_array( TP, channels[verb] ) == -1 ) return 0; if( TP->query_in_jail() ) { tell_object( TP, "You are in jail, channels are out of your reach.\n"); return 1; } switch( str[0] ) { case '@': case ':': emote = 1; str = str[1..]; break; case '!': if( lordp(TP) ) force = 1; str = str[1..]; break; } if( !str || str == "") { channel_syntax(verb); return 1; } if( str == "on") { TP->remove_property( verb+"_off"); tell_object( TP, "You turn on the "+verb+" channel.\n"); return 1; } if( str == "off") { TP->add_property( verb+"_off", 1 ); tell_object( TP, "You turn off the "+verb+" channel.\n"); return 1; } if( TP->check_earmuffs("chat-channels") || TP->query_property("allchat_off") || TP->query_property(verb + "_off") ) { tell_object( TP, "You currently have that channel turned off.\n"); return 1; } if( TP->query_gagged() ) return notify_fail("You have been gagged, channels are out of your " "reach.\n"); if( INTERMUD_H->available_channel( query_channel_name(verb) ) ) { INTERMUD_H->channel( query_channel_name(verb), TP->query_name(), ( emote ? "@" : "") + str ); return 1; } update_users(verb); if( !emote ) { s1 = TP->mangle_speech(str); if( stringp(s1) ) str = s1; } if( channel_silenced(TP) ) send_chat( ({ TP }), verb, TP->query_colour("main"), str, emote, force, TP->query_cap_name() ); else send_chat( channels[verb], verb, TP->query_colour("main"), str, emote, force, TP->query_cap_name() ); return 1; } /* do_chat() */ /** @ignore yes */ int send_intermud_chat( object *obs, string verb, string color, string str, int emote, int force, string who ) { if( file_name(PO) == INTERMUD_H ) send_chat( obs, verb, color, str, emote, force, who ); } /* send_intermud_chat() */ /** @ignore yes */ int show_channel( string str ) { object *online, *offline, *vis; string *ret; if( !str || str == "") { tell_object( TP, create_table( ({"Channels", "channel"}), map( TP->query_channels(), (: $1 + ( TP->query_property( $1+"_off") ? " (off)" : " (on)") :) ), 1 ) ); return 1; } if( member_array( str, TP->query_channels() ) == -1 ) { tell_object( TP, "There is no '"+str+"' channel.\n"); return 1; } channels[str] -= ({ 0 }); vis = filter( channels[str], (: reference_allowed( $1, $(TP) ) :) ); online = filter( vis, (: !$1->query_property( $2+"_off") :), str ); offline = vis - online; ret = ( map( online, (: $1->query_cap_name()+" (on)" :) ) + map( offline, (: $1->query_cap_name()+" (off)" :) ) ); tell_object( TP, create_table( ({ CAP(str), "user" }), ret, 1 ) ); return 1; } /* show_channel() */ /** @ignore yes */ int show_ichannel( string str ) { if( !str || str == "") { tell_object( TP, "Syntax: ishow <channel name>\n"); return 1; } INTERMUD_H->chan_who( query_channel_name(str) ); return 1; } /* show_ichannel() */ /** @ignore yes */ string query_channel_name( string channel ) { switch( channel ) { default: return channel; case "intercre": return "imud_code"; case "intergossip": return "imud_gossip"; case "imud_code": return "intercre"; case "imud_gossip": return "intergossip"; } return 0; } /* query_channel_name() */ /** * This method returns the names of all registered channels. * @return the names of registered channels */ string *query_registered_channels() { return keys(channels); }