diff --git a/autoload.php b/autoload.php
new file mode 100644
index 0000000..aeb5fcf
--- /dev/null
+++ b/autoload.php
@@ -0,0 +1,97 @@
+setSafeMode(true);
+
+// HTML-Purifier
+require_once ps(__DIR__ . $config["path"]["htmlpurifier"] . "/HTMLPurifier.auto.php");
+$purifier = new HTMLPurifier(HTMLPurifier_Config::createDefault());
+
+// PHPMailer
+use PHPMailer\PHPMailer\PHPMailer;
+use PHPMailer\PHPMailer\Exception;
+
+require_once ps(__DIR__ . $config["path"]["phpmailer"] . "/Exception.php");
+require_once ps(__DIR__ . $config["path"]["phpmailer"] . "/PHPMailer.php");
+require_once ps(__DIR__ . $config["path"]["phpmailer"] . "/SMTP.php");
+
+$mailer = new PHPMailer(true);
+
+// Smarty
+require_once ps(__DIR__ . $config["path"]["smarty"] . "/Smarty.class.php");
+$smarty = new Smarty();
+$smarty->setTemplateDir(ps(__DIR__ . $config["smarty"]["template"] . "/" . $usertheme));
+$smarty->setConfigDir(ps(__DIR__ . $config["smarty"]["config"]));
+$smarty->setCompileDir(ps(__DIR__ . $config["smarty"]["compile"]));
+$smarty->setCacheDir(ps(__DIR__ . $config["smarty"]["cache"]));
+
+// Getting all plugins for the Theme
+require ps(__DIR__ . $config["smarty"]["template"] . "/{$usertheme}/info.php");
+foreach ($theme["plugins"] as $reqPlugin) {
+ if (!file_exists(ps(__DIR__ . $config["path"]["plugins"] . "/enabled/" . $reqPlugin . ".php")))
+ die("This theme requires following plugin to be enabled: " . $reqPlugin);
+ require_once ps(__DIR__ . $config["path"]["plugins"] . "/enabled/" . $reqPlugin . ".php");
+}
+
+// Plugins (Legacy)
+// $plugins = glob(ps(__DIR__ . $config["path"]["plugins"] . "/enabled/*.php"));
+// foreach ($plugins as $plugin) {
+// require_once $plugin;
+// }
+
+// And finally
+$usertheme = getUserTheme($logged, $user["theme"] ?? "");
+$userlang = getUserLang($logged, $user["lang"] ?? "");
+$preflang = getPrefLang();
+require ps(__DIR__ . $config["smarty"]["template"] . "/{$usertheme}/info.php");
+require ps(__DIR__ . $config["path"]["langs"] . "/{$userlang}.php");
+
+visit();
+
+$smarty->assign("config", $config);
+$smarty->assign("lang", $lang);
+$smarty->assign("theme", $theme);
+$smarty->assign("userlang", $userlang);
+$smarty->assign("usertheme", $usertheme);
+$smarty->assign("version", file_get_contents(ps(__DIR__ . "/version.txt")));
+$smarty->assign("logged", $logged);
+$smarty->assign("user", $user);
+$smarty->assign("preflang", $preflang);
diff --git a/config.php b/config.php
new file mode 100644
index 0000000..8288454
--- /dev/null
+++ b/config.php
@@ -0,0 +1,81 @@
+ true,
+ "cache_lifetime" => null,
+ "timeout" => false, // deprecated! Set it to false!
+ "primary_key" => "id",
+ "search" => array(
+ "min_length" => 2,
+ "mode" => "or",
+ "score_key" => "scoreKey"
+ ),
+ "folder_permissions" => 0777
+);
+
+// MaxFileSize (in Bytes, visit https://www.gbmb.org/mb-to-bytes for help)
+$config["mfs"]["cover"] = 5242880; // 5MB
+$config["mfs"]["chapter"] = 52428800; // 50MB
+
+// Default-Variablen
+$config["default"]["theme"] = "nucleus";
+$config["default"]["lang"] = "en";
+$config["default"]["avatar"] = "https://rav.h33t.moe/data/8c4f8647-4bec-420e-96e0-284125793baf.jpeg";
+
+// Captcha
+$config["captcha"]["enabled"] = false;
+$config["captcha"]["type"] = "hcaptcha"; // "hcaptcha"
+$config["captcha"]["hcaptcha"]["secret"] = "";
+$config["captcha"]["hcaptcha"]["sitekey"] = "";
+
+// Themes and Languages
+$config["themes"] = array(
+ "nucleus" => "Nucleus"
+);
+$config["langs"] = array(
+ "en" => "English",
+);
+
+// Avatars
+$config["avatars"] = array(
+ "https://rav.h33t.moe/data/8c4f8647-4bec-420e-96e0-284125793baf.jpeg",
+ "https://rav.h33t.moe/data/cf39f370-73f9-4428-bc65-136e1d509cc9.jpeg",
+ "https://rav.shishnet.org/af4cf8aadc45565bbeecb0ced4857ed5.jpeg",
+ "https://rav.shishnet.org/4f054d8a364b1cb658a458df687621c6.jpeg",
+ "https://rav.shishnet.org/21e78a09e342964a8c7ce20e410697d0.jpeg",
+ "https://rav.shishnet.org/436e8788f8ed655e9c74c54dc9947d00.jpeg",
+ "https://rav.shishnet.org/3737e6629146ba78fb4a84284357802a.gif",
+ "https://rav.shishnet.org/c6bbc472ba1ec7012620ac0c1b35491a.gif",
+);
+
+// X elements per page for pagination
+$config["perpage"]["titles"] = 25;
+$config["perpage"]["chapters"] = 36;
+
+$config["path"]["sleek"] = "/software/SleekDB";
+$config["path"]["parsedown"] = "/software";
+$config["path"]["langs"] = "/library/langs";
+$config["path"]["htmlpurifier"] = "/software/HTMLPurifier";
+$config["path"]["smarty"] = "/software/Smarty";
+$config["path"]["plugins"] = "/library/plugins";
+$config["path"]["phpmailer"] = "/software/PHPMailer";
+$config["path"]["imagescrambler"] = "/software";
+
+// Diese Software nutzt Smarty als Template-Engine. Dokumentation: https://smarty-php.github.io/smarty/
+$config["smarty"]["template"] = "/library/themes";
+$config["smarty"]["config"] = "/software/Smarty/config";
+$config["smarty"]["compile"] = "/software/Smarty/compile";
+$config["smarty"]["cache"] = "/software/Smarty/cache";
diff --git a/custom/format.json b/custom/format.json
new file mode 100644
index 0000000..bb6705c
--- /dev/null
+++ b/custom/format.json
@@ -0,0 +1,15 @@
+[
+ "4-Koma",
+ "Adaption",
+ "Anthology",
+ "Award Winning",
+ "Doujinshi",
+ "Fan Colored",
+ "Fan Color",
+ "Full Color",
+ "Long Strip",
+ "Official Colored",
+ "Oneshot",
+ "User Created",
+ "Web Comic"
+]
diff --git a/custom/genre.json b/custom/genre.json
new file mode 100644
index 0000000..e1c6421
--- /dev/null
+++ b/custom/genre.json
@@ -0,0 +1,27 @@
+[
+ "Action",
+ "Adventure",
+ "Boys' Love",
+ "Comedy",
+ "Crime",
+ "Drama",
+ "Fantasy",
+ "Girls' Love",
+ "Historical",
+ "Horror",
+ "Isekai",
+ "Magical Girls",
+ "Mecha",
+ "Medical",
+ "Mystery",
+ "Philosophical",
+ "Psychological",
+ "Romance",
+ "Sci-Fi",
+ "Slice of Life",
+ "Sports",
+ "Superhero",
+ "Thriller",
+ "Tragedy",
+ "Wuxia"
+]
\ No newline at end of file
diff --git a/custom/theme.json b/custom/theme.json
new file mode 100644
index 0000000..e0ae5d9
--- /dev/null
+++ b/custom/theme.json
@@ -0,0 +1,39 @@
+[
+ "Aliens",
+ "Animals",
+ "Cooking",
+ "Crossdressing",
+ "Delinquents",
+ "Demons",
+ "Genderswap",
+ "Ghosts",
+ "Gyaru",
+ "Harem",
+ "Incest",
+ "Loli",
+ "Mafia",
+ "Magic",
+ "Martial Arts",
+ "Military",
+ "Monster Girls",
+ "Monsters",
+ "Music",
+ "Ninja",
+ "Office Workers",
+ "Police",
+ "Post-Apocalyptic",
+ "Reincarnation",
+ "Reverse Harem",
+ "Samurai",
+ "School Life",
+ "Shota",
+ "Supernatural",
+ "Survival",
+ "Time Travel",
+ "Traditional Games",
+ "Vampires",
+ "Video Games",
+ "Villainess",
+ "Virtual Reality",
+ "Zombies"
+]
\ No newline at end of file
diff --git a/custom/upload_langs.json b/custom/upload_langs.json
new file mode 100644
index 0000000..436965c
--- /dev/null
+++ b/custom/upload_langs.json
@@ -0,0 +1,22 @@
+[
+ [
+ "gb",
+ "English",
+ "๐ฌ๐ง"
+ ],
+ [
+ "de",
+ "German",
+ "๐ฉ๐ช"
+ ],
+ [
+ "pt",
+ "Portuguese",
+ "๐ต๐น"
+ ],
+ [
+ "fr",
+ "French",
+ "๐ซ๐ท"
+ ]
+]
\ No newline at end of file
diff --git a/custom/warnings.json b/custom/warnings.json
new file mode 100644
index 0000000..7326b21
--- /dev/null
+++ b/custom/warnings.json
@@ -0,0 +1,5 @@
+[
+ "Gore",
+ "Sexual Violence",
+ "Smut"
+]
\ No newline at end of file
diff --git a/funky.php b/funky.php
new file mode 100644
index 0000000..13ab425
--- /dev/null
+++ b/funky.php
@@ -0,0 +1,396 @@
+ clean($action),
+ "success" => $success,
+ "value" => clean($value),
+ "user" => $user,
+ "ip" => clean($_SERVER["REMOTE_ADDR"]),
+ "timestamp" => now()
+ );
+ $db->insert($data);
+ }
+ return true;
+}
+
+function visit()
+{
+ require "config.php";
+ require_once ps(__DIR__ . $config["path"]["sleek"] . "/Store.php");
+ $db = new \SleekDB\Store("visitLogs", ps(__DIR__ . $config["db"]["sleek"]["dir"]), $config["db"]["sleek"]["config"]); // Logs
+ if (empty($db->findOneBy(["ip", "=", clean($_SERVER["REMOTE_ADDR"])]))) {
+ $data = array(
+ "ip" => clean($_SERVER["REMOTE_ADDR"]),
+ "timestamp" => now()
+ );
+ $db->insert($data);
+ }
+}
+
+function titleVisit($title)
+{
+ require "config.php";
+ require_once ps(__DIR__ . $config["path"]["sleek"] . "/Store.php");
+ $db = new \SleekDB\Store("titleViews", ps(__DIR__ . $config["db"]["sleek"]["dir"]), $config["db"]["sleek"]["config"]); // Logs
+ if (empty($db->findOneBy([["ip", "=", clean($_SERVER["REMOTE_ADDR"])], "AND", ["title.id", "=", $title["id"]]]))) {
+ $data = array(
+ "title" => $title,
+ "ip" => clean($_SERVER["REMOTE_ADDR"]),
+ "timestamp" => now()
+ );
+ $db->insert($data);
+ }
+}
+
+function chapterVisit($chapter)
+{
+ require "config.php";
+ require_once ps(__DIR__ . $config["path"]["sleek"] . "/Store.php");
+ $db = new \SleekDB\Store("chapterViews", ps(__DIR__ . $config["db"]["sleek"]["dir"]), $config["db"]["sleek"]["config"]); // Logs
+ if (empty($db->findOneBy([["ip", "=", clean($_SERVER["REMOTE_ADDR"])], "AND", ["chapter.id", "=", $chapter["id"]]]))) {
+ $data = array(
+ "chapter" => $chapter,
+ "ip" => clean($_SERVER["REMOTE_ADDR"]),
+ "timestamp" => now()
+ );
+ $db->insert($data);
+ }
+}
+
+function hCaptcha($response)
+{
+ require "config.php";
+ $data = array(
+ "secret" => $config["captcha"]["hcaptcha"]["secret"],
+ "response" => $response
+ );
+ $verify = curl_init();
+ curl_setopt($verify, CURLOPT_URL, "https://hcaptcha.com/siteverify");
+ curl_setopt($verify, CURLOPT_POST, true);
+ curl_setopt($verify, CURLOPT_POSTFIELDS, http_build_query($data));
+ curl_setopt($verify, CURLOPT_RETURNTRANSFER, true);
+ $responseData = json_decode(curl_exec($verify));
+ return $responseData->success ? true : false;
+}
+
+function valCustom($file)
+{
+ require "config.php";
+ require_once ps(__DIR__ . $config["path"]["sleek"] . "/Store.php");
+ $db = new \SleekDB\Store("custom_" . $file, ps(__DIR__ . $config["db"]["sleek"]["dir"]), $config["db"]["sleek"]["config"]);
+ $file = file_exists(ps(__DIR__ . "/custom/{$file}.json")) ? file_get_contents(ps(__DIR__ . "/custom/{$file}.json")) : "";
+ $data = jd($file);
+ $_data = $db->findAll();
+ if (!empty($data)) {
+ sort($data);
+ foreach ($data as $dat) {
+ $dta = array(
+ "name" => $dat,
+ "timestamp" => now()
+ );
+ if (empty($db->findOneBy(["name", "=", $dat]))) $db->insert($dta);
+ }
+ }
+ if (!empty($_data)) {
+ sort($_data);
+ foreach ($_data as $dat) {
+ if (!in_array($dat["name"], $data)) {
+ $db->deleteBy(["name", "=", $dat["name"]]);
+ }
+ }
+ return $_data;
+ } else {
+ return true;
+ }
+}
+
+function valCLang($file)
+{
+ require "config.php";
+ require_once ps(__DIR__ . $config["path"]["sleek"] . "/Store.php");
+ $db = new \SleekDB\Store("custom_" . $file, ps(__DIR__ . $config["db"]["sleek"]["dir"]), $config["db"]["sleek"]["config"]);
+ $file = file_exists(ps(__DIR__ . "/custom/{$file}.json")) ? file_get_contents(ps(__DIR__ . "/custom/{$file}.json")) : "";
+ $data = jd($file);
+ $_data = $db->findAll();
+ if (!empty($_data)) {
+ sort($_data);
+ $langs = array_column($data, 0);
+ $langs = array_reverse($langs);
+ foreach ($_data as $dat) {
+ $found = false;
+ foreach ($langs as $l) {
+ if ($dat["code"] == $l) $found = true;
+ }
+ if (!$found) $db->deleteBy(["code", "=", $dat["code"]]);
+ }
+ }
+ if (!empty($data)) {
+ sort($data);
+ foreach ($data as $dat) {
+ $dta = array(
+ "code" => $dat[0],
+ "name" => $dat[1],
+ "flag" => $dat[2],
+ "timestamp" => now()
+ );
+ if (empty($db->findOneBy(["code", "=", $dat[0]]))) $db->insert($dta);
+ }
+ }
+ return !empty($_data) ? $_data : true;
+}
+
+function getTag($file, $id)
+{
+ $tags = valCustom($file);
+ foreach ($tags as $tg) {
+ if ($tg["id"] == $id) return $tg;
+ }
+ return null;
+}
+
+function rmrf($dir)
+{
+ foreach (glob($dir) as $file) {
+ if (is_dir($file)) {
+ rmrf("$file/*");
+ rmdir($file);
+ } else {
+ unlink($file);
+ }
+ }
+}
+
+function valImage($location, $file)
+{
+ // Image?
+ $check = getimagesize($location);
+ if ($check == false) return "Fake image.";
+ // In array?
+ $filetypes = array("jpg", "jpeg", "png", "gif", "webp");
+ if (!in_array(strtolower($file), $filetypes)) return "Invalid Image format.";
+ // Yes!
+ return true;
+}
+
+function unzip($file, $tmp, $target)
+{
+ $zip = new ZipArchive;
+ $res = $zip->open($file);
+ if ($res !== true) die("Something!");
+
+ // extract it to the path we determined above
+ if (file_exists($tmp)) rmrf($tmp);
+ if (file_exists($target)) rmrf($target);
+ mkdir($tmp, 0755, true);
+ mkdir($target, 0755, true);
+ $zip->extractTo($tmp);
+ $files = glob("$tmp/*.{jpg,jpeg,webp,gif,png}", GLOB_BRACE);
+ if (empty($files)) return "No images in ZIP!";
+ foreach ($files as $f) {
+ $check = getimagesize($f);
+ if ($check == false) {
+ return "An error occured.";
+ rmrf($tmp);
+ }
+ }
+ sort($files, SORT_STRING);
+ $c = 1;
+ foreach ($files as $_file) {
+ rename($_file, ps($target . "/{$c}." . strtolower(pathinfo($_file, PATHINFO_EXTENSION))));
+ $c++;
+ }
+ $zip->close();
+ rmrf($tmp);
+ unlink($file);
+ return "success";
+}
+
+function formatChapterTitle($volume, $chapter, $type = "short")
+{
+ switch ($type) {
+ case "full":
+ $type = "full";
+ break;
+ case "short":
+ default:
+ $type = "short";
+ }
+ $out = "";
+ if (substr($chapter, -2) == ".00") {
+ $chapter = substr($chapter, 0, -3);
+ } elseif (substr($chapter, -1) == "0") {
+ $chapter = substr($chapter, 0, -1);
+ }
+ if ($type == "short") {
+ if (!empty($volume)) $out .= "Vol." . $volume . " ";
+ $out .= "Ch." . $chapter;
+ }
+ if ($type == "full") {
+ if (!empty($volume)) $out .= "Volume " . $volume . " ";
+ $out .= "Chapter " . $chapter;
+ }
+ return $out;
+}
+
+function formatDate($date, $full = false)
+{
+ $date = clean($date);
+
+ $s = $date;
+ $date = strtotime($s);
+ if ($full == false) {
+ return date('d. M Y', $date);
+ } else {
+ return date('d. M Y H:m:i', $date);
+ }
+}
+
+function getUserLang($logged = false, $userlang = "")
+{
+ require "config.php";
+ $userlang = $logged ? $userlang : cat($_COOKIE[cat($config["title"]) . "_lang"] ?? $config["default"]["lang"]);
+ if (!file_exists(ps(__DIR__ . $config["path"]["langs"] . "/{$userlang}.php")))
+ $userlang = $config["default"]["lang"];
+ return $userlang;
+}
+
+function getUserTheme($logged = false, $usertheme = "")
+{
+ require "config.php";
+ $usertheme = $logged ? $usertheme : cat($_COOKIE[cat($config["title"]) . "_theme"] ?? $config["default"]["theme"]);
+ if (!file_exists(ps(__DIR__ . $config["smarty"]["template"] . "/{$usertheme}/info.php")))
+ $usertheme = $config["default"]["theme"];
+ return $usertheme;
+}
+
+function getPrefLang()
+{
+ require "config.php";
+ return isset($_COOKIE[cat($config["title"]) . "_preflang"]) && !empty($_COOKIE[cat($config["title"]) . "_preflang"]) ? cat($_COOKIE[cat($config["title"]) . "_preflang"]) : $config["default"]["lang"];
+}
+
+function timeAgo($datetime, $full = false)
+{
+ // Thx - https://stackoverflow.com/questions/1416697/converting-timestamp-to-time-ago-in-php-e-g-1-day-ago-2-days-ago
+ $now = new DateTime;
+ $ago = new DateTime($datetime);
+ $diff = $now->diff($ago);
+
+ $diff->w = floor($diff->d / 7);
+ $diff->d -= $diff->w * 7;
+
+ $string = array(
+ 'y' => 'year',
+ 'm' => 'month',
+ 'w' => 'week',
+ 'd' => 'day',
+ 'h' => 'hour',
+ 'i' => 'min',
+ 's' => 'second',
+ );
+ foreach ($string as $k => &$v) {
+ if ($diff->$k) {
+ $v = $diff->$k . ' ' . $v . ($diff->$k > 1 ? 's' : '');
+ } else {
+ unset($string[$k]);
+ }
+ }
+
+ if (!$full) $string = array_slice($string, 0, 1);
+ return $string ? implode(', ', $string) . ' ago' : 'just now';
+}
+
+// Only available in PHP 8.x which I don't like at all
+if (!function_exists("str_contains")) {
+ function str_contains($haystack, $needle)
+ {
+ return $needle !== "" && mb_strpos($haystack, $needle) !== false;
+ }
+}
+
+function shorten($text, $maxlength = 25)
+{
+ // This function is used, to display only a certain amount of characters
+ if (strlen($text) > $maxlength)
+ return substr($text, 0, $maxlength) . "...";
+ return $text;
+}
diff --git a/library/langs/en.php b/library/langs/en.php
new file mode 100644
index 0000000..70bfd7e
--- /dev/null
+++ b/library/langs/en.php
@@ -0,0 +1,10 @@
+ [
+ "name" => "English",
+ "author" => "Saintly & S-VHS",
+ "website" => "https://h33t.moe",
+ "updated" => "30.03.2023"
+ ]
+];
diff --git a/library/plugins/disabled/getRel.php b/library/plugins/disabled/getRel.php
new file mode 100644
index 0000000..3c75bec
--- /dev/null
+++ b/library/plugins/disabled/getRel.php
@@ -0,0 +1,14 @@
+assign("rel", clean($_GET["rel"]));
diff --git a/library/plugins/disabled/keep.txt b/library/plugins/disabled/keep.txt
new file mode 100644
index 0000000..ec3e524
--- /dev/null
+++ b/library/plugins/disabled/keep.txt
@@ -0,0 +1 @@
+Keep this, GitHub!
\ No newline at end of file
diff --git a/library/plugins/enabled/daisyTheme.php b/library/plugins/enabled/daisyTheme.php
new file mode 100644
index 0000000..84e8c58
--- /dev/null
+++ b/library/plugins/enabled/daisyTheme.php
@@ -0,0 +1,17 @@
+assign("daisytheme", $daisytheme);
+ unset($daisytheme);
+}
diff --git a/library/plugins/enabled/logoImage.php b/library/plugins/enabled/logoImage.php
new file mode 100644
index 0000000..ab0b085
--- /dev/null
+++ b/library/plugins/enabled/logoImage.php
@@ -0,0 +1,20 @@
+assign("logoImage", $logoImage);
+ unset($logoImage);
+ unset($usertheme);
+}
diff --git a/library/plugins/enabled/readChapters.php b/library/plugins/enabled/readChapters.php
new file mode 100644
index 0000000..320934c
--- /dev/null
+++ b/library/plugins/enabled/readChapters.php
@@ -0,0 +1,25 @@
+findBy(["user", "==", $user["id"]]);
+ $_readChapters = array();
+ foreach ($readChapters as $key => $ch) {
+ array_push($_readChapters, $ch["chapter"]);
+ }
+ if (isset($smarty))
+ $smarty->assign("readChapters", $_readChapters);
+
+ unset($ch);
+ unset($_readChapters);
+ unset($readChapters);
+}
diff --git a/library/plugins/enabled/simpleAlert.php b/library/plugins/enabled/simpleAlert.php
new file mode 100644
index 0000000..fbc04a5
--- /dev/null
+++ b/library/plugins/enabled/simpleAlert.php
@@ -0,0 +1,32 @@
+ "info", // "", "info", "success", "warning", "error"
+ "content" => "Welcome to {$config["title"]}! To use all the functions such as commenting or Bookmarking, please create a free acount!",
+ "timestamp" => now()
+);
+// Database Insert
+$db["alerts"]->insert($data);
+*/
+$topAlert = $db["alerts"]->findAll(["id" => "DESC"], 1);
+if (!empty($topAlert)) $topAlert = $topAlert[0];
+$readAlert = !empty($topAlert) ? ($logged ? (!empty($db["alertReads"]->findOneBy([["user", "=", $user["id"]], "AND", ["alert", "=", $topAlert["id"]]])) ? true : false) : false) : false;
+
+if (isset($smarty)) {
+ $smarty->assign("topAlert", $topAlert);
+ $smarty->assign("readAlert", $readAlert);
+
+ unset($topAlert);
+ unset($readAlert);
+}
diff --git a/library/plugins/enabled/started.php b/library/plugins/enabled/started.php
new file mode 100644
index 0000000..06164e6
--- /dev/null
+++ b/library/plugins/enabled/started.php
@@ -0,0 +1,4 @@
+assign("userlangs", $_userlangs);
+ unset($lang);
+ // unset($userlangs);
+ unset($_userlangs);
+}
diff --git a/library/secrets/README.txt b/library/secrets/README.txt
new file mode 100644
index 0000000..5c70ec4
--- /dev/null
+++ b/library/secrets/README.txt
@@ -0,0 +1,6 @@
+DO NOT EDIT ANY OF THE SECRETS (pwease)!
+
+THIS WILL NOT ONLY BREAK THE SOFTWARE
+BUT ALSO THE API - and I don't want that.
+
+- thanks, Saintly
\ No newline at end of file
diff --git a/library/themes/nucleus/info.php b/library/themes/nucleus/info.php
new file mode 100644
index 0000000..d347c7e
--- /dev/null
+++ b/library/themes/nucleus/info.php
@@ -0,0 +1,16 @@
+ "Nucleus",
+ "author" => "Saintly2k, S-VHS and Kaligula",
+ "website" => "https://h33t.moe/",
+ "plugins" => [
+ "daisyTheme",
+ "logoImage",
+ "readChapters",
+ "simpleAlert",
+ "started",
+ "userLangs"
+ ],
+ "version" => "2023-03-30"
+];
diff --git a/library/themes/nucleus/pages/chapter.tpl b/library/themes/nucleus/pages/chapter.tpl
new file mode 100644
index 0000000..f34a25f
--- /dev/null
+++ b/library/themes/nucleus/pages/chapter.tpl
@@ -0,0 +1,3 @@
+{foreach from=$images item=item key=key name=name}
+
+{/foreach}
\ No newline at end of file
diff --git a/library/themes/nucleus/pages/index.tpl b/library/themes/nucleus/pages/index.tpl
new file mode 100644
index 0000000..0df581a
--- /dev/null
+++ b/library/themes/nucleus/pages/index.tpl
@@ -0,0 +1,126 @@
+
{$item.title.alts}
+There are no Titles at the Moment!
+ {/if} +
+
+
+ {formatChapterTitle($item.volume, $item.number)}
+
+
+
+
+
+ {$item.user.username}
+
+
+
+ {timeAgo($item.timestamp)} +
+There are no Chapters on this page!
+ {/if} +
+
+
+ {formatChapterTitle($item.volume, $item.number)}
+
+
+
+
+
+ {$item.user.username}
+
+
+
+ {timeAgo($item.timestamp)} +
+There are no Chapters on this page!
+ {/if} + + {if !empty($pagis)} + + + + {/if} +{$title.alts}
+{$title.alts}
++ Author/s: + {if !empty($title.authors)} + {foreach from=$title.authors item=item key=key name=name} + + + {trim($item)} + + + {/foreach} + {else} + Unknown + {/if} +
++ Artist/s: + {if !empty($title.artists)} + {foreach from=$title.artists item=item key=key name=name} + + + {trim($item)} + + + {/foreach} + {else} + Unknown + {/if} +
++ Release Year: + {if !empty($title.releaseYear)} + {$title.releaseYear} + {else} + Unknown + {/if} +
++ Completion Year: + {if !empty($title.completionYear)} + {$title.completionYear} + {else} + Unknown + {/if} +
+ +Formats
+ {if !empty($title.tags.formats)} + {foreach from=$title.tags.formats item=item key=key name=name} + + + {trim($item.name)} + + + {/foreach} + {/if} +Warnings
+ {if !empty($title.tags.warnings)} + {foreach from=$title.tags.warnings item=item key=key name=name} + + + {trim($item.name)} + + + {/foreach} + {/if} +Themes
+ {if !empty($title.tags.themes)} + {foreach from=$title.tags.themes item=item key=key name=name} + + + {trim($item.name)} + + + {/foreach} + {/if} +Genres
+ {if !empty($title.tags.genres)} + {foreach from=$title.tags.genres item=item key=key name=name} + + + {trim($item.name)} + + + {/foreach} + {/if} ++ | + # + Chapter + | ++ 𝕋 + Title + | ++ @ + User + | ++ ⟲ + Date + | + {if $logged && $user.level >= 75} ++ {/if} + |
---|---|---|---|---|---|
+ + | ++ + + {formatChapterTitle($item.volume, $item.number, "short")} + + + {formatChapterTitle($item.volume, $item.number, "full")} + + + + | ++ + {$item.name} + + | +
+
+ |
+ + + {formatDate($item.timestamp)} + + + {formatDate($item.timestamp, true)} + + | + {if $logged && $user.level >= 75} ++ | + {/if} +
There are no chapters at the moment!
+ {/if} +
+
+ > Q
+
+
+ Quote
+
+
+
+
+ C
+
+
+ Code
+
+
+ There are no Titles on this page!
+ {/if} + + {if !empty($pagis)} + + {/if} +{$item.name}
++ by + {if !empty($item.website)} + + {/if} + {$item.author} + {if !empty($item.website)} + + {/if} +
+Updated: {$item.updated}
+