/*  -*- LPC -*-  */
/*
 * $Locker:  $
 * $Id: suspend.c,v 1.10 2002/03/11 01:45:26 pinkfish Exp $
 * 
 */
#include <parser.h>
#include <access.h>
inherit "/cmds/base";
// #define SUSPEND_MULTI 1
#define MULTI_SUSPEND 28*24 // Two weeks.
#define LIAISON "/d/liaison/master"
private int do_suspend(string, int, string);
// The lord version of suspend.
private int cmd(string name, int tim, string type, string reason) {
  if (this_player() != this_player(1)) {
    return 0;
  }
  if (!master()->query_lord(geteuid(previous_object())) &&
      !LIAISON->query_deputy(geteuid(previous_object()))) {
    return notify_fail("You must be a lord or liaison deputy to suspend "
                       "someone.");
  }
  if ( type[<1] != 's' ) { 
      type += "s";
  }
  switch (type) {
    case "days":
        tim *= 24;
    break;
    case "weeks":
        tim *= 24 * 7;
    break;
    case "months":
        tim  *= 24 * 7 * 4;
    break;
    case "years":
        tim *= 24 * 365; 
    break; 
    
    case "hours":
        // Do nothing.
    break; 
    default:
//         add_failed_mess( "You must give a reason.\n" ); 
//        return -1; 
  }
  
  if (!master()->query_lord (geteuid(previous_object())) 
      && LIAISON->query_deputy(geteuid(previous_object()))
      && tim > MULTI_SUSPEND) {
    return notify_fail ("You can only suspend for a maximum of " +
      query_num (MULTI_SUSPEND) + " hours.");
  }
  return do_suspend(name, tim, reason);
}
// The normal creator suspend
private int suspend(string who, string reason) {
  if(this_player() != this_player(1))
    return 0;
  if (!master()->query_lord(geteuid(previous_object())) &&
      !master()->query_senior(geteuid(previous_object())) &&
      !LIAISON->query_member(geteuid(previous_object()))) {
    return notify_fail("Only liaisons or seniors can do that.\n");
  }
  return do_suspend(who, 2, reason);
}
#ifdef SUSPEND_MULTI
// The liaison multiplayer suspend
private int suspend_multi(string who) {
  if(this_player() != this_player(1))
    return 0;
  if (!"/secure/master"->query_lord(geteuid(previous_object())) &&
      !LIAISON->query_deputy(geteuid(previous_object()))) {
    return notify_fail("You must be a lord or liaison deputy to suspend "
                       "someone for multiplaying.");
  }
  return do_suspend(who, MULTI_SUSPEND, "Multiplaying");
}
#endif
private int do_suspend(string name, int tim, string reason) {
  notify_fail("We failed!\n");
  if (!"/secure/bastards"->suspend_person(name, tim*60*60, reason)) {
    return 0;
  }
  write(name+" suspended until "+ctime(time()+tim*60*60)+"\n");
  return 1;
}
int help() {
  if(!"/secure/master"->query_lord(geteuid(previous_object())) &&
     !LIAISON->query_member(this_player()->query_name()))
    return notify_fail("You cannot use suspend.\n");
  
  if(this_player()->query_lord() ||
     master()->query_senior(geteuid(previous_object())) ||
     LIAISON->query_member(geteuid(previous_object())))
    write("suspend <name> <reason> -- will suspend a player for 2 hours.\n");
#ifdef SUSPEND_MULTI
  if(this_player()->query_lord() ||
     LIAISON->query_deputy(geteuid(this_player())))
    write("suspend <name> multiplaying -- will suspend a multiplayer for "
          "2 weeks.\n");
#endif
  if (LIAISON->query_deputy(geteuid(this_player()))) {
    write("suspend <name> <time> <reason> where time is in hours.\n");
    write ("You may suspend people for a maximum of " 
      + query_num (MULTI_SUSPEND) + " hours as a liaison deputy.\n");
  }
  if ("/secure/master"->query_lord(geteuid(this_player()))) {
    write("suspend <name> <time> <reason> where time is in hours.\n");
    write("suspend <name> <time> <hours|days|weeks|months|years> <reason> "
        "where time is in the units specified in the command.\n");
  }
  return 1;
}
public mixed *query_patterns() {
  mixed retval;
  
  retval = ({ "help", (: help() :) });
  if( master()->query_lord(geteuid(this_player())) ||
     master()->query_senior(geteuid(previous_object())) ||     
     LIAISON->query_member(geteuid(previous_object())))
    retval += ({ "<word'player'> <string'reason'>",
                   (: suspend($4[0], implode($4[1..], " ")) :) });
  
#ifdef SUSPEND_MULTI
  if(this_player()->query_lord() ||
     LIAISON->query_deputy(geteuid(this_player())))
    retval += ({ "<word'player'> multiplaying",
                   (: suspend_multi($4[0]) :) });
#endif
  
  if( master()->query_lord(geteuid(this_player())) ||
        LIAISON->query_deputy(geteuid(this_player()))) { 
        retval += ({ "<word'player'> <number'time'> <string'reason'>",
                   (: cmd($4[0], $4[1], "hours", implode($4[2..], " ") ) :) });
        retval += ({ "<word'player'> <number'time'> "
            "<word'hours|days|weeks|months|years'> <string'reason'>",
                   (: cmd($4[0], $4[1], $4[2], implode($4[3..], " ") ) :) });
  }
  return retval;
} /* query_patterns() */