/* This sefun is to provide a replacement for the efuns query_ip_name() and
 * query_ip_number().
 * Feel free to add it to your mudlibs, if you have much code relying on that.
 */

#if ! __EFUN_DEFINED__(query_ip_name)

#include <interactive_info.h>

private varargs string _query_ip_name(object player)
{
    object ob = player;
    ob ||= efun::this_player();

    player = efun::interactive_info(ob, II_IP_ADDRESS);
    return efun::interactive_info(ob, II_IP_NAME);
}

private varargs string _query_ip_number(object player)
{
    object ob = player;
    ob ||= efun::this_player();

    player = efun::interactive_info(ob, II_IP_ADDRESS);
    return efun::interactive_info(ob, II_IP_NUMBER);
}

// * Herkunfts-Ermittlung
string query_ip_number(object ob)
{
  ob= ob || this_player();
  if (!objectp(ob) || !interactive(ob)) return 0;
  if(ob->query_realip() && (string)ob->query_realip()!="")
  {
    return (string)ob->query_realip();
  }
  return _query_ip_number(ob);
}

string query_ip_name(mixed ob)
{
  if ( !ob || objectp(ob) )
      ob=query_ip_number(ob);
  return (string)"/p/daemon/iplookup"->host(ob);
}

#endif

