import { definePlugin } from 'kivibot' interface ImpartItem { length: number injectedValue: number injectedCount: number ejaculatedValue: number ejaculateCount: number lastEjaculateAt: number masturbateCount: number } const defaultItem = { length: 6, injectedValue: 0, injectedCount: 0, ejaculatedValue: 0, ejaculateCount: 0, lastEjaculateAt: 0, masturbateCount: 0, } const interval = 1 * 60 * 60 * 1000 // 1 hours export default definePlugin({ name: '赛博银趴', version: '1.1.0', async setup(ctx) { const filename = ctx.path.join(__dirname, './config.json') const config = !ctx.fs.existsSync(filename) ? [] : require(filename) const store = ctx.createVanilla({ data: config as [number, ImpartItem][] }) store.subscribe(() => { ctx.fs.writeFileSync(filename, JSON.stringify(store.mutate.data)) }) function getItem(id: number): ImpartItem { let item = store.mutate.data.find((x) => x[0] === id)?.[1] if (!item) { item = { ...defaultItem } store.mutate.data.push([id, item]) } return item } function isInInterval(last: number): boolean { return Date.now() - last < interval } function nextTime(last: number): string { if (!last || !isInInterval(last)) return '现在!!!' const res = (last + interval - Date.now()) / 1000 / 60 const min = Math.floor(res) const sec = Math.floor((res - min) * 60) return min ? `${min} 分 ${sec} 秒后` : `${sec} 秒后` } ctx.handle('message.group', async (e) => { const text = ctx.getText(e) if (!text) return const item = getItem(e.sender.user_id) if (['打搅', '打胶'].includes(text)) { if (isInInterval(item.lastEjaculateAt)) { return e.reply( `你已经榨不出任何东西啦,等会再来吧。杂鱼~ 杂鱼~(${nextTime(item.lastEjaculateAt)}可再次释放)`, true, ) } const value = ctx.randomInt(1, 100) const randomGrow = ctx.randomInt(10, 100) / 1000 item.ejaculateCount++ item.ejaculatedValue += value item.masturbateCount++ item.lastEjaculateAt = Date.now() item.length = Math.round((randomGrow + item.length) * 1000) / 1000 return e.reply( `打胶结束啦,真舒服~ 你释放了 ${value} 毫升 DNA 🧬!你的牛牛变长了 ${randomGrow} 厘米!目前长度 ${item.length} 厘米。`, true, ) } if (['我的牛牛', '俺的牛牛', '我的牛子', '俺的牛子'].includes(text)) { return e.reply( [ ctx.oicq.segment.image(ctx.getQQAvatarLink(e.sender.user_id, 100)), ctx.dedent( ` 牛牛长度: ${item.length} 厘米 共计打胶: ${item.masturbateCount} 次 共计释放: ${item.ejaculateCount} 次 总释放量: ${item.ejaculatedValue} 毫升 DNA 🧬 共计被注入: ${item.injectedCount} 次 总被注入量: ${item.injectedValue} 毫升 DNA 🧬 上次释放: ${item.lastEjaculateAt ? ctx.dayjs(item.lastEjaculateAt).format('YYYY-MM-DD HH:mm:ss') : '还没有释放过'} 下次可释放: ${nextTime(item.lastEjaculateAt)} `, ), ], true, ) } if (['牛牛榜', '牛牛排行榜', '牛子榜', '牛子排行榜'].some((e) => text === e)) { const top = store.mutate.data .filter(([id, item]) => item.length > 6) .map(([id, item]) => ({ id, length: item.length })) .sort((a, b) => b.length - a.length) .slice(0, 99) const gm = ctx.bot.gml.get(e.group_id) const msgs = await e.group.makeForwardMsg( top.map((item) => { const friend = ctx.bot.fl.get(item.id) const info = gm?.get(item.id) return { nickname: friend?.nickname || info?.card || '牛牛排行榜', user_id: item.id, message: `👤 ${friend?.nickname || info?.card || '[不愿透露姓名的群友]'}\n🆔 ${item.id}\n🐮 ${item.length} 厘米`, } }), ) return e.reply(msgs) } // 以下需要 @ 或者回复某人 const id = await ctx.getMentionedUserId(e) if (!id) return const targetItem = getItem(id) if (['它的牛牛', '他的牛牛', '她的牛牛'].some((e) => text === e)) { return e.reply( [ ctx.oicq.segment.image(ctx.getQQAvatarLink(id, 100)), ctx.dedent( ` 牛牛长度: ${targetItem.length} 厘米 共计打胶: ${targetItem.masturbateCount} 次 共计释放: ${targetItem.ejaculateCount} 次 总释放量: ${targetItem.ejaculatedValue} 毫升 DNA 🧬 共计被注入: ${targetItem.injectedCount} 次 总被注入量: ${targetItem.injectedValue} 毫升 DNA 🧬 上次释放: ${targetItem.lastEjaculateAt ? ctx.dayjs(targetItem.lastEjaculateAt).format('YYYY-MM-DD HH:mm:ss') : '还没有释放过'} 下次可释放: ${nextTime(targetItem.lastEjaculateAt)} `, ), ], true, ) } if (['透'].some((e) => text === e)) { if (isInInterval(item.lastEjaculateAt)) { return e.reply( [ ctx.oicq.segment.at(e.sender.user_id), ` 你已经榨不出任何东西啦,等会再来吧小杂鱼~(冷却至 ${nextTime(item.lastEjaculateAt)})`, ], true, ) } const isSuccess = Math.random() < 0.5 if (!isSuccess) { return await e.reply( [ ctx.oicq.segment.image(ctx.getQQAvatarLink(e.sender.user_id, 100)), '啊,没想到 ', ctx.oicq.segment.at(e.sender.user_id), ' 床技不如人... 被 ', ctx.oicq.segment.at(id), ' 反透了!呜呜呜... 你的牛牛没有任何变化...', ], true, ) } const length = ctx.randomInt(1, 100) / 1000 const value = ctx.randomInt(1, 100) item.length = Math.round((length + item.length) * 1000) / 1000 item.ejaculateCount++ item.ejaculatedValue += value item.lastEjaculateAt = Date.now() targetItem.injectedCount++ targetItem.injectedValue += value return await e.reply( [ ctx.oicq.segment.image(ctx.getQQAvatarLink(id, 100)), '好耶,', ctx.oicq.segment.at(e.sender.user_id), ' 一口气给 ', ctx.oicq.segment.at(id), ' 注入了 ', String(value), ` 毫升 DNA 🧬!你的牛牛变长了 ${length} 厘米!目前长度 ${item.length} 厘米!`, ], true, ) } }) }, })