Makai
This commit is contained in:
parent
b74b7a548b
commit
49eae219e5
16 changed files with 53 additions and 260 deletions
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -10,4 +10,5 @@
|
|||
/public/signature/cover_url.txt
|
||||
/public/signature/np.json
|
||||
/public/signature/signature.png
|
||||
|
||||
.DS_Store
|
||||
/.debug
|
||||
|
|
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
[submodule "lib/index"]
|
||||
path = lib/index
|
||||
url = https://github.com/flashwave/index.git
|
|
@ -1,28 +0,0 @@
|
|||
<?php
|
||||
class FmColour {
|
||||
private $raw = null;
|
||||
|
||||
public function __construct(?int $raw) {
|
||||
$this->raw = $raw;
|
||||
}
|
||||
|
||||
public function hasColour(): bool {
|
||||
return $this->raw !== null;
|
||||
}
|
||||
|
||||
public function getRaw(): int {
|
||||
return $this->raw ?? 0;
|
||||
}
|
||||
|
||||
public function getRed(): int { return ($this->getRaw() >> 16) & 0xFF; }
|
||||
public function getGreen(): int { return ($this->getRaw() >> 8) & 0xFF; }
|
||||
public function getBlue(): int { return $this->getRaw() & 0xFF; }
|
||||
|
||||
public function getHex(): string { return str_pad(dechex($this->getRaw()), 6, '0'); }
|
||||
|
||||
public function getCSS(): string {
|
||||
if(!$this->hasColour())
|
||||
return 'inherit';
|
||||
return '#' . $this->getHex();
|
||||
}
|
||||
}
|
|
@ -1,14 +0,0 @@
|
|||
<?php
|
||||
class FmLanguage {
|
||||
private $language_id = -1;
|
||||
private $language_name = '';
|
||||
private $language_colour = null;
|
||||
|
||||
public static function fromStdClass(stdClass $lang) {
|
||||
$langRaw = (array)$lang;
|
||||
$lang = new static;
|
||||
foreach($langRaw as $prop => $val)
|
||||
$lang->{$prop} = $val;
|
||||
return $lang;
|
||||
}
|
||||
}
|
|
@ -1,170 +0,0 @@
|
|||
<?php
|
||||
class FmProject {
|
||||
public const TYPE_PROJECT = 'Project';
|
||||
public const TYPE_TOOL = 'Tool';
|
||||
|
||||
private $project_id = -1;
|
||||
private $project_name = '';
|
||||
private $project_name_clean = null;
|
||||
private $project_summary = null;
|
||||
private $project_description = null;
|
||||
private $project_order = 0;
|
||||
private $project_type = self::TYPE_PROJECT;
|
||||
private $project_featured = 0;
|
||||
private $project_colour = null;
|
||||
private $project_homepage = null;
|
||||
private $project_repository = null;
|
||||
private $project_forum = null;
|
||||
private $project_created = null;
|
||||
private $project_deleted = null;
|
||||
private $project_archived = null;
|
||||
|
||||
private $languages = null;
|
||||
|
||||
public function getId(): int {
|
||||
return $this->project_id < 1 ? -1 : $this->project_id;
|
||||
}
|
||||
|
||||
public function getName(): string {
|
||||
return $this->project_name;
|
||||
}
|
||||
public function getCleanName(): string {
|
||||
return $this->project_name_clean ?? str_replace(' ', '-', trim(strtolower($this->getName())));
|
||||
}
|
||||
|
||||
public function getSummary(): string {
|
||||
return $this->project_summary ?? '';
|
||||
}
|
||||
public function getDescription(): string {
|
||||
return $this->project_description ?? '';
|
||||
}
|
||||
public function getDescriptionLines(): array {
|
||||
$linesRaw = array_reverse(explode("\n", $this->getDescription()));
|
||||
$lines = [];
|
||||
while(($line = array_pop($linesRaw)) !== false) {
|
||||
$line = trim($line);
|
||||
if(!empty($line))
|
||||
$lines[] = $line;
|
||||
}
|
||||
return $lines;
|
||||
}
|
||||
|
||||
public function getOrder(): int {
|
||||
return $this->project_order;
|
||||
}
|
||||
public function getType(): string {
|
||||
return $this->project_type;
|
||||
}
|
||||
public function isProject(): bool {
|
||||
return $this->getType() === self::TYPE_PROJECT;
|
||||
}
|
||||
public function isTool(): bool {
|
||||
return $this->getType() === self::TYPE_TOOL;
|
||||
}
|
||||
|
||||
public function isFeatured(): bool {
|
||||
return boolval($this->project_featured);
|
||||
}
|
||||
|
||||
// TODO: INHERIT LANGUAGE COLOUR
|
||||
public function hasColour(): bool {
|
||||
return $this->project_colour !== null;
|
||||
}
|
||||
public function getColour(): FmColour {
|
||||
return new FmColour($this->project_colour);
|
||||
}
|
||||
|
||||
public function hasHomepage(): bool {
|
||||
return !empty($this->project_homepage);
|
||||
}
|
||||
public function getHomepage(): string {
|
||||
return $this->project_homepage ?? '';
|
||||
}
|
||||
|
||||
public function hasRepository(): bool {
|
||||
return !empty($this->project_repository);
|
||||
}
|
||||
public function getRepository(): string {
|
||||
return $this->project_repository ?? '';
|
||||
}
|
||||
|
||||
public function hasForum(): bool {
|
||||
return !empty($this->project_forum);
|
||||
}
|
||||
public function getForum(): string {
|
||||
return $this->project_forum ?? '';
|
||||
}
|
||||
|
||||
public function getCreatedTime(): DateTime {
|
||||
return new DateTime('@' . ($this->project_created ?? 0));
|
||||
}
|
||||
|
||||
public function isDeleted(): bool {
|
||||
return $this->project_deleted !== null;
|
||||
}
|
||||
public function getDeletedTime(): DateTime {
|
||||
return new DateTime('@' . ($this->project_deleted ?? 0));
|
||||
}
|
||||
|
||||
public function isArchived(): bool {
|
||||
return $this->project_archived !== null;
|
||||
}
|
||||
public function getArchivedTime(): DateTime {
|
||||
return new DateTime('@' . ($this->project_archived ?? 0));
|
||||
}
|
||||
|
||||
public function getLinks(): array {
|
||||
$links = [];
|
||||
if($this->hasHomepage())
|
||||
$links[] = FmProjectLink::create('homepage', 'Homepage', $this->getHomepage());
|
||||
if($this->hasRepository())
|
||||
$links[] = FmProjectLink::create('repository', 'Source', $this->getRepository());
|
||||
if($this->hasForum())
|
||||
$links[] = FmProjectLink::create('forum', 'Discussion', $this->getForum());
|
||||
return $links;
|
||||
}
|
||||
|
||||
public function getLanguages(): array {
|
||||
return $this->languages ?? [];
|
||||
}
|
||||
|
||||
private function transformLanguages(): void {
|
||||
if(empty($this->languages))
|
||||
return;
|
||||
foreach($this->languages as &$lang)
|
||||
if($lang instanceof stdClass)
|
||||
$lang = FmLanguage::fromStdClass($lang);
|
||||
}
|
||||
|
||||
public static function byFeatured(): array {
|
||||
return cache_output('projects-featured-noconvert', 300, function() {
|
||||
$projects = json_decode(file_get_contents('https://flash.moe/2020/projects.php?dump_that_shit&noconvert&rf'));
|
||||
|
||||
foreach($projects as &$project) {
|
||||
$projRaw = (array)$project;
|
||||
$project = new static;
|
||||
foreach($projRaw as $prop => $val)
|
||||
$project->{$prop} = $val;
|
||||
$project->transformLanguages();
|
||||
}
|
||||
|
||||
return $projects;
|
||||
});
|
||||
}
|
||||
|
||||
public static function all(): array {
|
||||
return cache_output('projects-noconvert', 300, function() {
|
||||
$projects = json_decode(file_get_contents('https://flash.moe/2020/projects.php?dump_that_shit&noconvert'));
|
||||
|
||||
foreach($projects as &$project) {
|
||||
$projRaw = (array)$project;
|
||||
$project = new static;
|
||||
foreach($projRaw as $prop => $val)
|
||||
$project->{$prop} = $val;
|
||||
$project->transformLanguages();
|
||||
}
|
||||
|
||||
return $projects;
|
||||
});
|
||||
}
|
||||
}
|
|
@ -1,24 +0,0 @@
|
|||
<?php
|
||||
class FmProjectLink {
|
||||
private $className;
|
||||
private $text;
|
||||
private $url;
|
||||
|
||||
public function getClass(): string {
|
||||
return $this->className;
|
||||
}
|
||||
public function getText(): string {
|
||||
return $this->text;
|
||||
}
|
||||
public function getUrl(): string {
|
||||
return $this->url;
|
||||
}
|
||||
|
||||
public static function create(string $class, string $text, string $url): self {
|
||||
$link = new static;
|
||||
$link->className = $class;
|
||||
$this->text = $text;
|
||||
$this->url = $url;
|
||||
return $link;
|
||||
}
|
||||
}
|
1
lib/index
Submodule
1
lib/index
Submodule
|
@ -0,0 +1 @@
|
|||
Subproject commit 74c0e6f17c21af3669345e38598ada1d37675ad4
|
23
makai.php
Normal file
23
makai.php
Normal file
|
@ -0,0 +1,23 @@
|
|||
<?php
|
||||
namespace Makai;
|
||||
|
||||
use Index\Autoloader;
|
||||
|
||||
define('MKI_STARTUP', microtime(true));
|
||||
define('MKI_ROOT', __DIR__);
|
||||
define('MKI_DEBUG', is_file(MKI_ROOT . '/.debug'));
|
||||
define('MKI_DIR_SRC', MKI_ROOT . '/src');
|
||||
define('MKI_DIR_LIB', MKI_ROOT . '/lib');
|
||||
define('MKI_DIR_PUB', MKI_ROOT . '/public');
|
||||
|
||||
if(MKI_DEBUG) {
|
||||
ini_set('display_errors', 'on');
|
||||
error_reporting(-1);
|
||||
} else {
|
||||
ini_set('display_errors', 'off');
|
||||
error_reporting(0);
|
||||
}
|
||||
|
||||
require_once MKI_DIR_LIB . '/index/index.php';
|
||||
|
||||
Autoloader::addNamespace(__NAMESPACE__, MKI_DIR_SRC);
|
|
@ -1,4 +1,6 @@
|
|||
<?php
|
||||
namespace Makai;
|
||||
|
||||
if(preg_match('#^/blog/([0-9]+)$#', $reqPath, $matches) || $reqPath === '/blog.php' || $reqPath === '/blog-post.php') {
|
||||
if($reqMethod !== 'GET')
|
||||
return FM_ERR | 405;
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
<?php
|
||||
namespace Makai;
|
||||
|
||||
if($reqPath === '/contact.php' || $reqPath === '/contact.html') {
|
||||
if($reqMethod !== 'GET')
|
||||
return FM_ERR | 405;
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
<?php
|
||||
namespace Makai;
|
||||
|
||||
if($reqPath === '/etc.php' || $reqPath === 'etc.html'
|
||||
|| $reqPath === '/etcetera' || $reqPath === '/etcetera.html' || $reqPath === '/etcetera.php'
|
||||
|| $reqPath === '/misc' || $reqPath === '/misc.html' || $reqPath === '/misc.php') {
|
||||
|
@ -70,4 +72,4 @@ endforeach;
|
|||
fm_component('footer');
|
||||
|
||||
return FM_HIT;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
<?php
|
||||
namespace Makai;
|
||||
|
||||
if($reqPath === '/about' || $reqPath === '/about.html' || $reqPath === '/about.php'
|
||||
|| $reqPath === '/index.php' || $reqPath === '/index.html') {
|
||||
if($reqMethod !== 'GET')
|
||||
|
@ -102,19 +104,6 @@ if($reqPath === '/home') {
|
|||
return FM_HIT;
|
||||
}
|
||||
|
||||
if($reqPath === '/test') {
|
||||
if($reqMethod !== 'GET')
|
||||
return FM_ERR | 405;
|
||||
if($reqHead)
|
||||
return FM_HIT;
|
||||
|
||||
header('Content-Type: text/plain');
|
||||
|
||||
var_dump(FmProject::byFeatured());
|
||||
|
||||
return FM_HIT;
|
||||
}
|
||||
|
||||
if($reqPath === '/donate') {
|
||||
header('Location: https://paypal.me/flashwave');
|
||||
return FM_HIT | 302;
|
||||
|
@ -128,7 +117,7 @@ if($reqPath === '/' || $reqPath === '/365') {
|
|||
|
||||
$is365 = $reqPath === '/365';
|
||||
|
||||
$legacyPage = filter_input(INPUT_GET, 'p', FILTER_SANITIZE_STRING);
|
||||
$legacyPage = (string)filter_input(INPUT_GET, 'p');
|
||||
if(!empty($legacyPage)) {
|
||||
$legacyPages = [
|
||||
'projects' => '/projects',
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
<?php
|
||||
namespace Makai;
|
||||
|
||||
if($reqPath === '/projects.php' || $reqPath === '/projects.html'
|
||||
|| $reqPath === '/utilities' || $reqPath === '/utilities.php' || $reqPath === '/utilities.html') {
|
||||
if($reqMethod !== 'GET')
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
<?php
|
||||
namespace Makai;
|
||||
|
||||
if($reqPath === '/related.php' || $reqPath === '/related.html'
|
||||
|| $reqPath === '/friends' || $reqPath === '/friends.html' || $reqPath === '/friends.php') {
|
||||
if($reqMethod !== 'GET')
|
||||
|
|
|
@ -1,4 +1,10 @@
|
|||
<?php
|
||||
namespace Makai;
|
||||
|
||||
use Index\DateTime;
|
||||
|
||||
require_once __DIR__ . '/../makai.php';
|
||||
|
||||
define('FM_HIT', 0x01000000);
|
||||
define('FM_ERR', 0x02000000);
|
||||
|
||||
|
@ -124,14 +130,10 @@ function cache_output(string $name, int $lifetime, callable $callable) {
|
|||
return unserialize(file_get_contents($path));
|
||||
}
|
||||
|
||||
set_include_path(realpath(__DIR__ . '/../lib/') . PATH_SEPARATOR . get_include_path());
|
||||
spl_autoload_extensions('.php');
|
||||
spl_autoload_register();
|
||||
|
||||
ob_start();
|
||||
|
||||
$reqMethod = filter_input(INPUT_SERVER, 'REQUEST_METHOD', FILTER_SANITIZE_STRING);
|
||||
$reqPath = '/' . trim(parse_url(filter_input(INPUT_SERVER, 'REQUEST_URI', FILTER_SANITIZE_STRING), PHP_URL_PATH), '/');
|
||||
$reqMethod = (string)filter_input(INPUT_SERVER, 'REQUEST_METHOD');
|
||||
$reqPath = '/' . trim(parse_url((string)filter_input(INPUT_SERVER, 'REQUEST_URI'), PHP_URL_PATH), '/');
|
||||
$reqHead = false;
|
||||
|
||||
if($reqMethod == 'HEAD') {
|
||||
|
|
|
@ -28,8 +28,8 @@ try {
|
|||
}
|
||||
|
||||
if(isset($_POST['temp']) && isset($_POST['hash']) && isset($_POST['time'])) {
|
||||
$temp = (string)filter_input(INPUT_POST, 'temp', FILTER_SANITIZE_STRING);
|
||||
$hash = (string)filter_input(INPUT_POST, 'hash', FILTER_SANITIZE_STRING);
|
||||
$temp = (string)filter_input(INPUT_POST, 'temp');
|
||||
$hash = (string)filter_input(INPUT_POST, 'hash');
|
||||
$time = (string)filter_input(INPUT_POST, 'time', FILTER_SANITIZE_NUMBER_INT);
|
||||
|
||||
if(!hash_equals(hash_hmac('sha256', $temp . '|' . $time, FM_TEMP_KEY), $hash))
|
||||
|
|
Loading…
Reference in a new issue