DawnLauncher/src/main/ipcEvent.js

415 lines
12 KiB
JavaScript

import { ipcMain, dialog, Menu, app, shell } from "electron";
import os from "os";
import data from "@/main/data";
import fs from "fs";
import settingIndex from "./setting/index";
import util from "./util";
import retry from "retry";
import request from "request";
import mime from "mime";
import path from "path";
/**
* 固定位置
* @param fixedPosition
* @param alwaysCenter
*/
function setFixedPosition(fixedPosition, alwaysCenter) {
global.mainWindow.setMovable(fixedPosition);
if (alwaysCenter) {
global.mainWindow.setMovable(false);
}
}
export default function () {
// 隐藏
ipcMain.on("hide", (event, args) => {
global.mainWindow.hide();
});
// 隐藏
ipcMain.on("hideMainWindow", (event, args) => {
global.mainWindow.webContents.send("hideMainWindowBefore");
});
// 关闭
ipcMain.on("close", (event, args) => {
global.mainWindow.close();
});
// 获取数据
ipcMain.on("getList", (event) => {
let list = data.getList();
event.returnValue = list;
});
// 保存数据
ipcMain.on("setList", (event, args) => {
let params = JSON.parse(args);
data.setList(params.list);
settingIndex.setShortcutKey(global.setting);
if (params.searchWindowGetData != null && params.searchWindowGetData) {
if (global.searchWindow != null && !global.searchWindow.isDestroyed()) {
global.searchWindow.webContents.send("searchWindowGetData");
}
}
});
// 错误消息
ipcMain.on("errorMessage", (event, args) => {
dialog.showMessageBox(global.mainWindow, {
title: "Dawn Launcher",
message: args,
buttons: [global.currentLanguage.ok],
type: "error",
noLink: true,
cancelId: 1,
});
});
// 文本框菜单
ipcMain.on("textRightMenu", (event, args) => {
// 菜单
let m = Menu.buildFromTemplate([
{
role: "cut",
label: global.currentLanguage.cut,
},
{
role: "copy",
label: global.currentLanguage.copy,
},
{
role: "paste",
label: global.currentLanguage.paste,
},
]);
util.menuListen(m);
m.popup();
});
// 获取版本
ipcMain.on("getVersion", (event) => {
event.returnValue = app.getVersion();
});
// 打开网页
ipcMain.on("openUrl", (event, args) => {
shell.openExternal(args);
});
// 检查更新
ipcMain.on("checkUpdate", () => {
util.checkUpdate("checkUpdate");
});
// 统计
ipcMain.on("statistics", () => {
try {
let data = {
system: os.type(),
release: os.release(),
locale: app.getLocale(),
appVersion: app.getVersion(),
};
// 重试
const operation = retry.operation({
retries: 5, // 最多重试 5 次
factor: 1, // 每次重试之间的时间间隔加倍
minTimeout: 1000, // 第一次重试之前等待的时间
maxTimeout: 5000, // 最长等待时间
});
// 发起请求
operation.attempt((currentAttempt) => {
request(
{
uri: "https://client.dawnlauncher.com/access/statistics/add",
method: "POST",
json: true,
headers: {
"content-type": "application/json",
},
body: data,
timeout: 5000,
},
function (error, response, body) {
if (operation.retry(error)) {
return;
}
}
);
});
} catch (e) {}
});
// 备份数据
ipcMain.on("backup", () => {
try {
dialog
.showSaveDialog(global.mainWindow, {
title: global.currentLanguage.backUpData,
defaultPath: "data",
filters: [{ name: "JSON", extensions: ["json"] }],
})
.then((r) => {
if (!r.canceled && !util.strIsEmpty(r.filePath)) {
fs.copyFileSync(app.getPath("userData") + "\\data.json", r.filePath);
global.mainWindow.webContents.send("hideBackupRestore");
}
});
} catch (e) {
if (process.env.NODE_ENV !== "production") {
console.log(e);
}
}
});
// 恢复数据
ipcMain.on("restore", () => {
try {
dialog
.showOpenDialog(global.mainWindow, {
title: global.currentLanguage.restoreData,
filters: [{ name: "JSON", extensions: ["json"] }],
})
.then((r) => {
if (!r.canceled && !util.arrayIsEmpty(r.filePaths)) {
if (!util.strIsEmpty(r.filePaths[0])) {
fs.copyFileSync(r.filePaths[0], app.getPath("userData") + "\\data.json");
// 清空所有文件映射监听
if (global.mapDirectoryWatcher != null) {
for (let value of global.mapDirectoryWatcher.values()) {
if (value != null && value.watch != null && value.watch) {
value.watch.close();
}
}
global.mapDirectoryWatcher = new Map();
}
// 初始化图标数据
data.getList();
data.splitData();
// 重新获取数据
global.mainWindow.webContents.send("getAllData");
}
}
});
} catch (e) {
if (process.env.NODE_ENV !== "production") {
console.log(e);
}
}
});
// 设置置顶
ipcMain.on("setAlwaysTop", (event, args) => {
if (args) {
global.mainWindow.setAlwaysOnTop(true, "screen-saver");
} else {
global.mainWindow.setAlwaysOnTop(false);
}
});
// 反馈
ipcMain.on("feedback", () => {
shell.openExternal("https://support.qq.com/product/487828");
});
// 锁定尺寸
ipcMain.on("setResize", (event, args) => {
global.mainWindow.setResizable(args);
});
// 设置透明度
ipcMain.on("setOpacity", (event, args) => {
global.mainWindow.setOpacity(Number(args));
});
// 设置固定位置
ipcMain.on("setFixedPosition", (event, args) => {
setFixedPosition(args[0], args[1]);
});
// 永远居中
ipcMain.on("setAlwaysCenter", (event, args) => {
if (args[0]) {
global.mainWindow.center();
global.mainWindow.setMovable(false);
} else {
setFixedPosition(args[1], args[2]);
}
});
// 打赏赞助
ipcMain.on("rewardAndSponsorship", () => {
shell.openExternal("https://dawnlauncher.com/sponsor");
});
// 跳转搜索窗口高度
ipcMain.on("setSearchWindowHeight", (event, args) => {
global.searchWindow.setBounds({ height: args });
});
// 隐藏搜索窗口
ipcMain.on("hideSearchWindow", () => {
if (global.searchWindow.isVisible()) {
global.searchWindow.hide();
}
});
// 窗口设置透明
ipcMain.on("setSearchWindowOpacity", (event, args) => {
global.searchWindow.setOpacity(args);
event.returnValue = null;
});
// 获取release
ipcMain.on("getRelease", (event, args) => {
event.returnValue = os.release();
});
// 获取背景图
ipcMain.on("getBackgroundImageBase64", (event, args) => {
let params = JSON.parse(args);
fs.readFile(app.getPath("userData") + "\\images\\" + params.backgroundImage, (err, data) => {
if (!err) {
try {
let buffer = Buffer.from(data);
let image = "data:" + mime.getType(params.backgroundImage) + ";base64," + buffer.toString("base64");
if (params.page == "main") {
global.mainWindow.webContents.send("returnBackgroundImageBase64", image);
} else {
global.settingWindow.webContents.send("returnBackgroundImageBase64", image);
}
} catch (e) {
if (process.env.NODE_ENV !== "production") {
console.log(e);
}
}
}
});
});
// 通知快速搜索窗口获取数据
ipcMain.on("noticeSearchWindowGetData", () => {
if (global.searchWindow != null) {
global.searchWindow.webContents.send("searchWindowGetData");
}
});
// 获取软件目录
ipcMain.on("getPath", (event, args) => {
event.returnValue = process.env.NODE_ENV !== "production" ? path.resolve(".") : path.dirname(process.execPath);
});
// 获取图标
ipcMain.on("getIconData", (event) => {
let iconData = data.getIconData();
event.returnValue = iconData;
});
// 更新图标
ipcMain.on("updateIconData", (event, args) => {
// 参数
let updateIconData = JSON.parse(args);
// 获取图标数据
let iconData = data.store.get("iconData");
if (iconData != null) {
// 删除
if (!util.arrayIsEmpty(updateIconData.delete)) {
for (let del of updateIconData.delete) {
let index;
for (let i = 0; i < iconData.length; i++) {
if (
iconData[i].classificationParentId == del.classificationParentId &&
iconData[i].classificationChildId == del.classificationChildId &&
iconData[i].itemId == del.itemId
) {
index = i;
break;
}
}
if (index != null) {
iconData.splice(index, 1);
}
}
}
// 添加
if (!util.arrayIsEmpty(updateIconData.add)) {
for (let add of updateIconData.add) {
let icon = {
classificationParentId: add.classificationParentId,
classificationChildId: add.classificationChildId,
itemId: add.itemId,
icon: add.icon,
};
iconData.push(icon);
}
}
// 更新
if (!util.arrayIsEmpty(updateIconData.update)) {
for (let update of updateIconData.update) {
let flag = false;
for (let icon of iconData) {
if (
icon.classificationParentId == update.classificationParentId &&
icon.classificationChildId == update.classificationChildId &&
icon.itemId == update.itemId
) {
icon.icon = update.icon;
flag = true;
break;
}
}
if (!flag) {
iconData.push(update);
}
}
}
// set
data.store.set("iconData", iconData);
}
// 更新搜索框图标数据
if (global.searchWindow != null && !global.searchWindow.isDestroyed()) {
global.searchWindow.webContents.send("searchWindowUpdateIconData", args);
}
});
// 通知搜索窗口重新获取图标数据
ipcMain.on("searchWindowGetIconData", (event, args) => {
if (global.searchWindow != null && !global.searchWindow.isDestroyed()) {
global.searchWindow.webContents.send("getIconData");
}
});
// showMessageBoxSync
ipcMain.on("showMessageBoxSync", (event, args) => {
let index = dialog.showMessageBoxSync(global.mainWindow, {
title: "Dawn Launcher",
message: args,
buttons: [global.currentLanguage.ok, global.currentLanguage.cancel],
type: "question",
noLink: true,
cancelId: 1,
});
event.returnValue = index == 0 ? true : false;
});
// 选择文件夹
ipcMain.on("openDirectory", (event, args) => {
let params = JSON.parse(args);
let options = {
properties: ["openDirectory"],
};
if (!util.strIsEmpty(params.defaultPath)) {
options.defaultPath = params.defaultPath;
} else {
options.defaultPath = app.getPath("desktop");
}
dialog.showOpenDialog(params.window == "mainWindow" ? global.mainWindow : null, options).then((r) => {
if (r.filePaths.length > 0) {
event.returnValue = r.filePaths[0];
} else {
event.returnValue = null;
}
});
});
// 选择文件
ipcMain.on("openFile", (event, args) => {
let params = JSON.parse(args);
let options = {};
if (!util.strIsEmpty(params.defaultPath)) {
options.defaultPath = params.defaultPath;
} else {
options.defaultPath = app.getPath("desktop");
}
dialog.showOpenDialog(params.window == "mainWindow" ? global.mainWindow : null, options).then((r) => {
if (r.filePaths.length > 0) {
let filePath = r.filePaths[0];
if (params.target) {
if (mime.getType(filePath) == "application/x-ms-shortcut") {
// 快捷方式
// 获取真实文件路径和参数
let shortcutDetail = global.api.GetShortcutFile(filePath);
if (!util.strIsEmpty(shortcutDetail.target)) {
// 路径
filePath = shortcutDetail.target;
}
}
}
event.returnValue = filePath;
} else {
event.returnValue = null;
}
});
});
}