/**
* This method is called when a reply for a remote
* online user list is received.
* It will print the who list to the person originating the request.
*/
private void who_reply( mixed *packet ) {
string info, base, ret, *players, *creators, *cnames, *pnames;
mapping play_idle, cre_idle;
string top, ptop;
int width, bing;
object user;
if( sizeof(packet) != ( S_P + SIZEOF_WHO_REPLY ) ) {
packet_invalid(packet);
return;
}
if( !( user = find_player( packet[P_RECIPIENT] ) ) )
return;
play_idle = ([ ]);
cre_idle = ([ ]);
players = ({ });
creators = ({ });
cnames = ({ });
pnames = ({ });
for( int i = 0; i < sizeof( packet[S_P + WHO_REPLY_DATA] ); i++ ) {
if( !( info = packet[S_P + WHO_REPLY_DATA][i][WHO_DATA_INFO] ) )
continue;
switch( lower_case(info) ) {
default:
switch( lower_case(info) ){
case "admin" :
case "senior creator" :
case "lord" :
case "high lord" :
creators += ({ packet[S_P + WHO_REPLY_DATA][i][WHO_DATA_SHORT]+
"("+lower_case(info)+")"});
cre_idle +=([ ( packet[S_P + WHO_REPLY_DATA][i][WHO_DATA_SHORT] ) :
( packet[S_P + WHO_REPLY_DATA][i][WHO_DATA_IDLE] ) ]);
bing = 1;
break;
}
if( bing == 1 ) {
bing = 0;
break;
}
players += ({ packet[S_P + WHO_REPLY_DATA][i][WHO_DATA_SHORT] });
play_idle += ([ ( packet[S_P + WHO_REPLY_DATA][i][WHO_DATA_SHORT] ) :
( packet[S_P + WHO_REPLY_DATA][i][WHO_DATA_IDLE] ) ]);
break;
case "immortal" :
case "creator" :
case "(lord)" :
creators += ({ packet[S_P + WHO_REPLY_DATA][i][WHO_DATA_SHORT] });
cre_idle +=([( packet[S_P + WHO_REPLY_DATA][i][WHO_DATA_SHORT] ) :
( packet[S_P + WHO_REPLY_DATA][i][WHO_DATA_IDLE] ) ]);
}
}
players = sort_array( map( players, (: CAP($1) :) ), 1 );
creators = sort_array( map( creators, (: CAP($1) :) ), 1 );
top = "";
ptop = "";
for( int z = 0; z < sizeof(creators); z++ ) {
top += creators[z];
if( cre_idle[ lower_case(creators[z]) ] / 60 > 0 )
top += "(idle:"+cre_idle[lower_case(creators[z])]/60+")\n";
else
top+="\n";
}
for( int z = 0; z < sizeof(players); z++ ) {
ptop += players[z];
if( play_idle[lower_case(players[z])] / 60 > 0 )
ptop += "(idle:"+play_idle[lower_case(players[z])]/60+")\n";
else
ptop+="\n";
}
pnames= explode( ptop,"\n");
cnames= explode( top,"\n");
width = user->query_cols();
ret= sprintf("\n%|*'-'s\n%|*s\n%*'-'|s\n%s%*'-'|s\n%s", width,
sprintf("=======[ %s ]=======", CAP(packet[P_SOURCE])),
width, ctime(time()), width, "=====[ creators ]====",
sprintf("%#-*s\n", width, implode( cnames, " \n") ),
width, "=====[ players ]=====", sprintf("%#-*s", width,
implode( pnames, " \n") ) );
if( sizeof(packet[S_P + WHO_REPLY_DATA]) > 1 )
base = "[ There are "+
query_num( sizeof(packet[S_P+WHO_REPLY_DATA]) )+" people on ]";
else if( sizeof(packet[S_P + WHO_REPLY_DATA]) == 1 )
base = "[ There is one person on ]";
else
base = "[ There is no-one on ]";
ret += sprintf("\n%*'-'|s\n", width, base );
tell_object( user, ret );
} /* who_reply() */
/**
* This method returns a list of online players to the mud
* originating the who request.
*/
private void who_request( mixed *packet ) {
string *creators, *players;
mixed *reply, *users;
if( sizeof(packet) != ( S_P + SIZEOF_WHO_REQ ) ) {
packet_invalid(packet);
return;
}
users = ({ });
creators = ({ });
players = ({ });
foreach( object ob in users() ) {
if( creatorp(ob) ) {
if( !ob->query_invis() )
creators += ({ ob->query_name() });
} else {
players += ({ ob->query_name() });
}
}
users += map( creators, (: ({ $1, ( interactive(find_player($1)) ?
query_idle( find_player($1) ) : 0 ), "creator"}) :) );
users += map( players, (: ({ $1, ( interactive(find_player($1)) ?
query_idle( find_player($1) ) : 0 ), "player"}) :) );
reply = packet_allocate(WHO_REPLY_PACKET);
reply[P_DESTINATION] = packet[P_SOURCE];
reply[P_RECIPIENT] = packet[P_SENDER];
reply[S_P + WHO_REPLY_DATA] = users;
event( users(),"inform", sprintf("IMUD who from %s at %s",
packet[P_SENDER], packet[P_SOURCE]), "admin");
if( lower_case(packet[P_SOURCE]) == "aoc")
return 0;
add_buffer( 0, reply );
send_buffer( 0 );
} /* who_request() */
int who( string mud ) {
mixed *packet;
packet = packet_allocate(WHO_REQ_PACKET);
if( shutdown || !( mud = mud_exists(mud) ) )
return 0;
packet[P_SENDER] = TP -> query_name();
packet[P_DESTINATION] = mud;
add_buffer( 0, packet );
send_buffer( 0 );
return 1;
} /* who() */