// File     :  badge.c
// Purpose  :  Conference badge
// 94-03-02 :  Pallando removed channel stuff since you can make a channel
//             for conference users by doing:
//               call /adm/daemons/channels;register_channel;"con";me;3;0
#define log( x )
// #define log( x ) write_file( "/d/Conf/text/debug_badge.t", wrap( x ) )
#define CONF_HELP_DIR "/d/Conf/text/help/"
#define CMD_LOGCON "/d/Conf/cmds/_logcon"
#include <uid.h>
#include <move.h>
#include <mudlib.h>
inherit OBJECT; 
string name, rep, old_title;
int rmcon;
varargs int is_convener( mixed a )
{
  if( !a ) a = previous_object();
  a = ( objectp( a ) ? geteuid( a ) : a );
  if( a == getuid() || member_group( a, "conveners" ) ||
      a == ROOT_UID || adminp(a)   ) return 1;
  return 0;
}
void create()
{
  log( "create : " + identify( previous_object() ) + " [" +
    geteuid( previous_object() ) + "]" );
  if( !is_convener() && ( base_name( previous_object() ) != USER ) ) remove();
  seteuid( getuid() );
  set( "long",
"A shiny mithril badge, with your name etched on it in actinic blue fire.\n"+
"Type \"help conf.help\" for a list of conference help files.\n"+
"To leave the conference, \"discard badge\".\n"+
  "" );
  set( "short", "A blank conference badge" );
  set( "id", ({ "badge", "conference badge", "conference_badge" }) );
}
void init()
{
  add_action( "cmd_discard", "discard" );
  add_action( "cmd_help", "help" );
}
void set_short()
{
  set( "short", "A badge saying: " + capitalize( name ) +
    (rep ? (" "+rep) : "" ) );
}
void set_title( object member )
{
  member-> setenv( "TITLE",
    "$N" + ( rep ? (" "+rep) : "" ) + " (conference " +
    ( member_group( name, "conveners" ) ? "convener" : "member" ) +
    ")" );
}
int register( object user, string group )
{
  if( !is_convener() ) return 0;
  name = geteuid( user );
  rep = group;
  set_short();
  if( !old_title ) old_title = this_player()-> getenv( "TITLE" );
  set_title( user );
  return 1;
}
string query_rep() { return rep; } 
int rmcon( int a )
{
  if( is_convener() ) rmcon = a;
}
int move( object a )
{
  if( environment() && living( environment() ) )
  {
    notify_fail( "The badge is fixed on firmly.\n" ); 
    return MOVE_NOT_ALLOWED;
  }
  return ::move( a );
}
int cmd_discard( string a )
{
  if( !id( a ) ) { notify_fail( "Discard what?\n" ); return 0; }
  write( "You discard your conference badge.\n" );
  if( old_title ) this_player()-> setenv( "TITLE", old_title );
  remove();
  return 1;
}
mixed query_auto_load()
{
  return ({ base_name( this_object() ), ({
    name,
    rep,
    old_title,
    rmcon,
  }) });
}
void init_arg( mixed a )
{
  log( "init_arg : " + identify( a ) );
  name = a[0];
  rep = a[1];
  old_title = a[2];
  rmcon = a[3];
  set_short();
}
int cmd_help( string a )
{
  if( a && file_size( CONF_HELP_DIR + a ) > 0 )
  {
    write( read_file( CONF_HELP_DIR + a ) );
    return 1;
  }
  return 0;
}