2020-12-26 01:42:23 +08:00
< ? php
2022-03-20 22:14:00 +08:00
2020-12-26 01:42:23 +08:00
function get_global_sp_state ()
{
static $global_promotion_state ;
2022-07-30 15:06:51 +08:00
$cacheKey = 'global_promotion_state' ;
2022-07-23 23:35:43 +08:00
if ( ! $global_promotion_state ) {
2022-07-30 15:06:51 +08:00
$row = \Nexus\Database\NexusDB :: remember ( $cacheKey , 600 , function () use ( $cacheKey ) {
$row = \Nexus\Database\NexusDB :: getOne ( 'torrents_state' , 1 );
\Nexus\Database\NexusDB :: cache_put ( $cacheKey . '_deadline' , $row [ 'deadline' ], 600 );
return $row ;
});
2022-07-30 15:42:07 +08:00
if ( is_array ( $row ) && isset ( $row [ 'deadline' ]) && $row [ 'deadline' ] < date ( 'Y-m-d H:i:s' )) {
2022-07-30 15:06:51 +08:00
//expired
$global_promotion_state = \App\Models\Torrent :: PROMOTION_NORMAL ;
2022-07-30 15:42:07 +08:00
} elseif ( is_array ( $row )) {
2022-07-30 15:06:51 +08:00
$global_promotion_state = $row [ " global_sp_state " ];
2022-07-30 15:42:07 +08:00
} else {
$global_promotion_state = $row ;
2022-07-30 15:06:51 +08:00
}
2020-12-26 01:42:23 +08:00
}
return $global_promotion_state ;
}
// IP Validation
function validip ( $ip )
{
if ( ! ip2long ( $ip )) //IPv6
return true ;
if ( ! empty ( $ip ) && $ip == long2ip ( ip2long ( $ip )))
{
// reserved IANA IPv4 addresses
// http://www.iana.org/assignments/ipv4-address-space
$reserved_ips = array (
array ( '192.0.2.0' , '192.0.2.255' ),
array ( '192.168.0.0' , '192.168.255.255' ),
array ( '255.255.255.0' , '255.255.255.255' )
);
foreach ( $reserved_ips as $r )
{
$min = ip2long ( $r [ 0 ]);
$max = ip2long ( $r [ 1 ]);
if (( ip2long ( $ip ) >= $min ) && ( ip2long ( $ip ) <= $max )) return false ;
}
return true ;
}
else return false ;
}
function getip () {
if ( isset ( $_SERVER )) {
if ( isset ( $_SERVER [ 'HTTP_X_FORWARDED_FOR' ]) && validip ( $_SERVER [ 'HTTP_X_FORWARDED_FOR' ])) {
$ip = $_SERVER [ 'HTTP_X_FORWARDED_FOR' ];
} elseif ( isset ( $_SERVER [ 'HTTP_CLIENT_IP' ]) && validip ( $_SERVER [ 'HTTP_CLIENT_IP' ])) {
$ip = $_SERVER [ 'HTTP_CLIENT_IP' ];
} else {
2021-05-31 21:04:49 +08:00
$ip = $_SERVER [ 'REMOTE_ADDR' ] ? ? '' ;
2020-12-26 01:42:23 +08:00
}
} else {
if ( getenv ( 'HTTP_X_FORWARDED_FOR' ) && validip ( getenv ( 'HTTP_X_FORWARDED_FOR' ))) {
$ip = getenv ( 'HTTP_X_FORWARDED_FOR' );
} elseif ( getenv ( 'HTTP_CLIENT_IP' ) && validip ( getenv ( 'HTTP_CLIENT_IP' ))) {
$ip = getenv ( 'HTTP_CLIENT_IP' );
} else {
2021-05-31 21:04:49 +08:00
$ip = getenv ( 'REMOTE_ADDR' ) ? ? '' ;
2020-12-26 01:42:23 +08:00
}
}
return $ip ;
}
function sql_query ( $query )
{
2021-01-12 21:14:02 +08:00
$begin = microtime ( true );
2020-12-26 01:42:23 +08:00
global $query_name ;
2020-12-29 21:49:37 +08:00
$result = mysql_query ( $query );
2021-01-15 22:13:46 +08:00
$end = microtime ( true );
2020-12-29 21:49:37 +08:00
$query_name [] = [
'query' => $query ,
2021-01-15 22:13:46 +08:00
'time' => sprintf ( '%.3f ms' , ( $end - $begin ) * 1000 ),
2020-12-29 21:49:37 +08:00
];
return $result ;
2020-12-26 01:42:23 +08:00
}
function sqlesc ( $value ) {
2021-01-11 22:00:46 +08:00
if ( is_null ( $value )) {
2021-01-20 20:06:48 +08:00
return 'null' ;
2021-01-11 22:00:46 +08:00
}
$value = " ' " . mysql_real_escape_string ( $value ) . " ' " ;
2020-12-26 01:42:23 +08:00
return $value ;
}
function hash_pad ( $hash ) {
return str_pad ( $hash , 20 );
}
function hash_where ( $name , $hash ) {
$shhash = preg_replace ( '/ *$/s' , " " , $hash );
2021-06-13 20:53:14 +08:00
// return "($name = " . sqlesc($hash) . " OR $name = " . sqlesc($shhash) . ")";
return sprintf ( " $name in (%s, %s) " , sqlesc ( $hash ), sqlesc ( $shhash ));
2020-12-26 01:42:23 +08:00
}
2021-01-12 21:14:02 +08:00
2021-05-11 01:41:58 +08:00
//no need any more...
/*
2021-01-12 21:14:02 +08:00
function strip_magic_quotes ( $arr )
{
foreach ( $arr as $k => $v )
{
if ( is_array ( $v ))
{
$arr [ $k ] = strip_magic_quotes ( $v );
} else {
$arr [ $k ] = stripslashes ( $v );
}
}
return $arr ;
}
if ( function_exists ( 'get_magic_quotes_gpc' ) && get_magic_quotes_gpc ())
{
if ( ! empty ( $_GET )) {
$_GET = strip_magic_quotes ( $_GET );
}
if ( ! empty ( $_POST )) {
$_POST = strip_magic_quotes ( $_POST );
}
if ( ! empty ( $_COOKIE )) {
$_COOKIE = strip_magic_quotes ( $_COOKIE );
}
}
2021-05-11 01:41:58 +08:00
*/
2021-01-12 21:14:02 +08:00
function get_langfolder_list ()
{
//do not access db for speed up, or for flexibility
return array ( " en " , " chs " , " cht " , " ko " , " ja " );
}
function printLine ( $line , $exist = false )
{
echo " [ " . date ( 'Y-m-d H:i:s' ) . " ] $line <br /> " ;
if ( $exist ) {
exit ( 0 );
}
}
2021-04-02 19:48:41 +08:00
function nexus_dd ( $vars )
2021-01-12 21:14:02 +08:00
{
2021-04-02 19:48:41 +08:00
echo '<pre>' ;
array_map ( function ( $var ) {
var_dump ( $var );
}, func_get_args ());
echo '</pre>' ;
exit ( 0 );
2021-01-12 21:14:02 +08:00
}
2021-04-26 20:37:17 +08:00
/**
* write log , use in both pure nexus and inside laravel
*
* @ param $log
* @ param string $level
*/
2022-03-26 04:27:04 +08:00
function do_log ( $log , $level = 'info' , $echo = false )
2021-01-12 21:14:02 +08:00
{
2022-03-20 22:14:00 +08:00
static $env , $setLogLevel ;
2021-06-09 15:11:02 +08:00
if ( is_null ( $setLogLevel )) {
$setLogLevel = nexus_env ( 'LOG_LEVEL' , 'debug' );
}
2022-03-20 22:14:00 +08:00
if ( is_null ( $env )) {
$env = nexus_env ( 'APP_ENV' , 'production' );
}
2022-03-18 19:59:27 +08:00
$logLevels = [ 'debug' , 'info' , 'notice' , 'warning' , 'error' , 'critical' , 'alert' , 'emergency' ];
2021-06-09 15:11:02 +08:00
$setLogLevelKey = array_search ( $setLogLevel , $logLevels );
$currentLogLevelKey = array_search ( $level , $logLevels );
if ( $currentLogLevelKey === false ) {
2022-03-18 19:59:27 +08:00
$level = 'error' ;
2021-06-09 15:11:02 +08:00
$log = " [ERROR_LOG_LEVEL] $log " ;
$currentLogLevelKey = array_search ( $level , $logLevels );
}
if ( $currentLogLevelKey < $setLogLevelKey ) {
return ;
}
2021-01-30 13:53:15 +08:00
$logFile = getLogFile ();
2021-04-26 20:37:17 +08:00
if (( $fd = fopen ( $logFile , 'a' )) === false ) {
2022-06-20 19:16:37 +08:00
$log .= " --------Can not open $logFile " ;
$fd = fopen ( sys_get_temp_dir () . '/nexus.log' , 'a' );
2021-01-12 21:14:02 +08:00
}
2022-04-06 21:32:57 +08:00
$uid = 0 ;
2022-03-20 22:14:00 +08:00
if ( IN_NEXUS ) {
global $CURUSER ;
$user = $CURUSER ;
$uid = $user [ 'id' ] ? ? 0 ;
$passkey = $user [ 'passkey' ] ? ? $_REQUEST [ 'passkey' ] ? ? $_REQUEST [ 'authkey' ] ? ? '' ;
2021-05-31 21:04:49 +08:00
} else {
2022-04-06 21:32:57 +08:00
try {
$user = \Illuminate\Support\Facades\Auth :: user ();
$uid = $user -> id ? ? 0 ;
$passkey = $user -> passkey ? ? request ( 'passkey' , request ( 'authkey' , '' ));
} catch ( \Throwable $exception ) {
$passkey = " !IN_NEXUS: " . $exception -> getMessage ();
}
2021-04-26 20:37:17 +08:00
}
$backtrace = debug_backtrace ( DEBUG_BACKTRACE_IGNORE_ARGS , 2 );
$content = sprintf (
2021-05-31 21:04:49 +08:00
" [%s] [%s] [%s] [%s] [%s] [%s] %s.%s %s:%s %s%s%s %s%s " ,
2021-04-26 20:37:17 +08:00
date ( 'Y-m-d H:i:s' ),
2022-03-20 22:14:00 +08:00
nexus () ? nexus () -> getRequestId () : 'NO_REQUEST_ID' ,
nexus () ? nexus () -> getLogSequence () : 0 ,
sprintf ( '%.3f' , microtime ( true ) - ( nexus () ? nexus () -> getStartTimestamp () : 0 )),
2021-04-26 20:37:17 +08:00
$uid ,
$passkey ,
$env , $level ,
$backtrace [ 0 ][ 'file' ] ? ? '' ,
$backtrace [ 0 ][ 'line' ] ? ? '' ,
$backtrace [ 1 ][ 'class' ] ? ? '' ,
$backtrace [ 1 ][ 'type' ] ? ? '' ,
$backtrace [ 1 ][ 'function' ] ? ? '' ,
$log ,
PHP_EOL
);
fwrite ( $fd , $content );
fclose ( $fd );
2022-03-26 04:27:04 +08:00
if ( is_bool ( $echo ) && $echo ) {
echo $content . PHP_EOL ;
}
2022-03-20 22:14:00 +08:00
if ( nexus ()) {
nexus () -> incrementLogSequence ();
}
2021-01-12 21:14:02 +08:00
}
2021-01-30 13:53:15 +08:00
function getLogFile ()
{
static $logFile ;
if ( ! is_null ( $logFile )) {
return $logFile ;
}
2022-04-06 21:32:57 +08:00
$config = nexus_config ( 'nexus' );
2022-06-20 18:26:38 +08:00
$path = getenv ( 'NEXUS_LOG_DIR' , true );
$fromEnv = true ;
if ( $path === false ) {
$fromEnv = false ;
$path = sys_get_temp_dir ();
}
2022-06-20 19:16:37 +08:00
$logFile = rtrim ( $path , '/' ) . '/nexus.log' ;
2022-06-20 18:26:38 +08:00
if ( ! $fromEnv && ! empty ( $config [ 'log_file' ])) {
2021-01-30 13:53:15 +08:00
$logFile = $config [ 'log_file' ];
}
$lastDotPos = strrpos ( $logFile , '.' );
if ( $lastDotPos !== false ) {
$prefix = substr ( $logFile , 0 , $lastDotPos );
$suffix = substr ( $logFile , $lastDotPos );
} else {
$prefix = $logFile ;
$suffix = '' ;
}
2021-04-26 20:37:17 +08:00
$logFile = sprintf ( '%s-%s%s' , $prefix , date ( 'Y-m-d' ), $suffix );
2021-01-30 13:53:15 +08:00
return $logFile ;
}
2021-04-02 19:48:41 +08:00
function nexus_config ( $key , $default = null )
2021-01-12 21:14:02 +08:00
{
2022-05-03 23:58:27 +08:00
if ( ! IN_NEXUS ) {
return config ( $key , $default );
}
2021-04-02 19:48:41 +08:00
static $configs ;
if ( is_null ( $configs )) {
//get all configuration from config file
// $files = glob(ROOT_PATH . 'config/*.php');
$files = [
ROOT_PATH . 'config/nexus.php' ,
2022-05-03 23:58:27 +08:00
ROOT_PATH . 'config/emoji.php' ,
2021-04-02 19:48:41 +08:00
];
foreach ( $files as $file ) {
$basename = basename ( $file );
if ( $basename == 'allconfig.php' ) {
//exclude the NexusPHP default config file
continue ;
}
$values = require $file ;
$configPrefix = strstr ( $basename , '.php' , true );
$configs [ $configPrefix ] = $values ;
}
}
return arr_get ( $configs , $key , $default );
2021-01-12 21:14:02 +08:00
}
2021-04-02 19:48:41 +08:00
2021-01-12 21:14:02 +08:00
/**
* get setting for given name and prefix
*
* @ date 2021 / 1 / 11
* @ param null $name
2022-04-04 17:26:26 +08:00
* @ param null $default
* @ return mixed
2021-01-12 21:14:02 +08:00
*/
2022-04-04 17:26:26 +08:00
function get_setting ( $name = null , $default = null ) : mixed
2021-01-12 21:14:02 +08:00
{
static $settings ;
if ( is_null ( $settings )) {
2022-04-22 01:00:59 +08:00
$settings = \Nexus\Database\NexusDB :: remember ( " nexus_settings_in_nexus " , 600 , function () {
2022-03-28 15:58:12 +08:00
//get all settings from database
2022-04-04 17:26:26 +08:00
return \App\Models\Setting :: getFromDb ();
2022-03-28 15:58:12 +08:00
});
2021-01-12 21:14:02 +08:00
}
2021-01-14 20:44:24 +08:00
if ( is_null ( $name )) {
return $settings ;
}
2022-04-04 17:26:26 +08:00
return arr_get ( $settings , $name , $default );
2021-01-12 21:14:02 +08:00
}
2022-04-04 17:26:26 +08:00
function get_setting_from_db ( $name = null , $default = null )
{
static $final ;
if ( is_null ( $final )) {
$final = \App\Models\Setting :: getFromDb ();
}
if ( is_null ( $name )) {
return $final ;
}
return arr_get ( $final , $name , $default );
}
2021-04-02 19:48:41 +08:00
function nexus_env ( $key = null , $default = null )
2021-01-12 21:14:02 +08:00
{
2021-04-02 19:48:41 +08:00
static $env ;
if ( is_null ( $env )) {
2022-03-18 19:59:27 +08:00
$envFile = dirname ( __DIR__ ) . '/.env' ;
2021-04-02 19:48:41 +08:00
$env = readEnvFile ( $envFile );
2021-01-21 20:42:22 +08:00
}
2021-04-02 19:48:41 +08:00
if ( is_null ( $key )) {
return $env ;
}
return $env [ $key ] ? ? $default ;
2021-01-12 21:14:02 +08:00
}
2021-01-21 20:42:22 +08:00
function readEnvFile ( $envFile )
{
if ( ! file_exists ( $envFile )) {
2021-04-30 19:16:51 +08:00
if ( php_sapi_name () == 'cli' ) {
2021-05-02 17:24:05 +08:00
return [];
2021-04-30 19:16:51 +08:00
}
2021-04-02 19:48:41 +08:00
throw new \RuntimeException ( " env file : $envFile is not exists in the root path. " );
2021-01-21 20:42:22 +08:00
}
$env = [];
$fp = fopen ( $envFile , 'r' );
if ( $fp === false ) {
throw new \RuntimeException ( " .env file: $envFile is not readable. " );
}
while (( $line = fgets ( $fp )) !== false ) {
$line = trim ( $line );
if ( empty ( $line )) {
continue ;
}
$pos = strpos ( $line , '=' );
if ( $pos <= 0 ) {
continue ;
}
if ( mb_substr ( $line , 0 , 1 , 'utf-8' ) == '#' ) {
continue ;
}
$lineKey = normalize_env ( mb_substr ( $line , 0 , $pos , 'utf-8' ));
$lineValue = normalize_env ( mb_substr ( $line , $pos + 1 , null , 'utf-8' ));
$env [ $lineKey ] = $lineValue ;
}
return $env ;
}
2021-01-12 21:14:02 +08:00
function normalize_env ( $value )
{
$value = trim ( $value );
$toStrip = [ '\'' , '"' ];
if ( in_array ( mb_substr ( $value , 0 , 1 , 'utf-8' ), $toStrip )) {
$value = mb_substr ( $value , 1 , null , 'utf-8' );
}
if ( in_array ( mb_substr ( $value , - 1 , null , 'utf-8' ), $toStrip )) {
$value = mb_substr ( $value , 0 , - 1 , 'utf-8' );
}
switch ( strtolower ( $value )) {
case 'true' :
return true ;
case 'false' :
return false ;
case 'null' :
return null ;
default :
return $value ;
}
}
2021-01-14 20:44:24 +08:00
/**
* Get an item from an array using " dot " notation .
*
2021-01-15 01:12:44 +08:00
* reference to Laravel
2021-01-14 20:44:24 +08:00
*
* @ date 2021 / 1 / 14
* @ param $array
* @ param $key
* @ param null $default
* @ return mixed | null
*/
2021-01-12 21:14:02 +08:00
function arr_get ( $array , $key , $default = null )
{
if ( strpos ( $key , '.' ) === false ) {
return $array [ $key ] ? ? $default ;
}
foreach ( explode ( '.' , $key ) as $segment ) {
if ( isset ( $array [ $segment ])) {
$array = $array [ $segment ];
} else {
return $default ;
}
}
return $array ;
}
2021-01-13 19:32:26 +08:00
2021-01-14 20:44:24 +08:00
/**
* From Laravel
*
* Set an array item to a given value using " dot " notation .
*
* If no key is given to the method , the entire array will be replaced .
*
* @ param array $array
* @ param string | null $key
* @ param mixed $value
* @ return array
*/
2021-01-13 19:32:26 +08:00
function arr_set ( & $array , $key , $value )
{
2021-01-14 20:44:24 +08:00
if ( is_null ( $key )) {
return $array = $value ;
}
$keys = explode ( '.' , $key );
foreach ( $keys as $i => $key ) {
if ( count ( $keys ) === 1 ) {
break ;
2021-01-14 02:27:55 +08:00
}
2021-01-14 20:44:24 +08:00
unset ( $keys [ $i ]);
// If the key doesn't exist at this depth, we will just create an empty array
// to hold the next value, allowing us to create the arrays to hold final
// values at the correct depth. Then we'll keep digging into the array.
if ( ! isset ( $array [ $key ]) || ! is_array ( $array [ $key ])) {
$array [ $key ] = [];
2021-01-14 02:27:55 +08:00
}
2021-01-14 20:44:24 +08:00
$array = & $array [ $key ];
2021-01-14 02:27:55 +08:00
}
2021-01-14 20:44:24 +08:00
$array [ array_shift ( $keys )] = $value ;
2021-01-14 02:27:55 +08:00
return $array ;
2021-01-13 19:32:26 +08:00
}
2021-01-22 01:58:28 +08:00
2022-04-07 00:54:05 +08:00
function isHttps () : bool
2021-02-28 02:47:13 +08:00
{
2022-04-07 00:54:05 +08:00
$schema = nexus () -> getRequestSchema ();
return $schema == 'https' ;
2021-02-28 02:47:13 +08:00
}
2021-01-22 01:58:28 +08:00
2021-02-03 18:41:53 +08:00
function getSchemeAndHttpHost ()
2021-01-22 01:58:28 +08:00
{
2021-06-01 23:33:28 +08:00
global $BASEURL ;
if ( isRunningInConsole ()) {
return $BASEURL ;
}
2021-02-28 02:47:13 +08:00
$isHttps = isHttps ();
2021-01-22 01:58:28 +08:00
$protocol = $isHttps ? 'https' : 'http' ;
2022-04-07 19:08:02 +08:00
$host = nexus () -> getRequestHost ();
return " $protocol :// " . $host ;
2021-01-22 01:58:28 +08:00
}
function getBaseUrl ()
{
2021-02-03 18:41:53 +08:00
$url = getSchemeAndHttpHost ();
2021-01-22 01:58:28 +08:00
$requestUri = $_SERVER [ 'REQUEST_URI' ];
$pos = strpos ( $requestUri , '?' );
if ( $pos !== false ) {
$url .= substr ( $requestUri , 0 , $pos );
} else {
$url .= $requestUri ;
}
2021-02-28 02:47:13 +08:00
return trim ( $url , '/' );
2021-01-22 01:58:28 +08:00
}
2021-04-02 19:48:41 +08:00
2021-04-21 00:07:32 +08:00
function nexus_json_encode ( $data )
{
return json_encode ( $data , JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES );
}
2021-04-02 19:48:41 +08:00
function api ( ... $args )
{
2021-05-14 20:41:43 +08:00
if ( func_num_args () < 3 ) {
2021-04-02 19:48:41 +08:00
//参数少于3个时, 默认为错误状态。
$ret = - 1 ;
$msg = isset ( $args [ 0 ]) ? $args [ 0 ] : 'ERROR' ;
$data = isset ( $args [ 1 ]) ? $args [ 1 ] : [];
} else {
$ret = $args [ 0 ];
$msg = $args [ 1 ];
$data = $args [ 2 ];
}
2022-03-20 22:14:00 +08:00
if ( $data instanceof \Illuminate\Http\Resources\Json\ResourceCollection || $data instanceof \Illuminate\Http\Resources\Json\JsonResource ) {
$data = $data -> response () -> getData ( true );
if ( isset ( $data [ 'data' ]) && count ( $data ) == 1 ) {
//单纯的集合,无分页等其数据
$data = $data [ 'data' ];
2021-04-02 19:48:41 +08:00
}
}
2022-08-16 18:31:04 +08:00
$time = ( float ) number_format ( microtime ( true ) - nexus () -> getStartTimestamp (), 3 );
$count = null ;
$resultKey = 'ret' ;
$msgKey = 'msg' ;
$format = $_REQUEST [ '__format' ] ? ? '' ;
if ( $format == 'layui-table' ) {
$resultKey = 'code' ;
$count = $data [ 'meta' ][ 'total' ] ? ? 0 ;
if ( isset ( $data [ 'data' ])) {
$data = $data [ 'data' ];
}
}
$results = [
$resultKey => ( int ) $ret ,
$msgKey => ( string ) $msg ,
2021-04-02 19:48:41 +08:00
'data' => $data ,
2022-08-16 18:31:04 +08:00
'time' => $time ,
2022-03-20 22:14:00 +08:00
'rid' => nexus () -> getRequestId (),
2021-04-02 19:48:41 +08:00
];
2022-08-16 18:31:04 +08:00
if ( $format == 'layui-table' ) {
$results [ 'count' ] = $count ;
}
return $results ;
2021-04-02 19:48:41 +08:00
}
function success ( ... $args )
{
$ret = 0 ;
$msg = 'OK' ;
$data = [];
$argumentCount = func_num_args ();
if ( $argumentCount == 1 ) {
$data = $args [ 0 ];
} elseif ( $argumentCount == 2 ) {
$msg = $args [ 0 ];
$data = $args [ 1 ];
}
return api ( $ret , $msg , $data );
}
function fail ( ... $args )
{
$ret = - 1 ;
$msg = 'ERROR' ;
$data = [];
$argumentCount = func_num_args ();
if ( $argumentCount == 1 ) {
$data = $args [ 0 ];
} elseif ( $argumentCount == 2 ) {
$msg = $args [ 0 ];
$data = $args [ 1 ];
}
return api ( $ret , $msg , $data );
}
2021-04-26 20:37:17 +08:00
function last_query ( $all = false )
{
2021-06-10 21:07:20 +08:00
static $connection , $pdo ;
if ( is_null ( $connection )) {
if ( IN_NEXUS ) {
$connection = \Illuminate\Database\Capsule\Manager :: connection ( \Nexus\Database\NexusDB :: ELOQUENT_CONNECTION_NAME );
} else {
$connection = \Illuminate\Support\Facades\DB :: connection ( config ( 'database.default' ));
}
$pdo = $connection -> getPdo ();
}
$queries = $connection -> getQueryLog ();
if ( ! $all ) {
$queries = [ last ( $queries )];
}
$queryFormatted = [];
foreach ( $queries as $query ) {
$sqlWithPlaceholders = str_replace ([ '%' , '?' ], [ '%%' , '%s' ], $query [ 'query' ]);
$bindings = $query [ 'bindings' ];
$realSql = $sqlWithPlaceholders ;
if ( count ( $bindings ) > 0 ) {
$realSql = vsprintf ( $sqlWithPlaceholders , array_map ([ $pdo , 'quote' ], $bindings ));
}
$queryFormatted [] = $realSql ;
2021-04-26 20:37:17 +08:00
}
if ( $all ) {
2021-06-10 21:07:20 +08:00
return nexus_json_encode ( $queryFormatted );
2021-04-26 20:37:17 +08:00
}
2021-06-10 21:07:20 +08:00
return $queryFormatted [ 0 ];
2021-04-26 20:37:17 +08:00
}
2021-05-18 02:37:39 +08:00
function format_datetime ( $datetime , $format = 'Y-m-d H:i' )
2021-04-26 20:37:17 +08:00
{
2022-06-17 00:29:26 +08:00
if ( empty ( $datetime )) {
return '' ;
}
2022-06-08 20:47:34 +08:00
try {
$carbonTime = \Carbon\Carbon :: parse ( $datetime );
2022-06-08 23:10:32 +08:00
return $carbonTime -> format ( $format );
2022-06-08 20:47:34 +08:00
} catch ( \Exception ) {
do_log ( " Invalid datetime: $datetime " , 'error' );
return $datetime ;
2021-04-26 20:37:17 +08:00
}
}
2021-04-27 02:44:44 +08:00
2021-04-29 02:52:22 +08:00
function nexus_trans ( $key , $replace = [], $locale = null )
2021-04-27 02:44:44 +08:00
{
2022-08-10 17:38:05 +08:00
return \Nexus\Nexus :: trans ( $key , $replace , $locale );
2021-04-27 02:44:44 +08:00
}
2021-06-01 23:33:28 +08:00
function isRunningInConsole () : bool
{
2022-04-01 23:13:42 +08:00
return ! RUNNING_IN_OCTANE && php_sapi_name () == 'cli' ;
2021-06-01 23:33:28 +08:00
}
2021-06-09 02:23:09 +08:00
2022-05-14 15:19:10 +08:00
function isRunningOnWindows () : bool
{
return ! RUNNING_IN_OCTANE && strtoupper ( substr ( PHP_OS , 0 , 3 )) === 'WIN' ;
}
function command_exists ( $command ) : bool
{
return ! ( trim ( exec ( " command -v $command " )) == '' );
}
2022-04-01 23:13:42 +08:00
function get_tracker_schema_and_host ( $combine = false ) : array | string
2021-06-09 02:23:09 +08:00
{
global $https_announce_urls , $announce_urls ;
$httpsAnnounceUrls = array_filter ( $https_announce_urls );
$log = " cookie: " . json_encode ( $_COOKIE ) . " , https_announce_urls: " . json_encode ( $httpsAnnounceUrls );
2022-04-07 19:08:02 +08:00
if (
( isset ( $_COOKIE [ " c_secure_tracker_ssl " ]) && $_COOKIE [ " c_secure_tracker_ssl " ] == base64 ( " yeah " ))
|| ! empty ( $httpsAnnounceUrls )
|| isHttps ()
) {
$log .= " , c_secure_tracker_ssl = base64('yeah'): " . base64 ( " yeah " ) . " , or not empty https_announce_urls, or isHttps() " ;
2021-06-09 02:23:09 +08:00
$tracker_ssl = true ;
} else {
$tracker_ssl = false ;
}
$log .= " , tracker_ssl: $tracker_ssl " ;
if ( $tracker_ssl == true ){
$ssl_torrent = " https:// " ;
if ( $https_announce_urls [ 0 ] != " " ) {
$log .= " , https_announce_urls not empty, use it " ;
$base_announce_url = $https_announce_urls [ 0 ];
} else {
$log .= " , https_announce_urls empty, use announce_urls[0] " ;
$base_announce_url = $announce_urls [ 0 ];
}
2022-04-01 23:13:42 +08:00
} else {
2021-06-09 02:23:09 +08:00
$ssl_torrent = " http:// " ;
$base_announce_url = $announce_urls [ 0 ];
}
do_log ( $log );
2022-04-01 23:13:42 +08:00
if ( $combine ) {
return $ssl_torrent . $base_announce_url ;
}
2021-06-10 00:50:17 +08:00
return compact ( 'ssl_torrent' , 'base_announce_url' );
2021-06-09 02:23:09 +08:00
}
2021-06-21 02:01:26 +08:00
2022-04-01 23:13:42 +08:00
2021-06-21 02:01:26 +08:00
function get_hr_ratio ( $uped , $downed )
{
if ( $downed > 0 ) {
$ratio = $uped / $downed ;
$color = get_ratio_color ( $ratio );
if ( $ratio > 10000 ) $ratio = 'Inf.' ;
else
$ratio = number_format ( $ratio , 3 );
if ( $color )
$ratio = " <font color= \" " . $color . " \" > " . $ratio . " </font> " ;
} elseif ( $uped > 0 )
$ratio = 'Inf.' ;
else
$ratio = " --- " ;
return $ratio ;
}
2022-03-20 22:14:00 +08:00
2022-04-25 14:52:59 +08:00
function get_row_count ( $table , $suffix = " " )
{
$r = sql_query ( " SELECT COUNT(*) FROM $table $suffix " ) or sqlerr ( __FILE__ , __LINE__ );
$a = mysql_fetch_row ( $r );
return $a [ 0 ];
}
2022-08-22 21:39:20 +08:00
function get_user_row ( $id )
{
global $Cache , $CURUSER ;
static $curuserRowUpdated = false ;
2022-08-23 01:02:54 +08:00
static $neededColumns = array (
'id' , 'noad' , 'class' , 'enabled' , 'privacy' , 'avatar' , 'signature' , 'uploaded' , 'downloaded' , 'last_access' , 'username' , 'donor' ,
'donoruntil' , 'leechwarn' , 'warned' , 'title' , 'downloadpos' , 'parked' , 'clientselect' , 'showclienterror' ,
);
2022-08-22 21:39:20 +08:00
$cacheKey = 'user_' . $id . '_content' ;
$row = \Nexus\Database\NexusDB :: remember ( $cacheKey , 900 , function () use ( $id , $neededColumns ) {
$user = \App\Models\User :: query () -> with ([ 'wearing_medals' ]) -> find ( $id , $neededColumns );
2022-08-23 01:02:54 +08:00
if ( ! $user ) {
return null ;
}
$arr = $user -> toArray ();
$userRep = new \App\Repositories\UserRepository ();
$metas = $userRep -> listMetas ( $id , \App\Models\UserMeta :: META_KEY_PERSONALIZED_USERNAME );
if ( $metas -> isNotEmpty ()) {
$arr [ '__is_rainbow' ] = 1 ;
} else {
$arr [ '__is_rainbow' ] = 0 ;
2022-08-22 21:39:20 +08:00
}
2022-08-23 01:02:54 +08:00
return $arr ;
2022-08-22 21:39:20 +08:00
});
// if ($CURUSER && $id == $CURUSER['id']) {
// $row = array();
// foreach($neededColumns as $column) {
// $row[$column] = $CURUSER[$column];
// }
// if (!$curuserRowUpdated) {
// $Cache->cache_value('user_'.$CURUSER['id'].'_content', $row, 900);
// $curuserRowUpdated = true;
// }
// } elseif (!$row = $Cache->get_value('user_'.$id.'_content')){
// $res = sql_query("SELECT ".implode(',', $neededColumns)." FROM users WHERE id = ".sqlesc($id)) or sqlerr(__FILE__,__LINE__);
// $row = mysql_fetch_array($res);
// $Cache->cache_value('user_'.$id.'_content', $row, 900);
// }
if ( ! $row )
return false ;
else return $row ;
}
function get_user_class ()
{
if ( IN_NEXUS ) {
global $CURUSER ;
return $CURUSER [ " class " ] ? ? '' ;
}
return auth () -> user () -> class ;
}
function get_user_id ()
{
if ( IN_NEXUS ) {
global $CURUSER ;
return $CURUSER [ " id " ] ? ? 0 ;
}
return auth () -> user () -> id ? ? 0 ;
}
2022-03-20 22:14:00 +08:00
function nexus ()
{
return \Nexus\Nexus :: instance ();
}
2022-03-30 15:37:11 +08:00
function site_info ()
{
$setting = \App\Models\Setting :: get ( 'basic' );
$siteInfo = [
'site_name' => $setting [ 'SITENAME' ],
'base_url' => getSchemeAndHttpHost (),
];
return $siteInfo ;
}
2022-04-18 19:07:35 +08:00
function isIPV4 ( $ip )
{
return filter_var ( $ip , FILTER_VALIDATE_IP , FILTER_FLAG_IPV4 );
}
function isIPV6 ( $ip )
{
return filter_var ( $ip , FILTER_VALIDATE_IP , FILTER_FLAG_IPV6 );
}
2022-06-03 03:42:53 +08:00
function add_filter ( $name , $function , $priority = 10 , $argc = 1 )
{
global $hook ;
$hook -> addFilter ( $name , $function , $priority , $argc );
}
2022-06-08 14:15:59 +08:00
function apply_filter ( $name , ... $args )
2022-06-03 03:42:53 +08:00
{
global $hook ;
2022-08-20 19:11:28 +08:00
// do_log("[APPLY_FILTER]: $name");
2022-06-08 14:15:59 +08:00
return $hook -> applyFilter ( ... func_get_args ());
2022-06-03 03:42:53 +08:00
}
function add_action ( $name , $function , $priority = 10 , $argc = 1 )
{
global $hook ;
$hook -> addAction ( $name , $function , $priority , $argc );
}
function do_action ( $name , ... $args )
{
global $hook ;
2022-08-20 19:11:28 +08:00
// do_log("[DO_ACTION]: $name");
2022-06-08 14:15:59 +08:00
return $hook -> doAction ( ... func_get_args ());
2022-06-03 03:42:53 +08:00
}
2022-07-23 15:05:32 +08:00
function isIPSeedBox ( $ip , $uid = null , $withoutCache = false ) : bool
{
2022-07-29 03:34:55 +08:00
$key = " nexus_is_ip_seed_box:ip: $ip :uid: $uid " ;
$cacheData = \Nexus\Database\NexusDB :: cache_get ( $key );
2022-07-30 15:06:51 +08:00
if ( in_array ( $cacheData , [ 0 , 1 , '0' , '1' ], true ) && ! $withoutCache ) {
do_log ( " $key , get result from cache: $cacheData ( " . gettype ( $cacheData ) . " ) " );
2022-07-29 03:34:55 +08:00
return ( bool ) $cacheData ;
2022-07-23 15:05:32 +08:00
}
$ipObject = \PhpIP\IP :: create ( $ip );
$ipNumeric = $ipObject -> numeric ();
$ipVersion = $ipObject -> getVersion ();
$checkSeedBoxAdminSql = sprintf (
'select id from seed_box_records where `ip_begin_numeric` <= "%s" and `ip_end_numeric` >= "%s" and `type` = %s and `version` = %s and `status` = %s limit 1' ,
$ipNumeric , $ipNumeric , \App\Models\SeedBoxRecord :: TYPE_ADMIN , $ipVersion , \App\Models\SeedBoxRecord :: STATUS_ALLOWED
);
$res = \Nexus\Database\NexusDB :: select ( $checkSeedBoxAdminSql );
if ( ! empty ( $res )) {
2022-07-30 15:06:51 +08:00
\Nexus\Database\NexusDB :: cache_put ( $key , 1 , 300 );
2022-07-29 03:34:55 +08:00
do_log ( " $key , get result from admin, true " );
2022-07-23 15:05:32 +08:00
return true ;
}
if ( $uid !== null ) {
$checkSeedBoxUserSql = sprintf (
'select id from seed_box_records where `ip_begin_numeric` <= "%s" and `ip_end_numeric` >= "%s" and `uid` = %s and `type` = %s and `version` = %s and `status` = %s limit 1' ,
$ipNumeric , $ipNumeric , $uid , \App\Models\SeedBoxRecord :: TYPE_USER , $ipVersion , \App\Models\SeedBoxRecord :: STATUS_ALLOWED
);
$res = \Nexus\Database\NexusDB :: select ( $checkSeedBoxUserSql );
if ( ! empty ( $res )) {
2022-07-30 15:06:51 +08:00
\Nexus\Database\NexusDB :: cache_put ( $key , 1 , 300 );
2022-07-29 03:34:55 +08:00
do_log ( " $key , get result from user, true " );
2022-07-23 15:05:32 +08:00
return true ;
}
}
2022-07-30 15:06:51 +08:00
\Nexus\Database\NexusDB :: cache_put ( $key , 0 , 300 );
2022-07-29 03:34:55 +08:00
do_log ( " $key , no result, false " );
2022-07-23 15:05:32 +08:00
return false ;
}
2022-07-23 23:35:43 +08:00
function getDataTraffic ( array $torrent , array $queries , array $user , $peer , $snatch , $promotionInfo )
{
if ( ! isset ( $user [ '__is_donor' ])) {
throw new \InvalidArgumentException ( " user no '__is_donor' field " );
}
$log = sprintf (
" torrent: %s, user: %s, peerUploaded: %s, peerDownloaded: %s, queriesUploaded: %s, queriesDownloaded: %s " ,
$torrent [ 'id' ], $user [ 'id' ], $peer [ 'uploaded' ] ? ? '' , $peer [ 'downloaded' ] ? ? '' , $queries [ 'uploaded' ], $queries [ 'downloaded' ]
);
if ( ! empty ( $peer )) {
$realUploaded = max ( bcsub ( $queries [ 'uploaded' ], $peer [ 'uploaded' ]), 0 );
$realDownloaded = max ( bcsub ( $queries [ 'downloaded' ], $peer [ 'downloaded' ]), 0 );
$log .= " , [PEER_EXISTS], realUploaded: $realUploaded , realDownloaded: $realDownloaded , [SP_STATE] " ;
$spStateGlobal = get_global_sp_state ();
$spStateNormal = \App\Models\Torrent :: PROMOTION_NORMAL ;
if ( ! empty ( $promotionInfo ) && isset ( $promotionInfo [ '__ignore_global_sp_state' ])) {
$log .= ', use promotionInfo' ;
$spStateReal = $promotionInfo [ 'sp_state' ];
} elseif ( $spStateGlobal != $spStateNormal ) {
$log .= " , use global " ;
$spStateReal = $spStateGlobal ;
} else {
$log .= " , use torrent individual " ;
$spStateReal = $torrent [ 'sp_state' ];
}
if ( ! isset ( \App\Models\Torrent :: $promotionTypes [ $spStateReal ])) {
$log .= " , spStateReal = $spStateReal , invalid, reset to: $spStateNormal " ;
$spStateReal = $spStateNormal ;
}
$uploaderRatio = get_setting ( 'torrent.uploaderdouble' );
$log .= " , uploaderRatio: $uploaderRatio " ;
if ( $torrent [ 'owner' ] == $user [ 'id' ]) {
//uploader, use the bigger one
$upRatio = max ( $uploaderRatio , \App\Models\Torrent :: $promotionTypes [ $spStateReal ][ 'up_multiplier' ]);
$log .= " , [IS_UPLOADER], upRatio: $upRatio " ;
} else {
$upRatio = \App\Models\Torrent :: $promotionTypes [ $spStateReal ][ 'up_multiplier' ];
$log .= " , [IS_NOT_UPLOADER], upRatio: $upRatio " ;
}
/**
* VIP do not calculate downloaded
* @ since 1.7 . 13
*/
if ( $user [ 'class' ] == \App\Models\User :: CLASS_VIP ) {
$downRatio = 0 ;
$log .= " , [IS_VIP], downRatio: $downRatio " ;
} else {
$downRatio = \App\Models\Torrent :: $promotionTypes [ $spStateReal ][ 'down_multiplier' ];
$log .= " , [IS_NOT_VIP], downRatio: $downRatio " ;
}
} else {
$realUploaded = $queries [ 'uploaded' ];
$realDownloaded = $queries [ 'downloaded' ];
/**
* If peer not exits , user increment = 0 ;
*/
$upRatio = 0 ;
$downRatio = 0 ;
$log .= " , [PEER_NOT_EXISTS], realUploaded: $realUploaded , realDownloaded: $realDownloaded , upRatio: $upRatio , downRatio: $downRatio " ;
}
$uploadedIncrementForUser = $realUploaded * $upRatio ;
$downloadedIncrementForUser = $realDownloaded * $downRatio ;
$log .= " , uploadedIncrementForUser: $uploadedIncrementForUser , downloadedIncrementForUser: $downloadedIncrementForUser " ;
/**
* check seed box rule
*/
$isSeedBoxRuleEnabled = get_setting ( 'seed_box.enabled' ) == 'yes' ;
$log .= " , isSeedBoxRuleEnabled: $isSeedBoxRuleEnabled , user class: { $user [ 'class' ] } , __is_donor: { $user [ '__is_donor' ] } " ;
if ( $isSeedBoxRuleEnabled && ! ( $user [ 'class' ] >= \App\Models\User :: CLASS_VIP || $user [ '__is_donor' ])) {
$isIPSeedBox = isIPSeedBox ( $queries [ 'ip' ], $user [ 'id' ]);
$log .= " , isIPSeedBox: $isIPSeedBox " ;
if ( $isIPSeedBox ) {
$isSeedBoxNoPromotion = get_setting ( 'seed_box.no_promotion' ) == 'yes' ;
$log .= " , isSeedBoxNoPromotion: $isSeedBoxNoPromotion " ;
if ( $isSeedBoxNoPromotion ) {
$uploadedIncrementForUser = $realUploaded ;
$downloadedIncrementForUser = $realDownloaded ;
$log .= " , isIPSeedBox && isSeedBoxNoPromotion, increment for user = real " ;
}
$maxUploadedTimes = get_setting ( 'seed_box.max_uploaded' );
if ( ! empty ( $snatch ) && isset ( $torrent [ 'size' ]) && $snatch [ 'uploaded' ] >= $torrent [ 'size' ] * $maxUploadedTimes ) {
$log .= " , snatchUploaded >= torrentSize * times( $maxUploadedTimes ), uploadedIncrementForUser = 0 " ;
$uploadedIncrementForUser = 0 ;
}
}
}
$result = [
'uploaded_increment' => $realUploaded ,
'uploaded_increment_for_user' => $uploadedIncrementForUser ,
'downloaded_increment' => $realDownloaded ,
'downloaded_increment_for_user' => $downloadedIncrementForUser ,
];
do_log ( " $log , result: " . json_encode ( $result ), 'info' );
return $result ;
}
2022-08-10 17:38:05 +08:00
function clear_user_cache ( $uid , $passkey = '' )
{
2022-08-22 21:07:06 +08:00
do_log ( " uid: $uid , passkey: $passkey " );
2022-08-10 17:38:05 +08:00
\Nexus\Database\NexusDB :: cache_del ( " user_ { $uid } _content " );
2022-08-22 21:07:06 +08:00
\Nexus\Database\NexusDB :: cache_del ( " user_ { $uid } _permissions " );
\Nexus\Database\NexusDB :: cache_del ( " user_ { $uid } _roles " );
2022-08-10 17:38:05 +08:00
if ( $passkey ) {
\Nexus\Database\NexusDB :: cache_del ( 'user_passkey_' . $passkey . '_content' );
}
}
2022-08-19 15:30:16 +08:00
function clear_setting_cache ()
{
\Nexus\Database\NexusDB :: cache_del ( 'nexus_settings_in_laravel' );
\Nexus\Database\NexusDB :: cache_del ( 'nexus_settings_in_nexus' );
}
2022-08-22 21:07:06 +08:00
function clear_staff_message_cache ()
{
do_log ( " clear_staff_message_cache " );
\App\Repositories\MessageRepository :: updateStaffMessageCountCache ( false );
}
2022-08-20 19:11:28 +08:00
function user_can ( $permission , $fail = false , $uid = 0 ) : bool
2022-08-19 15:30:16 +08:00
{
2022-08-22 21:07:06 +08:00
$log = " permission: $permission , fail: $fail , user: $uid " ;
static $userCanCached = [];
2022-08-19 15:30:16 +08:00
if ( $uid == 0 ) {
$uid = get_user_id ();
2022-08-22 21:07:06 +08:00
$log .= " , set current uid: $uid " ;
2022-08-19 15:30:16 +08:00
}
if ( $uid <= 0 ) {
2022-08-22 21:07:06 +08:00
do_log ( " $log , no uid, false " );
2022-08-19 15:30:16 +08:00
return false ;
}
2022-08-22 21:07:06 +08:00
if ( ! $fail && isset ( $userCanCached [ $permission ][ $uid ])) {
return $userCanCached [ $permission ][ $uid ];
}
2022-08-20 19:11:28 +08:00
$userInfo = get_user_row ( $uid );
2022-08-22 21:07:06 +08:00
$log .= " , userClass: " . $userInfo [ 'class' ];
if ( $userInfo [ 'class' ] == \App\Models\User :: CLASS_STAFF_LEADER ) {
2022-08-20 19:11:28 +08:00
do_log ( " $log , CLASS_STAFF_LEADER, true " );
2022-08-22 21:07:06 +08:00
$userCanCached [ $permission ][ $uid ] = true ;
2022-08-20 19:11:28 +08:00
return true ;
}
2022-08-22 21:07:06 +08:00
$userAllPermissions = \App\Repositories\ToolRepository :: listUserAllPermissions ( $uid );
$result = in_array ( $permission , $userAllPermissions );
$log .= " , userAllPermissions: " . json_encode ( $userAllPermissions ) . " , result: $result " ;
2022-08-20 19:11:28 +08:00
if ( ! $fail || $result ) {
2022-08-20 21:07:29 +08:00
do_log ( $log );
2022-08-22 21:07:06 +08:00
$userCanCached [ $permission ][ $uid ] = $result ;
2022-08-19 15:30:16 +08:00
return $result ;
}
2022-08-20 21:07:29 +08:00
do_log ( " $log , [FAIL] " );
2022-08-20 19:11:28 +08:00
if ( IN_NEXUS && ! IN_TRACKER ) {
global $lang_functions ;
2022-08-22 21:07:06 +08:00
$requireClass = get_setting ( " authority. $permission " );
if ( isset ( \App\Models\User :: $classes [ $requireClass ])) {
2022-08-20 19:11:28 +08:00
stderr ( $lang_functions [ 'std_sorry' ], $lang_functions [ 'std_permission_denied_only' ] . get_user_class_name ( $requireClass , false , true , true ) . $lang_functions [ 'std_or_above_can_view' ], false );
} else {
stderr ( $lang_functions [ 'std_error' ], $lang_functions [ 'std_permission_denied' ]);
}
2022-08-19 15:30:16 +08:00
}
2022-08-20 21:07:29 +08:00
throw new \App\Exceptions\InsufficientPermissionException ();
2022-08-19 15:30:16 +08:00
}