pgplus/bin/
pgplus/help_files/
pgplus/port_redirector/
pgplus/src/configure/makefiles/
/*
 * Playground+ - dsc.c
 * Simple little version file so we have with compile time         ~ phypor
 * ---------------------------------------------------------------------------
 */

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>

#include "include/config.h"
#include "include/player.h"
#include "include/proto.h"
#include "include/version.h"

struct hardware_info
{
  int allgood;
  int processors;
  int ram;
  float bogomips;
  char cpu[40];
  char model[40];
  char vendor[40];
}
CPU;

/* --------------------------------------------------------------------------

   This is the Playground+ version command which may only be modified
   to list additional modules installed by yourself. The credits must
   be kept the same!

   This pg_version has been modified with permission.

   -------------------------------------------------------------------------- */

void pg_version(player * p, char *str)
{
  char *oldstack = stack;
  int ot = 0;

  if (!strcmp(str, "-"))
  {
    TELLPLAYER(p, "\n %s is running Playground Plus v%s\n"
	       " (compilation date: %s)\n", get_config_msg("talker_name"), PG_VERSION, COMPILE_TIME);
    return;
  }

  pstack_mid("Playground+ Version Information");

  sprintf(stack, "\nThis talker is based on Playground Plus by Silver (Richard Lawrence),\nblimey (Geoffrey Swift) and phypor (J. Bradley Christian), a stable\nbug"
	  "fixed and improved version of Playground 96 by traP (Mike Bourdaa),\nastyanax (Chris Allegretta), Nogard (Hans Peterson) and "
	  "vallie (Valerie Kelly)\nwhich is itself based on Summink by Athanasius (Neil Peter Charley)\nwhich itself was"
	  " based on EW-Too by Burble (Simon Marsh).\n\n");
  stack = strchr(stack, 0);

  sprintf(stack, " -=*> Using Playground+ v%s base code.\n", PG_VERSION);
  stack = strchr(stack, 0);

#ifdef LINUX
  sprintf(stack, " -=*> Playground+ running on Linux.\n");
#elif SOLARIS
  sprintf(stack, " -=*> Playground+ running on Solaris.\n");
#elif SUNOS
  sprintf(stack, " -=*> Playground+ running on SunOS.\n");
#elif HPUX
  sprintf(stack, " -=*> Playground+ running on HP-UX.\n");
#elif ULTRIX
  sprintf(stack, " -=*> Playground+ running on Ultrix.\n");
#elif BSD3
  sprintf(stack, " -=*> Playground+ running on BSDI.\n");
#elif BSDISH
  sprintf(stack, " -=*> Playground+ running on *BSD.\n");
#else
  sprintf(stack, " -=*> Playground+ running on Unknown O/S.\n");
#endif
  stack = strchr(stack, 0);

  sprintf(stack, " -=*> Executable compiled %s\n", COMPILE_TIME);
  stack = strchr(stack, 0);

  ot = atoi(get_config_msg("player_timeout"));
  if (!ot)
    stack += sprintf(stack, " -=*> Player timeouts disabled.\n");
  else
    stack += sprintf(stack, " -=*> Player timeouts enabled (%d weeks).\n", ot);


#ifdef INTERCOM
  pg_intercom_version();
#endif

  dynatext_version();

  nunews_version();

#ifdef ROBOTS
  robot_version();
#endif

  sprintf(stack, " -=*> Auto reloading v1.0 (by phypor) installed.\n");
  stack = strchr(stack, 0);


#ifdef ANTICRASH
  crashrec_version();
#endif

  if (config_flags & cfNOSPAM)
  {
    sprintf(stack, " -=*> Anti-spam code v3.0 (by Silver) enabled.\n");
    stack = strchr(stack, 0);
  }

  channel_version();

#ifdef COMMAND_STATS
  command_stats_version();
#endif

  slots_version();

#ifdef AUTOSHUTDOWN
  sprintf(stack, " -=*> Auto-shutdown code v1.0 (by Silver) enabled.\n");
  stack = strchr(stack, 0);
#endif

#ifdef LAST
  last_version();
#endif

#ifdef NEWPAGER
  sprintf(stack, " -=*> New pager code v1.1 (by Nightwolf) enabled.\n");
  stack = strchr(stack, 0);
#endif

  spodlist_version();

#ifdef SEAMLESS_REBOOT
  reboot_version();
#endif

  socials_version();

#ifdef IDENT
  ident_version();
#endif

  if (config_flags & cfNOSWEAR)
    swear_version();

  stack += sprintf(stack, " -=*> ESE, expandable search engine v1.3 (by phypor) installed.\n");

#ifdef ALLOW_MULTIS
  multis_version();
#endif

  softmsg_version();
 
#ifdef INTERCOM
  ichan_version();
#endif

/* EWE */
  ewe_version();

/* A warning that people are using debugging mode. This means sysops can
   slap silly people who use this mode in live usage -- Silver */

#ifdef DEBUGGING
#ifdef DEBUG_VERBOSE
  stack += sprintf(stack, "\n    -=*> WARNING! Talk server running in verbose ");
#else
  stack += sprintf(stack, "\n        -=*> WARNING! Talk server running in ");
#endif
  stack += sprintf(stack, "debugging mode! <*=-\n\n");
#endif

  stack = strchr(stack, 0);
  pstack_mid("Playground+ Homepage: http://pgplus.ewtoo.org");
  *stack++ = 0;

  if (p->location)
    pager(p, oldstack);
  else
    tell_player(p, oldstack);

  stack = oldstack;
}

/* net stats */

void netstat(player * p, char *str)
{
  char *oldstack = stack;
  FILE *fp;
  int pid1 = -1, pid2 = -1;

  pstack_mid("Network and server statistics");

  stack += sprintf(stack, "                           In       Out\n");

  stack += sprintf(stack, "Total bytes        : %8d  %8d\n"
		   "Average bytes      : %8d  %8d\n"
		   "Bytes per second   : %8d  %8d\n"
		   "Total packets      : %8d  %8d\n"
		   "Average packets    : %8d  %8d\n"
		   "Packets per second : %8d  %8d\n\n",
	      in_total, out_total, in_average, out_average, in_bps, out_bps,
		   in_pack_total, out_pack_total, in_pack_average,
		   out_pack_average, in_pps, out_pps);

  stack += sprintf(stack, "Talker name        : %s\n", get_config_msg("talker_name"));
  stack += sprintf(stack, "Site address       : %s (%s)\n", talker_alpha, talker_ip);
#ifdef INTERCOM
  stack += sprintf(stack, "Port number        : %d (talk server), %d (intercom server)\n", active_port, active_port - 1);
#else
  stack += sprintf(stack, "Port number        : %d\n", active_port);
#endif
  stack += sprintf(stack, "Base code revision : v%s\n", PG_VERSION);
  stack += sprintf(stack, "Talker root dir    : %s\n", ROOT);
  stack += sprintf(stack, "Compilation date   : %s\n", COMPILE_TIME);
  stack += sprintf(stack, "Process ID's       : ");

  /* Now we need to get the PIDS */

  fp = fopen("junk/PID", "r");
  if (fp)
  {
    fscanf(fp, "%d", &pid1);
    fclose(fp);
    stack += sprintf(stack, "%d (talk server)", pid1);
  }
  else
    stack += sprintf(stack, "unknown talk server PID");


  fp = fopen("junk/ANGEL_PID", "r");
  if (fp)
  {
    fscanf(fp, "%d", &pid2);
    fclose(fp);
    if (pid1 != -1)
      stack += sprintf(stack, ", ");
    stack += sprintf(stack, "%d (guardian angel)", pid2);
  }
  else
  {
    if (pid1 != -1)
      stack += sprintf(stack, ", ");
    stack += sprintf(stack, "unknown guardian angel PID");
  }
  stack += sprintf(stack, "\n");
  stack += sprintf(stack, "Machine `uname`    : %s\n", UNAME);

  if (CPU.allgood)
    stack += sprintf(stack, "CPU Stats          : %s %s %s %s Processor%s %dM RAM\n"
		     "Bogomips           : %.2f\n" LINE,
	      number2string(CPU.processors), CPU.vendor, CPU.cpu, CPU.model,
		     (CPU.processors > 1) ? "s" : "", CPU.ram, CPU.bogomips);
  else
    stack += sprintf(stack, "CPU Stats          : Unavailable\n" LINE);

  stack = end_string(stack);
  tell_player(p, oldstack);
  stack = oldstack;
}

/* 
   the idea for this was taken from linux_logo, 
   however the codes been totally rewritten
   ~phy

   (only claimed to work on linux boxen)
 */

void get_hardware_info(void)
{
  FILE *f;
  char red[40], dummy[40];
  float bmc;
  struct stat sbuf;

  if (!(f = fopen("/proc/cpuinfo", "r")))
  {
    CPU.allgood = 0;
    return;
  }
  while (fgets(red, 39, f))
  {
    if (!(strncasecmp(red, "bogomips", 8)))
    {
      CPU.processors++;
      sscanf(red, "%s : %f", dummy, &bmc);
      CPU.bogomips += bmc;
      continue;
    }
    if (CPU.processors)
      continue;

    if (!(strncasecmp(red, "cpu", 3)) && !strstr(red, "cpuid"))
    {
      sscanf(red, "%s : %s", dummy, CPU.cpu);
      continue;
    }
    if (!(strncasecmp(red, "model", 5)))
    {
      sscanf(red, "%s : %s", dummy, CPU.model);
      continue;
    }
    if (!(strncasecmp(red, "vendor_id", 9)))
    {
      sscanf(red, "%s : %s", dummy, CPU.vendor);
      if (!strcasecmp(CPU.vendor, "AuthenticAMD"))
	strcpy(CPU.vendor, "AMD");
      else if (!strcasecmp(CPU.vendor, "GenuineIntel"))
	strcpy(CPU.vendor, "Intel");
      else if (!strcasecmp(CPU.vendor, "CyrixInstead"))
	strcpy(CPU.vendor, "Cyrix");
      continue;
    }
  }
  fclose(f);

  stat("/proc/kcore", &sbuf);
  CPU.ram = sbuf.st_size / 1024;
  CPU.ram /= 1024;

  CPU.allgood++;
}

void show_stats_info(player * p)
{
  char *oldstack = stack;
  char dummy[30];

  if (max_ppl_on_so_far_time == 0)
    max_ppl_on_so_far_time = (int)time(NULL);
  if (max_ppl_ever_so_far_time == 0)
    max_ppl_ever_so_far_time = (int)time(NULL);

  ADDSTACK("\n");

  /* You'll definately want to change this */  
  ADDSTACK("url: (none)\n");

  ADDSTACK("contact: %s\n", talker_email);
  ADDSTACK("connect: telnet://%s:%d\n", talker_alpha, active_port);
  ADDSTACK("altconnect: (none)\n");
  ADDSTACK("uptime: %d\n", (int) (time(0) - up_date));
  strftime(dummy, 16, "%Y%m%d %H%M%S", localtime((time_t *) &up_date));
  ADDSTACK("bootdate: %s\n", dummy);
  ADDSTACK("totalnewbielogins: %d\n", newbie_count);
  ADDSTACK("totallogins: %d\n", logins);
  if ((sys_flags & CLOSED_TO_NEWBIES) ||
      ((sys_flags & SCREENING_NEWBIES) && (count_su() < 1)))
    ADDSTACK("newbies: no\n");
  else
    ADDSTACK("newbies: yes\n");
  if (sys_flags & CLOSED_TO_RESSIES)
    ADDSTACK("residents: no\n");
  else
    ADDSTACK("residents: yes\n");
  ADDSTACK("users: %d\n", current_players);
  ADDSTACK("maxusers: 100\n");
  ADDSTACK("staff: %d\n", count_su());
  ADDSTACK("maximumusers: %d\n", max_ppl_on_so_far);
  strftime(dummy, 16, "%Y%m%d %H%M%S", localtime((time_t *) &max_ppl_on_so_far_time));
  ADDSTACK("maximumusers_date: %s\n", dummy);
  ADDSTACK("maximumeverusers: %d\n", max_ppl_ever_so_far);
  strftime(dummy, 16, "%Y%m%d %H%M%S", localtime((time_t *) &max_ppl_ever_so_far_time));
  ADDSTACK("maximumeverusers_date: %s\n", dummy);

  /* You'll definately want to change this */
  ADDSTACK("description: Its probably a bog-standard PG+ talker. To be changed when the coder works out how :)\n");

  ENDSTACK("\n");
  tell_player(p, oldstack);
  stack = oldstack;
}