Re: [CODE] idnum problem

From: Patrick Dughi (dughi@IMAXX.NET)
Date: 06/12/98


> Don't know about that particular case but i had a idnum problem as well
> im running ascii files and it seems that every time a player was deleted
> and re-created he/she got a new idnum in the playerfile but in the index
> the idnum wasn't changed so i ended up with some ppl having the same idnum
> etc.
>
  Yes. Have some.
                                                PjD

#!/usr/bin/perl
#  House Cleaner v.1, by Pat Dughi 5-30-97
# kinda a substitute for purgeplay once you get that fancy ascii pfile
# thing and they aint removed any more.


#general declares
$DELETE_BIT=1024;          #this is 2^10 or (1 << 10)
$NODELETE_BIT=8192;         #this is 2^13 or (1 << 13)

$LEVEL_DEL=10;               # level to delete after 30 days.
$START_PLAYER_DIR="a";

$PLAYER_DIR="lib/pfiles";
$RENT_DIR="lib/plrobjs";
$ALIAS_DIR="lib/plralias";
$TEMP_DIR="/tmp";

$PLAYER_INDEX="lib/pfiles/plr_index";

# Subroutine "find_old_dir", returns old style directory of character
# being examined.
sub find_old_dir {
  my ($character_name) = @_;
  $character_name=~ tr/a-z/A-z/;

    if ($character_name ge "A" && $character_name le "E") {
      return "A-E";
    }
    if ($character_name ge "F" && $character_name le "J") {
      return "F-J";
    }
    if ($character_name ge "K" && $character_name le "O") {
      return "K-O";
    }
    if ($character_name ge "P" && $character_name le "T") {
      return "P-T";
    }
    if ($character_name ge "U" && $character_name le "Z") {
      return "U-Z";
    }
  #this couldn't possibly happen,  but hey, we'll put it in for fun.
  return "ZZZ";
}

# find_and_remove subroutine
# Find out if a named player needs to be deleted!

sub find_and_remove {
  my $character_name = shift(@_);
  $delete=0;

  if ($character_name eq "." || $character_name eq "..") {
    return 0;
  }

  open(PFILE, "$PLAYER_DIR/$START_PLAYER_DIR/$character_name");
  while(<PFILE>) {
    if (/Act /) {
      ($act,$colon,$actnum)=split(/\s/,$_,3);
      if ($actnum & $DELETE_BIT && !($actnum & $NODELETE_BIT)) {
        $delete=1;
      }
    }
    if (/Id  /) {
      ($id,$colon,$idnum)=split(/\s+/,$_,3);
      chop($idnum);
    }
    if (/Last/) {
      ($last,$colon,$lastnum)=split(/\s/,$_,3);
      chop($lastnum);
    }
    if (/Levl/) {
      ($levl,$colon,$levlnum)=split(/\s/,$_,3);
      chop($lastnum);
    }
  }

# check for level being less than a certain number, and the character not
#       having logged in for about a month
  if (((time() - $lastnum) > (60*60*24*30)) && ($levlnum < $LEVEL_DIR)) {
    #then, its more than a month
    $delete=1;
  }


  close(PFILE);

  if($delete) {
    print("Deleting $character_name, delete bits set.\n");
    unlink("$PLAYER_DIR/$START_PLAYER_DIR/$character_name");

    if(-e ($RENT_DIR . "/" . find_old_dir($character_name) .
"/$character_name"

. ".objs")) {
      unlink($RENT_DIR . "/" . find_old_dir($character_name) .
"/$character_name" . ".objs");
    }

    if(-e ($ALIAS_DIR . "/" . find_old_dir($character_name) . "/" .
$character_name . ".alias")) {
      unlink($ALIAS_DIR . "/" . find_old_dir($character_name) . "/" .
$character_name . ".alias");
    }
    return 0; # found and removed.
  }
  return $idnum; #  found, is okay for insertion in index.
}

#this is the main function.
print("House cleaning started.\n");
open(NEW_PLAYER_INDEX, "> $TEMP_DIR/tmpplr_index") or die "Failure to open
tmp
file\n";

while($START_PLAYER_DIR ne "aa") {
  opendir TEMPDIR, "$PLAYER_DIR/$START_PLAYER_DIR";
  @dir_list= readdir TEMPDIR;
  closedir TEMPDIR;

  foreach $character (@dir_list) {

    if(find_and_remove($character)) {
      $their_id=find_and_remove($character);

      print NEW_PLAYER_INDEX "$their_id\t$character\n";
    }
  }
  $START_PLAYER_DIR++;
}

close(NEW_PLAYER_INDEX);

#just for reading.

open(NEW_PLAYER_INDEX,  "$TEMP_DIR/tmpplr_index") or die "Lost temp
file!\n";
@presort=<NEW_PLAYER_INDEX>;
close(NEW_PLAYER_INDEX);

sub numfirst {

  ($numbera,$crapa) =split(/\t/,$a);
  ($numberb,$crapb) =split(/\t/,$b);
 $numbera <=> $numberb;
}
@sorted=sort numfirst @presort;
open(PLAYER_INDEX_T,  "> $PLAYER_INDEX");
foreach $line (@sorted) {
  print PLAYER_INDEX_T $line;
}
close(PLAYER_INDEX_T);

print("All done!\n");


     +------------------------------------------------------------+
     | Ensure that you have read the CircleMUD Mailing List FAQ:  |
     | http://democracy.queensu.ca/~fletcher/Circle/list-faq.html |
     +------------------------------------------------------------+



This archive was generated by hypermail 2b30 : 12/15/00 PST