Файл: system/functions.php
Строк: 596
<?php
/* Обновление игры под PHP 8.4 / PDO и усиление безопасности: by Метриум (Стэлп) */
// Безопасная нормализация входных данных для PHP 8.4.
// Не преобразуем глобальные массивы GET/POST/COOKIE/SESSION в HTML: экранирование выполняется при выводе.
function _string($value): string {
if ($value === null || is_array($value) || is_object($value) || is_resource($value)) {
return '';
}
$value = trim((string)$value);
return db_real_escape_string($value);
}
function _num($i) {
$i = (int) abs(intval($i));
return $i;
}
function n_f($i) {
// PHP 8.4: number_format() returns a string, so never pass that string to round().
// Legacy DB/templates sometimes contain already formatted values like "6.000.000".
if (is_string($i)) {
$raw = trim(str_replace(["xC2xA0", ' ', "'"], '', $i));
if (preg_match('/^[+-]?d{1,3}(?:.d{3})+$/D', $raw)) {
$raw = str_replace('.', '', $raw);
} elseif (str_contains($raw, ',') && !str_contains($raw, '.')) {
$raw = str_replace(',', '.', $raw);
}
$i = is_numeric($raw) ? (float)$raw : 0.0;
} elseif (!is_int($i) && !is_float($i)) {
$i = is_numeric($i) ? (float)$i : 0.0;
}
$num = (float)$i;
$sign = $num < 0 ? '-' : '';
$num = abs($num);
$compact = static function(float $value, float $divisor, string $suffix) use ($sign): string {
$v = round($value / $divisor, 3);
$txt = rtrim(rtrim(number_format($v, 3, '.', ''), '0'), '.');
return $sign.$txt.$suffix;
};
if ($num >= 1000000) return $compact($num, 1000000, 'M');
if ($num >= 10000) return $compact($num, 1000, 'K');
return $sign.number_format($num, 0, '', "'");
}
function pages($path) {
global $page, $pages;
if(($page - 2) > 0) {
echo ' <a href="'.$path.'page=1"><<</a> ';
}
else
{
echo '<<';
}
if($page - 1 > 0) {
echo ' <a href="'.$path.'page='.($page - 1).'"><</a> ';
}
else
{
echo ' < ';
}
if($page == $pages && $page - 4 > 0) {
echo ' <a href="'.$path.'page='.($page - 4).'">'.($page - 4).'</a> ';
}
if($page == $pages && $page - 3 > 0) {
echo ' <a href="'.$path.'page='.($page - 3).'">'.($page - 3).'</a> ';
}
if($page - 2 > 0) {
echo ' <a href="'.$path.'page='.($page - 2).'">'.($page - 2).'</a> ';
}
if($page - 1 > 0) {
echo ' <a href="'.$path.'page='.($page - 1).'">'.($page - 1).'</a> ';
}
echo $page;
if($page + 1 <= $pages) {
echo ' <a href="'.$path.'page='.($page + 1).'">'.($page + 1).'</a> ';
}
if($page + 2 <= $pages) {
echo ' <a href="'.$path.'page='.($page + 2).'">'.($page + 2).'</a> ';
}
if($page == 1 && $page + 3 <= $pages) {
echo ' <a href="'.$path.'page='.($page + 3).'">'.($page + 3).'</a> ';
}
if($page == 1 && $page + 4 <= $pages) {
echo ' <a href="'.$path.'page='.($page + 4).'">'.($page + 4).'</a> ';
}
if($page + 1 <= $pages) {
echo ' <a href="'.$path.'page='.($page + 1).'">></a> ';
}
else
{
echo ' > ';
}
if(($page + 2) <= $pages) {
echo ' <a href="'.$path.'page='.$pages.'">>></a> ';
}
else
{
echo ' >> ';
}
}
function smiles($string) {
$string = str_replace(array(':@)',':ded'), '<img src="/images/smiles/mini_ded.gif" alt="*"/>', $string);
$string = str_replace(array('O:-)','o:-)'),'<img src="/images/smiles/mini_angel.gif" alt="*"/>', $string);
$string = str_replace(array(']:-)',']:-]'),'<img src="/images/smiles/mini_diablo.gif" alt="*"/>', $string);
$string = str_replace(array(':$',':-$',':-['),'<img src="/images/smiles/mini_blush.gif" alt="*"/>', $string);
$string = str_replace(array(':))',':-))','-))','=))'),'<img src="/images/smiles/mini_lol.gif" alt="*"/>', $string);
$string = str_replace(array(':)',':-)','=)'),'<img src="/images/smiles/mini_ulibka.gif" alt="*"/>', $string);
$string = str_replace(array(';)',';-)'),'<img src="/images/smiles/mini_podmigivanie.gif" alt="*"/>', $string);
$string = str_replace(array(':-D',':-d',':D',')))'),'<img src="/images/smiles/mini_spin.gif" alt="*"/>', $string);
$string = str_replace(array(':-P',':-p',':-Р',':-р',':P',':p'),'<img src="/images/smiles/mini_yazyk.gif" alt="*"/>', $string);
$string = str_replace(array(':(',':-('),'<img src="/images/smiles/mini_sad.gif" alt="*"/>', $string);
$string = str_replace(array(':'(',':'-('),'<img src="/images/smiles/mini_cry.gif" alt="*"/>', $string);
$string = str_replace(array(':]',':-]'),'<img src="/images/smiles/mini_dovolen.gif" alt="*"/>', $string);
$string = str_replace(array(':-/',':-\'),'<img src="/images/smiles/mini_hm.gif" alt="*"/>', $string);
$string = str_replace(array('8-)','%-)'),'<img src="/images/smiles/mini_krut.gif" alt="*"/>', $string);
$string = str_replace(array(':*',':-*'),'<img src="/images/smiles/mini_kiss.gif" alt="*"/>', $string);
$string = str_replace(array('%)','%-)'),'<img src="/images/smiles/mini_crazy.gif" alt="*"/>', $string);
$string = str_replace(array(':-o',':-O',':-о',':-О','O.o','О.о','O_o','o_O'),'<img src="/images/smiles/mini_chok.gif" alt="*"/>', $string);
$string = str_replace(array('О^','O^','o^'),'<img src="/images/smiles/mini_bye.gif" alt="*"/>', $string);
$string = str_replace(array(':Оb',':Ob',':ob'),'<img src="/images/smiles/mini_good.gif" alt="*"/>', $string);
$string = str_replace(array('%-E'),'<img src="/images/smiles/mini_gigi.gif" alt="*"/>', $string);
$string = str_replace(array(':gigi'),'<img src="/images/smiles/mini_gig.gif" alt="*"/>', $string);
$string = str_replace(array('6-('),'<img src="/images/smiles/mini_fingal.gif" alt="*"/>', $string);
$string = str_replace(array(':bravo',':браво'),'<img src="/images/smiles/mini_bravo.gif" alt="*"/>', $string);
$string = str_replace(array(':heart',':сердце'),'<img src="/images/smiles/mini_heart.gif" alt="*"/>', $string);
$string = str_replace(array(':fig',':фиг'),'<img src="/images/smiles/mini_fig.gif" alt="*"/>', $string);
$string = str_replace(array(':rose',':роза','@--'),'<img src="/images/smiles/mini_rose.gif" alt="*"/>', $string);
$string = str_replace(array(':krut',':крут'),'<img src="/images/smiles/mini_krut.gif" alt="*"/>', $string);
$string = str_replace(array(':vsemprivet',':всемпривет'),'<img src="/images/smiles/mini_privet.gif" alt="*"/>', $string);
$string = str_replace(array(':rzhu', ':rzhu'),'<img src="/images/smiles/rzhu.gif" alt="*"/>', $string);
$string = str_replace(array(':блин',':blin'),'<img src="/images/smiles/blin.gif" alt="*"/>', $string);
$string = str_replace(array(':язык',':blum'),'<img src="/images/smiles/blum.gif" alt="*"/>', $string);
$string = str_replace(array(':баян',':boyan'),'<img src="/images/smiles/boyan.gif" alt="*"/>', $string);
$string = str_replace(array(':качаюсь',':sila'),'<img src="/images/smiles/exercise.gif" alt="*"/>', $string);
$string = str_replace(array(':любимвас',':love'),'<img src="/images/smiles/love_site.gif" alt="*"/>', $string);
$string = str_replace(array(':нештяк',':neshtyak'),'<img src="/images/smiles/krutoy.gif" alt="*"/>', $string);
$string = str_replace(array(':дискач',':disko'),'<img src="/images/smiles/impreza.gif" alt="*"/>', $string);
$string = str_replace(array(':мистер',':mr'),'<img src="/images/smiles/mister.gif" alt="*"/>', $string);
$string = str_replace(array(':упс',':oops'),'<img src="/images/smiles/oops.gif" alt="*"/>', $string);
$string = str_replace(array(':битва',':boy'),'<img src="/images/smiles/starwars.gif" alt="*"/>', $string);
$string = str_replace(array(':зажгём',':yahoo'),'<img src="/images/smiles/yahoo.gif" alt="*"/>', $string);
$string = str_replace(array(':присмотр',':spy'),'<img src="/images/smiles/spy.gif" alt="*"/>', $string);
$string = str_replace(array(':реп',':rap'),'<img src="/images/smiles/rap.gif" alt="*"/>', $string);
$string = str_replace(array(':рембо',':rembo'),'<img src="/images/smiles/rembo.gif" alt="*"/>', $string);
$string = str_replace(array(':подмиг',':wink'),'<img src="/images/smiles/girl_wink.gif" alt="*"/>', $string);
$string = str_replace(array(':танцуем',':dance'),'<img src="/images/smiles/dance3.gif" alt="*"/>', $string);
$string = str_replace(array(':фаны',':fans'),'<img src="/images/smiles/fans.gif" alt="*"/>', $string);
$string = str_replace(array(':тема',':tema'),'<img src="/images/smiles/close_tema.gif" alt="*"/>', $string);
$string = str_replace(array(':потстулом'),'<img src="/images/smiles/patstulom.gif" alt="*"/>', $string);
$string = str_replace(array(':нямням',':nyam'),'<img src="/images/smiles/nyam2.gif" alt="*"/>', $string);
$string = str_replace(array(':пока', ':пока'),'<img src="/images/smiles/poka.gif" alt="*"/>', $string);
$string = str_replace(array('::dash1', ':dash1'),'<img src="/images/smiles/dash1.gif" alt="*"/>', $string);
$string = str_replace(array('dOOb','doob','d00b'),'<img src="/images/smiles/mini_friends.gif" alt="*"/>', $string);
$string = str_replace(array(':igra',':игра'),'<img src="/images/smiles/igra.gif" alt="*"/>', $string);
///////////////////////////////////////
$string = str_replace(array(':clapping',':clapping'),'<img src="/images/smiles/clapping.gif" alt="*"/>', $string);
$string = str_replace(array(':1perdun',':1perdun'),'<img src="/images/smiles/1perdun.gif" alt="*"/>', $string);
$string = str_replace(array(':26trening',':26trening'),'<img src="/images/smiles/26trening.gif" alt="*"/>', $string);
$string = str_replace(array(':25gitara',':25gitara'),'<img src="/images/smiles/25gitara.gif" alt="*"/>', $string);
$string = str_replace(array(':23gudok',':23gudok'),'<img src="/images/smiles/23gudok.gif" alt="*"/>', $string);
$string = str_replace(array(':21gun',':21gun'),'<img src="/images/smiles/21gun.gif" alt="*"/>', $string);
$string = str_replace(array(':23jason',':23jason'),'<img src="/images/smiles/23jason.gif" alt="*"/>', $string);
$string = str_replace(array(':19viselica',':19viselica'),'<img src="/images/smiles/19viselica.gif" alt="*"/>', $string);
$string = str_replace(array(':18rebenok1',':18rebenok1'),'<img src="/images/smiles/18rebenok1.gif" alt="*"/>', $string);
$string = str_replace(array(':17zvezdy',':17zvezdy'),'<img src="/images/smiles/17zvezdy.gif" alt="*"/>', $string);
$string = str_replace(array(':13telefon',':13telefon'),'<img src="/images/smiles/13telefon.gif" alt="*"/>', $string);
$string = str_replace(array(':0bc',':0bc'),'<img src="/images/smiles/0bc.gif" alt="*"/>', $string);
$string = str_replace(array(':18nakone',':18nakone'),'<img src="/images/smiles/18nakone.gif" alt="*"/>', $string);
////////////////////////////////////////
$string = str_replace(array(':фото',':foto'),'<img src="/images/smiles/fotograf.gif" alt="*"/>', $string);
$string = str_replace(array(':художник',':hudozhnik'),'<img src="/images/smiles/hudozh00.gif" alt="*"/>', $string);
$string = str_replace(array(':карты',':karty'),'<img src="/images/smiles/karty000.gif" alt="*"/>', $string);
$string = str_replace(array(':куку',':kuku'),'<img src="/images/smiles/kuku0000.gif" alt="*"/>', $string);
$string = str_replace(array(':курит',':kurit'),'<img src="/images/smiles/kur00000.gif" alt="*"/>', $string);
$string = str_replace(array(':лак',':lak'),'<img src="/images/smiles/lak00000.gif" alt="*"/>', $string);
$string = str_replace(array(':неповезло',':nepovezlo'),'<img src="/images/smiles/nepovezl.gif" alt="*"/>', $string);
$string = str_replace(array(':хелов',':hello'),'<img src="/images/smiles/hello000.gif" alt="*"/>', $string);
$string = str_replace(array(':клёва',':kleva'),'<img src="/images/smiles/kleva000.gif" alt="*"/>', $string);
$string = str_replace(array(':варвар',':varvar'),'<img src="/images/smiles/varvar00.gif" alt="*"/>', $string);
$string = str_replace(array(':33_cofe'),'<img src="/images/smiles/33_cofe.gif" alt="*"/>', $string);
return $string;
}
function _time($i) {
$i=max(0,(int)$i); $d=intdiv($i,86400); $h=intdiv($i%86400,3600); $m=intdiv($i%3600,60); $s=$i%60;
$prefix=$d>0?$d.'д ':''; return $prefix.($h>0?str_pad((string)$h,2,'0',STR_PAD_LEFT).':':'').str_pad((string)$m,2,'0',STR_PAD_LEFT).':'.str_pad((string)$s,2,'0',STR_PAD_LEFT);
}
function bb($string) {
// Безопасный BBCode только для форума: by Метриум (Стэлп).
// Сначала нейтрализуем пользовательский HTML, затем разрешаем строго белый список BB-тегов.
$string=(string)$string;
$placeholders=[];
$string=preg_replace_callback('~<imgs+src="/images/smiles/([A-Za-z0-9_.-]+)"s+alt="*"s*/?>~i', function($m) use (&$placeholders){
$key='%%SMILE'.count($placeholders).'%%';
$placeholders[$key]='<img src="/images/smiles/'.htmlspecialchars($m[1],ENT_QUOTES|ENT_SUBSTITUTE,'UTF-8').'" alt="*">';
return $key;
}, $string) ?? $string;
$string=htmlspecialchars($string, ENT_QUOTES|ENT_SUBSTITUTE, 'UTF-8');
$simple=[
'b'=>'strong','i'=>'em','u'=>'u','s'=>'s','small'=>'small','sup'=>'sup','sub'=>'sub','code'=>'code'
];
foreach($simple as $bb=>$html){
$string=preg_replace('~['.$bb.'](.*?)[/'.$bb.']~is','<'.$html.'>$1</'.$html.'>',$string) ?? $string;
}
$string=preg_replace_callback('~[color=([^]]{1,32})](.*?)[/color]~is', function($m){
$c=trim(html_entity_decode($m[1],ENT_QUOTES|ENT_HTML5,'UTF-8'));
if(!preg_match('/^(?:#[0-9a-f]{3,8}|[a-z]{3,20})$/i',$c)) return $m[2];
return '<span style="color:'.htmlspecialchars($c,ENT_QUOTES,'UTF-8').'">'.$m[2].'</span>';
},$string) ?? $string;
$string=preg_replace_callback('~[size=([^]]{1,12})](.*?)[/size]~is', function($m){
$n=(int)$m[1]; if($n<8||$n>32) return $m[2];
return '<span style="font-size:'.$n.'px">'.$m[2].'</span>';
},$string) ?? $string;
$string=preg_replace_callback('~[url=([^]]{1,500})](.*?)[/url]~is', function($m){
$url=html_entity_decode(trim($m[1]),ENT_QUOTES|ENT_HTML5,'UTF-8');
if(!preg_match('~^(?:https?://|/)~i',$url)) return $m[2];
return '<a href="'.htmlspecialchars($url,ENT_QUOTES|ENT_SUBSTITUTE,'UTF-8').'" rel="nofollow noopener noreferrer">'.$m[2].'</a>';
},$string) ?? $string;
$string=preg_replace_callback('~[img=([^]]{1,500})](?:[/img])?~is', function($m){
$url=html_entity_decode(trim($m[1]),ENT_QUOTES|ENT_HTML5,'UTF-8');
if(!preg_match('~^(?:https?://|/)~i',$url)) return '';
return '<img src="'.htmlspecialchars($url,ENT_QUOTES|ENT_SUBSTITUTE,'UTF-8').'" alt="">';
},$string) ?? $string;
// Обычный формат [img]URL[/img] тоже поддерживается — by Метриум (Стэлп).
$string=preg_replace_callback('~[img](.{1,500}?)[/img]~is', function($m){
$url=html_entity_decode(trim($m[1]),ENT_QUOTES|ENT_HTML5,'UTF-8');
if(!preg_match('~^(?:https?://|/)~i',$url)) return '';
return '<img src="'.htmlspecialchars($url,ENT_QUOTES|ENT_SUBSTITUTE,'UTF-8').'" alt="">';
},$string) ?? $string;
foreach(['center'=>'center','right'=>'right','left'=>'left'] as $tag=>$align){
$string=preg_replace('~['.$tag.'](.*?)[/'.$tag.']~is','<div style="text-align:'.$align.'">$1</div>',$string) ?? $string;
}
$string=preg_replace('~[quote](.*?)[/quote]~is','<blockquote class="bb-quote">$1</blockquote>',$string) ?? $string;
$string=preg_replace('~[spoiler](.*?)[/spoiler]~is','<details class="bb-spoiler"><summary>Спойлер</summary>$1</details>',$string) ?? $string;
$string=preg_replace('~[list](.*?)[/list]~is','<ul class="bb-list">$1</ul>',$string) ?? $string;
$string=preg_replace('~[*](.*?)(?=(?:[*]|</ul>))~is','<li>$1</li>',$string) ?? $string;
$string=preg_replace('~[br]~i','<br>',$string) ?? $string;
$string=preg_replace('~[hr]~i','<hr>',$string) ?? $string;
$string=nl2br($string,false);
foreach($placeholders as $key=>$html) $string=str_replace($key,$html,$string);
return $string;
}
/**
* Рендер доверенных системных сообщений. Поддерживает старые локальные HTML-теги
* и новые BB-коды, но не пропускает произвольный HTML/JS из БД.
* by Метриум (Стэлп)
*/
function game_system_text($text) {
$text=(string)$text;
$safe=[];
$put=function(string $html) use (&$safe): string { $k='%%SYSHTML'.count($safe).'%%'; $safe[$k]=$html; return $k; };
// Старые системные сообщения также содержат внутренние ссылки на игроков/локации.
$text=preg_replace_callback('~<a\s+[^>]*href\s*=\s*["\']?(/[^"\'\s>]+)["\']?[^>]*>(.*?)</a>~is',
function($m) use ($put){
$href=(string)$m[1];
if(str_starts_with($href,'//') || preg_match('~[\r\n<>]~',$href)) return htmlspecialchars(strip_tags((string)$m[2]),ENT_QUOTES|ENT_SUBSTITUTE,'UTF-8');
return $put('<a href="'.htmlspecialchars($href,ENT_QUOTES|ENT_SUBSTITUTE,'UTF-8').'">'.game_system_text($m[2]).'</a>');
}, $text) ?? $text;
// Старые сообщения хранили локальные иконки как <img src=/images/...>.
$text=preg_replace_callback('~<img\s+[^>]*src\s*=\s*["\']?(/images/[A-Za-z0-9_./-]+)["\']?[^>]*>~i',
function($m) use ($put){ return $put('<img src="'.htmlspecialchars($m[1],ENT_QUOTES|ENT_SUBSTITUTE,'UTF-8').'" alt="">'); }, $text) ?? $text;
// Старые цветовые span. Разрешаем только известные CSS-классы игры.
$text=preg_replace_callback('~<span\s+class\s*=\s*["\']?([A-Za-z0-9_-]+)["\']?\s*>(.*?)</span>~is',
function($m) use ($put){
$allowed=['dgreen','green','red','dred','blue','grey','yellow','orange','purple','white','bold','medium','small'];
$cls=in_array(strtolower($m[1]),$allowed,true)?strtolower($m[1]):'';
if($cls==='') return $m[2];
return $put('<span class="'.$cls.'">'.game_system_text($m[2]).'</span>');
}, $text) ?? $text;
foreach(['br','hr'] as $tag){ $text=preg_replace_callback('~<'.$tag.'\s*/?>~i',fn($m)=>$put('<'.$tag.'>'),$text) ?? $text; }
foreach(['b'=>'b','strong'=>'strong','i'=>'i','em'=>'em','u'=>'u'] as $tag=>$html){
$text=preg_replace_callback('~<'.$tag.'>(.*?)</'.$tag.'>~is',fn($m)=>$put('<'.$html.'>'.game_system_text($m[1]).'</'.$html.'>'),$text) ?? $text;
}
$text=bb($text);
foreach($safe as $k=>$html) $text=str_replace($k,$html,$text);
return $text;
}
function _times($i) {
$d = floor($i / 86400);
$h = floor(($i / 3600) - $d * 24);
$m = floor(($i - $h * 3600 - $d * 86400) / 60);
$s = $i - ($m * 60 + $h * 3600 + $d * 86400);
if($d > 0) {
$result = $d.' д';
}
elseif($h > 0)
{
$result = $h.' ч';
}elseif($m > 0)
{
$result = $m.' мин';
}elseif($s >= 0)
{
$result = $s.' сек';
}
return $result.' назад';
}
// New Times
function NewTime($i) {
$d = floor($i / 86400);
$h = floor(($i / 3600) - $d * 24);
$m = floor(($i - $h * 3600 - $d * 86400) / 60);
$s = $i - ($m * 60 + $h * 3600 + $d * 86400);
if($d > 0) {
$result = $d.' д '.$h.' ч.';
}
elseif($h > 0)
{
$result = $h.' ч '.$m.' м.';
}elseif($m > 0)
{
$result = $m.' мин '.$s.' сек.';
}elseif($s >= 0)
{
$result = $s.' сек';
}
return $result;
}
function NameBot(){
$array = array('q','w','r','t','p','s','d','f','g','h','j','k','l','z','x','c','v','b','n','m');
$array2 = array('e','y','u','i','o','a');
$strlen = rand(5,6);
$name = '';
for($i = 1; $i <= $strlen; $i ++) {
if ($i == 1) {
$key = array_rand($array);
$name .= $array[$key];
}
elseif ($i == 2) {
$key = array_rand($array2);
$name .= $array2[$key];
}
elseif ($i <= 3) {
$key = array_rand($array);
$name .= $array[$key];
}
else
{
$key = array_rand($array);
$name .= $array[$key];
}
}
$name = mb_convert_case($name, MB_CASE_TITLE, "UTF-8");
return $name;
}
function tl($tl){
$d=3600*24;
$day=floor($tl/$d);
$tl=$tl - ($d*$day);
$hour=floor($tl/3600);
$tl=$tl-(3600*$hour);
$minute=floor($tl/60);
$tl=$tl-(60*$minute);
$second=floor($tl);
$dayt="".($day>0?"$day д. ":null)."";
$hourt="".($hour>0?"$hour ч. ":null)."";
$minutet="".($minute>0?"$minute м. ":null)."";
$secondt="".($second>0?"$second с. ":null)."";
if($day>0){
$minutet=NULL;
$secondt=NULL;
}
if($hour>0 && $day==0){
$secondt=NULL;
$dayt=NULL;
}
return "$dayt $hourt $minutet $secondt";
}
function _data($timep) {
/////////////////////
$timep=str_replace("Jan","Января",$timep);
$timep=str_replace("Feb","Февраля",$timep);
$timep=str_replace("Mar","Марта",$timep);
$timep=str_replace("May","Мая",$timep);
$timep=str_replace("Apr","Апреля",$timep);
$timep=str_replace("Jun","Июня",$timep);
$timep=str_replace("Jul","Июля",$timep);
$timep=str_replace("Aug","Августа",$timep);
$timep=str_replace("Sep","Сентября",$timep);
$timep=str_replace("Oct","Октября",$timep);
$timep=str_replace("Nov","Ноября",$timep);
$timep=str_replace("Dec","Декабря",$timep);
return $timep. ' ';
}
/* Активные промо-блоки интерфейса — by Метриум (Стэлп) */
if (!function_exists('game_promo_defaults')) {
function game_promo_defaults(): array {
return [
'sunduk_start'=>[1=>['name'=>'Сундуки звездной пыли','url'=>'sunduk']],
'skilka'=>[
1=>['name'=>'Скидка на тренировку','url'=>'train'],
2=>['name'=>'Скидка на арену','url'=>'arena'],
3=>['name'=>'Скидка на руны','url'=>'smith/runes'],
4=>['name'=>'Скидка на вещи','url'=>'shop'],
5=>['name'=>'Скидка на бонус вещей','url'=>'smith/bonus'],
7=>['name'=>'Акция: золото ×2','url'=>'payment'],
],
];
}
}
if (!function_exists('game_active_discount_percent')) {
function game_active_discount_percent(int $id): int {
$id=max(0,$id); $now=time();
$row=db_fetch_one('SELECT `zena`,`time` FROM `skilka` WHERE `id`=:i LIMIT 1',['i'=>$id]);
if(!$row || (int)($row['time']??0)<=$now) return 0;
return max(0,min(100,(int)($row['zena']??0)));
}
}
if (!function_exists('game_chest_event_active')) {
function game_chest_event_active(): bool {
$row=db_fetch_one('SELECT `time` FROM `sunduk_start` WHERE `id`=1 LIMIT 1');
return $row && (int)($row['time']??0)>time();
}
}
if (!function_exists('game_active_promos')) {
function game_active_promos(int $limit = 8): array {
static $cache = null;
if ($cache === null) {
$cache = []; $now=time(); $defs=game_promo_defaults();
foreach (['sunduk_start','skilka'] as $table) {
$q=db_query("SELECT * FROM `{$table}` WHERE `time` > {$now} ORDER BY `time` ASC LIMIT 12");
while($row=db_fetch_array($q)){
if(!is_array($row)) continue;
$id=(int)($row['id']??0); $fallback=$defs[$table][$id]??null;
$rawName=trim((string)($row['nazvanie']??'')); $rawUrl=trim((string)($row['url']??''));
$name=($rawName!=='' && $rawName!=='0')?$rawName:(string)($fallback['name']??'');
$url=($rawUrl!=='' && $rawUrl!=='0')?$rawUrl:(string)($fallback['url']??'');
$until=(int)($row['time']??0); if($name===''||$url===''||$until<=$now) continue;
$cache[]=['name'=>$name,'url'=>'/'.trim($url,'/').'/', 'until'=>$until,
'discount'=>$table==='skilka'?(int)($row['zena']??0):0,'kind'=>$table,'id'=>$id];
}
}
usort($cache,static fn(array $a,array $b):int=>$a['until']<=>$b['until']);
}
return array_slice($cache,0,max(0,$limit));
}
}
?>