import { DOMUtils, httpx, log, MenuRegister, pops, utils } from "@/env";
import Qmsg from "qmsg";
import blackHomeCSS from "./css/black-home.css?raw";
import { MTUtils } from "@/utils/MTUtils";
import { PanelUISize } from "@components/setting/panel-ui-size";
type BlackUserInfo = {
action: string;
cid: string;
dateline: string;
groupexpiry: string;
operator: string;
operatorid: string;
reason: string;
uid: string;
username: string;
time: number;
};
export const MTBlackHome = {
$data: {
cid: "",
},
init() {
this.registerMenu();
},
/**
* 注册菜单
*/
registerMenu() {
MenuRegister.add({
key: "black-home",
text: "⚙ 小黑屋",
autoReload: false,
isStoreValue: false,
showText(text) {
return text;
},
callback: () => {
this.showBlackHome();
},
});
},
/**
* 显示小黑屋dialog
*/
async showBlackHome() {
let $loading = Qmsg.loading("正在获取小黑屋名单中...");
let blackListInfo = await this.getBlackListInfo("");
$loading.close();
if (!blackListInfo) {
return;
}
if (blackListInfo.data.length === 0) {
Qmsg.error("获取小黑屋名单为空");
return;
}
this.$data.cid = blackListInfo.next_cid;
let $confirm = pops.confirm({
title: {
text: "小黑屋名单",
position: "center",
},
content: {
text: /*html*/ `
`,
html: true,
},
btn: {
ok: {
text: "下一页",
callback: async () => {
let $loading = Qmsg.loading("正在获取小黑屋名单中...");
log.info("下一页的cid: ", this.$data.cid);
let nextBlackListInfo = await this.getBlackListInfo(this.$data.cid);
$loading.close();
if (!nextBlackListInfo) {
return;
}
this.$data.cid = nextBlackListInfo.next_cid;
nextBlackListInfo.data.forEach((item) => {
let $item = this.createListViewItem(item);
$list.appendChild($item);
});
if (nextBlackListInfo.data.length === 0) {
Qmsg.error("获取小黑屋名单为空");
} else {
Qmsg.success(`成功获取 ${nextBlackListInfo.data.length}条数据`);
}
DOMUtils.emit($filterInput, "input");
},
},
cancel: {
text: "关闭",
},
},
width: PanelUISize.settingBig.width,
height: PanelUISize.settingBig.height,
style: blackHomeCSS,
});
let $list = $confirm.$shadowRoot.querySelector(".blackhome-user-list")!;
let $filterInput = $confirm.$shadowRoot.querySelector(".blackhome-user-filter input")!;
blackListInfo.data.forEach((item) => {
let $item = this.createListViewItem(item);
$list.appendChild($item);
});
Qmsg.success(`成功获取 ${blackListInfo.data.length}条数据`);
// 设置过滤事件
let isSeaching = false;
DOMUtils.on(
$filterInput,
["input", "propertychange"],
utils.debounce(() => {
let inputText = $filterInput.value.trim();
if (isSeaching) {
return;
}
isSeaching = true;
if (inputText == "") {
$confirm.$shadowRoot.querySelectorAll(".blackhome-user-item").forEach((item) => {
item.removeAttribute("style");
});
isSeaching = false;
return;
}
let isFind = false;
$confirm.$shadowRoot.querySelectorAll(".blackhome-user-item").forEach((item) => {
if (
item.getAttribute("data-name")!.match(new RegExp(inputText, "ig")) ||
item.getAttribute("data-uid")!.trim().match(new RegExp(inputText, "ig")) ||
item.getAttribute("data-operator")!.match(new RegExp(inputText, "ig"))
) {
/* 匹配到 */
isFind = true;
item.removeAttribute("style");
} else {
item.setAttribute("style", "display:none;");
}
});
isSeaching = false;
})
);
// 再请求一次更新cid
let nextBlackListInfo = await this.getBlackListInfo(this.$data.cid);
if (!nextBlackListInfo) {
return;
}
this.$data.cid = nextBlackListInfo.next_cid;
},
/**
* 获取小黑屋名单信息
*/
async getBlackListInfo(cid = "") {
let searchParamsData = {
mod: "misc",
action: "showdarkroom",
cid: cid,
ajaxdata: "json",
};
let response = await httpx.get(`/forum.php?${utils.toSearchParamsStr(searchParamsData)}`, {
headers: {
"User-Agent": utils.getRandomPCUA(),
},
responseType: "json",
});
if (!response.status) {
return;
}
let data = utils.toJSON(response.data.responseText) as {
message: string;
data: {
[key: string]: Omit;
};
};
let cidSplit = data["message"].split("|");
let next_cid = cidSplit[cidSplit.length - 1]!;
let blackListData = utils.parseObjectToArray(data["data"]);
// 添加time值并排序(降序)
let new_blackListData: BlackUserInfo[] = [];
let new_blackListData_noTime: BlackUserInfo[] = [];
blackListData.forEach((item) => {
let date = item["dateline"].match(/([0-9]{4}-[0-9]{1,2}-[0-9]{1,2}[\s]*[0-9]{1,2}:[0-9]{1,2})/g);
if (date == null) {
let _time_ = parseInt((Date.now() / 1000).toString());
let _time_after_count_ = 0;
let sec_data = item["dateline"].match(/([0-9]+|半)[\s\S]*秒前/); /* xx|半秒前 */
let min_data = item["dateline"].match(/([0-9]+|半)[\s\S]*分钟前/); /* xx|半分钟前 */
let hour_data = item["dateline"].match(/([0-9]+|半)[\s\S]*小时前/); /* xx|半小时前 */
let yesterday_time_data = item["dateline"].match(/昨天[\s\S]*(\d{2}):(\d{2})/); /* 昨天 xx:xx */
let before_yesterday_time_data = item["dateline"].match(/前天[\s\S]*(\d{2}):(\d{2})/); /* 前天 xx:xx */
let day_data = item["dateline"].match(/([0-9]+|半)[\s\S]*天前/); /* xx天前 */
if (sec_data) {
// @ts-ignore
sec_data = sec_data[sec_data.length - 1];
// @ts-ignore
sec_data = sec_data.replace(/半/g, 0.5);
// @ts-ignore
sec_data = parseFloat(sec_data);
// @ts-ignore
_time_after_count_ = _time_ - sec_data;
} else if (min_data) {
// @ts-ignore
min_data = min_data[min_data.length - 1];
// @ts-ignore
min_data = min_data.replace(/半/g, 0.5);
// @ts-ignore
min_data = parseFloat(min_data);
// @ts-ignore
_time_after_count_ = _time_ - min_data * 60;
} else if (hour_data) {
// @ts-ignore
hour_data = hour_data[hour_data.length - 1];
// @ts-ignore
hour_data = hour_data.replace(/半/g, 0.5);
// @ts-ignore
hour_data = parseFloat(hour_data);
// @ts-ignore
_time_after_count_ = _time_ - hour_data * 60 * 60;
} else if (yesterday_time_data) {
let yesterday_hour_data = yesterday_time_data[1];
let yesterday_min_data = yesterday_time_data[2];
_time_after_count_ =
_time_ - 86400 - parseInt(yesterday_hour_data) * 3600 - parseInt(yesterday_min_data) * 60;
} else if (before_yesterday_time_data) {
let before_yesterday_hour_data = before_yesterday_time_data[1];
let before_yesterday_min_data = before_yesterday_time_data[2];
_time_after_count_ =
_time_ - 86400 * 2 - parseInt(before_yesterday_hour_data) * 3600 - parseInt(before_yesterday_min_data) * 60;
} else if (day_data) {
// @ts-ignore
day_data = day_data[day_data.length - 1];
// @ts-ignore
day_data = day_data.replace(/半/g, 0.5);
// @ts-ignore
day_data = parseFloat(day_data);
// @ts-ignore
_time_after_count_ = _time_ - day_data * 60 * 60 * 24;
}
// @ts-ignore
item["time"] = parseInt(_time_after_count_.toString()) * 1000;
// @ts-ignore
new_blackListData = new_blackListData.concat(item);
return;
} else {
// @ts-ignore
date = date[0];
}
// @ts-ignore
item["time"] = utils.formatToTimeStamp(date);
// @ts-ignore
new_blackListData = new_blackListData.concat(item);
});
utils.sortListByProperty(new_blackListData, "time");
utils.sortListByProperty(new_blackListData_noTime, "time", false);
new_blackListData = new_blackListData.concat(new_blackListData_noTime);
return {
next_cid: next_cid,
data: new_blackListData,
};
},
/**
* 创建黑名单节点
*/
createListViewItem(userInfo: BlackUserInfo) {
let $item = DOMUtils.createElement(
"div",
{
className: "blackhome-user-item",
innerHTML: /*html*/ `
${userInfo["username"]}
${userInfo["dateline"]}
${userInfo["action"]}
到期: ${userInfo["groupexpiry"]}
UID: ${userInfo["uid"]}
${userInfo["operator"]}
${userInfo["reason"]}
`,
},
{
"data-name": userInfo.username,
"data-uid": userInfo.uid,
"data-operator": userInfo.operator,
"data-operator-uid": userInfo.operatorid,
}
);
// 添加黑名单头像点击事件
DOMUtils.on($item, "click", ".blackhome-user img", function () {
window.open(`home.php?mod=space&uid=${userInfo.uid}&do=profile`, "_blank");
});
// 添加操作人头像点击事件
DOMUtils.on($item, "click", ".blackhome-operator-user img", function () {
window.open(`home.php?mod=space&uid=${userInfo.operatorid}&do=profile`, "_blank");
});
return $item;
},
};