User:HighInBC/MCP/CommandParser
Appearance
< User:HighInBC | MCP
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") } ##### 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;