koishi-plugin-jrys-plus 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/index.js +5 -3
- package/lib/ranks.d.ts +2 -2
- package/lib/ranks.js +6 -13
- package/lib/signin.d.ts +9 -8
- package/lib/signin.js +12 -8
- package/package.json +1 -1
package/lib/index.js
CHANGED
|
@@ -128,12 +128,14 @@ async function fetchHitokoto() {
|
|
|
128
128
|
/* ── 主入口 ── */
|
|
129
129
|
function apply(ctx, config) {
|
|
130
130
|
si.initDatabase(ctx);
|
|
131
|
-
const
|
|
131
|
+
const db = ctx.database;
|
|
132
|
+
const puppeteer = ctx.puppeteer;
|
|
133
|
+
const signin = new si.Signin(db, config);
|
|
132
134
|
const jrys = new roll_1.Jrys();
|
|
133
135
|
// 合并事件
|
|
134
136
|
const eventJson = [...event_1.defaultEventJson, ...config.event];
|
|
135
137
|
// 注册排行榜
|
|
136
|
-
(0, ranks_1.registerRanks)(ctx, config, () => config.levelSet);
|
|
138
|
+
(0, ranks_1.registerRanks)(ctx, db, config, () => config.levelSet);
|
|
137
139
|
/* ── 运势签到命令 ── */
|
|
138
140
|
ctx.command('jrys', '今日运势')
|
|
139
141
|
.userFields(['id', 'name'])
|
|
@@ -184,7 +186,7 @@ function apply(ctx, config) {
|
|
|
184
186
|
.replace('{{BADDO}}', baddo);
|
|
185
187
|
const outPath = path_1.default.resolve(__dirname, 'templates', '_fortune_render.html');
|
|
186
188
|
fs_1.default.writeFileSync(outPath, html);
|
|
187
|
-
page = await
|
|
189
|
+
page = await puppeteer.page();
|
|
188
190
|
await page.setViewport({ width: 600, height: 1080 * 2 });
|
|
189
191
|
await page.goto(`file:///${outPath}`);
|
|
190
192
|
await page.waitForSelector('#body', { timeout: 10000 });
|
package/lib/ranks.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { Context } from 'koishi';
|
|
1
|
+
import { Context, Database } from 'koishi';
|
|
2
2
|
import { LevelInfo } from './signin';
|
|
3
|
-
export declare function registerRanks(ctx: Context, config: any, getLevelConfig: () => LevelInfo[]): void;
|
|
3
|
+
export declare function registerRanks(ctx: Context, db: Database<any>, config: any, getLevelConfig: () => LevelInfo[]): void;
|
package/lib/ranks.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.registerRanks = registerRanks;
|
|
4
4
|
const koishi_1 = require("koishi");
|
|
5
|
+
const signin_1 = require("./signin");
|
|
5
6
|
const fs_1 = require("fs");
|
|
6
7
|
const path_1 = require("path");
|
|
7
8
|
/* ── 模板路径候选 ── */
|
|
@@ -21,14 +22,6 @@ async function resolveTemplatePath() {
|
|
|
21
22
|
}
|
|
22
23
|
throw new Error('未找到 rank-card.html 模板文件');
|
|
23
24
|
}
|
|
24
|
-
/* ── 等级查询 ── */
|
|
25
|
-
const DEFAULT_LEVEL = { level: 0, levelExp: 0, levelName: '无等级', levelColor: '#666666' };
|
|
26
|
-
function getLevelInfo(exp, levels) {
|
|
27
|
-
if (!levels?.length)
|
|
28
|
-
return DEFAULT_LEVEL;
|
|
29
|
-
const sorted = [...levels].sort((a, b) => b.levelExp - a.levelExp);
|
|
30
|
-
return sorted.find(l => exp >= l.levelExp) || sorted[sorted.length - 1];
|
|
31
|
-
}
|
|
32
25
|
/* ── 文本渲染 ── */
|
|
33
26
|
function renderSignText(users, levelConfig, config) {
|
|
34
27
|
const divider = '┏' + '—'.repeat(config.borderwidth) + '┓';
|
|
@@ -40,7 +33,7 @@ function renderSignText(users, levelConfig, config) {
|
|
|
40
33
|
let lines = [`┃ ${medal} ${index + 1}. ${user.displayName}`, `┃ 📅${user.signCount.toLocaleString()} 天`];
|
|
41
34
|
if (config.pre_next_LevelDisplay && levelConfig.length) {
|
|
42
35
|
const sorted = [...levelConfig].sort((a, b) => a.levelExp - b.levelExp);
|
|
43
|
-
const cur = getLevelInfo(user.exp, levelConfig);
|
|
36
|
+
const cur = (0, signin_1.getLevelInfo)(user.exp, levelConfig);
|
|
44
37
|
const idx = sorted.findIndex(l => l.levelExp === cur.levelExp);
|
|
45
38
|
const prev = sorted[idx - 1]?.levelName;
|
|
46
39
|
const next = sorted[idx + 1]?.levelName;
|
|
@@ -70,7 +63,7 @@ async function renderRankImage(ctx, users, totalUsers, limit, getLevelConfig) {
|
|
|
70
63
|
updateTime: new Date().toLocaleString('zh-CN'),
|
|
71
64
|
users: users.map(user => {
|
|
72
65
|
const sorted = [...levelConfig].sort((a, b) => a.levelExp - b.levelExp);
|
|
73
|
-
const cur = getLevelInfo(user.exp, levelConfig);
|
|
66
|
+
const cur = (0, signin_1.getLevelInfo)(user.exp, levelConfig);
|
|
74
67
|
const idx = sorted.findIndex(l => l.levelExp === cur.levelExp);
|
|
75
68
|
const prev = sorted[idx - 1]?.levelName;
|
|
76
69
|
const nextObj = sorted[idx + 1];
|
|
@@ -113,13 +106,13 @@ async function renderRankImage(ctx, users, totalUsers, limit, getLevelConfig) {
|
|
|
113
106
|
}
|
|
114
107
|
}
|
|
115
108
|
/* ── 注册排行命令 ── */
|
|
116
|
-
function registerRanks(ctx, config, getLevelConfig) {
|
|
109
|
+
function registerRanks(ctx, db, config, getLevelConfig) {
|
|
117
110
|
const logger = ctx.logger('jrys-plus');
|
|
118
111
|
function canUseImage() {
|
|
119
112
|
return config.imageMode && !!ctx.puppeteer;
|
|
120
113
|
}
|
|
121
114
|
async function getRankedUsers() {
|
|
122
|
-
const all = await
|
|
115
|
+
const all = await db.get('jrys', {}, { sort: { signCount: 'desc' } });
|
|
123
116
|
if (!all.length)
|
|
124
117
|
return null;
|
|
125
118
|
const users = all.slice(0, config.limit).map(u => ({
|
|
@@ -136,7 +129,7 @@ function registerRanks(ctx, config, getLevelConfig) {
|
|
|
136
129
|
if (!users.length)
|
|
137
130
|
return '当前频道暂无数据';
|
|
138
131
|
if (canUseImage()) {
|
|
139
|
-
const total = (await
|
|
132
|
+
const total = (await db.get('jrys', {})).length;
|
|
140
133
|
const img = await renderRankImage(ctx, users, total, config.limit, getLevelConfig);
|
|
141
134
|
if (img)
|
|
142
135
|
return img;
|
package/lib/signin.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Context } from 'koishi';
|
|
1
|
+
import { Context, Database } from 'koishi';
|
|
2
2
|
declare module 'koishi' {
|
|
3
3
|
interface Tables {
|
|
4
4
|
jrys: _UserFortune;
|
|
@@ -38,21 +38,22 @@ export interface SigninConfig {
|
|
|
38
38
|
levelSet: LevelInfo[];
|
|
39
39
|
fortuneSet: FortuneInfo[];
|
|
40
40
|
}
|
|
41
|
+
export declare function getLevelInfo(exp: number, levels: LevelInfo[]): LevelInfo;
|
|
41
42
|
export declare class Signin {
|
|
42
|
-
private
|
|
43
|
+
private db;
|
|
43
44
|
private cfg;
|
|
44
|
-
constructor(
|
|
45
|
+
constructor(db: Database<any>, cfg: SigninConfig);
|
|
45
46
|
/** 执行签到。返回 0=成功, 1=已签到 */
|
|
46
47
|
callSignin(uid: number, userid: string, luck: number): Promise<{
|
|
47
|
-
status: number;
|
|
48
|
-
allExp: number;
|
|
49
|
-
signTime: Date;
|
|
50
|
-
count: number;
|
|
51
|
-
} | {
|
|
52
48
|
status: number;
|
|
53
49
|
allExp?: undefined;
|
|
54
50
|
signTime?: undefined;
|
|
55
51
|
count?: undefined;
|
|
52
|
+
} | {
|
|
53
|
+
status: number;
|
|
54
|
+
allExp: any;
|
|
55
|
+
signTime: Date;
|
|
56
|
+
count: any;
|
|
56
57
|
}>;
|
|
57
58
|
getLevelInfo(exp: number): {
|
|
58
59
|
levelInfo: LevelInfo;
|
package/lib/signin.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Signin = exports.defaultFortuneInfo = exports.defaultLevelInfo = void 0;
|
|
4
4
|
exports.initDatabase = initDatabase;
|
|
5
|
+
exports.getLevelInfo = getLevelInfo;
|
|
5
6
|
const timeGreetings = [
|
|
6
7
|
{ range: [0, 5], message: '晚安' },
|
|
7
8
|
{ range: [5, 9], message: '早上好' },
|
|
@@ -59,24 +60,27 @@ function initDatabase(ctx) {
|
|
|
59
60
|
signCount: 'unsigned',
|
|
60
61
|
});
|
|
61
62
|
}
|
|
62
|
-
|
|
63
|
-
|
|
63
|
+
function getLevelInfo(exp, levels) {
|
|
64
|
+
if (!levels?.length)
|
|
65
|
+
return { level: 0, levelExp: 0, levelName: '无等级', levelColor: '#666666' };
|
|
66
|
+
const sorted = [...levels].sort((a, b) => b.levelExp - a.levelExp);
|
|
67
|
+
return sorted.find(l => exp >= l.levelExp) || sorted[sorted.length - 1];
|
|
68
|
+
}
|
|
64
69
|
class Signin {
|
|
65
|
-
constructor(
|
|
66
|
-
this.
|
|
70
|
+
constructor(db, cfg) {
|
|
71
|
+
this.db = db;
|
|
67
72
|
this.cfg = cfg;
|
|
68
73
|
}
|
|
69
74
|
/** 执行签到。返回 0=成功, 1=已签到 */
|
|
70
75
|
async callSignin(uid, userid, luck) {
|
|
71
76
|
const date = new Date();
|
|
72
|
-
const roll = new roll_1.Jrys();
|
|
73
77
|
// 经验值仅用于后端等级/排行计算,不在签到卡上展示
|
|
74
78
|
const exp = Math.round((Math.random() * 0.5 + luck / 200) *
|
|
75
79
|
(this.cfg.signExp[1] - this.cfg.signExp[0])) + this.cfg.signExp[0];
|
|
76
|
-
const userData = await this.
|
|
80
|
+
const userData = await this.db.get('jrys', { id: uid });
|
|
77
81
|
if (userData.length === 0) {
|
|
78
82
|
const accExp = exp;
|
|
79
|
-
await this.
|
|
83
|
+
await this.db.create('jrys', {
|
|
80
84
|
id: uid,
|
|
81
85
|
name: userid,
|
|
82
86
|
time: date,
|
|
@@ -90,7 +94,7 @@ class Signin {
|
|
|
90
94
|
}
|
|
91
95
|
const accExp = userData[0].exp + exp;
|
|
92
96
|
const accCount = userData[0].signCount + 1;
|
|
93
|
-
await this.
|
|
97
|
+
await this.db.set('jrys', { id: uid }, {
|
|
94
98
|
name: userid,
|
|
95
99
|
time: date,
|
|
96
100
|
exp: accExp,
|