mirror of
https://github.com/EasyTier/EasytierGame.git
synced 2026-10-19 16:16:35 +00:00
#Update 开机自启兼容配置改为win7 优化联机是否成功的判断方式
#Update 开机自启兼容配置改为win7 优化联机是否成功的判断方式 优化联机是否成功的判断方式 版本号更新->1.5.3
This commit is contained in:
+1
-1
@@ -3,7 +3,7 @@
|
||||
"private": true,
|
||||
"author": "leizi97",
|
||||
"description": "A simple network initiator based on Easytier",
|
||||
"version": "1.5.2",
|
||||
"version": "1.5.3",
|
||||
"scripts": {
|
||||
"dev": "nuxt dev --dotenv env/.env.dev --host 0.0.0.0",
|
||||
"build": "nuxt generate --dotenv env/.env.prod",
|
||||
|
||||
+32
-121
@@ -999,6 +999,7 @@
|
||||
mainStore.basePeers = uniq([...mainStore.config.serverUrl, ...mainStore.basePeers]);
|
||||
};
|
||||
|
||||
let getMemeberTimer: number | null = null;
|
||||
const listenObj: { [key: string]: any } = {
|
||||
unListenOutPut: null,
|
||||
unListenThreadId: null,
|
||||
@@ -1009,31 +1010,28 @@
|
||||
server_thread_id: ref(null),
|
||||
async listenOutput() {
|
||||
// const appWindow = getCurrentWindow();
|
||||
const unListen = await listen<string>("command-output", async event => {
|
||||
data.isStart = true;
|
||||
// console.error(event.payload);
|
||||
if (event.payload) {
|
||||
data.startLoading = false;
|
||||
let ipv4 = /dhcp ip changed. old: None, new: Some\((\d+\.\d+\.\d+\.\d+).*\)/g.exec(event.payload as string)?.[1];
|
||||
let devName = /tun device ready. dev: (.*)/g.exec(event.payload as string)?.[1];
|
||||
if (mainStore.configStartEnable || mainStore.config.dhcp) {
|
||||
let configIpv4 = /ipv4\s.*=\s.*[\'\"](\d+\.\d+\.\d+\.\d+).*[\'\"]/g.exec(event.payload as string)?.[1];
|
||||
if (configIpv4) {
|
||||
mainStore.config.ipv4 = configIpv4;
|
||||
}
|
||||
}
|
||||
// if (event.payload.includes("peer connection removed")) {
|
||||
// data.isSuccessGetIp = false;
|
||||
// }
|
||||
if (event.payload.includes("new peer connection added") && !data.isSuccessGetIp) {
|
||||
getMemeberTimer && clearInterval(getMemeberTimer);
|
||||
getMemeberTimer = setInterval(async () => {
|
||||
const [error, member] = await ATJ(invoke<string>("get_members_by_cli"));
|
||||
if (!error && member !== "_EasytierGameCliFailedToConnect_") {
|
||||
const memberJson = JSON.parse(member) as Member[];
|
||||
const localData = memberJson.find(member => member?.cost == "Local");
|
||||
const ipv4 = localData?.ipv4;
|
||||
if (localData && ipv4) {
|
||||
mainStore.config.ipv4 = ipv4;
|
||||
await setTrayRunState(tray, true);
|
||||
data.isSuccessGetIp = true;
|
||||
await setTrayTooltip(tray, `IP: ${mainStore.config.ipv4}`);
|
||||
return;
|
||||
}
|
||||
if (ipv4) {
|
||||
mainStore.config.ipv4 = ipv4;
|
||||
await setTrayTooltip(tray, `IP: ${ipv4}`);
|
||||
}
|
||||
ipReset();
|
||||
}
|
||||
}, 1000);
|
||||
const unListen = await listen<string>("command-output", async event => {
|
||||
data.isStart = true;
|
||||
if (event.payload) {
|
||||
data.startLoading = false;
|
||||
let devName = /tun device ready. dev: (.*)/g.exec(event.payload as string)?.[1];
|
||||
if (
|
||||
devName &&
|
||||
mainStore.config.enableNetCardMetric &&
|
||||
@@ -1060,7 +1058,10 @@
|
||||
data.log = logArr.slice(start).join("\n");
|
||||
data.log += (event.payload as string) + "\n";
|
||||
});
|
||||
this.unListenOutPut = unListen;
|
||||
this.unListenOutPut = () => {
|
||||
getMemeberTimer && clearInterval(getMemeberTimer);
|
||||
unListen();
|
||||
};
|
||||
},
|
||||
async listenThreadId() {
|
||||
const unListen = await listen("thread-id", event => {
|
||||
@@ -1402,101 +1403,6 @@
|
||||
});
|
||||
};
|
||||
|
||||
// 过滤可用节点的函数
|
||||
const filterAvailableNodes = (nodes: NodeItem[]): NodeItem[] => {
|
||||
return nodes.filter(node => {
|
||||
// 基本条件:节点必须激活且被批准
|
||||
if (!node.is_active || !node.is_approved) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// 健康状态检查
|
||||
if (node.current_health_status !== "healthy") {
|
||||
return false;
|
||||
}
|
||||
|
||||
// 使用率检查:使用率不能超过95%
|
||||
if (node.usage_percentage > 95) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// 24小时健康率检查:必须大于90%
|
||||
if (node.health_percentage_24h < 90) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// 响应时间检查:响应时间不能超过60秒
|
||||
if (node.last_response_time > 60000) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// 连接数检查:当前连接数不能超过最大连接数的90%
|
||||
if (node.current_connections > node.max_connections * 0.9) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// 必须有有效的地址
|
||||
if (!node.address || !node.host || !node.port) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
});
|
||||
};
|
||||
|
||||
// 按优先级排序节点的函数
|
||||
const sortNodesByPriority = (nodes: NodeItem[]): NodeItem[] => {
|
||||
return nodes.sort((a, b) => {
|
||||
// 优先级排序规则:
|
||||
// 1. 响应时间越短越好
|
||||
// 2. 使用率越低越好
|
||||
// 3. 24小时健康率越高越好
|
||||
// 4. 当前连接数越少越好
|
||||
|
||||
// 响应时间权重最高
|
||||
const responseTimeDiff = a.last_response_time - b.last_response_time;
|
||||
if (Math.abs(responseTimeDiff) > 1000) {
|
||||
// 如果响应时间差异超过1秒
|
||||
return responseTimeDiff;
|
||||
}
|
||||
|
||||
// 使用率权重次之
|
||||
const usageDiff = a.usage_percentage - b.usage_percentage;
|
||||
if (Math.abs(usageDiff) > 5) {
|
||||
// 如果使用率差异超过5%
|
||||
return usageDiff;
|
||||
}
|
||||
|
||||
// 24小时健康率
|
||||
const healthDiff = b.health_percentage_24h - a.health_percentage_24h;
|
||||
if (Math.abs(healthDiff) > 1) {
|
||||
// 如果健康率差异超过1%
|
||||
return healthDiff;
|
||||
}
|
||||
|
||||
// 当前连接数
|
||||
return a.current_connections - b.current_connections;
|
||||
});
|
||||
};
|
||||
|
||||
// 将节点添加到服务器列表的函数
|
||||
const addNodesToServerList = (nodes: NodeItem[]) => {
|
||||
// 提取服务器地址
|
||||
const serverAddresses = nodes.map(node => node.address.replace(`${node.protocol}://`, ""));
|
||||
|
||||
// 去重并添加到基础服务器列表
|
||||
const uniqueAddresses = uniq([...serverAddresses, ...mainStore.basePeers]);
|
||||
mainStore.basePeers = uniqueAddresses;
|
||||
|
||||
// 如果当前没有选择服务器,自动选择第一个最佳节点
|
||||
if (mainStore.config.serverUrl.length === 0 && serverAddresses.length > 0) {
|
||||
mainStore.config.serverUrl = [serverAddresses[0]];
|
||||
console.log(`自动选择最佳服务器: ${serverAddresses[0]}`);
|
||||
}
|
||||
|
||||
console.log(`已添加 ${serverAddresses.length} 个可用服务器到列表`);
|
||||
};
|
||||
|
||||
let logsTimer: number | null = null;
|
||||
let serverLogsTimer: number | null = null;
|
||||
let cidrTimer: number | null = null;
|
||||
@@ -1724,12 +1630,18 @@
|
||||
return args;
|
||||
};
|
||||
|
||||
const reset = async () => {
|
||||
data.isStart = false;
|
||||
const ipReset = async () => {
|
||||
data.isSuccessGetIp = false;
|
||||
if (mainStore.config.dhcp) {
|
||||
mainStore.config.ipv4 = "";
|
||||
}
|
||||
await setTrayRunState(tray, false);
|
||||
await setTrayTooltip(tray);
|
||||
};
|
||||
|
||||
const reset = async () => {
|
||||
data.isStart = false;
|
||||
await ipReset();
|
||||
const memberDialog = await getAllWebviewWindows();
|
||||
const memberDialogs = memberDialog.filter(item => item.label === "member");
|
||||
if (memberDialogs && memberDialogs.length > 0) {
|
||||
@@ -1741,8 +1653,7 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
await setTrayRunState(tray, false);
|
||||
await setTrayTooltip(tray);
|
||||
|
||||
await unListenAll();
|
||||
};
|
||||
|
||||
|
||||
+4
-67
@@ -119,7 +119,7 @@
|
||||
prop="nat_type"
|
||||
>
|
||||
<template #default="{ row }">
|
||||
{{ natMaps[row.nat_type.toLowerCase() as natKyes] || row.nat_type || "-" }}
|
||||
{{ natMaps[row.nat_type.toLowerCase() as NATKyes] || row.nat_type || "-" }}
|
||||
</template>
|
||||
</ElTableColumn>
|
||||
<ElTableColumn
|
||||
@@ -156,65 +156,10 @@
|
||||
<script setup lang="ts">
|
||||
import { invoke } from "@tauri-apps/api/core";
|
||||
import { reactive, onMounted, onBeforeUnmount, computed } from "vue";
|
||||
import { ATJ, parseCliInfo } from "@/utils";
|
||||
import { ATJ } from "@/utils";
|
||||
import { ElConfirmDanger } from "~/utils/element";
|
||||
import { getCurrentWindow } from "@tauri-apps/api/window";
|
||||
import { endsWith, isNaN } from "lodash-es";
|
||||
|
||||
type Member = {
|
||||
cidr: string;
|
||||
ipv4: string;
|
||||
hostname: string;
|
||||
cost: string;
|
||||
lat_ms: string;
|
||||
loss_rate: string;
|
||||
rx_bytes: string;
|
||||
tx_bytes: string;
|
||||
tunnel_proto: string;
|
||||
nat_type: string;
|
||||
id: string;
|
||||
version: string;
|
||||
connections_addrs: string[];
|
||||
proxy?: [string, "Connected" | "Closed"];
|
||||
};
|
||||
|
||||
type ConnectionsType = {
|
||||
route: {
|
||||
peer_id: number;
|
||||
ipv4_addr: string | null;
|
||||
next_hop_peer_id: number;
|
||||
cost: number;
|
||||
path_latency: number;
|
||||
proxy_cidrs: string[];
|
||||
hostname: string;
|
||||
stun_info: {
|
||||
udp_nat_type: number;
|
||||
tcp_nat_type: number;
|
||||
last_update_time: number;
|
||||
public_ip: string[];
|
||||
min_port: number;
|
||||
max_port: number;
|
||||
};
|
||||
};
|
||||
peer: {
|
||||
peer_id: number;
|
||||
conns: {
|
||||
conn_id: string;
|
||||
my_peer_id: number;
|
||||
peer_id: number;
|
||||
features: string[];
|
||||
tunnel: {
|
||||
tunnel_type: string;
|
||||
local_addr: {
|
||||
url: string;
|
||||
};
|
||||
remote_addr: {
|
||||
url: string;
|
||||
};
|
||||
};
|
||||
}[];
|
||||
};
|
||||
};
|
||||
import { isNaN } from "lodash-es";
|
||||
|
||||
const natMaps = {
|
||||
unknown: "未知",
|
||||
@@ -229,15 +174,7 @@
|
||||
symUdpfirewall: "nat4-udpfirewall"
|
||||
};
|
||||
|
||||
type Proxy = {
|
||||
src: string;
|
||||
dst: string;
|
||||
start_time: string;
|
||||
state: "Connected" | "Closed";
|
||||
transport_type: string;
|
||||
};
|
||||
|
||||
type natKyes = keyof typeof natMaps;
|
||||
type NATKyes = keyof typeof natMaps;
|
||||
|
||||
const data = reactive<{ member: Member[]; proxy: Proxy[] }>({
|
||||
member: [],
|
||||
|
||||
Generated
+1
-1
@@ -1178,7 +1178,7 @@ checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555"
|
||||
|
||||
[[package]]
|
||||
name = "easytier-game"
|
||||
version = "1.5.1"
|
||||
version = "1.5.3"
|
||||
dependencies = [
|
||||
"hashbrown 0.15.5",
|
||||
"log",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "easytier-game"
|
||||
version = "1.5.2"
|
||||
version = "1.5.3"
|
||||
homepage = "https://github.com/EasyTier/EasyTier"
|
||||
repository = "https://github.com/EasyTier/EasytierGame"
|
||||
description = "A simple network initiator based on Easytier"
|
||||
|
||||
@@ -875,6 +875,7 @@ fn autostart(enabled: bool) -> std::result::Result<(), Box<dyn std::error::Error
|
||||
exec_action.SetPath(&BSTR::from(exe_path))?;
|
||||
exec_action.SetArguments(&BSTR::from("--task-auto-start"))?;
|
||||
|
||||
// 设置任务权限为当前用户
|
||||
let principal = task_definition.Principal()?;
|
||||
principal.SetUserId(&BSTR::from(whoami::username().as_str()))?;
|
||||
principal.SetLogonType(TASK_LOGON_INTERACTIVE_TOKEN)?;
|
||||
@@ -883,7 +884,7 @@ fn autostart(enabled: bool) -> std::result::Result<(), Box<dyn std::error::Error
|
||||
// 设置任务设置
|
||||
let settings = task_definition.Settings()?;
|
||||
settings.SetEnabled(VARIANT_BOOL::from(true))?;
|
||||
settings.SetCompatibility(TASK_COMPATIBILITY_V2)?; // Windows 7
|
||||
settings.SetCompatibility(TASK_COMPATIBILITY_V2_1)?; // Windows 7
|
||||
settings.SetStartWhenAvailable(VARIANT_BOOL::from(true))?;
|
||||
// settings.SetHidden(VARIANT_BOOL::from(true))?; // 注释掉让任务可见
|
||||
settings.SetExecutionTimeLimit(&BSTR::from("PT0S"))?;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"$schema": "../node_modules/@tauri-apps/cli/config.schema.json",
|
||||
"productName": "easytier-game",
|
||||
"version": "1.5.2",
|
||||
"version": "1.5.3",
|
||||
"identifier": "com.tauri.easytier-game",
|
||||
|
||||
"build": {
|
||||
@@ -12,7 +12,7 @@
|
||||
"app": {
|
||||
"windows": [
|
||||
{
|
||||
"title": "easytier-game 1.5.2",
|
||||
"title": "easytier-game 1.5.3",
|
||||
"label": "main",
|
||||
"minWidth": 340,
|
||||
"width": 340,
|
||||
|
||||
Vendored
+62
@@ -57,3 +57,65 @@ interface NodesResponse {
|
||||
error: string | null;
|
||||
message: string | null;
|
||||
}
|
||||
|
||||
type Member = {
|
||||
cidr: string;
|
||||
ipv4: string;
|
||||
hostname: string;
|
||||
cost: string;
|
||||
lat_ms: string;
|
||||
loss_rate: string;
|
||||
rx_bytes: string;
|
||||
tx_bytes: string;
|
||||
tunnel_proto: string;
|
||||
nat_type: string;
|
||||
id: string;
|
||||
version: string;
|
||||
connections_addrs: string[];
|
||||
proxy?: [string, "Connected" | "Closed"];
|
||||
};
|
||||
|
||||
type ConnectionsType = {
|
||||
route: {
|
||||
peer_id: number;
|
||||
ipv4_addr: string | null;
|
||||
next_hop_peer_id: number;
|
||||
cost: number;
|
||||
path_latency: number;
|
||||
proxy_cidrs: string[];
|
||||
hostname: string;
|
||||
stun_info: {
|
||||
udp_nat_type: number;
|
||||
tcp_nat_type: number;
|
||||
last_update_time: number;
|
||||
public_ip: string[];
|
||||
min_port: number;
|
||||
max_port: number;
|
||||
};
|
||||
};
|
||||
peer: {
|
||||
peer_id: number;
|
||||
conns: {
|
||||
conn_id: string;
|
||||
my_peer_id: number;
|
||||
peer_id: number;
|
||||
features: string[];
|
||||
tunnel: {
|
||||
tunnel_type: string;
|
||||
local_addr: {
|
||||
url: string;
|
||||
};
|
||||
remote_addr: {
|
||||
url: string;
|
||||
};
|
||||
};
|
||||
}[];
|
||||
};
|
||||
};
|
||||
type Proxy = {
|
||||
src: string;
|
||||
dst: string;
|
||||
start_time: string;
|
||||
state: "Connected" | "Closed";
|
||||
transport_type: string;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user