hnschat-web/etc/functions.php
2024-04-16 22:26:30 +00:00

487 lines
12 KiB
PHP

<?php
function error($message) {
$output = [
"success" => false,
"message" => $message
];
die(json_encode($output));
}
function generateID($length) {
$alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
$pass = array();
$alphaLength = strlen($alphabet) - 1;
for ($i = 0; $i < $length; $i++) {
$n = rand(0, $alphaLength);
$pass[] = $alphabet[$n];
}
return implode($pass);
}
function generateNumber($length) {
$alphabet = '123456789';
$pass = array();
$alphaLength = strlen($alphabet) - 1;
for ($i = 0; $i < $length; $i++) {
$n = rand(0, $alphaLength);
$pass[] = $alphabet[$n];
}
return implode($pass);
}
function generateCode($type) {
switch ($type) {
case "session":
$db = "sessions";
$param = "id";
$length = 32;
$prefix = "V2-";
break;
case "domain":
$db = "domains";
$param = "id";
$length = 16;
break;
case "preview":
$db = "previews";
$param = "id";
$length = 16;
break;
case "upload":
$db = "uploads";
$param = "id";
$length = 32;
break;
default:
return;
}
tryAgain:
$id = generateID($length);
$checkExists = sql("SELECT * FROM `".$db."` WHERE `".$param."` = ?", [@$prefix.$id]);
if ($checkExists) {
goto tryAgain;
}
return $id;
}
function guidv4($data) {
assert(strlen($data) == 16);
$data[6] = chr(ord($data[6]) & 0x0f | 0x40); // set version to 0100
$data[8] = chr(ord($data[8]) & 0x3f | 0x80); // set bits 6-7 to 10
return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
}
function verifyTransaction($tx, $amount) {
$amount = preg_replace("/[^0-9]/", "", $amount);
$address = "hs1qf0cxy6ukhgjlmqfhe0tpw800t2tcul4s0szwqa";
$response = queryHSW("/wallet/hnschat-hip-2/tx/".$tx);
foreach (@$response["outputs"] as $key => $output) {
if (@$response["confirmations"] >= 2 && $output["value"] == $amount && $output["address"] = $address) {
return true;
}
}
return false;
}
function tldForDomain($domain) {
$split = explode(".", $domain);
$tld = end($split);
return $tld;
}
function domainForID($id) {
$getDomain = @sql("SELECT * FROM `domains` WHERE `id` = ?", [$id])[0];
if ($getDomain) {
return $getDomain;
}
return false;
}
function domainForName($name) {
$getDomain = @sql("SELECT * FROM `domains` WHERE `domain` = ?", [$name])[0];
if ($getDomain) {
return $getDomain;
}
return false;
}
function activeDomainForName($name) {
$getDomain = @sql("SELECT * FROM `domains` WHERE `domain` = ? AND `claimed` = 1 AND `locked` = 0 AND `deleted` = 0", [$name])[0];
if ($getDomain) {
return $getDomain;
}
return false;
}
function channelForID($id) {
$getChannel = @sql("SELECT * FROM `channels` WHERE `id` = ?", [$id])[0];
if ($getChannel) {
return $getChannel;
}
return false;
}
function getStakedNames() {
$getNames = sql("SELECT `name` FROM `channels` WHERE `slds` = 1 AND `hidden` = 0 ORDER BY `name` ASC");
$names = [];
foreach ($getNames as $key => $value) {
$names[] = $value["name"];
}
return $names;
}
function getStakedHIP2Names() {
$getNames = sql("SELECT `name` FROM `channels` WHERE `slds` = 1 AND `hip2` = 1 AND `hidden` = 0 ORDER BY `name` ASC");
$names = [];
foreach ($getNames as $key => $value) {
$names[] = $value["name"];
}
return $names;
}
function isNameStaked($tld) {
if ($tld === "eth") {
return "ens";
}
$data = [
"method" => "getnameresource",
"params" => [$tld],
];
$response = queryHSD($data);
if (@$response["records"]) {
foreach ($response["records"] as $key => $value) {
if ($value["type"] == "NS") {
if (stripos($value["ns"], ".nameserver.io.") !== false || stripos($value["ns"], ".registry.namebase.io.") !== false) {
return "namebase";
}
if ($value["ns"] == "0x06081C6B2B876EABDC41DFD3345e8Fa59588C02e._eth.") {
return "impervious";
}
}
}
}
$hshub = checkVaro($tld);
if ($hshub) {
return "varo";
}
return false;
}
function checkVaro($tld) {
$url = "https://hshub.io/tld/".$tld;
$html = getContents($url);
$canPurchase = preg_match("/<div class=\"title\">Buy \./", $html);
if ($canPurchase) {
return true;
}
return false;
}
function avatarFromTXT($content) {
if ((substr($content, 0, 7) === "avatar=" || substr($content, 0, 15) === "profile avatar=")) {
if (substr($content, 0, 15) === "profile avatar=") {
$avatar = substr($content, 15);
}
else {
$avatar = substr($content, 7);
}
}
if (!filter_var(@$avatar, FILTER_VALIDATE_URL) === false) {
return $avatar;
}
return false;
}
function fetchAvatar($domain) {
if ($domain) {
$getRecords = shell_exec("dig @127.0.0.44 +noall +answer +noidnin +noidnout ".escapeshellarg($domain)." TXT");
preg_match_all("/(?<domain>.+)\..+TXT\s\"(?<value>.+)\"/", $getRecords, $matches);
if ($matches) {
foreach ($matches["domain"] as $key => $data) {
if ($data === $domain) {
$value = $matches["value"][$key];
$avatar = avatarFromTXT($value);
if ($avatar) {
return $avatar;
}
}
}
}
if (strpos($domain, ".") == false) {
$data = [
"method" => "getnameresource",
"params" => [$domain],
];
$response = queryHSD($data);
if ($response) {
$records = @$response["records"];
if ($records) {
foreach ($records as $key => $record) {
if (@$record["txt"]) {
$content = @$record["txt"][0];
$avatar = avatarFromTXT($content);
if ($avatar) {
return $avatar;
}
}
}
}
}
}
}
return false;
}
function getContents($url) {
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_PROXY, "127.0.0.1:8080");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($curl, CURLOPT_TIMEOUT, 5);
$c = curl_exec($curl);
curl_close($curl);
return $c;
}
function getContentsWithCode($url) {
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_PROXY, "127.0.0.1:8080");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($curl, CURLOPT_TIMEOUT, 5);
$data = curl_exec($curl);
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
return [
"data" => $data,
"code" => $code
];
}
function getContentsWithSpoof($url) {
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_PROXY, "127.0.0.1:8080");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($curl, CURLOPT_TIMEOUT, 5);
curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (compatible; Googlebot/2.1; +http://google.com/bot.html)");
$c = curl_exec($curl);
curl_close($curl);
return $c;
}
function post($url, $data) {
$ch = curl_init($url);
$payload = json_encode($data);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
function fetchMetaTags($url) {
$output = [];
if (filter_var($url, FILTER_VALIDATE_URL) !== false) {
libxml_use_internal_errors(true);
$c = getContentsWithSpoof($url);
if ($c) {
$d = new DomDocument();
$d->loadHTML($c);
$xp = new domxpath($d);
foreach ($xp->query("//title") as $el) {
$output["title"] = $el->textContent;
}
foreach ($xp->query("//meta[@property='og:title']") as $el) {
$output["title"] = $el->getAttribute("content");
}
foreach ($xp->query("//meta[@name='og:title']") as $el) {
$output["title"] = $el->getAttribute("content");
}
foreach ($xp->query("//meta[@property='description']") as $el) {
$output["description"] = $el->getAttribute("content");
}
foreach ($xp->query("//meta[@name='description']") as $el) {
$output["description"] = $el->getAttribute("content");
}
foreach ($xp->query("//meta[@property='og:description']") as $el) {
$output["description"] = $el->getAttribute("content");
}
foreach ($xp->query("//meta[@name='og:description']") as $el) {
$output["description"] = $el->getAttribute("content");
}
foreach ($xp->query("//meta[@property='og:image']") as $el) {
$image = $el->getAttribute("content");
if (validImage($image)) {
$output["image"] = $image;
}
}
foreach ($xp->query("//meta[@name='og:image']") as $el) {
$image = $el->getAttribute("content");
if (validImage($image)) {
$output["image"] = $image;
}
}
foreach ($xp->query("//meta[@property='og:video:secure_url']") as $el) {
$output["video"] = $el->getAttribute("content");
}
foreach ($xp->query("//meta[@name='og:video:secure_url']") as $el) {
$output["video"] = $el->getAttribute("content");
}
}
}
if (@$output["title"]) {
$id = generateCode("preview");
$insert = sql("INSERT INTO `previews` (id, link, title, description, image, video) VALUES (?,?,?,?,?,?)", [$id, $url, @$output["title"], @$output["description"], @$output["image"], @$output["video"]]);
if ($insert) {
$output["id"] = $id;
}
}
return $output;
}
function validImage($url) {
$string = getContents($url);
if ($string) {
$id = generateID(16);
$file = "/tmp/".$id;
$f = fopen($file, 'wb');
fputs($f, $string);
fclose($f);
$size = getimagesize($file);
unlink($file);
}
return (strtolower(substr(@$size['mime'], 0, 5)) == 'image' ? true : false);
}
function validImageWithoutFetch($string) {
if ($string) {
$id = generateID(16);
$file = "/tmp/".$id;
$f = fopen($file, 'wb');
fputs($f, $string);
fclose($f);
$size = getimagesize($file);
unlink($file);
}
return (strtolower(substr(@$size['mime'], 0, 5)) == 'image' ? true : false);
}
function validateAddress($address) {
$data = [
"method" => "validateaddress",
"params" => [$address],
];
$response = queryHSD($data);
if (@$response["isvalid"] && @$response["isspendable"]) {
return true;
}
return false;
}
function queryHSD($data) {
if (@$data["params"]) {
foreach ($data["params"] as $key => $value) {
$data["params"][$key] = trim($value);
}
}
$curl = curl_init();
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($curl, CURLOPT_HTTPHEADER, ["Content-Type:application/json"]);
curl_setopt($curl, CURLOPT_URL,"http://x:a831d3c59ce474d8e13a7cea3a3935d3d5a55b84698abe38f2eea2329327e2c50@127.0.0.1:12037");
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($curl);
curl_close ($curl);
if ($response) {
$info = @json_decode($response, true);
if (@$info["result"]) {
return $info["result"];
}
}
return false;
}
function queryHSW($endpoint) {
$endpoint = trim($endpoint);
$curl = curl_init();
curl_setopt($curl, CURLOPT_HTTPHEADER, ["Content-Type:application/json"]);
curl_setopt($curl, CURLOPT_URL,"http://x:a831d3c59ce474d8e13a7cea3a3935d3d5a55b84698abe38f2eea2329327e2c50@127.0.0.1:12039".$endpoint);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($curl);
curl_close ($curl);
if ($response) {
$info = @json_decode($response, true);
if (@$info) {
return $info;
}
}
return false;
}
?>