Panel/modules/lgsl_with_img_mod/image.php
2025-09-11 13:29:15 -04:00

476 lines
18 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/*
*
* OGP - Open Game Panel
* Copyright (C) 2008 - 2017 The OGP Development Team
*
* http://www.opengamepanel.org/
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*/
//------------------------------------------------------------------------------------------------------------+
// Basic Dynamic Server Image Status addon for LGSL by MadMakz (http://madmakz.com) for Cyber Games X24 (http://cgx24.com/).
// Tested & written for LGSL v5.8 (Might work with older/newer versions too)
// Version: 1.6-dev
// Licence: Nobody cares anyway, use it for whatever you want as long you do not sell/re-sell or steal the credits it´s fine.
//------------------------------------------------------------------------------------------------------------+
//------------------------------------------------------------------------------------------------------------+
// CUSTOM FUNCTIONS
function pretty_text($im, $fontsize, $x, $y, $string, $color, $outline = false)
{
$black = imagecolorallocate($bgImg, 0, 0, 0);
// Black outline
if($outline){
imagestring($im, $fontsize, $x - 1, $y - 1, $string, $black);
imagestring($im, $fontsize, $x - 1, $y, $string, $black);
imagestring($im, $fontsize, $x - 1, $y + 1, $string, $black);
imagestring($im, $fontsize, $x, $y - 1, $string, $black);
imagestring($im, $fontsize, $x, $y + 1, $string, $black);
imagestring($im, $fontsize, $x + 1, $y - 1, $string, $black);
imagestring($im, $fontsize, $x + 1, $y, $string, $black);
imagestring($im, $fontsize, $x + 1, $y + 1, $string, $black);
}
// Your text
imagestring($im, $fontsize, $x, $y, $string, $color);
return $im;
}
function pretty_text_ttf($im, $fontsize, $angle, $x, $y, $color, $font, $string, $outline = false)
{
$black = imagecolorallocate($bgImg, 0, 0, 0);
// Black outline
if($outline){
imagettftext($im, $fontsize, $angle, $x - 1, $y - 1, $black, $font, $string);
imagettftext($im, $fontsize, $angle, $x - 1, $y, $black, $font, $string);
imagettftext($im, $fontsize, $angle, $x - 1, $y + 1, $black, $font, $string);
imagettftext($im, $fontsize, $angle, $x, $y - 1, $black, $font, $string);
imagettftext($im, $fontsize, $angle, $x, $y + 1, $black, $font, $string);
imagettftext($im, $fontsize, $angle, $x + 1, $y - 1, $black, $font, $string);
imagettftext($im, $fontsize, $angle, $x + 1, $y, $black, $font, $string);
imagettftext($im, $fontsize, $angle, $x + 1, $y + 1, $black, $font, $string);
}
// Your text
imagettftext($im, $fontsize, $angle, $x, $y, $color, $font, $string);
return $im;
}
function lgsl_lookup_ip($ip, $port)
{
global $db;
$ip = $db->realEscapeSingle($ip);
$port = $db->realEscapeSingle($port);
$result = $db->resultQuery("SELECT `id` FROM `OGP_DB_PREFIXlgsl` WHERE `ip`='{$ip}' AND c_port='{$port}' LIMIT 1");
return $result[0];
}
function error_img($msg, $id, $type)
{
if(empty($type)) { $type = "normal"; }
$bgimg = "modules/lgsl_with_img_mod/lgsl_files/image/default_{$type}.png";
if (!file_exists($bgimg)) {
$bgimg = "modules/lgsl_with_img_mod/lgsl_files/image/default.png";
}
$im = imagecreatefrompng($bgimg);
$text_color = ImageColorAllocate($im,255,0,0);
switch($type){
case "normal":
imagestring($im,6,2,5,"ERROR! ID/IP: ".$id,$text_color);
imagestring($im,5,2,20,$msg,$text_color);
break;
case "small":
imagestring($im,6,2,0,"ERROR! ID/IP: ".$id,$text_color);
imagestring($im,5,2,10,$msg,$text_color);
break;
case "sky":
$misc['image_map'] = "modules/lgsl_with_img_mod/lgsl_files/other/map_no_response.jpg";
$im_map_info = getimagesize($misc['image_map']);
$im_map = imagecreatefromjpeg($misc['image_map']);
$im_map_width = 130;
$im_map_height = 120;
$im_map_posx = 25;
$im_map_posy = 112;
imagecopyresampled($im, $im_map, $im_map_posx, $im_map_posy, 0, 0, $im_map_width, $im_map_height, $im_map_info[0], $im_map_info[1]);
imagestring($im,1,6,28,"ERROR! ID/IP: ".$id,$text_color);
imagestring($im,1,6,45,$msg,$text_color);
break;
}
make_img($im);
}
function make_img($im = false, $cache_on = false, $cache_data = false, $force_cached = false, $format = false)
{
header("Content-type: image/png");
if($cache_on && $cache_data["file"]){
$expire = gmdate("D, d M Y H:i:s", $cache_data["cache_expire"])." GMT";
//$last = gmdate("D, d M Y H:i:s", filemtime($cache_data["file"]))." GMT";
header("Expires: ".$expire);
if(!$force_cached){ imagepng($im, $cache_data["file"], 9); }
readfile($cache_data["file"]);
}
else{ imagepng($im, null, 9); }
imagedestroy($im);
exit;
}
function lgsl_cache_info($id)
{
global $db;
$id = $db->realEscapeSingle($id);
$result = $db->resultQuery("SELECT `cache_time` FROM `OGP_DB_PREFIXlgsl` WHERE `id`='{$id}' LIMIT 1");
return empty($result[0]['cache_time']) ? array(0,0,0) : explode("_", $result[0]['cache_time']);
}
function cleaninput($input)
{
$remove = array("#\\\\+#", "#/+#", "#\\+#", "#\s+#", "#http+#", "#ftp+#", "#%00+#", "#\\0+#", "#\\x00+#", "#\(+#", "#\)+#", "#\{+#", "#\}+#");
// Some rules might be paranoid
$input = preg_replace($remove, "", $input);
$input = htmlspecialchars($input, ENT_QUOTES);
return $input;
}
//------------------------------------------------------------------------------------------------------------+
// SETTINGS
$cache_enable = true; // true/false // Enable/Disable Caching of generated images
$name_type_vertical = false; // false/true // Global default/fallback for printing the Servername verticaly on "Sky" images.
//------------------------------------------------------------------------------------------------------------+
// GET THE LGSL CORE
require_once "modules/lgsl_with_img_mod/lgsl_files/lgsl_class.php";
function exec_ogp_module()
{
error_reporting(0);
//------------------------------------------------------------------------------------------------------------+
// GET THE SERVER DETAILS AND PREPARE IT FOR DISPLAY
$s = cleaninput($_GET['s']);
if (strpos($s, ":")){
$is_ip = true;
$s2 = explode(":", $s, 2);
}
if (strpos($s, "_")){
$is_ip = true;
$s2 = explode("_", $s, 2);
}
if ($is_ip){
$lookup = lgsl_lookup_ip($s2[0], $s2[1]);
$lgsl_server_id = $lookup['id'];
if(!$lookup){
$s2[0] = gethostbyname($s2[0]);
$lookup = lgsl_lookup_ip($s2[0], $s2[1]);
$lgsl_server_id = $lookup['id'];
}
}
else {
$lookup = $s;
$lgsl_server_id = $s;
}
if($lookup){
$server = lgsl_query_cached("", "", "", "", "", "sep", $lgsl_server_id);
$fields = lgsl_sort_fields($server, $fields_show, $fields_hide, $fields_other);
$server = lgsl_sort_players($server);
$server = lgsl_sort_extras($server);
$misc = lgsl_server_misc($server);
}
if(!$lookup || !$server){
if(!$is_ip){ error_img("This server does not exist in Database", $s, cleaninput($_GET['img_type'])); }
else { error_img("This server does not exist in Database", $s2[0].":".$s2[1], cleaninput($_GET['img_type'])); }
return;
}
//------------------------------------------------------------------------------------------------------------+
// PREPARE THE IMAGE INFOS
// WHAT BACKGROUND IMAGE WE USE. THE LAYOUT IS "image/<GAMETYPE>/<GAME>_<IMGTYPE>.png"
$type = cleaninput($_GET['img_type']);
if (empty($type)){
$type = "normal";
}
$bgimg = cleaninput($_GET['bg']);
if (empty($bgimg)){
$bgimg = "{$server['b']['type']}/{$server['s']['game']}";
}
$bgimg = "modules/lgsl_with_img_mod/lgsl_files/image/{$bgimg}_{$type}.png";
// IMAGE CACHE
$cache_dir_prefix = "modules/lgsl_with_img_mod/lgsl_files/image";
$cache_file = "modules/lgsl_with_img_mod/lgsl_files/image/cache/".$server['b']['ip']."_".$server['b']['c_port']."-".$type;
$cache_time = lgsl_cache_info($lgsl_server_id);
$cache_time_expire = $cache_time[0];
$cache = array("file" => $cache_file, "cache_expire" => $cache_time_expire);
if($cache_enable && file_exists($cache["file"])){
if((time() - filemtime($cache["file"]) < $lgsl_config['cache_time']) || $server['b']['pending']){
make_img(false, true, $cache, true);
}
}
// CHECK IF BACKGROUND IMAGE EXISTS, IF NOT USE DEFAULT
if (!file_exists($bgimg)) {
$bgimg = "modules/lgsl_with_img_mod/lgsl_files/image/default_{$type}.png";
if (!file_exists($bgimg)) {
$bgimg = "modules/lgsl_with_img_mod/lgsl_files/image/default.png";
$type = "INVALID";
}
}
if($server['disabled'] == 1){
$bgimg = "modules/lgsl_with_img_mod/lgsl_files/image/default_{$type}.png";
if (!file_exists($bgimg)) {
$bgimg = "modules/lgsl_with_img_mod/lgsl_files/image/default.png";
$type = "INVALID";
}
}
//------------------------------------------------------------------------------------------------------------+
// GET THE REQUIRED VARIABLES FROM LGSL
// Rename status "NO RESPONSE" into "OFFLINE"
if ($misc['text_status']=="NO RESPONSE"){
$misc['text_status'] = "Offline";
}
// Dummies
$string0 = "";
$string1 = "";
$string2 = "";
$string3 = "";
$string4 = "";
// If available; Strip Bots from current player and seperate true/total ammount.
// Currently that only works on Sourcegames or any other game wich defines the bot ammount via "bots" tag in querry.
// There are probably more games wich provide bot ammount info via querry, taged as "bots" or under other name.
// Output format is: Trueplayers (Totalplayers)/Maxplayers
$botinfo = true;
$trueplayers = $server['s']['players'] - $server['e']['bots'];
$slotusage = "{$server['s']['players']}/{$server['s']['playersmax']}";
if(!$server['e']||!$server['e']['bots']||$server['e']['bots']=""){ $botinfo = false; }
if($botinfo){
$slotusage = "{$trueplayers} ({$server['s']['players']})/{$server['s']['playersmax']}";
}
// And now for real, first we do a little exeption for Left4Dead/2 (and TF2) since they have long mapnames wich would blow out on "small" image type
// as workarround we just remove the "Status" line
if($server['disabled'] == 0){
if ($server['s']['game']=="left4dead" || $server['s']['game']=="left4dead2" || $server['s']['game']=="tf" && $type=="small"){
$string0 = $server['s']['name'];
$string1 = "{$server['b']['ip']}:{$server['b']['c_port']}";
$string2 = $server['s']['map'];
$string4 = $slotusage;
}
else{
$string0 = $server['s']['name'];
$string1 = "{$server['b']['ip']}:{$server['b']['c_port']}";
$string2 = $server['s']['map'];
$string3 = $slotusage;
$string4 = ucfirst(strtolower($misc['text_status']));
}
}
//------------------------------------------------------------------------------------------------------------+
// DEFINE CREATE IMAGE FROM IMAGE SOURCE
$im = imagecreatefrompng($bgimg);
// MAP
if($server['disabled'] == 1){
$misc['image_map'] = "modules/lgsl_with_img_mod/lgsl_files/other/map_no_response.jpg";
}
// Adjust image map:
if(cURLEnabled()){
$misc['image_map'] = curlCacheImage($cache_dir_prefix, $misc['image_map']);
}else{
stream_context_set_default(
array(
'http' => array(
'method' => 'GET',
'user_agent' => 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0',
'header'=>'Referer: http://gametracker.com'
)
)
);
}
$im_map_info = getimagesize($misc['image_map']);
if ($im_map_info[2] == 1) { $im_map = imagecreatefromgif($misc['image_map']); }
if ($im_map_info[2] == 2) { $im_map = imagecreatefromjpeg($misc['image_map']); }
if ($im_map_info[2] == 3) { $im_map = imagecreatefrompng($misc['image_map']); }
if($server['disabled'] == 0){
// GAMEICON
$im_icon_info = getimagesize($misc['icon_game']);
if ($im_icon_info[2] == 1) { $im_icon = imagecreatefromgif($misc['icon_game']); }
if ($im_icon_info[2] == 2) { $im_icon = imagecreatefromjpeg($misc['icon_game']); }
if ($im_icon_info[2] == 3) { $im_icon = imagecreatefrompng($misc['icon_game']); }
// GEO IP (optional)
if (file_exists("modules/lgsl_with_img_mod/lgsl_files/geoip.inc.php")){
$geoip = true;
require_once "modules/lgsl_with_img_mod/lgsl_files/geoip.inc.php";
$gi = geoip_open( "modules/lgsl_with_img_mod/lgsl_files/GeoIP.dat", GEOIP_STANDARD );
$clookup = geoip_country_code_by_addr($gi, $server['b']['ip']);
if (empty($clookup)){ $clookup = geoip_country_code_by_name($gi, $server['b']['ip']); }
$clookup = strtolower($clookup);
$cimg = "images/countries/{$clookup}.png";
if (!file_exists($cimg)) { $cimg = "images/countries/noflag.png"; }
$cimage_info = getimagesize($cimg);
$cimage = imagecreatefrompng($cimg);
}
}
//------------------------------------------------------------------------------------------------------------+
// TEXT COLOR & FORMATING. PLAY WITH IT!
// WE USE 2 FONTS HERE, FIRST IS FOR THE HEADING/SERVERNAME (UTF-8), SECOND IS FOR THE CONTENT SUCH AS CURRENT MAP
$text_font0 = "modules/lgsl_with_img_mod/lgsl_files/image/_font/Cyberbas.ttf";
$size0 = 10; //Normal
$size2 = 12; //Small
$size4 = 9; //Sky
$text_font1 = "modules/lgsl_with_img_mod/lgsl_files/image/_font/Sansation_Regular.ttf";
$size1 = 10; //Normal
$size3 = 10; //Small
$size5 = 9; //Sky
// TEXT SETTINGS
if (file_exists("modules/lgsl_with_img_mod/lgsl_files/image/color_settings.php")){
include_once "modules/lgsl_with_img_mod/lgsl_files/image/color_settings.php";
}
// Fallback/default Textcolor
if(!$text_color0){
$text_color0 = ImageColorAllocate($im,245,250,1);
}
if(!$text_color1){
$text_color1 = ImageColorAllocate($im,1,250,1);
}
// Fallback/default for the Text outline
if (!$txt_outline){
switch($type){
case "small":
$txt_outline = false;
break;
case "normal":
$txt_outline = false;
break;
case "sky":
$txt_outline = false;
break;
}
}
//------------------------------------------------------------------------------------------------------------+
//------------------------------------------------------------------------------------------------------------+
// LOCATIONS/TYPES
switch($type){
case "normal":
if ($geoip){ imagecopyresampled($im, $cimage, 245, 35, 0, 0, 16, 11, $cimage_info[0], $cimage_info[1]); } // Country
pretty_text_ttf($im,$size4,0,2,15,$text_color1,$text_font0,substr($string0,0,60), $txt_outline); // Servername
pretty_text_ttf($im,$size4,0,65,45,$text_color0,$text_font1,$string1, $txt_outline); // IP:PORT
pretty_text_ttf($im,$size1,0,65,63,$text_color0,$text_font1,$string2, $txt_outline); // Map
pretty_text_ttf($im,$size1,0,292,45,$text_color0,$text_font1,$string3, $txt_outline); // Players
pretty_text_ttf($im,$size1,0,293,63,$text_color0,$text_font1,$string4, $txt_outline); // Status
break;
case "small":
if ($geoip){ imagecopyresampled($im, $cimage, 315, 1, 0, 0, 16, 11, $cimage_info[0], $cimage_info[1]); } // Country
pretty_text_ttf($im,$size0,0,2,10,$text_color1,$text_font0,substr($string0,0,45), $txt_outline); // Servername
pretty_text_ttf($im,$size3,0,2,24,$text_color0,$text_font1,substr($string1,0,20), $txt_outline); // IP:Port
pretty_text_ttf($im,$size3,0,145,24,$text_color0,$text_font1,$string2, $txt_outline); // Map
pretty_text_ttf($im,$size3,0,255,24,$text_color0,$text_font1,$string3, $txt_outline); // Players
pretty_text_ttf($im,$size3,0,295,24,$text_color0,$text_font1,$string4, $txt_outline); // Status
break;
case "sky":
// DEFINE
$im_map_width = 160;
$im_map_height = 120;
$im_map_posx = 10;
$im_map_posy = 125;
$im_icon_width = 16;
$im_icon_height = 16;
$im_icon_posx = 16;
$im_icon_posy = 127;
imagecopyresampled($im, $im_map, $im_map_posx, $im_map_posy, 0, 0, $im_map_width, $im_map_height, $im_map_info[0], $im_map_info[1]); // Mapimage
if($server['disabled'] == 0){
imagecopyresampled($im, $im_icon, $im_icon_posx, $im_icon_posy, 0, 0, $im_icon_width, $im_icon_height, $im_icon_info[0], $im_icon_info[1]); // Gameicon
if ($geoip){ imagecopyresampled($im, $cimage, $im_icon_posx + 132, $im_icon_posy, 0, 0, 16, 11, $cimage_info[0], $cimage_info[1]); } // Country
}
if($name_type_vertical){ pretty_text_ttf($im,$size4,270,5,20,$text_color1,$text_font0,substr($string0,0,28), $txt_outline); } // Servername Vertical
else{ pretty_text_ttf($im,$size4,0,10,15,$text_color1,$text_font0,substr($string0,0,26), $txt_outline); } // Servername
pretty_text_ttf($im,$size5,0,5,30,$text_color0,$text_font1,"IP:Port: ".substr($string1,0,20), $txt_outline); // IP:Port
pretty_text_ttf($im,$size5,0,5,52,$text_color0,$text_font1,"Map : ".substr($string2,0,20), $txt_outline); // Map
pretty_text_ttf($im,$size5,0,5,74,$text_color0,$text_font1,"Players: ".$string3, $txt_outline); // Players
pretty_text_ttf($im,$size5,0,5,96,$text_color0,$text_font1,"Status : ".substr($string4,0,20), $txt_outline); // Status
break;
// WHATEVER HAPPENS, ALWAYS PRINT SOMETHING & HOPE THAT AT LEAST THE DEFAULT IMAGE EXISTS...
default:
$text_color0 = ImageColorAllocate($im,0,0,0);
imagettftext($im,11,0,10,14,$text_color0,$text_font0,$string0);
imagettftext($im,10,0,10,34,$text_color0,$text_font1,$string1);
imagettftext($im,10,0,10,54,$text_color0,$text_font1,$string2);
imagettftext($im,10,0,10,74,$text_color0,$text_font1,$string3);
imagettftext($im,10,0,10,94,$text_color0,$text_font1,$string4);
break;
}
//------------------------------------------------------------------------------------------------------------+
//------------------------------------------------------------------------------------------------------------+
// NOW LET THE MAGIC HAPPEN AND PULL ALL THAT INTO AN IMAGE.
make_img($im, $cache_enable, $cache);
}
?>