flash.moe/lib/fmproject.php
2020-07-30 00:55:37 +00:00

170 lines
5.4 KiB
PHP

<?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;
});
}
}