// Mud user login/logout Announcer Daemon // Created by Glenn Ferguson (Watcher@TMI) 09/26/92 // Visibility check added by Pallando, 93-08-19 // Autobow/Autowave hack added by Robocoder, 94.08.27 // // Must have connecting hooks within the mudlib system to inform // the daemon when a user has enter/left the mud. // // Type 0 : entered Type 1 : left // Type 2 : re-entered Type 3 : net-dead #include <mudlib.h> #include <uid.h> #include <daemons.h> #undef AUTOACTION inherit DAEMON; void create() { seteuid(ROOT_UID); } int announce_user(object who, int type) { mixed *list, *ann; string name, what, mud; int loop, s, member; object ob; #ifdef AUTOACTION mixed *myann; int autoaction; string lname, lmember; #endif if (!who) return 0; if (name = (string)who->query("name")) name = capitalize(name); else name = "NONAME"; #ifdef AUTOACTION myann = (mixed *)who->query("announce"); if (type == 0) autoaction = (int)who->query_env("autobow"); else if (type == 1) autoaction = (int)who->query_env("autowave"); #endif if (mud_name()) mud = capitalize(mud_name()); else mud = "the game"; list = users(); s = sizeof(list); for (loop=0; loop < s; loop++) { if (((ob = list[loop]) == who) || !environment(ob) || !visible(who, ob)) continue; ann = (mixed *)ob->query("announce"); if (!ann || !pointerp(ann) || !sizeof(ann)) continue; #ifdef AUTOACTION lname = lower_case((string)ob->query("name")); lmember = -1; #endif if (base_name(ob) == "/std/user" && (((member = member_array(lower_case(name), ann)) != -1) || #ifdef AUTOACTION (lname && myann && ((lmember = member_array(lname, myann)) != -1)) || #endif (member_array("ON", ann) != -1))) { switch (type) { case 0: message("announce", "[ " + name + " has entered " + mud + (adminp(geteuid(ob)) ? " from " + query_ip_name(who) : "") + " ]\n", ob); #ifdef AUTOACTION if ((member != -1) && ob->query_env("autobow")) ob->force_me("bow " + name); if ((lmember != -1) && autoaction) who->force_me("bow " + lname); #endif break; case 1: #ifdef AUTOACTION if ((member != -1) && ob->query_env("autowave")) ob->force_me("wave " + name); if ((lmember != -1) && autoaction) who->force_me("wave " + lname); #endif message("announce", "[ " + name + " has left " + mud + (query_ip_name(who) ? ((adminp(geteuid(ob)) ? " from " + query_ip_name(who) : "")) : "") + " ]\n", ob); break; case 2: message("announce", "[ " + name + " has re-entered " + mud + (adminp(geteuid(ob)) ? " from " + query_ip_name(who) : "") + " ]\n", ob); break; case 3: message("announce", "[ " + name + " has gone net-dead ]\n", ob); break; } } } return 1; }