UNPKG

@xiling-bot/sleep

Version:

279 lines (267 loc) 8.92 kB
const { join } = require("path"); const db = require("better-sqlite3")(join(process.cwd(), "database/sleep.db")); let onWeak = [], sleepText = [ { text: "愿好梦", ran: 0.5 }, { text: "睡个好觉吧~", ran: 0.5 }, { text: "晚安啦~", ran: 0.5 }, { text: "让好梦洗去你一天的疲惫", ran: 0.25 }, { text: "夜已安静被里多温暖", ran: 0.15 }, { text: "今夜の月は綺麗ですね", ran: 0.05 } ], weekUpText = [ { text: "早上好", ran: 0.5 }, { text: "早安呀", ran: 0.5 } ], noSleepText = [ { text: "猪猪都没你能睡!", ran: 0.1 }, { text: "别睡了别睡了", ran: 0.2 }, { text: "再睡成猪了", ran: 0.2 }, { text: "你才睡醒没多久呢,等会再睡吧", ran: 0.5 } ], drpText = [ { text: "你因为睡得太久被踹下床了", ran: 0.5 }, { text: "你在睡觉时被丢进锅里炖掉了", ran: 0.4 }, { text: "你在睡觉时被UFO吸走了", ran: 0.3 }, { text: "你在睡觉时被做成了春卷", ran: 0.2 }, { text: "你睡着睡着消失了!", ran: 0.1 }, ]; // 从传入函数根据比例随机抽取一条文件返回 function ranText(arr) { let totalNum = 0, numMap = [], lastNum = 0, fixNum = getFixNum(arr); arr.forEach(el => { totalNum += el.ran * fixNum; numMap.push({ text: el.text, ran: [lastNum, totalNum] }); lastNum = totalNum + 1; }) let ranNum = Math.round(Math.random() * totalNum), text = ""; numMap.forEach(el => { if (ranNum >= el.ran[0] && el.ran[1] >= ranNum) { text = el.text; } }) return text; } // 获取小数位数 function getFixNum(arr) { let num = 1, ret = "1"; arr.forEach(el => { if (el.ran.toString().split(".").length === 2) { let thisNum = el.ran.toString().split(".")[1].length if (thisNum > num) { num = thisNum; } } }); for (var i = 0; i < num; i++) { ret += "0"; } return ret * 1; } // 数据库请求封装 function getSleep(groupId, userId) { return db.prepare("SELECT * FROM sleep WHERE groupId = ? AND userId = ?").get(groupId, userId); } // 获取睡觉列表 function getBed(bed) { let text = "", count = 0; bed.forEach((el, index) => { if (el.startTime) { text += `${count ? "\n" : ""}${getStatus(el.startTime)} - ${el.userName}`; ++count; } }) return text; } // 获取睡觉状态 function getStatus(time) { let thisTime = new Date(), sleepTime = new Date(time); if (thisTime - sleepTime > 6 * 60 * 60 * 1000) { return "(¦3[▓^]"; } else if (thisTime - sleepTime > 2 * 60 * 60 * 1000) { return "(¦3[▓▓]"; } else if (thisTime - sleepTime > 1 * 60 * 60 * 1000) { return "(:3[▓▓]"; } else { return "(:3ꇤ[▓▓]"; } } // 获取当前早中晚 function getDayTime() { let thisTime = new Date(), hour = thisTime.getHours(); if (hour <= 6) { return "凌晨"; } else if (hour < 12) { return "早上"; } else if (hour === 12) { return "中午"; } else if (hour <= 19) { return "下午"; } else { return "晚上"; } } // 计算时间 function getTime(seconds) { let ss = parseInt(seconds / 1000), // 秒 mm = 0, // 分 hh = 0; // 小时 if (ss > 60) { mm = parseInt(ss / 60); ss = parseInt(ss % 60); } if (mm > 60) { hh = parseInt(mm / 60); mm = parseInt(mm % 60); } let result = ('00' + parseInt(ss)).slice(-2) + '秒'; if (mm > 0) { result = ('00' + parseInt(mm)).slice(-2) + '分' + result; } else { result = '00:' + result; } if (hh > 0) { hh = hh.toString(); if (hh.length >= 3) { result = hh + '时' + result; } else { result = ('00' + parseInt(hh)).slice(-2) + '时' + result; } } return result; } // 起床函数 function wakeUp(msg) { let groupId = msg.sender.group.id, userId = msg.sender.id, userName = msg.sender.memberName, thisTime = new Date().getTime(), sleepTime = thisTime - getSleep(groupId, userId).startTime; onWeak.push({ "id": msg.sender.id, "weakTime": thisTime }); if (thisTime === sleepTime) { msg.reply([{ type: "At", target: msg.sender.id }, { type: "Plain", text: ranText(drpText) }], msg); } else { msg.reply([{ type: "At", target: msg.sender.id }, { type: "Plain", text: ` ${getDayTime()}好呀~ 你睡了${getTime(sleepTime)}` }], msg); let totalSleep = db.prepare("SELECT * FROM sleep_ranking WHERE groupId = ? AND userId = ?").get(groupId, userId); if (totalSleep) { let totalTime = totalSleep.sleepTime + sleepTime; // console.log(totalTime, groupId, userId); db.prepare("UPDATE sleep_ranking SET sleepTime = ? , userName = ? WHERE groupId = ? AND userId = ?").run(totalTime, userName, groupId, userId); } else { // console.log(groupId, userId, userName, sleepTime); db.prepare("INSERT INTO sleep_ranking VALUES (?,?,?,?)").run(groupId, userId, userName, sleepTime); } } db.prepare("DELETE FROM sleep WHERE groupId = ? AND userId = ? ").run(groupId, userId); } // 清理床 function cleanBed(msg) { let maxSleepTime = 24 * 60 * 60 * 1000, // 一次性最多睡24小时 sleepWaiting = 2 * 60 * 1000, // 再次睡下前需要等待一定时间 groupId = msg.sender.group.id, thisTime = new Date().getTime(), groupBed = db.prepare("SELECT * FROM sleep WHERE groupId = ?").all(groupId); groupBed.forEach(el => { if (thisTime - el.startTime > maxSleepTime && el.startTime !== 0) { // 开始睡觉时间为0则代表已经被丢下床了不用再丢一次 db.prepare("UPDATE sleep SET startTime = ? WHERE groupId = ? AND userId = ?").run(0, groupId, el.userId); // 设置开始时间为不可能的数值用于判断用户状态 let totalSleep = db.prepare("SELECT * FROM sleep_ranking WHERE groupId = ? AND userId = ?").get(groupId, el.userId); if (totalSleep) { let totalTime = totalSleep.sleepTime + maxSleepTime; db.prepare("UPDATE sleep_ranking SET sleepTime = ? WHERE groupId = ? AND userId = ?").run(totalTime, groupId, el.userId); // 将时间写入总睡觉时间内 } else { db.prepare("INSERT INTO sleep_ranking VALUES (?,?,?,?)").run(groupId, el.userId, el.userName, maxSleepTime); } } }); onWeak = onWeak.filter(el => thisTime - el.weakTime < sleepWaiting); } // 获取用户排名 function getMedal(index) { let medal = ["🐷", "🥈", "🥉"]; if (medal[index]) { return medal[index]; } return index + 1; } // 插件暴露方法 const sleep = { name: "群睡觉", mounted() { // 初始化数据库 db.prepare("CREATE TABLE IF NOT EXISTS sleep(\"groupId\" integer NOT NULL,\"userId\" integer NOT NULL,\"userName\" text NOT NULL,\"startTime\" integer NOT NULL)").run(); db.prepare("CREATE TABLE IF NOT EXISTS sleep_ranking(\"groupId\" integer NOT NULL,\"userId\" integer NOT NULL,\"userName\" text NOT NULL,\"sleepTime\" integer NOT NULL)").run(); }, command: [{ name: "床", exce(msg) { cleanBed(msg); let groupId = msg.sender.group.id, bed = db.prepare("SELECT * FROM sleep WHERE groupId = ?").all(groupId), text = getBed(bed); if (text.length) { msg.reply([{ type: "Plain", text }], msg); } else { msg.reply([{ type: "Plain", text: "没有人在床上" }], msg); } } }, { name: "睡觉", exce(msg) { cleanBed(msg); if (!onWeak.find((el) => el.id === msg.sender.id)) { let groupId = msg.sender.group.id, userId = msg.sender.id, userName = msg.sender.memberName, startTime = new Date().getTime(); let bed = db.prepare("INSERT INTO sleep VALUES (?,?,?,?)").run(groupId, userId, userName, startTime); msg.reply([{ type: "Plain", text: ranText(sleepText) }], msg); } else { msg.reply([{ type: "Plain", text: ranText(noSleepText) }], msg); } } }, { name: "睡觉排行", exce(msg) { cleanBed(msg); let groupId = msg.sender.group.id, ranking = db.prepare("SELECT * FROM sleep_ranking WHERE groupId = ?").all(groupId); ranking.sort((da, db) => db.sleepTime - da.sleepTime); let text = "猪猪排行\n"; // 默认只展示前10名和自己的排位 let showNum = ranking.length > 10 ? 10 : ranking.length; for (let i = 0; i < showNum; i++) { text += `${getMedal(i)} - ${ranking[i].userName} [${getTime(ranking[i].sleepTime)}]\n`; } let sort = ranking.findIndex(el => el.userId === msg.sender.id); if (sort > showNum) { text += "...\n"; text += `${getMedal(sort)} - ${ranking[sort].userName} [${getTime(ranking[sort].sleepTime)}]`; } msg.reply([{ type: "Plain", text: text }], msg); } } ], priority: { name: "自动起床", exce(msg) { let groupId = msg.sender.group.id, userId = msg.sender.id; if (getSleep(groupId, userId)) { cleanBed(msg); wakeUp(msg); return true; } return false; } } } module.exports = sleep;