You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

156 lines
4.5 KiB
JavaScript

// ====================== CONST ======================
const colors = {
ORANGE: 0xd55f30,
YELLOW: 0xd69d27,
GREEN: 0x37A93C,
MINT: 0x25b18f,
AQUA: 0x2ba1cd,
BLUE: 0x297bcd,
VIOLET: 0x825ae7,
PINK: 0xc8589a,
};
function getError(err) {
if (err instanceof DeviceError)
return lang.errors[err.code];
if (err instanceof TimeoutError)
return lang.errors[HubErrors.Timeout];
if (err instanceof DOMException)
return `${err.name}: ${err.message}`
console.log(err);
return `${err}`;
}
// ====================== CHECK ======================
function isSSL() {
return window.location.protocol == 'https:';
}
function userLang() {
switch (navigator.language || navigator.userLanguage) {
case 'ru-RU': case 'ru': return 'Russian';
}
return 'English';
}
// ====================== FUNC ======================
async function switch_ssl(ssl) {
if (ssl && !isSSL()) {
if (await asyncConfirm(lang.redirect + " HTTPS?")) window.location.href = window.location.href.replace('http:', 'https:');
}
if (!ssl && isSSL()) {
if (await asyncConfirm(lang.redirect + " HTTP?")) window.location.href = window.location.href.replace('https:', 'http:');
}
}
function addDOM(el_id, tag, text, target) {
if (EL(el_id)) EL(el_id).remove();
const el = document.createElement(tag);
el.textContent = text;
el.id = el_id;
target.appendChild(el);
return el;
}
String.prototype.hashCode = function () {
if (!this.length) return 0;
let hash = new Uint32Array(1);
for (let i = 0; i < this.length; i++) {
hash[0] = ((hash[0] << 5) - hash[0]) + this.charCodeAt(i);
}
return hash[0];
}
function openURL(url) {
window.open(url, '_blank').focus();
}
async function copyClip(text) {
try {
await navigator.clipboard.writeText(text);
showPopup(lang.clip_copy);
} catch (e) {
showPopupError(lang.error);
}
}
// ====================== BROWSER ======================
function browser() {
if (navigator.userAgent.includes("Opera") || navigator.userAgent.includes('OPR')) return 'opera';
else if (navigator.userAgent.includes("Edg")) return 'edge';
else if (navigator.userAgent.includes("Chrome")) return 'chrome';
else if (navigator.userAgent.includes("Safari")) return 'safari';
else if (navigator.userAgent.includes("Firefox")) return 'firefox';
else if ((navigator.userAgent.includes("MSIE")) || (!!document.documentMode == true)) return 'IE';
else return 'unknown';
}
function EL(id) {
return document.getElementById(id);
}
function display(id, value) {
EL(id).style.display = value;
}
function showNotif(name, text) {
if (!("Notification" in window) || Notification.permission != 'granted') return;
const descr = name + ' (' + new Date(Date.now()).toLocaleString() + ')';
navigator.serviceWorker.getRegistration().then(function (reg) {
reg.showNotification(text, { body: descr, vibrate: true });
}).catch(e => console.log(e));
}
// ====================== NET ======================
function getMaskList() {
const list = [];
for (let i = 0; i < 33; i++) {
let imask;
if (i == 32) imask = 0xffffffff;
else imask = ~(0xffffffff >>> i);
list.push(`${(imask >>> 24) & 0xff}.${(imask >>> 16) & 0xff}.${(imask >>> 8) & 0xff}.${imask & 0xff}`);
}
return list;
}
function getLocalIP(silent = true) {
/*@[if_target:esp]*/
const ip = window.location.hostname;
if (checkIP(ip)) {
EL('local_ip').value = ip;
hub.config.set('connections', 'HTTP', 'local_ip', ip);
} else if (!silent) {
asyncAlert(lang.p_not_support);
}
/*@/[if_target:esp]*/
/*@[if_not_target:esp]*/
const RTCPeerConnection = window.RTCPeerConnection || window.webkitRTCPeerConnection || window.mozRTCPeerConnection;
if (!RTCPeerConnection) {
if (!silent)
asyncAlert(lang.p_not_support);
return;
}
const rtc = new RTCPeerConnection({ iceServers: [] });
rtc.createDataChannel('', { reliable: false });
rtc.addEventListener("icecandidate", evt => {
if (!evt.candidate) return;
const ip = evt.candidate.address;
if (!ip) return;
if (ip.endsWith('.local')) {
if (!silent)
asyncAlert(`Disable WEB RTC anonymizer: ${browser()}:/`+`/flags/#enable-webrtc-hide-local-ips-with-mdns`);
return;
}
EL('local_ip').value = ip;
hub.config.set('connections', 'HTTP', 'local_ip', ip);
});
rtc.createOffer().then(offerDesc => rtc.setLocalDescription(offerDesc));
/*@/[if_not_target:esp]*/
}
function checkIP(ip) {
return Boolean(ip && ip.match(/^((25[0-5]|(2[0-4]|1[0-9]|[1-9]|)[0-9])(\.(?!$)|$)){4}$/));
}