/* -*- LPC -*- */
/*
* $Locker: ceres $
* $Id: rmp_layer.c,v 1.7 2003/04/06 02:33:56 ceres Exp ceres $
*/
/* rmplayer, deletes a player's save file and calls the refresh
* handler on that player.
*/
#include <refresh.h>
#include <player_handler.h>
#include <player_handler.h>
inherit "/cmds/base";
private void sure(string response, string player, string lord, string reason,
int immediately) {
if(previous_object() &&
member_array(find_object("/secure/simul_efun"),
previous_object( -1 ) ) == -1 ) {
log_file("CHEAT", ctime(time()) +
": illegal attempt to delete a player.\nTrace: " +
back_trace());
write("Illegal use of rmplayer.\n");
return;
}
if (response == "YES") {
string olduid, src, ext;
write("Ok. Deleting\n");
olduid = geteuid();
seteuid("Root");
if(file_size(PLAYER_HANDLER->query_player_ram_file_name(player)+".o.gz") > 0){
src = PLAYER_HANDLER->query_player_ram_file_name(player);
ext = ".o.gz";
} else if(file_size(PLAYER_HANDLER->query_player_disk_file_name(player)+".o.gz") > 0) {
src = PLAYER_HANDLER->query_player_disk_file_name(player);
ext = ".o.gz";
} else if(file_size(PLAYER_HANDLER->query_player_disk_file_name(player)+".o") > 0) {
src = PLAYER_HANDLER->query_player_disk_file_name(player);
ext = ".o";
} else if(file_size(PLAYER_HANDLER->query_delete_player_file_name(player) + ".o.gz") > 0) {
src = PLAYER_HANDLER->query_delete_player_file_name(player);
ext = ".o.gz";
} else if(file_size(PLAYER_HANDLER->query_delete_player_file_name(player)+ ".o") > 0) {
src = PLAYER_HANDLER->query_delete_player_file_name(player);
ext = ".o";
}
if(src && ext) {
if(!immediately)
unguarded((: cp($(src) + $(ext), "/save/players/appeal/"+
$(player)+$(ext)):));
unguarded((: rm($(src)+$(ext)) :));
if(src == PLAYER_HANDLER->query_player_ram_file_name(player)) {
src = PLAYER_HANDLER->query_player_disk_file_name(player);
unguarded((: rm($(src)+$(ext)) :));
}
PLAYER_HANDLER->remove_cache_entry( player );
unguarded((: write_file, "/log/SUSPEND",
ctime(time()) + " "+ player + " deleted by " + lord +
" because " + reason + ".\n" :) );
seteuid(olduid);
}
} else {
write("Ok. Not deleting\n");
}
return;
}
int cmd(string player, string reason, int immediately) {
if (!master()->query_liaison_deputy_or_lord(previous_object(-1))) {
unguarded((: log_file, "/log/CHEAT", ctime(time()) +
": illegal attempt to delete a player.\nTrace: " +
back_trace() :));
return notify_fail("Sorry: only directors can delete players.\n");
}
/* At this point, I'm satisfied that the object is _allowed_ to
* delete players. But is this a player?
*/
if (!PLAYER_HANDLER->test_user(player)) {
return notify_fail("Sorry, but " + player + " isn't a player\n");
}
/* Is a non H trying to delete an H or L? */
if (!master()->high_programmer(previous_object(-1)) &&
master()->query_lord(player)) {
unguarded( (: log_file, "/log/CHEAT", ctime(time()) +
": Illegal attempt to delete a director.\nTrace: " +
back_trace() :) );
return notify_fail("Sorry.\n");
}
if(!master()->query_lord(previous_object(-1)) &&
PLAYER_HANDLER->test_age(player) < - (86400)) {
add_failed_mess("Only directors can immediately delete players over "
"24 hours old.\n");
return 0;
}
if (!master()->query_lord(previous_object(-1)) &&
PLAYER_HANDLER->test_creator(player)) {
add_failed_mess("You cannot delete creators.\n");
return 0;
}
if(!reason || reason == "") {
return notify_fail("You must give a reason.\n");
}
/* Ok. Looks like everything is copasetic. */
write("This will permanently delete the player " + player + ".\n" +
"THIS IS PERMANENT.\n" +
"Are you sure? (only \"YES\" will delete the player) ");
input_to((: sure :), 0, player, this_player()->query_name(), reason,
immediately);
return 1;
}
mixed *query_patterns() {
return ({ "<word'player name'> <string'reason'>", (: cmd($4[0], $4[1], 0) :),
" immediately <word'player name'> <string'reason'>",
(: cmd($4[0], $4[1], 1) :) });
}