import titleTrans from "../translate/titleTrans"; import contentTitleLinksTrans from "../translate/contentTitleLinksTrans"; import Device from "../../enum/Device"; import WHNotify from "../utils/WHNotify"; import getWhSettingObj from "../utils/getWhSettingObj"; import addActionBtn from "../utils/addActionBtn"; import addStyle from "../utils/addStyle"; import log from "../utils/@deprecated/log"; import doQuickFly from "./doQuickFly"; import ZhongIcon from "../../class/ZhongIcon"; import WuhuBase from "../../class/WuhuBase"; export default async function travelHelper(): Promise { let { href, bodyAttrs, device } = WuhuBase.glob; let $zhongNode = ZhongIcon.ZhongNode; // URL判断 + 人不在城内 if (href.includes('index.php') && bodyAttrs['data-abroad'] === 'true') { // 飞行中 if (bodyAttrs["data-traveling"] === 'true') { // 飞行闹钟 if (device === Device.PC && getWhSettingObj()['trvAlarm']) { // 获取目的地 let dest_cn; let country = document.body.getAttribute('data-country'); if (country === 'torn') { dest_cn = '回城'; } else { dest_cn = { 'uk': "英国", 'switzerland': "瑞士", 'mexico': '墨西哥', 'canada': '加拿大', 'cayman': '开曼', 'hawaii': '夏威夷', 'argentina': '阿根廷', 'japan': '日本', 'china': '中国', 'uae': 'UAE', 'sa': '南非', }[country] || country; } // 剩余时间 const remaining_arr = document.querySelector('#countrTravel').getAttribute('data-to'); const wh_trv_alarm = localStorage.getItem('wh_trv_alarm') ? JSON.parse(localStorage.getItem('wh_trv_alarm')) : { 'enable': true, 'alert_time': 30, 'node_pos': [240, 240] }; const save_trv_settings = () => localStorage.setItem('wh_trv_alarm', JSON.stringify(wh_trv_alarm)); const wh_trv_alarm_node = document.createElement('div'); wh_trv_alarm_node.id = 'wh-trv-alarm'; wh_trv_alarm_node.style.left = `${ wh_trv_alarm.node_pos[0] }px`; wh_trv_alarm_node.style.top = `${ wh_trv_alarm.node_pos[1] }px`; wh_trv_alarm_node.innerHTML = `

❌ 没有权限
点击网页内任意位置以激活闹钟

飞行闹钟

正在${ dest_cn === '回城' ? dest_cn : '飞往' + dest_cn }

`; addStyle(` #wh-trv-alarm{ position:absolute; width:248px; /*left:${ wh_trv_alarm.node_pos[0] || 240 }px; top:${ wh_trv_alarm.node_pos[1] || 240 }px;*/ background:white; border-radius:4px; box-shadow:#0000001f 0 0 10px 4px; border:solid 1px #aaa; z-index:100001; margin:2em; } #wh-trv-alarm button{ margin:0; } #wh-trv-error{ position:absolute; width:100%; height:100%; /*display: table;*/ display:none; } #wh-trv-error p{ background:#ffd0d0; color:red; display:table-cell; vertical-align:middle; padding:1em; text-align:center; } #wh-trv-alarm-title{ height: 30px; border-bottom: solid #aaa 1px; cursor: move; } /*#wh-trv-alarm-move-btn span{ background:url(/images/v2/home_main/move.svg); width: 30px; height: 30px; float: right; cursor: move; }*/ h5#wh-trv-alarm-header{ height: 100%; line-height: 30px; padding:0 12px; font-weight: bold; text-align: center; } #wh-trv-alarm-bottom{ padding: 12px; } #wh-trv-alarm-remaining{ float:right; color:red; } #wh-trv-alarm-cont input[type="number"]{ width: 42px; border-bottom: solid 1px #aaa; } .wh-trv-alarm-stop-hide{ display:none; } `); document.body.append(wh_trv_alarm_node); // 报错dom const error_node = wh_trv_alarm_node.querySelector('#wh-trv-error') as HTMLElement; // jquery拖动 // @ts-ignore $(wh_trv_alarm_node).draggable({ containment: "body", distance: 5, handle: "#wh-trv-alarm-title", stop: () => { wh_trv_alarm.node_pos = [parseInt(wh_trv_alarm_node.style.left), parseInt(wh_trv_alarm_node.style.top)]; save_trv_settings(); }, scroll: false, }); // 剩余时间dom const remaining_node = wh_trv_alarm_node.querySelector('#wh-trv-alarm-remaining'); // 设定闹钟响的按钮 const set_node = wh_trv_alarm_node.querySelectorAll('#wh-trv-alarm-cont button')[0] as HTMLButtonElement; // 落地前响铃时长 const cd_time = wh_trv_alarm_node.querySelector('input[type="number"]') as HTMLInputElement; let count_down_notify: MyHTMLElement | { close: Function } = { close: () => { } }; set_node.onclick = () => { try { wh_trv_alarm.alert_time = parseInt(cd_time.value); } catch { wh_trv_alarm.alert_time = 30; } save_trv_settings(); set_node.value = wh_trv_alarm.alert_time; count_down_notify.close(); count_down_notify = WHNotify('设置已更新'); }; // 停止响铃按钮 const stop_node = wh_trv_alarm_node.querySelectorAll('#wh-trv-alarm-cont button')[1] as HTMLButtonElement; stop_node.onclick = () => { user_stop_alert = true; stop_node.innerText = '本次已关闭'; stop_node.disabled = true; } // 开启闹钟勾选 const enable_node = wh_trv_alarm_node.querySelector('#wh-trv-alarm-cont input[type="checkbox"]') as HTMLInputElement; let on_off_notify: MyHTMLElement | { close: Function } = { close: () => { } }; enable_node.onchange = ev => { wh_trv_alarm.enable = (ev.target).checked; save_trv_settings(); on_off_notify.close(); on_off_notify = WHNotify(wh_trv_alarm.enable ? '闹钟已开启' : '闹钟已关闭'); }; // 剩余时间 秒 const remaining_sec = parseInt(remaining_arr); // 落地时timestamp const land_timestamp = Date.now() + remaining_sec * 1000; // 音频dom const audio = document.createElement('audio'); audio.src = 'https://www.torn.com/js/chat/sounds/Warble_1.mp3'; audio.play() .then(() => audio.pause()) .catch(() => { error_node.style.display = 'table'; const func = () => { error_node.remove(); document.body.removeEventListener('click', func); }; document.body.addEventListener('click', func); }); // 是否正在响铃 let audio_play_flag = false; // 用户是否停止当前响铃 let user_stop_alert = false; // 响铃循环id let audio_play_id = null; // 响铃的方法 let audio_play_handle = () => { if (user_stop_alert) { clearInterval(audio_play_id); audio_play_id = null; return; } if (!audio_play_flag || !wh_trv_alarm.enable) return; audio.play().then(); }; // 飞机小动画字符 const flying_arr = [ '✈ ', '  ✈ ', '    ✈ ', '      ✈ ', '        ✈ ', '          ✈ ', '            ✈ ', '              ✈ ', '                ✈ ', '                  ✈ ', ]; // 飞行的状态dom const flying_status = wh_trv_alarm_node.querySelector('#wh-trv-status'); // 飞机的小动画dom const flying_ani = flying_status.nextElementSibling; // 飞机的计数 let flying_index = 0; const id = window.setInterval(() => { const remaining_time = (land_timestamp - Date.now()) / 1000 | 0; remaining_node.innerText = `${ remaining_time / 3600 | 0 }时${ remaining_time % 3600 / 60 | 0 }分${ remaining_time % 60 }秒`; if (remaining_time < wh_trv_alarm.alert_time) { // flying_status.innerHTML = `即将落地...`; if (wh_trv_alarm.enable) { // 播放提示音 audio_play_flag = true; if (audio_play_id === null && !user_stop_alert) audio_play_id = window.setInterval(audio_play_handle, 750); stop_node.parentElement.classList.remove('wh-trv-alarm-stop-hide'); } } else { // flying_status.innerHTML = `飞行中...`; if (wh_trv_alarm.enable) { clearInterval(audio_play_id); audio_play_id = null; stop_node.parentElement.classList.add('wh-trv-alarm-stop-hide'); } } flying_ani.innerHTML = `${ flying_arr[flying_index] }`; flying_index = (flying_index + 1) % flying_arr.length; }, 1000); log.info({ dest_cn, remaining_arr, wh_trv_alarm, wh_trv_alarm_node, error_node, remaining_node, set_node, cd_time, count_down_notify, stop_node, enable_node, remaining_sec, land_timestamp, audio, audio_play_flag, user_stop_alert, audio_play_id, flying_status, flying_index, id }); } // 落地转跳 落地前事件 if (getWhSettingObj()['landedRedirect'] && document.querySelector('#tcLogo[title]') === null) { window.addEventListener('beforeunload', () => { let obj = { url: getWhSettingObj()['landedRedirect'], timestamp: Date.now() }; sessionStorage['wh-landed-redirect'] = JSON.stringify(obj); }); } } // 不在飞行中 海外落地页面 else { // 一键回城 addActionBtn('直接回城', travelBack, $zhongNode); // 海外警告 if (getWhSettingObj()['abroadWarning']) { let c = 1; setInterval(() => WHNotify(`警告:您已海外落地${ c++ * 30 }秒`, { timeout: 30, sysNotify: true }), 30000); } // 解毒提醒 if (bodyAttrs['data-country'] === 'switzerland') { let page_title = document.querySelector('h4#skip-to-content'); let msg = document.createElement('div'); msg.innerHTML = ``; msg.classList.add('info-msg-cont', 'green', 'border-round', 'm-bottom10'); page_title.before(msg); } } return; } // URL判断 + 人在城内 else if (href.includes('index.php') && bodyAttrs['data-abroad'] === 'false') { // 落地转跳 if (sessionStorage['wh-landed-redirect']) { let { url, timestamp } = JSON.parse(sessionStorage['wh-landed-redirect']); if (Date.now() - timestamp < 30000) { sessionStorage.removeItem('wh-landed-redirect'); location.href = url; } } } // 起飞页面 if (href.contains(/travelagency\.php/)) { // 起飞提醒 if (getWhSettingObj()['energyAlert']) { const $$ = $('.content-wrapper'); const OB = new MutationObserver(() => { OB.disconnect(); titleTrans(); contentTitleLinksTrans(); trans(); OB.observe($$.get(0), { characterData: true, attributes: true, subtree: true, childList: true }); }); const trans = () => { // 当前能量e const energyBarStr = $('#barEnergy p[class^="bar-value__"]').text().trim(); const [curE, maxE] = energyBarStr.split('/').length === 2 ? [parseInt(energyBarStr.split('/')[0]), parseInt(energyBarStr.split('/')[1])] : [NaN, NaN]; const incTime = maxE === 150 ? 10 : 15; const fullEnergyTime = !(isNaN(curE) || isNaN(maxE)) ? (maxE - 5 - curE) / 5 * incTime + (incTime - new Date().getMinutes() % incTime) : NaN; // 起飞前提示 $('.travel-confirm .travel-question .q-wrap span:nth-of-type(2)').each((i, e) => { if (isNaN(fullEnergyTime)) return; const spl = e.innerText.trim().split(' '); const [hours, minutes] = spl.length === 5 ? [parseInt(spl[0]), parseInt(spl[3])] : [0, parseInt(spl[0])]; if (fullEnergyTime < (hours * 60 + minutes) * 2) { if (!$(e).parent().hasClass('wh-translated')) { $(e).parent() .prepend(`
警告:该次飞行往返时间大于体力回复时间,将会爆体!
`) .addClass('wh-translated'); } } }); }; trans(); OB.observe($$.get(0), { characterData: true, attributes: true, subtree: true, childList: true }); } // 一键起飞 if (sessionStorage['wh-quick-fly']) { doQuickFly(); } } } async function travelBack(): Promise { if (typeof window['getAction'] !== 'function') return; let backHomeAction = function (): Promise { return new Promise(resolve => { window.getAction({ type: "post", action: 'travelagency.php', data: { step: 'backHomeAction' }, success: function (msg) { resolve(msg); } }); }); }; let res = await backHomeAction(); WHNotify(res); if (!res.includes('error')) { WHNotify('成功,即将刷新'); setTimeout(() => location.reload(), 3000); } else { WHNotify('出错了'); } }