diff --git a/themes/hugo-mastodon-comments/static/comments/getcomments.php b/themes/hugo-mastodon-comments/static/comments/getcomments.php index 206f0fe..ff4036f 100644 --- a/themes/hugo-mastodon-comments/static/comments/getcomments.php +++ b/themes/hugo-mastodon-comments/static/comments/getcomments.php @@ -5,10 +5,12 @@ $instance = $config['mastodon-instance']; $uid = $config['user-id']; $searchurl = $config['search-url']; $search = isset($_GET['search']) ? $_GET['search'] : ''; -$debug_on = true; +$debug_on = $config['debug']; /* cache files */ $dbt = "cache-toots.json"; +$timestamp = time(); + /* Exit if search empty */ if (empty($search)) { debug("No proper search given"); @@ -65,7 +67,57 @@ function analyzeToot($instance, $id, $searchurl) { return(""); } } +/* of context, extract the interesting bits */ +function filterComments($descendants, $root, &$result) { + foreach ($descendants as $d) { + $result['comments'][$d['id']] = [ + 'author' => [ + 'display_name' => $d['account']['display_name'] ? $d['account']['display_name'] : $d['account']['username'], + 'avatar' => $d['account']['avatar_static'], + 'url' => $d['account']['url'] + ], + 'toot' => $d['content'], + 'date' => $d['created_at'], + 'url' => $d['uri'], + 'reply_to' => $d['in_reply_to_id'], + 'root' => $root, + ]; + } + return $result; +} +/* get /context of toot */ +function tootContext($instance, $id, &$result) { + $raw = file_get_contents("$instance/api/v1/statuses/$id/context"); + $json = json_decode($raw, true); + filterComments($json['descendants'], $id, $result); +} +/* extract stats info from toot */ +function filterStats($stats) { + $result = [ + 'reblogs' => (int)$stats['reblogs_count'], + 'favs' => (int)$stats['favourites_count'], + 'replies' => (int)$stats['replies_count'], + 'url' => $stats['url'] + ]; + return $result; +} +/* for toot, extract interesting statistics */ +function tootStats($instance, $id, &$result) { + debug("Checking ID $id"); + $raw = file_get_contents("$instance/api/v1/statuses/$id"); + $json = json_decode($raw, true); + $newStats = filterStats($json); + $result['stats']['reblogs'] += $newStats['reblogs']; + $result['stats']['favs'] += $newStats['favs']; + $result['stats']['replies'] += $newStats['replies']; + if (empty($result['stats']['url'])) { + $result['stats']['url'] = $newStats['url']; + } +} +/*************** + * START PROGRAM + ***************/ /* Collect all the toots */ /* get id of latest cached toot, and set as $min_id */ @@ -86,6 +138,7 @@ $uptodate = false; while ($uptodate === false) { $toots = array_merge(collectToots($instance, $uid, $min_id, $searchurl), $toots); $min_id_new = $toots['0']['id']; // the latest ID of the recent search + if ($min_id_new === $min_id) { // min_id is the latest, let's write the new DB and end this loop $uptodate = true; @@ -98,71 +151,25 @@ while ($uptodate === false) { } } +/* prepare $result array */ +$result = ['comments' => [], 'stats' => ['reblogs' => 0, 'favs' => 0, 'replies' => 0, 'url' => '', 'root' => 0]]; + /* check if URL from $search exists in $toots */ -// if multiple exist, take the oldest one (highest array position) $id = array_keys(array_column($toots, 'url'), strtolower($search)); if (empty($id)) { debug("Blog URL \"$search\" has not been found"); die(); +} else { + // if multiple exist, take the oldest one (highest array position) + $id = $toots[end($id)]['id']; + + /* Extract comments and stats from toot */ + tootContext($instance, $id, $result); + tootStats($instance, $id, $result); + // FIXME: At the moment the API doesn't return the correct replies count so I count it manually + $result['stats']['replies'] = count($result['comments']); + $result['stats']['root'] = $id; } -$id = $toots[end($id)]['id']; - -/* Extract comments and stats from toot */ -$result = ['comments' => [], 'stats' => ['reblogs' => 0, 'favs' => 0, 'replies' => 0, 'url' => '', 'root' => 0]]; - -function filterComments($descendants, $root, &$result) { - foreach ($descendants as $d) { - $result['comments'][$d['id']] = [ - 'author' => [ - 'display_name' => $d['account']['display_name'] ? $d['account']['display_name'] : $d['account']['username'], - 'avatar' => $d['account']['avatar_static'], - 'url' => $d['account']['url'] - ], - 'toot' => $d['content'], - 'date' => $d['created_at'], - 'url' => $d['uri'], - 'reply_to' => $d['in_reply_to_id'], - 'root' => $root, - ]; - } - return $result; -} - -function tootContext($instance, $id, &$result) { - $raw = file_get_contents("$instance/api/v1/statuses/$id/context"); - $json = json_decode($raw, true); - filterComments($json['descendants'], $id, $result); -} - -function filterStats($stats) { - $result = [ - 'reblogs' => (int)$stats['reblogs_count'], - 'favs' => (int)$stats['favourites_count'], - 'replies' => (int)$stats['replies_count'], - 'url' => $stats['url'] - ]; - return $result; -} - -function tootStats($instance, $id, &$result) { - debug("Checking ID $id"); - $raw = file_get_contents("$instance/api/v1/statuses/$id"); - $json = json_decode($raw, true); - $newStats = filterStats($json); - $result['stats']['reblogs'] += $newStats['reblogs']; - $result['stats']['favs'] += $newStats['favs']; - $result['stats']['replies'] += $newStats['replies']; - if (empty($result['stats']['url'])) { - $result['stats']['url'] = $newStats['url']; - } -} - -// FIXME: At the moment the API doesn't return the correct replies count so I count it manually -$result['stats']['replies'] = count($result['comments']); -$result['stats']['root'] = $id; -tootContext($instance, $id, $result); -tootStats($instance, $id, $result); - // headers for not caching the results header('Cache-Control: no-cache, must-revalidate');