polygon-website-foss/api/private/classes/pizzaboxer/ProjectPolygon/ErrorHandler.php

128 lines
3.1 KiB
PHP

<?php
namespace pizzaboxer\ProjectPolygon;
use pizzaboxer\ProjectPolygon\Discord;
class ErrorHandler
{
private $exception;
private $type;
private $string;
private $file;
private $line;
private function getType($type)
{
switch ($type)
{
case E_ERROR: case E_USER_ERROR: return "Fatal error";
case E_WARNING: case E_USER_WARNING: return "Warning";
case E_NOTICE: case E_USER_NOTICE: return "Notice";
case E_DEPRECATED: case E_USER_DEPRECATED: return "Deprecated";
default: return "Unknown error type {$type}";
}
}
private function getVerboseMessage()
{
$verboseMessage = "";
if ($this->type == "Exception")
{
$verboseMessage .= sprintf("Fatal Error: Uncaught Exception: %s in %s:%d\n", $this->exception->getMessage(), $this->exception->getFile(), $this->exception->getLine());
$verboseMessage .= "Stack trace:\n";
$verboseMessage .= sprintf("%s\n", $this->exception->getTraceAsString());
$verboseMessage .= sprintf(" thrown in %s on line %d", $this->exception->getFile(), $this->exception->getLine());
}
else
{
$verboseMessage .= sprintf("%s: %s in %s on line %s", $this->type, $this->string, $this->file, $this->line);
}
return $verboseMessage;
}
private function writeLog()
{
$logFile = $_SERVER['DOCUMENT_ROOT']."/api/private/ErrorLog.json";
$logID = generateUUID();
if (!file_exists($logFile)) file_put_contents($logFile, "[]");
$log = json_decode(file_get_contents($logFile), true);
$message = $this->getVerboseMessage();
$parameters = $_SERVER["REQUEST_URI"];
$log[$logID] =
[
"Timestamp" => time(),
// "GETParameters" => $_GET,
"GETParameters" => $parameters,
"Message" => $message
];
file_put_contents($logFile, json_encode($log));
Discord::SendToWebhook(
["content" => "<@194171603049775113> An unexpected error occurred\nError ID: `{$logID}`\nTime: `".date('d/m/Y h:i:s A')."`\nParameters: `{$parameters}`\nMessage:\n```{$message}```"],
Discord::WEBHOOK_POLYGON_ERRORLOG,
false
);
return $logID;
}
private function logAndRedirect()
{
$logID = $this->writeLog();
if (headers_sent())
{
die("An unexpected error occurred! More info: $logID");
}
else if (defined("SESSION") && isset(SESSION["user"]["adminlevel"]) && SESSION["user"]["adminlevel"] != 0)
{
redirect("/error?id=$logID&verbose=true");
}
else
{
redirect("/error?id=$logID");
}
}
public function handleError($type, $string, $file, $line)
{
$this->type = $this->getType($type);
$this->string = $string;
$this->file = $file;
$this->line = $line;
$this->logAndRedirect();
}
public function handleException($exception)
{
$this->type = "Exception";
$this->exception = $exception;
$this->logAndRedirect();
}
public function register()
{
set_error_handler([$this, "handleError"]);
set_exception_handler([$this, "handleException"]);
}
public static function getLog($logID = false)
{
$logFile = $_SERVER['DOCUMENT_ROOT']."/api/private/ErrorLog.json";
if (!file_exists($logFile)) file_put_contents($logFile, "[]");
$log = json_decode(file_get_contents($logFile), true);
if ($logID !== false) return $log[$logID] ?? false;
return $log;
}
}