OSDN Git Service

[feature]新着RSSの死因の記述を詳細化
authorHabu <habu@users.sourceforge.jp>
Fri, 30 Mar 2018 11:32:13 +0000 (20:32 +0900)
committerHabu <habu@users.sourceforge.jp>
Fri, 30 Mar 2018 11:32:13 +0000 (20:32 +0900)
score/dump_file.inc
score/feed_maker.inc

index 526009d..c89bd47 100644 (file)
@@ -3,6 +3,7 @@ class DumpFile
 {
     public function __construct($score_id) {
         $this->score_id = $score_id;
+        $this->dump_lines = NULL;
     }
 
 
@@ -77,20 +78,41 @@ class DumpFile
 
 
     /**
+     * キャラクタダンプを配列に読み込む
+     * 読み込んだ配列はメンバ変数dump_linesに格納
+     *
+     * @return boolean 読み込みに成功した場合TRUE、失敗した場合FALSE
+     */
+    public function readlines()
+    {
+        if ($this->dump_lines !== NULL) {
+            return TRUE;
+        }
+
+        $lines = gzfile($this->get_filename('dumps', 'txt'));
+        if ($lines !== FALSE) {
+            $this->dump_lines = $lines;
+            return TRUE;
+        }
+
+        return FALSE;
+    }
+
+
+    /**
      * キャラクタダンプの死ぬ直前のメッセージもしくは勝利メッセージを取得する
      *
      * @return array 死ぬ直前のメッセージもしくは勝利メッセージを1行1要素にした文字列の配列
      */
     public function get_last_message()
     {
-        $zp = gzopen($this->get_filename('dumps', 'txt'), 'r');
-        if ($zp === FALSE) return [];
+        if ($this->readlines() === FALSE) {
+            return [];
+        }
 
         $in_message = FALSE;
         $result = [];
-        while (!gzeof($zp)) {
-            $line = gzgets($zp);
-
+        foreach ($this->dump_lines as $line) {
             if (preg_match('/^\s*\[(.*)\]\s*$/u', $line, $matches)) {
                 if ($matches[1] == '*勝利*メッセージ' ||
                     $matches[1] == '死ぬ直前のメッセージ') {
@@ -109,6 +131,28 @@ class DumpFile
         return $result;
     }
 
+
+    /**
+     * キャラクタダンプから死因の詳細を得る
+     *
+     * @return string 死因の詳細を表す文字列
+     */
+    public function get_death_reason_detail()
+    {
+        if ($this->readlines() === FALSE) {
+            return FALSE;
+        }
+
+        $death_reason_lines = array_slice($this->dump_lines, 30, 3);
+        $death_reason = implode("", array_map('trim', $death_reason_lines));
+
+        if (preg_match("/^…あなたは、?(.+)。/u", $death_reason, $matches)) {
+            return $matches[1];
+        } else {
+            return FALSE;
+        }
+    }
+
     private static function browser_accept_encodings()
     {
         $accept_encoding = filter_input(INPUT_SERVER, 'HTTP_ACCEPT_ENCODING');
index 8a2cc51..8e3a1a7 100644 (file)
@@ -1,5 +1,6 @@
 <?php
 
+require_once 'common.inc';
 require_once 'dump_file.inc';
 require_once 'FeedWriter/vendor/autoload.php';
 
@@ -36,16 +37,21 @@ class FeedMaker
         foreach ($search_result['scores'] as $s) {
             $item = $feed->createNewItem();
 
+            $dump_file = new DumpFile($s['score_id']);
+            $death_reason_detail = $dump_file->get_death_reason_detail();
+            if ($death_reason_detail === FALSE) {
+                $death_reason_detail = "{$s['death_reason']} @{$s['depth']}F";
+            }
+
             $dump_url = "${base_url}/show_dump.php?score_id={$s['score_id']}";
-            $item->setTitle("{$s['personality_name']}{$s['name']} Score:{$s['score']} {$s['race_name']} {$s['class_name']} {$s['death_reason']} @{$s['depth']}F");
+            $item->setTitle("{$s['personality_name']}{$s['name']} Score:{$s['score']} {$s['race_name']} {$s['class_name']} {$death_reason_detail}");
             $item->setLink($dump_url);
             $item->setDate($s['date']);
 
-            $dump_file = new DumpFile($s['score_id']);
             $contents = implode(
                 '',
                 array_map(function ($v) {
-                    return htmlentities($v).'<br>';
+                    return h($v).'<br>';
                 }, $dump_file->get_last_message())
             );
             $item->setContent($contents);