Project structure change
This commit is contained in:
parent
bd1642957c
commit
837f126021
29 changed files with 298 additions and 254 deletions
33
app/Cache/JSONCache.php
Normal file
33
app/Cache/JSONCache.php
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
<?php
|
||||
namespace App\Cache;
|
||||
|
||||
class JSONCache {
|
||||
private string $cache_path = __DIR__ . '/../../cache/api';
|
||||
|
||||
function __construct() {
|
||||
if (isset($_ENV['API_CACHE_JSON']) && !empty($_ENV['API_CACHE_JSON'])) {
|
||||
$this->cache_path = $_ENV['API_CACHE_JSON'];
|
||||
}
|
||||
}
|
||||
public function get(string $cache_key): object|false {
|
||||
$filename = $this->cache_path . '/' . $cache_key . '.json';
|
||||
if (is_file($filename)) {
|
||||
$time = time();
|
||||
$json_string = file_get_contents($filename);
|
||||
$element = json_decode($json_string);
|
||||
if ($time < $element->expires) {
|
||||
return $element->data;
|
||||
}
|
||||
// Remove file if expired
|
||||
unlink($filename);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public function set(string $cache_key, mixed $data, $timeout = 3600) {
|
||||
file_put_contents($this->cache_path . '/' . $cache_key . '.json', json_encode([
|
||||
'data' => $data,
|
||||
'expires' => time() + $timeout
|
||||
]));
|
||||
}
|
||||
}
|
||||
33
app/Cache/RedisCache.php
Normal file
33
app/Cache/RedisCache.php
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
<?php
|
||||
namespace App\Cache;
|
||||
|
||||
class RedisCache {
|
||||
private \Redis $client;
|
||||
function __construct(string $host, int $port, ?string $password) {
|
||||
$this->client = new \Redis();
|
||||
if (!$this->client->connect($host, $port)) {
|
||||
throw new \Exception('REDIS: Could not connnect to server');
|
||||
}
|
||||
if ($password) {
|
||||
if (!$this->client->auth($password)) {
|
||||
throw new \Exception('REDIS: Could not authenticate');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function __destruct() {
|
||||
$this->client->close();
|
||||
}
|
||||
|
||||
public function get(string $cache_key): ?object {
|
||||
$data = $this->client->get($cache_key);
|
||||
if ($data) {
|
||||
return json_decode($data);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public function set(string $cache_key, mixed $data, $timeout = 3600) {
|
||||
$this->client->set($cache_key, json_encode($data), $timeout);
|
||||
}
|
||||
}
|
||||
15
app/Controllers/FollowingController.php
Normal file
15
app/Controllers/FollowingController.php
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
<?php
|
||||
namespace App\Controllers;
|
||||
|
||||
use App\Helpers\Following;
|
||||
use App\Helpers\Misc;
|
||||
use App\Models\FollowingTemplate;
|
||||
|
||||
class FollowingController {
|
||||
static public function get() {
|
||||
$users = Following::getUsers();
|
||||
$feed = Following::getAll($users);
|
||||
$latte = Misc::latte();
|
||||
$latte->render(Misc::getView('following'), new FollowingTemplate($users, $feed));
|
||||
}
|
||||
}
|
||||
21
app/Controllers/MusicController.php
Normal file
21
app/Controllers/MusicController.php
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
<?php
|
||||
namespace App\Controllers;
|
||||
|
||||
use App\Helpers\ErrorHandler;
|
||||
use App\Helpers\Misc;
|
||||
use App\Models\FeedTemplate;
|
||||
|
||||
class MusicController {
|
||||
static public function get(string $music_id) {
|
||||
$cursor = Misc::getCursor();
|
||||
|
||||
$api = Misc::api();
|
||||
$feed = $api->getMusicFeed($music_id, $cursor);
|
||||
if ($feed->meta->success) {
|
||||
$latte = Misc::latte();
|
||||
$latte->render(Misc::getView('music'), new FeedTemplate('Music', $feed));
|
||||
} else {
|
||||
ErrorHandler::show($feed->meta);
|
||||
}
|
||||
}
|
||||
}
|
||||
35
app/Controllers/ProxyController.php
Normal file
35
app/Controllers/ProxyController.php
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
<?php
|
||||
namespace App\Controllers;
|
||||
|
||||
class ProxyController {
|
||||
const VALID_TIKTOK_DOMAINS = [
|
||||
"tiktokcdn.com", "tiktokcdn-us.com", "tiktok.com"
|
||||
];
|
||||
|
||||
static private function isValidDomain(string $url) {
|
||||
$host = parse_url($url, PHP_URL_HOST);
|
||||
$host_split = explode('.', $host);
|
||||
return count($host_split) === 3 && in_array($host_split[1] . '.' . $host_split[2], self::VALID_TIKTOK_DOMAINS);
|
||||
}
|
||||
|
||||
static public function stream() {
|
||||
if (!isset($_GET['url'])) {
|
||||
die('You need to send a url!');
|
||||
}
|
||||
|
||||
$url = $_GET['url'];
|
||||
if (!filter_var($url, FILTER_VALIDATE_URL) || !self::isValidDomain($url)) {
|
||||
die('Not a valid URL');
|
||||
}
|
||||
|
||||
if (isset($_GET['download'])) {
|
||||
// Download
|
||||
$downloader = new \Sovit\TikTok\Download();
|
||||
$downloader->url($url, "tiktok-video", 'mp4');
|
||||
} else {
|
||||
// Stream
|
||||
$streamer = new \Sovit\TikTok\Stream();
|
||||
$streamer->stream($url);
|
||||
}
|
||||
}
|
||||
}
|
||||
54
app/Controllers/SettingsController.php
Normal file
54
app/Controllers/SettingsController.php
Normal file
|
|
@ -0,0 +1,54 @@
|
|||
<?php
|
||||
namespace App\Controllers;
|
||||
|
||||
use App\Helpers\Misc;
|
||||
use App\Helpers\Cookies;
|
||||
use App\Helpers\Following;
|
||||
use App\Models\SettingsTemplate;
|
||||
|
||||
class SettingsController {
|
||||
static public function index() {
|
||||
$latte = Misc::latte();
|
||||
$latte->render(Misc::getView('settings'), new SettingsTemplate());
|
||||
}
|
||||
|
||||
static public function proxy() {
|
||||
if (in_array(Cookies::PROXY, $_POST)) {
|
||||
foreach (Cookies::PROXY as $proxy_element) {
|
||||
Cookies::set($proxy_element, $_POST[$proxy_element]);
|
||||
}
|
||||
}
|
||||
http_response_code(302);
|
||||
$url = Misc::env('APP_URL', '');
|
||||
header("Location: {$url}");
|
||||
}
|
||||
|
||||
static public function following() {
|
||||
$following = Following::getUsers();
|
||||
if (!isset($_POST['mode']) || empty($_POST['mode'])) {
|
||||
die('You need to send a mode');
|
||||
}
|
||||
|
||||
switch ($_POST['mode']) {
|
||||
case 'add':
|
||||
// Add following
|
||||
array_push($following, $_POST['account']);
|
||||
break;
|
||||
case 'remove':
|
||||
// Remove following
|
||||
$index = array_search($_POST['account'], $following);
|
||||
if ($index !== false) {
|
||||
unset($following[$index]);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
// Invalid
|
||||
die('Invalid mode');
|
||||
}
|
||||
|
||||
// Build string
|
||||
$following_string = implode(',', $following);
|
||||
Cookies::set('following', $following_string);
|
||||
header('Location: ../settings');
|
||||
}
|
||||
}
|
||||
32
app/Controllers/TagController.php
Normal file
32
app/Controllers/TagController.php
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
<?php
|
||||
namespace App\Controllers;
|
||||
|
||||
use App\Helpers\ErrorHandler;
|
||||
use App\Helpers\Misc;
|
||||
use App\Helpers\RSS;
|
||||
use App\Models\FeedTemplate;
|
||||
|
||||
class TagController {
|
||||
static public function get(string $name) {
|
||||
$cursor = Misc::getCursor();
|
||||
$api = Misc::api();
|
||||
$feed = $api->getChallengeFeed($name, $cursor);
|
||||
if ($feed->meta->success) {
|
||||
$latte = Misc::latte();
|
||||
$latte->render(Misc::getView('tag'), new FeedTemplate('Tag', $feed));
|
||||
} else {
|
||||
ErrorHandler::show($feed->meta);
|
||||
}
|
||||
}
|
||||
|
||||
static public function rss(string $name) {
|
||||
$api = Misc::api();
|
||||
$feed = $api->getChallengeFeed($name);
|
||||
if ($feed->meta->success) {
|
||||
$feed = RSS::build("/tag/{$name}", "{$name} Tag", $feed->info->detail->challenge->desc, $feed->items);
|
||||
// Setup headers
|
||||
RSS::setHeaders('tag.rss');
|
||||
echo $feed;
|
||||
}
|
||||
}
|
||||
}
|
||||
32
app/Controllers/TrendingController.php
Normal file
32
app/Controllers/TrendingController.php
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
<?php
|
||||
namespace App\Controllers;
|
||||
|
||||
use App\Helpers\Misc;
|
||||
use App\Models\FeedTemplate;
|
||||
use App\Helpers\ErrorHandler;
|
||||
use App\Helpers\RSS;
|
||||
|
||||
class TrendingController {
|
||||
static public function get() {
|
||||
$cursor = Misc::getCursor();
|
||||
$api = Misc::api();
|
||||
$feed = $api->getTrendingFeed($cursor);
|
||||
if ($feed->meta->success) {
|
||||
$latte = Misc::latte();
|
||||
$latte->render(Misc::getView('trending'), new FeedTemplate('Trending', $feed));
|
||||
} else {
|
||||
ErrorHandler::show($feed->meta);
|
||||
}
|
||||
}
|
||||
|
||||
static public function rss() {
|
||||
$api = Misc::api();
|
||||
$feed = $api->getTrendingFeed();
|
||||
if ($feed->meta->success) {
|
||||
$feed = RSS::build('/trending', 'Trending', 'Tiktok trending', $feed->items);
|
||||
// Setup headers
|
||||
RSS::setHeaders('trending.rss');
|
||||
echo $feed;
|
||||
}
|
||||
}
|
||||
}
|
||||
36
app/Controllers/UserController.php
Normal file
36
app/Controllers/UserController.php
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
<?php
|
||||
namespace App\Controllers;
|
||||
|
||||
use App\Helpers\ErrorHandler;
|
||||
use App\Helpers\Misc;
|
||||
use App\Helpers\RSS;
|
||||
use App\Models\FeedTemplate;
|
||||
|
||||
class UserController {
|
||||
static public function get(string $username) {
|
||||
$cursor = Misc::getCursor();
|
||||
$api = Misc::api();
|
||||
$feed = $api->getUserFeed($username, $cursor);
|
||||
if ($feed->meta->success) {
|
||||
if ($feed->info->detail->user->privateAccount) {
|
||||
http_response_code(400);
|
||||
echo 'Private account detected! Not supported';
|
||||
}
|
||||
$latte = Misc::latte();
|
||||
$latte->render(Misc::getView('user'), new FeedTemplate($feed->info->detail->user->nickname, $feed));
|
||||
} else {
|
||||
ErrorHandler::show($feed->meta);
|
||||
}
|
||||
}
|
||||
|
||||
static public function rss(string $username) {
|
||||
$api = Misc::api();
|
||||
$feed = $api->getUserFeed($username);
|
||||
if ($feed->meta->success) {
|
||||
$feed = RSS::build('/@'.$username, $feed->info->detail->user->nickname, $feed->info->detail->user->signature, $feed->items);
|
||||
// Setup headers
|
||||
RSS::setHeaders('user.rss');
|
||||
echo $feed;
|
||||
}
|
||||
}
|
||||
}
|
||||
19
app/Controllers/VideoController.php
Normal file
19
app/Controllers/VideoController.php
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
<?php
|
||||
namespace App\Controllers;
|
||||
|
||||
use App\Helpers\ErrorHandler;
|
||||
use App\Helpers\Misc;
|
||||
use App\Models\ItemTemplate;
|
||||
|
||||
class VideoController {
|
||||
static public function get(string $video_id) {
|
||||
$api = Misc::api();
|
||||
$item = $api->getVideoByID($video_id);
|
||||
if ($item->meta->success) {
|
||||
$latte = Misc::latte();
|
||||
$latte->render(Misc::getView('video'), new ItemTemplate($item->info->detail->user->nickname, $item));
|
||||
} else {
|
||||
ErrorHandler::show($item->meta);
|
||||
}
|
||||
}
|
||||
}
|
||||
21
app/Helpers/Cookies.php
Normal file
21
app/Helpers/Cookies.php
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
<?php
|
||||
namespace App\Helpers;
|
||||
|
||||
class Cookies {
|
||||
const PROXY = ['proxy-host', 'proxy-port', 'proxy-username', 'proxy-password'];
|
||||
|
||||
static public function get(string $name): string {
|
||||
if (isset($_COOKIE[$name]) && !empty($_COOKIE[$name])) {
|
||||
return $_COOKIE[$name];
|
||||
}
|
||||
return '';
|
||||
}
|
||||
|
||||
static public function exists(string $name): bool {
|
||||
return isset($_COOKIE[$name]);
|
||||
}
|
||||
|
||||
static public function set(string $name, string $value) {
|
||||
setcookie($name, $value, time()+60*60*24*30, '/', '', isset($_SERVER['HTTPS']), true);
|
||||
}
|
||||
};
|
||||
10
app/Helpers/ErrorHandler.php
Normal file
10
app/Helpers/ErrorHandler.php
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
<?php
|
||||
namespace App\Helpers;
|
||||
|
||||
class ErrorHandler {
|
||||
static public function show(object $meta) {
|
||||
http_response_code($meta->http_code);
|
||||
$latte = Misc::latte();
|
||||
$latte->render(Misc::getView('error'), ['error' => $meta]);
|
||||
}
|
||||
}
|
||||
37
app/Helpers/Following.php
Normal file
37
app/Helpers/Following.php
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
<?php
|
||||
namespace App\Helpers;
|
||||
|
||||
class Following {
|
||||
static public function getUsers (): array {
|
||||
$following_string = Cookies::get('following');
|
||||
if ($following_string) {
|
||||
return explode(',', $following_string);
|
||||
}
|
||||
return [];
|
||||
}
|
||||
|
||||
static public function getAll (array $users): object {
|
||||
$allowed_items_total = isset($_GET['max']) && is_numeric($_GET['max']) && $_GET['max'] <= 100 ? $_GET['max'] : 20;
|
||||
$items = [];
|
||||
if (count($users) !== 0) {
|
||||
$api = Misc::api();
|
||||
$max_items_per_user = $allowed_items_total / count($users);
|
||||
foreach ($users as $user) {
|
||||
$user_feed = $api->getUserFeed($user);
|
||||
if ($user_feed) {
|
||||
$max = count($user_feed->items) > $max_items_per_user ? $max_items_per_user : count($user_feed->items);
|
||||
for ($i = 0; $i < $max; $i++) {
|
||||
$item = $user_feed->items[$i];
|
||||
array_push($items, $item);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$feed = (object) [
|
||||
'items' => $items,
|
||||
'hasMore' => false
|
||||
];
|
||||
return $feed;
|
||||
}
|
||||
};
|
||||
107
app/Helpers/Misc.php
Normal file
107
app/Helpers/Misc.php
Normal file
|
|
@ -0,0 +1,107 @@
|
|||
<?php
|
||||
namespace App\Helpers;
|
||||
|
||||
use Exception;
|
||||
use App\Cache\JSONCache;
|
||||
use App\Cache\RedisCache;
|
||||
|
||||
class Misc {
|
||||
static public function getCursor(): int {
|
||||
return isset($_GET['cursor']) && is_numeric($_GET['cursor']) ? (int) $_GET['cursor'] : 0;
|
||||
}
|
||||
|
||||
static public function getURL(): string {
|
||||
return self::env('APP_URL', '');
|
||||
}
|
||||
|
||||
static public function env(string $key, mixed $default_value): string {
|
||||
return isset($_ENV[$key]) && !empty($_ENV[$key]) ? $_ENV[$key] : $default_value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns absolute path for view
|
||||
*/
|
||||
static public function getView(string $template): string {
|
||||
return __DIR__ . "/../../views/{$template}.latte";
|
||||
}
|
||||
|
||||
/**
|
||||
* Setup of TikTok Api wrapper
|
||||
*/
|
||||
static public function api(): \Sovit\TikTok\Api {
|
||||
$options = [];
|
||||
$cacheEngine = false;
|
||||
// Proxy config
|
||||
foreach(Cookies::PROXY as $proxy_element) {
|
||||
if (isset($_COOKIE[$proxy_element])) {
|
||||
$options['proxy'][$proxy_element] = $_COOKIE[$proxy_element];
|
||||
}
|
||||
}
|
||||
// Cache config
|
||||
if (isset($_ENV['API_CACHE'])) {
|
||||
switch ($_ENV['API_CACHE']) {
|
||||
case 'json':
|
||||
$cacheEngine = new JSONCache();
|
||||
break;
|
||||
case 'redis':
|
||||
if (!isset($_ENV['REDIS_URL'])) {
|
||||
throw new Exception('You need to set REDIS_URL to use Redis Cache!');
|
||||
}
|
||||
|
||||
$url = parse_url($_ENV['REDIS_URL']);
|
||||
$host = $url['host'];
|
||||
$port = $url['port'];
|
||||
$password = $url['pass'] ?? null;
|
||||
$cacheEngine = new RedisCache($host, $port, $password);
|
||||
break;
|
||||
}
|
||||
}
|
||||
$api = new \Sovit\TikTok\Api($options, $cacheEngine);
|
||||
return $api;
|
||||
}
|
||||
|
||||
/**
|
||||
* Setup of Latte template engine
|
||||
*/
|
||||
static public function latte(): \Latte\Engine {
|
||||
// Workaround to avoid weird path issues
|
||||
$url = self::getURL();
|
||||
$latte = new \Latte\Engine;
|
||||
$cache_path = self::env('LATTE_CACHE', __DIR__ . '/../../cache/latte');
|
||||
$latte->setTempDirectory($cache_path);
|
||||
|
||||
// -- CUSTOM FUNCTIONS -- //
|
||||
// Import assets
|
||||
$latte->addFunction('assets', function (string $name, string $type) use ($url) {
|
||||
$path = "{$url}/{$type}/{$name}";
|
||||
return $path;
|
||||
});
|
||||
// Get base URL
|
||||
$latte->addFunction('path', function (string $path = '') use ($url) {
|
||||
return "{$url}/{$path}";
|
||||
});
|
||||
// Version being used
|
||||
$latte->addFunction('version', function () {
|
||||
return \Composer\InstalledVersions::getVersion('pablouser1/proxitok');
|
||||
});
|
||||
// https://stackoverflow.com/a/36365553
|
||||
$latte->addFunction('number', function (int $x) {
|
||||
if($x > 1000) {
|
||||
$x_number_format = number_format($x);
|
||||
$x_array = explode(',', $x_number_format);
|
||||
$x_parts = array('K', 'M', 'B', 'T');
|
||||
$x_count_parts = count($x_array) - 1;
|
||||
$x_display = $x;
|
||||
$x_display = $x_array[0] . ((int) $x_array[1][0] !== 0 ? '.' . $x_array[1][0] : '');
|
||||
$x_display .= $x_parts[$x_count_parts - 1];
|
||||
return $x_display;
|
||||
}
|
||||
return $x;
|
||||
});
|
||||
$latte->addFunction('size', function (string $url) {
|
||||
$download = new \Sovit\TikTok\Download();
|
||||
return $download->file_size($url);
|
||||
});
|
||||
return $latte;
|
||||
}
|
||||
}
|
||||
40
app/Helpers/RSS.php
Normal file
40
app/Helpers/RSS.php
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
<?php
|
||||
namespace App\Helpers;
|
||||
|
||||
use \Bhaktaraz\RSSGenerator\Feed;
|
||||
use \Bhaktaraz\RSSGenerator\Channel;
|
||||
use \Bhaktaraz\RSSGenerator\Item;
|
||||
use \Sovit\TikTok\Download;
|
||||
|
||||
class RSS {
|
||||
static public function build (string $endpoint, string $title, string $description, array $items): Feed {
|
||||
$url = Misc::env('APP_URL', '');
|
||||
$download = new Download();
|
||||
$rss_feed = new Feed();
|
||||
$rss_channel = new Channel();
|
||||
$rss_channel
|
||||
->title($title)
|
||||
->description($description)
|
||||
->url($url . $endpoint)
|
||||
->atomLinkSelf($url . $endpoint . '/rss')
|
||||
->appendTo($rss_feed);
|
||||
foreach ($items as $item) {
|
||||
$rss_item = new Item();
|
||||
$video = $item->video->playAddr;
|
||||
$rss_item
|
||||
->title($item->desc)
|
||||
->description($item->desc)
|
||||
->url($url . '/video/' . $item->id)
|
||||
->pubDate((int)$item->createTime)
|
||||
->guid($item->id, false)
|
||||
->enclosure($url . '/stream?url=' . urlencode($video), $download->file_size($video), 'video/mp4')
|
||||
->appendTo($rss_channel);
|
||||
}
|
||||
return $rss_feed;
|
||||
}
|
||||
|
||||
static public function setHeaders (string $filename) {
|
||||
header('Content-Type: application/rss+xml');
|
||||
header('Content-Disposition: attachment; filename="' . $filename . '"');
|
||||
}
|
||||
}
|
||||
14
app/Models/BaseTemplate.php
Normal file
14
app/Models/BaseTemplate.php
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
<?php
|
||||
namespace App\Models;
|
||||
|
||||
/**
|
||||
* Base for all templates, needs a Title to set
|
||||
*/
|
||||
class BaseTemplate {
|
||||
public string $title;
|
||||
public string $version;
|
||||
|
||||
function __construct(string $title) {
|
||||
$this->title = $title;
|
||||
}
|
||||
}
|
||||
14
app/Models/FeedTemplate.php
Normal file
14
app/Models/FeedTemplate.php
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
<?php
|
||||
namespace App\Models;
|
||||
|
||||
/**
|
||||
* Base for templates with a feed
|
||||
*/
|
||||
class FeedTemplate extends BaseTemplate {
|
||||
public object $feed;
|
||||
|
||||
function __construct(string $title, object $feed) {
|
||||
parent::__construct($title);
|
||||
$this->feed = $feed;
|
||||
}
|
||||
}
|
||||
14
app/Models/FollowingTemplate.php
Normal file
14
app/Models/FollowingTemplate.php
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
<?php
|
||||
namespace App\Models;
|
||||
|
||||
/**
|
||||
* Exclusive for /following
|
||||
*/
|
||||
class FollowingTemplate extends FeedTemplate {
|
||||
public array $following;
|
||||
|
||||
function __construct(array $following, object $feed) {
|
||||
parent::__construct('Following', $feed);
|
||||
$this->following = $following;
|
||||
}
|
||||
}
|
||||
14
app/Models/ItemTemplate.php
Normal file
14
app/Models/ItemTemplate.php
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
<?php
|
||||
namespace App\Models;
|
||||
|
||||
/**
|
||||
* Base for templates with item (only /video at the time)
|
||||
*/
|
||||
class ItemTemplate extends BaseTemplate {
|
||||
public object $item;
|
||||
|
||||
function __construct(string $title, object $item) {
|
||||
parent::__construct($title);
|
||||
$this->item = $item;
|
||||
}
|
||||
}
|
||||
19
app/Models/SettingsTemplate.php
Normal file
19
app/Models/SettingsTemplate.php
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
<?php
|
||||
namespace App\Models;
|
||||
|
||||
use App\Helpers\Cookies;
|
||||
use App\Helpers\Following;
|
||||
|
||||
/**
|
||||
* Exclusive for /settings
|
||||
*/
|
||||
class SettingsTemplate extends BaseTemplate {
|
||||
public array $proxy_elements = [];
|
||||
public array $following = [];
|
||||
|
||||
function __construct() {
|
||||
parent::__construct('Settings');
|
||||
$this->proxy_elements = Cookies::PROXY;
|
||||
$this->following = Following::getUsers();
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue