MySQLMud/data/
MySQLMud/doc/
MySQLMud/log/
MySQLMud/players/
MySQLMud/www/images/
socketmud/data/
socketmud/doc/
socketmud/log/
socketmud/players/
/*
 * This file handles non-fighting player actions.
 */
#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

/* include main header file */
#include "mud.h"

void cmd_say(D_MOBILE *dMob, char *arg)
{
    if (arg[0] == '\0')
    {
        text_to_mobile(dMob, "Say what?\n\r");
        return;
    }
    communicate(dMob, arg, COMM_LOCAL);
}

void cmd_ooc(D_MOBILE *dMob, char *arg)
{
    if (arg[0] == '\0')
    {
        text_to_mobile(dMob, "OOC what?\n\r");
        return;
    }
    communicate(dMob, arg, COMM_OOC);
}

void cmd_quit(D_MOBILE *dMob, char *arg)
{
    char buf[MAX_BUFFER];

    /* log the attempt */
    sprintf(buf, "%s has left the game.", dMob->name);
    log_string(buf);
    MySQL_log_logins("%s has left the game.", dMob->name);

    save_player(dMob);

    dMob->socket->player = NULL;
    free_mobile(dMob);
    close_socket(dMob->socket, FALSE);
}

void cmd_shutdown(D_MOBILE *dMob, char *arg)
{
  shut_down = TRUE;
}

void cmd_commands(D_MOBILE *dMob, char *arg)
{
  BUFFER *buf = buffer_new(MAX_BUFFER);
  int i, col = 0;

  bprintf(buf, "    - - - - ----==== The full command list ====---- - - - -\n\n\r");
  for (i = 0; tabCmd[i].cmd_name[0] != '\0'; i++)
  {
    if (dMob->admin_level < tabCmd[i].level) continue;

    bprintf(buf, " %-16.16s", tabCmd[i].cmd_name);
    if (!(++col % 4)) bprintf(buf, "\n\r");
  }
  if (col % 4) bprintf(buf, "\n\r");
  text_to_mobile(dMob, buf->data);
  buffer_free(buf);
}

void cmd_who(D_MOBILE *dMob, char *arg)
{
  D_MOBILE *xMob;
  D_SOCKET *dsock;
  ITERATOR *pIter;
  BUFFER *buf = buffer_new(MAX_BUFFER);

  bprintf(buf, " - - - - ----==== Who's Online ====---- - - - -\n\r");

  pIter = AllocIterator(dsock_list);
  while ((dsock = (D_SOCKET *) NextInList(pIter)) != NULL)
  {
    if (dsock->state != STATE_PLAYING) continue;
    if ((xMob = dsock->player) == NULL) continue;

    bprintf(buf, " %-12s   %s\n\r", xMob->name, dsock->hostname);
  }
  FreeIterator(pIter);

  bprintf(buf, " - - - - ----======================---- - - - -\n\r");
  text_to_mobile(dMob, buf->data);

  buffer_free(buf);
}

void cmd_compress(D_MOBILE *dMob, char *arg)
{
  /* no socket, no compression */
  if (!dMob->socket)
    return;

  /* enable compression */
  if (!dMob->socket->out_compress)
  {
    text_to_mobile(dMob, "Trying compression.\n\r");
    text_to_buffer(dMob->socket, (char *) compress_will2);
    text_to_buffer(dMob->socket, (char *) compress_will);
  }
  else /* disable compression */
  {
    if (!compressEnd(dMob->socket, dMob->socket->compressing, FALSE))
    {
      text_to_mobile(dMob, "Failed.\n\r");
      return;
    }
    text_to_mobile(dMob, "Compression disabled.\n\r");
  }
}

void cmd_save(D_MOBILE *dMob, char *arg)
{
  save_player(dMob);
  text_to_mobile(dMob, "Saved.\n\r");
}

void cmd_copyover(D_MOBILE *dMob, char *arg)
{ 
  FILE *fp;
  ITERATOR *pIter;
  D_SOCKET *dsock;
  char buf[100];
  
  if ((fp = fopen(COPYOVER_FILE, "w")) == NULL)
  {
    text_to_mobile(dMob, "Copyover file not writeable, aborted.\n\r");
    return;
  }

  sprintf(buf, "\n\r <*>            The world starts spinning             <*>\n\r");

  /* For each playing descriptor, save its state */
  pIter = AllocIterator(dsock_list);
  while ((dsock = (D_SOCKET *) NextInList(pIter)) != NULL)
  {
    compressEnd(dsock, dsock->compressing, FALSE);

    if (dsock->state != STATE_PLAYING)
    {
      text_to_socket(dsock, "\n\rSorry, we are rebooting. Come back in a few minutes.\n\r");
      close_socket(dsock, FALSE);
    }
    else
    {
      fprintf(fp, "%d %s %s\n",
        dsock->control, dsock->player->name, dsock->hostname);

      /* save the player */
      save_player(dsock->player);

      text_to_socket(dsock, buf);
    }
  }
  FreeIterator(pIter);

  fprintf (fp, "-1\n");
  fclose (fp);

  /* close any pending sockets */
  recycle_sockets();
  
  /* exec - descriptors are inherited */
  sprintf(buf, "%d", control);
  execl(EXE_FILE, "SocketMud", "copyover", buf, (char *) NULL, (char *) NULL);

  /* Failed - sucessful exec will not return */
  text_to_mobile(dMob, "Copyover FAILED!\n\r");
}

void cmd_linkdead(D_MOBILE *dMob, char *arg)
{
  D_MOBILE *xMob;
  ITERATOR *pIter;
  char buf[MAX_BUFFER];
  bool found = FALSE;

  pIter = AllocIterator(dmobile_list);
  while ((xMob = (D_MOBILE *) NextInList(pIter)) != NULL)
  {
    if (!xMob->socket)
    {
      sprintf(buf, "%s is linkdead.\n\r", xMob->name);
      text_to_mobile(dMob, buf);
      found = TRUE;
    }
  }
  FreeIterator(pIter);

  if (!found)
    text_to_mobile(dMob, "Noone is currently linkdead.\n\r");
}

/*
 * cmd_admin()
 *
 * Various Admin utilities in one location.
 */
void cmd_admin(D_MOBILE * ch, char * argument)
{
    char arg1[MAX_BUFFER];

    argument = one_arg(argument, arg1);

    if (arg1[0] == '\0')
    {
        ptc(ch, "Syntax: admin <command>\n");
        ptc(ch, "Valid commands are:\n");
        ptc(ch, "  clearlogins      - Clears login data from MySQL database.\n");
        ptc(ch, "  clearchat        - Clears chat log from MySQL Database.\n");
        ptc(ch, "  optimize         - Optimizes all tables in MySQL Database.\n");
        ptc(ch, "  fix_helps        - Runs through vand_helps and prepares field webtxt\n");
        return;
    }

    if (compares(arg1, "clearlogins"))
    {
        MySQL_clear_logins();
        ptc(ch, "Login logs turnacated.\n");
        return;
    }

    if (compares(arg1, "clearchat"))
    {
        MySQL_clear_chatlog();
        MySQL_log_chat(ch->name, "utility", "Chat log cleared");
        ptc(ch, "Chat log turnacated.\n");
        return;
    }

    if (compares(arg1, "optimize"))
    {
        MySQL_optimize();
        ptc(ch, "All tables have been optimized.\n");
        return;
    }

    if (compares(arg1, "fix_helps"))
    {
        cmd_fix_online_helps(ch, "");
        return;
    }

    else
    {
        cmd_admin(ch, "");
        return;
    }
    return;
}