FreewarWiki:Bot/Skripts/maplist.pl: Unterschied zwischen den Versionen

aus Chaos FreewarWiki, der Referenz für Freewar
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
K (+ {{Scriptquelltextverwendung}})
Zeile 1: Zeile 1:
<!--
{{Scriptquelltextverwendung}}
 
<pre>
ACHTUNG: Das Skript unbedingt vom Artikel statt Quelltext kopieren da hier versteckter Wikisyntax verwendet wird!
 
--><pre>
#!/usr/bin/perl
#!/usr/bin/perl



Version vom 16. März 2012, 16:18 Uhr

Dieses Script ist hier lediglich archiviert und nicht direkt lauffähig. Wenn Du es benutzen möchtest, musst Du es lokal abspeichern und mit einem geeigneten Interpreter ausführen lassen. Zum Übernehmen solltest Du nicht den unten angezeigten Text verwenden, sondern den Quelltext des Wiki-Artikels: Dazu wählst Du Bearbeiten und kopierst den (meist zwischen PRE-Tags eingefassten) Scripttext.

Sofern Du die Scripte dauerhaft lokal abgespeichert hältst, solltest Du sie vor der nächsten Ausführung darauf prüfen, ob sie noch aktuell sind.

Letzter Bearbeiter: Cembon — Zuletzt bearbeitet: 16.03.2012
#!/usr/bin/perl

use strict;
use LWP::UserAgent;
use URI::Escape;
use HTTP::Request;
use Data::Dumper;

my $ua = LWP::UserAgent->new(); 

my $host = "http://www.fwwiki.de";
my $url = $host . "/index.php/Kategorie:Karten";

my %mapfields;

while($url ne "") {
    my $c = "";
    if (scalar(@ARGV) == 0) {
        my $request = HTTP::Request->new("GET", $url);
        my $response = $ua->simple_request($request);
        $c = $response->content();
    } else {
        # Doofer Hack ^.^
        foreach (@ARGV) {
             $c .= "<a href=\"/index.php/Karte:$_\">Karte:$_</a>";
        }
    }
    $url = "";

    while($c =~ /<a([^>]*)>([^<]*)<\/a>/gm) {
        my ($anchor, $text) = ($1, $2);
        my $href;
        $href = $1 if ($anchor =~ /href\s*=\s*"([^"]*)"/);
        $href =~ s/&amp;/&/g; 

        my $title;
        $title = $1 if ($anchor =~ /title\s*=\s*"([^"]*)"/);
        $url = $host.$href if ($text =~ /n.*chste \d+/);
	next if ($text !~ /Karte:\s*(.*)/);

        my @fields = fetchMap(my $area = $1, $host.$href);
	foreach (@fields) {
	    my %field = %{$_};
	    if (exists($mapfields{$field{"x"}}{$field{"y"}})) {
		my %ofield = %{$mapfields{$field{"x"}}{$field{"y"}}};
		if ($field{"grenzfeld"} && $ofield{"grenzfeld"}) {
			$field{"accessible"} = 0;
		} elsif (!exists($field{"accessible"})) {
			$field{"accessible"} = 1;
		}
		$field{"area"} = $area unless $field{"grenzfeld"} && exists($ofield{"area"});
		delete($field{"grenzfeld"}) unless ($ofield{"grenzfeld"});
		$mapfields{$field{"x"}}{$field{"y"}} = {%ofield, %field};
	    } else {
		$mapfields{$field{"x"}}{$field{"y"}} = $_;
		$mapfields{$field{"x"}}{$field{"y"}}{"area"} = $area;
	    }
	}
    }
}

foreach my $x (keys(%mapfields)) {
    foreach my $y (keys(%{$mapfields{$x}})) {
	my %field = %{$mapfields{$x}{$y}};
	push (@{$field{"npcs"}}, "") if (!exists($field{"npcs"}));
	push (@{$field{"passages"}}, "") if (!exists($field{"passages"}));
	print "$field{area};$field{accessible};$x;$y;" . join("/", @{$field{"npcs"}}) . ";$field{img};" . join("/", @{$field{"passages"}}) . "\n";
    }
}

sub fetchMap {
    my ($gebiet, $href) = @_;
    my $request = HTTP::Request->new("GET", $href."?action=edit");
    my $response = $ua->simple_request($request);
    my $c = $response->content();

    my $firstx;
    my $curx;
    my $cury;
    my $opened;
    my $firstline = 1;
    my @fields;
    my $lastfield;

    while ($c =~ /\{\{Karte\/([^|{}\/]+)(\/([^|{}]+))?(\|([^{}]*))?\}\}?/ig) {
        my ($vorlage, $sub, $argl) = ($1, $3, $5);
        my @args = split(/\|/, $argl);

        if (!$opened) {
            if ($vorlage eq "Beginn") {
                $opened = 1;

		return () if $argl =~ /(^|\|)(Veraltete Karte|Alternative)=/;
            }
            next;
        } elsif ($vorlage eq "Ende") {
	    last;
        } elsif ($vorlage eq "NeueZeile") {
            $firstline = 0;
            $curx = $firstx;
	    undef($lastfield);
        } elsif ($vorlage eq "Koord") {
            if (($firstline) && (!defined($firstx))) {
                $firstx = $args[0];
            } else {
                $cury = $args[0];
            }
	    undef($lastfield);
        } elsif ($vorlage =~ /^(Feld\d*|Grenzfeld)$/) {
	    my %field;
            my $img = shift(@args);

	    $field{"x"} = $curx;
	    $field{"y"} = $cury;
	    $field{"grenzfeld"} = $vorlage eq "Grenzfeld";
	    $field{"img"} = $img;
            if ($img =~ m"http://\d+.\d+.\d+.\d+/freewar/images/map/black.jpg") {
		$field{"accessible"} = 0;
	    } elsif ($vorlage ne "Grenzfeld") {
		$field{"accessible"} = 1;
		foreach (@args) {
		    push(@{$field{"npcs"}}, $_) if ($_ !~ "^(Alt=|none)");
		}
	    }
            $curx++;
	    $lastfield = \%field;
	    push(@fields, $lastfield);
        } elsif ($vorlage eq "Berg") {
	    my %field;
	    my $img = "http://welt1.freewar.de/freewar/images/map/std.jpg";

            $field{"x"} = $curx;
            $field{"y"} = $cury;
	    $field{"img"} = $img;
	    $field{"accessible"} = 0;

	    $curx++;
	    undef($lastfield);
	    push(@fields, \%field);
	} elsif ($vorlage eq "Leer") {
	    $curx++;
	    undef($lastfield);
	} elsif ($vorlage eq "Passage" && $sub ne "Zufall") {
	    if (!$lastfield) {
		print "Fehler: Passage ohne zugehoeriges Feld spezifiziert";
		next;
	    }
	    my ($x, $y);
	    foreach (@args) {
		$x = $1 if (/X\s*?=\s*?(.*)/i);
		$y = $1 if (/Y\s*?=\s*?(.*)/i);
	    }
	    if (!$x || !$y) {
		print STDERR "Warnung: Keine Koordinatenangabe in Passage von $gebiet nach $argl\n";
		next;
            }
	    push(@{$lastfield->{"passages"}}, "$x,$y");
	}
    }
    return @fields;
}