mud/lib/daemon/services/locate.c
2020-09-06 05:43:07 -07:00

96 lines
3.1 KiB
C

/* /daemon/services/locate.c
* From the Dead Souls Mud Library
* performs player lookups
* Created by Descartes of Borg 950624
* Version: @(#) locate.c 1.2@(#)
* Last modified: 96/12/09
*/
#define SERVICE_LOCATE
#include <daemons.h>
#include ROOMS_H
#include <message_class.h>
static mapping locate_user_table = ([]);
static string eventLookupLocateUser(string str){
if(!locate_user_table) locate_user_table = ([]);
if(!locate_user_table[str]) return str;
else {
string ret = locate_user_table[str];
//map_delete(locate_user_table, str);
return ret;
}
}
void eventReceiveLocateRequest(mixed array packet) {
string status;
int idl = 0;
object ob;
PING_D->SetOK();
if( file_name(previous_object()) != INTERMUD_D ) return;
//tell_room(ROOM_ARCH,"The Arch Room loudspeaker announces: \"%^BOLD%^CYAN%^"+capitalize(packet[3])+" at "+packet[2]+" has issued a locate request for %^BOLD%^YELLOW%^"+capitalize(packet[6])+".%^RESET%^\"");
tn("Locate request received: "+identify(packet),"white");
CHAT_D->eventSendChannel("SYSTEM","intermud","[" + capitalize(packet[3])+"@"+packet[2]+
" seeks "+packet[6]+ "]",0);
if( !(ob = find_player(packet[6])) || ob->GetInvis()) return;
if( interactive(ob) ) {
string array tmp = ({ });
if( in_edit(ob) || ob->GetCedmode() )
tmp += ({ "editing" });
if( (idl = query_idle(ob)) > 60 )
tmp += ({ "inactive" });
if( sizeof(tmp) ) status = implode(tmp, ", ");
else status = 0;
}
else status = "link-dead";
INTERMUD_D->eventWrite( ({ "locate-reply", 5, mud_name(), 0, packet[2],
packet[3], mud_name(),
ob->GetName(), idl, status }) );
}
void eventReceiveLocateReply(mixed array packet) {
object ob;
string m;
int idl;
PING_D->SetOK();
if( file_name(previous_object()) != INTERMUD_D ) return;
if( !packet[5] || !(ob = find_player(convert_name(eventLookupLocateUser(packet[5])))) ){
return;
}
tn("Locate reply received: "+identify(packet),"white");
m = packet[7] + " was just located on " + packet[6] + ".";
if( (idl = packet[8]) > 60 )
m += sprintf(" (idle %02d:%02d:%02d)", idl/3600, (idl/60)%60, idl%60);
if( stringp(packet[9]) )
m += " [status: " + packet[9] + "]";
ob->eventPrint(m, MSG_SYSTEM);
}
void eventSendLocateRequest(string target) {
string who, crypt_who;
mixed *locate_request;
who = this_player(1)->GetKeyName();
if(this_player(1)->GetInvis()){
foreach(string key, string val in locate_user_table){
if(!key || ! val) continue;
if(val == who){
crypt_who = key;
}
}
if(!crypt_who){
crypt_who = alpha_crypt(10);
locate_user_table[crypt_who] = who;
}
}
else crypt_who = who;
locate_request = ({ "locate-req", 5, mud_name(), crypt_who, 0, 0, target });
INTERMUD_D->eventWrite( locate_request );
tn("Locate request being sent: "+identify(locate_request),"white");
}