Files
yenai-plugin/model/GroupBannedWords.js

179 lines
5.4 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import _ from "lodash"
import moment from "moment"
import { Data, Plugin_Path } from "../components/index.js"
export default new class {
constructor() {
this.root = `${Plugin_Path}/config/group`
this.penaltyTypeMap = {
1: "踢",
2: "禁",
3: "撤",
4: "踢撤",
5: "禁撤"
}
this.matchTypeMap = {
1: "精确",
2: "模糊",
3: "正则"
}
this.dataCach = new Map()
this.muteTimeCach = new Map()
this.groupTitleCach = new Map()
}
addBannedWords(
groupId, words, matchType = "精确", penaltyType = "禁", addedBy
) {
let data = Data.readJSON(`${groupId}.json`, this.root)
if (!data.bannedWords) data.bannedWords = {}
if (data.bannedWords[words]) throw new ReplyError(`❎ 违禁词${words}已存在`)
// 翻转对象
let matchTypeMapMirr = _.invert(this.matchTypeMap)
let penaltyTypeMapMirr = _.invert(this.penaltyTypeMap)
data.bannedWords[words] = {
matchType: Number(matchTypeMapMirr[matchType]),
penaltyType: Number(penaltyTypeMapMirr[penaltyType]),
date: moment().format("MMM Do YY"),
addedBy
}
Data.writeJSON(`${groupId}.json`, data, this.root)
this.dataCach.delete(groupId)
return {
words: this.keyWordTran(words),
matchType,
penaltyType
}
}
delBannedWords(groupId, words) {
let data = Data.readJSON(`${groupId}.json`, this.root)
if (!data.bannedWords[words]) throw new ReplyError(`❎ 违禁词${words}不存在`)
delete data.bannedWords[words]
this.dataCach.delete(groupId)
Data.writeJSON(`${groupId}.json`, data, this.root)
return this.keyWordTran(words)
}
queryBannedWords(groupId, words) {
let data = Data.readJSON(`${groupId}.json`, this.root)
if (!data.bannedWords[words]) throw new ReplyError(`❎ 违禁词${words}不存在`)
let { matchType, penaltyType } = data.bannedWords[words]
return {
...data.bannedWords[words],
words: this.keyWordTran(words),
matchType: this.matchTypeMap[matchType],
penaltyType: this.penaltyTypeMap[penaltyType]
}
}
setMuteTime(groupId, time) {
let data = Data.readJSON(`${groupId}.json`, this.root)
data.muteTime = Number(time)
Data.writeJSON(`${groupId}.json`, data, this.root)
this.muteTimeCach.delete(groupId)
return true
}
getMuteTime(groupId) {
if (this.muteTimeCach.get(groupId)) return this.muteTimeCach.get(groupId)
let data = Data.readJSON(`${groupId}.json`, this.root)
this.muteTimeCach.set(groupId, data.muteTime ?? 300)
return data.muteTime ?? 300
}
/**
* 关键词转换成可发送消息
* @param msg
*/
async keyWordTran(msg) {
/** 图片 */
if (msg.includes("{image")) {
let tmp = msg.split("{image")
if (tmp.length > 2) return false
let md5 = tmp[1].replace(/}|_|:/g, "")
msg = segment.image(`http://gchat.qpic.cn/gchatpic_new/0/0-0-${md5}/0`)
msg.asface = true
} else if (msg.includes("{face")) {
let tmp = msg.match(/{face(:|_)(.+?)}/g)
if (!tmp) return msg
msg = []
for (let face of tmp) {
let id = face.match(/\d+/g)
msg.push(segment.face(id))
}
}
return msg
}
/**
* 初始化已添加内容
* @param groupId
*/
initTextArr(groupId) {
if (this.dataCach.get(groupId)) return this.dataCach.get(groupId)
const escapeRegExp = (string) => {
return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")
}
try {
const data = Data.readJSON(`${groupId}.json`, this.root)?.bannedWords
const _data = new Map()
for (const item in data) {
data[item].rawItem = item
if (data[item].matchType == 2) {
_data.set(new RegExp(escapeRegExp(item)), data[item])
} else if (data[item].matchType == 3) {
_data.set(global.eval(item), data[item])
} else {
_data.set(new RegExp(`^${escapeRegExp(item)}$`), data[item])
}
}
this.dataCach.set(groupId, _data)
return _data
} catch (error) {
logger.error(error)
logger.error(`json格式错误${this.root}/${groupId}.json`)
delete this.dataCach[groupId]
return false
}
}
setTitleFilterModeChange(groupId) {
let data = Data.readJSON(`${groupId}.json`, this.root)
data.TitleFilterModeChange = data.TitleFilterModeChange ? 0 : 1
Data.writeJSON(`${groupId}.json`, data, this.root)
return data.TitleFilterModeChange
}
getTitleFilterModeChange(groupId) {
let data = Data.readJSON(`${groupId}.json`, this.root)
return data.TitleFilterModeChange ?? 0
}
addTitleBannedWords(groupId, arr) {
let data = Data.readJSON(`${groupId}.json`, this.root)
if (!data.TitleBannedWords)data.TitleBannedWords = []
data.TitleBannedWords.push(...arr)
Data.writeJSON(`${groupId}.json`, data, this.root)
this.groupTitleCach.delete(groupId)
}
getTitleBannedWords(groupId) {
if (this.groupTitleCach.get(groupId)) return this.groupTitleCach.get(groupId)
let data = Data.readJSON(`${groupId}.json`, this.root).TitleBannedWords ?? []
this.groupTitleCach.set(groupId, data)
return data
}
delTitleBannedWords(groupId, arr) {
let data = Data.readJSON(`${groupId}.json`, this.root)
data.TitleBannedWords = _.differenceBy(data.TitleBannedWords, arr)
Data.writeJSON(`${groupId}.json`, data, this.root)
this.groupTitleCach.delete(groupId)
}
}()