From 4d8a4db33854f932d0c32197f1f193516601ba69 Mon Sep 17 00:00:00 2001 From: Zankaria Date: Sun, 11 Aug 2024 16:14:03 +0200 Subject: [PATCH 1/2] api.php: partially modernize the Api class --- inc/api.php | 147 ++++++++++++++++++++++++++++------------------------ 1 file changed, 80 insertions(+), 67 deletions(-) diff --git a/inc/api.php b/inc/api.php index 0dd479ac..11f51fe4 100644 --- a/inc/api.php +++ b/inc/api.php @@ -9,14 +9,51 @@ defined('TINYBOARD') or exit; * Class for generating json API compatible with 4chan API */ class Api { - function __construct(){ - global $config; - /** - * Translation from local fields to fields in 4chan-style API - */ - $this->config = $config; + private bool $show_filename; + private bool $hide_email; + private bool $country_flags; + private array $postFields; - $this->postFields = array( + private const INTS = [ + 'no' => 1, + 'resto' => 1, + 'time' => 1, + 'tn_w' => 1, + 'tn_h' => 1, + 'w' => 1, + 'h' => 1, + 'fsize' => 1, + 'omitted_posts' => 1, + 'omitted_images' => 1, + 'replies' => 1, + 'images' => 1, + 'sticky' => 1, + 'locked' => 1, + 'last_modified' => 1 + ]; + + private const THREADS_PAGE_FIELDS = [ + 'id' => 'no', + 'bump' => 'last_modified' + ]; + + private const FILE_FIELDS = [ + 'thumbheight' => 'tn_h', + 'thumbwidth' => 'tn_w', + 'height' => 'h', + 'width' => 'w', + 'size' => 'fsize' + ]; + + public function __construct() { + global $config; + + // Translation from local fields to fields in 4chan-style API + $this->show_filename = $config['show_filename']; + $this->hide_email = $config['hide_email']; + $this->country_flags = $config['country_flags']; + + $this->postFields = [ 'id' => 'no', 'thread' => 'resto', 'subject' => 'sub', @@ -35,91 +72,64 @@ class Api { 'cycle' => 'cyclical', 'bump' => 'last_modified', 'embed' => 'embed', - ); - - $this->threadsPageFields = array( - 'id' => 'no', - 'bump' => 'last_modified' - ); - - $this->fileFields = array( - 'thumbheight' => 'tn_h', - 'thumbwidth' => 'tn_w', - 'height' => 'h', - 'width' => 'w', - 'size' => 'fsize', - ); + ]; if (isset($config['api']['extra_fields']) && gettype($config['api']['extra_fields']) == 'array'){ $this->postFields = array_merge($this->postFields, $config['api']['extra_fields']); } } - private static $ints = array( - 'no' => 1, - 'resto' => 1, - 'time' => 1, - 'tn_w' => 1, - 'tn_h' => 1, - 'w' => 1, - 'h' => 1, - 'fsize' => 1, - 'omitted_posts' => 1, - 'omitted_images' => 1, - 'replies' => 1, - 'images' => 1, - 'sticky' => 1, - 'locked' => 1, - 'last_modified' => 1 - ); - private function translateFields($fields, $object, &$apiPost) { foreach ($fields as $local => $translated) { - if (!isset($object->$local)) + if (!isset($object->$local)) { continue; + } - $toInt = isset(self::$ints[$translated]); + $toInt = isset(self::INTS[$translated]); $val = $object->$local; - if (isset($this->config['hide_email']) && $this->config['hide_email'] && $local === 'email') { + if ($this->hide_email && $local === 'email') { $val = ''; } if ($val !== null && $val !== '') { $apiPost[$translated] = $toInt ? (int) $val : $val; } - } } private function translateFile($file, $post, &$apiPost) { - $this->translateFields($this->fileFields, $file, $apiPost); + $this->translateFields(self::FILE_FIELDS, $file, $apiPost); $dotPos = strrpos($file->file, '.'); $apiPost['ext'] = substr($file->file, $dotPos); $apiPost['tim'] = substr($file->file, 0, $dotPos); - if (isset($this->config['show_filename']) && $this->config['show_filename']) { + + if ($this->show_filename) { $apiPost['filename'] = @substr($file->name, 0, strrpos($file->name, '.')); - } - else { + } else { $apiPost['filename'] = substr($file->file, 0, $dotPos); } if (isset ($file->hash) && $file->hash) { $apiPost['md5'] = base64_encode(hex2bin($file->hash)); - } - else if (isset ($post->filehash) && $post->filehash) { + } elseif (isset ($post->filehash) && $post->filehash) { $apiPost['md5'] = base64_encode(hex2bin($post->filehash)); } } - private function translatePost($post, $threadsPage = false) { + private function translatePost($post, bool $threadsPage = false) { global $config, $board; - $apiPost = array(); - $fields = $threadsPage ? $this->threadsPageFields : $this->postFields; + + $apiPost = []; + $fields = $threadsPage ? self::THREADS_PAGE_FIELDS : $this->postFields; $this->translateFields($fields, $post, $apiPost); - if (isset($config['poster_ids']) && $config['poster_ids']) $apiPost['id'] = poster_id($post->ip, $post->thread, $board['uri']); - if ($threadsPage) return $apiPost; + if (isset($config['poster_ids']) && $config['poster_ids']) { + $apiPost['id'] = poster_id($post->ip, $post->thread, $board['uri']); + } + if ($threadsPage) { + return $apiPost; + } // Handle country field - if (isset($post->body_nomarkup) && $this->config['country_flags']) { + if (isset($post->body_nomarkup) && $this->country_flags) { $modifiers = extract_modifiers($post->body_nomarkup); if (isset($modifiers['flag']) && isset($modifiers['flag alt']) && preg_match('/^[a-z]{2}$/', $modifiers['flag'])) { $country = strtoupper($modifiers['flag']); @@ -139,12 +149,15 @@ class Api { if (isset($post->files) && $post->files && !$threadsPage) { $file = $post->files[0]; $this->translateFile($file, $post, $apiPost); + if (sizeof($post->files) > 1) { - $extra_files = array(); + $extra_files = []; foreach ($post->files as $i => $f) { - if ($i == 0) continue; - - $extra_file = array(); + if ($i == 0) { + continue; + } + + $extra_file = []; $this->translateFile($f, $post, $extra_file); $extra_files[] = $extra_file; @@ -156,8 +169,8 @@ class Api { return $apiPost; } - function translateThread(Thread $thread, $threadsPage = false) { - $apiPosts = array(); + public function translateThread(Thread $thread, bool $threadsPage = false) { + $apiPosts = []; $op = $this->translatePost($thread, $threadsPage); if (!$threadsPage) $op['resto'] = 0; $apiPosts['posts'][] = $op; @@ -169,16 +182,16 @@ class Api { return $apiPosts; } - function translatePage(array $threads) { - $apiPage = array(); + public function translatePage(array $threads) { + $apiPage = []; foreach ($threads as $thread) { $apiPage['threads'][] = $this->translateThread($thread); } return $apiPage; } - function translateCatalogPage(array $threads, $threadsPage = false) { - $apiPage = array(); + public function translateCatalogPage(array $threads, bool $threadsPage = false) { + $apiPage = []; foreach ($threads as $thread) { $ts = $this->translateThread($thread, $threadsPage); $apiPage['threads'][] = current($ts['posts']); @@ -186,8 +199,8 @@ class Api { return $apiPage; } - function translateCatalog($catalog, $threadsPage = false) { - $apiCatalog = array(); + public function translateCatalog($catalog, bool $threadsPage = false) { + $apiCatalog = []; foreach ($catalog as $page => $threads) { $apiPage = $this->translateCatalogPage($threads, $threadsPage); $apiPage['page'] = $page; From 4f68166870f3e86b064189e56cd8a7e7cedce550 Mon Sep 17 00:00:00 2001 From: fowr Date: Fri, 5 Aug 2022 11:16:53 -0300 Subject: [PATCH 2/2] api.php: using depedency injection instead of globals --- inc/api.php | 10 ++++------ inc/functions.php | 12 ++++++++++-- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/inc/api.php b/inc/api.php index 11f51fe4..16844d32 100644 --- a/inc/api.php +++ b/inc/api.php @@ -45,13 +45,11 @@ class Api { 'size' => 'fsize' ]; - public function __construct() { - global $config; - + public function __construct(bool $show_filename, bool $hide_email, bool $country_flags) { // Translation from local fields to fields in 4chan-style API - $this->show_filename = $config['show_filename']; - $this->hide_email = $config['hide_email']; - $this->country_flags = $config['country_flags']; + $this->show_filename = $show_filename; + $this->hide_email = $hide_email; + $this->country_flags = $country_flags; $this->postFields = [ 'id' => 'no', diff --git a/inc/functions.php b/inc/functions.php index 2cb97c50..c76ca10b 100755 --- a/inc/functions.php +++ b/inc/functions.php @@ -1730,7 +1730,11 @@ function buildIndex($global_api = "yes") { $antibot = null; if ($config['api']['enabled']) { - $api = new Api(); + $api = new Api( + $config['show_filename'], + $config['hide_email'], + $config['country_flags'] + ); $catalog = array(); } @@ -2388,7 +2392,11 @@ function buildThread($id, $return = false, $mod = false) { // json api if ($config['api']['enabled'] && !$mod) { - $api = new Api(); + $api = new Api( + $config['show_filename'], + $config['hide_email'], + $config['country_flags'] + ); $json = json_encode($api->translateThread($thread)); $jsonFilename = $board['dir'] . $config['dir']['res'] . $id . '.json'; file_write($jsonFilename, $json);