\n"); if ($heading) print("

".$heading."

\n"); print("
"); print($text . "
\n"); } function stderr($heading, $text, $htmlstrip = true, $head = true, $foot = true, $die = true) { if ($head) stdhead(); stdmsg($heading, $text, $htmlstrip); if ($foot) stdfoot(); if ($die) die; } function sqlerr($file = '', $line = '') { print("" . "

SQL Error

\n" . "" . mysql_error() . ($file != '' && $line != '' ? "

in $file, line $line

" : "") . "
"); die; } function format_quotes($s) { global $lang_functions; preg_match_all('/\\[quote.*?\\]/i', $s, $result, PREG_PATTERN_ORDER); $openquotecount = count($openquote = $result[0]); preg_match_all('/\\[\/quote\\]/i', $s, $result, PREG_PATTERN_ORDER); $closequotecount = count($closequote = $result[0]); if ($openquotecount != $closequotecount) return $s; // quote mismatch. Return raw string... // Get position of opening quotes $openval = array(); $pos = -1; foreach($openquote as $val) $openval[] = $pos = strpos($s,$val,$pos+1); // Get position of closing quotes $closeval = array(); $pos = -1; foreach($closequote as $val) $closeval[] = $pos = strpos($s,$val,$pos+1); for ($i=0; $i < count($openval); $i++) if ($openval[$i] > $closeval[$i]) return $s; // Cannot close before opening. Return raw string... $s = preg_replace("/\\[quote\\]/i","
".$lang_functions['text_quote']."
",$s); $s = preg_replace("/\\[quote=(.+?)\\]/i", "
".$lang_functions['text_quote'].": \\1
", $s); $s = preg_replace("/\\[\\/quote\\]/i","

",$s); return $s; } function print_attachment($dlkey, $enableimage = true, $imageresizer = true) { global $Cache, $httpdirectory_attachment; global $lang_functions; if (strlen($dlkey) == 32){ if (!$row = $Cache->get_value('attachment_'.$dlkey.'_content')){ $res = sql_query("SELECT * FROM attachments WHERE dlkey=".sqlesc($dlkey)." LIMIT 1") or sqlerr(__FILE__,__LINE__); $row = mysql_fetch_array($res); $Cache->cache_value('attachment_'.$dlkey.'_content', $row, 86400); } } if (!$row) { return "
".$lang_functions['text_attachment_key'].$dlkey.$lang_functions['text_not_found']."
"; } else{ $id = $row['id']; if ($row['isimage'] == 1) { if ($enableimage){ // if ($row['thumb'] == 1){ // $url = $httpdirectory_attachment."/".$row['location'].".thumb.jpg"; // $url = $httpdirectory_attachment."/".$row['location']; // } // else{ // $url = $httpdirectory_attachment."/".$row['location']; // } $url = \Nexus\Attachment\Storage::getDriver($row['driver'])->getImageUrl($row['location']); do_log(sprintf("driver: %s, location: %s, url: %s", $row['driver'], $row['location'], $url)); if($imageresizer == true) $onclick = " onclick=\"Previewurl('".$url."')\""; else $onclick = ""; $return = "\"".htmlspecialchars($row['filename'])."\"".$lang_functions['text_size'].": ".mksize($row['filesize'])."
".gettime($row['added']))."', 'styleClass', 'attach', 'x', findPosition(this)[0], 'y', findPosition(this)[1]-58);\" />"; } else $return = ""; } else { switch($row['filetype']) { case 'application/x-bittorrent': { $icon = "\"torrent\""; break; } case 'application/zip':{ $icon = "\"zip\""; break; } case 'application/rar':{ $icon = "\"rar\""; break; } case 'application/x-7z-compressed':{ $icon = "\"7z\""; break; } case 'application/x-gzip':{ $icon = "\"gzip\""; break; } case 'audio/mpeg':{ } case 'audio/ogg':{ $icon = "\"audio\""; break; } case 'video/x-flv':{ $icon = "\"flv\""; break; } default: { $icon = "\"other\""; } } $return = "
".$icon."  ".$lang_functions['text_downloads'].": ".number_format($row['downloads'])."
".gettime($row['added']))."', 'styleClass', 'attach', 'x', findPosition(this)[0], 'y', findPosition(this)[1]-58);\">".htmlspecialchars($row['filename'])."
  (".mksize($row['filesize']).")
"; } return $return; } } function addTempCode($value) { global $tempCode, $tempCodeCount; $tempCode[$tempCodeCount] = $value; $return = ""; $tempCodeCount++; return $return; } function formatAdUrl($adid, $url, $content, $newWindow=true) { return formatUrl("adredir.php?id=".$adid."&url=".rawurlencode($url), $newWindow, $content); } function formatUrl($url, $newWindow = false, $text = '', $linkClass = '') { if (!$text) { $text = $url; } return addTempCode("$text"); } function formatCode($text) { global $lang_functions; return addTempCode("
".$lang_functions['text_code']."
$text

"); } function formatImg($src, $enableImageResizer, $image_max_width, $image_max_height, $imgId = "") { if (is_danger_url($src)) { $msg = "[DANGER_URL]: $src"; do_log($msg, "alert"); write_log($msg, "mod"); return ""; } return addTempCode("\"image\""); } function formatFlash($src, $width, $height) { if (!$width) { $width = 500; } if (!$height) { $height = 300; } return addTempCode(""); } function formatFlv($src, $width, $height) { if (!$width) { $width = 320; } if (!$height) { $height = 240; } return addTempCode(""); } function formatYoutube($src, $width = '', $height = ''): string { if (!$width) { $width = 560; } if (!$height) { $height = 315; } $queryString = parse_url($src, PHP_URL_QUERY); parse_str($queryString, $parameters); if (empty($parameters['v'])) { $videoId = ''; } else { $videoId = $parameters['v']; } return addTempCode(sprintf( '', $width, $height, $videoId )); } function formatSpoiler($content, $title = '', $defaultCollapsed = true): string { global $lang_functions; if (!$title) { $title = $lang_functions['spoiler_default_title']; } // $content = str_replace(['
', '
'], '', $content); $contentClass = "spoiler-content"; if ($defaultCollapsed) { $contentClass .= " collapse"; } $HTML = sprintf( '
%s
%s
', $lang_functions['spoiler_expand_collapse'], $title, $contentClass, $content ); return addTempCode($HTML); } function formatTextAlign($text, $align): string { return addTempCode(sprintf('
%s
', $align, $text)); } function format_urls($text, $newWindow = false) { // return preg_replace("/((https?|ftp|gopher|news|telnet|mms|rtsp):\/\/[^()\[\]<>\s]+)/ei", "formatUrl('\\1', ".($newWindow==true ? 1 : 0).", '', 'faqlink')", $text); return preg_replace_callback("/((https?|ftp|gopher|news|telnet|mms|rtsp):\/\/[^()\[\]<>\s]+)/i", function ($matches) use ($newWindow) { return formatUrl($matches[1], $newWindow, '', 'faqlink'); }, $text); } function format_comment($text, $strip_html = true, $xssclean = false, $newtab = true, $imageresizer = true, $image_max_width = 700, $enableimage = true, $enableflash = true , $imagenum = -1, $image_max_height = 0, $adid = 0) { global $lang_functions; global $CURUSER, $SITENAME, $BASEURL; global $tempCode, $tempCodeCount; if ($text == '') { return ""; } $enableattach_attachment = get_setting('attachment.enableattach'); $tempCode = array(); $tempCodeCount = 0; $imageresizer = $imageresizer ? 1 : 0; $s = $text; if ($strip_html) { $s = htmlspecialchars($s); } if (strpos($s,"[code]") !== false && strpos($s,"[/code]") !== false) { // $s = preg_replace("/\[code\](.+?)\[\/code\]/eis","formatCode('\\1')", $s); $s = preg_replace_callback("/\[code\](.+?)\[\/code\]/is",function ($matches) { return formatCode($matches[1]); }, $s); } if (strpos($s,"[raw]") !== false && strpos($s,"[/raw]") !== false) { $s = preg_replace_callback("/\[raw\](.+?)\[\/raw\]/is",function ($matches) { return addTempCode($matches[1]); }, $s); } // Linebreaks $s = nl2br($s); $originalBbTagArray = array('[siteurl]', '[site]','[*]', '[b]', '[/b]', '[i]', '[/i]', '[u]', '[/u]', '[pre]', '[/pre]', '[/color]', '[/font]', '[/size]', " "); $replaceXhtmlTagArray = array(get_protocol_prefix().get_setting('basic.BASEURL'), get_setting('basic.SITENAME'), 'list', '', '', '', '', '', '', '
', '
', '', '', '', '  '); $s = str_replace($originalBbTagArray, $replaceXhtmlTagArray, $s); $originalBbTagArray = array("/\[font=([^\[\(&\\;]+?)\]/is", "/\[color=([#0-9a-z]{1,15})\]/is", "/\[color=([a-z]+)\]/is", "/\[size=([1-7])\]/is"); $replaceXhtmlTagArray = array("", "", "", ""); $s = preg_replace($originalBbTagArray, $replaceXhtmlTagArray, $s); if ($enableimage) { // $s = preg_replace("/\[img\]([^\<\r\n\"']+?)\[\/img\]/ei", "formatImg('\\1',".$imageresizer.",".$image_max_width.",".$image_max_height.")", $s, $imagenum, $imgReplaceCount); $s = preg_replace_callback("/\[img\]([^\<\r\n\"']+?)\[\/img\]/i", function ($matches) use ($imageresizer, $image_max_width, $image_max_height) { return formatImg($matches[1],$imageresizer,$image_max_width,$image_max_height); }, $s, $imagenum, $imgReplaceCount); // $s = preg_replace("/\[img=([^\<\r\n\"']+?)\]/ei", "formatImg('\\1',".$imageresizer.",".$image_max_width.",".$image_max_height.")", $s, ($imagenum != -1 ? max($imagenum-$imgReplaceCount, 0) : -1)); $s = preg_replace_callback("/\[img=([^\<\r\n\"']+?)\]/i", function ($matches) use ($imageresizer, $image_max_width, $image_max_height) { return formatImg($matches[1],$imageresizer,$image_max_width,$image_max_height); }, $s, ($imagenum != -1 ? max($imagenum-$imgReplaceCount, 0) : -1)); } else { $s = preg_replace("/\[img\]([^\<\r\n\"']+?)\[\/img\]/i", '', $s, -1); $s = preg_replace("/\[img=([^\<\r\n\"']+?)\]/i", '', $s, -1); } // [flash,500,400]http://www/image.swf[/flash] if (strpos($s,"[flash") !== false) { //flash is not often used. Better check if it exist before hand if ($enableflash) { // $s = preg_replace("/\[flash(\,([1-9][0-9]*)\,([1-9][0-9]*))?\]((http|ftp):\/\/[^\s'\"<>]+(\.(swf)))\[\/flash\]/ei", "formatFlash('\\4', '\\2', '\\3')", $s); $s = preg_replace_callback("/\[flash(\,([1-9][0-9]*)\,([1-9][0-9]*))?\]((http|ftp):\/\/[^\s'\"<>]+(\.(swf)))\[\/flash\]/i", function ($matches) { return formatFlash($matches[4], $matches[2], $matches[3]); }, $s); } else { $s = preg_replace("/\[flash(\,([1-9][0-9]*)\,([1-9][0-9]*))?\]((http|ftp):\/\/[^\s'\"<>]+(\.(swf)))\[\/flash\]/i", '', $s); } } //[flv,320,240]http://www/a.flv[/flv] if (strpos($s,"[flv") !== false) { //flv is not often used. Better check if it exist before hand if ($enableflash) { // $s = preg_replace("/\[flv(\,([1-9][0-9]*)\,([1-9][0-9]*))?\]((http|ftp):\/\/[^\s'\"<>]+(\.(flv)))\[\/flv\]/ei", "formatFlv('\\4', '\\2', '\\3')", $s); $s = preg_replace_callback("/\[flv(\,([1-9][0-9]*)\,([1-9][0-9]*))?\]((http|ftp):\/\/[^\s'\"<>]+(\.(flv)))\[\/flv\]/i", function ($matches) { return formatFlv($matches[4], $matches[2], $matches[3]); }, $s); } else { $s = preg_replace("/\[flv(\,([1-9][0-9]*)\,([1-9][0-9]*))?\]((http|ftp):\/\/[^\s'\"<>]+(\.(flv)))\[\/flv\]/i", '', $s); } } //[youtube,560,315]https://www.youtube.com/watch?v=DWDL3VTCcCg&ab_channel=ESPNMMA[/youtube] if (str_contains($s, '[youtube') && str_contains($s, 'v=')) { $s = preg_replace_callback("/\[youtube(\,([1-9][0-9]*)\,([1-9][0-9]*))?\]((http|https):\/\/[^\s'\"<>]+)\[\/youtube\]/i", function ($matches) { return formatYoutube($matches[4], $matches[2], $matches[3]); }, $s); } // [url=http://www.example.com]Text[/url] if ($adid) { // $s = preg_replace("/\[url=([^\[\s]+?)\](.+?)\[\/url\]/ei", "formatAdUrl(".$adid." ,'\\1', '\\2', ".($newtab==true ? 1 : 0).", 'faqlink')", $s); $s = preg_replace_callback("/\[url=([^\[\s]+?)\](.+?)\[\/url\]/i", function ($matches) use ($adid, $newtab) { return formatAdUrl($adid ,$matches[1], $matches[2], ".($newtab==true ? 1 : 0).", 'faqlink'); }, $s); } else { // $s = preg_replace("/\[url=([^\[\s]+?)\](.+?)\[\/url\]/ei", "formatUrl('\\1', ".($newtab==true ? 1 : 0).", '\\2', 'faqlink')", $s); $s = preg_replace_callback("/\[url=([^\[\s]+?)\](.+?)\[\/url\]/i", function ($matches) use ($newtab) { return formatUrl($matches[1], $newtab, $matches[2], 'faqlink'); }, $s); } // [url]http://www.example.com[/url] // $s = preg_replace("/\[url\]([^\[\s]+?)\[\/url\]/ei", "formatUrl('\\1', ".($newtab==true ? 1 : 0).", '', 'faqlink')", $s); $s = preg_replace_callback("/\[url\]([^\[\s]+?)\[\/url\]/i", function ($matches) use ($newtab) { return formatUrl($matches[1], $newtab, '', 'faqlink'); }, $s); // [left]Left text[/left] $s = preg_replace_callback("/\[left\](.*)\[\/left\]/isU", function ($matches) { return formatTextAlign($matches[1], 'left'); }, $s); // [center]Center text[/center] $s = preg_replace_callback("/\[center\](.*)\[\/center\]/isU", function ($matches) { return formatTextAlign($matches[1], 'center'); }, $s); // [right]Right text[/right] $s = preg_replace_callback("/\[right\](.*)\[\/right\]/isU", function ($matches) { return formatTextAlign($matches[1], 'right'); }, $s); $s = format_urls($s, $newtab); // Quotes if (strpos($s,"[quote") !== false && strpos($s,"[/quote]") !== false) { //format_quote is kind of slow. Better check if [quote] exists beforehand $s = format_quotes($s); } // $s = preg_replace("/\[em([1-9][0-9]*)\]/ie", "(\\1 < 192 ? '\"[em\\1]\"' : '[em\\1]')", $s); $s = preg_replace_callback("/\[em([1-9][0-9]*)\]/i", function ($matches) { $smile = get_smile($matches[1]); return $smile ? '[em' . $matches[1] . ']' : '[em' . $matches[1] . ']'; }, $s); //[spoiler=What happens to the hero?]The hero dies at the end![/spoiler] if (str_contains($s, '[spoiler')) { $s = preg_replace_callback("/\[spoiler(=(.*))?\](.*)\[\/spoiler\]/isU", function ($matches) { return formatSpoiler($matches[3], $matches[2], nexus()->getScript() != 'preview'); }, $s); } if ($enableattach_attachment == 'yes' && $imagenum != 1){ $limit = 20; // $s = preg_replace("/\[attach\]([0-9a-zA-z][0-9a-zA-z]*)\[\/attach\]/ies", "print_attachment('\\1', ".($enableimage ? 1 : 0).", ".($imageresizer ? 1 : 0).")", $s, $limit); $s = preg_replace_callback("/\[attach\]([0-9a-zA-z][0-9a-zA-z]*)\[\/attach\]/is", function ($matches) use ($enableimage, $imageresizer) { return print_attachment($matches[1], ".($enableimage ? 1 : 0).", ".($imageresizer ? 1 : 0)."); }, $s, $limit); } reset($tempCode); $j = $i = 0; while(count($tempCode) || $j > 5) { foreach($tempCode as $key=>$code) { $s = str_replace("", $code, $s, $count); if ($count) { unset($tempCode[$key]); $i = $i+$count; } } $j++; } return str_replace('', '', $s); } function highlight($search,$subject,$hlstart='',$hlend="") { $srchlen=strlen($search); // lenght of searched string if ($srchlen==0) return $subject; $find = $subject; while ($find = stristr($find,$search)) { // find $search text in $subject -case insensitiv $srchtxt = substr($find,0,$srchlen); // get new search text $find=substr($find,$srchlen); $subject = str_replace($srchtxt,"$hlstart$srchtxt$hlend",$subject); // highlight founded case insensitive search text } return $subject; } function get_user_class_name($class, $compact = false, $b_colored = false, $I18N = false, array $options = []) { if (!IN_NEXUS) { return \App\Models\User::getClassName($class, $compact, $b_colored, $I18N); } global $SITENAME; static $en_lang_functions; static $current_user_lang_functions; static $settingAccount; if (!$en_lang_functions) { require(get_langfile_path("functions.php",false,"en")); $en_lang_functions = $lang_functions; } if (!$settingAccount) { $settingAccount = get_setting('account'); } if(!$I18N) { $this_lang_functions = $en_lang_functions; } else { if (!$current_user_lang_functions) { require(get_langfile_path("functions.php")); $current_user_lang_functions = $lang_functions; } $this_lang_functions = $current_user_lang_functions; } $class_name = ""; switch ($class) { case UC_PEASANT: {$class_name = $this_lang_functions['text_peasant']; break;} case UC_USER: {$class_name = $this_lang_functions['text_user']; break;} case UC_POWER_USER: {$class_name = $this_lang_functions['text_power_user']; break;} case UC_ELITE_USER: {$class_name = $this_lang_functions['text_elite_user']; break;} case UC_CRAZY_USER: {$class_name = $this_lang_functions['text_crazy_user']; break;} case UC_INSANE_USER: {$class_name = $this_lang_functions['text_insane_user']; break;} case UC_VETERAN_USER: {$class_name = $this_lang_functions['text_veteran_user']; break;} case UC_EXTREME_USER: {$class_name = $this_lang_functions['text_extreme_user']; break;} case UC_ULTIMATE_USER: {$class_name = $this_lang_functions['text_ultimate_user']; break;} case UC_NEXUS_MASTER: {$class_name = $this_lang_functions['text_nexus_master']; break;} case UC_VIP: {$class_name = $this_lang_functions['text_vip']; break;} case UC_UPLOADER: {$class_name = $this_lang_functions['text_uploader']; break;} case UC_RETIREE: {$class_name = $this_lang_functions['text_retiree']; break;} case UC_MODERATOR: {$class_name = $this_lang_functions['text_moderators']; break;} case UC_ADMINISTRATOR: {$class_name = $this_lang_functions['text_administrators']; break;} case UC_SYSOP: {$class_name = $this_lang_functions['text_sysops']; break;} case UC_STAFFLEADER: {$class_name = $this_lang_functions['text_staff_leader']; break;} } if (isset($options['with_alias']) && $options['with_alias'] && $class < UC_VIP && isset($settingAccount["{$class}_alias"])) { $alias = trim($settingAccount["{$class}_alias"]); if (!empty($alias)) { $class_name = sprintf('%s(%s)', $class_name, $alias); } } switch ($class) { case UC_PEASANT: {$class_name_color = $en_lang_functions['text_peasant']; break;} case UC_USER: {$class_name_color = $en_lang_functions['text_user']; break;} case UC_POWER_USER: {$class_name_color = $en_lang_functions['text_power_user']; break;} case UC_ELITE_USER: {$class_name_color = $en_lang_functions['text_elite_user']; break;} case UC_CRAZY_USER: {$class_name_color = $en_lang_functions['text_crazy_user']; break;} case UC_INSANE_USER: {$class_name_color = $en_lang_functions['text_insane_user']; break;} case UC_VETERAN_USER: {$class_name_color = $en_lang_functions['text_veteran_user']; break;} case UC_EXTREME_USER: {$class_name_color = $en_lang_functions['text_extreme_user']; break;} case UC_ULTIMATE_USER: {$class_name_color = $en_lang_functions['text_ultimate_user']; break;} case UC_NEXUS_MASTER: {$class_name_color = $en_lang_functions['text_nexus_master']; break;} case UC_VIP: {$class_name_color = $en_lang_functions['text_vip']; break;} case UC_UPLOADER: {$class_name_color = $en_lang_functions['text_uploader']; break;} case UC_RETIREE: {$class_name_color = $en_lang_functions['text_retiree']; break;} case UC_MODERATOR: {$class_name_color = $en_lang_functions['text_moderators']; break;} case UC_ADMINISTRATOR: {$class_name_color = $en_lang_functions['text_administrators']; break;} case UC_SYSOP: {$class_name_color = $en_lang_functions['text_sysops']; break;} case UC_STAFFLEADER: {$class_name_color = $en_lang_functions['text_staff_leader']; break;} } $class_name = ( $compact == true ? str_replace(" ", "",$class_name) : $class_name); if (isset($options['uid'], $options['with_role'])) { $class_name = implode(' | ', apply_filter('user_class_name', [$class_name], $options['uid'])); } if ($class_name && $b_colored) { $class_name = "" . $class_name . ""; } return $class_name; } function is_valid_user_class($class) { return is_numeric($class) && floor($class) == $class && $class >= UC_PEASANT && $class <= UC_STAFFLEADER; } function int_check($value,$stdhead = false, $stdfood = true, $die = true, $log = true) { global $lang_functions; global $CURUSER; if (is_array($value)) { foreach ($value as $val) int_check ($val); } else { if (!is_valid_id($value)) { $msg = "Invalid ID Attempt: Username: ".$CURUSER["username"]." - UserID: ".$CURUSER["id"]." - UserIP : ".getip(); if ($log) { write_log($msg,'mod'); } do_log($msg, 'error'); if ($stdhead) stderr($lang_functions['std_error'],$lang_functions['std_invalid_id']); else { print ("

".$lang_functions['std_error']."

"); print ($lang_functions['std_invalid_id']."
"); } if ($stdfood) stdfoot(); if ($die) die; } else return true; } } function is_valid_id($id) { return is_numeric($id) && ($id > 0) && (floor($id) == $id); } //-------- Begins a main frame function begin_main_frame($caption = "", $center = false, $width = 100) { $tdextra = ""; if ($caption) print("

".$caption."

"); if ($center) $tdextra .= " align=\"center\""; if (!str_ends_with($width, '%')) { $width = CONTENT_WIDTH * $width / 100; } print("" . "
"); } function end_main_frame() { print("
\n"); } function begin_frame($caption = "", $center = false, $padding = 10, $width="100%", $caption_center="left") { $tdextra = ""; if ($center) $tdextra .= " align=\"center\""; print(($caption ? "

".$caption."

" : "") . "" . "
\n"); } function end_frame() { print("
\n"); } function begin_table($fullwidth = false, $padding = 5) { $width = ""; if ($fullwidth) $width .= " width=50%"; print(""); } function end_table() { print("
\n"); } //-------- Inserts a smilies frame // (move to globals) function insert_smilies_frame() { global $lang_functions; begin_frame($lang_functions['text_smilies'], true); begin_table(false, 5); print("".$lang_functions['col_type_something']."".$lang_functions['col_to_make_a']."\n"); for ($i=1; $i<192; $i++) { print("[em$i]\"[em$i]\"\n"); } end_table(); end_frame(); } function get_ratio_color($ratio) { if ($ratio < 0.1) return "#ff0000"; if ($ratio < 0.2) return "#ee0000"; if ($ratio < 0.3) return "#dd0000"; if ($ratio < 0.4) return "#cc0000"; if ($ratio < 0.5) return "#bb0000"; if ($ratio < 0.6) return "#aa0000"; if ($ratio < 0.7) return "#990000"; if ($ratio < 0.8) return "#880000"; if ($ratio < 0.9) return "#770000"; if ($ratio < 1) return "#660000"; return ""; } function get_slr_color($ratio) { if ($ratio < 0.025) return "#ff0000"; if ($ratio < 0.05) return "#ee0000"; if ($ratio < 0.075) return "#dd0000"; if ($ratio < 0.1) return "#cc0000"; if ($ratio < 0.125) return "#bb0000"; if ($ratio < 0.15) return "#aa0000"; if ($ratio < 0.175) return "#990000"; if ($ratio < 0.2) return "#880000"; if ($ratio < 0.225) return "#770000"; if ($ratio < 0.25) return "#660000"; if ($ratio < 0.275) return "#550000"; if ($ratio < 0.3) return "#440000"; if ($ratio < 0.325) return "#330000"; if ($ratio < 0.35) return "#220000"; if ($ratio < 0.375) return "#110000"; return ""; } function write_log($text, $security = "normal") { $text = sqlesc($text); $added = sqlesc(date("Y-m-d H:i:s")); $security = sqlesc($security); sql_query("INSERT INTO sitelog (added, txt, security_level) VALUES($added, $text, $security)") or sqlerr(__FILE__, __LINE__); } function get_elapsed_time($ts,$shortunit = false) { global $lang_functions; $mins = floor(abs(TIMENOW - $ts) / 60); $hours = floor($mins / 60); $mins -= $hours * 60; $days = floor($hours / 24); $hours -= $days * 24; $months = floor($days / 30); $days2 = $days - $months * 30; $years = floor($days / 365); $months -= $years * 12; $t = ""; if ($years > 0) return $years.($shortunit ? $lang_functions['text_short_year'] : $lang_functions['text_year'] . add_s($years)) ." ".$months.($shortunit ? $lang_functions['text_short_month'] : $lang_functions['text_month'] . add_s($months)); if ($months > 0) return $months.($shortunit ? $lang_functions['text_short_month'] : $lang_functions['text_month'] . add_s($months)) ." ".$days2.($shortunit ? $lang_functions['text_short_day'] : $lang_functions['text_day'] . add_s($days2)); if ($days > 0) return $days.($shortunit ? $lang_functions['text_short_day'] : $lang_functions['text_day'] . add_s($days))." ".$hours.($shortunit ? $lang_functions['text_short_hour'] : $lang_functions['text_hour'] . add_s($hours)); if ($hours > 0) return $hours.($shortunit ? $lang_functions['text_short_hour'] : $lang_functions['text_hour'] . add_s($hours))." ".$mins.($shortunit ? $lang_functions['text_short_min'] : $lang_functions['text_min'] . add_s($mins)); if ($mins > 0) return $mins.($shortunit ? $lang_functions['text_short_min'] : $lang_functions['text_min'] . add_s($mins)); return "< 1".($shortunit ? $lang_functions['text_short_min'] : $lang_functions['text_min']); } function textbbcode($form,$text,$content="",$hastitle=false, $col_num = 130, $withPreview = false) { global $lang_functions; global $subject, $BASEURL, $CURUSER, $enableattach_attachment; $editTbodyId = "$form-$text-edit"; $previewTbodyId = "$form-$text-preview"; $btnEditId = "$form-$text-btn-edit"; $btnPreviewId = "$form-$text-btn-preview"; ?> "); print("
"); print(""); print(""); ?>
"); ?> 0) { print(''); } print(""); $i++; } ?>
".getSmileIt($form, $text, $smily)."

".$title.""); switch ($type){ case 'new': { $framename = $lang_functions['text_new']; break; } case 'reply': { $framename = $lang_functions['text_reply']; break; } case 'quote': { $framename = $lang_functions['text_quote']; break; } case 'edit': { $framename = $lang_functions['text_edit']; break; } default: { $framename = $lang_functions['text_new']; break; } } begin_frame($framename, true); print("\n"); if ($hassubject) print("" . "\n"); print(""); } function end_compose(){ global $lang_functions; print(""); print("
".$lang_functions['row_subject']."
".$lang_functions['row_body']."
"); textbbcode("compose","body", $body, false); print("
"); print(""); print(""); print("
"); print("
\n"); end_frame(); print("

".$lang_functions['text_tags']." | ".$lang_functions['text_smilies']."

\n"); } function insert_suggest($keyword, $userid, $pre_escaped = true) { if(mb_strlen($keyword,"UTF-8") >= 2) { $userid = intval($userid ?? 0); if($userid) sql_query("INSERT INTO suggest(keywords, userid, adddate) VALUES (" . ($pre_escaped == true ? "'" . $keyword . "'" : sqlesc($keyword)) . "," . sqlesc($userid) . ", NOW())") or sqlerr(__FILE__,__LINE__); } } function get_external_tr($imdb_url = "") { global $lang_functions; global $showextinfo; if ($showextinfo['imdb'] != 'yes') { return ''; } $ptGen = new Nexus\PTGen\PTGen(); $imdbNumber = parse_imdb_id($imdb_url); $y = $ptGen->buildInput("url", $imdbNumber ? "https://www.imdb.com/title/tt".parse_imdb_id($imdb_url) : "", $lang_functions['text_imdb_url_note'], nexus_trans('ptgen.btn_get_desc')); return tr($lang_functions['row_imdb_url'], $y, 1); // ($showextinfo['imdb'] == 'yes' ? tr($lang_functions['row_imdb_url'], "
".$lang_functions['text_imdb_url_note']."", 1) : ""); } function get_torrent_extinfo_identifier($torrentid) { $torrentid = intval($torrentid ?? 0); $result = array('imdb_id'); unset($result); if($torrentid) { $res = sql_query("SELECT url FROM torrents WHERE id=" . $torrentid) or sqlerr(__FILE__,__LINE__); if(mysql_num_rows($res) == 1) { $arr = mysql_fetch_array($res) or sqlerr(__FILE__,__LINE__); $imdb_id = parse_imdb_id($arr["url"]); $result['imdb_id'] = $imdb_id; } } return $result; } function parse_imdb_id($url) { if ($url && is_numeric($url) && strlen($url) < 7) { $url = str_pad($url, 7, '0', STR_PAD_LEFT); } if ($url != "" && preg_match("/[0-9]+/i", $url, $matches)) { return $matches[0]; } return ''; } function build_imdb_url($imdb_id) { return $imdb_id == "" ? "" : "https://www.imdb.com/title/tt" . $imdb_id . "/"; } // it's a stub implemetation here, we need more acurate regression analysis to complete our algorithm function get_torrent_2_user_value($user_snatched_arr) { // check if it's current user's torrent $torrent_2_user_value = 1.0; $torrent_res = sql_query("SELECT * FROM torrents WHERE id = " . $user_snatched_arr['torrentid']) or sqlerr(__FILE__, __LINE__); if(mysql_num_rows($torrent_res) == 1) // torrent still exists { $torrent_arr = mysql_fetch_array($torrent_res) or sqlerr(__FILE__, __LINE__); if($torrent_arr['owner'] == $user_snatched_arr['userid']) // owner's torrent { $torrent_2_user_value *= 0.7; // owner's torrent $torrent_2_user_value += ($user_snatched_arr['uploaded'] / $torrent_arr['size'] ) -1 > 0 ? 0.2 - exp(-(($user_snatched_arr['uploaded'] / $torrent_arr['size'] ) -1)) : ($user_snatched_arr['uploaded'] / $torrent_arr['size'] ) -1; $torrent_2_user_value += min(0.1 , ($user_snatched_arr['seedtime'] / 37*60*60 ) * 0.1); } else { if($user_snatched_arr['finished'] == 'yes') { $torrent_2_user_value *= 0.5; $torrent_2_user_value += ($user_snatched_arr['uploaded'] / $torrent_arr['size'] ) -1 > 0 ? 0.4 - exp(-(($user_snatched_arr['uploaded'] / $torrent_arr['size'] ) -1)) : ($user_snatched_arr['uploaded'] / $torrent_arr['size'] ) -1; $torrent_2_user_value += min(0.1, ($user_snatched_arr['seedtime'] / 22*60*60 ) * 0.1); } else { $torrent_2_user_value *= 0.2; $torrent_2_user_value += min(0.05, ($user_snatched_arr['leechtime'] / 24*60*60 ) * 0.1); // usually leechtime could not explain much } } } else // torrent already deleted, half blind guess, be conservative { if($user_snatched_arr['finished'] == 'no' && $user_snatched_arr['uploaded'] > 0 && $user_snatched_arr['downloaded'] == 0) // possibly owner { $torrent_2_user_value *= 0.55; //conservative $torrent_2_user_value += min(0.05, ($user_snatched_arr['leechtime'] / 31*60*60 ) * 0.1); $torrent_2_user_value += min(0.1, ($user_snatched_arr['seedtime'] / 31*60*60 ) * 0.1); } else if($user_snatched_arr['downloaded'] > 0) // possibly leecher { $torrent_2_user_value *= 0.38; //conservative $torrent_2_user_value *= min(0.22, 0.1 * $user_snatched_arr['uploaded'] / $user_snatched_arr['downloaded']); // 0.3 for conservative $torrent_2_user_value += min(0.05, ($user_snatched_arr['leechtime'] / 22*60*60 ) * 0.1); $torrent_2_user_value += min(0.12, ($user_snatched_arr['seedtime'] / 22*60*60 ) * 0.1); } else $torrent_2_user_value *= 0.0; } return $torrent_2_user_value; } function cur_user_check () { global $lang_functions; global $CURUSER; if ($CURUSER) { sql_query("UPDATE users SET lang=" . get_langid_from_langcookie() . " WHERE id = ". $CURUSER['id']); stderr ($lang_functions['std_permission_denied'], $lang_functions['std_already_logged_in']); } } function KPS($type = "+", $point = "1.0", $id = "") { global $bonus_tweak; if ($point != 0){ $point = sqlesc($point); if ($bonus_tweak == "enable" || $bonus_tweak == "disablesave"){ sql_query("UPDATE users SET seedbonus = seedbonus$type$point WHERE id = ".sqlesc($id)) or sqlerr(__FILE__, __LINE__); } } else return; } function get_agent($peer_id, $agent) { return substr($agent, 0, (strpos($agent, ";") == false ? strlen($agent) : strpos($agent, ";"))); } function EmailBanned($newEmail) { $newEmail = trim(strtolower($newEmail)); $sql = sql_query("SELECT * FROM bannedemails") or sqlerr(__FILE__, __LINE__); $list = mysql_fetch_array($sql); $addresses = explode(' ', preg_replace("/[[:space:]]+/", " ", trim($list['value'])) ); if(count($addresses) > 0) { foreach ( $addresses as $email ) { $email = trim(strtolower(preg_replace('/\./', '\\.', $email))); if(strstr($email, "@")) { if(preg_match('/^@/', $email)) {// Any user @host? // Expand the match expression to catch hosts and // sub-domains $email = preg_replace('/^@/', '[@\\.]', $email); if(preg_match("/".$email."$/", $newEmail)) return true; } } elseif(preg_match('/@$/', $email)) { // User at any host? if(preg_match("/^".$email."/", $newEmail)) return true; } else { // User@host if(strtolower($email) == $newEmail) return true; } } } return false; } function EmailAllowed($newEmail) { global $restrictemaildomain; if ($restrictemaildomain == 'yes'){ $newEmail = trim(strtolower($newEmail)); $sql = sql_query("SELECT * FROM allowedemails") or sqlerr(__FILE__, __LINE__); $list = mysql_fetch_array($sql); $addresses = explode(' ', preg_replace("/[[:space:]]+/", " ", trim($list['value'])) ); if(count($addresses) > 0) { foreach ( $addresses as $email ) { $email = trim(strtolower(preg_replace('/\./', '\\.', $email))); if(strstr($email, "@")) { if(preg_match('/^@/', $email)) {// Any user @host? // Expand the match expression to catch hosts and // sub-domains $email = preg_replace('/^@/', '[@\\.]', $email); if(preg_match('/'.$email.'$/', $newEmail)) return true; } } elseif(preg_match('/@$/', $email)) { // User at any host? if(preg_match("/^".$email."/", $newEmail)) return true; } else { // User@host if(strtolower($email) == $newEmail) return true; } } } return false; } else return true; } function allowedemails() { $sql = sql_query("SELECT * FROM allowedemails") or sqlerr(__FILE__, __LINE__); $list = mysql_fetch_array($sql); return $list['value']; } function nexus_redirect($url) { if (substr($url, 0, 4) != 'http') { $url = getSchemeAndHttpHost() . '/' . trim($url, '/'); } if(!headers_sent()){ header("Location: $url", true, 302); } else { echo ""; } exit; } function set_cachetimestamp($id, $field = "cache_stamp") { sql_query("UPDATE torrents SET $field = " . time() . " WHERE id = " . sqlesc($id)) or sqlerr(__FILE__, __LINE__); } function reset_cachetimestamp($id, $field = "cache_stamp") { sql_query("UPDATE torrents SET $field = 0 WHERE id = " . sqlesc($id)) or sqlerr(__FILE__, __LINE__); } function cache_check ($file = 'cachefile',$endpage = true, $cachetime = 600) { global $lang_functions; global $rootpath,$cache,$CURLANGDIR; $cachefile = $rootpath.$cache ."/" . $CURLANGDIR .'/'.$file.'.html'; // Serve from the cache if it is younger than $cachetime if (file_exists($cachefile) && (time() - $cachetime < filemtime($cachefile))) { include($cachefile); if ($endpage) { print("

".$lang_functions['text_page_last_updated'].date('Y-m-d H:i:s', filemtime($cachefile))."

"); end_main_frame(); stdfoot(); exit; } return false; } ob_start(); return true; } function cache_save ($file = 'cachefile') { global $rootpath,$cache; global $CURLANGDIR; $cachefile = $rootpath.$cache ."/" . $CURLANGDIR . '/'.$file.'.html'; $fp = fopen($cachefile, 'w'); // save the contents of output buffer to the file fwrite($fp, ob_get_contents()); // close the file fclose($fp); // Send the output to the browser ob_end_flush(); } function get_email_encode($lang) { if($lang == 'chs' || $lang == 'cht') return "gbk"; else return "utf-8"; } function change_email_encode($lang, $content) { return iconv("utf-8", get_email_encode($lang) . "//IGNORE", $content); } function safe_email($email) { $email = str_replace("<","",$email); $email = str_replace(">","",$email); $email = str_replace("\'","",$email); $email = str_replace('\"',"",$email); $email = str_replace("\\\\","",$email); return $email; } function check_email ($email) { if(!preg_match('/^[A-Za-z0-9][A-Za-z0-9_.+\-]*@[A-Za-z0-9][A-Za-z0-9_+\-]*(\.[A-Za-z0-9][A-Za-z0-9_+\-]*)+$/', $email)) { return false; } $bannedEmails = \Nexus\Database\NexusDB::select('select * from bannedemails'); $bannedEmailsArr = array_filter(preg_split('/[\s]+/', $bannedEmails[0]['value'] ?? '')); if (empty($bannedEmailsArr)) { return true; } foreach ($bannedEmailsArr as $ban) { if (str_ends_with($email, $ban)) { do_log("[BANNED_EMAIL] email: $email is banned by record: $ban"); return false; } } return true; } function sent_mail($to,$fromname,$fromemail,$subject,$body,$type = "confirmation",$showmsg=true,$multiple=false,$multiplemail='',$hdr_encoding = 'UTF-8', $specialcase = '') { do_log("to: $to, fromname: $fromname, fromemail: $fromemail, subject: $subject, body: $body. type: $type"); global $lang_functions; global $rootpath,$SITENAME,$SITEEMAIL,$smtptype,$smtp,$smtp_host,$smtp_port,$smtp_from,$smtpaddress,$smtpport,$accountname,$accountpassword; # Is the OS Windows or Mac or Linux? if (strtoupper(substr(PHP_OS,0,3)=='WIN')) { $eol="\r\n"; $windows = true; } elseif (strtoupper(substr(PHP_OS,0,3)=='MAC')) $eol="\r"; else $eol="\n"; if ($smtptype == 'none') return false; if ($smtptype == 'default') { @mail($to, "=?".$hdr_encoding."?B?".base64_encode($subject)."?=", $body, "From: ".$SITEEMAIL.$eol."Content-type: text/html; charset=".$hdr_encoding.$eol, "-f$SITEEMAIL") or stderr($lang_functions['std_error'], $lang_functions['text_unable_to_send_mail']); } elseif ($smtptype == 'advanced') { $mid = md5(getip() . $fromname); $name = $_SERVER["SERVER_NAME"]; $headers = ''; $headers .= "From: $fromname <$fromemail>".$eol; $headers .= "Reply-To: $fromname <$fromemail>".$eol; $headers .= "Return-Path: $fromname <$fromemail>".$eol; $headers .= "Message-ID: <$mid thesystem@$name>".$eol; $headers .= "X-Mailer: PHP v".phpversion().$eol; $headers .= "MIME-Version: 1.0".$eol; $headers .= "Content-type: text/html; charset=".$hdr_encoding.$eol; $headers .= "X-Sender: PHP".$eol; if ($multiple) { $bcc_multiplemail = ""; foreach ($multiplemail as $toemail) $bcc_multiplemail = $bcc_multiplemail . ( $bcc_multiplemail != "" ? "," : "") . $toemail; $headers .= "Bcc: $multiplemail.$eol"; } if ($smtp == "yes") { ini_set('SMTP', $smtp_host); ini_set('smtp_port', $smtp_port); if ($windows) ini_set('sendmail_from', $smtp_from); } @mail($to,"=?".$hdr_encoding."?B?".base64_encode($subject)."?=",$body,$headers) or stderr($lang_functions['std_error'], $lang_functions['text_unable_to_send_mail']); ini_restore('SMTP'); ini_restore('smtp_port'); if ($windows) ini_restore('sendmail_from'); } elseif ($smtptype == 'external') { /* require_once ($rootpath . 'include/smtp/smtp.lib.php'); $mail = new smtp($hdr_encoding,'eYou'); $mail->debug(true); $mail->open($smtpaddress, $smtpport); $mail->auth($accountname, $accountpassword); // $mail->bcc($multiplemail); $mail->from($SITEEMAIL); if ($multiple) { $mail->multi_to_head($to); foreach ($multiplemail as $toemail) $mail->multi_to($toemail); } else $mail->to($to); $mail->mime_content_transfer_encoding(); $mail->mime_charset('text/html', $hdr_encoding); $mail->subject($subject); $mail->body($body); $mail->send() or stderr($lang_functions['std_error'], $lang_functions['text_unable_to_send_mail']); $mail->close(); */ /** * use Symfony Mailer instead * * @since 1.7 * @author xiaomlove<1939737565@qq.com> */ $toolRep = new \App\Repositories\ToolRepository(); $sendResult = $toolRep->sendMail($to, $subject, $body); if ($sendResult === false) { stderr($lang_functions['std_error'], $lang_functions['text_unable_to_send_mail']); } } if ($showmsg) { if ($type == "confirmation") stderr($lang_functions['std_success'], $lang_functions['std_confirmation_email_sent']."". htmlspecialchars($to) .".\n" . $lang_functions['std_please_wait'],false); elseif ($type == "details") stderr($lang_functions['std_success'], $lang_functions['std_account_details_sent']."". htmlspecialchars($to) .".\n" . $lang_functions['std_please_wait'],false); }else return true; } function failedloginscheck ($type = 'Login') { global $lang_functions; global $maxloginattempts; $total = 0; $ip = sqlesc(getip()); $Query = sql_query("SELECT SUM(attempts) FROM loginattempts WHERE ip=$ip") or sqlerr(__FILE__, __LINE__); list($total) = mysql_fetch_array($Query); if ($total >= $maxloginattempts) { sql_query("UPDATE loginattempts SET banned = 'yes' WHERE ip=$ip") or sqlerr(__FILE__, __LINE__); stderr($type.$lang_functions['std_locked'].$maxloginattempts.$lang_functions['std_attempts_reached'], $lang_functions['std_your_ip_banned'], true, true); } } function failedlogins ($type = 'login', $recover = false, $head = true) { global $lang_functions; $ip = sqlesc(getip()); $added = sqlesc(date("Y-m-d H:i:s")); $a = (@mysql_fetch_row(@sql_query("select count(*) from loginattempts where ip=$ip"))) or sqlerr(__FILE__, __LINE__); if ($a[0] == 0) sql_query("INSERT INTO loginattempts (ip, added, attempts) VALUES ($ip, $added, 1)") or sqlerr(__FILE__, __LINE__); else sql_query("UPDATE loginattempts SET attempts = attempts + 1 where ip=$ip") or sqlerr(__FILE__, __LINE__); if ($recover) sql_query("UPDATE loginattempts SET type = 'recover' WHERE ip = $ip") or sqlerr(__FILE__, __LINE__); if ($type == 'silent') return; elseif ($type == 'login') { stderr($lang_functions['std_login_failed'],$lang_functions['std_login_failed_note'],false); } else stderr($lang_functions['std_failed'],$type,false, $head); } function login_failedlogins($type = 'login', $recover = false, $head = true) { global $lang_functions; $ip = sqlesc(getip()); $added = sqlesc(date("Y-m-d H:i:s")); $a = (@mysql_fetch_row(@sql_query("select count(*) from loginattempts where ip=$ip"))) or sqlerr(__FILE__, __LINE__); if ($a[0] == 0) sql_query("INSERT INTO loginattempts (ip, added, attempts) VALUES ($ip, $added, 1)") or sqlerr(__FILE__, __LINE__); else sql_query("UPDATE loginattempts SET attempts = attempts + 1 where ip=$ip") or sqlerr(__FILE__, __LINE__); if ($recover) sql_query("UPDATE loginattempts SET type = 'recover' WHERE ip = $ip") or sqlerr(__FILE__, __LINE__); if ($type == 'silent') return; elseif ($type == 'login') { stderr($lang_functions['std_login_failed'],$lang_functions['std_login_failed_note'],false); } else stderr($lang_functions['std_recover_failed'],$type,false, $head); } function remaining ($type = 'login') { global $maxloginattempts; $total = 0; $ip = sqlesc(getip()); $Query = sql_query("SELECT SUM(attempts) FROM loginattempts WHERE ip=$ip") or sqlerr(__FILE__, __LINE__); list($total) = mysql_fetch_array($Query); $remaining = $maxloginattempts - $total; if ($remaining <= 2 ) $remaining = "[".$remaining."]"; else $remaining = "[".$remaining."]"; return $remaining; } function registration_check($type = "invitesystem", $maxuserscheck = true, $ipcheck = true) { global $lang_functions; global $invitesystem, $registration, $maxusers, $SITENAME, $maxip; if ($type == "invitesystem") { if ($invitesystem == "no") { stderr($lang_functions['std_oops'], $lang_functions['std_invite_system_disabled'], 0, true); } } if ($type == "normal") { if ($registration == "no") { stderr($lang_functions['std_sorry'], $lang_functions['std_open_registration_disabled'], 0, true); } } if ($maxuserscheck) { $res = sql_query("SELECT COUNT(*) FROM users") or sqlerr(__FILE__, __LINE__); $arr = mysql_fetch_row($res); if ($arr[0] >= $maxusers) stderr($lang_functions['std_sorry'], $lang_functions['std_account_limit_reached'], 0, true); } if ($ipcheck) { $ip = getip () ; $a = (@mysql_fetch_row(@sql_query("select count(*) from users where ip='" . mysql_real_escape_string($ip) . "'"))) or sqlerr(__FILE__, __LINE__); if ($a[0] > $maxip) stderr($lang_functions['std_sorry'], $lang_functions['std_the_ip']."" . htmlspecialchars($ip) ."". $lang_functions['std_used_many_times'],false, true); } return true; } function random_str($length="6") { $set = array("A","B","C","D","E","F","G","H","P","R","M","N","1","2","3","4","5","6","7","8","9"); $str = ''; for($i=1;$i<=$length;$i++) { $ch = rand(0, count($set)-1); $str .= $set[$ch]; } return $str; } function image_code () { $randomstr = random_str(); $imagehash = md5($randomstr); $dateline = time(); $sql = 'INSERT INTO `regimages` (`imagehash`, `imagestring`, `dateline`) VALUES (\''.$imagehash.'\', \''.$randomstr.'\', \''.$dateline.'\');'; sql_query($sql); return $imagehash; } function check_code ($imagehash, $imagestring, $where = 'signup.php',$maxattemptlog=false,$head=true) { global $lang_functions; global $iv; if ($iv !== 'yes') { return true; } $query = sprintf("SELECT * FROM regimages WHERE imagehash='%s' AND imagestring='%s'", mysql_real_escape_string((string)$imagehash), mysql_real_escape_string((string)$imagestring) ); $sql = sql_query($query); $imgcheck = mysql_fetch_array($sql); if(!$imgcheck['dateline']) { $delete = sprintf("DELETE FROM regimages WHERE imagehash='%s'", mysql_real_escape_string((string)$imagehash) ); sql_query($delete); if (!$maxattemptlog) stderr('Error',$lang_functions['std_invalid_image_code']."".$lang_functions['std_here_to_request_new'], false); else failedlogins($lang_functions['std_invalid_image_code']."".$lang_functions['std_here_to_request_new'],true,$head); }else{ $delete = sprintf("DELETE FROM regimages WHERE imagehash='%s'", mysql_real_escape_string((string)$imagehash) ); sql_query($delete); return true; } } function show_image_code () { global $lang_functions; global $iv; if ($iv == "yes") { unset($imagehash); $imagehash = image_code () ; print ("".$lang_functions['row_security_image'].""); print ("\"CAPTCHA\""); print ("".$lang_functions['row_security_code'].""); print(""); print(""); } } function get_ip_location($ip) { global $lang_functions; global $Cache; static $locations; if (isset($locations[$ip])) { return $locations[$ip]; } /** * @since 1.7.4 */ $arr = get_ip_location_from_geoip($ip); $result = []; if ($arr) { $result[] = $arr['name']; } else { $result[] = $lang_functions['text_unknown']; } $result[] = $lang_functions['text_user_ip'] . ": " . trim($ip, ','); return $locations[$ip] = $result; $cacheKey = "location_$ip"; if (!$ret = $Cache->get_value($cacheKey)){ $ret = array(); // $res = sql_query("SELECT * FROM locations") or sqlerr(__FILE__, __LINE__); // while ($row = mysql_fetch_array($res)) // $ret[] = $row; //get from geoip2 $row = get_ip_location_from_geoip($ip); if ($row) { $ret[] = $row; } $Cache->cache_value($cacheKey, $ret, 152800); } $location = array($lang_functions['text_unknown'],""); foreach($ret AS $arr) { $location = array($arr["name"], $lang_functions['text_user_ip'] . ": " . $ip); break; // if(in_ip_range(false, $ip, $arr["start_ip"], $arr["end_ip"])) // { // $location = array($arr["name"], $lang_functions['text_user_ip'].": " . $ip . ($arr["location_main"] != "" ? " ".$lang_functions['text_location_main'].": " . $arr["location_main"] : ""). ($arr["location_sub"] != "" ? " ".$lang_functions['text_location_sub'].": " . $arr["location_sub"] : "") . " ".$lang_functions['text_ip_range'].": " . $arr["start_ip"] . " ~ ". $arr["end_ip"]); // break; // } } return $location; } function in_ip_range($long, $targetip, $ip_one, $ip_two=false) { // if only one ip, check if is this ip if($ip_two===false){ if(($long ? (long2ip($ip_one) == $targetip) : ( $ip_one == $targetip))){ $ip=true; } else{ $ip=false; } } else{ if($long ? ($ip_one<=ip2long($targetip) && $ip_two>=ip2long($targetip)) : (ip2long($ip_one)<=ip2long($targetip) && ip2long($ip_two)>=ip2long($targetip))){ $ip=true; } else{ $ip=false; } } return $ip; } function validip_format($ip) { $ipPattern = '/\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.' . '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.' . '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.' . '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/'; return preg_match($ipPattern, $ip); } function maxslots () { global $lang_functions; global $CURUSER, $maxdlsystem; $gigs = $CURUSER["uploaded"] / (1024*1024*1024); $ratio = (($CURUSER["downloaded"] > 0) ? ($CURUSER["uploaded"] / $CURUSER["downloaded"]) : 1); if ($ratio < 0.5 || $gigs < 5) $max = 1; elseif ($ratio < 0.65 || $gigs < 6.5) $max = 2; elseif ($ratio < 0.8 || $gigs < 8) $max = 3; elseif ($ratio < 0.95 || $gigs < 9.5) $max = 4; else $max = 0; if ($maxdlsystem == "yes") { if (get_user_class() < UC_VIP) { if ($max > 0) print ("".$lang_functions['text_slots']."$max"); else print ("".$lang_functions['text_slots']."".$lang_functions['text_unlimited']); }else print ("".$lang_functions['text_slots']."".$lang_functions['text_unlimited']); }else print ("".$lang_functions['text_slots']."".$lang_functions['text_unlimited']); } function WriteConfig ($configname = NULL, $config = NULL) { global $lang_functions, $CONFIGURATIONS; if (file_exists('config/allconfig.php')) { require('config/allconfig.php'); } if ($configname) { $$configname=$config; } $path = './config/allconfig.php'; if (!file_exists($path) || !is_writable ($path)) { stdmsg($lang_functions['std_error'], $lang_functions['std_cannot_read_file']."[".htmlspecialchars($path)."]".$lang_functions['std_access_permission_note']); } $data = "".htmlspecialchars($path)."]".$lang_functions['std_to_save_info'].$lang_functions['std_access_permission_note']); } $Res = @fwrite($fp, $data); if (empty($Res)) { stdmsg($lang_functions['std_error'], $lang_functions['text_cannot_save_info_in']."[".htmlspecialchars($path)."]".$lang_functions['std_access_permission_note']); } fclose($fp); return true; } function getExportedValue($input,$t = null) { switch (gettype($input)) { case 'string': return "'".str_replace(array("\\","'"),array("\\\\","\'"),$input)."'"; case 'array': $output = "array(\r"; foreach ($input as $key => $value) { $output .= $t."\t".getExportedValue($key,$t."\t").' => '.getExportedValue($value,$t."\t"); $output .= ",\n"; } $output .= $t.')'; return $output; case 'boolean': return $input ? 'true' : 'false'; case 'NULL': return 'NULL'; case 'integer': case 'double': case 'float': return "'".(string)$input."'"; } return 'NULL'; } function dbconn($autoclean = false, $doLogin = true) { global $useCronTriggerCleanUp; \Nexus\Database\NexusDB::getInstance()->autoConnect(); if ($doLogin) { userlogin(); } if (!$useCronTriggerCleanUp && $autoclean) { register_shutdown_function("autoclean"); } } function userlogin() { // do_log("COOKIE:" . json_encode($_COOKIE) . ", uid: " . (isset($_COOKIE['c_secure_uid']) ? base64($_COOKIE["c_secure_uid"],false) : '')); static $loginResult; if (!is_null($loginResult)) { return $loginResult; } global $lang_functions; global $Cache; global $SITE_ONLINE, $oldip; global $enablesqldebug_tweak, $sqldebug_tweak; unset($GLOBALS["CURUSER"]); $log = "cookie: " . json_encode($_COOKIE); $ip = getip(); $nip = ip2long($ip); if ($nip) //$nip would be false for IPv6 address { $res = sql_query("SELECT * FROM bans WHERE $nip >= first AND $nip <= last") or sqlerr(__FILE__, __LINE__); if (mysql_num_rows($res) > 0) { header("HTTP/1.0 403 Forbidden"); print("".$lang_functions['text_unauthorized_ip']."\n"); die; } } if (empty($_COOKIE["c_secure_pass"]) || empty($_COOKIE["c_secure_uid"]) || empty($_COOKIE["c_secure_login"])) { do_log("$log, param not enough"); return $loginResult = false; } if ($_COOKIE["c_secure_login"] == base64("yeah")) { //if (empty($_SESSION["s_secure_uid"]) || empty($_SESSION["s_secure_pass"])) //return; } $b_id = base64($_COOKIE["c_secure_uid"],false); $id = intval($b_id ?? 0); if (!$id || !is_valid_id($id) || strlen($_COOKIE["c_secure_pass"]) != 32) { do_log("$log, invalid c_secure_uid"); return $loginResult = false; } if ($_COOKIE["c_secure_login"] == base64("yeah")) { //if (strlen($_SESSION["s_secure_pass"]) != 32) //return; } $res = sql_query("SELECT * FROM users WHERE users.id = ".sqlesc($id)." AND users.enabled='yes' AND users.status = 'confirmed' LIMIT 1"); $row = mysql_fetch_array($res); if (!$row) { do_log("$log, c_secure_uid not exists"); return $loginResult = false; } $sec = hash_pad($row["secret"]); //die(base64_decode($_COOKIE["c_secure_login"])); if ($_COOKIE["c_secure_login"] == base64("yeah")) { /** * Not IP related * @since 1.8.0 */ // $md5 = md5($row["passhash"].$ip); $md5 = md5($row["passhash"]); $log .= ", secure login == yeah, passhash: {$row['passhash']}, ip: $ip, md5: $md5"; if ($_COOKIE["c_secure_pass"] != $md5) { do_log("$log, c_secure_pass != md5"); return $loginResult = false; } } else { $md5 = md5($row["passhash"]); $log .= "$log, passhash: {$row['passhash']}, md5: $md5"; if ($_COOKIE["c_secure_pass"] !== $md5) { do_log("$log, c_secure_pass != md5"); return $loginResult = false; } } if ($_COOKIE["c_secure_login"] == base64("yeah")) { //if ($_SESSION["s_secure_pass"] !== md5($row["passhash"].$_SERVER["REMOTE_ADDR"])) //return; } if (!$row["passkey"]){ $passkey = md5($row['username'].date("Y-m-d H:i:s").$row['passhash']); sql_query("UPDATE users SET passkey = ".sqlesc($passkey)." WHERE id=" . sqlesc($row["id"])); } $oldip = $row['ip']; $row['ip'] = $ip; $GLOBALS["CURUSER"] = $row; if (isset($_GET['clearcache']) && $_GET['clearcache'] && get_user_class() >= UC_MODERATOR) { $Cache->setClearCache(1); } /** * no need any more, already set in core.php * @since v1.6 */ // if ($enablesqldebug_tweak == 'yes' && get_user_class() >= $sqldebug_tweak) { // error_reporting(E_ALL & ~E_NOTICE); // error_reporting(-1); // } return $loginResult = true; } function autoclean($printProgress = false) { global $autoclean_interval_one, $rootpath; $now = TIMENOW; $res = sql_query("SELECT value_u FROM avps WHERE arg = 'lastcleantime'"); $row = mysql_fetch_array($res); if (!$row) { do_log("SELECT value_u FROM avps WHERE arg = 'lastcleantime', empty"); sql_query("INSERT INTO avps (arg, value_u) VALUES ('lastcleantime',$now)") or sqlerr(__FILE__, __LINE__); return false; } $ts = $row[0]; if ($ts + $autoclean_interval_one > $now) { do_log("ts: {$ts} + autoclean_interval_one: $autoclean_interval_one > now: $now"); return false; } sql_query("UPDATE avps SET value_u=$now WHERE arg='lastcleantime' AND value_u = $ts") or sqlerr(__FILE__, __LINE__); if (!mysql_affected_rows()) { do_log("UPDATE avps SET value_u=$now WHERE arg='lastcleantime' AND value_u = $ts, affectedRows = 0"); return false; } require_once($rootpath . 'include/cleanup.php'); return docleanup(0, $printProgress); } function unesc($x) { return $x; } function getsize_int($amount, $unit = "G") { if ($unit == "B") return floor($amount); elseif ($unit == "K") return floor($amount * 1024); elseif ($unit == "M") return floor($amount * 1048576); elseif ($unit == "G") return floor($amount * 1073741824); elseif($unit == "T") return floor($amount * 1099511627776); elseif($unit == "P") return floor($amount * 1125899906842624); } function mksize_compact($bytes) { if ($bytes < 1000 * 1024) return number_format($bytes / 1024, 2) . "
KB"; elseif ($bytes < 1000 * 1048576) return number_format($bytes / 1048576, 2) . "
MB"; elseif ($bytes < 1000 * 1073741824) return number_format($bytes / 1073741824, 2) . "
GB"; elseif ($bytes < 1000 * 1099511627776) return number_format($bytes / 1099511627776, 3) . "
TB"; else return number_format($bytes / 1125899906842624, 3) . "
PB"; } function mksize_loose($bytes) { if ($bytes < 1000 * 1024) return number_format($bytes / 1024, 2) . " KB"; elseif ($bytes < 1000 * 1048576) return number_format($bytes / 1048576, 2) . " MB"; elseif ($bytes < 1000 * 1073741824) return number_format($bytes / 1073741824, 2) . " GB"; elseif ($bytes < 1000 * 1099511627776) return number_format($bytes / 1099511627776, 3) . " TB"; else return number_format($bytes / 1125899906842624, 3) . " PB"; } function mksize($bytes) { if ($bytes < 1000 * 1024) return number_format($bytes / 1024, 2) . " KB"; elseif ($bytes < 1000 * 1048576) return number_format($bytes / 1048576, 2) . " MB"; elseif ($bytes < 1000 * 1073741824) return number_format($bytes / 1073741824, 2) . " GB"; elseif ($bytes < 1000 * 1099511627776) return number_format($bytes / 1099511627776, 3) . " TB"; else return number_format($bytes / 1125899906842624, 3) . " PB"; } function mksizeint($bytes) { $bytes = max(0, $bytes); if ($bytes < 1000) return floor($bytes) . " B"; elseif ($bytes < 1000 * 1024) return floor($bytes / 1024) . " kB"; elseif ($bytes < 1000 * 1048576) return floor($bytes / 1048576) . " MB"; elseif ($bytes < 1000 * 1073741824) return floor($bytes / 1073741824) . " GB"; elseif ($bytes < 1000 * 1099511627776) return floor($bytes / 1099511627776) . " TB"; else return floor($bytes / 1125899906842624) . " PB"; } function deadtime() { $anninterthree = (int)get_setting("main.anninterthree"); return time() - floor($anninterthree * 1.3); } function mkprettytime($s) { global $lang_functions; if ($s < 0) $s = 0; $t = array(); foreach (array("60:sec","60:min","24:hour","0:day") as $x) { $y = explode(":", $x); if ($y[0] > 1) { $v = $s % $y[0]; $s = floor($s / $y[0]); } else $v = $s; $t[$y[1]] = $v; } if ($t["day"]) return $t["day"] . ($lang_functions['text_day'] ?? 'day(s)') . sprintf("%02d:%02d:%02d", $t["hour"], $t["min"], $t["sec"]); if ($t["hour"]) return sprintf("%d:%02d:%02d", $t["hour"], $t["min"], $t["sec"]); // if ($t["min"]) return sprintf("%d:%02d", $t["min"], $t["sec"]); // return $t["sec"] . " secs"; } function mkglobal($vars) { if (!is_array($vars)) $vars = explode(":", $vars); foreach ($vars as $v) { if (isset($_GET[$v])) $GLOBALS[$v] = unesc($_GET[$v]); elseif (isset($_POST[$v])) $GLOBALS[$v] = unesc($_POST[$v]); else return 0; } return 1; } function tr($x,$y,$noesc=0,$relation='', $return = false) { if ($noesc) $a = $y; else { $a = htmlspecialchars($y); $a = str_replace("\n", "
\n", $a); } // $result = ("$x".$a."\n"); $result = sprintf( '%s%s', $relation ? sprintf(' relation="%s" class="%s"', $relation, $relation) : '', $x, $a ); if ($return) { return $result; } print $result; } function tr_small($x,$y,$noesc=0,$relation='',$return = false) { if ($noesc) $a = $y; else { $a = htmlspecialchars($y); //$a = str_replace("\n", "
\n", $a); } $result = "".$x."".$a.""; if ($return) { return $result; } print($result); } function twotd($x,$y,$nosec=0){ if ($nosec) $a = $y; else { $a = htmlspecialchars($y); $a = str_replace("\n", "
\n", $a); } print("".$x."".$y.""); } function validfilename($name) { return preg_match('/^[^\0-\x1f:\\\\\/?*\xff#<>|]+$/si', $name); } function validemail($email) { return preg_match('/^[\w.-]+@([\w.-]+\.)+[a-z]{2,6}$/is', $email); } function validlang($langid) { global $deflang; $langid = intval($langid ?? 0); $res = sql_query("SELECT * FROM language WHERE site_lang = 1 AND id = " . sqlesc($langid)) or sqlerr(__FILE__, __LINE__); if(mysql_num_rows($res) == 1) { $arr = mysql_fetch_array($res) or sqlerr(__FILE__, __LINE__); return $arr['site_lang_folder']; } else return $deflang; } function get_if_restricted_is_open() { global $sptime; // it's sunday if($sptime == 'yes' && (date("w",time()) == '0' || (date("w",time()) == 6) && (date("G",time()) >=12 && date("G",time()) <=23))) { return true; } else return false; } function menu ($selected = "home") { global $lang_functions; global $BASEURL,$CURUSER; global $enableoffer, $enablespecial, $enableextforum, $extforumurl, $where_tweak; global $USERUPDATESET; //no this option in config.php $enablerequest = 'yes'; $script_name = $_SERVER["SCRIPT_FILENAME"]; if (preg_match("/index/i", $script_name)) { $selected = "home"; }elseif (preg_match("/forums/i", $script_name)) { $selected = "forums"; }elseif (preg_match("/torrents/i", $script_name)) { $selected = "torrents"; }elseif (preg_match("/special/i", $script_name)) { $selected = "special"; }elseif (preg_match("/offers/i", $script_name) OR preg_match("/offcomment/i", $script_name)) { $selected = "offers"; }elseif (preg_match("/requests/i", $script_name)) { $selected = "requests"; }elseif (preg_match("/upload/i", $script_name)) { $selected = "upload"; }elseif (preg_match("/subtitles/i", $script_name)) { $selected = "subtitles"; }elseif (preg_match("/usercp/i", $script_name)) { $selected = "usercp"; }elseif (preg_match("/topten/i", $script_name)) { $selected = "topten"; }elseif (preg_match("/log/i", $script_name)) { $selected = "log"; }elseif (preg_match("/rules/i", $script_name)) { $selected = "rules"; }elseif (preg_match("/faq/i", $script_name)) { $selected = "faq"; }elseif (preg_match("/contactstaff/i", $script_name)) { $selected = "contactstaff"; }elseif (preg_match("/staff/i", $script_name)) { $selected = "staff"; }else $selected = ""; $menu = apply_filter('nexus_menu'); print ("
"); if ($menu) { print $menu; } else { $lang = get_langfolder_cookie(); $normalSectionName = get_searchbox_value(get_setting('main.browsecat'), 'section_name'); $specialSectionName = get_searchbox_value(get_setting('main.specialcat'), 'section_name'); print (""); } print ("
"); if ($CURUSER){ if ($where_tweak == 'yes') $USERUPDATESET[] = "page = ".sqlesc($selected); } } function get_css_row() { global $CURUSER, $defcss, $Cache; static $rows; $cssid = $CURUSER ? $CURUSER["stylesheet"] : $defcss; if (!$rows && !$rows = $Cache->get_value('stylesheet_content')){ $rows = array(); $res = sql_query("SELECT * FROM stylesheets ORDER BY id ASC"); while($row = mysql_fetch_array($res)) { $rows[$row['id']] = $row; } $Cache->cache_value('stylesheet_content', $rows, 95400); } return $rows[$cssid]; } function get_css_uri($file = "") { global $defcss; $cssRow = get_css_row(); $ss_uri = $cssRow['uri']; if (!$ss_uri) $ss_uri = get_single_value("stylesheets","uri","WHERE id=".sqlesc($defcss)); if ($file == "") return $ss_uri; else return $ss_uri.$file; } function get_font_css_uri(){ global $CURUSER; $file = 'mediumfont.css'; if ($CURUSER && isset($CURUSER['fontsize'])) { if ($CURUSER['fontsize'] == 'large') $file = 'largefont.css'; elseif ($CURUSER['fontsize'] == 'small') $file = 'smallfont.css'; } return "styles/".$file; } function get_style_addicode() { $cssRow = get_css_row(); return $cssRow['addicode']; } function get_cat_folder($cat = 101) { static $catPath = array(); if (!isset($catPath[$cat])) { global $CURUSER, $CURLANGDIR; $catrow = get_category_row($cat); $catmode = $catrow['catmodename']; // $caticonrow = get_category_icon_row($CURUSER['caticon']); /** * @since v1.6 * use setting, not user's caticon, that field make no sense! */ $caticonrow = get_category_icon_row($catrow['icon_id'] ?: 1); $path = sprintf('category/%s/%s', trim($catmode, '/'), trim($caticonrow['folder'], '/')); if ($caticonrow['multilang'] == 'yes') { $path .= '/' . trim($CURLANGDIR, '/'); } do_log("cat: $cat, path: $path", 'debug'); $catPath[$cat] = $path; } return $catPath[$cat] ?? ''; } function get_style_highlight() { global $CURUSER; if ($CURUSER) { $ss_a = @mysql_fetch_array(@sql_query("select hltr from stylesheets where id=" . $CURUSER["stylesheet"])); if ($ss_a) $hltr = $ss_a["hltr"]; } if (!$hltr) { $r = sql_query("SELECT hltr FROM stylesheets WHERE id=5"); $a = mysql_fetch_array($r); $hltr = $a["hltr"]; } return $hltr; } function stdhead($title = "", $msgalert = true, $script = "", $place = "") { global $lang_functions; global $CURUSER, $CURLANGDIR, $USERUPDATESET, $iplog1, $oldip, $SITE_ONLINE, $FUNDS, $SITENAME, $SLOGAN, $logo_main, $BASEURL, $offlinemsg,$enabledonation, $staffmem_class, $titlekeywords_tweak, $metakeywords_tweak, $metadescription_tweak, $cssdate_tweak, $deletenotransfertwo_account, $neverdelete_account, $iniupload_main; global $tstart; global $Cache; global $Advertisement; $Cache->setLanguage($CURLANGDIR); $Advertisement = new ADVERTISEMENT($CURUSER['id'] ?? 0); $cssupdatedate = $cssdate_tweak; // Variable for Start Time $tstart = getmicrotime(); // Start time //Insert old ip into iplog if ($CURUSER){ if ($iplog1 == "yes") { if (($oldip != $CURUSER["ip"]) && $CURUSER["ip"]) sql_query("INSERT INTO iplog (ip, userid, access) VALUES (" . sqlesc($CURUSER['ip']) . ", " . $CURUSER['id'] . ", '" . $CURUSER['last_access'] . "')"); } $USERUPDATESET[] = "last_access = ".sqlesc(date("Y-m-d H:i:s")); $USERUPDATESET[] = "ip = ".sqlesc($CURUSER['ip']); } header("Content-Type: text/html; charset=utf-8; Cache-control:private"); //header("Pragma: No-cache"); if ($title == "") $title = $SITENAME; else $title = $SITENAME." :: " . htmlspecialchars($title); if ($titlekeywords_tweak) $title .= " ".htmlspecialchars($titlekeywords_tweak); $title .= " - Powered by ".PROJECTNAME; if ($SITE_ONLINE == "no") { if (get_user_class() < UC_ADMINISTRATOR) { die($lang_functions['std_site_down_for_maintenance']); } else { $offlinemsg = true; } } ?> <?php echo $title?> " type="text/css" /> " type="text/css" /> " type="text/css" /> listIcon($requireSearchBoxIdAr); foreach ($icons as $icon) { ?>
<?php echo htmlspecialchars($SITENAME)?>
enable_ad()){ $headerad=$Advertisement->get_ad('header'); if ($headerad){ echo "".$headerad[0].""; } } if ($enabledonation == 'yes'){?> Make a donation
enable_ad()){ $belownavad=$Advertisement->get_ad('belownav'); if ($belownavad) echo "
".$belownavad[0]."
"; } if ($msgalert) { $spStateGlobal = get_global_sp_state(); if ($spStateGlobal != \App\Models\Torrent::PROMOTION_NORMAL) { $torrentGlobalStateRow = \Nexus\Database\NexusDB::cache_get(\App\Models\Setting::TORRENT_GLOBAL_STATE_CACHE_KEY); $msg = sprintf($lang_functions['full_site_promotion_in_effect'], \App\Models\Torrent::$promotionTypes[$spStateGlobal]['text']); if (!empty($torrentGlobalStateRow['begin']) || !empty($torrentGlobalStateRow['deadline'])) { $timeRange = sprintf($lang_functions['full_site_promotion_time_range'], $torrentGlobalStateRow['begin'] ?? '-∞', $torrentGlobalStateRow['deadline'] ?? '∞'); $msg .= $timeRange; } msgalert("torrents.php", $msg, "green"); } if($CURUSER['leechwarn'] == 'yes') { $kicktimeout = gettime($CURUSER['leechwarnuntil'], false, false, true); $text = $lang_functions['text_please_improve_ratio_within'].$kicktimeout.$lang_functions['text_or_you_will_be_banned']; msgalert("faq.php#id17", $text, "orange"); } if($deletenotransfertwo_account) //inactive account deletion notice { if ($CURUSER['downloaded'] == 0 && ($CURUSER['uploaded'] == 0 || $CURUSER['uploaded'] == $iniupload_main)) { $neverdelete_account = ($neverdelete_account <= UC_VIP ? $neverdelete_account : UC_VIP); if (get_user_class() < $neverdelete_account) { $secs = $deletenotransfertwo_account*24*60*60; $addedtime = strtotime($CURUSER['added']); if (TIMENOW > $addedtime+($secs/3)) // start notification if one third of the time has passed { $kicktimeout = gettime(date("Y-m-d H:i:s", $addedtime+$secs), false, false, true); $text = $lang_functions['text_please_download_something_within'].$kicktimeout.$lang_functions['text_inactive_account_be_deleted']; msgalert("rules.php", $text, "gray"); } } } } if($CURUSER['showclienterror'] == 'yes') { $text = $lang_functions['text_banned_client_warning']; msgalert("faq.php#id29", $text, "black"); } if ($unread) { $text = $lang_functions['text_you_have'].$unread.$lang_functions['text_new_message'] . add_s($unread) . $lang_functions['text_click_here_to_read']; msgalert("messages.php",$text, "red"); } \App\Utils\MsgAlert::getInstance()->render(); /* $pending_invitee = $Cache->get_value('user_'.$CURUSER["id"].'_pending_invitee_count'); if ($pending_invitee == ""){ $pending_invitee = get_row_count("users","WHERE status = 'pending' AND invited_by = ".sqlesc($CURUSER['id'])); $Cache->cache_value('user_'.$CURUSER["id"].'_pending_invitee_count', $pending_invitee, 900); } if ($pending_invitee > 0) { $text = $lang_functions['text_your_friends'].add_s($pending_invitee).is_or_are($pending_invitee).$lang_functions['text_awaiting_confirmation']; msgalert("invite.php?id=".$CURUSER['id'],$text, "red"); }*/ $settings_script_name = $_SERVER["SCRIPT_FILENAME"]; if (!preg_match("/index/i", $settings_script_name)) { $new_news = $Cache->get_value('user_'.$CURUSER["id"].'_unread_news_count'); if ($new_news == ""){ $new_news = get_row_count("news","WHERE notify = 'yes' AND added > ".sqlesc($CURUSER['last_home'])); $Cache->cache_value('user_'.$CURUSER["id"].'_unread_news_count', $new_news, 300); } if ($new_news > 0) { $text = $lang_functions['text_there_is'].is_or_are($new_news).$new_news.$lang_functions['text_new_news']; msgalert("index.php",$text, "green"); } } //Staff message, not only staff member // $cacheKey = 'staff_new_message_count_' . $CURUSER['id']; // $nummessages = $Cache->get_value($cacheKey); $nummessages = \App\Repositories\MessageRepository::getStaffMessageCountCache($CURUSER['id'], 'new'); if ($nummessages === false){ $nummessages = \App\Repositories\MessageRepository::countStaffMessage($CURUSER['id'], 0); // $Cache->cache_value($cacheKey, $nummessages, 900); \App\Repositories\MessageRepository::updateStaffMessageCountCache($CURUSER['id'], 'new', $nummessages); } if ($nummessages > 0) { $text = $lang_functions['text_there_is'].is_or_are($nummessages).$nummessages.$lang_functions['text_new_staff_message'] . add_s($nummessages); msgalert("staffbox.php",$text, "blue"); } //torrent approval if (user_can('torrent-approval') && get_setting('torrent.approval_status_none_visible') == 'no') { $cacheKey = 'TORRENT_APPROVAL_NONE'; $toApprovalCounts = $Cache->get_value($cacheKey); if ($toApprovalCounts === false) { $toApprovalCounts = get_row_count('torrents', 'where approval_status = 0'); $Cache->cache_value($cacheKey, $toApprovalCounts, 60); } if ($toApprovalCounts) { msgalert('torrents.php?approval_status=0', sprintf($lang_functions['text_torrent_to_approval'], is_or_are($toApprovalCounts), $toApprovalCounts, add_s($toApprovalCounts)), 'darkred'); } } //seed box approval if (get_user_class() >= \App\Models\User::CLASS_ADMINISTRATOR && get_setting('seed_box.enabled') == 'yes') { $cacheKey = 'SEED_BOX_RECORD_APPROVAL_NONE'; $toApprovalCounts = $Cache->get_value($cacheKey); if ($toApprovalCounts === false) { $toApprovalCounts = get_row_count('seed_box_records', 'where status = 0'); $Cache->cache_value($cacheKey, $toApprovalCounts, 60); } if ($toApprovalCounts) { msgalert('/nexusphp/seed-box-records?tableFilters[status][value]=0', sprintf($lang_functions['text_seed_box_record_to_approval'], is_or_are($toApprovalCounts), $toApprovalCounts, add_s($toApprovalCounts)), 'darkred'); } } if (user_can('staffmem')) { if(($complaints = $Cache->get_value('COMPLAINTS_COUNT_CACHE')) === false){ $complaints = get_row_count('complains', 'WHERE answered = 0'); $Cache->cache_value('COMPLAINTS_COUNT_CACHE', $complaints, 600); } if($complaints) { msgalert('complains.php?action=list', sprintf($lang_functions['text_complains'], is_or_are($complaints), $complaints, add_s($complaints)), 'darkred'); } $numreports = $Cache->get_value('staff_new_report_count'); if ($numreports == ""){ $numreports = get_row_count("reports","WHERE dealtwith=0"); $Cache->cache_value('staff_new_report_count', $numreports, 900); } if ($numreports){ $text = $lang_functions['text_there_is'].is_or_are($numreports).$numreports.$lang_functions['text_new_report'] .add_s($numreports); msgalert("reports.php",$text, "blue"); } $numcheaters = $Cache->get_value('staff_new_cheater_count'); if ($numcheaters == ""){ $numcheaters = get_row_count("cheaters","WHERE dealtwith=0"); $Cache->cache_value('staff_new_cheater_count', $numcheaters, 900); } if ($numcheaters){ $text = $lang_functions['text_there_is'].is_or_are($numcheaters).$numcheaters.$lang_functions['text_new_suspected_cheater'] .add_s($numcheaters); msgalert("cheaterbox.php",$text, "blue"); } } //show the exam info $exam = new \Nexus\Exam\Exam(); $currentExam = $exam->getCurrent($CURUSER['id']); if (!empty($currentExam['html'])) { msgalert("messages.php", $currentExam['html'], $currentExam['exam']->background_color ?? 'blue'); } } if ($offlinemsg) { print("

\n"); print("".$lang_functions['text_website_offline_warning'].""); print("


\n"); } } } function stdfoot() { global $SITENAME,$BASEURL,$Cache,$datefounded,$tstart,$icplicense_main,$add_key_shortcut,$query_name, $USERUPDATESET, $CURUSER, $enablesqldebug_tweak, $sqldebug_tweak, $Advertisement, $analyticscode_tweak; global $hook; print("
"); print("
"); if ($Advertisement && $Advertisement->enable_ad()){ $footerad=$Advertisement->get_ad('footer'); if ($footerad) echo "
".$footerad[0]."
"; } print("
"); if ($CURUSER && count($USERUPDATESET)){ sql_query("UPDATE users SET " . join(",", $USERUPDATESET) . " WHERE id = ".$CURUSER['id']); } // Variables for End Time $tend = microtime(true); $totaltime = ($tend - nexus()->getStartTimestamp()); $year = substr($datefounded, 0, 4); $yearfounded = ($year ? $year : 2007); print(" (c) "." ".$SITENAME." ".($icplicense_main ? " ".$icplicense_main." " : "").(date("Y") != $yearfounded ? $yearfounded."-" : "").date("Y")." ".VERSION."

"); printf ("[page created in %s sec", sprintf("%.3f", $totaltime)); print (" with ".count($query_name)." db queries, ".$Cache->getCacheReadTimes()." reads and ".$Cache->getCacheWriteTimes()." writes of Redis and ".mksize(memory_get_usage())." ram]"); print ("
\n"); if ($enablesqldebug_tweak == 'yes' && get_user_class() >= $sqldebug_tweak) { print("
SQL query list:
    "); foreach($query_name as $query) { print(sprintf('
  • %s [%s]
  • ', htmlspecialchars($query['query']), $query['time'])); } print("
"); print("Redis key read:
    "); foreach($Cache->getKeyHits('read') as $keyName => $hits) { print("
  • ".htmlspecialchars($keyName)." : ".$hits."
  • "); } print("
"); print("Redis key write:
    "); foreach($Cache->getKeyHits('write') as $keyName => $hits) { print("
  • ".htmlspecialchars($keyName)." : ".$hits."
  • "); } print("
"); print("
"); } print ("
"); if ($add_key_shortcut != "") print($add_key_shortcut); print("
"); if ($analyticscode_tweak) print("\n".$analyticscode_tweak."\n"); // $hook->dump(); do_action('nexus_footer'); foreach (\Nexus\Nexus::getAppendFooters() as $value) { print($value); } $js = << JS; print($js); print(''); print(""); //echo replacePngTags(ob_get_clean()); // unset($_SESSION['queries']); } function genbark($x,$y) { stdhead($y); print("

" . htmlspecialchars($y) . "

\n"); print("

" . htmlspecialchars($x) . "

\n"); stdfoot(); exit(); } function mksecret($len = 20) { $ret = ""; for ($i = 0; $i < $len; $i++) $ret .= chr(mt_rand(100, 120)); return $ret; } function httperr($code = 404) { header("HTTP/1.0 404 Not found"); print("

Not Found

\n"); exit(); } function logincookie($id, $passhash, $updatedb = 1, $expires = 0x7fffffff, $securelogin=false, $ssl=false, $trackerssl=false) { if ($expires != 0x7fffffff) $expires = time()+$expires; setcookie("c_secure_uid", base64($id), $expires, "/", "", false, true); setcookie("c_secure_pass", $passhash, $expires, "/", "", false, true); if($ssl) setcookie("c_secure_ssl", base64("yeah"), $expires, "/", "", false, true); else setcookie("c_secure_ssl", base64("nope"), $expires, "/", "", false, true); if($trackerssl) setcookie("c_secure_tracker_ssl", base64("yeah"), $expires, "/", "", false, true); else setcookie("c_secure_tracker_ssl", base64("nope"), $expires, "/", "", false, true); if ($securelogin) setcookie("c_secure_login", base64("yeah"), $expires, "/", "", false, true); else setcookie("c_secure_login", base64("nope"), $expires, "/", "", false, true); if ($updatedb) sql_query("UPDATE users SET last_login = NOW(), lang=" . sqlesc(get_langid_from_langcookie()) . " WHERE id = ".sqlesc($id)); } function set_langfolder_cookie($folder, $expires = 0x7fffffff) { if ($expires != 0x7fffffff) $expires = time()+$expires; setcookie("c_lang_folder", $folder, $expires, "/", "", false, true); } function get_protocol_prefix() { global $securelogin; if (isHttps()) { return "https://"; } if ($securelogin == "yes") { return "https://"; } elseif ($securelogin == "no") { return "http://"; } else { if (!isset($_COOKIE["c_secure_ssl"])) { return "http://"; } else { return base64_decode($_COOKIE["c_secure_ssl"]) == "yeah" ? "https://" : "http://"; } } } function get_langid_from_langcookie($lang = '') { if (empty($lang)) { global $CURLANGDIR; $lang = $CURLANGDIR; } $row = mysql_fetch_array(sql_query("SELECT id FROM language WHERE site_lang = 1 AND site_lang_folder = " . sqlesc($lang) . "ORDER BY id ASC")) or sqlerr(__FILE__, __LINE__); return $row['id']; } function make_folder($pre, $folder_name) { $path = $pre . $folder_name; $path = ROOT_PATH . ltrim($path, './'); do_log($path); if(!is_dir($path)) mkdir($path,0777,true); return $path; } function logoutcookie() { setcookie("c_secure_uid", "", 0x7fffffff, "/", "", false, true); setcookie("c_secure_pass", "", 0x7fffffff, "/", "", false, true); // setcookie("c_secure_ssl", "", 0x7fffffff, "/", "", false, true); setcookie("c_secure_tracker_ssl", "", 0x7fffffff, "/", "", false, true); setcookie("c_secure_login", "", 0x7fffffff, "/", "", false, true); // setcookie("c_lang_folder", "", 0x7fffffff, "/", "", false, true); } function base64 ($string, $encode=true) { if ($encode) return base64_encode($string); else return base64_decode($string); } function loggedinorreturn($mainpage = false) { global $CURUSER,$BASEURL; if (!$CURUSER) { if (nexus()->getScript() == 'ajax') { exit(fail('Not login!', $_POST)); } if ($mainpage) { nexus_redirect("login.php"); } else { $to = $_SERVER["REQUEST_URI"]; $to = basename($to); nexus_redirect("login.php?returnto=" . rawurlencode($to)); } exit(); } // do_log("[USER]: " . $CURUSER['id']); } function deletetorrent($id, $notify = false) { $idArr = is_array($id) ? $id : [$id]; $torrentInfo = \App\Models\Torrent::query() ->whereIn("id", $idArr) ->get() ->KeyBy("id") ; $torrentRep = new \App\Repositories\TorrentRepository(); $idStr = implode(', ', $idArr ?: [0]); $torrent_dir = get_setting('main.torrent_dir'); \Nexus\Database\NexusDB::statement("DELETE FROM torrents WHERE id in ($idStr)"); //delete by torrent, make sure user is deleted \Nexus\Database\NexusDB::statement("DELETE FROM snatched WHERE torrentid in ($idStr) and not exists (select 1 from users where id = snatched.userid)"); foreach(array("peers", "files", "comments") as $x) { \Nexus\Database\NexusDB::statement("DELETE FROM $x WHERE torrent in ($idStr)"); } \Nexus\Database\NexusDB::statement("DELETE FROM hit_and_runs WHERE torrent_id in ($idStr)"); \Nexus\Database\NexusDB::statement("DELETE FROM claims WHERE torrent_id in ($idStr)"); foreach ($torrentInfo as $_id => $info) { if ($torrentInfo->has($_id)) { $torrentRep->delPiecesHashCache($torrentInfo->get($_id)->pieces_hash); } do_log("delete torrent: $_id", "error"); unlink(getFullDirectory("$torrent_dir/$_id.torrent")); \App\Models\TorrentOperationLog::add([ 'torrent_id' => $_id, 'uid' => get_user_id(), 'action_type' => \App\Models\TorrentOperationLog::ACTION_TYPE_DELETE, 'comment' => '', ], $notify); } $meiliSearchRep = new \App\Repositories\MeiliSearchRepository(); $meiliSearchRep->deleteDocuments($idArr); if (is_int($id)) { do_action("torrent_delete", $id); fire_event("torrent_deleted", $torrentInfo->get($id)); } } function pager($rpp, $count, $href, $opts = array(), $pagename = "page") { global $lang_functions,$add_key_shortcut; $pages = ceil($count / $rpp); if (empty($opts["lastpagedefault"])) $pagedefault = 0; else { $pagedefault = floor(($count - 1) / $rpp); if ($pagedefault < 0) $pagedefault = 0; } if (isset($_GET[$pagename])) { $page = intval($_GET[$pagename] ?? 0); if ($page < 0) $page = $pagedefault; } else $page = $pagedefault; $pager = ""; $mp = $pages - 1; //Opera (Presto) doesn't know about event.altKey $is_presto = strpos($_SERVER['HTTP_USER_AGENT'], 'Presto'); $as = "<< ".$lang_functions['text_prev'].""; if ($page >= 1) { $pager .= ""; $pager .= $as; $pager .= ""; } else $pager .= "".$as.""; $pager .= "      "; $as = "".$lang_functions['text_next']." >>"; if ($page < $mp && $mp >= 0) { $pager .= ""; $pager .= $as; $pager .= ""; } else $pager .= "".$as.""; if ($count) { $pagerarr = array(); $dotted = 0; $dotspace = 3; $dotend = $pages - $dotspace; $curdotend = $page - $dotspace; $curdotstart = $page + $dotspace; for ($i = 0; $i < $pages; $i++) { if (($i >= $dotspace && $i <= $curdotend) || ($i >= $curdotstart && $i < $dotend)) { if (!$dotted) $pagerarr[] = "..."; $dotted = 1; continue; } $dotted = 0; $start = $i * $rpp + 1; $end = $start + $rpp - 1; if ($end > $count) $end = $count; $text = "$start - $end"; if ($i != $page) $pagerarr[] = "$text"; else $pagerarr[] = "$text"; } $pagerstr = join(" | ", $pagerarr); $pagertop = "

$pager
$pagerstr

\n"; $pagerbottom = "

$pagerstr
$pager

\n"; } else { $pagertop = "

$pager

\n"; $pagerbottom = $pagertop; } $start = $page * $rpp; $add_key_shortcut = key_shortcut($page,$pages-1); return array($pagertop, $pagerbottom, "LIMIT $start,$rpp", $start, $rpp, $page); } function commenttable($rows, $type, $parent_id, $review = false) { global $lang_functions; global $CURUSER, $commanage_class; global $Advertisement; begin_main_frame(); begin_frame(); $count = 0; if ($Advertisement->enable_ad()) $commentad = $Advertisement->get_ad('comment'); $uidArr = array_unique(array_column($rows, 'user')); $neededColumns = array('id', 'noad', 'class', 'enabled', 'privacy', 'avatar', 'signature', 'uploaded', 'downloaded', 'last_access', 'username', 'donor', 'leechwarn', 'warned', 'title'); $userInfoArr = \App\Models\User::query()->find($uidArr, $neededColumns)->keyBy('id'); foreach ($rows as $row) { // $userRow = get_user_row($row['user']); $userInfo = $userInfoArr->get($row['user'], \App\Models\User::defaultUser()); $userRow = $userInfo->toArray(); if ($count>=1) { if ($Advertisement->enable_ad()){ if (!empty($commentad[$count-1])) echo "
".$commentad[$count-1]."
"; } } print("
#" . $row["id"] . "  ".$lang_functions['text_by'].""); print(get_username($row["user"],false,true,true,false,false,true)); print("  ".$lang_functions['text_at']."".gettime($row["added"]). ($row["editedby"] && user_can('commanage') ? " - [".$lang_functions['text_view_original']."]" : "") . "\"Top\"  
"); $avatar = ($CURUSER["avatars"] == "yes" ? htmlspecialchars(trim($userRow["avatar"])) : ""); if (!$avatar) $avatar = "pic/default_avatar.png"; $text = format_comment($row["text"]); $text_editby = ""; if ($row["editedby"]){ $lastedittime = gettime($row['editdate'],true,false); $text_editby = "

".$lang_functions['text_last_edited_by'].get_username($row['editedby']).$lang_functions['text_edited_at'].$lastedittime."

\n"; } print("\n"); $secs = 900; $dt = sqlesc(date("Y-m-d H:i:s",(TIMENOW - $secs))); // calculate date. print("\n"); print("\n"); print("\n"); print("\n"); $actionbar = "\"Quote\"". "\"Add".(user_can('commanage') ? "\"Delete\"" : "").($row["user"] == $CURUSER["id"] || get_user_class() >= $commanage_class ? "\"Edit\""."" : ""); print(""); print("
".return_avatar_image($avatar)."
".$text.$text_editby."
".("'".$userRow['last_access']."'"> $dt ? "\"Online\"":"\"Offline\"" )."\"PM\"\"Report\"".$actionbar."
\n"); $count++; } end_frame(); end_main_frame(); } function searchfield($s) { return preg_replace(array('/[^a-z0-9]/si', '/^\s*/s', '/\s*$/s', '/\s+/s'), array(" ", "", "", " "), $s); } function genrelist($catmode = 1) { global $Cache; if (!$ret = $Cache->get_value('category_list_mode_'.$catmode)){ $ret = array(); $res = sql_query("SELECT id, mode, name, image FROM categories WHERE mode = ".sqlesc($catmode)." ORDER BY sort_index desc"); while ($row = mysql_fetch_array($res)) $ret[] = $row; $Cache->cache_value('category_list_mode_'.$catmode, $ret, 3600); } return $ret; } function searchbox_item_list(string $table, int $mode){ global $Cache; $cacheKey = "{$table}_list_mode_{$mode}"; if (!$ret = $Cache->get_value($cacheKey)){ $ret = array(); $sql = "SELECT * FROM $table"; if ($mode > 0) { $sql .= " where (mode = '$mode' or mode = 0)"; } $sql .= " ORDER BY sort_index, id"; $res = sql_query($sql); while ($row = mysql_fetch_array($res)) $ret[] = $row; $Cache->cache_value($cacheKey, $ret, 3600); } return $ret; } function langlist($type, $enabled = null) { global $Cache; $cacheKey = $type.'_lang_list'; return \Nexus\Database\NexusDB::remember($cacheKey, 600, function () use ($type, $enabled) { $query = \App\Models\Language::query()->where($type, 1); if ($enabled !== null) { $query->whereIn('site_lang_folder', \App\Models\Language::listEnabled(true)); } return $query->get()->toArray(); }); // if (!$ret = $Cache->get_value($type.'_lang_list')){ // $ret = array(); // $res = sql_query("SELECT id, lang_name, flagpic, site_lang_folder FROM language WHERE ". $type ."=1 ORDER BY site_lang DESC, id ASC"); // while ($row = mysql_fetch_array($res)) // $ret[] = $row; // $Cache->cache_value($type.'_lang_list', $ret, 152800); // } // return $ret; } function linkcolor($num) { if (!$num) return "red"; // if ($num == 1) // return "yellow"; return "green"; } function writecomment($userid, $comment, $oldModcomment = null) { \App\Models\UserModifyLog::query()->create(['user_id' => $userid, 'content' => date("Y-m-d") . " - " . $comment]); // if (is_null($oldModcomment)) { // $res = sql_query("SELECT modcomment FROM users WHERE id = '$userid'") or sqlerr(__FILE__, __LINE__); // $arr = mysql_fetch_assoc($res); // $modcomment = date("Y-m-d") . " - " . $comment . "" . ($arr['modcomment'] != "" ? "\n" : "") . $arr['modcomment']; // } else { // $modcomment = date("Y-m-d") . " - " . $comment . "" . ($oldModcomment != "" ? "\n" : "") .$oldModcomment; // } // $modcom = sqlesc($modcomment); // do_log("update user: $userid prepend modcomment: $comment, with oldModcomment: $oldModcomment"); // return sql_query("UPDATE users SET modcomment = $modcom WHERE id = '$userid'") or sqlerr(__FILE__, __LINE__); } function return_torrent_bookmark_array($userid) { global $Cache; static $ret; if (!$ret){ if (!$ret = $Cache->get_value('user_'.$userid.'_bookmark_array')){ $ret = array(); $res = sql_query("SELECT * FROM bookmarks WHERE userid=" . sqlesc($userid)); if (mysql_num_rows($res) != 0){ while ($row = mysql_fetch_array($res)) $ret[] = $row['torrentid']; $Cache->cache_value('user_'.$userid.'_bookmark_array', $ret, 132800); } else { $Cache->cache_value('user_'.$userid.'_bookmark_array', array(0), 132800); $ret[] = 0; } } } return $ret; } function get_torrent_bookmark_state($userid, $torrentid, $text = false) { global $lang_functions; $userid = intval($userid ?? 0); $torrentid = intval($torrentid ?? 0); $ret = array(); $ret = return_torrent_bookmark_array($userid); if (!count($ret) || !in_array($torrentid, $ret, false)) // already bookmarked $act = ($text == true ? $lang_functions['title_bookmark_torrent'] : "\"Unbookmarked\""); else $act = ($text == true ? $lang_functions['title_delbookmark_torrent'] : "\"Bookmarked\""); return $act; } function torrenttable($rows, $variant = "torrent", $searchBoxId = 0) { global $Cache; global $lang_functions; global $CURUSER, $waitsystem; global $showextinfo; global $torrentmanage_class, $smalldescription_main, $enabletooltip_tweak, $staffmem_class; global $CURLANGDIR; $torrent = new Nexus\Torrent\Torrent(); $torrentRep = new \App\Repositories\TorrentRepository(); $imdb = new \Nexus\Imdb\Imdb(); $torrentIdArr = $ownerIdArr = []; foreach($rows as $row) { $torrentIdArr[] = $row['id']; $ownerIdArr[] = $row['owner']; } unset($row); $enableImdb = get_setting("main.showimdbinfo") == 'yes'; $enablePtGen = get_setting('main.enable_pt_gen_systemyes') == 'yes'; $torrentSeedingLeechingStatus = $torrent->listLeechingSeedingStatus($CURUSER['id'], $torrentIdArr); $tagRep = new \App\Repositories\TagRepository(); $torrentTagCollection = \App\Models\TorrentTag::query()->whereIn('torrent_id', $torrentIdArr)->get(); $torrentTagResult = $torrentTagCollection->groupBy('torrent_id'); $showCover = false; $showSeedBoxIcon = false; if ($searchBoxId) { $searchBoxExtra = get_searchbox_value($searchBoxId, "extra"); if (!empty($searchBoxExtra[\App\Models\SearchBox::EXTRA_DISPLAY_COVER_ON_TORRENT_LIST])) { $showCover = true; } $showSeedBoxIcon = get_setting('seed_box.enabled') == 'yes'; if (empty($searchBoxExtra[\App\Models\SearchBox::EXTRA_DISPLAY_SEED_BOX_ICON_ON_TORRENT_LIST])) { $showSeedBoxIcon = false; } } //seedBoxIcon if ($showSeedBoxIcon) { $seedBoxRep = new \App\Repositories\SeedBoxRepository(); $seedBoxPeerInfo = \App\Models\Peer::query() ->whereIn('torrent', $torrentIdArr) ->where('seeder', 'yes') ->where('is_seed_box', '1') ->get(['torrent', 'is_seed_box']) ->keyBy('torrent'); } $last_browse = $CURUSER['last_browse']; // if ($variant == "torrent"){ // $last_browse = $CURUSER['last_browse']; // $sectiontype = $browsecatmode; // } // elseif($variant == "music"){ // $last_browse = $CURUSER['last_music']; // $sectiontype = $specialcatmode; // } // else{ // $last_browse = $CURUSER['last_browse']; // $sectiontype = ""; // } $time_now = TIMENOW; if ($last_browse > $time_now) { $last_browse=$time_now; } $wait = 0; if (get_user_class() < UC_VIP && $waitsystem == "yes") { $ratio = get_ratio($CURUSER["id"], false); $gigs = $CURUSER["uploaded"] / (1024*1024*1024); if($gigs > 10) { if ($ratio < 0.4) $wait = 24; elseif ($ratio < 0.5) $wait = 12; elseif ($ratio < 0.6) $wait = 6; elseif ($ratio < 0.8) $wait = 3; else $wait = 0; } else $wait = 0; } ?> $get_value) { $get_name = mysql_real_escape_string(strip_tags(str_replace(array("\"","'"),array("",""),$get_name))); $get_value = mysql_real_escape_string(strip_tags(str_replace(array("\"","'"),array("",""),$get_value))); if ($get_name != "sort" && $get_name != "type") { if ($count_get > 0) { $oldlink .= "&" . $get_name . "=" . $get_value; } else { $oldlink .= $get_name . "=" . $get_value; } $count_get++; } } if ($count_get > 0) { $oldlink = $oldlink . "&"; } $sort = $_GET['sort'] ?? ''; $link = array(); for ($i=1; $i<=9; $i++){ if ($sort == $i) $link[$i] = ($_GET['type'] == "desc" ? "asc" : "desc"); else $link[$i] = ($i == 1 ? "asc" : "desc"); } ?> ".$lang_functions['col_wait']."\n"); } if ($CURUSER['showcomnum'] != 'no') { ?> \n"); print("\n"); //torrent name $dispname = trim($row["name"]); $short_torrent_name_alt = ""; $mouseovertorrent = ""; $tooltipblock = ""; $has_tooltip = false; if ($enabletooltip_tweak == 'yes') $tooltiptype = $CURUSER['tooltip']; else $tooltiptype = 'off'; switch ($tooltiptype){ case 'minorimdb' : { if ($showextinfo['imdb'] == 'yes' && $row["url"]) { $url = $row['url']; $cache = $row['cache_stamp']; $type = 'minor'; $has_tooltip = true; } break; } case 'medianimdb' : { if ($showextinfo['imdb'] == 'yes' && $row["url"]) { $url = $row['url']; $cache = $row['cache_stamp']; $type = 'median'; $has_tooltip = true; } break; } case 'off' : break; } if (!$has_tooltip) $short_torrent_name_alt = "title=\"".htmlspecialchars($dispname)."\""; else{ $torrent_tooltip[$counter]['id'] = "torrent_" . $counter; $torrent_tooltip[$counter]['content'] = ""; $mouseovertorrent = "onmouseover=\"get_ext_info_ajax('".$torrent_tooltip[$counter]['id']."','".$url."','".$cache."','".$type."'); domTT_activate(this, event, 'content', document.getElementById('" . $torrent_tooltip[$counter]['id'] . "'), 'trail', false, 'delay',600,'lifetime',6000,'fade','both','styleClass','niceTitle', 'fadeMax',87, 'maxWidth', 500);\""; } $count_dispname=mb_strlen($dispname,"UTF-8"); if (!$displaysmalldescr || $row["small_descr"] == "")// maximum length of torrent name $max_length_of_torrent_name = 200; elseif ($CURUSER['fontsize'] == 'large') $max_length_of_torrent_name = 120; elseif ($CURUSER['fontsize'] == 'small') $max_length_of_torrent_name = 160; else $max_length_of_torrent_name = 140; if($count_dispname > $max_length_of_torrent_name) $dispname=mb_substr($dispname, 0, $max_length_of_torrent_name-2,"UTF-8") . ".."; if ($CURUSER['appendsticky'] == 'yes') { $posStates = \App\Models\Torrent::listPosStates(); $stickyicon = str_repeat("\"Sticky\" ", $posStates[$row['pos_state']]['icon_counts'] ?? 0); } else { $stickyicon = ""; } $stickyicon = apply_filter('sticky_icon', $stickyicon, $row); $sp_torrent = get_torrent_promotion_append($row['sp_state'],"",true,$row["added"], $row['promotion_time_type'], $row['promotion_until'], $row['__ignore_global_sp_state'] ?? false); $hrImg = get_hr_img($row, $row['search_box_id']); //cover $coverSrc = $tdCover = ''; if ($showCover) { if ($imdb_id = parse_imdb_id($row["url"])) { try { if ($imdb->getCacheStatus($imdb_id) == 1) { $coverSrc = $imdb->getMovie($imdb_id)->photo(false); } } catch (\Exception $exception) { do_log("torrent: {$row['id']} get cover from imdb error: ".$exception->getMessage() . "\n[stacktrace]\n" . $exception->getTraceAsString(), 'error'); } } if (empty($coverSrc) && !empty($row['cover'])) { $coverSrc = $row['cover']; } $tdCover = sprintf('', $coverSrc); } print(""); if ($wait) { $elapsed = floor((TIMENOW - strtotime($row["added"])) / 3600); if ($elapsed < $wait) { $color = dechex(floor(127*($wait - $elapsed)/48 + 128)*65536); print("\n"); } else print("\n"); } if ($CURUSER['showcomnum'] != 'no') { print(""); } $time = $row["added"]; $time = gettime($time,false,true); print(""); //size print(""); if ($row["seeders"]) { $ratio = ($row["leechers"] ? ($row["seeders"] / $row["leechers"]) : 1); $ratiocolor = get_slr_color($ratio); print("\n"); } else print("\n"); if ($row["leechers"]) { print("\n"); } else print("\n"); if ($row["times_completed"] >=1) print("\n"); else print("\n"); if ( $row["anonymous"] == "yes" && (user_can('viewanonymous') || (isset($row['owner']) && $row['owner'] == $CURUSER['id'])) ) { print("\n"); } elseif ($row["anonymous"] == "yes") { print("\n"); } else { print("\n"); } if (user_can('torrentmanage')) { if (user_can('torrent-delete')) { print("\n"); } print("\n"); $counter++; } print("
comments time size seeders leechers snatched
"); if (isset($row["category"])) { print(return_category_image($row["category"], "?")); if ($has_secondicon){ print(get_second_icon($row)); } } else print("-"); print("$tdCover"); if ($enableImdb || $enablePtGen) { echo $torrent->renderTorrentsPageAverageRating($row); } $act = ""; if ($CURUSER["dlicon"] != 'no' && $CURUSER["downloadpos"] != "no") $act .= "\"download\"" ; if ($CURUSER["bmicon"] == 'yes'){ $bookmark = " href=\"javascript: bookmark(".$id.",".$counter.");\""; $act .= ($act ? "
" : "")."".get_torrent_bookmark_state($CURUSER['id'], $id).""; } print("\n"); print("
".$stickyicon."".htmlspecialchars($dispname).""); $picked_torrent = ""; if ($CURUSER['appendpicked'] != 'no'){ if($row['picktype']=="hot") $picked_torrent = " [".$lang_functions['text_hot']."]"; elseif($row['picktype']=="classic") $picked_torrent = " [".$lang_functions['text_classic']."]"; elseif($row['picktype']=="recommended") $picked_torrent = " [".$lang_functions['text_recommended']."]"; } if ($CURUSER['appendnew'] != 'no' && strtotime($row["added"]) >= $last_browse) print(" (".$lang_functions['text_new_uppercase'].")"); $banned_torrent = ($row["banned"] == 'yes' ? " (".$lang_functions['text_banned'].")" : ""); $sp_torrent_sub = get_torrent_promotion_append_sub($row['sp_state'],"",true,$row['added'], $row['promotion_time_type'], $row['promotion_until'], $row['__ignore_global_sp_state'] ?? false); $approvalStatusIcon = $torrentRep->renderApprovalStatus($row['approval_status']); if ($showSeedBoxIcon && $seedBoxPeerInfo->has($row['id'])) { $seedBoxIcon = $seedBoxRep->getSeedBoxIcon(); } else { $seedBoxIcon = ''; } $paidIcon = $torrentRep->getPaidIcon($row); $titleSuffix = $banned_torrent.$paidIcon.$picked_torrent.$sp_torrent.$sp_torrent_sub. $hrImg . $seedBoxIcon . $approvalStatusIcon; $titleSuffix = apply_filter('torrent_title_suffix', $titleSuffix, $row); print($titleSuffix); /** * render tags */ $tagOwns = $torrentTagResult->get($id); if ($tagOwns) { $tags = $tagRep->renderSpan($row['search_box_id'], $tagOwns->pluck('tag_id')->toArray()); } else { $tags = ''; } if ($displaysmalldescr){ //small descr $dissmall_descr = trim($row["small_descr"]); $count_dissmall_descr=mb_strlen($dissmall_descr,"UTF-8"); $max_lenght_of_small_descr=$max_length_of_torrent_name; // maximum length if($count_dissmall_descr > $max_lenght_of_small_descr) { $dissmall_descr=mb_substr($dissmall_descr, 0, $max_lenght_of_small_descr-2,"UTF-8") . ".."; } $dissmall_descr = $tags . htmlspecialchars($dissmall_descr); print($dissmall_descr == "" ? "" : "
".$dissmall_descr); } else { print($tags ? "
$tags" : ""); } //progress bar if (isset($torrentSeedingLeechingStatus[$row['id']])) { echo $torrent->renderProgressBar($torrentSeedingLeechingStatus[$row['id']]['active_status'], $torrentSeedingLeechingStatus[$row['id']]['progress']); } print("
".$act."
" . number_format($wait - $elapsed) . $lang_functions['text_h']."".$lang_functions['text_none'].""); $nl = ""; //comments $nl = "
"; if (!$row["comments"]) { print("" . $row["comments"] . ""); } else { if ($enabletooltip_tweak == 'yes' && $CURUSER['showlastcom'] != 'no') { if (!$lastcom = $Cache->get_value('torrent_'.$id.'_last_comment_content')){ $res2 = sql_query("SELECT user, added, text FROM comments WHERE torrent = $id ORDER BY id DESC LIMIT 1"); $lastcom = mysql_fetch_array($res2); $Cache->cache_value('torrent_'.$id.'_last_comment_content', $lastcom, 1855); } $timestamp = strtotime($lastcom["added"]); $hasnewcom = ($lastcom['user'] != $CURUSER['id'] && $timestamp >= $last_browse); if ($lastcom) { if ($CURUSER['timetype'] != 'timealive') $lastcomtime = $lang_functions['text_at_time'].$lastcom['added']; else $lastcomtime = $lang_functions['text_blank'].gettime($lastcom["added"],true,false,true); $lastcom_tooltip[$counter]['id'] = "lastcom_" . $counter; $lastcom_tooltip[$counter]['content'] = ($hasnewcom ? "(".$lang_functions['text_new_uppercase'].") " : "").$lang_functions['text_last_commented_by'].get_username($lastcom['user']) . $lastcomtime."
". format_comment(mb_substr($lastcom['text'],0,100,"UTF-8") . (mb_strlen($lastcom['text'],"UTF-8") > 100 ? " ......" : "" ),true,false,false,true,600,false,false); $onmouseover = "onmouseover=\"domTT_activate(this, event, 'content', document.getElementById('" . $lastcom_tooltip[$counter]['id'] . "'), 'trail', false, 'delay', 500,'lifetime',3000,'fade','both','styleClass','niceTitle','fadeMax', 87,'maxWidth', 400);\""; } } else { $hasnewcom = false; $onmouseover = ""; } print("". ($hasnewcom ? "" : ""). $row["comments"] .($hasnewcom ? "" : ""). ""); } print("
". $time. "" . mksize_compact($row["size"])."".($ratiocolor ? "" . number_format($row["seeders"]) . "" : number_format($row["seeders"]))."" . number_format($row["seeders"]) . "" . number_format($row["leechers"]) . "0" . number_format($row["times_completed"]) . "" . number_format($row["times_completed"]) . "".$lang_functions['text_anonymous']."
".(isset($row["owner"]) ? "(" . get_username($row["owner"]) .")" : "".$lang_functions['text_orphaned']."") . "
".$lang_functions['text_anonymous']."" . (isset($row["owner"]) ? get_username($row["owner"]) : "".$lang_functions['text_orphaned']."") . "\"D\""); } print("
\"E\"
"); if ($CURUSER['appendpromotion'] == 'highlight') print("

".$lang_functions['text_promoted_torrents_note']."

\n"); if($enabletooltip_tweak == 'yes' && (!isset($CURUSER) || $CURUSER['showlastcom'] == 'yes')) create_tooltip_container($lastcom_tooltip, 400); create_tooltip_container($torrent_tooltip, 500); } function get_username($id, $big = false, $link = true, $bold = true, $target = false, $bracket = false, $withtitle = false, $link_ext = "", $underline = false) { static $usernameArray = array(); $id = (int)$id; if (func_num_args() == 1 && isset($usernameArray[$id])) { //One argument=is default display of username. Get it directly from static array if available return $usernameArray[$id]; } $arr = get_user_row($id); if ($arr){ if ($big) { $donorpic = "starbig"; $leechwarnpic = "leechwarnedbig"; $warnedpic = "warnedbig"; $disabledpic = "disabledbig"; $marginLeft = '4pt'; $medalSize = '16px'; $medalClass = 'nexus-username-medal-big'; $style = "style='margin-left: $marginLeft'"; } else { $donorpic = "star"; $leechwarnpic = "leechwarned"; $warnedpic = "warned"; $disabledpic = "disabled"; $marginLeft = '2pt'; $medalSize = '11px'; $medalClass = 'nexus-username-medal'; $style = "style='margin-left: $marginLeft'"; } $pics = $arr["donor"] == "yes" && ($arr['donoruntil'] === null || $arr['donoruntil'] < '1970' || $arr['donoruntil'] >= date('Y-m-d H:i:s')) ? "\"Donor\"" : ""; if ($arr["enabled"] == "yes") $pics .= ($arr["leechwarn"] == "yes" ? "\"Leechwarned\"" : "") . ($arr["warned"] == "yes" ? "\"Warned\"" : ""); else $pics .= "\"Disabled\"\n"; //Rainbow effect $username = $arr['username']; $rainbow = ""; $hasSetRainbow = false; if (isset($arr['__is_rainbow']) && $arr['__is_rainbow']) { $rainbow = ' class="rainbow"'; } if ($underline) { $hasSetRainbow = true; $username = "{$username}"; } if ($bold) { if ($hasSetRainbow) { $username = "{$username}"; } else { $hasSetRainbow = true; $username = "{$username}"; } } // $username = ($underline == true ? "" . $arr['username'] . "" : $arr['username']); // $username = ($bold == true ? "" . $username . "" : $username); //medal $medalHtml = ''; foreach ($arr['wearing_medals'] ?? [] as $medal) { $medalHtml .= sprintf( '', $medal['image_large'], $medal['name'], $medalClass, $medalSize, $medalSize, $marginLeft ); } $href = getSchemeAndHttpHost() . "/userdetails.php?id=$id"; $username = ($link == true ? "" . $username . "" : $username) . $pics . ($withtitle == true ? " (" . ($arr['title'] == "" ? get_user_class_name($arr['class'],false,true,true, ['with_alias' => true]) : "".htmlspecialchars($arr['title'])) . ")" : ""); $username = "" . ( $bracket == true ? "(" . $username . ")" : $username) . "$medalHtml"; } else { $username = "".nexus_trans('nexus.user_not_exists').""; $username = "" . ( $bracket == true ? "(" . $username . ")" : $username) . ""; } if (func_num_args() == 1) { //One argument=is default display of username, save it in static array $usernameArray[$id] = $username; } return $username; } function get_percent_completed_image($p) { $maxpx = "45"; // Maximum amount of pixels for the progress bar if ($p == 0) $progress = "\"\""; if ($p == 100) $progress = "\"\""; if ($p >= 1 && $p <= 30) $progress = "\"\"\"\""; if ($p >= 31 && $p <= 65) $progress = "\"\"\"\""; if ($p >= 66 && $p <= 99) $progress = "\"\"\"\""; return "\"\"" . $progress ."\"\""; } function get_ratio_img($ratio) { if ($ratio >= 16) $s = "163"; else if ($ratio >= 8) $s = "117"; else if ($ratio >= 4) $s = "5"; else if ($ratio >= 2) $s = "3"; else if ($ratio >= 1) $s = "2"; else if ($ratio >= 0.5) $s = "34"; else if ($ratio >= 0.25) $s = "10"; else $s = "52"; return "\"\""; } function GetVar ($name) { if ( is_array($name) ) { foreach ($name as $var) GetVar ($var); } else { if ( !isset($_REQUEST[$name]) ) return false; $GLOBALS[$name] = $_REQUEST[$name]; return $GLOBALS[$name]; } } function ssr ($arg) { if (is_array($arg)) { foreach ($arg as $key=>$arg_bit) { $arg[$key] = ssr($arg_bit); } } else { $arg = stripslashes($arg); } return $arg; } function parked() { global $lang_functions; global $CURUSER; if ($CURUSER["parked"] == "yes") stderr($lang_functions['std_access_denied'], $lang_functions['std_your_account_parked']); } function validusername($username) { if ($username == "") return false; // The following characters are allowed in user names $allowedchars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; $length = strlen($username); for ($i = 0; $i < $length; ++$i) if (strpos($allowedchars, $username[$i]) === false) return false; if ($length < 3 || $length > 20) { return false; } return true; } //Code for Viewing NFO file // code: Takes a string and does a IBM-437-to-HTML-Unicode-Entities-conversion. // swedishmagic specifies special behavior for Swedish characters. // Some Swedish Latin-1 letters collide with popular DOS glyphs. If these // characters are between ASCII-characters (a-zA-Z and more) they are // treated like the Swedish letters, otherwise like the DOS glyphs. function code($ibm_437, $view) { $swedishmagic = false; if ($view == "magic") { $swedishmagic = true; } $table437 = array("\200", "\201", "\202", "\203", "\204", "\205", "\206", "\207", "\210", "\211", "\212", "\213", "\214", "\215", "\216", "\217", "\220", "\221", "\222", "\223", "\224", "\225", "\226", "\227", "\230", "\231", "\232", "\233", "\234", "\235", "\236", "\237", "\240", "\241", "\242", "\243", "\244", "\245", "\246", "\247", "\250", "\251", "\252", "\253", "\254", "\255", "\256", "\257", "\260", "\261", "\262", "\263", "\264", "\265", "\266", "\267", "\270", "\271", "\272", "\273", "\274", "\275", "\276", "\277", "\300", "\301", "\302", "\303", "\304", "\305", "\306", "\307", "\310", "\311", "\312", "\313", "\314", "\315", "\316", "\317", "\320", "\321", "\322", "\323", "\324", "\325", "\326", "\327", "\330", "\331", "\332", "\333", "\334", "\335", "\336", "\337", "\340", "\341", "\342", "\343", "\344", "\345", "\346", "\347", "\350", "\351", "\352", "\353", "\354", "\355", "\356", "\357", "\360", "\361", "\362", "\363", "\364", "\365", "\366", "\367", "\370", "\371", "\372", "\373", "\374", "\375", "\376", "\377"); $tablehtml = array("Ç", "ü", "é", "â", "ä", "à", "å", "ç", "ê", "ë", "è", "ï", "î", "ì", "Ä", "Å", "É", "æ", "Æ", "ô", "ö", "ò", "û", "ù", "ÿ", "Ö", "Ü", "¢", "£", "¥", "₧", "ƒ", "á", "í", "ó", "ú", "ñ", "Ñ", "ª", "º", "¿", "⌐", "¬", "½", "¼", "¡", "«", "»", "░", "▒", "▓", "│", "┤", "╡", "╢", "╖", "╕", "╣", "║", "╗", "╝", "╜", "╛", "┐", "└", "┴", "┬", "├", "─", "┼", "╞", "╟", "╚", "╔", "╩", "╦", "╠", "═", "╬", "╧", "╨", "╤", "╥", "╙", "╘", "╒", "╓", "╫", "╪", "┘", "┌", "█", "▄", "▌", "▐", "▀", "α", "ß", "Γ", "π", "Σ", "σ", "μ", "τ", "Φ", "Θ", "Ω", "δ", "∞", "φ", "ε", "∩", "≡", "±", "≥", "≤", "⌠", "⌡", "÷", "≈", "°", "∙", "·", "√", "ⁿ", "²", "■", " "); $s = htmlspecialchars($ibm_437); // 0-9, 11-12, 14-31, 127 (decimalt) $control = array("\000", "\001", "\002", "\003", "\004", "\005", "\006", "\007", "\010", "\011", /*"\012",*/ "\013", "\014", /*"\015",*/ "\016", "\017", "\020", "\021", "\022", "\023", "\024", "\025", "\026", "\027", "\030", "\031", "\032", "\033", "\034", "\035", "\036", "\037", "\177"); /* Code control characters to control pictures. http://www.unicode.org/charts/PDF/U2400.pdf (This is somewhat the Right Thing, but looks crappy with Courier New.) $controlpict = array("␣","␄"); $s = str_replace($control,$controlpict,$s); */ // replace control chars with space - feel free to fix the regexp smile.gif /*echo "[a\\x00-\\x1F]"; //$s = preg_replace("/[ \\x00-\\x1F]/", " ", $s); $s = preg_replace("/[ \000-\037]/", " ", $s); */ $s = str_replace($control," ",$s); if ($swedishmagic){ $s = str_replace("\345","\206",$s); $s = str_replace("\344","\204",$s); $s = str_replace("\366","\224",$s); // $s = str_replace("\304","\216",$s); //$s = "[ -~]\\xC4[a-za-z]"; // couldn't get ^ and $ to work, even through I read the man-pages, // i'm probably too tired and too unfamiliar with posix regexps right now. $s = preg_replace("/([ -~])\305([ -~])/", "\\1\217\\2", $s); $s = preg_replace("/([ -~])\304([ -~])/", "\\1\216\\2", $s); $s = preg_replace("/([ -~])\326([ -~])/", "\\1\231\\2", $s); $s = str_replace("\311", "\220", $s); // $s = str_replace("\351", "\202", $s); // } $s = str_replace($table437, $tablehtml, $s); return $s; } /** * @param $ibm_437 * @param $view * @return array|string|string[] * @ref https://github.com/HDInnovations/UNIT3D-Community-Edition/blob/master/app/Helpers/Nfo.php */ function code_new($ibm_437, $view) { $swedishmagic = false; if ($view == "magic") { $swedishmagic = true; } $cf = array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 8962, 199, 252, 233, 226, 228, 224, 229, 231, 234, 235, 232, 239, 238, 236, 196, 197, 201, 230, 198, 244, 246, 242, 251, 249, 255, 214, 220, 162, 163, 165, 8359, 402, 225, 237, 243, 250, 241, 209, 170, 186, 191, 8976, 172, 189, 188, 161, 171, 187, 9617, 9618, 9619, 9474, 9508, 9569, 9570, 9558, 9557, 9571, 9553, 9559, 9565, 9564, 9563, 9488, 9492, 9524, 9516, 9500, 9472, 9532, 9566, 9567, 9562, 9556, 9577, 9574, 9568, 9552, 9580, 9575, 9576, 9572, 9573, 9561, 9560, 9554, 9555, 9579, 9578, 9496, 9484, 9608, 9604, 9612, 9616, 9600, 945, 223, 915, 960, 931, 963, 181, 964, 934, 920, 937, 948, 8734, 966, 949, 8745, 8801, 177, 8805, 8804, 8992, 8993, 247, 8776, 176, 8729, 183, 8730, 8319, 178, 9632, 160); $s = ""; for ($c = 0; $c < strlen($ibm_437); $c++) { // cyctle through the whole file doing a byte at a time. $byte = $ibm_437[$c]; $ob = ord($byte); if ($ob >= 127) { // is it in the normal ascii range $s .= '&#' . $cf[$ob] . ';'; } else { $s .= $byte; } } if ($swedishmagic) { $s = str_replace("\345","\206",$s); $s = str_replace("\344","\204",$s); $s = str_replace("\366","\224",$s); $s = preg_replace("/([ -~])\305([ -~])/", "\\1\217\\2", $s); $s = preg_replace("/([ -~])\304([ -~])/", "\\1\216\\2", $s); $s = preg_replace("/([ -~])\326([ -~])/", "\\1\231\\2", $s); $s = str_replace ( "\311", "\220", $s ); // $s = str_replace ( "\351", "\202", $s ); // } return $s; } //Tooltip container for hot movie, classic movie, etc function create_tooltip_container($id_content_arr, $width = 400) { if(count($id_content_arr)) { $result = "
"; foreach($id_content_arr as $id_content_arr_each) { $result .= "
" . $id_content_arr_each['content'] . "
"; } $result .= "
"; print($result); } } function getimdb($imdb_id, $cache_stamp, $mode = 'minor') { global $lang_functions; global $showextinfo; $thenumbers = $imdb_id; $imdb = new Nexus\Imdb\Imdb(); $movie = $imdb->getMovie($imdb_id); $movieid = $thenumbers; // $movie->setid ($movieid); $target = array('Title', 'Credits', 'Plot'); switch ($imdb->getCacheStatus($imdb_id)) { case "0": //cache is not ready { return false; break; } case "1": //normal { $title = $movie->title (); $year = $movie->year (); $country = $movie->country (); $countries = ""; $temp = ""; for ($i = 0; $i < count ($country); $i++) { $temp .="$country[$i], "; } $countries = rtrim(trim($temp), ","); $director = $movie->director(); $director_or_creator = ""; if ($director) { $temp = ""; for ($i = 0; $i < count ($director); $i++) { $temp .= $director[$i]["name"].", "; } $director_or_creator = "".$lang_functions['text_director'].": ".rtrim(trim($temp), ","); } else { //for tv series $creator = $movie->creator(); $director_or_creator = "".$lang_functions['text_creator'].": ".$creator; } $cast = $movie->cast(); $temp = ""; for ($i = 0; $i < count ($cast); $i++) //get names of first three casts { if ($i > 2) { break; } $temp .= $cast[$i]["name"].", "; } $casts = rtrim(trim($temp), ","); $gen = $movie->genres(); $genres = $gen[0].(count($gen) > 1 ? ", ".$gen[1] : ""); //get first two genres; $rating = $movie->rating (); $votes = $movie->votes (); if ($votes) $imdbrating = "".$rating."/10 (".$votes.$lang_functions['text_votes'].")"; else $imdbrating = $lang_functions['text_awaiting_five_votes']; $tagline = $movie->tagline (); switch ($mode) { case 'minor' : { $autodata = "".$title." (".$year.")
".$lang_functions['text_imdb'].": ".$imdbrating." ".$lang_functions['text_country'].": ".$countries." ".$lang_functions['text_genres'].": ".$genres."
".$director_or_creator." ".$lang_functions['text_starring'].": ".$casts."

".$tagline."

"; break; } case 'median': { if (($photo_url = $movie->photo() ) != FALSE) $smallth = "\"poster\""; else $smallth = ""; $runtime = $movie->runtime (); $language = $movie->language (); $plot = $movie->plot (); $plots = ""; if(count($plot) != 0){ //get plots from plot page $plots .= "* ".strip_tags($plot[0], '
'); $plots = mb_substr($plots,0,300,"UTF-8") . (mb_strlen($plots,"UTF-8") > 300 ? " ..." : "" ); $plots .= (strpos($plots,"") == true && strpos($plots,"") == false ? "" : "");//sometimes is open and not ended because of mb_substr; $plots = "".$plots.""; } elseif ($plotoutline = $movie->plotoutline ()){ //get plot from title page $plots .= "* ".strip_tags($plotoutline, '
'); $plots = mb_substr($plots,0,300,"UTF-8") . (mb_strlen($plots,"UTF-8") > 300 ? " ..." : "" ); $plots .= (strpos($plots,"") == true && strpos($plots,"") == false ? "" : "");//sometimes is open and not ended because of mb_substr; $plots = "".$plots.""; } $autodata = " ".($smallth ? "" : "") ."
$smallth ".( $runtime ? "" : "")." ".( $language ? "" : "")." ".( $plots ? "" : "")."
\"imdb\" ".$title." (".$year.")
".$lang_functions['text_imdb'].": ".$imdbrating."".$lang_functions['text_runtime'].": ".$runtime.$lang_functions['text_min']."
".$lang_functions['text_country'].": ".$countries."".$lang_functions['text_language'].": ".$language."
".$director_or_creator." ".$lang_functions['text_genres'].": ".$genres."
".$lang_functions['text_starring'].": ".$casts."
".$plots."
"; break; } } return $autodata; } case "2" : { return false; break; } case "3" : { return false; break; } } } function quickreply($formname, $taname,$submit){ print(""); print(smile_row($formname, $taname)); print("
"); print(""); } function smile_row($formname, $taname){ $quickSmilesNumbers = array(4, 5, 39, 25, 11, 8, 10, 15, 27, 57, 42, 122, 52, 28, 29, 30, 176); $smilerow = "
"; foreach ($quickSmilesNumbers as $smilyNumber) { $smilerow .= getSmileIt($formname, $taname, $smilyNumber); } $smilerow .= "
"; return $smilerow; } function getSmileIt($formname, $taname, $smilyNumber) { return "\'\'")."', 'trail', false, 'delay', 0,'lifetime',10000,'styleClass','smilies','maxWidth', 400);\">\"\""; } function classlist($selectname,$maxclass, $selected, $minClass = 0, $includeNoClass = false, $disabled = false){ global $lang_functions; $disabledText = ''; if ($disabled) { $disabledText = ' disabled = "disabled"'; } $list = ""; return $list; } function permissiondenied($allowMinimumClass = null){ global $lang_functions; if ($allowMinimumClass === null) { stderr($lang_functions['std_error'], $lang_functions['std_permission_denied']); } else { stderr($lang_functions['std_sorry'],$lang_functions['std_permission_denied_only'].get_user_class_name($allowMinimumClass,false,true,true).$lang_functions['std_or_above_can_view'],false); } } function gettime($time, $withago = true, $twoline = false, $forceago = false, $oneunit = false, $isfuturetime = false){ global $lang_functions, $CURUSER; if (isset($CURUSER) && $CURUSER['timetype'] != 'timealive' && !$forceago){ $newtime = $time; if ($twoline){ $newtime = str_replace(" ", "
", $newtime); } } else{ $timestamp = strtotime($time); if ($isfuturetime && $timestamp < TIMENOW) $newtime = false; else { $newtime = get_elapsed_time($timestamp,$oneunit).($withago ? $lang_functions['text_ago'] : ""); if($twoline){ $newtime = str_replace(" ", "
", $newtime); } elseif($oneunit){ if ($length = strpos($newtime, " ")) $newtime = substr($newtime,0,$length); } else $newtime = str_replace(" ", $lang_functions['text_space'], $newtime); $newtime = "".$newtime.""; } } return $newtime; } function get_forum_pic_folder(){ global $CURLANGDIR; return "pic/forum_pic/".$CURLANGDIR; } function get_category_icon_row($typeid) { global $Cache; static $rows; if (!$typeid) { $typeid=1; } if (!$rows && !$rows = $Cache->get_value('category_icon_content')){ $rows = array(); $res = sql_query("SELECT * FROM caticons ORDER BY id ASC"); while($row = mysql_fetch_array($res)) { $rows[$row['id']] = $row; } $Cache->cache_value('category_icon_content', $rows, 156400); } return $rows[$typeid]; } function get_category_row($catid = NULL) { global $Cache; static $rows; if (!$rows && !$rows = $Cache->get_value('category_content')){ $rows = []; $res = sql_query("SELECT categories.*, searchbox.name AS catmodename FROM categories LEFT JOIN searchbox ON categories.mode=searchbox.id"); while($row = mysql_fetch_array($res)) { $rows[$row['id']] = $row; } $Cache->cache_value('category_content', $rows, 126400); } if ($catid) { return $rows[$catid]; } else { return $rows; } } function get_second_icon($row) //for CHDBits { global $CURUSER, $Cache; $source=$row['source']; $medium=$row['medium']; $codec=$row['codec']; $standard=$row['standard']; $processing=$row['processing']; $team=$row['team']; $audiocodec=$row['audiocodec']; $mode = $row['search_box_id']; $cacheKey = 'secondicon_'.$source.'_'.$medium.'_'.$codec.'_'.$standard.'_'.$processing.'_'.$team.'_'.$audiocodec.'_content'; if (!$sirow = $Cache->get_value($cacheKey)){ $res = sql_query("SELECT * FROM secondicons WHERE (mode = ".sqlesc($mode)." OR mode = 0) AND (source = ".sqlesc($source)." OR source=0) AND (medium = ".sqlesc($medium)." OR medium=0) AND (codec = ".sqlesc($codec)." OR codec = 0) AND (standard = ".sqlesc($standard)." OR standard = 0) AND (processing = ".sqlesc($processing)." OR processing = 0) AND (team = ".sqlesc($team)." OR team = 0) AND (audiocodec = ".sqlesc($audiocodec)." OR audiocodec = 0) LIMIT 1"); $sirow = mysql_fetch_array($res); if (!$sirow) $sirow = 'not allowed'; $Cache->cache_value($cacheKey, $sirow, 600); } $catimgurl = get_cat_folder($row['category']); if ($sirow == 'not allowed') return "\"Not"; else { return ""; } } function get_torrent_bg_color($promotion = 1, $posState = "", array $torrent = []) { global $CURUSER; $sphighlight = null; if ($CURUSER['appendpromotion'] == 'highlight'){ $global_promotion_state = get_global_sp_state(); if ($global_promotion_state == 1){ if($promotion==1) $sphighlight = ""; elseif($promotion==2) $sphighlight = " class='free_bg'"; elseif($promotion==3) $sphighlight = " class='twoup_bg'"; elseif($promotion==4) $sphighlight = " class='twoupfree_bg'"; elseif($promotion==5) $sphighlight = " class='halfdown_bg'"; elseif($promotion==6) $sphighlight = " class='twouphalfdown_bg'"; elseif($promotion==7) $sphighlight = " class='thirtypercentdown_bg'"; } elseif($global_promotion_state == 2) $sphighlight = " class='free_bg'"; elseif($global_promotion_state == 3) $sphighlight = " class='twoup_bg'"; elseif($global_promotion_state == 4) $sphighlight = " class='twoupfree_bg'"; elseif($global_promotion_state == 5) $sphighlight = " class='halfdown_bg'"; elseif($global_promotion_state == 6) $sphighlight = " class='twouphalfdown_bg'"; elseif($global_promotion_state == 7) $sphighlight = " class='thirtypercentdown_bg'"; } if (is_null($sphighlight)) { $torrentSettings = get_setting('torrent'); if ($posState == \App\Models\Torrent::POS_STATE_STICKY_FIRST && !empty($torrentSettings['sticky_first_level_background_color'])) { $sphighlight = sprintf(' style="background-color: %s"', $torrentSettings['sticky_first_level_background_color']); } elseif ($posState == \App\Models\Torrent::POS_STATE_STICKY_SECOND && !empty($torrentSettings['sticky_second_level_background_color'])) { $sphighlight = sprintf(' style="background-color: %s"', $torrentSettings['sticky_second_level_background_color']); } } return apply_filter('torrent_background_color', (string)$sphighlight, $torrent); } function get_torrent_promotion_append($promotion = 1,$forcemode = "",$showtimeleft = false, $added = "", $promotionTimeType = 0, $promotionUntil = '', $ignoreGlobal = false){ global $CURUSER,$lang_functions; global $expirehalfleech_torrent, $expirefree_torrent, $expiretwoup_torrent, $expiretwoupfree_torrent, $expiretwouphalfleech_torrent, $expirethirtypercentleech_torrent; $globalSpState = get_global_sp_state(); $sp_torrent = ""; $onmouseover = ""; $log = "[GET_PROMOTION], promotion: $promotion, forcemode: $forcemode, showtimeleft: $showtimeleft, added: $added, promotionTimeType: $promotionTimeType, promotionUntil: $promotionUntil"; if ($ignoreGlobal) { $globalSpState = 1; $log .= ", [IGNORE_GLOBAL]"; } $log .= ", globalSpState == " . $globalSpState; if ($globalSpState == 1) { switch ($promotion){ case 2: { if ($showtimeleft && (($expirefree_torrent && $promotionTimeType == 0) || $promotionTimeType == 2)) { if ($promotionTimeType == 2) { $futuretime = strtotime($promotionUntil); } else { $futuretime = strtotime($added) + $expirefree_torrent * 86400; } $timeout = gettime(date("Y-m-d H:i:s", $futuretime), false, false, true, false, true); if ($timeout) $onmouseover = " onmouseover=\"domTT_activate(this, event, 'content', '".htmlspecialchars("".$lang_functions['text_free']."".$lang_functions['text_will_end_in']."".$timeout."")."', 'trail', false, 'delay',500,'lifetime',3000,'fade','both','styleClass','niceTitle', 'fadeMax',87, 'maxWidth', 300);\""; else $promotion = 1; } break; } case 3: { if ($showtimeleft && (($expiretwoup_torrent && $promotionTimeType == 0) || $promotionTimeType == 2)) { if ($promotionTimeType == 2) { $futuretime = strtotime($promotionUntil); } else { $futuretime = strtotime($added) + $expiretwoup_torrent * 86400; } $timeout = gettime(date("Y-m-d H:i:s", $futuretime), false, false, true, false, true); if ($timeout) $onmouseover = " onmouseover=\"domTT_activate(this, event, 'content', '".htmlspecialchars("".$lang_functions['text_two_times_up']."".$lang_functions['text_will_end_in']."".$timeout."")."', 'trail', false, 'delay',500,'lifetime',3000,'fade','both','styleClass','niceTitle', 'fadeMax',87, 'maxWidth', 300);\""; else $promotion = 1; } break; } case 4: { if ($showtimeleft && (($expiretwoupfree_torrent && $promotionTimeType == 0) || $promotionTimeType == 2)) { if ($promotionTimeType == 2) { $futuretime = strtotime($promotionUntil); } else { $futuretime = strtotime($added) + $expiretwoupfree_torrent * 86400; } $timeout = gettime(date("Y-m-d H:i:s", $futuretime), false, false, true, false, true); if ($timeout) $onmouseover = " onmouseover=\"domTT_activate(this, event, 'content', '".htmlspecialchars("".$lang_functions['text_free_two_times_up']."".$lang_functions['text_will_end_in']."".$timeout."")."', 'trail', false, 'delay',500,'lifetime',3000,'fade','both','styleClass','niceTitle', 'fadeMax',87, 'maxWidth', 300);\""; else $promotion = 1; } break; } case 5: { if ($showtimeleft && (($expirehalfleech_torrent && $promotionTimeType == 0) || $promotionTimeType == 2)) { if ($promotionTimeType == 2) { $futuretime = strtotime($promotionUntil); } else { $futuretime = strtotime($added) + $expirehalfleech_torrent * 86400; } $timeout = gettime(date("Y-m-d H:i:s", $futuretime), false, false, true, false, true); if ($timeout) $onmouseover = " onmouseover=\"domTT_activate(this, event, 'content', '".htmlspecialchars("".$lang_functions['text_half_down']."".$lang_functions['text_will_end_in']."".$timeout."")."', 'trail', false, 'delay',500,'lifetime',3000,'fade','both','styleClass','niceTitle', 'fadeMax',87, 'maxWidth', 300);\""; else $promotion = 1; } break; } case 6: { if ($showtimeleft && (($expiretwouphalfleech_torrent && $promotionTimeType == 0) || $promotionTimeType == 2)) { if ($promotionTimeType == 2) { $futuretime = strtotime($promotionUntil); } else { $futuretime = strtotime($added) + $expiretwouphalfleech_torrent * 86400; } $timeout = gettime(date("Y-m-d H:i:s", $futuretime), false, false, true, false, true); if ($timeout) $onmouseover = " onmouseover=\"domTT_activate(this, event, 'content', '".htmlspecialchars("".$lang_functions['text_half_down_two_up']."".$lang_functions['text_will_end_in']."".$timeout."")."', 'trail', false, 'delay',500,'lifetime',3000,'fade','both','styleClass','niceTitle', 'fadeMax',87, 'maxWidth', 300);\""; else $promotion = 1; } break; } case 7: { if ($showtimeleft && (($expirethirtypercentleech_torrent && $promotionTimeType == 0) || $promotionTimeType == 2)) { if ($promotionTimeType == 2) { $futuretime = strtotime($promotionUntil); } else { $futuretime = strtotime($added) + $expirethirtypercentleech_torrent * 86400; } $timeout = gettime(date("Y-m-d H:i:s", $futuretime), false, false, true, false, true); if ($timeout) $onmouseover = " onmouseover=\"domTT_activate(this, event, 'content', '".htmlspecialchars("".$lang_functions['text_thirty_percent_down']."".$lang_functions['text_will_end_in']."".$timeout."")."', 'trail', false, 'delay',500,'lifetime',3000,'fade','both','styleClass','niceTitle', 'fadeMax',87, 'maxWidth', 300);\""; else $promotion = 1; } break; } } } if (($CURUSER['appendpromotion'] == 'word' && $forcemode == "" ) || $forcemode == 'word'){ $log .= ", user appendpromotion = word"; if(($promotion==2 && $globalSpState == 1) || $globalSpState == 2){ $log .= ", promotion or global_sp_state = 2"; $sp_torrent = " [".$lang_functions['text_free']."]"; } elseif(($promotion==3 && $globalSpState == 1) || $globalSpState == 3){ $log .= ", promotion or global_sp_state = 3"; $sp_torrent = " [".$lang_functions['text_two_times_up']."]"; } elseif(($promotion==4 && $globalSpState == 1) || $globalSpState == 4){ $log .= ", promotion or global_sp_state = 4"; $sp_torrent = " [".$lang_functions['text_free_two_times_up']."]"; } elseif(($promotion==5 && $globalSpState == 1) || $globalSpState == 5){ $log .= ", promotion or global_sp_state = 5"; $sp_torrent = " [".$lang_functions['text_half_down']."]"; } elseif(($promotion==6 && $globalSpState == 1) || $globalSpState == 6){ $log .= ", promotion or global_sp_state = 6"; $sp_torrent = " [".$lang_functions['text_half_down_two_up']."]"; } elseif(($promotion==7 && $globalSpState == 1) || $globalSpState == 7){ $log .= ", promotion or global_sp_state = 7"; $sp_torrent = " [".$lang_functions['text_thirty_percent_down']."]"; } } elseif (($CURUSER['appendpromotion'] == 'icon' && $forcemode == "") || $forcemode == 'icon'){ $log .= ", user appendpromotion = icon"; if(($promotion==2 && $globalSpState == 1) || $globalSpState == 2) { $log .= ", promotion or global_sp_state = 2"; $sp_torrent = " \"Free\""; } elseif(($promotion==3 && $globalSpState == 1) || $globalSpState == 3) { $log .= ", promotion or global_sp_state = 3"; $sp_torrent = " \"2X\""; } elseif(($promotion==4 && $globalSpState == 1) || $globalSpState == 4) { $log .= ", promotion or global_sp_state = 4"; $sp_torrent = " \"2X"; } elseif(($promotion==5 && $globalSpState == 1) || $globalSpState == 5) { $log .= ", promotion or global_sp_state = 5"; $sp_torrent = " \"50%\""; } elseif(($promotion==6 && $globalSpState == 1) || $globalSpState == 6) { $log .= ", promotion or global_sp_state = 6"; $sp_torrent = " \"2X"; } elseif(($promotion==7 && $globalSpState == 1) || $globalSpState == 7) { $log .= ", promotion or global_sp_state = 7"; $sp_torrent = " \"30%\""; } } do_log("$log, sp_torrent: $sp_torrent"); return $sp_torrent; } function get_torrent_promotion_append_sub($promotion = 1,$forcemode = "",$showtimeleft = false, $added = "", $promotionTimeType = 0, $promotionUntil = '', $ignoreGlobal = false){ global $CURUSER,$lang_functions; global $expirehalfleech_torrent, $expirefree_torrent, $expiretwoup_torrent, $expiretwoupfree_torrent, $expiretwouphalfleech_torrent, $expirethirtypercentleech_torrent; $globalSpState = get_global_sp_state(); $sp_torrent = ""; $onmouseover = ""; $log = "[GET_PROMOTION], promotion: $promotion, forcemode: $forcemode, showtimeleft: $showtimeleft, added: $added, promotionTimeType: $promotionTimeType, promotionUntil: $promotionUntil"; if ($ignoreGlobal) { $globalSpState = 1; $log .= ", [IGNORE_GLOBAL]"; } $log .= ", globalSpState == " . $globalSpState; if ($globalSpState == 1) { switch ($promotion){ case 2: { if ($showtimeleft && (($expirefree_torrent && $promotionTimeType == 0) || $promotionTimeType == 2)) { if ($promotionTimeType == 2) { $futuretime = strtotime($promotionUntil); } else { $futuretime = strtotime($added) + $expirefree_torrent * 86400; } $timeout = gettime(date("Y-m-d H:i:s", $futuretime), false, false, true, false, true); if ($timeout) $onmouseover = " ".$lang_functions['text_will_end_in'].$timeout.""; //free类型字符显示为蓝色,可以更改它 else $promotion = 1; } break; } case 3: { if ($showtimeleft && (($expiretwoup_torrent && $promotionTimeType == 0) || $promotionTimeType == 2)) { if ($promotionTimeType == 2) { $futuretime = strtotime($promotionUntil); } else { $futuretime = strtotime($added) + $expiretwoup_torrent * 86400; } $timeout = gettime(date("Y-m-d H:i:s", $futuretime), false, false, true, false, true); if ($timeout) $onmouseover = " ".$lang_functions['text_will_end_in'].$timeout; else $promotion = 1; } break; } case 4: { if ($showtimeleft && (($expiretwoupfree_torrent && $promotionTimeType == 0) || $promotionTimeType == 2)) { if ($promotionTimeType == 2) { $futuretime = strtotime($promotionUntil); } else { $futuretime = strtotime($added) + $expiretwoupfree_torrent * 86400; } $timeout = gettime(date("Y-m-d H:i:s", $futuretime), false, false, true, false, true); if ($timeout) $onmouseover = " ".$lang_functions['text_will_end_in'].$timeout.""; //2XFree 显示为青色,可以更改它 else $promotion = 1; } break; } case 5: { if ($showtimeleft && (($expirehalfleech_torrent && $promotionTimeType == 0) || $promotionTimeType == 2)) { if ($promotionTimeType == 2) { $futuretime = strtotime($promotionUntil); } else { $futuretime = strtotime($added) + $expirehalfleech_torrent * 86400; } $timeout = gettime(date("Y-m-d H:i:s", $futuretime), false, false, true, false, true); if ($timeout) $onmouseover = " ".$lang_functions['text_will_end_in'].$timeout; else $promotion = 1; } break; } case 6: { if ($showtimeleft && (($expiretwouphalfleech_torrent && $promotionTimeType == 0) || $promotionTimeType == 2)) { if ($promotionTimeType == 2) { $futuretime = strtotime($promotionUntil); } else { $futuretime = strtotime($added) + $expiretwouphalfleech_torrent * 86400; } $timeout = gettime(date("Y-m-d H:i:s", $futuretime), false, false, true, false, true); if ($timeout) $onmouseover = " ".$lang_functions['text_will_end_in'].$timeout; else $promotion = 1; } break; } case 7: { if ($showtimeleft && (($expirethirtypercentleech_torrent && $promotionTimeType == 0) || $promotionTimeType == 2)) { if ($promotionTimeType == 2) { $futuretime = strtotime($promotionUntil); } else { $futuretime = strtotime($added) + $expirethirtypercentleech_torrent * 86400; } $timeout = gettime(date("Y-m-d H:i:s", $futuretime), false, false, true, false, true); if ($timeout) $onmouseover = " ".$lang_functions['text_will_end_in'].$timeout; else $promotion = 1; } break; } } } if (($CURUSER['appendpromotion'] == 'word' && $forcemode == "" ) || $forcemode == 'word'){ $log .= ", user appendpromotion = word"; if(($promotion==2 && $globalSpState == 1) || $globalSpState == 2){ $log .= ", promotion or global_sp_state = 2"; $sp_torrent = $onmouseover; } elseif(($promotion==3 && $globalSpState == 1) || $globalSpState == 3){ $log .= ", promotion or global_sp_state = 3"; $sp_torrent = $onmouseover; } elseif(($promotion==4 && $globalSpState == 1) || $globalSpState == 4){ $log .= ", promotion or global_sp_state = 4"; $sp_torrent = $onmouseover; } elseif(($promotion==5 && $globalSpState == 1) || $globalSpState == 5){ $log .= ", promotion or global_sp_state = 5"; $sp_torrent = $onmouseover; } elseif(($promotion==6 && $globalSpState == 1) || $globalSpState == 6){ $log .= ", promotion or global_sp_state = 6"; $sp_torrent = $onmouseover; } elseif(($promotion==7 && $globalSpState == 1) || $globalSpState == 7){ $log .= ", promotion or global_sp_state = 7"; $sp_torrent = $onmouseover; } } elseif (($CURUSER['appendpromotion'] == 'icon' && $forcemode == "") || $forcemode == 'icon'){ $log .= ", user appendpromotion = icon"; if(($promotion==2 && $globalSpState == 1) || $globalSpState == 2) { $log .= ", promotion or global_sp_state = 2"; $sp_torrent = $onmouseover; } elseif(($promotion==3 && $globalSpState == 1) || $globalSpState == 3) { $log .= ", promotion or global_sp_state = 3"; $sp_torrent = $onmouseover; } elseif(($promotion==4 && $globalSpState == 1) || $globalSpState == 4) { $log .= ", promotion or global_sp_state = 4"; $sp_torrent = $onmouseover; } elseif(($promotion==5 && $globalSpState == 1) || $globalSpState == 5) { $log .= ", promotion or global_sp_state = 5"; $sp_torrent = $onmouseover; } elseif(($promotion==6 && $globalSpState == 1) || $globalSpState == 6) { $log .= ", promotion or global_sp_state = 6"; $sp_torrent = $onmouseover; } elseif(($promotion==7 && $globalSpState == 1) || $globalSpState == 7) { $log .= ", promotion or global_sp_state = 7"; $sp_torrent = $onmouseover; } } do_log("$log, sp_torrent: $sp_torrent"); return $sp_torrent; } function get_hr_img(array $torrent, $searchBoxId) { // $mode = get_setting('hr.mode'); $mode = \App\Models\HitAndRun::getConfig('mode', $searchBoxId); $result = ''; if ($mode == \App\Models\HitAndRun::MODE_GLOBAL || ($mode == \App\Models\HitAndRun::MODE_MANUAL && isset($torrent['hr']) && $torrent['hr'] == \App\Models\Torrent::HR_YES)) { $result = 'H&R'; } do_log("searchBoxId: $searchBoxId, mode: $mode, result: $result"); return $result; } function get_user_id_from_name($username){ global $lang_functions; $res = sql_query("SELECT id FROM users WHERE LOWER(username)=LOWER(" . sqlesc($username).")"); $arr = mysql_fetch_array($res); if (!$arr){ stderr($lang_functions['std_error'],$lang_functions['std_no_user_named']."'".$username."'"); } else return $arr['id']; } function is_forum_moderator($id, $in = 'post'){ global $CURUSER; switch($in){ case 'post':{ $res = sql_query("SELECT topicid FROM posts WHERE id=$id") or sqlerr(__FILE__, __LINE__); if ($arr = mysql_fetch_array($res)){ if (is_forum_moderator($arr['topicid'],'topic')) return true; } return false; break; } case 'topic':{ $modcount = sql_query("SELECT COUNT(forummods.userid) FROM forummods LEFT JOIN topics ON forummods.forumid = topics.forumid WHERE topics.id=$id AND forummods.userid=".sqlesc($CURUSER['id'])) or sqlerr(__FILE__, __LINE__); $arr = mysql_fetch_array($modcount); if ($arr[0]) return true; else return false; break; } case 'forum':{ $modcount = get_row_count("forummods","WHERE forumid=$id AND userid=".sqlesc($CURUSER['id'])); if ($modcount) return true; else return false; break; } default: { return false; } } } function get_guest_lang_id(){ global $CURLANGDIR; $langfolder=$CURLANGDIR; $res = sql_query("SELECT id FROM language WHERE site_lang_folder=".sqlesc($langfolder)." AND site_lang=1"); $row = mysql_fetch_array($res); if ($row){ return $row['id']; } else return 6;//return English } function set_forum_moderators($name, $forumid, $limit=3){ $name = rtrim(trim($name), ","); $users = explode(",", $name); $userids = array(); foreach ($users as $user){ $userids[]=get_user_id_from_name(trim($user)); } $max = count($userids); sql_query("DELETE FROM forummods WHERE forumid=".sqlesc($forumid)) or sqlerr(__FILE__, __LINE__); for($i=0; $i < $limit && $i < $max; $i++){ sql_query("INSERT INTO forummods (forumid, userid) VALUES (".sqlesc($forumid).",".sqlesc($userids[$i]).")") or sqlerr(__FILE__, __LINE__); } } function get_plain_username($id){ $row = get_user_row($id); if ($row) $username = $row['username']; else $username = ""; return $username; } function get_searchbox_value($mode = 1, $item = 'showsubcat'){ global $Cache; static $rows; $cacheKey = "search_box_content"; if (!$rows && !$rows = $Cache->get_value($cacheKey)){ $rows = array(); $res = sql_query("SELECT * FROM searchbox ORDER BY id ASC"); while ($row = mysql_fetch_array($res)) { if (isset($row['extra'])) { $row['extra'] = json_decode($row['extra'], true); } if (isset($row['section_name'])) { $row['section_name'] = json_decode($row['section_name'], true); } $rows[$row['id']] = $row; } $Cache->cache_value($cacheKey, $rows, 100500); } return $rows[$mode][$item] ?? ''; } function get_ratio($userid, $html = true){ global $lang_functions; $row = get_user_row($userid); $uped = $row['uploaded']; $downed = $row['downloaded']; if ($html == true){ if ($downed > 0) { $ratio = $uped / $downed; $color = get_ratio_color($ratio); $ratio = number_format($ratio, 3); if ($color) $ratio = "".$ratio.""; } elseif ($uped > 0) $ratio = $lang_functions['text_inf']; else $ratio = "---"; } else{ if ($downed > 0) { $ratio = $uped / $downed; } else $ratio = 1; } return $ratio; } function add_s($num, $es = false) { global $lang_functions; return ($num > 1 ? ($es ? ($lang_functions['text_es'] ?? '') : $lang_functions['text_s']) : ""); } function is_or_are($num) { global $lang_functions; return ($num > 1 ? $lang_functions['text_are'] : $lang_functions['text_is']); } function getmicrotime(){ list($usec, $sec) = explode(" ",microtime()); return ((float)$usec + (float)$sec); } function get_user_class_image($class){ $UC = array( "Staff Leader" => "pic/staffleader.gif", "SysOp" => "pic/sysop.gif", "Administrator" => "pic/administrator.gif", "Moderator" => "pic/moderator.gif", "Forum Moderator" => "pic/forummoderator.gif", "Uploader" => "pic/uploader.gif", "Retiree" => "pic/retiree.gif", "VIP" => "pic/vip.gif", "Nexus Master" => "pic/nexus.gif", "Ultimate User" => "pic/ultimate.gif", "Extreme User" => "pic/extreme.gif", "Veteran User" => "pic/veteran.gif", "Insane User" => "pic/insane.gif", "Crazy User" => "pic/crazy.gif", "Elite User" => "pic/elite.gif", "Power User" => "pic/power.gif", "User" => "pic/user.gif", "Peasant" => "pic/peasant.gif" ); if (isset($class)) { $className = get_user_class_name($class,false,false,false); if (str_contains($className, '(')) { $className = strstr($className, '(', true); } $uclass = $UC[$className]; } else { $uclass = "pic/banned.gif"; } return $uclass; } function user_can_upload($where = "torrents"){ global $CURUSER,$upload_class,$enablespecial,$uploadspecial_class, $lang_functions; if ($CURUSER["uploadpos"] != 'yes') { return false; } $uploadDenyApprovalDenyCount = get_setting('main.upload_deny_approval_deny_count'); $approvalDenyCount = \App\Models\Torrent::query()->where('owner', $CURUSER['id']) ->where('approval_status', \App\Models\Torrent::APPROVAL_STATUS_DENY) ->count() ; if ($uploadDenyApprovalDenyCount > 0 && $approvalDenyCount >= $uploadDenyApprovalDenyCount) { stderr($lang_functions['std_sorry'], sprintf($lang_functions['approval_deny_reach_upper_limit'], $uploadDenyApprovalDenyCount),false); } if ($where == "torrents") { $offerSkipApprovedCount = get_setting('main.offer_skip_approved_count'); if ($CURUSER['offer_allowed_count'] >= $offerSkipApprovedCount) { return true; } if (user_can('upload')) return true; if (get_if_restricted_is_open()) return true; } if ($where == "music") { if ($enablespecial == 'yes' && user_can('uploadspecial')) return true; } return false; } function torrent_selection($name,$selname,$listname,$selectedid = 0, $mode = 0) { global $lang_functions; $selection = "".$name."    \n"; return $selection; } function get_hl_color($color=0) { switch ($color){ case 0: return false; case 1: return "Black"; case 2: return "Sienna"; case 3: return "DarkOliveGreen"; case 4: return "DarkGreen"; case 5: return "DarkSlateBlue"; case 6: return "Navy"; case 7: return "Indigo"; case 8: return "DarkSlateGray"; case 9: return "DarkRed"; case 10: return "DarkOrange"; case 11: return "Olive"; case 12: return "Green"; case 13: return "Teal"; case 14: return "Blue"; case 15: return "SlateGray"; case 16: return "DimGray"; case 17: return "Red"; case 18: return "SandyBrown"; case 19: return "YellowGreen"; case 20: return "SeaGreen"; case 21: return "MediumTurquoise"; case 22: return "RoyalBlue"; case 23: return "Purple"; case 24: return "Gray"; case 25: return "Magenta"; case 26: return "Orange"; case 27: return "Yellow"; case 28: return "Lime"; case 29: return "Cyan"; case 30: return "DeepSkyBlue"; case 31: return "DarkOrchid"; case 32: return "Silver"; case 33: return "Pink"; case 34: return "Wheat"; case 35: return "LemonChiffon"; case 36: return "PaleGreen"; case 37: return "PaleTurquoise"; case 38: return "LightBlue"; case 39: return "Plum"; case 40: return "White"; default: return false; } } function get_forum_moderators($forumid, $plaintext = true) { global $Cache; static $moderatorsArray; if (!$moderatorsArray && !$moderatorsArray = $Cache->get_value('forum_moderator_array')) { $moderatorsArray = array(); $res = sql_query("SELECT forumid, userid FROM forummods ORDER BY forumid ASC") or sqlerr(__FILE__, __LINE__); while ($row = mysql_fetch_array($res)) { $moderatorsArray[$row['forumid']][] = $row['userid']; } $Cache->cache_value('forum_moderator_array', $moderatorsArray, 86200); } $ret = $moderatorsArray[$forumid] ?? []; $moderators = ""; foreach($ret as $userid) { if ($plaintext) $moderators .= get_plain_username($userid).", "; else $moderators .= get_username($userid).", "; } $moderators = rtrim(trim($moderators), ","); return $moderators; } function key_shortcut($page=1,$pages=1) { $currentpage = "var currentpage=".$page.";"; $maxpage = "var maxpage=".$pages.";"; $key_shortcut_block = "\n\n"; return $key_shortcut_block; } function promotion_selection($selected = 0, $hide = 0) { global $lang_functions; $selection = ""; if ($hide != 1) $selection .= ""; if ($hide != 2) $selection .= ""; if ($hide != 3) $selection .= ""; if ($hide != 4) $selection .= ""; if ($hide != 5) $selection .= ""; if ($hide != 6) $selection .= ""; if ($hide != 7) $selection .= ""; return $selection; } function get_post_row($postid) { global $Cache; if (!$row = $Cache->get_value('post_'.$postid.'_content')){ $res = sql_query("SELECT * FROM posts WHERE id=".sqlesc($postid)." LIMIT 1") or sqlerr(__FILE__,__LINE__); $row = mysql_fetch_array($res); $Cache->cache_value('post_'.$postid.'_content', $row, 7200); } if (!$row) return false; else return $row; } function get_country_row($id) { global $Cache; if (!$row = $Cache->get_value('country_'.$id.'_content')){ $res = sql_query("SELECT * FROM countries WHERE id=".sqlesc($id)." LIMIT 1") or sqlerr(__FILE__,__LINE__); $row = mysql_fetch_array($res); $Cache->cache_value('country_'.$id.'_content', $row, 86400); } if (!$row) return false; else return $row; } function get_downloadspeed_row($id) { global $Cache; if (!$row = $Cache->get_value('downloadspeed_'.$id.'_content')){ $res = sql_query("SELECT * FROM downloadspeed WHERE id=".sqlesc($id)." LIMIT 1") or sqlerr(__FILE__,__LINE__); $row = mysql_fetch_array($res); $Cache->cache_value('downloadspeed_'.$id.'_content', $row, 86400); } if (!$row) return false; else return $row; } function get_uploadspeed_row($id) { global $Cache; if (!$row = $Cache->get_value('uploadspeed_'.$id.'_content')){ $res = sql_query("SELECT * FROM uploadspeed WHERE id=".sqlesc($id)." LIMIT 1") or sqlerr(__FILE__,__LINE__); $row = mysql_fetch_array($res); $Cache->cache_value('uploadspeed_'.$id.'_content', $row, 86400); } if (!$row) return false; else return $row; } function get_isp_row($id) { global $Cache; if (!$row = $Cache->get_value('isp_'.$id.'_content')){ $res = sql_query("SELECT * FROM isp WHERE id=".sqlesc($id)." LIMIT 1") or sqlerr(__FILE__,__LINE__); $row = mysql_fetch_array($res); $Cache->cache_value('isp_'.$id.'_content', $row, 86400); } if (!$row) return false; else return $row; } function valid_file_name($filename) { $allowedchars = "abcdefghijklmnopqrstuvwxyz0123456789_./"; $total=strlen($filename); for ($i = 0; $i < $total; ++$i) if (strpos($allowedchars, $filename[$i]) === false) return false; return true; } function valid_class_name($filename) { $allowedfirstchars = "abcdefghijklmnopqrstuvwxyz"; $allowedchars = "abcdefghijklmnopqrstuvwxyz0123456789_"; if(strpos($allowedfirstchars, $filename[0]) === false) return false; $total=strlen($filename); for ($i = 1; $i < $total; ++$i) if (strpos($allowedchars, $filename[$i]) === false) return false; return true; } function return_avatar_image($url) { global $CURLANGDIR; return "\"avatar\""; } function return_category_image($categoryid, $link="") { static $catImg = array(); if (isset($catImg[$categoryid])) { $catimg = $catImg[$categoryid]; } else { $categoryrow = get_category_row($categoryid); $catimgurl = get_cat_folder($categoryid); $catImg[$categoryid] = $catimg = ""; } if ($link) { $catimg = "".$catimg.""; } return $catimg; } /******************************************** bellow functioons avaliable since v1.6 ***********************************************************/ function get_requestcount() { global $CURUSER, $Cache; //return; $CURUSERID = 0 + $CURUSER['id']; if (!$count = $Cache->get_value($CURUSERID . '_get_requestcount')) { $row = @mysql_fetch_array(sql_query(" SELECT count(*) FROM requests LEFT JOIN resreq ON reqid=requests.id WHERE reqid>0 and finish = 'no' and userid= " . $CURUSERID)); $count = ($row[0] ? " style='background: none red;' " : " style='' "); $Cache->cache_value($CURUSERID . '_get_requestcount', $count, 120); } return $count; } function torrentTags($tags = 0, $type = 'checkbox') { global $lang_functions; $tagsOptions = [ [ 'text' => $lang_functions['text_tag_no_release_to_any_other'], 'color' => '#ff0000', ], [ 'text' => $lang_functions['text_tag_first_release'], 'color' => '#8F77B5', ], [ 'text' => $lang_functions['text_tag_official'], 'color' => '#0000ff', ], [ 'text' => $lang_functions['text_tag_diy'], 'color' => '#46d5ff', ], [ 'text' => $lang_functions['text_tag_mother_language'], 'color' => '#6a3906', ], [ 'text' => $lang_functions['text_tag_mother_language_subtitle'], 'color' => '#006400', ], [ 'text' => $lang_functions['text_tag_hdr'], 'color' => '#38b03f', ], ]; $html = ''; foreach ($tagsOptions as $key => $value) { $currentValue = pow(2, $key); if ($type == 'checkbox') { $checked = ''; if ($currentValue & $tags) { $checked = 'checked'; } $html .= sprintf( '', $currentValue, $checked, $value['text'] ); } if ($type == 'span' && ($currentValue & $tags)) { $html .= "{$value['text']} "; } } return $html; } function saveSetting(string $prefix, array $nameAndValue, string $autoload = 'yes'): void { $prefix = strtolower($prefix); $datetimeNow = date('Y-m-d H:i:s'); $sql = "insert into `settings` (name, value, created_at, updated_at, autoload) values "; $data = []; foreach ($nameAndValue as $name => $value) { if (is_array($value)) { $value = json_encode($value); } $data[] = sprintf("(%s, %s, %s, %s, '%s')", sqlesc("$prefix.$name"), sqlesc($value), sqlesc($datetimeNow), sqlesc($datetimeNow), $autoload); } $sql .= implode(",", $data) . " on duplicate key update value = values(value)"; \Nexus\Database\NexusDB::statement($sql); clear_setting_cache(); do_action("nexus_setting_update"); } function getFullDirectory($dir) { if (is_file($dir) && file_exists($dir)) { return $dir; } if (!is_dir($dir)) { $dir = ROOT_PATH . $dir; } if (is_dir($dir)) { return realpath($dir); } return $dir; } function checkGuestVisit() { if (userlogin()) { //already login return; } $setting = get_setting('security'); //all type: normal, static_page, custom_content, redirect $guestVisitType = $setting['guest_visit_type'] ?? ''; if (empty($guestVisitType) || $guestVisitType == 'normal') { return; } if (in_array(nexus()->getScript(), ['login', 'takelogin', 'image']) && canDoLogin()) { return; } $valueKey = "guest_visit_value_$guestVisitType"; if (empty($setting[$valueKey])) { do_log("setting: security.$valueKey empty"); die(0); } $guestVisitValue = $setting[$valueKey]; if ($guestVisitType == 'static_page') { $pageFile = ROOT_PATH . 'resources/static-pages/' . $guestVisitValue; if (!file_exists($pageFile) || !is_readable($pageFile)) { do_log("pageFile: $pageFile is not exists or readable"); die(0); } $content = file_get_contents($pageFile); die($content); } if ($guestVisitType == 'custom_content') { $content = format_comment($guestVisitValue); render('resources/templates/guest-visit-custom-content', ['content' => $content]); } if ($guestVisitType == 'redirect') { header('Location: ' . $guestVisitValue); die(0); } } function render($view, $data = [], $return = false) { extract($data); if (!file_exists($view)) { $view = ROOT_PATH . $view; } if (substr($view, -4) !== '.php') { $view .= ".php"; } ob_start(); ob_implicit_flush(0); require $view; $result = ob_get_clean(); if ($return) { return $result; } die($result); } function canDoLogin() { $setting = get_setting('security'); if (empty($setting['login_type']) || $setting['login_type'] == 'normal') { return true; } $loginType = $setting['login_type']; if ($loginType == 'secret') { if (empty($_REQUEST['secret'])) { do_log("no secret"); return false; } if ($_REQUEST['secret'] != $setting['login_secret']) { do_log("invlaid secret: " . $_REQUEST['secret']); return false; } if ($setting['login_secret_deadline'] < date('Y-m-d H:i:s')) { do_log("secret: {$_REQUEST['secret']} expires(deadline: {$setting['login_secret_deadline']})"); return false; } return true; } if ($loginType == 'passkey') { return false; } return true; } function displayHotAndClassic() { global $showextinfo, $showmovies, $Cache, $lang_functions, $browsecatmode, $specialcatmode; if ($showmovies['hot'] == "yes" || $showmovies['classic'] == "yes") { if (nexus()->getScript() == 'special') { $mode = $specialcatmode; } else { $mode = $browsecatmode; } $imdb = new \Nexus\Imdb\Imdb(); $type = array('hot', 'classic'); foreach($type as $type_each) { if($showmovies[$type_each] == 'yes' && (!isset($CURUSER) || $CURUSER['show' . $type_each] == 'yes')) { $Cache->new_page("{$type_each}_{$mode}_resources", 900, true); if (!$Cache->get_page()) { $Cache->add_whole_row(); $res = sql_query("SELECT torrents.sp_state, torrents.url, torrents.id, torrents.name, torrents.small_descr, torrents.cover FROM torrents LEFT JOIN categories ON torrents.category = categories.id WHERE categories.mode = $mode AND picktype = " . sqlesc($type_each) . " AND seeders > 0 AND (url != '' OR cover != '') ORDER BY id DESC LIMIT 30") or sqlerr(__FILE__, __LINE__); if (mysql_num_rows($res) > 0) { $movies_list = ""; $count = 0; $allImdb = array(); $width = 101; $height = 140; while($array = mysql_fetch_array($res)) { $pro_torrent = get_torrent_promotion_append($array['sp_state'],'word', false, '', 0, '', $array['__ignore_global_sp_state'] ?? false); $photo_url = ''; if ($imdb_id = parse_imdb_id($array["url"])) { if (array_search($imdb_id, $allImdb) !== false) { //a torrent with the same IMDb url already exists continue; } $allImdb[]=$imdb_id; try { $photo_url = $imdb->getMovie($imdb_id)->photo(true); if (empty($photo_url)) { do_log("torrent: {$array['id']}, url: {$array['url']}, imdb_id: $imdb_id can not get photo", 'error'); } } catch (\Exception $exception) { do_log($exception->getMessage() . "\n[stacktrace]\n" . $exception->getTraceAsString(), 'error'); } } if (empty($photo_url) && !empty($array['cover'])) { $photo_url = $array['cover']; } if (empty($photo_url)) { continue; } $thumbnail = "\"poster\""; $thumbnail = "" . (addslashes($array['name'] . $pro_torrent)) . "

".(addslashes($array['small_descr'])) .""). "', 'trail', true, 'delay', 0,'lifetime',5000,'styleClass','niceTitle','maxWidth', 600);\">" . $thumbnail . "
"; $movies_list .= $thumbnail; $count++; if ($count >= 10) break; } ?>

end_whole_row(); $Cache->cache_page(); } echo $Cache->next_row(); } } } } function build_table(array $header, array $rows, array $options = []) { $table = ''; foreach ($header as $key => $value) { $table .= sprintf('', $value); } $table .= ''; $tdClass = ''; if (isset($options['td-center']) && $options['td-center']) { $tdClass = 'colfollow'; } foreach ($rows as $row) { $table .= ''; foreach ($header as $headerKey => $headerValue) { $table .= sprintf('', $tdClass, $row[$headerKey] ?? ''); } $table .= ''; } $table .= '
%s
%s
'; return $table; } /** * 返回链接中附件的key * * @param $url * @return string */ function attachmentKey($url) { if (!filter_var($url, FILTER_VALIDATE_URL)) { throw new \InvalidArgumentException("URL: '$url' invalid."); } $parsed = parse_url($url); $driver = config('admin.upload.disk'); if ($driver == 'qiniu') { return trim($parsed['path'], "/"); } elseif ($driver == 'cloudinary') { $parts = explode('/', $parsed['path']); $key = end($parts); if (\Illuminate\Support\Str::contains($key,'.')) { $key = strstr($key, '.', true); } return $key; } else { throw new \RuntimeException('不支持的云盘驱动'); } } /** * 根据key返回链接 * * @param $location * @param null $width * @param null $height * @param array $options * @return string */ function attachmentUrl($location, $width = null, $height = null, $options = []) { return sprintf('%s/attachments/%s', getSchemeAndHttpHost(), trim($location, '/')); } function strip_all_tags($text) { //替换掉无参数标签 $bbTags = [ '[*]', '[b]', '[/b]', '[i]', '[/i]', '[u]', '[/u]', '[pre]', '[/pre]', '[quote]', '[/quote]', '[/color]', '[/font]', '[/size]', '[/url]', '[/youtube]', '[/spoiler]', ]; $text = str_replace($bbTags, '', $text); //替换掉有参数标签 $pattern = '/\[url=.*\]|\[color=.*\]|\[font=.*\]|\[size=.*\]|\[youtube.*\]|\[spoiler.*\]/isU'; $text = preg_replace($pattern, "", $text); //去掉表情 static $emoji = null; if (is_null($emoji)) { $emoji = nexus_config('emoji'); } // $text = preg_replace("/\[em([1-9][0-9]*)\]/isU", "", $text); $text = preg_replace_callback("/\[em([1-9][0-9]*)\]/isU", function ($matches) use ($emoji) { return $emoji[$matches[1]] ?? ''; }, $text); $text = strip_tags($text); return trim($text); } function format_description($description) { //替换附件 $pattern = '/(\[attach\](.*)\[\/attach\])/isU'; $matchCount = preg_match_all($pattern, $description, $matches); if ($matchCount) { $attachments = \App\Models\Attachment::query()->whereIn('dlkey', $matches[2])->get()->keyBy('dlkey'); if ($attachments->isNotEmpty()) { $description = preg_replace_callback($pattern, function ($matches) use ($attachments) { $item = $attachments->get($matches[2]); $url = \Nexus\Attachment\Storage::getDriver($item->driver)->getImageUrl($item->location); do_log(sprintf("location: %s, driver: %s, url: %s", $item->location, $item->driver, $url)); return str_replace($matches[2], $url, $matches[1]); }, $description); } } //去除引用 // $pattern = '/\[quote.*\].*\[\/quote\]/is'; // $description = preg_replace($pattern, '', $description); //去掉引用自 $pattern = '/\[quote=.*\]/isU'; $description = preg_replace_callback($pattern, function ($matches) { return '[quote]'; }, $description); //过虑多层引用 $delimiter = '__CYLX__'; $pattern = '/(\[quote\]){2,}(((?!\[quote\]).)*)\[\/quote\]/isU'; $description = preg_replace_callback($pattern, function ($matches) use ($delimiter) { return $delimiter; }, $description); $pattern = "/$delimiter(((?!\[quote\]).)+)\[\/quote\]/is"; $description = preg_replace_callback($pattern, function ($matches) use ($delimiter) { $arr = array_reverse(explode('[/quote]', $matches[0])); foreach ($arr as $value) { $value = trim(str_replace($delimiter, '', $value)); if (!empty($value)) { return "[quote]{$value}[/quote]"; } } }, $description); //匹配不同块 $attachPattern = '\[attach\].*\[\/attach\]'; $imgPattern = '\[img\].*\[\/img\]'; $imgPattern2 = '\[img=.*\]'; $urlPattern = '\[url=.*\].*\[\/url\]'; $quotePattern = '\[quote.*\].*\[\/quote\]'; $pattern = "/($attachPattern)|($imgPattern)|($imgPattern2)|($urlPattern)|($quotePattern)/isU"; // $pattern = "/($attachPattern)|($imgPattern)|($urlPattern)/isU"; $delimiter = '{{{}}}'; $description = preg_replace_callback($pattern, function ($matches) use ($delimiter) { return $delimiter . $matches[0] . $delimiter; }, $description); //再进行分割 $descriptionArr = preg_split("/[$delimiter]+/", $description); $results = []; foreach ($descriptionArr as $item) { if (preg_match('/\[attach\](.*)\[\/attach\]/isU', $item, $matches)) { //是否附件 $results[] = [ 'type' => 'attachment', 'data' => [ 'url' => $matches[1] ] ]; } elseif (preg_match('/\[img\](.*)\[\/img\]/isU', $item, $matches)) { //是否图片 $results[] = [ 'type' => 'image', 'data' => [ 'url' => $matches[1] ] ]; } elseif (preg_match('/\[img=(.*)\]/isU', $item, $matches)) { //是否图片 $results[] = [ 'type' => 'image', 'data' => [ 'url' => $matches[1] ] ]; } elseif (preg_match('/\[url=(.*)\](.*)\[\/url\]/isU', $item, $matches)) { $results[] = [ 'type' => 'url', 'data' => [ 'url' => $matches[1], 'text' => strip_all_tags($matches[2]) ] ]; } elseif (preg_match('/\[quote=?(.*)\](.*)\[\/quote\]/isU', $item, $matches)) { $results[] = [ 'type' => 'quote', 'data' => [ 'quote_text' => $matches[1], 'text' => strip_all_tags($matches[2]), ] ]; } elseif (!empty($item)) { $results[] = [ 'type' => 'text', 'data' => [ 'text' => strip_all_tags($item) ] ]; } } // dd($description, $results); return $results; } function get_image_from_description(array $descriptionArr, $first = false, $useDefault = true) { $imageType = ['attachment', 'image']; $images = []; foreach ($descriptionArr as $value) { if (!in_array($value['type'], $imageType)) { continue; } $url = $value['data']['url'] ?? ''; if (!$url) { continue; } if ($first) { return $url; } else { $images[] = $url; } } if ($first) { if ($useDefault) { return getSchemeAndHttpHost() . "/pic/imdb_pic/nophoto.gif"; } else { return ''; } } return $images; } function resize_image($url, $with = null, $height = null, $fit = "cover") { $scheme = parse_url($url, PHP_URL_SCHEME); if ($scheme === false) { return $url; } $url = "$scheme://images.weserv.nl/?url=$url"; if ($with !== null) { $url .= "&w=$with"; } if ($height !== null) { $url .= "&h=$height"; } $url .= "&fit=$fit"; return $url; } function get_share_ratio($uploaded, $downloaded) { if ($downloaded) { $ratio = floor(($uploaded / $downloaded) * 1000) / 1000; } elseif ($uploaded) { //@todo 读语言文件 $ratio = 'Infinity'; } else { $ratio = '---'; } return $ratio; } function EchoRow($class = ''){ if(func_num_args() < 2) return ''; $args = func_get_args(); $cells = array_splice($args, 1); $class = empty($class) ? '' : sprintf(' class="%s"', $class); $s = ''; foreach($cells as $cell) $s .= sprintf('%s', $class, $cell); $s .= "\n"; return $s; } function list_require_search_box_id() { $setting = get_setting('main'); $maps = [ 'torrents' => [$setting['browsecat']], 'special' => [$setting['specialcat']], 'usercp' => [$setting['browsecat'], $setting['specialcat']], 'getrss' => [$setting['browsecat'], $setting['specialcat']], 'userdetails' => [$setting['browsecat'], $setting['specialcat']], 'offers' => [$setting['browsecat'], $setting['specialcat']], 'details' => [$setting['browsecat'], $setting['specialcat']], 'search' => [$setting['browsecat'], $setting['specialcat']], ]; return $maps[nexus()->getScript()] ?? []; } function can_access_torrent($torrent, $uid) { global $specialcatmode; if (get_setting('main.spsct') != 'yes') { return true; } if (is_array($torrent) && isset($torrent['search_box_id'])) { $searchBoxId = $torrent['search_box_id']; } elseif (is_numeric($torrent)) { $torrent = \App\Models\Torrent::query()->findOrFail(intval($torrent), ['id', 'category']); $searchBoxId = $torrent->basic_category->mode ?? 0; if ($searchBoxId == 0) { do_log("[INVALID_CATEGORY], torrent: " . $torrent->id, 'error'); return false; } } else { throw new \InvalidArgumentException("Unsupported argument: " . json_encode($torrent)); } if ($searchBoxId != $specialcatmode) { return true; } if (user_can('view_special_torrent', false, $uid)) { return true; } return false; } function get_ip_location_from_geoip($ip): bool|array { $database = nexus_env('GEOIP2_DATABASE'); if (empty($database)) { do_log("no geoip2 database."); return false; } if (!is_readable($database)) { do_log("geoip2 database: $database is not readable."); return false; } static $reader; if (is_null($reader)) { $reader = new \GeoIp2\Database\Reader($database); } $lang = get_langfolder_cookie(); $langMap = [ 'chs' => 'zh-CN', 'cht' => 'zh-CN', 'en' => 'en', ]; $locale = $langMap[$lang] ?? $lang; $locationInfo = \Nexus\Database\NexusDB::remember("locations_{$ip}", 3600, function () use ($locale, $ip, $reader) { $info = [ 'ip' => $ip, 'version' => '', 'country' => '', 'city' => '', 'country_en' => '', 'city_en' => '', ]; try { $record = $reader->city($ip); $countryName = $record->country->names[$locale] ?? $record->country->names['en'] ?? ''; $cityName = $record->city->names[$locale] ?? $record->city->names['en'] ?? ''; if (isIPV4($ip)) { $info['version'] = 4; } elseif (isIPV6($ip)) { $info['version'] = 6; } $info['country'] = $countryName; $info['country_en'] = $record->country->names['en'] ?? ''; $info['city'] = $cityName; $info['city_en'] = $record->city->names['en'] ?? ''; } catch (\Exception $exception) { do_log($exception->getMessage() . $exception->getTraceAsString(), 'error'); } return $info; }); do_log("ip: $ip, locale: $locale, result: " . nexus_json_encode($locationInfo)); $name = sprintf('%s[v%s]', $locationInfo['city'] ? ($locationInfo['city'] . "·" . $locationInfo['country']) : $locationInfo['country'], $locationInfo['version']); return [ 'name' => $name, 'location_main' => '', 'location_sub' => '', 'flagpic' => '', 'start_ip' => $ip, 'end_ip' => $ip, 'ip_version' => $locationInfo['version'], 'country_en' => $locationInfo['country_en'], 'city_en' => $locationInfo['city_en'], ]; } function msgalert($url, $text, $bgcolor = "red") { print("
\n"); if (!empty($url)) { print("".$text.""); } else { print("".$text.""); } print("

"); } function build_medal_image(\Illuminate\Support\Collection $medals, $maxHeight = 200, $withActions = false): string { $medalImages = []; $wrapBefore = '
'; $wrapAfter = '
'; foreach ($medals as $medal) { $html = sprintf('
', $medal->image_large, $medal->name, $maxHeight, $maxHeight); if ($withActions) { $html .= sprintf( '
%s: %s%s: %s', nexus_trans('label.expire_at'), $medal->pivot->expire_at ? format_datetime($medal->pivot->expire_at) : nexus_trans('label.permanent'), nexus_trans('medal.fields.bonus_addition_factor'), $medal->bonus_addition_factor ?? 0, nexus_trans('label.priority'), $medal->pivot->id, $medal->pivot->priority ?? 0, nexus_trans('label.priority_help') ); $checked = ''; if ($medal->pivot->status == \App\Models\UserMedal::STATUS_WEARING) { $checked = ' checked'; } $html .= sprintf('', nexus_trans('medal.action_wearing'), $medal->pivot->id, $checked); $html .= '
'; } $html .= '
'; $medalImages[] = $html; } if ($withActions) { $medalImages[] = sprintf('
', nexus_trans('label.save')); } return $wrapBefore . implode('', $medalImages) . $wrapAfter; } function insert_torrent_tags($torrentId, $tagIdArr, $sync = false) { $specialTags = \App\Models\Tag::listSpecial(); $canSetSpecialTag = user_can('torrent-set-special-tag'); $dateTimeStringNow = date('Y-m-d H:i:s'); if ($sync) { sql_query("delete from torrent_tags where torrent_id = $torrentId"); } if (empty($tagIdArr)) { return; } $insertTagsSql = 'insert into torrent_tags (`torrent_id`, `tag_id`, `created_at`, `updated_at`) values '; $values = []; foreach ($tagIdArr as $tagId) { if (in_array($tagId, $specialTags) && !$canSetSpecialTag) { do_log("special tag: $tagId, and user no permission"); continue; } $values[] = sprintf("(%s, %s, '%s', '%s')", $torrentId, $tagId, $dateTimeStringNow, $dateTimeStringNow); } $insertTagsSql .= implode(', ', $values); do_log("[INSERT_TAGS], torrent: $torrentId with tags: " . nexus_json_encode($tagIdArr)); sql_query($insertTagsSql); } function get_smile($num) { static $all; if (is_null($all)) { $all = []; $prefix = getFullDirectory('public'); foreach (glob(getFullDirectory('public/pic/smilies') . '/*') as $value) { $subPath = substr($value, strlen($prefix)); $basename = basename($subPath); $all[strstr($basename, '.', true)] = $subPath; } } return $all[$num] ?? null; } function get_filament_class_alias($class): string { return Str::of($class) ->replace(['/', '\\'], '.') ->explode('.') ->map([Str::class, 'kebab']) ->implode('.'); } /** * Calculate user seed bonus per hour * * @param $uid * @param $torrentIdArr * @return array * @throws \Nexus\Database\DatabaseException */ function calculate_seed_bonus($uid, $torrentIdArr = null): array { $settingBonus = \App\Models\Setting::get('bonus'); $donortimes_bonus = $settingBonus['donortimes']; $perseeding_bonus = $settingBonus['perseeding']; $maxseeding_bonus = $settingBonus['maxseeding']; $tzero_bonus = $settingBonus['tzero']; $nzero_bonus = $settingBonus['nzero']; $bzero_bonus = $settingBonus['bzero']; $l_bonus = $settingBonus['l']; $sqrtof2 = sqrt(2); $logofpointone = log(0.1); $valueone = $logofpointone / $tzero_bonus; $pi = 3.141592653589793; $valuetwo = $bzero_bonus * ( 2 / $pi); $valuethree = $logofpointone / ($nzero_bonus - 1); $timenow = time(); $nowStr = date('Y-m-d H:i:s'); $sectoweek = 7*24*60*60; $A = $official_a = $size = $official_size = 0; $count = $torrent_peer_count = $official_torrent_peer_count = 0; $logPrefix = "[CALCULATE_SEED_BONUS], uid: $uid, torrentIdArr: " . json_encode($torrentIdArr); if ($torrentIdArr !== null) { if (empty($torrentIdArr)) { $torrentIdArr = [-1]; } $idStr = implode(',', \Illuminate\Support\Arr::wrap($torrentIdArr)); $sql = "select torrents.id, torrents.added, torrents.size, torrents.seeders, 'NO_PEER_ID' as peerID, '' as last_action from torrents WHERE id in ($idStr)"; } else { $sql = "select torrents.id, torrents.added, torrents.size, torrents.seeders, peers.id as peerID, peers.last_action from torrents LEFT JOIN peers ON peers.torrent = torrents.id WHERE peers.userid = $uid AND peers.seeder ='yes' group by peers.torrent, peers.peer_id"; } $tagGrouped = []; $torrentResult = \Nexus\Database\NexusDB::select($sql); if (!empty($torrentResult)) { $torrentIdArrReal = array_column($torrentResult, 'id'); $tagResult = \Nexus\Database\NexusDB::select(sprintf("select torrent_id, tag_id from torrent_tags where torrent_id in (%s)", implode(',', $torrentIdArrReal))); foreach ($tagResult as $tagItem) { $tagGrouped[$tagItem['torrent_id']][$tagItem['tag_id']] = 1; } } $officialTag = \App\Models\Setting::get('bonus.official_tag'); $officialAdditionalFactor = \App\Models\Setting::get('bonus.official_addition'); $zeroBonusTag = \App\Models\Setting::get('bonus.zero_bonus_tag'); $zeroBonusFactor = \App\Models\Setting::get('bonus.zero_bonus_factor'); $userMedalResult = \Nexus\Database\NexusDB::select("select sum(bonus_addition_factor) as factor from medals where id in (select medal_id from user_medals where uid = $uid and (expire_at is null or expire_at > '$nowStr'))"); $medalAdditionalFactor = floatval($userMedalResult[0]['factor'] ?? 0); do_log("$logPrefix, sql: $sql, count: " . count($torrentResult) . ", officialTag: $officialTag, officialAdditionalFactor: $officialAdditionalFactor, zeroBonusTag: $zeroBonusTag, zeroBonusFactor: $zeroBonusFactor, medalAdditionalFactor: $medalAdditionalFactor"); $last_action = ""; foreach ($torrentResult as $torrent) { if ($torrent['last_action'] > $last_action) { $last_action = $torrent['last_action']; } $size = bcadd($size, $torrent['size']); $weeks_alive = ($timenow - strtotime($torrent['added'])) / $sectoweek; $gb_size = $gb_size_raw = $torrent['size'] / 1073741824; if ($zeroBonusTag && isset($tagGrouped[$torrent['id']][$zeroBonusTag]) && is_numeric($zeroBonusFactor)) { $gb_size = $gb_size * $zeroBonusFactor; } $temp = (1 - exp($valueone * $weeks_alive)) * $gb_size * (1 + $sqrtof2 * exp($valuethree * ($torrent['seeders'] - 1))); $A += $temp; $count++; $torrent_peer_count++; $officialAIncrease = 0; if ($officialTag && isset($tagGrouped[$torrent['id']][$officialTag])) { $officialAIncrease = $temp; $official_torrent_peer_count++; $official_size = bcadd($official_size, $torrent['size']); } $official_a += $officialAIncrease; do_log(sprintf( "$logPrefix, torrent: %s, peer ID: %s, weeks: %s, size_raw: %s GB, size: %s GB, increase A: %s, increase official A: %s", $torrent['id'], $torrent['peerID'], $weeks_alive, $gb_size_raw, $gb_size, $temp, $officialAIncrease ), "debug"); } if ($count > $maxseeding_bonus) $count = $maxseeding_bonus; $seed_bonus = $seed_points = $valuetwo * atan($A / $l_bonus) + ($perseeding_bonus * $count); //Official addition don't think about the minimum value $official_bonus = $valuetwo * atan($official_a / $l_bonus); $medal_bonus = $valuetwo * atan($A / $l_bonus); $result = compact( 'seed_points','seed_bonus', 'A', 'count', 'torrent_peer_count', 'size', 'last_action', 'official_bonus', 'official_a', 'official_torrent_peer_count', 'official_size', 'medal_bonus' ); $result['donor_times'] = $donortimes_bonus; $result['official_additional_factor'] = $officialAdditionalFactor; $result['medal_additional_factor'] = $medalAdditionalFactor; do_log("$logPrefix, result: " . json_encode($result)); return $result; } function calculate_harem_addition($uid) { // $harems = \App\Models\User::query() // ->where('invited_by', $uid) // ->where('status', \App\Models\User::STATUS_CONFIRMED) // ->where('enabled', \App\Models\User::ENABLED_YES) // ->get(['id']); // $addition = 0; // $haremsCount = $harems->count(); // foreach ($harems as $harem) { // $result = calculate_seed_bonus($harem->id); // $addition += $result['seed_points']; // } // do_log("[HAREM_ADDITION], user: $uid, haremsCount: $haremsCount ,addition: $addition"); $addition = \Nexus\Database\NexusDB::table("users") ->where("invited_by", $uid) ->where('status', \App\Models\User::STATUS_CONFIRMED) ->where('enabled', \App\Models\User::ENABLED_YES) ->sum("seed_points_per_hour") ; do_log("[HAREM_ADDITION], user: $uid, addition: $addition"); return $addition; } function build_search_box_category_table($mode, $checkboxValue, $categoryHrefPrefix, $taxonomyHrefPrefix, $taxonomyNameLength, $checkedValues = '', array $options = []) { parse_str($checkedValues, $checkedValuesArr); $searchBox = \App\Models\SearchBox::query()->with(['categories', 'categories.icon'])->findOrFail($mode); $lang = get_langfolder_cookie(); $withTaxonomies = []; if ($searchBox->showsubcat) { //Keep the order if (!empty($searchBox->extra[SearchBox::EXTRA_TAXONOMY_LABELS])) { foreach ($searchBox->extra[SearchBox::EXTRA_TAXONOMY_LABELS] as $taxonomyLabelInfo) { $torrentField = $taxonomyLabelInfo["torrent_field"]; $showField = "show" . $torrentField; if ($searchBox->{$showField}) { $withTaxonomies[$torrentField] = \App\Models\SearchBox::$taxonomies[$torrentField]['table']; } } } else { foreach (\App\Models\SearchBox::$taxonomies as $torrentField => $taxonomyTableModel) { $showField = "show" . $torrentField; if ($searchBox->{$showField}) { $withTaxonomies[$torrentField] = $taxonomyTableModel['table']; } } } } $html = ''; if (!empty($options['section_name'])) { $html .= sprintf('', $searchBox->section_name[$lang] ?? ''); } //Category $html .= sprintf('', nexus_trans('label.search_box.category')); /** @var \Illuminate\DataBase\Eloquent\Collection $categoryCollection */ $categoryCollection = $searchBox->categories()->orderBy('sort_index', 'desc')->get(); if (!empty($options['select_unselect'])) { $categoryCollection->push(new \App\Models\Category(['mode' => -1])); } $categoryChunks = $categoryCollection->chunk($searchBox->catsperrow); $checkPrefix = 'cat'; foreach ($categoryChunks as $chunk) { $html .= ''; foreach ($chunk as $item) { if ($item->mode != -1) { $checked = ''; if ($checkedValues) { if ( str_contains($checkedValues, "[cat{$item->id}]") || (isset($checkedValuesArr["cat{$item->id}"]) && $checkedValuesArr["cat{$item->id}"] == 1) || (isset($checkedValuesArr["cat"]) && $checkedValuesArr["cat"] == $item->id) ) { $checked = " checked"; } } elseif (!empty($options['user_notifs'])) { $userNotifsKey = sprintf('[%s%s]', 'cat', $item->id); if (str_contains($options['user_notifs'], $userNotifsKey)) { $checked = ' checked'; } } $icon = $item->icon; $iconFolder = trim($icon->folder, '/'); $langAndFile = sprintf('%s%s', $icon->multilang == 'yes' ? "$lang/" : "", $item->image); if (file_exists(getFullDirectory("pic/category/$iconFolder/$langAndFile"))) { $backgroundImagePath = "pic/category/$iconFolder/$langAndFile"; } else { $backgroundImagePath = "pic/category/{$searchBox->name}/$iconFolder/$langAndFile"; } $tdContent = << {$item->name} TDCONTENT; } else { $tdContent = sprintf( "", $checkPrefix, nexus_trans('nexus.select_all'), $checkPrefix, $checkPrefix, nexus_trans('nexus.select_all'), nexus_trans('nexus.unselect_all') ); } $td = << TD; $html .= $td; } $html .= ''; } //Taxonomy foreach ($withTaxonomies as $torrentField => $tableName) { if ($taxonomyNameLength > 0) { $namePrefix = substr($torrentField, 0, $taxonomyNameLength); } else { $namePrefix = $torrentField; } $html .= sprintf('', $searchBox->getTaxonomyLabel($torrentField)); /** @var \Illuminate\DataBase\Eloquent\Collection $taxonomyCollection */ $taxonomyCollection = \Nexus\Database\NexusDB::table($tableName) ->where(function (\Illuminate\Database\Query\Builder $query) use ($mode) { return $query->where('mode', $mode)->orWhere('mode', 0); }) ->orderBy('sort_index', 'desc') ->get() ; $modelName = \App\Models\SearchBox::$taxonomies[$torrentField]['model']; $checkPrefix = $torrentField; if (!empty($options['select_unselect'])) { $taxonomyCollection->push(new $modelName(['mode' => -1])); } $taxonomyChunks = $taxonomyCollection->chunk($searchBox->catsperrow); foreach ($taxonomyChunks as $chunk) { $html .= ''; foreach ($chunk as $item) { if ($item->mode != -1) { if ($taxonomyHrefPrefix) { $afterInput = sprintf('%s', $taxonomyHrefPrefix, $namePrefix, $item->id, $item->name); } else { $afterInput = $item->name; } $checked = ''; do_log("toCheck: $checkedValues, $namePrefix - {$item->id}"); if ($checkedValues) { if ( str_contains($checkedValues, "[{$namePrefix}{$item->id}]") || (isset($checkedValuesArr["{$namePrefix}{$item->id}"]) && $checkedValuesArr["{$namePrefix}{$item->id}"] == 1) || (isset($checkedValuesArr[$namePrefix]) && $checkedValuesArr[$namePrefix] == $item->id) ) { $checked = ' checked'; } } elseif (!empty($options['user_notifs'])) { $userNotifsKey = sprintf('[%s%s]', substr($torrentField, 0, 3), $item->id); if (str_contains($options['user_notifs'], $userNotifsKey)) { $checked = ' checked'; } } $tdContent = <<$afterInput TDCONTENT; } else { $tdContent = sprintf( "", $checkPrefix, nexus_trans('nexus.select_all'), $checkPrefix, $checkPrefix, nexus_trans('nexus.select_all'), nexus_trans('nexus.unselect_all') ); } $td = << TD; $html .= $td; } $html .= ''; } $html .= ''; } $html .= '
%s
%s
$tdContent
%s
$tdContent
'; return $html; } function datetimepicker_input($name, $value = '', $label = '', array $options = []) { $lang = get_langfolder_cookie(true); if ($lang == 'zh_CN') { $lang = 'zh'; } $lang = str_replace('_', '-', $lang); $js = ''; if (!empty($options['require_files'])) { \Nexus\Nexus::css('vendor/jquery-datetimepicker/jquery.datetimepicker.min.css', 'footer', true); \Nexus\Nexus::js('vendor/jquery-datetimepicker/jquery.datetimepicker.full.min.js', 'footer', true); $js = "jQuery.datetimepicker.setLocale('{$lang}');"; } $id = "datetime-picker-$name"; $input = sprintf('%s', $label, $id, $name, $value, $options['style'] ?? ''); $format = $options['format'] ?? 'Y-m-d H:i'; $js .= << 0) { $rowSpan++; $hasHaremAddition = true; } if ($officialAdditionalFactor > 0 && $officialTag) { $rowSpan++; $hasOfficialAddition = true; } if ($bonusResult['medal_additional_factor'] > 0) { $rowSpan++; $hasMedalAddition = true; } $table = sprintf('', $options['table_style'] ?? ''); $table .= ''; $table .= sprintf('', nexus_trans('bonus.table_thead.reward_type')); $table .= sprintf('', nexus_trans('bonus.table_thead.count')); $table .= sprintf('', nexus_trans('bonus.table_thead.size')); $table .= sprintf('', nexus_trans('bonus.table_thead.a_value')); $table .= sprintf('', nexus_trans('bonus.table_thead.bonus_base')); $table .= sprintf('', nexus_trans('bonus.table_thead.factor')); $table .= sprintf('', nexus_trans('bonus.table_thead.got_bonus')); $table .= sprintf('', nexus_trans('bonus.table_thead.total')); $table .= ''; $table .= sprintf( '', nexus_trans('bonus.reward_types.basic'), $bonusResult['torrent_peer_count'], mksize($bonusResult['size']), number_format($bonusResult['A'], 3), number_format($bonusResult['seed_bonus'],3), $baseBonusFactor, number_format($baseBonus,3), $rowSpan, $totalBonus ); if ($hasMedalAddition) { $table .= sprintf( '', nexus_trans('bonus.reward_types.medal_addition'), $bonusResult['torrent_peer_count'], mksize($bonusResult['size']), number_format($bonusResult['A'], 3), number_format($bonusResult['medal_bonus'], 3), $bonusResult['medal_additional_factor'], number_format($bonusResult['medal_bonus'] * $bonusResult['medal_additional_factor'], 3) ); } if ($hasOfficialAddition) { $table .= sprintf( '', nexus_trans('bonus.reward_types.official_addition'), $bonusResult['official_torrent_peer_count'], mksize($bonusResult['official_size']), number_format($bonusResult['official_a'], 3), number_format($bonusResult['official_bonus'], 3), $officialAdditionalFactor, number_format($bonusResult['official_bonus'] * $officialAdditionalFactor, 3) ); } if ($hasHaremAddition) { $table .= sprintf( '', nexus_trans('bonus.reward_types.harem_addition'), '--', '--', '--', number_format($haremAddition, 3), $haremFactor, number_format($haremAddition * $haremFactor, 3) ); } $table .= '
%s%s%s%s%s%s%s%s
%s%s%s%s%s%s%s%s
%s%s%s%s%s%s%s
%s%s%s%s%s%s%s
%s%s%s%s%s%s%s
'; return [ 'table' => $table, 'has_harem_addition' => $hasHaremAddition, 'harem_addition_factor' => $haremFactor, 'has_official_addition' => $hasOfficialAddition, 'official_addition_factor' => $officialAdditionalFactor, 'has_medal_addition' => $hasMedalAddition, 'medal_addition_factor' => $bonusResult['medal_additional_factor'], ]; } function build_search_area($searchArea, array $options = []) { $result = sprintf(''; return $result; } function torrent_name_for_admin(\App\Models\Torrent|null $torrent, $withTags = false, $length = 40) { if (empty($torrent)) { return ''; } $name = sprintf( '', $torrent->id, $torrent->name, Str::limit($torrent->name, $length) ); $tags = ''; if ($withTags) { $tags = sprintf(' 
%s
', $torrent->tagsFormatted); } return new HtmlString('
' . $name . $tags . '
'); } function username_for_admin(int $id) { return new HtmlString(get_username($id, false, true, true, true)); } function can_view_post($uid, $post) { static $topics = []; static $protectedForumIdArr; static $forumMods; if (!is_array($post)) { $post = \App\Models\Post::query()->findOrFail(intval($post))->toArray(); } $topicId = $post['topicid']; if (!isset($topics[$topicId])) { $topics[$topicId] = \App\Models\Topic::query()->findOrFail($topicId); } /** @var \App\Models\Topic $topicInfo */ $topicInfo = $topics[$topicId]; $forumId = $topicInfo->forumid; if (is_null($protectedForumIdArr)) { $protectedForumIdArr = []; $protectedForumIds = \Nexus\Database\NexusDB::remember("setting_protected_forum", 600, function () { return \App\Models\Setting::getByName('misc.protected_forum'); }); $protectedForumIdArr = $protectedForumIds ? preg_split("/[,\s]+/", $protectedForumIds) : []; } if (is_null($forumMods)) { $forumMods = []; $results = \App\Models\ForumMod::query()->get(); foreach ($results as $item) { $forumMods[$item->forumid] = $item->userid; } } $isForumMod = isset($forumMods[$forumId]) && $forumMods[$forumId] == $uid; $log = sprintf( "uid: $uid, class: %s, post: {$post['id']}, forumId: $forumId, protectedForumIdArr: %s, forumMods: %s, isForumMod: %s", get_user_class(), json_encode($protectedForumIdArr), json_encode($forumMods), $isForumMod ); if ( in_array($forumId, $protectedForumIdArr) && get_user_class() < \App\Models\User::CLASS_ADMINISTRATOR && $uid != $post['userid'] && $uid != $topicInfo->userid && !$isForumMod ) { do_log("$log, FALSE"); return false; } do_log("$log, TRUE"); return true; } ?>