koishi-plugin-bellabot
Version:
[](https://www.npmjs.com/package/koishi-plugin-bellabot)
310 lines (309 loc) • 20.2 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Signin = exports.inject = void 0;
const jsx_runtime_1 = require("@satorijs/element/jsx-runtime");
const koishi_1 = require("koishi");
const timeGreetings = [
{ range: [0, 6], message: '凌晨好' },
{ range: [6, 11], message: '上午好' },
{ range: [11, 14], message: '中午好' },
{ range: [14, 18], message: '下午好' },
{ range: [18, 20], message: '傍晚好' },
{ range: [20, 24], message: '晚上好' },
];
const levelInfos = [
{ level: 1, level_line: 1000 },
{ level: 2, level_line: 3000 },
{ level: 3, level_line: 7000 },
{ level: 4, level_line: 15000 },
{ level: 5, level_line: 30000 },
{ level: 6, level_line: 50000 },
{ level: 7, level_line: 80000 },
{ level: 8, level_line: 170000 },
{ level: 9, level_line: 350000 },
{ level: 10, level_line: 800000 },
];
exports.inject = ['database'];
// 参数: ctx:Context, config?:Config
class Signin {
ctx;
cfg;
constructor(context, config) {
this.ctx = context;
this.cfg = config;
this.ctx.database.extend("bella_sign_in", {
id: "string",
name: "string",
time: "string",
point: "unsigned",
count: "unsigned",
current_point: "unsigned",
working: "boolean",
stime: "unsigned",
wpoint: "unsigned",
wktimecard: "unsigned",
wktimespeed: "boolean"
});
}
// 0:已签到, 1:签到成功, 2:未签到, 3:抽奖
// { "cmd":"get", "status": 1, "getpoint": signpoint, "signTime": signTime, "allpoint": signpoint, "count": 1 };
// 参数:session, 返回:json
async callSignin(session) {
var name;
if (this.ctx.database && this.cfg.signin.callme)
name = session.username;
if (!name && this.cfg.signin.callme)
name = session.author.name;
else
name = session.username;
name = name.length > 12 ? name.substring(0, 12) : name;
let signTime = koishi_1.Time.template('yyyy-MM-dd hh:mm:ss', new Date());
let all_point = (await this.ctx.database.get('bella_sign_in', { id: String(session.userId) }))[0]?.point;
let time = (await this.ctx.database.get('bella_sign_in', { id: String(session.userId) }))[0]?.time;
let count = (await this.ctx.database.get('bella_sign_in', { id: String(session.userId) }))[0]?.count;
let dbname = (await this.ctx.database.get('bella_sign_in', { id: String(session.userId) }))[0]?.name;
let signpoint = koishi_1.Random.int(this.cfg.signin.signpointmin, this.cfg.signin.signpointmax);
if (!dbname)
await this.ctx.database.upsert('bella_sign_in', [{ id: (String(session.userId)), name: name }]);
if (!all_point && !time) {
await this.ctx.database.upsert('bella_sign_in', [{ id: (String(session.userId)), name: name, time: signTime, point: Number(signpoint), count: 1, current_point: Number(signpoint) }]);
// logger.info(`${name}(${session.userId}) 第一次签到成功,写入数据库!`)
return { "cmd": "get", "status": 1, "getpoint": signpoint, "signTime": signTime, "allpoint": signpoint, "count": 1 };
}
if (Number(time.slice(8, 10)) - Number(signTime.slice(8, 10))) {
await this.ctx.database.upsert('bella_sign_in', [{ id: (String(session.userId)), name: name, time: signTime, point: Number(all_point + signpoint), count: count + 1, current_point: Number(signpoint) }]);
// logger.info(`${name}(${session.userId}) 签到成功!`)
return { "cmd": "get", "status": 1, "getpoint": signpoint, "signTime": signTime, "allpoint": all_point + signpoint, "count": count + 1 };
}
return { "cmd": "get", "status": 0, "getpoint": signpoint, "signTime": signTime, "allpoint": all_point, "count": count };
}
// 参数:session, 返回:json
async signQuery(session) {
let all_point = (await this.ctx.database.get('bella_sign_in', { id: String(session.userId) }))[0]?.point;
let time = (await this.ctx.database.get('bella_sign_in', { id: String(session.userId) }))[0]?.time;
let count = (await this.ctx.database.get('bella_sign_in', { id: String(session.userId) }))[0]?.count;
let current_point = (await this.ctx.database.get('bella_sign_in', { id: String(session.userId) }))[0]?.current_point;
let nowTime = koishi_1.Time.template('yyyy-MM-dd hh:mm:ss', new Date());
if (Number(time.slice(8, 10)) - Number(nowTime.slice(8, 10))) {
return { "cmd": "query", "status": 2, "getpoint": current_point ? current_point : 0, "signTime": time ? time : "暂无数据", "allpoint": all_point ? all_point : 0, "count": count ? count : 0 };
}
return { "cmd": "query", "status": 0, "getpoint": current_point ? current_point : 0, "signTime": time ? time : "暂无数据", "allpoint": all_point ? all_point : 0, "count": count ? count : 0 };
}
// 参数:session,point 返回:<> <at />string </>
async lottery(session, point) {
let all_point = (await this.ctx.database.get('bella_sign_in', { id: String(session.userId) }))[0]?.point;
if (!point || point < 0 || isNaN(Number(point)))
return "清输入有效积分";
else if (all_point - point < 0)
return "积分不足!";
else {
if (koishi_1.Random.bool(this.cfg.signin.lotteryOdds)) {
var result = this.rangePoint(point);
await this.ctx.database.upsert('bella_sign_in', [{ id: (String(session.userId)), point: Number(all_point - point + result.final_point) }]);
return (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("at", { id: session.userId }), "\n", result.msg, " \n \u6D88\u8017", point, "\u79EF\u5206\u62BD\u5F97: ", result.final_point, "\u79EF\u5206"] });
}
else {
await this.ctx.database.upsert('bella_sign_in', [{ id: (String(session.userId)), point: Number(all_point - point) }]);
return (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("at", { id: session.userId }), "\n \u83B7\u5F97\u79EF\u5206:0\n", koishi_1.Random.pick([
(0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: "\u8D4C\u72D7\u8D4C\u72D7\uFF0C\u8D4C\u5230\u6700\u540E\u4E00\u65E0\u6240\u6709\uFF01" }),
(0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: "\u54E6\u543C\uFF0C\u79EF\u5206\u6CA1\u55BD\uFF01" }),
(0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: "\u8C22\u8C22\u4F60\u7684\u79EF\u5206\uFF01" }),
(0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: "\u79EF\u5206\u5316\u4F5C\u4E86\u5C18\u57C3" }),
(0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: "\u54C8\u54C8\uFF01\u5927\u5927\u5927\u975E\u914B" }),
(0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: "\u6742\u9C7C\u2661~\u5927\u54E5\u54E5\u8FDE\u8FD9\u70B9\u79EF\u5206\u90FD\u8D4C\u6389\u4E86\u5462~" }),
(0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: "\u6742\u9C7C\u2661~\u6742\u9C7C\u2661~" }),
(0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: "\u6478\u6478\uFF0C\u6742\u9C7C\u5927\u54E5\u54E5\u4E0D\u54ED~" })
])] });
}
}
}
// 参数:session 返回:<>string</>
async workstart(session) {
var name;
if (this.ctx.database && this.cfg.signin.callme)
name = session.user.name;
if (!name && this.cfg.signin.callme)
name = session.author.name;
else
name = session.username;
let working = (await this.ctx.database.get('bella_sign_in', { id: String(session.userId) }))[0]?.working;
let wktimecard = (await this.ctx.database.get('bella_sign_in', { id: String(session.userId) }))[0]?.wktimecard;
let nowTime = Math.floor(Date.now() / 1000 / 60);
if (working)
return (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [name, "\u6253\u5DE5\u4EFB\u52A1\u6B63\u5728\u8FDB\u884C\uFF0C\u53EF\u4EE5\u4F7F\u7528\"\u7ED3\u675F\u6253\u5DE5\"\u7ED3\u675F\u4EFB\u52A1"] });
else {
await this.ctx.database.upsert('bella_sign_in', [{ id: (String(session.userId)), working: true, stime: nowTime }]);
return (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [name, "\u6253\u5DE5\u5F00\u59CB^v^\nTip: \u6253\u5DE5\u65F6\u95F4\u6700\u5C11\u534A\u5C0F\u65F6\uFF0C\u6700\u591A\u4E3A", 8 + wktimecard, "\u5C0F\u65F6\u54E6~"] });
}
}
// 参数:session 返回:<>string</>
async workend(session) {
var name;
if (this.ctx.database && this.cfg.signin.callme)
name = session.user.name;
if (!name && this.cfg.signin.callme)
name = session.author.name;
else
name = session.username;
let all_point = (await this.ctx.database.get('bella_sign_in', { id: String(session.userId) }))[0]?.point;
let working = (await this.ctx.database.get('bella_sign_in', { id: String(session.userId) }))[0]?.working;
let stime = (await this.ctx.database.get('bella_sign_in', { id: String(session.userId) }))[0]?.stime;
let wpoint = (await this.ctx.database.get('bella_sign_in', { id: String(session.userId) }))[0]?.wpoint;
let wktimecard = (await this.ctx.database.get('bella_sign_in', { id: String(session.userId) }))[0]?.wktimecard;
let wkspeed = (await this.ctx.database.get('bella_sign_in', { id: String(session.userId) }))[0]?.wktimespeed;
let nowTime = Math.floor(Date.now() / 1000 / 60);
if (working) {
await this.ctx.database.upsert('bella_sign_in', [{ id: (String(session.userId)), working: false }]);
var time = nowTime - stime;
time = wktimecard ? (time >= (8 + wktimecard) * 60 ? (8 + wktimecard) * 60 : time) : (time >= 8 * 60 ? 8 * 60 : time);
var point = time < 30 ? 0 : (wkspeed ? Math.floor((time) * (this.levelJudge(all_point).level)) : Math.floor((time / 2) * (this.levelJudge(all_point).level)));
await this.ctx.database.upsert('bella_sign_in', [{ id: (String(session.userId)), point: all_point + point, wpoint: wpoint + point }]);
return (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [name, "\u6253\u5DE5\u7ED3\u675F\u5566\uFF01\n\u672C\u6B21\u6253\u5DE5", Math.floor(time / 60), "\u5C0F\u65F6", time % 60, "\u5206\u949F\n\u83B7\u5F97\u79EF\u5206:", point] });
}
else
return (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [name, "\u8FD8\u6CA1\u6709\u6B63\u5728\u8FDB\u884C\u7684\u6253\u5DE5\u4EFB\u52A1\u54E6,\u4F7F\u7528\"\u5F00\u59CB\u6253\u5DE5\"\u547D\u4EE4\u53EF\u4EE5\u8FDB\u884C\u6253\u5DE5\u54E6"] });
}
// 参数:session 返回:<>string</>
async workcheck(session) {
var name;
if (this.ctx.database && this.cfg.signin.callme)
name = session.user.name;
if (!name && this.cfg.signin.callme)
name = session.author.name;
else
name = session.username;
let all_point = (await this.ctx.database.get('bella_sign_in', { id: String(session.userId) }))[0]?.point;
let working = (await this.ctx.database.get('bella_sign_in', { id: String(session.userId) }))[0]?.working;
let stime = (await this.ctx.database.get('bella_sign_in', { id: String(session.userId) }))[0]?.stime;
let wpoint = (await this.ctx.database.get('bella_sign_in', { id: String(session.userId) }))[0]?.wpoint;
let nowTime = Math.floor(Date.now() / 1000 / 60);
var time = nowTime - stime;
let wktimecard = (await this.ctx.database.get('bella_sign_in', { id: String(session.userId) }))[0]?.wktimecard;
let wkspeed = (await this.ctx.database.get('bella_sign_in', { id: String(session.userId) }))[0]?.wktimespeed;
time = wktimecard ? (time >= (8 + wktimecard) * 60 ? (8 + wktimecard) * 60 : time) : (time >= 8 * 60 ? 8 * 60 : time);
return (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [name, working ? '正在打工' : '当前没有打工', "\n \u6253\u5DE5\u65F6\u95F4: ", working ? `${Math.floor(time / 60)}小时${time % 60}分钟` : '暂无信息', "\n \u53EF\u83B7\u79EF\u5206: ", working ? (time < 30 ? 0 : (wkspeed ? Math.floor((time) * (this.levelJudge(all_point).level)) : Math.floor((time / 2) * (this.levelJudge(all_point).level)))) : 0, "\n \u6253\u5DE5\u603B\u83B7\u5F97\u79EF\u5206: ", wpoint ? wpoint : 0] });
}
// 参数:session,count,user 返回:<>string</>
async givepoint(session, count, user) {
let all_point = (await this.ctx.database.get('bella_sign_in', { id: String(session.userId) }))[0]?.point;
if (!user)
user = session.userId;
if (!count)
return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: "\u8BF7\u8F93\u5165\u6709\u6548\u6570\u5B57" });
if (count < 0 && all_point - Math.abs(count) <= 0)
return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: "\u5BF9\u65B9\u6CA1\u6709\u8FD9\u4E48\u591A\u79EF\u5206" });
else if (this.cfg.signin.superuser.includes(session.userId)) {
await this.ctx.database.upsert('bella_sign_in', [{ id: (String(user.replace(/.*:/gi, ''))), point: (count < 0) ? all_point - Math.abs(count) : all_point + count }]);
return (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: ["\u6210\u529F\u7ED9", (0, jsx_runtime_1.jsx)("at", { id: user.replace(/.*:/gi, '') ? user : user.replace(/.*:/gi, '') }), (count < 0) ? "减去" : "补充", count, "\u70B9\u79EF\u5206."] });
}
else {
return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: "\u6CA1\u6709\u6743\u9650!" });
}
}
async shop(session) {
var shoptimes = 5;
await session.send((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: "\u6240\u6709\u5546\u54C1: \n \u5E8F\u53F7 \u540D\u79F0 \u4EF7\u683C\uFF08\u79EF\u5206\uFF09\n 1. \u6253\u5DE5\u52A0\u65F6\u5361 3000\n 2. \u6253\u5DE5\u7FFB\u500D\u5361 6000\n \u8BF7\u8F93\u5165\u5E8F\u53F7\u8D2D\u4E70\uFF0C$\u53D6\u6D88\u8D2D\u4E70" }));
while (shoptimes) {
// 等待用户输入序号
let sel = await session.prompt(30000);
if (sel == '$' || sel == '¥')
return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: "\u53D6\u6D88\u8D2D\u4E70\uFF0C\u6B22\u8FCE\u4E0B\u6B21\u5149\u4E34!" });
else
await session.send((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [await this.shopJudge(session, Number(sel)), "\n\u53EF\u4EE5\u7EE7\u7EED\u8F93\u5165\u5E8F\u53F7\u8D2D\u4E70\u5546\u54C1\u54E6~(\u6700\u591A5\u6B21)"] }));
shoptimes--;
}
return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: "\u8FDE\u7EED\u8D2D\u4E70\u6B21\u6570\u4E0A\u9650\uFF0C\u8BF7\u91CD\u65B0\u4F7F\u7528\"\u79EF\u5206\u5546\u5E97\"\u547D\u4EE4" });
}
async rankUsers(count) {
const signinData = await this.ctx.database.get('bella_sign_in', {
count: { $gt: 0 },
});
const sortedData = signinData.sort((a, b) => b.point - a.point)
.slice(0, count)
.map((item, index) => (0, jsx_runtime_1.jsxs)("tr", { style: "background-color: #f2f2f2;", children: [(0, jsx_runtime_1.jsx)("td", { style: "padding: 12px; border: 1px solid #ddd;", children: index + 1 }), (0, jsx_runtime_1.jsx)("td", { style: "padding: 12px; border: 1px solid #ddd;", children: item.name ? item.name : item.id }), (0, jsx_runtime_1.jsx)("td", { style: "padding: 12px; border: 1px solid #ddd;", children: item.point })] }));
// .map((item, index) => <p>{index + 1} > {item.name? item.name:item.id} > {item.point}</p>);
// .map(item => ({ name: item.name? item.name:item.id, id: item.id, point: item.point }));
return sortedData;
}
rangePoint(count) {
var cnt = koishi_1.Random.int(0, 8); // 0.2 0.5 0.8 1.2 1.5 2.0 3.0 4.0 1.0
let result = {
final_point: 0,
msg: 'string'
};
switch (cnt) {
case 0:
result = { final_point: Math.floor(count * 0.2), msg: "哈哈,赌狗!" };
break;
case 1:
result = { final_point: Math.floor(count * 0.5), msg: "伤害减半!" };
break;
case 2:
result = { final_point: Math.floor(count * 0.8), msg: "不过如此" };
break;
case 3:
result = { final_point: Math.floor(count * 1.2), msg: "运气不错!" };
break;
case 4:
result = { final_point: Math.floor(count * 1.5), msg: "哇哦!欧皇!" };
break;
case 5:
result = { final_point: Math.floor(count * 2.0), msg: "双倍泰裤辣!" };
break;
case 6:
result.final_point = (koishi_1.Random.bool(0.5)) ? Math.floor(count * 3.0) : count;
result.msg = (result.final_point - count) ? "3倍!这是甚么运气!" : "欸嘿,虚晃一枪!";
break;
case 7:
result.final_point = (koishi_1.Random.bool(0.3)) ? Math.floor(count * 4.0) : count;
result.msg = (result.final_point - count) ? "太可怕了!是有什么欧皇秘诀吗" : "欸嘿,虚晃一枪!";
break;
default:
result.final_point = count;
result.msg = "欸嘿,虚晃一枪!";
break;
}
return result;
}
levelJudge(all_point) {
for (const levelInfo of levelInfos) {
if (all_point <= levelInfo.level_line) {
return levelInfo;
}
}
return levelInfos[levelInfos.length - 1]; // Default to the last level
}
getGreeting(hour) {
const greeting = timeGreetings.find((timeGreeting) => hour >= timeGreeting.range[0] && hour < timeGreeting.range[1]);
return greeting ? greeting.message : '你好';
}
async shopJudge(session, select) {
let wktimecard = (await this.ctx.database.get('bella_sign_in', { id: String(session.userId) }))[0]?.wktimecard;
let wktimespeed = (await this.ctx.database.get('bella_sign_in', { id: String(session.userId) }))[0]?.wktimespeed;
let all_point = (await this.ctx.database.get('bella_sign_in', { id: String(session.userId) }))[0]?.point;
if (Number(select) == 1) {
var point_condition = (all_point - 3000 >= 0) ? true : false;
var shop_cnt = wktimecard <= 8 ? true : false;
if (point_condition && shop_cnt) {
await this.ctx.database.upsert('bella_sign_in', [{ id: String(session.userId), point: all_point - 3000, wktimecard: wktimecard + 1 }]);
return '购买成功!打工时长上限+1h(上限不得超过9h)';
}
else if (!point_condition)
return '积分不足!';
else
return '购买次数达到上限';
}
if (Number(select) == 2) {
var point_condition = (all_point - 6000 >= 0) ? true : false;
if (point_condition && !wktimespeed) {
await this.ctx.database.upsert('bella_sign_in', [{ id: String(session.userId), point: all_point - 3000, wktimespeed: true }]);
return '购买成功!打工获取积分翻倍(购买后永久生效)';
}
else if (wktimespeed)
return '您已购买此商品';
else
return '积分不足!';
}
}
}
exports.Signin = Signin;