rm6/
rm6/clans/
rm6/councils/
rm6/deity/
rm6/doc/mudprogs/
rm6/exchange/
rm6/gods/
rm6/homes/
rm6/nations/
rm6/player/
rm6/player/a/
rm6/src/RCS/
rm6/src/dmalloc/
rm6/src/dmalloc/bin/
rm6/src/dmalloc/include/
rm6/src/dmalloc/lib/
rm6/src/scripts/
rm6/src/utils/
/****************************************************************************
 * ResortMUD Version 5.0 was mainly programmed by Ntanel, Garinan, Josh,    *
 * Badastaz, Digifuzz, Senir, Kratas, Scion, Shogar and Tagith.             *
 * ------------------------------------------------------------------------ *
 * Copyright (C) 1996 - 2001 Haslage Net Electronics: MudWorld of Lorain,   *
 * Ohio.    ALL RIGHTS RESERVED    See /doc/RMLicense.txt for more details. *
 ****************************************************************************/

/*
 * Disable Module
 *
 * Disables commands.
 *
 * Syntax: disable cmd name
 * Kratas
 */
#include <string.h>
#include "mud.h"

#define DISABLE_FILE SYSTEM_DIR "disable.dat"

void save_disabled(  );

typedef struct disabled_data DISABLED_DATA;
struct disabled_data
{
   DISABLED_DATA *next;
   CMDTYPE *command;
   char *who;
   int level;
};

DISABLED_DATA *first_disabled;

void do_disable( CHAR_DATA * ch, char *argument )
{
   DISABLED_DATA *disabled;
   CMDTYPE *cmd;

   if( IS_NPC( ch ) )
   {
      send_to_char( "Hi, I'm sorry but npcs can't use this command!\r\n", ch );
      return;
   }

   if( argument == NULL || argument[0] == '\0' )
   {
      char buf[MIL];

      if( !first_disabled )
      {
         send_to_char( "No commands are disabled.\r\n", ch );
         return;
      }
      sprintf( buf, "Disabled commands:\r\n%-10s %5s     %-15s\r\n", "Command", "Level", "Who Disabled" );

      for( disabled = first_disabled; disabled; disabled = disabled->next )
      {
         sprintf( buf + strlen( buf ), "%-10s %5d     %-15s\r\n", disabled->command->name, disabled->level, disabled->who );
      }
      send_to_pager( buf, ch );
      return;
   }

   cmd = find_command( argument );

   for( disabled = first_disabled; disabled; disabled = disabled->next )
      if( disabled->command == cmd )
         break;

   if( disabled )
   {
      /*
       * Do they have access? 
       */
      if( disabled->level > get_trust( ch ) )
      {
         send_to_char( "You don't have the access to un-disable this command.\r\n", ch );
         return;
      }

      /*
       * They do, remove it 
       */
      if( first_disabled == disabled )
         first_disabled = disabled->next;
      else
      {
         DISABLED_DATA *tmp;

         for( tmp = first_disabled; tmp->next != disabled; tmp = tmp->next )
            ;
         tmp->next = disabled->next;
      }

      STRFREE( disabled->who );
      DISPOSE( disabled );
      save_disabled(  );
      send_to_char( "Command is now enabled.\r\n", ch );
   }
   else
   {
      /*
       * DOn't let them disable this command. 
       */
      if( !str_cmp( argument, "disable" ) )
      {
         send_to_char( "You cannot disable this command.\r\n", ch );
         return;
      }

      cmd = find_command( argument );

      if( !cmd )
      {
         send_to_char( "No such command", ch );
         return;
      }

      if( cmd->level > get_trust( ch ) )
      {
         send_to_char( "You don't have access to this command.\r\n", ch );
         return;
      }

      CREATE( disabled, DISABLED_DATA, 1 );
      disabled->command = cmd;
      disabled->who = STRALLOC( ch->name );
      disabled->level = get_trust( ch );
      disabled->next = first_disabled;
      first_disabled = disabled;

      ch_printf( ch, "%s is now disabled.\r\n", cmd->name );
      save_disabled(  );
      return;
   }
}

void load_disabled(  )
{
   FILE *fp;
   DISABLED_DATA *disabled;
   CMDTYPE *cmd;
   char *word;

   fp = fopen( DISABLE_FILE, "r" );

   if( !fp )
   {
      bug( "Unable to open disabled commands list." );
      return;
   }

   for( ;; )
   {
      word = fread_word( fp );

      if( !str_cmp( word, "End" ) )
         break;

      cmd = find_command( word );
      if( !cmd )
      {
         bug( "Unknown command in disabled list." );
         fread_number( fp );
         fread_word( fp );
         continue;
      }

      CREATE( disabled, DISABLED_DATA, 1 );
      disabled->command = cmd;
      disabled->level = fread_number( fp );
      disabled->who = STRALLOC( fread_word( fp ) );
      disabled->next = first_disabled;
      first_disabled = disabled;
   }

   fclose( fp );
}

void save_disabled(  )
{
   DISABLED_DATA *disabled;
   FILE *fp;

   fp = fopen( DISABLE_FILE, "w" );

   if( !fp )
   {
      bug( "Unable to open disabled commands list." );
      return;
   }

   for( disabled = first_disabled; disabled; disabled = disabled->next )
      fprintf( fp, "%s %d %s\n", disabled->command->name, disabled->level, disabled->who );

   fprintf( fp, "End\n" );

   fclose( fp );
}

bool check_disabled( CMDTYPE * cmd )
{
   DISABLED_DATA *disabled;

   if( !cmd )
      return FALSE;

   for( disabled = first_disabled; disabled; disabled = disabled->next )
      if( disabled->command->do_fun == cmd->do_fun )
         return TRUE;

   return FALSE;
}