/*
// File : _sponsor.c
// Purpose : raise a wizard's position within a domain
// **-**-** : Jubal brought it to you.
// This file is part of the TMI-2 distribution mudlib
// Please retain this header if you use any of this code
// 92-04-24 : Buddha added logging and notification.
// 92-04-25 : Sulam made it limit you to one LESS than your position
// 92-09-24 : Prydain corrected the starting workroom for new mudlib
// 93-01-23 : Buddha revised it to communicate with a modified Domains daemon
// and to allow promotion of users not currently logged in
// (Mobydick helped a little with that.)
// 93-02-05 : Pallando changed it to use the same generic workroom as home.c
// 93-08-07 : Grendel fixed it so you can't sponsor a non-wizard
// 93-08-23 : Pallando made it mkdir the "/u/<letter>" dirs if not there
// and fixed the 'under' option.
// and fixed the 'meglomania' bug (promotion beyond God).
// 95-06-04 : Leto changed logs to use logs.h
*/
#include <mudlib.h>
#include <daemons.h>
#include <domains.h>
#include <login_macros.h>
#include <logs.h>
inherit DAEMON;
string workroom;
int cmd_sponsor( string arg )
{
string domain, target, under;
string fname;
object tmp, myLink, targetLink;
int myLev, targetLev;
if( !arg || sscanf( arg, "%s %s", target, domain ) < 2 )
{
notify_fail( "Usage: sponsor <name> <guild> [under]\n" );
return 0;
}
sscanf( domain, "%s %s", domain, under );
if( member_array( domain, DOMAIN_LIST ) == - 1 ) {
notify_fail( "No such domain.\n" );
return 0;
}
tmp = previous_object();
if( !interactive( tmp ) )
return 0;
// no security hole here...
myLink = ( object ) tmp-> query_link();
myLev = member_array(
( string ) DOMAIN_D-> query_domain_level( myLink, domain ),
LEVEL_LIST );
// If the command giver is an admin...well, let them do whatever.
if( adminp(geteuid( myLink )) )
myLev = sizeof( LEVEL_LIST );
if( myLev < MIN_SPONSOR_LEVEL ) {
notify_fail(
"You must be at least " +
LEVEL_LIST[MIN_SPONSOR_LEVEL] +
" level in the domain to sponsor someone.\n" );
return 0;
}
if( under && ( myLev < ( sizeof( LEVEL_LIST ) - 1 ) ) )
{
notify_fail( "Only admins or " + LEVEL_LIST[sizeof( LEVEL_LIST ) - 1] +
" may use the 'under' option.\n" );
return 0;
}
if( !under ) under = geteuid( myLink );
// Ask the finger daemon to get a link for us,
// so that if they are not on at the time, we can still do this.
targetLink = FINGER_D-> restore_data( target );
if( !targetLink ) {
write( target + ".\n" );
notify_fail( "No such user.\n" );
return 0;
}
if( !targetLink-> query( "wizard" ) ) {
notify_fail( target + " is not a wizard (use makewiz)\n" );
return 0;
}
targetLev = member_array(
( string ) DOMAIN_D-> query_domain_level( targetLink, domain ),
LEVEL_LIST );
if( targetLev >= myLev ) {
write( ( string ) targetLink-> CAP_NAME +
" is too high a level for you to sponsor.\n" );
return 1;
} else if( targetLev < ENTRY_LEVEL ) {
targetLev = ENTRY_LEVEL;
if( DOMAIN_D-> set_domain( targetLink, domain,
LEVEL_LIST[targetLev], under ) ) {
printf( "Level set to %s (%s).\n", LEVEL_LIST[targetLev], under );
tmp = find_player( target );
if (tmp)
tell_object( tmp, ( string ) this_player()-> query( "cap_name" ) +
" has sponsored you to novice" +
" in the " + domain + " domain.\n" );
log_file( SPONSOR_LOG,
ctime( time() ) + " " +
(string)this_player()-> link_data( "cap_name" ) +
" promoted " + targetLink-> query( "cap_name" ) +
" to " + LEVEL_LIST[targetLev] +
" in the " + domain + " domain.\n" );
} else {
write( "Failed to set level.\n" );
return 1;
}
// This command is usually the first one to encounter the directories
// "/u/a/" to "/u/z/" not existing in a newly untarred mudlib.
fname = "/u/" + extract( target, 0, 0 );
if( file_size( fname ) != - 2 )
{
if( file_size( fname ) >= 0 )
{
write( "Directory name currently taken by file.\n" );
write( "Unable to create directory.\n" );
return 1;
}
mkdir( fname );
}
fname += "/" + target;
if( file_size( fname ) != - 2 )
{
if( file_size( fname ) >= 0 )
{
write( "Directory name currently taken by file.\n" );
write( "Unable to create directory.\n" );
return 1;
}
mkdir( fname );
write( "Created directory " + fname + "\n" );
}
fname += "/workroom.c";
if( file_size( fname ) == - 1 )
{
if( !workroom ) workroom = read_file( "/obj/workroom.c" );
write_file( fname, workroom );
write( "Created file " + fname + "\n" );
log_file( SPONSOR_LOG, "Created " + fname + " on " +
ctime( time() ) + ".\n" );
}
// This will force a save, and if the user is not on, remove() as well.
targetLink-> save_data();
targetLink-> clean_up();
return 1;
}
targetLev++;
if( targetLev == sizeof( LEVEL_LIST ) )
{
targetLev--;
write( capitalize( target ) + " is already " + LEVEL_LIST[targetLev] +
" of the " + domain + " domain.\n"+
"Sorry, but you can't get higher than that!\n" );
}
if( DOMAIN_D-> set_domain( targetLink, domain,
LEVEL_LIST[targetLev], under ) ) {
tmp = find_player( target );
if( tmp )
tell_object( tmp, ( string ) myLink-> CAP_NAME +
" has promoted you to " + LEVEL_LIST[targetLev] +
" in the " + domain + " domain.\n" );
write( "Level set to " + LEVEL_LIST[targetLev] + ".\n" );
log_file( SPONSOR_LOG, ctime( time() ) + " " + (string)myLink-> CAP_NAME +
" promoted " + capitalize( target ) + " to " + LEVEL_LIST[targetLev] +
" in the " + domain + " domain.\n" );
} else {
write( "Failed to set level.\n" );
}
// This will force a save, and if the user is not on, a remove() as well.
targetLink-> clean_up();
return 1;
}
int help() {
write(
"Command: sponsor\n" +
"Syntax: sponsor <name> <domain> [under]\n" +
" The sponsor command is used to enroll and promote <name> in the\n" +
"domain <domain>. You must be of at least initiate level in domain\n" +
"<domain> to use sponsor. If <name> is not in domain <domain>, sie\n"
"will be placed in the domain at the novice level. If <name> is\n" +
"already in the domain, then he/she will be promoted one level. You\n" +
"can only promote people up to one level below yourself. If <name>\n" +
"does not have a directory, then one will be created for him/her,\n" +
"and a basic workroom placed in it. Please exercise some caution\n" +
"in who you promote to initiate level, as he/she will be able to add\n" +
"new directories with this command.\n" +
" Special for sages and admins, the <under> parameter allows you to\n" +
"change who is the offical sponsor of <name>. If <name> is not in\n" +
"<domain>, then he/she will be added, otherwise his/her level will\n" +
"be unchanged.\n" +
" See also: domains, demote\n" );
return 1;
}