#!/usr/bin/perl -w
use XML::Parser;
use Text::Iconv;
  
$my_nick="";
@good_guys=("slava");
@bad_guys=("test");

  ## Init some vars
   %members=();
   %member_block=();
   $member_block_flag=0;
   %rule=();
   $trust=0;
   @result=();
   $result_flag=0;

  ## Set handlers for xml parser
   my $parser= XML::Parser->new(Handlers=>{
	    Start=> \&elem_start,
	    End  => \&elem_end,
	    Char => \&char_data});

  ## Parse input
    $filename=shift @ARGV or die "Use $0 file.dbl group rule\n";
    $igroup=shift @ARGV or die "Use $0 file.dbl group rule\n";
    $irule=shift @ARGV or die "Use $0 file.dbl group rule\n";
    
    chomp ($filename);
    open(IN, "cat $filename | gzip -d |");
    $parser->parse(*IN);
    close(IN);
   exit;

 
  ## Element start handler
    sub elem_start
     {
      my ($expat,$name,%attr)=@_;

      if ($name eq "member")
         {
	  %member_block=();
	  $member_block_flag=1;
	  return(0);
         }

      if ($name eq "record")
         {
	  %rule=();
	  $trust=0;
	  return(0);
         }
	 
      if ($name eq "add" or $name eq "check")
         {
          $calc_flag=1;
          %calc=();
          return(0);
         }
				 
      $option=$name;
     }
 
    ## Element end handler
     sub elem_end
     {
      my ($expat,$name)=@_;
  
      if ($name eq "member")
      {
       if (exists($member_block{"name"}) && exists($member_block{"trust"}))
          {
	    ## Users trust modifications
            if ($member_block{"name"} eq $my_nick) {$member_block{"trust"}+=9999999999999;}

	    foreach (@good_guys)
	     {if ($_ eq $member_block{"name"}) {$member_block{"trust"}+=999999;}}

	    foreach (@bad_guys)
	     {if ($_ eq $member_block{"name"}) {$member_block{"trust"}=0;}}

	   ## Add member to list
	   $members{$member_block{"name"}}=$member_block{"trust"};
	  }
       $member_block_flag=0;
       return(0);
      }

    if ($name eq "check" or $name eq "add")
       {
	$calc_flag=0;
	
	if ($irule eq $rule{'rule'} and $igroup eq $rule{'group'}) 
	 {
	  push (@result,"$members{$calc{'user'}} $calc{'answer'} $calc{'user'} $calc{'timestamp'}");
	  $result_flag=1;
	 }
	
	if (exists($calc{"answer"}) && $calc{"answer"} eq "No")
	   {$trust-=$members{$calc{"user"}};}
	else 
	   {$trust+=$members{$calc{"user"}};}
	return(0);
       }
       
       
    if ($name eq "record")
    {  
     if ($result_flag==1)
      {
       foreach ( sort{first_digit($a)<=>first_digit($b)} @result)
       {
        print "$_\n";
       }
       exit;
      }
	 return(0);       
     }
     $option="null";
   } 
 
  ## Char data handler
    sub char_data
    {
      my ($expat,$text)=@_;
      if ($option eq "null") {return(0);}
      if ($member_block_flag==1) {$member_block{$option}.=$text;}
      if ($calc_flag) {$calc{$option}.=$text;}
      else {$rule{$option}.=$text;}
    }
  
sub first_digit
{
 if ($_[0]=~/^(\d+)/) {return ($1);}
 return(0);
}