Personal Website
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

112 lines
2.5 KiB

<?php
namespace App\Controllers;
use App\Classes\Config;
use App\Classes\Db;
use App\Classes\Router;
use App\Classes\Session;
class IndexController extends PageController {
public function indexAction(): void
{
// Pull pages from cache
$pages = Db::getPages();
parent::routeAction(
array_search('home', array_column($pages, 'page', 'id')));
}
public function captchaAction(): void
{
header('Content-type: image/jpeg');
if (!Session::exists('captcha')) {
Session::put('captcha', _randomStr(4, '0123456789'));
}
$imageWidth = 151;
$imageHeight = 51;
// Text
$textSize = 30;
$textFont = 'fonts/captcha.otf';
$text = Session::get('captcha');
// Generate position
$randPosX = rand(0, 40);
$randPosY = rand(35, 45);
// Calculate rotation from the position
$rotationFactorUp = 1.0 - (($randPosY - 40.0) / 5.0);
$rotationFactorDown = 1.0 - ((40.0 - $randPosY) / 5.0);
// Clamp between 0.0-1.0
$rotationFactorUp = max(0.0, min(1.0, $rotationFactorUp));
$rotationFactorDown = max(0.0, min(1.0, $rotationFactorDown));
$rotation = rand(-8 * $rotationFactorUp, 8 * $rotationFactorDown);
// Create image
$image = imagecreate($imageWidth, $imageHeight);
imagecolorallocate($image, 255, 255, 255);
// Render number
$textColor = imagecolorallocate($image, 0, 0, 0);
imagettftext($image, $textSize, $rotation, $randPosX, $randPosY,
$textColor, $textFont, $text);
// Render grid pattern
$lineColor = imagecolorallocate($image, 73, 106, 164);
$cord = 0;
for ($i = 1; $i <= 31; $i++) {
imageline($image, $cord, 0, $cord, 50, $lineColor);
imageline($image, 0, $cord, 150, $cord, $lineColor);
$cord = $cord + 5;
}
imagejpeg($image);
exit();
}
public function robotsAction(): void
{
$url = Config::c('APP_URL');
header('content-type: text/plain; charset=UTF-8');
echo <<< EOF
User-agent: *
Allow: /
Disallow: /admin
Sitemap: $url/sitemap.xml
EOF;
}
public function sitemapAction(): void
{
$xml = new \SimpleXMLElement('<urlset/>');
// Config routes
$routes = array_column(Router::getRoutes(), '0');
// Remove /admin and /test pages
foreach ($routes as $key => $route) {
if (strpos($route, '/admin') !== false ||
strpos($route, '/test') !== false) {
unset($routes[$key]);
}
}
foreach ($routes as $route) {
$url = $xml->addChild('url');
$loc = Config::c('APP_URL') . $route;
$url->addChild('loc', $loc);
}
header('content-type: text/xml; charset=UTF-8');
print($xml->asXML());
}
}