noname/game/entry.js

172 lines
4.6 KiB
JavaScript
Raw Normal View History

2024-04-15 16:49:47 +00:00
import { game, get, lib, boot } from "../noname.js";
import { canUseHttpProtocol, sendUpdate } from "../noname/init/index.js";
import { userAgent } from "../noname/util/index.js";
const coreAndVersion = get.coreInfo();
const core = coreAndVersion[0],
version = coreAndVersion[1];
//@todo: 77 -> 80
if (core === "chrome" && !isNaN(version) && version < 77) {
const tip =
"检测到您的浏览器内核版本小于77请及时升级浏览器或手机webview内核";
console.warn(tip);
game.print(tip);
const redirect_tip = `您使用的浏览器或无名杀客户端内核版本过低,将在未来的版本被废弃!\n目前使用的浏览器UA信息为\n${userAgent}\n点击“确认”以前往GitHub下载最新版无名杀客户端可能需要科学上网`;
if (confirm(redirect_tip)) {
window.open(
"https://github.com/libccy/noname/releases/tag/chromium77-client"
);
}
}
boot().then(() => {
// 判断是否从file协议切换到http/s协议
if (canUseHttpProtocol()) {
2024-04-23 17:47:20 +00:00
// 保存协议的切换状态
const saveProtocol = () => {
const url = sendUpdate();
if (typeof url == "string") {
if (
typeof window.require == "function" &&
typeof window.process == "object"
) {
// @ts-ignore
const remote = require("@electron/remote");
const thisWindow = remote.getCurrentWindow();
thisWindow.loadURL(url);
} else {
location.href = url;
}
}
};
2024-04-15 16:49:47 +00:00
/*
升级方法:
1. 游戏启动后导出数据然后以http/s协议重启
2. 以http/s协议导入数据
3. 保存http/s协议的状态以后不再以file协议启动
*/
// 导出数据到根目录的noname.config.txt
let data;
let export_data = function (data) {
game.promises
.writeFile(
lib.init.encode(JSON.stringify(data)),
"./",
"noname.config.txt"
)
.then(saveProtocol)
.catch((e) => {
console.error("升级失败:", e);
});
};
// @ts-ignore
if (!lib.db) {
data = {};
for (let i in localStorage) {
if (i.startsWith(lib.configprefix)) {
data[i] = localStorage[i];
}
}
export_data(data);
} else {
game.getDB("config", null, function (data1) {
game.getDB("data", null, function (data2) {
export_data({
config: data1,
data: data2,
});
});
});
}
} else {
// 成功导入后删除noname.config.txt
let searchParams = new URLSearchParams(location.search);
for (let [key, value] of searchParams) {
if (key === "sendUpdate" && value === "true") {
game.promises
.readFileAsText("noname.config.txt")
.then((data) => {
return /** @type {Promise<void>} */ (
new Promise(async (resolve, reject) => {
if (!data) return reject("!data");
try {
data = JSON.parse(lib.init.decode(data));
if (!data || typeof data != "object") {
throw "err";
}
// @ts-ignore
if (
lib.db &&
(!data.config || !data.data)
) {
throw "err";
}
} catch (e) {
console.log(e);
if (e == "err") {
alert("导入文件格式不正确");
reject("导入文件格式不正确");
} else {
alert("导入失败: " + e.message);
reject("导入失败: " + e.message);
}
return;
}
alert("导入成功, 即将自动重启");
// @ts-ignore
if (!lib.db) {
const noname_inited =
localStorage.getItem("noname_inited");
const onlineKey = localStorage.getItem(
lib.configprefix + "key"
);
localStorage.clear();
if (noname_inited) {
localStorage.setItem(
"noname_inited",
noname_inited
);
}
if (onlineKey) {
localStorage.setItem(
lib.configprefix + "key",
onlineKey
);
}
for (let i in data) {
localStorage.setItem(i, data[i]);
}
} else {
for (let i in data.config) {
await game.putDB(
"config",
i,
data.config[i]
);
lib.config[i] = data.config[i];
}
for (let i in data.data) {
await game.putDB(
"data",
i,
data.data[i]
);
}
}
lib.init.background();
resolve();
})
);
})
.then(() => {
return game.promises.removeFile("noname.config.txt");
})
.then(() => {
const url = new URL(location.href);
location.href = url.origin + url.pathname;
});
}
}
}
});