User:HighInBC/MCP/CommandParser

This bot is not ready to be used. It is in development. Version 0.0

package HBCPlugins::CommandParser; use strict; use Digest::MD5 qw(md5_hex); use MediaWiki::API; use Data::Dumper; our $self;

sub new { shift; $self = shift; bless($self);

$self->{params}{internal} = {}; $self->{params}{methods} = { authorize => \&handleAuthorize, test     => [\&setFlag, 'test'], go       => [\&setFlag, 'go'  ] }; $self->{params}{panel}    = {}; $self->{params}{flags}   = {};

&{$self->{shared}{add_job}}(\&init,0); &{$self->{shared}{add_job}}(\&login,0); &{$self->{shared}{add_job}}(\&parse_panel,5); return $self; }

sub methodHandler { # called from the outside my $self = shift; my $method = shift; my $rc_function = shift; return undef unless (ref($rc_function) eq 'CODE' || ref($rc_function) eq 'ARRAY'); if ($self->{params}{methods}{$method}) { print "'$method' is already a reserved method name\n"; return undef; } print "Method registered: $method\n";

$self->{params}{methods}{lc($method)} = $rc_function; }

sub init { $self->{params}{mw} = MediaWiki::API->new; }

sub login { print "Logging in...\n"; $self->{params}{mw}->{config}->{api_url} = 'http://en.wikipedia.org/w/api.php'; $self->{params}{mw}->login({lgname => $self->{params}{username}, lgpassword => $self->{params}{password}}) || die $self->{params}{mw}->{error}->{code}.': '.$self->{params}{mw}->{error}->{details}; print "Done...\n"; }

sub parse_panel { print "Parsing panel...\n"; $self->{params}{pages}{controlPanel} = $self->{params}{mw}->get_page({title => $self->{params}{controlPanel}}); refuse_to_operate($self->{params}{pages}{controlPanel}->{'user'}) unless ($self->{params}{pages}{controlPanel}->{'user'} eq $self->{params}{username}); if ($self->{params}{signature_password}) { my $signature_target = $self->{params}{pages}{controlPanel}->{'*'}; $signature_target =~ s|\n$||; $signature_target = $self->{params}{signature_password}.$signature_target; my $signature_needed = lc(md5_hex($signature_target)); if ($self->{params}{pages}{controlPanel}->{'comment'} =~ m|([0-9a-f]{32})|i) { my $signature_given = lc($1); print "$signature_needed vs $signature_given\n"; print Dumper($self->{params}{pages}{controlPanel}); } else { return undef; } }  my @lines = split("\n", $self->{params}{pages}{controlPanel}->{'*'}); LINE: foreach my $line (@lines) { next LINE if    ($line =~ m|\{\{/done\}\}|); next LINE unless ($line =~ m|^;([^:]+):\s*(.*)|); my($method,$parameters) = ($1, $2); next LINE unless ($self->{params}{flags}{go} || lc($method) eq 'go'); my $ra_parameters = parse_parameters($parameters); $self->{params}{panel}{$method} ||= []; my $ref = $self->{params}{methods}{lc($method)}; print "Running method: $method...\n"; if (ref($ref) eq 'CODE') { &{$ref}({'mw' => $self->{params}{mw}}, $ra_parameters); } elsif (ref($ref) eq 'ARRAY') { my @cmd = @{$ref}; my $cmd = shift(@cmd); &{$cmd}({'mw' => $self->{params}{mw}},$ra_parameters,@cmd); }   push(@{$self->{params}{panel}{$method}}, $ra_parameters); } if ($self->{params}{flags}{go}) { my $new_content = $self->{params}{pages}{controlPanel}->{'*'}; $new_content =~ s|(\n)?;Go|$1 ;Go|i || die; print "Marking page done.\n"; $self->{params}{mw}->edit( {     action        => 'edit',      title         => $self->{params}{controlPanel},      basetimestamp => $self->{params}{pages}{controlPanel}->{'timestamp'},      text          => $new_content,      summary       => 'Plugins have been triggered, disabling "Go" command.',    }) || die $self->{params}{mw}->{error}->{code}. ': ' . $self->{params}{mw}->{error}->{details}; print "Done...\n"; } else { print "No go...\n"; } print "\n"; }

sub parse_parameters { my $string = shift; my @params; while ($string =~ m'\{(.*?)\}'g) { my @options = split('\|',$1); push (@params,\@options) } return \@params; }

sub refuse_to_operate { my $user = shift; die("I refuse to act because the last person who edited was: $user\n") }


 * 1) Methods #####

sub setFlag { my $rh_extras = shift; my $ra_params = shift; my $flag = shift; my $state = ${${$ra_params}[0]}[0]; if ($state && $state !~ m/no|off|false|0/i) { print "Set '$flag' on\n"; $self->{params}{flags}{$flag} = 1; } else { print "Set $flag off\n"; $self->{params}{flags}{$flag} = undef; } }

sub handleAuthorize { my $rh_extras = shift; my $ra_params = shift; foreach my $ra_authorization (@{$ra_params}) { my $auth = lc(shift(@{$ra_authorization})); $self->{params}{internal}{authorizations}{$auth} = {'authorized' => 1}; foreach my $auth_setting (@{$ra_authorization}) { $auth_setting =~ m|(.*?)\s(.*)|; my ($key, $value) = ($1, $2); $self->{params}{internal}{authorizations}{$auth}{$key} = $value; } } }



1;