274 lines
12 KiB
PHP
274 lines
12 KiB
PHP
<?php
|
|
/***********************************************************************
|
|
* Script (c) Kubwa (https://kubwa.de)
|
|
*
|
|
* This script was release under BSD license.
|
|
* You are free to use, share or change this code as you wish. This
|
|
* header must be kept intact.
|
|
***********************************************************************/
|
|
|
|
error_reporting(0);
|
|
|
|
require_once("classes/Framework.MySql.Class.php");
|
|
require_once("classes/GridUserInfo.php");
|
|
require_once("classes/Http.php");
|
|
require_once("classes/Xml.php");
|
|
require_once("Config.php");
|
|
|
|
/*
|
|
This is the new visitorboard code.
|
|
It will generate a nice looking png image that is being shown on the visitorboard inworld.
|
|
*/
|
|
|
|
//Database
|
|
$MySql = new MySql($GLOBALS["CONFIG"]["mysql"]["user"], $GLOBALS["CONFIG"]["mysql"]["pass"], $GLOBALS["CONFIG"]["mysql"]["db"], $GLOBALS["CONFIG"]["mysql"]["server"]);
|
|
|
|
//Look up timezone, country and the (hopefulle) correct language for the region that requests this image
|
|
$ListOfTimezones = DateTimeZone::listIdentifiers(DateTimeZone::ALL);
|
|
$MySql->query("DELETE FROM ip_timezones WHERE unix < {0} OR (unix < {1} AND country = '')", array(time() - 86400 * 60, time() - 86400));
|
|
$Exists = $MySql->query("SELECT * FROM ip_timezones WHERE ip = md5({0}) LIMIT 1", array($_SERVER["REMOTE_ADDR"]))->fetch();
|
|
$TimeZone = "Europe/Berlin";
|
|
$Country = "DE";
|
|
if (empty($Exists["ip"]))
|
|
{
|
|
//We can also use another service to trace the ip, if you wish so, change this code
|
|
$TraceRequest = json_decode(HttpRequest("http://ip-api.com/json/".$_SERVER["REMOTE_ADDR"], "", 3), true);
|
|
if ($TraceRequest["status"] == "success")
|
|
{
|
|
$TimeZone = $TraceRequest["timezone"];
|
|
$Country = $TraceRequest["countryCode"];
|
|
}
|
|
//To have a minimum of dataprotection, we are hashing the cached ip addresses
|
|
$MySql->query("INSERT INTO ip_timezones (ip, timezone, country, unix)VALUES(md5({0}), {1}, {2}, {3})", array($_SERVER["REMOTE_ADDR"], $TimeZone, $Country, time()));
|
|
}
|
|
else
|
|
{
|
|
$TimeZone = $Exists["timezone"];
|
|
$Country = $Exists["country"];
|
|
}
|
|
if (in_array(strtolower($TimeZone), $ListOfTimezones))
|
|
{date_default_timezone_set($TimeZone);}
|
|
|
|
//Handle languagefile
|
|
LoadLanguages();
|
|
$SelLang = strtolower($_GET["l"]);
|
|
if (empty($SelLang))
|
|
{
|
|
//If no prefered language is sent to the script, use the clients ip address to detect display language
|
|
$Exists = $MySql->query("SELECT * FROM countries_lang WHERE country = {0} LIMIT 1", array(strtolower($Country)))->fetch();
|
|
if (!empty($Exists["lang"]))
|
|
{$SelLang = strtolower($Exists["lang"]);}
|
|
}
|
|
if (!isset($GLOBALS["LanguageData"][$SelLang])) {$SelLang = "en";}
|
|
|
|
//So, now lets start with requesting all required information from the visitors grids
|
|
$UserMem = array();
|
|
$AllUsers = explode(";", $_GET["u"]);
|
|
for ($i = 0; $i < count($AllUsers); ++$i)
|
|
{
|
|
$SingleUser = explode(",", $AllUsers[$i]);
|
|
for ($z = 0; $z < count($SingleUser); ++$z) {$SingleUser[$z] = trim($SingleUser[$z]);}
|
|
if (!empty($SingleUser[0]) && !empty($SingleUser[1]))
|
|
{
|
|
//The magic is done here
|
|
$UserInfo = new GridUser($SingleUser[0], $SingleUser[1]);
|
|
$Info = $UserInfo->ToArray();
|
|
if ($Info !== false)
|
|
{
|
|
$UserMem[] = array("uuid" => $Info["uuid"],
|
|
"name" => $Info["firstname"]." ".$Info["lastname"],
|
|
"grid" => $Info["homegrid"],
|
|
"title" => $Info["title"],
|
|
"img" => $Info["img"],
|
|
"unix" => date("d.m.Y H:i", (int)$SingleUser[2]));
|
|
}
|
|
}
|
|
}
|
|
$UserMem = array_reverse($UserMem);
|
|
|
|
|
|
//Now we are starting to render the image
|
|
$Image = imagecreatetruecolor(1024, 512);
|
|
|
|
$Colors["white"] = imagecolorallocate($Image, 255, 255, 255);
|
|
$Colors["red"] = imagecolorallocate($Image, 140, 0, 0);
|
|
$Colors["blue"] = imagecolorallocate($Image, 0, 0, 140);
|
|
$Colors["green"] = imagecolorallocate($Image, 0, 60, 0);
|
|
$Colors["whitealpha"] = imagecolorallocatealpha($Image, 255, 255, 255, 96);
|
|
|
|
$Background = imagecreatefromjpeg("Img/Blackboard.jpg");
|
|
imagecopyresampled($Image, $Background, 0, 0, 0, 0, 1024, 512, imagesx($Background), imagesy($Background));
|
|
|
|
$Size = imageftbbox(26, 0, "Fonts/DJB Chalk It Up.ttf", $GLOBALS["LanguageData"][$SelLang]["title_1"]);
|
|
$Size = array(abs($Size[0]) + abs($Size[2]), abs($Size[1]) + abs($Size[5]));
|
|
imagefttext($Image, 26, 0, 20, 20 + $Size[1], $Colors["white"], "Fonts/DJB Chalk It Up.ttf", $GLOBALS["LanguageData"][$SelLang]["title_1"]);
|
|
|
|
$Size = imageftbbox(24, 0, "Fonts/DJB Chalk It Up.ttf", $GLOBALS["LanguageData"][$SelLang]["title_2"]);
|
|
$Size = array(abs($Size[0]) + abs($Size[2]), abs($Size[1]) + abs($Size[5]));
|
|
imagefttext($Image, 24, 0, 20, 240 + $Size[1], $Colors["white"], "Fonts/DJB Chalk It Up.ttf", $GLOBALS["LanguageData"][$SelLang]["title_2"]);
|
|
|
|
$x = 20;
|
|
$y = 65;
|
|
for ($i = 0; $i < count($UserMem); ++$i)
|
|
{
|
|
if ($i < 2)
|
|
{$ImgSize = 160;}
|
|
else
|
|
{$ImgSize = 92;}
|
|
if ($i > 0)
|
|
{
|
|
if ($i < 2)
|
|
{$x = $x + 512;}
|
|
else
|
|
{
|
|
$x = $x + 1024 / 3;
|
|
if ($i == 2)
|
|
{
|
|
$x = 20;
|
|
$y = 280;
|
|
}
|
|
if ($x >= 1024)
|
|
{
|
|
$x = 20;
|
|
$y = $y + 120;
|
|
}
|
|
}
|
|
}
|
|
$UserImage = MakeBorderOnImage(imagecreatefromstring($UserMem[$i]["img"]), "ChalkBorder");
|
|
imagecopyresampled($Image, $UserImage, $x, $y, 0, 0, $ImgSize, $ImgSize, imagesx($UserImage), imagesy($UserImage));
|
|
|
|
if ($i < 2)
|
|
{
|
|
$LocalY = $y;
|
|
|
|
$Size = imageftbbox(12, 0, "Fonts/DJB Chalk It Up.ttf", $GLOBALS["LanguageData"][$SelLang]["title_name"]);
|
|
$Size = array(abs($Size[0]) + abs($Size[2]), abs($Size[1]) + abs($Size[5]));
|
|
imagefttext($Image, 12, 0, $x + $ImgSize + 10, $LocalY + $Size[1], $Colors["white"], "Fonts/DJB Chalk It Up.ttf", $GLOBALS["LanguageData"][$SelLang]["title_name"]);
|
|
$LocalY = $LocalY + $Size[1] + 5;
|
|
|
|
$Size = imageftbbox(18, 0, "Fonts/DJB Chalk It Up.ttf", $UserMem[$i]["name"]);
|
|
$Size = array(abs($Size[0]) + abs($Size[2]), abs($Size[1]) + abs($Size[5]));
|
|
imagefttext($Image, 18, 0, $x + $ImgSize + 10 + 10, $LocalY + $Size[1], $Colors["red"], "Fonts/DJB Chalk It Up.ttf", $UserMem[$i]["name"]);
|
|
$LocalY = $LocalY + $Size[1] + 2;
|
|
|
|
$Size = imageftbbox(11, 0, "Fonts/DJB Chalk It Up.ttf", "» ".$UserMem[$i]["title"]);
|
|
$Size = array(abs($Size[0]) + abs($Size[2]), abs($Size[1]) + abs($Size[5]));
|
|
imagefttext($Image, 11, 0, $x + $ImgSize + 10 + 10, $LocalY + $Size[1], $Colors["green"], "Fonts/DJB Chalk It Up.ttf", "» ".$UserMem[$i]["title"]);
|
|
$LocalY = $LocalY + $Size[1] + 10;
|
|
|
|
$Size = imageftbbox(12, 0, "Fonts/DJB Chalk It Up.ttf", $GLOBALS["LanguageData"][$SelLang]["title_from"]);
|
|
$Size = array(abs($Size[0]) + abs($Size[2]), abs($Size[1]) + abs($Size[5]));
|
|
imagefttext($Image, 12, 0, $x + $ImgSize + 10, $LocalY + $Size[1], $Colors["white"], "Fonts/DJB Chalk It Up.ttf", $GLOBALS["LanguageData"][$SelLang]["title_from"]);
|
|
$LocalY = $LocalY + $Size[1] + 5;
|
|
|
|
$Size = imageftbbox(18, 0, "Fonts/DJB Chalk It Up.ttf", $UserMem[$i]["grid"]);
|
|
$Size = array(abs($Size[0]) + abs($Size[2]), abs($Size[1]) + abs($Size[5]));
|
|
imagefttext($Image, 18, 0, $x + $ImgSize + 10 + 10, $LocalY + $Size[1], $Colors["blue"], "Fonts/DJB Chalk It Up.ttf", $UserMem[$i]["grid"]);
|
|
$LocalY = $LocalY + $Size[1] + 10;
|
|
|
|
$Size = imageftbbox(12, 0, "Fonts/DJB Chalk It Up.ttf", $GLOBALS["LanguageData"][$SelLang]["title_time"]);
|
|
$Size = array(abs($Size[0]) + abs($Size[2]), abs($Size[1]) + abs($Size[5]));
|
|
imagefttext($Image, 12, 0, $x + $ImgSize + 10, $LocalY + $Size[1], $Colors["white"], "Fonts/DJB Chalk It Up.ttf", $GLOBALS["LanguageData"][$SelLang]["title_time"]);
|
|
$LocalY = $LocalY + $Size[1] + 5;
|
|
|
|
$Size = imageftbbox(18, 0, "Fonts/DJB Chalk It Up.ttf", $UserMem[$i]["unix"]);
|
|
$Size = array(abs($Size[0]) + abs($Size[2]), abs($Size[1]) + abs($Size[5]));
|
|
imagefttext($Image, 18, 0, $x + $ImgSize + 10 + 10, $LocalY + $Size[1], $Colors["white"], "Fonts/DJB Chalk It Up.ttf", $UserMem[$i]["unix"]);
|
|
$LocalY = $LocalY + $Size[1] + 10;
|
|
}
|
|
else
|
|
{
|
|
$LocalY = $y;
|
|
|
|
$Size = imageftbbox(14, 0, "Fonts/DJB Chalk It Up.ttf", $UserMem[$i]["name"]);
|
|
$Size = array(abs($Size[0]) + abs($Size[2]), abs($Size[1]) + abs($Size[5]));
|
|
imagefttext($Image, 14, 0, $x + $ImgSize + 10, $LocalY + $Size[1], $Colors["red"], "Fonts/DJB Chalk It Up.ttf", $UserMem[$i]["name"]);
|
|
$LocalY = $LocalY + $Size[1] + 2;
|
|
|
|
$Size = imageftbbox(9, 0, "Fonts/DJB Chalk It Up.ttf", "» ".$UserMem[$i]["title"]);
|
|
$Size = array(abs($Size[0]) + abs($Size[2]), abs($Size[1]) + abs($Size[5]));
|
|
imagefttext($Image, 9, 0, $x + $ImgSize + 10, $LocalY + $Size[1], $Colors["green"], "Fonts/DJB Chalk It Up.ttf", "» ".$UserMem[$i]["title"]);
|
|
$LocalY = $LocalY + $Size[1] + 10;
|
|
|
|
$Size = imageftbbox(14, 0, "Fonts/DJB Chalk It Up.ttf", $UserMem[$i]["grid"]);
|
|
$Size = array(abs($Size[0]) + abs($Size[2]), abs($Size[1]) + abs($Size[5]));
|
|
imagefttext($Image, 14, 0, $x + $ImgSize + 10, $LocalY + $Size[1], $Colors["blue"], "Fonts/DJB Chalk It Up.ttf", $UserMem[$i]["grid"]);
|
|
$LocalY = $LocalY + $Size[1] + 10;
|
|
|
|
$Size = imageftbbox(14, 0, "Fonts/DJB Chalk It Up.ttf", $UserMem[$i]["unix"]);
|
|
$Size = array(abs($Size[0]) + abs($Size[2]), abs($Size[1]) + abs($Size[5]));
|
|
imagefttext($Image, 14, 0, $x + $ImgSize + 10, $LocalY + $Size[1], $Colors["white"], "Fonts/DJB Chalk It Up.ttf", $UserMem[$i]["unix"]);
|
|
$LocalY = $LocalY + $Size[1] + 10;
|
|
}
|
|
|
|
}
|
|
|
|
$Size = imageftbbox(10, 0, "Fonts/BlackOpsOne-Regular.ttf", "KUBWA");
|
|
$Size = array(abs($Size[0]) + abs($Size[2]), abs($Size[1]) + abs($Size[5]));
|
|
imagefttext($Image, 10, 0, 1024 - $Size[0] - 15, 512 - $Size[1], $Colors["whitealpha"], "Fonts/BlackOpsOne-Regular.ttf", "KUBWA");
|
|
|
|
header("content-type: image/png");
|
|
imagepng($Image);
|
|
|
|
|
|
|
|
//A little helper function which puts a nice frame around a users image
|
|
function MakeBorderOnImage($Image, $Border)
|
|
{
|
|
imagealphablending($Image, false);
|
|
imagesavealpha($Image, true);
|
|
$Border = imagecreatefrompng("Img/".$Border.".png");
|
|
$ScaledBorder = imagecreatetruecolor(imagesx($Image), imagesy($Image));
|
|
imagecopyresampled($ScaledBorder, $Border, 0, 0, 0, 0, imagesx($Image), imagesy($Image), imagesx($Border), imagesy($Border));
|
|
if (round(rand(0, 3)) == 1) {imageflip($ScaledBorder, IMG_FLIP_HORIZONTAL);}
|
|
if (round(rand(0, 3)) == 2) {imageflip($ScaledBorder, IMG_FLIP_VERTICAL);}
|
|
if (round(rand(0, 3)) == 3) {imageflip($ScaledBorder, IMG_FLIP_BOTH);}
|
|
$ScaledBorder = imagerotate($ScaledBorder, 3 - rand(0, 6), imagecolorallocate($ScaledBorder, 76, 255, 0), true);
|
|
$Transparent = imagecolorallocatealpha ($Image, 255, 255, 255, 127);
|
|
for ($y = 0; $y < imagesy($ScaledBorder); ++$y)
|
|
{
|
|
for ($x = 0; $x < imagesx($ScaledBorder); ++$x)
|
|
{
|
|
$rgb = imagecolorsforindex($ScaledBorder, imagecolorat($ScaledBorder, $x, $y));
|
|
if ($rgb["green"] >= 250 && $rgb["red"] < 100 && $rgb["blue"] < 100)
|
|
{imagesetpixel($Image, $x, $y, $Transparent);}
|
|
else
|
|
{
|
|
if ($rgb["red"] > 0 && $rgb["green"] > 0 && $rgb["blue"] > 0 && rand(0, 1000) > 100)
|
|
{imagesetpixel($Image, $x, $y, imagecolorallocatealpha($Image, 255, 255, 255, $rgb["alpha"]));}
|
|
}
|
|
}
|
|
}
|
|
return $Image;
|
|
}
|
|
|
|
|
|
//Language variable handling (kind of shitty)
|
|
$GLOBALS["LanguageData"] = array();
|
|
function LoadLanguages()
|
|
{
|
|
$Temp = file_get_contents("Language/lang.txt");
|
|
$Temp = explode("\n", str_replace("\r", "", $Temp));
|
|
$CurLng = "";
|
|
for ($i = 0; $i < count($Temp); ++$i)
|
|
{
|
|
$Line = trim(explode("#", $Temp[$i])[0]);
|
|
if (!empty($Line))
|
|
{
|
|
if (substr($Line, 0, 1) == "[")
|
|
{
|
|
$CurLng = substr($Line, 1, -1);
|
|
$GLOBALS["LanguageData"][strtolower($CurLng)] = array();
|
|
}
|
|
else
|
|
{
|
|
if (!empty($CurLng))
|
|
{
|
|
$KeyPair = explode("=", $Line, 2);
|
|
$GLOBALS["LanguageData"][strtolower($CurLng)][strtolower(trim($KeyPair[0]))] = trim($KeyPair[1]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
?>
|