{"version":3,"sources":["jsdelivr-header.js","/npm/koishi-plugin-iirose-spy@1.0.21/lib/index.js"],"names":[],"mappings":"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","file":"/npm/koishi-plugin-iirose-spy@1.0.21/lib/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/koishi-plugin-iirose-spy@1.0.21/lib/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","var __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __name = (target, value) => __defProp(target, \"name\", { value, configurable: true });\nvar __export = (target, all) => {\n  for (var name2 in all)\n    __defProp(target, name2, { get: all[name2], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n  if (from && typeof from === \"object\" || typeof from === \"function\") {\n    for (let key of __getOwnPropNames(from))\n      if (!__hasOwnProp.call(to, key) && key !== except)\n        __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n  }\n  return to;\n};\nvar __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(\n  // If the importer is in node compatibility mode or this is not an ESM\n  // file that has been converted to a CommonJS file using a Babel-\n  // compatible transform (i.e. \"__esModule\" has not been set), then set\n  // \"default\" to the CommonJS \"module.exports\" for node compatibility.\n  isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", { value: mod, enumerable: true }) : target,\n  mod\n));\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// src/index.ts\nvar src_exports = {};\n__export(src_exports, {\n  Config: () => Config,\n  apply: () => apply,\n  name: () => name\n});\nmodule.exports = __toCommonJS(src_exports);\n\n// src/api/config/index.ts\nvar import_koishi = require(\"koishi\");\nvar Config = import_koishi.Schema.intersect([\n  import_koishi.Schema.object({\n    specialIDs: import_koishi.Schema.array(String).description(\"重点关照的用户说的任何话都会单独放在一个特别的文件夹\"),\n    agencys: import_koishi.Schema.array(String).description(\"agencys，通常是你的主要账号\"),\n    keyWord: import_koishi.Schema.array(String).description(\"如果特别关注用户说这些关键词，就通知给agencys\"),\n    reportTrack: import_koishi.Schema.boolean().default(true).description(\"是否报告用户行踪\"),\n    reportTrackUser: import_koishi.Schema.array(String).description(\"需要报告哪个用户的行踪\"),\n    reportKeyword: import_koishi.Schema.boolean().default(true).description(\"当用户说了关键词时，是否通知agencys\"),\n    reportKeywordUser: import_koishi.Schema.array(String).description(\"当哪个用户说了关键词时，通知agencys\")\n  }).description(\"spy插件的配置\")\n]);\n\n// src/api/index.ts\nvar import_koishi2 = require(\"koishi\");\n\n// src/api/makeFolderAndFile/index.ts\nvar fs = __toESM(require(\"fs\"));\nvar path = __toESM(require(\"path\"));\nvar MakeFolderAndFile = class {\n  static {\n    __name(this, \"MakeFolderAndFile\");\n  }\n  makeSpyFolder(root) {\n    if (!fs.existsSync(root)) {\n      fs.mkdirSync(root, { recursive: true });\n    }\n  }\n  makeSpyFileJson(root, fileName) {\n    let filePath = path.join(root, fileName);\n    return new Promise((resolve, reject) => {\n      if (fs.existsSync(filePath)) {\n        fs.readFile(filePath, (err, data) => {\n          if (err)\n            reject(err);\n          let strData = data.toString();\n          resolve(strData);\n        });\n      } else {\n        fs.writeFile(filePath, \"[]\", (err) => {\n          if (err)\n            reject(err);\n          resolve(null);\n        });\n      }\n    });\n  }\n};\n\n// src/api/index.ts\nvar path4 = __toESM(require(\"path\"));\n\n// src/api/trackUserPosition/index.ts\nvar TrackUserPosition = class {\n  static {\n    __name(this, \"TrackUserPosition\");\n  }\n  handleTrack(trackQueue, fileName, roomId, online, roomChatRoot, content, message, userName, userID, session) {\n    const date = /* @__PURE__ */ new Date();\n    const options = { timeZone: \"Asia/Shanghai\", hour12: false };\n    const queueData = {\n      fileName,\n      fpath: roomChatRoot,\n      time: date.toLocaleString(\"zh-CN\", options),\n      userName,\n      userId: userID,\n      content,\n      message,\n      roomId,\n      online,\n      session\n    };\n    trackQueue.enqueue(queueData);\n  }\n};\n\n// src/api/chatManager/index.ts\nvar path2 = __toESM(require(\"path\"));\nvar ChatManager = class {\n  static {\n    __name(this, \"ChatManager\");\n  }\n  async handleChat(messageQueue, type, ID, botid, session, config, root) {\n    const makeFolderAndFile = new MakeFolderAndFile();\n    const roomChatRoot = path2.join(root, \"All Chat\", type === \"public\" ? \"public\" : \"private\", ID);\n    const fileName = `${type}_${ID}_to_${botid}`;\n    const date = /* @__PURE__ */ new Date();\n    const options = { timeZone: \"Asia/Shanghai\", hour12: false };\n    const queueData = {\n      fileName,\n      fpath: roomChatRoot,\n      time: date.toLocaleString(\"zh-CN\", options),\n      userName: session.username,\n      userId: session.userId,\n      content: session.content,\n      keyword: [],\n      message: [],\n      session\n    };\n    messageQueue.enqueue(queueData);\n    if (config.specialIDs.includes(session.userId)) {\n      const specialIDsChatRoot = path2.join(root, \"specialIDs\", `${session.userId}`, \"chat\");\n      makeFolderAndFile.makeSpyFolder(specialIDsChatRoot);\n      const queueData2 = {\n        fileName,\n        fpath: specialIDsChatRoot,\n        time: date.toLocaleString(\"zh-CN\", options),\n        userName: session.username,\n        userId: session.userId,\n        content: session.content,\n        keyword: [],\n        message: [],\n        session\n      };\n      const keyword = config.keyWord;\n      if (keyword.length > 0) {\n        config.keyWord.forEach((keyWord) => {\n          if (session.content?.includes(keyWord)) {\n            const message = `\n                        <parent>\n                        [spy] 用户 <at id='${session.userId}'/> 在${type}中说了关键词: ${keyWord}\n完整内容为: ${session.content}\n                        </parent>`;\n            queueData2.keyword.push(keyWord);\n            queueData2.message.push(message);\n          }\n        });\n      }\n      messageQueue.enqueue(queueData2);\n    }\n  }\n};\n\n// src/api/queue/index.ts\nvar Queue = class {\n  static {\n    __name(this, \"Queue\");\n  }\n  elements = [];\n  enqueue(element) {\n    this.elements.push(element);\n  }\n  dequeue() {\n    return this.elements.shift();\n  }\n  isEmpty() {\n    return this.elements.length === 0;\n  }\n  peek() {\n    return !this.isEmpty() ? this.elements[0] : void 0;\n  }\n};\n\n// src/api/record/index.ts\nvar fs2 = __toESM(require(\"fs\"));\nvar path3 = __toESM(require(\"path\"));\nvar Record = class {\n  static {\n    __name(this, \"Record\");\n  }\n  recordInJson(filePath, allData) {\n    fs2.writeFile(filePath, JSON.stringify(allData, null, 2), (err) => {\n      if (err)\n        throw err;\n    });\n  }\n  recordInLogChatData(filePath, allData) {\n    let log = \"\";\n    allData.forEach((item) => {\n      log += `time: ${item.time}, userName: ${item.userName}, userId: ${item.userId}, content: ${item.content}\n`;\n    });\n    fs2.writeFile(filePath, log, (err) => {\n      if (err)\n        throw err;\n    });\n  }\n  recordInLogTrackData(filePath, allData) {\n    let log = \"\";\n    allData.forEach((item) => {\n      log += `time: ${item.time}, userName: ${item.userName}, userId: ${item.userId}, roomId:${item.roomId}, content: ${item.content}\n`;\n    });\n    fs2.writeFile(filePath, log, (err) => {\n      if (err)\n        throw err;\n    });\n  }\n  async recordChatIntoFile(data, messageQueue) {\n    let { keyword, message, session, fileName, fpath, ...recordData } = data;\n    const makeFolderAndFile = new MakeFolderAndFile();\n    const spy_chat_Json_filePath = path3.join(data.fpath, `${data.fileName}.json`);\n    const spy_chat_Log_filePath = path3.join(data.fpath, `${data.fileName}.log`);\n    const spy_chat_Data = [];\n    makeFolderAndFile.makeSpyFolder(data.fpath);\n    const dataFromFile = await makeFolderAndFile.makeSpyFileJson(data.fpath, `${data.fileName}.json`);\n    if (dataFromFile != null) {\n      spy_chat_Data.push(...JSON.parse(dataFromFile));\n    }\n    spy_chat_Data.push(recordData);\n    this.recordInJson(spy_chat_Json_filePath, spy_chat_Data);\n    this.recordInLogChatData(spy_chat_Log_filePath, spy_chat_Data);\n    messageQueue.dequeue();\n  }\n  async recordUserPositionIntoFile(data, trackQueue) {\n    let { session, message, fileName, ...recordData } = data;\n    const makeFolderAndFile = new MakeFolderAndFile();\n    const spy_track_Json_filePath = path3.join(data.fpath, `${data.fileName}.json`);\n    const spy_track_Log_filePath = path3.join(data.fpath, `${data.fileName}.log`);\n    const spy_track_Data = [];\n    makeFolderAndFile.makeSpyFolder(data.fpath);\n    const dataFromFile = await makeFolderAndFile.makeSpyFileJson(data.fpath, `${data.fileName}.json`);\n    if (dataFromFile != null) {\n      spy_track_Data.push(...JSON.parse(dataFromFile));\n    }\n    spy_track_Data.push(recordData);\n    this.recordInJson(spy_track_Json_filePath, spy_track_Data);\n    this.recordInLogTrackData(spy_track_Log_filePath, spy_track_Data);\n    trackQueue.dequeue();\n  }\n};\n\n// src/api/informationCenter/index.ts\nvar InformationCenter = class {\n  static {\n    __name(this, \"InformationCenter\");\n  }\n  reportUserPositionToAgency(config, session, data) {\n    if (config.agencys && config.agencys.length > 0 && config.reportTrack && config.reportTrackUser.includes(data.userId)) {\n      config.agencys.forEach((agency) => {\n        session.bot.sendPrivateMessage(agency, data.message);\n      });\n    }\n  }\n  reportWhenUserSayKeywordToAgency(config, session, data) {\n    if (config.agencys && config.agencys.length > 0 && config.reportKeyword && config.reportKeywordUser.includes(data.userId)) {\n      config.agencys.forEach((agency) => {\n        data.message.forEach((message) => {\n          session.bot.sendPrivateMessage(agency, message);\n        });\n      });\n    }\n  }\n};\n\n// src/api/intervalTask/index.ts\nvar IntervalTask = class {\n  static {\n    __name(this, \"IntervalTask\");\n  }\n  shouldStop = false;\n  constructor(ctx) {\n    ctx.on(\"dispose\", () => {\n      this.shouldStop = true;\n    });\n  }\n  async chatQueueIntervalFunc(messageQueue, config) {\n    if (this.shouldStop)\n      return;\n    if (!messageQueue.isEmpty()) {\n      const data = messageQueue.peek();\n      if (data) {\n        const informationCenter = new InformationCenter();\n        const record = new Record();\n        await record.recordChatIntoFile(data, messageQueue);\n        informationCenter.reportWhenUserSayKeywordToAgency(config, data.session, data);\n      }\n    }\n    setTimeout(async () => {\n      await this.chatQueueIntervalFunc(messageQueue, config);\n    }, 100);\n  }\n  async trackQueueIntervalFunc(trackQueue, config) {\n    if (this.shouldStop)\n      return;\n    if (!trackQueue.isEmpty()) {\n      const data = trackQueue.peek();\n      if (data) {\n        const informationCenter = new InformationCenter();\n        const record = new Record();\n        await record.recordUserPositionIntoFile(data, trackQueue);\n        informationCenter.reportUserPositionToAgency(config, data.session, data);\n      }\n    }\n    setTimeout(async () => {\n      await this.trackQueueIntervalFunc(trackQueue, config);\n    }, 100);\n  }\n};\n\n// src/api/index.ts\nvar logger = new import_koishi2.Logger(\"iirose-spy\");\nasync function apply(ctx, config) {\n  try {\n    const messageQueue = new Queue();\n    const trackQueue = new Queue();\n    const makeFolderAndFile = new MakeFolderAndFile();\n    const trackUserPosition = new TrackUserPosition();\n    const chatManager = new ChatManager();\n    const root = path4.join(ctx.baseDir, \"iirose_spy\");\n    ctx.on(\"message\", async (session) => {\n      const botid = session.bot?.config.uid;\n      const channelID = session.event.channel?.id;\n      if (channelID === void 0)\n        return;\n      let pattern = /(public|private):([a-zA-Z0-9]+)/;\n      let match = pattern.exec(channelID);\n      if (!match)\n        return;\n      const type = match[1];\n      const ID = match[2];\n      if (type === \"public\") {\n        chatManager.handleChat(messageQueue, type, ID, botid, session, config, root);\n      }\n      if (type === \"private\") {\n        chatManager.handleChat(messageQueue, type, ID, botid, session, config, root);\n      }\n    });\n    ctx.on(\"iirose/joinRoom\", async (session) => {\n      const userId = session.author?.userId;\n      if (userId && config.specialIDs.includes(userId)) {\n        const specialIDsTrackRoot = path4.join(root, \"specialIDs\", `${userId}`, \"track\");\n        const fileName = `spy_track_${userId}`;\n        makeFolderAndFile.makeSpyFolder(specialIDsTrackRoot);\n        const userName = session.author?.username || \"\";\n        const roomId = session.bot?.config.roomId || \"\";\n        const content = `加入了房间${roomId}`;\n        const message = `<>[spy] 用户<at id='${userId}'/>加入了房间<at roomId='${roomId}'/></>`;\n        trackUserPosition.handleTrack(trackQueue, fileName, roomId, true, specialIDsTrackRoot, content, message, userName, userId, session);\n      }\n    });\n    ctx.on(\"iirose/leaveRoom\", async (session) => {\n      const userId = session.author?.userId;\n      if (userId && config.specialIDs.includes(userId)) {\n        const specialIDsTrackRoot = path4.join(root, \"specialIDs\", `${userId}`, \"track\");\n        makeFolderAndFile.makeSpyFolder(specialIDsTrackRoot);\n        let JoinRoomData = [];\n        const dataFromFile = await makeFolderAndFile.makeSpyFileJson(specialIDsTrackRoot, `spy_track_${session.author?.userId}.json`);\n        if (dataFromFile != null) {\n          JoinRoomData = JSON.parse(dataFromFile);\n        }\n        const fileName = `spy_track_${userId}`;\n        const roomId = JoinRoomData[JoinRoomData.length - 1].roomId;\n        const content = `在房间${roomId}下线了`;\n        const username = session.author?.username || \"\";\n        const userID = session.author?.userId || \"\";\n        const message = `<>[spy] 用户<at id='${userId}'/>在房间<at roomId='${JoinRoomData[JoinRoomData.length - 1].roomId}'/>下线了</>`;\n        trackUserPosition.handleTrack(trackQueue, fileName, roomId, false, specialIDsTrackRoot, content, message, username, userID, session);\n      }\n    });\n    ctx.on(\"iirose/switchRoom\", async (session, data) => {\n      const userId = data.uid;\n      if (userId && config.specialIDs.includes(userId)) {\n        const specialIDsTrackRoot = path4.join(root, \"specialIDs\", `${userId}`, \"track\");\n        makeFolderAndFile.makeSpyFolder(specialIDsTrackRoot);\n        const fileName = `spy_track_${userId}`;\n        const userName = data.username || \"\";\n        const roomId = data.targetRoom || \"\";\n        const content = `切换到了房间${roomId}`;\n        const message = `<>[spy] 用户<at id='${userId}'/>切换到了房间<at roomId='${roomId}'/></>`;\n        trackUserPosition.handleTrack(trackQueue, fileName, roomId, true, specialIDsTrackRoot, content, message, userName, userId, session);\n      }\n    });\n    ctx.on(\"iirose/before-getUserList\", async (session, data) => {\n      data.forEach(async (userData) => {\n        if (userData && userData.uid && config.specialIDs.includes(userData.uid)) {\n          const userId = userData.uid;\n          let lastItemRoomId;\n          const specialIDsTrackRoot = path4.join(root, \"specialIDs\", `${userId}`, \"track\");\n          makeFolderAndFile.makeSpyFolder(specialIDsTrackRoot);\n          const dataFromFile = await makeFolderAndFile.makeSpyFileJson(specialIDsTrackRoot, `spy_track_${userId}.json`);\n          if (dataFromFile === null)\n            return;\n          const parseDataFromFile = JSON.parse(dataFromFile || \"[]\");\n          if (parseDataFromFile.length > 0) {\n            lastItemRoomId = parseDataFromFile[parseDataFromFile.length - 1].roomId;\n            if (lastItemRoomId === userData.room)\n              return;\n          }\n          const fileName = `spy_track_${userId}`;\n          const userName = userData.username;\n          const roomId = userData.room;\n          let content;\n          let message;\n          if (!lastItemRoomId) {\n            content = `在房间${userData.room}上线`;\n            message = `<>[spy] 用户<at id='${userId}'/>在房间<at roomId='${roomId}'/>上线</>`;\n          } else {\n            content = `切换到了房间${userData.room}`;\n            message = `<>[spy] 用户<at id='${userId}'/>切换到了房间<at roomId='${roomId}'/></>`;\n          }\n          trackUserPosition.handleTrack(trackQueue, fileName, roomId, true, specialIDsTrackRoot, content, message, userName, userId, session);\n        }\n      });\n      let notFound = config.specialIDs.filter((specialID) => !data.some((userData) => userData.uid === specialID));\n      notFound.forEach(async (userId) => {\n        const specialIDsTrackRoot = path4.join(root, \"specialIDs\", `${userId}`, \"track\");\n        makeFolderAndFile.makeSpyFolder(specialIDsTrackRoot);\n        let JoinRoomData = [];\n        const dataFromFile = await makeFolderAndFile.makeSpyFileJson(specialIDsTrackRoot, `spy_track_${userId}.json`);\n        if (dataFromFile != null) {\n          JoinRoomData = JSON.parse(dataFromFile);\n        }\n        if (JoinRoomData.length === 0)\n          return;\n        let online = JoinRoomData[JoinRoomData.length - 1].online;\n        if (!online)\n          return;\n        let lastItemRoomId = JoinRoomData[JoinRoomData.length - 1].roomId;\n        const fileName = `spy_track_${userId}`;\n        const userName = JoinRoomData[JoinRoomData.length - 1].userName || \"\";\n        const content = `在房间${lastItemRoomId}下线了`;\n        const message = `<>[spy] 用户<at id='${userId}'/>在房间<at roomId='${lastItemRoomId}'/>下线了</>`;\n        trackUserPosition.handleTrack(trackQueue, fileName, lastItemRoomId, false, specialIDsTrackRoot, content, message, userName, userId, session);\n      });\n    });\n    const intervalTask = new IntervalTask(ctx);\n    await intervalTask.chatQueueIntervalFunc(messageQueue, config);\n    await intervalTask.trackQueueIntervalFunc(trackQueue, config);\n  } catch (error) {\n    logger.error(error);\n  }\n}\n__name(apply, \"apply\");\n\n// src/index.ts\nvar name = \"iirose-spy\";\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n  Config,\n  apply,\n  name\n});\n"]}