summaryrefslogtreecommitdiff
path: root/localwebsite/functions.php
diff options
context:
space:
mode:
Diffstat (limited to 'localwebsite/functions.php')
-rw-r--r--localwebsite/functions.php255
1 files changed, 255 insertions, 0 deletions
diff --git a/localwebsite/functions.php b/localwebsite/functions.php
new file mode 100644
index 0000000..c0c4479
--- /dev/null
+++ b/localwebsite/functions.php
@@ -0,0 +1,255 @@
+<?php
+
+function param($key) {
+ global $RouterInput;
+
+ $val = null;
+
+ if (isset($RouterInput[$key])) {
+ $val = $RouterInput[$key];
+ } else if (isset($_POST[$key])) {
+ $val = $_POST[$key];
+ } else if (isset($_GET[$key])) {
+ $val = $_GET[$key];
+ }
+
+ if (is_array($val)) {
+ $val = implode($val);
+ }
+ return $val;
+}
+
+function str_replace_once(string $needle, string $replace, string $haystack): string {
+ $pos = strpos($haystack, $needle);
+ if ($pos !== false) {
+ $haystack = substr_replace($haystack, $replace, $pos, strlen($needle));
+ }
+ return $haystack;
+}
+
+function htmlescape($s) {
+ if (is_array($s)) {
+ foreach ($s as $k => $v) {
+ $s[$k] = htmlescape($v);
+ }
+ return $s;
+ }
+ return htmlspecialchars($s, ENT_QUOTES, 'UTF-8');
+}
+
+function jsonEncode($obj) {
+ return json_encode($obj, JSON_UNESCAPED_UNICODE);
+}
+
+function jsonDecode($json) {
+ return json_decode($json, true);
+}
+
+function startsWith(string $haystack, string $needle): bool {
+ return $needle === "" || strpos($haystack, $needle) === 0;
+}
+
+function endsWith(string $haystack, string $needle): bool {
+ return $needle === "" || substr($haystack, -strlen($needle)) === $needle;
+}
+
+function exectime($format = null) {
+ $time = round(microtime(true) - START_TIME, 4);
+ if (!is_null($format)) {
+ $time = sprintf($format, $time);
+ }
+ return $time;
+}
+
+function stransi($s) {
+ static $colors = [
+ 'black' => 0,
+ 'red' => 1,
+ 'green' => 2,
+ 'yellow' => 3,
+ 'blue' => 4,
+ 'magenta' => 5,
+ 'cyan' => 6,
+ 'white' => 7
+ ];
+ static $valid_styles = ['bold', 'fgbright', 'bgbright'];
+
+ $s = preg_replace_callback('/<(?:e ([a-z, =]+)|\/e)>/', function($match) use ($colors, $valid_styles) {
+ if (empty($match[1])) {
+ return "\033[0m";
+ } else {
+ $codes = [];
+ $args = preg_split('/ +/', $match[1]);
+ $fg = null;
+ $bg = null;
+ $styles = [];
+ foreach ($args as $arg) {
+ list($argname, $argvalue) = explode('=', $arg);
+ $err = false;
+ if ($argname == 'fg' || $argname == 'bg') {
+ if (isset($colors[$argvalue])) {
+ $$argname = $colors[$argvalue];
+ } else {
+ $err = true;
+ }
+ } else if ($argname == 'style') {
+ $argstyles = array_filter(explode(',', $argvalue));
+ foreach ($argstyles as $style) {
+ if (!in_array($style, $valid_styles)) {
+ $err = true;
+ break;
+ }
+ }
+ if (!$err) {
+ foreach ($argstyles as $style) {
+ $styles[$style] = true;
+ }
+ }
+ } else {
+ $err = true;
+ }
+
+ if ($err) {
+ trigger_error(__FUNCTION__.": unrecognized argument {$arg}", E_USER_WARNING);
+ }
+ }
+
+ if (!is_null($fg)) {
+ $codes[] = $fg + (isset($styles['fgbright']) ? 90 : 30);
+ }
+ if (!is_null($bg)) {
+ $codes[] = $bg + (isset($styles['bgbright']) ? 100 : 40);
+ }
+ if (isset($styles['bold'])) {
+ $codes[] = 1;
+ }
+
+ return !empty($codes) ? "\033[".implode(';', $codes)."m" : '';
+ }
+ }, $s);
+ return $s;
+}
+
+function strgen($len = 10): string {
+ $buf = '';
+ for ($i = 0; $i < $len; $i++) {
+ $j = mt_rand(0, 61);
+ if ($j >= 36) {
+ $j += 13;
+ } else if ($j >= 10) {
+ $j += 7;
+ }
+ $buf .= chr(48 + $j);
+ }
+ return $buf;
+}
+
+function setperm($file, $is_dir = null) {
+ global $config;
+
+ // chgrp
+ $gid = filegroup($file);
+ $gname = posix_getgrgid($gid);
+ if (!is_array($gname)) {
+ debugError(__FUNCTION__.": posix_getgrgid() failed on $gid", $gname);
+ } else {
+ $gname = $gname['name'];
+ }
+ if ($gname != $config['group']) {
+ if (!chgrp($file, $config['group'])) {
+ debugError(__FUNCTION__.": chgrp() failed on $file");
+ }
+ }
+
+ // chmod
+ $perms = fileperms($file);
+ $need_perms = is_dir($file) ? $config['dirs_mode'] : $config['files_mode'];
+ if (($perms & $need_perms) !== $need_perms) {
+ if (!chmod($file, $need_perms)) {
+ debugError(__FUNCTION__.": chmod() failed on $file");
+ }
+ }
+}
+
+function redirect($url, $preserve_utm = true, $no_ajax = false) {
+ if (PHP_SAPI != 'cli' && $_SERVER['REQUEST_METHOD'] == 'GET' && $preserve_utm) {
+ $proxy_params = ['utm_source', 'utm_medium', 'utm_content', 'utm_campaign'];
+ $params = [];
+ foreach ($proxy_params as $p) {
+ if (!empty($_GET[$p])) {
+ $params[$p] = (string)$_GET[$p];
+ }
+ }
+ if (!empty($params)) {
+ if (($anchor_pos = strpos($url, '#')) !== false) {
+ $anchor = substr($url, $anchor_pos+1);
+ $url = substr($url, 0, $anchor_pos);
+ }
+ $url .= (strpos($url, '?') === false ? '?' : '&').http_build_query($params);
+ if ($anchor_pos !== false) {
+ $url .= '#'.$anchor;
+ }
+ }
+ }
+
+ header('Location: ' . $url);
+ exit;
+}
+
+function is_xhr_request(): bool {
+ return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest';
+}
+
+function secondsToTime(int $n): string {
+ $parts = [];
+
+ if ($n >= 86400) {
+ $days = floor($n / 86400);
+ $n %= 86400;
+ $parts[] = "{$days}д";
+ }
+
+ if ($n >= 3600) {
+ $hours = floor($n / 3600);
+ $n %= 3600;
+ $parts[] = "{$hours}ч";
+ }
+
+ if ($n >= 60) {
+ $minutes = floor($n / 60);
+ $n %= 60;
+ $parts[] = "{$minutes}мин";
+ }
+
+ if ($n)
+ $parts[] = "{$n}сек";
+
+ return implode(' ', $parts);
+}
+
+function bytesToUnitsLabel(GMP $b): string {
+ $ks = array('B', 'Kb', 'Mb', 'Gb', 'Tb');
+ foreach ($ks as $i => $k) {
+ if (gmp_cmp($b, gmp_pow(1024, $i + 1)) < 0) {
+ if ($i == 0)
+ return gmp_strval($b) . ' ' . $k;
+
+ $n = gmp_intval(gmp_div_q($b, gmp_pow(1024, $i)));
+ return round($n, 2).' '.$k;
+ }
+ }
+
+ return gmp_strval($b);
+}
+
+$ShutdownFunctions = [];
+
+function append_shutdown_function(callable $f) {
+ global $ShutdownFunctions;
+ $ShutdownFunctions[] = $f;
+}
+
+function prepend_shutdown_function(callable $f) {
+ global $ShutdownFunctions;
+ array_unshift($ShutdownFunctions, $f);
+} \ No newline at end of file