Bearbeiten von „FreewarWiki:Bot/Skripts/npclist.php

Zur Navigation springen Zur Suche springen

Achtung

Du bearbeitest diese Seite unangemeldet. Wenn du deine Änderung speicherst, wird deine aktuelle IP-Adresse in der Versionsgeschichte aufgezeichnet und ist damit öffentlich einsehbar. Um effektiver mitarbeiten zu können und deine IP-Adresse zu verbergen, melde dich doch bitte an.

Speichere bitte keine Textversuche ab. Nutze stattdessen die Spielwiese, um dich im Umgang mit der Textverarbeitung im Wiki vertraut zu machen.

Die Bearbeitung kann rückgängig gemacht werden. Bitte prüfe den Vergleich unten, um sicherzustellen, dass du dies tun möchtest, und veröffentliche dann unten deine Änderungen, um die Bearbeitung rückgängig zu machen.

Aktuelle Version Dein Text
Zeile 8: Zeile 8:
define('TEMPLATE_GET_KEY',  1);
define('TEMPLATE_GET_KEY',  1);
define('TEMPLATE_GET_VALUE', 2);
define('TEMPLATE_GET_VALUE', 2);
function which_char_comes_first($s, $c1, $c2) {
    $pos1 = strpos($s, $c1);
    $pos2 = strpos($s, $c2);
   
    if ($pos1 !== false && $pos2 !== false) {
        return $pos1 < $pos2 ? $c1 : $c2;
    } else if ($pos1 === false && $pos2 === false) {
        return null;
    } else if ($pos2 === false) {
        return $c1;
    } else { // $pos1 === false
        return $c2;
    }
}


function get_templates($template, $wiki_text) {
function get_templates($template, $wiki_text) {
Zeile 34: Zeile 19:
function parse_template($text) {
function parse_template($text) {
     $template = array();
     $template = array();
    $numeric_key = 1;
 
     /* nicht kompatibel mit verschachtelten Vorlagen
     /* nicht kompatibel mit verschachtelten Vorlagen
     // Key-Value Paare spliten
     // Key-Value Paare spliten
Zeile 50: Zeile 35:
     $depth = 0;
     $depth = 0;


     for ($i = 0, $length = strlen($text); $i < $length; ++$i) {
     for ($i = 1, $length = strlen($text); $i < $length; ++$i) {
         if ($text[$i] === '{' && $text[$i+1] === '{') { // weitere Vorlage
         if ($text[$i] === '{' && $text[$i+1] === '{') { // weitere Vorlage
             ++$depth;
             ++$depth;
Zeile 85: Zeile 70:
             $template[$key] = '';
             $template[$key] = '';
         } else if ($text[$i] === '|' && $depth === 0) { // Parameter Sparierung
         } else if ($text[$i] === '|' && $depth === 0) { // Parameter Sparierung
             // kein `key=value` paar sondern nur `value`
             $mode = TEMPLATE_GET_KEY;
            if (which_char_comes_first(substr($text, $i + 1), '|', '=') === '=') {
            $key = '';
                $mode = TEMPLATE_GET_KEY;
                $key = '';
            } else {
                $mode = TEMPLATE_GET_VALUE;
                $key = $numeric_key++;
            }
         } else if ($mode === TEMPLATE_GET_KEY) {
         } else if ($mode === TEMPLATE_GET_KEY) {
             $key .= $text[$i];
             $key .= $text[$i];
Zeile 99: Zeile 78:
         }
         }
     }
     }
   
 
     return array_map('trim', $template);
     return array_map('trim', $template);
}
}
Zeile 118: Zeile 97:
     $url = 'http://' . WIKI_HOST . '/api.php?action=query&list=categorymembers'.
     $url = 'http://' . WIKI_HOST . '/api.php?action=query&list=categorymembers'.
           '&cmtitle=Kategorie:' . urlencode($name) . '&cmlimit=max'.
           '&cmtitle=Kategorie:' . urlencode($name) . '&cmlimit=max'.
           '&cmstartsortkey=0&cmprop=ids|title|type&format=json&cmsort=sortkey';
           '&cmstartsortkey=0&cmprop=ids|title|type&format=json';
      
      
     $continue_token = '';
     $continue_token = '';
Zeile 130: Zeile 109:
         $response = json_decode(file_get_contents($url), true);
         $response = json_decode(file_get_contents($url), true);
          
          
         $continue_token = @$response['continue']['cmcontinue'];
         $continue_token = @$response['query-continue']['categorymembers']['cmcontinue'];
         $cm = array_merge($cm, array_map('extract_data', array_filter($response['query']['categorymembers'], 'is_page')));
         $cm = array_merge($cm, array_map('extract_data', array_filter($response['query']['categorymembers'], 'is_page')));
     } while ($continue_token);
     } while ($continue_token);
Zeile 148: Zeile 127:
# Entfernen von formatnum
# Entfernen von formatnum
function formatnum_r($number) {
function formatnum_r($number) {
     return +intval(str_replace('.', '', $number));
     return +str_replace('.', '', $number);
}
}


Zeile 161: Zeile 140:
      
      
     return $links;
     return $links;
}
# parst npc-typ aus `Typ` Parameter
# bitte nach Vorlage:NPC/Layout vardefine:Typ richten
function get_npc_type($type) {
    $type_clean = strtolower(str_replace('-', '', $type));
    switch ($type_clean) {
        case 'gruppe':
        case 'gruppen':
            $type_clean = 'gruppennpc';
            break;
        case 'unique':
            $type_clean = 'uniquenpc';
            break;
    }
   
    $types = [
        'npc',
        'uniquenpc',
        'gruppennpc',
        'resistenznpc',
        'superresistenznpc'
    ];
   
    if (!in_array($type_clean, $types)) {
        return $types[0];
    } else {
        return $type_clean;
    }
}
}


define('WIKI_HOST', 'fwwiki.de');
define('WIKI_HOST', 'fwwiki.de');
define('CSV_DELIMITER', ';');
define('CSV_DELIMITER', ';');
define('CSV_DELIMITER_INTER', '/');
define('CSV_DELIMITER_INTER', ',');
#  Seiten pro API Abfrage
#  Seiten pro API Abfrage
define('CHUNK_LENGTH', 40);
define('CHUNK_LENGTH', 20);


$npcs = array();
$npcs = array();
Zeile 208: Zeile 158:
     $api = json_decode(file_get_contents($api_url), true);
     $api = json_decode(file_get_contents($api_url), true);
      
      
     /* Wir wollen die ursprüngliche Sortierung von get_cm
     foreach ($api['query']['pages'] as $pageid => $info) {
    * auch in den Seiten aus api.php.
    * array_merge vergibt aber neue Schlüssel wenn diese numerisch sind.
    * Der Union Operator $a1 + $a2 bevorzugt allerdings die Werte von $a1.
    * array_replace ist daher die einzige Variante.
    */
    $pages_sorted = array_replace(array_flip($pages), $api['query']['pages']);
   
    foreach ($pages_sorted as $pageid => $info) {
         $raw = $info['revisions'][0]['*'];
         $raw = $info['revisions'][0]['*'];
          
          
Zeile 223: Zeile 165:
         $base = $base[0];
         $base = $base[0];
          
          
         # unangreifbar
         if (!isset($base['unangreifbar']) || $base['unangreifbar'] == 'none') {
        $unangreifbar = isset($base['unangreifbar']) && $base['unangreifbar'] !== 'none';
            # Name setzen
       
            $name = isset($base['name']) ? $base['name'] : $info['title'];
        # Name setzen
 
        $name = isset($base['name']) ? $base['name'] : $info['title'];
             # Basiseintrag
       
            $base_entry = array(
        # vorkommen
                'name' => $name,
        $vklist = filter_wiki_links($base['Vorkommen']);
                'A' => formatnum_r($base['Stärke']),
       
                'LP' => formatnum_r($base['Lebenspunkte']),
        # felder zu vorkommen
                'XP' => formatnum_r($base['XP']),
        foreach (array_map('parse_template', get_templates('Feld', $raw)) as $field_template) {
                'GM' => formatnum_r($base['Gold']),
             $vklist[] = $field_template[3] . "," . $field_template[4];
                'bild' => trim($base['Bild']),
        }
                'autor' => implode(CSV_DELIMITER_INTER, filter_wiki_links(trim($base['BildAutor']))),
       
                'vklist' => implode(CSV_DELIMITER_INTER, filter_wiki_links($base['Vorkommen'])),
        # Basiseintrag
                'itemlist' => implode(CSV_DELIMITER_INTER, filter_wiki_links($base['Items']))
        $base_entry = array(
            );
            'name' => $name,
            echo implode(CSV_DELIMITER, $base_entry) . "\n";
            'A' => formatnum_r($base['Stärke']),
 
            'LP' => formatnum_r($base['Lebenspunkte']),
            if ($name == "Pironer") {
            'XP' => formatnum_r($base['XP']),
                implode(CSV_DELIMITER_INTER, filter_wiki_links($base['Items']));
            'GM' => formatnum_r($base['Gold']),
            }
            'vklist' => implode(CSV_DELIMITER_INTER, $vklist),
            'itemlist' => implode(CSV_DELIMITER_INTER, filter_wiki_links($base['Items'])),
            'bild' => preg_replace("/(\r)?\n/", " " , $base['Bild']),
            'autor' => $base['BildAutor'],
            'unangreifbar' => (int)$unangreifbar,
            'typ' => get_npc_type($base['Typ'])
        );
        echo implode(CSV_DELIMITER, $base_entry) . "\n";


        # Varianten
            # Varianten
        $variants = array_map('parse_template', get_templates('NPC/Ausnahme', $raw));
            $variants = array_map('parse_template', get_templates('NPC/Ausnahme', $raw));


        # eintragen
            # eintragen
        foreach ($variants as $variant) {
            foreach ($variants as $variant) {
            echo implode(CSV_DELIMITER, array_merge($base_entry, $variant)) . "\n";
                echo implode(CSV_DELIMITER, array_merge($base_entry, $variant)) . "\n";
            }
         }
         }
     }
     }
}
}
</pre>
</pre>

Bitte beachte, dass alle Beiträge zu FreewarWiki von anderen Mitwirkenden bearbeitet, geändert oder gelöscht werden können. Reiche hier keine Texte ein, falls du nicht willst, dass diese ohne Einschränkung geändert werden können.

Du bestätigst hiermit auch, dass du diese Texte selbst geschrieben hast oder diese von einer gemeinfreien Quelle kopiert hast (weitere Einzelheiten unter FreewarWiki:Urheberrechte). ÜBERTRAGE OHNE GENEHMIGUNG KEINE URHEBERRECHTLICH GESCHÜTZTEN INHALTE!

Bitte beantworte die folgende Frage, um diese Seite speichern zu können (weitere Informationen):

Abbrechen Bearbeitungshilfe (wird in einem neuen Fenster geöffnet)

Die folgende Vorlage wird auf dieser Seite verwendet: