koishi-plugin-jrys-plus 1.0.0
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/event.d.ts +6 -0
- package/lib/event.js +102 -0
- package/lib/index.d.ts +172 -0
- package/lib/index.js +211 -0
- package/lib/ranks.d.ts +3 -0
- package/lib/ranks.js +201 -0
- package/lib/roll.d.ts +8 -0
- package/lib/roll.js +32 -0
- package/lib/signin.d.ts +63 -0
- package/lib/signin.js +133 -0
- package/lib/templates/fortune.html +170 -0
- package/lib/templates/rank-card.html +186 -0
- package/package.json +44 -0
package/lib/event.d.ts
ADDED
package/lib/event.js
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.defaultEventJson = void 0;
|
|
4
|
+
exports.defaultEventJson = [
|
|
5
|
+
{ name: '看直播', good: '喜欢的V开歌回啦', bad: '喜欢的V咕了一整天' },
|
|
6
|
+
{ name: '打轴', good: '一次性过', bad: '谁说话这么难懂' },
|
|
7
|
+
{ name: '剪辑', good: '灵感爆发', bad: '一团乱麻' },
|
|
8
|
+
{ name: '校对', good: '变成无情的审轴机器', bad: '被闪轴闪瞎眼' },
|
|
9
|
+
{ name: '浏览Pixiv', good: '发现符合xp的涩图', bad: '找不到想要的涩图' },
|
|
10
|
+
{ name: '打SC', good: '享受石油佬的乐趣', bad: '吃土中' },
|
|
11
|
+
{ name: '吃人', good: '你面前这位有成为神龙的潜质', bad: '这人会用Aegisub吗?' },
|
|
12
|
+
{ name: '背单词', good: '这次六级肯定过', bad: '背完50个忘了45个' },
|
|
13
|
+
{ name: '翘课', good: '老师不会点名', bad: '老师准会抽到你来回答问题' },
|
|
14
|
+
{ name: '做作业', good: '做的每个都对', bad: '做一个做错一个' },
|
|
15
|
+
{ name: '锻炼一下身体', good: '身体健康, 更加性福', bad: '能量没消耗多少, 吃得却更多' },
|
|
16
|
+
{ name: '浏览成人网站', good: '重拾对生活的信心', bad: '你会心神不宁' },
|
|
17
|
+
{ name: '修复BUG', good: '你今天对BUG的嗅觉大大提高', bad: '新产生的BUG将比修复的更多' },
|
|
18
|
+
{ name: '上AB站', good: '还需要理由吗?', bad: '满屏兄贵亮瞎你的眼' },
|
|
19
|
+
{ name: '打LOL', good: '你将有如神助', bad: '你会被虐的很惨' },
|
|
20
|
+
{ name: '打DOTA', good: '天梯5000分不是梦', bad: '你会遇到猪一样的队友' },
|
|
21
|
+
{ name: '打DOTA2', good: 'Godlike', bad: '不怕神一样的对手,就怕猪一样的队友' },
|
|
22
|
+
{ name: '穿女装', good: '你会得到很多炙热的目光', bad: '被父母看到' },
|
|
23
|
+
{ name: '组模型', good: '今天的喷漆会很完美', bad: '精神不集中板件被剪断了' },
|
|
24
|
+
{ name: '熬夜', good: '夜间的效率更高', bad: '明天有很重要的事' },
|
|
25
|
+
{ name: '抚摸猫咪', good: '才不是特意蹭你的呢', bad: '死开! 愚蠢的人类' },
|
|
26
|
+
{ name: '烹饪', good: '黑暗料理界就由我来打败', bad: '难道这就是……仰望星空派?' },
|
|
27
|
+
{ name: '告白', good: '其实我也喜欢你好久了', bad: '对不起, 你是一个好人' },
|
|
28
|
+
{ name: '追新番', good: '完结之前我绝不会死', bad: '会被剧透' },
|
|
29
|
+
{ name: '日麻', good: '立直一发自摸!', bad: '碰喵吃喵杠喵荣喵!' },
|
|
30
|
+
{ name: '音游', good: 'FCACFRPR不过如此', bad: '又双叒叕LOST了...' },
|
|
31
|
+
{ name: '向大佬请教', good: '太棒了,学到许多', bad: '太棒了,什么都没学到' },
|
|
32
|
+
{ name: '早起', good: '迎接第一缕阳光', bad: '才4点,再睡一会' },
|
|
33
|
+
{ name: '早睡', good: '第二天精神饱满', bad: '失眠数羊画圈圈' },
|
|
34
|
+
{ name: '入正版游戏', good: '买了痛三天,不买悔三年', bad: 'emmmm,汇率还是……' },
|
|
35
|
+
{ name: '补旧作', good: '意外地对胃口', bad: '会踩雷' },
|
|
36
|
+
{ name: '不按攻略打', good: '居然是HAPPY END', bad: '碰到BAD END' },
|
|
37
|
+
{ name: '观赏CG包', good: '社保。', bad: '还不去如看游戏剧情' },
|
|
38
|
+
{ name: '研究黄油创作理论', good: '增进鉴赏水平', bad: '闲适玩家不需要这些' },
|
|
39
|
+
{ name: '暴露性癖', good: '会引来很多趣味相同的变态', bad: '四斋蒸鹅心' },
|
|
40
|
+
{ name: '施法', good: '传统手艺精进了', bad: '房间门关好了吗' },
|
|
41
|
+
{ name: '刷新作动态', good: '喜欢的画师发了新图', bad: '发现游戏跳票' },
|
|
42
|
+
{ name: '回味玩过的作品', good: '重温感动', bad: '还是先看看新作' },
|
|
43
|
+
{ name: '出门走走', good: '宅久了要发霉', bad: '太陽が眩しすぎる' },
|
|
44
|
+
{ name: '撸猫', good: '啊……好爽', bad: '家里没有猫的洗洗睡吧' },
|
|
45
|
+
{ name: '抽卡', good: '单抽出货', bad: '到井前一发出货' },
|
|
46
|
+
{ name: '拼乐高', good: '顺利完工', bad: '发现少了一块零件' },
|
|
47
|
+
{ name: '跳槽', good: '新工作待遇大幅提升', bad: '待遇还不如之前的' },
|
|
48
|
+
{ name: '和女神聊天', good: '今天天气不错', bad: '我去洗澡了,呵呵' },
|
|
49
|
+
{ name: '写开源库', good: '今天北斗七星汇聚,裤子造的又快又好', bad: '写好会发现github上已经有了更好的' },
|
|
50
|
+
{ name: '洗澡', good: '你几天没洗澡了?', bad: '会把设计方面的灵感洗掉' },
|
|
51
|
+
{ name: '白天上线', good: '今天白天上线是安全的', bad: '可能导致灾难性后果' },
|
|
52
|
+
{ name: '重构', good: '代码质量得到提高', bad: '你很有可能会陷入泥潭' },
|
|
53
|
+
{ name: '招人', good: '你面前这位有成为牛人的潜质', bad: '这人会写程序吗?' },
|
|
54
|
+
{ name: '面试', good: '面试官今天心情很好', bad: '面试官不爽,会拿你出气' },
|
|
55
|
+
{ name: '申请加薪', good: '老板今天心情很好', bad: '公司正在考虑裁员' },
|
|
56
|
+
{ name: '提交代码', good: '遇到冲突的几率是最低的', bad: '会遇到的一大堆冲突' },
|
|
57
|
+
{ name: '代码复审', good: '发现重要问题的几率大大增加', bad: '你什么问题都发现不了,白白浪费时间' },
|
|
58
|
+
{ name: '晚上上线', good: '晚上是程序员精神最好的时候', bad: '你白天已经筋疲力尽了' },
|
|
59
|
+
{ name: '乘电梯', good: '正好赶上打卡截止时间', bad: '电梯超载' },
|
|
60
|
+
{ name: '复读', good: '有时候,人云亦云也是一种生存方式', bad: '你的对手是鸽子' },
|
|
61
|
+
{ name: '肝爆', good: '努力使人进步,肝爆让人快乐', bad: '醒醒,限时活动没了' },
|
|
62
|
+
{ name: '氪金', good: '早买早享受,晚买哭着求', bad: '第二天就 50% off' },
|
|
63
|
+
{ name: '卖弱', good: '楚楚动人更容易打动群友', bad: 'Boy♂next♂door' },
|
|
64
|
+
{ name: '挑战魔王曲', good: '一上来就是一个新纪录', bad: '有这点时间还不如干点别的' },
|
|
65
|
+
{ name: '咕咕咕', good: '一时咕一时爽', bad: '会被抓起来,被群友强迫穿上女装' },
|
|
66
|
+
{ name: '与群友水聊', good: '扶我起来我还能打字', bad: '一不小心就被大佬闪瞎' },
|
|
67
|
+
{ name: '迫害大佬', good: '迫害是大佬进步的阶梯', bad: '亲爱的,你号没了' },
|
|
68
|
+
{ name: '算命', good: '算啥都准', bad: '诸事不宜' },
|
|
69
|
+
{ name: '沟通克苏鲁', good: '奇怪的知识增加了', bad: '&▓▓▓◆▓▓▓¥#▓@■.◆' },
|
|
70
|
+
{ name: '看新番', good: '你看的这部新番有成为本季度霸权的可能', bad: '这周更新的是总集篇' },
|
|
71
|
+
{ name: '看旧番', good: '在宅的道路上又前进了一步', bad: '被剧情喂屎' },
|
|
72
|
+
{ name: '看里番', good: '传统手艺精进了', bad: '房间门关好了吗?' },
|
|
73
|
+
{ name: '看漫画', good: '正在追的作品十话连发', bad: '刷到正在追的作品的腰斩停更通知' },
|
|
74
|
+
{ name: '看轻小说', good: '插画很好舔,孩子很满意', bad: '买插画送的厕纸有啥好看的' },
|
|
75
|
+
{ name: '看本子', good: '被精准戳中性癖', bad: '更新的全是你不喜欢的类型' },
|
|
76
|
+
{ name: '前往女仆咖啡厅', good: '感受身心上的治愈', bad: '虚假的女仆只会让你内心更加空虚' },
|
|
77
|
+
{ name: '女装Cosplay', good: '好评如潮', bad: '照片传到班级群还被认出来' },
|
|
78
|
+
{ name: '修仙', good: '能突破到下一个境界', bad: '会在进阶中遭受心魔侵蚀' },
|
|
79
|
+
{ name: '渡劫', good: '万事俱备,只待飞升', bad: '没能扛过去,寿元终' },
|
|
80
|
+
{ name: '在妹子面前吹牛', good: '改善你矮穷挫的形象', bad: '会被识破' },
|
|
81
|
+
{ name: '发超过10条的状态', good: '显得你很高产', bad: '会被人直接拉黑' },
|
|
82
|
+
{ name: '在B站上传视频', good: '播放量爆炸', bad: '没人看' },
|
|
83
|
+
{ name: '搬运视频', good: '会被硬币砸得很爽', bad: '不会有人看的' },
|
|
84
|
+
{ name: '上微博', good: '今天的瓜不能错过', bad: '被智障发言糊一脸' },
|
|
85
|
+
{ name: '作死', good: '节目效果一流', bad: '吾之旧友弔似汝,如今坟头草丈五' },
|
|
86
|
+
{ name: '看老黄历', good: '反正你已经看了', bad: '反正你已经看了' },
|
|
87
|
+
{ name: '学习一门新技能', good: '有会成为大神的资质', bad: '可能会误入歧途' },
|
|
88
|
+
{ name: '睡懒觉', good: '避免内存不足', bad: '早上很早醒来睡不着了' },
|
|
89
|
+
{ name: '上课玩手机', good: '会发现好玩的事情', bad: '会被老师教训' },
|
|
90
|
+
{ name: '抄作业', good: '没有作业抄的学生生活是罪恶的!', bad: '老师会认真批改,你懂的……' },
|
|
91
|
+
{ name: '学习', good: '你已经几天(月、年)没学习了?', bad: '会睡着' },
|
|
92
|
+
{ name: '出门带伞', good: '今天下雨你信不信', bad: '好运气都被遮住了' },
|
|
93
|
+
{ name: '走夜路', good: '偶尔也要一个人静一静', bad: '有坏人' },
|
|
94
|
+
{ name: '补番', good: '你会后悔没早点看这部番', bad: '你会后悔看了这部番' },
|
|
95
|
+
{ name: '玩Minecraft', good: '建筑灵感爆发', bad: '启动器都会崩溃' },
|
|
96
|
+
{ name: '上Steam', good: '愿望单里全是90%off', bad: '钱包被G胖洗劫一空' },
|
|
97
|
+
{ name: '修图', good: '原片直出毫无压力', bad: 'Photoshop未响应' },
|
|
98
|
+
{ name: '赶稿', good: '完美守住deadline', bad: '终究还是超期了' },
|
|
99
|
+
{ name: '摸鱼', good: '摸鱼一时爽,一直摸鱼一直爽', bad: '被老板当场抓获' },
|
|
100
|
+
{ name: '入手新游戏', good: '你会玩的很开心', bad: '这游戏明天就99%off' },
|
|
101
|
+
{ name: '出门', good: '今天会是个好天气', bad: '中途突降暴雨' },
|
|
102
|
+
];
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* koishi-plugin-jrys-plus
|
|
3
|
+
* 今日运势签到 + 排行榜(精简版)
|
|
4
|
+
*
|
|
5
|
+
* 改动:
|
|
6
|
+
* - 移除金币/经验值展示和进度条
|
|
7
|
+
* - 🍀 替换为 ⭐
|
|
8
|
+
* - 日期问候模块移除半透明背景
|
|
9
|
+
* - 整合排名功能
|
|
10
|
+
*/
|
|
11
|
+
import { Context, Schema } from 'koishi';
|
|
12
|
+
import * as si from './signin';
|
|
13
|
+
import { RollEvent } from './event';
|
|
14
|
+
export declare const name = "jrys-plus";
|
|
15
|
+
export interface Config {
|
|
16
|
+
imgUrl: string;
|
|
17
|
+
signExp: [number, number];
|
|
18
|
+
levelSet: si.LevelInfo[];
|
|
19
|
+
fortuneSet: si.FortuneInfo[];
|
|
20
|
+
event: RollEvent[];
|
|
21
|
+
expCommand: string;
|
|
22
|
+
signCommand: string;
|
|
23
|
+
imageMode: boolean;
|
|
24
|
+
limit: number;
|
|
25
|
+
borderwidth: number;
|
|
26
|
+
next_ExpDisplay: boolean;
|
|
27
|
+
pre_next_LevelDisplay: boolean;
|
|
28
|
+
}
|
|
29
|
+
export declare const Config: Schema<Schemastery.ObjectS<{
|
|
30
|
+
imgUrl: Schema<string, string>;
|
|
31
|
+
signExp: Schema<[number?, number?, ...any[]], [number?, number?, ...any[]]>;
|
|
32
|
+
}> | Schemastery.ObjectS<{
|
|
33
|
+
levelSet: Schema<Schemastery.ObjectS<{
|
|
34
|
+
level: Schema<number, number>;
|
|
35
|
+
levelExp: Schema<number, number>;
|
|
36
|
+
levelName: Schema<string, string>;
|
|
37
|
+
levelColor: Schema<string, string>;
|
|
38
|
+
}>[], Schemastery.ObjectT<{
|
|
39
|
+
level: Schema<number, number>;
|
|
40
|
+
levelExp: Schema<number, number>;
|
|
41
|
+
levelName: Schema<string, string>;
|
|
42
|
+
levelColor: Schema<string, string>;
|
|
43
|
+
}>[]>;
|
|
44
|
+
fortuneSet: Schema<Schemastery.ObjectS<{
|
|
45
|
+
luck: Schema<number, number>;
|
|
46
|
+
desc: Schema<string, string>;
|
|
47
|
+
}>[], Schemastery.ObjectT<{
|
|
48
|
+
luck: Schema<number, number>;
|
|
49
|
+
desc: Schema<string, string>;
|
|
50
|
+
}>[]>;
|
|
51
|
+
event: Schema<Schemastery.ObjectS<{
|
|
52
|
+
name: Schema<string, string>;
|
|
53
|
+
good: Schema<string, string>;
|
|
54
|
+
bad: Schema<string, string>;
|
|
55
|
+
}>[], Schemastery.ObjectT<{
|
|
56
|
+
name: Schema<string, string>;
|
|
57
|
+
good: Schema<string, string>;
|
|
58
|
+
bad: Schema<string, string>;
|
|
59
|
+
}>[]>;
|
|
60
|
+
}> | Schemastery.ObjectS<{
|
|
61
|
+
expCommand: Schema<string, string>;
|
|
62
|
+
signCommand: Schema<string, string>;
|
|
63
|
+
imageMode: Schema<boolean, boolean>;
|
|
64
|
+
limit: Schema<number, number>;
|
|
65
|
+
borderwidth: Schema<number, number>;
|
|
66
|
+
next_ExpDisplay: Schema<boolean, boolean>;
|
|
67
|
+
pre_next_LevelDisplay: Schema<boolean, boolean>;
|
|
68
|
+
}>, {
|
|
69
|
+
imgUrl: string;
|
|
70
|
+
signExp: [number?, number?, ...any[]];
|
|
71
|
+
} & import("cosmokit").Dict & {
|
|
72
|
+
levelSet: Schemastery.ObjectT<{
|
|
73
|
+
level: Schema<number, number>;
|
|
74
|
+
levelExp: Schema<number, number>;
|
|
75
|
+
levelName: Schema<string, string>;
|
|
76
|
+
levelColor: Schema<string, string>;
|
|
77
|
+
}>[];
|
|
78
|
+
fortuneSet: Schemastery.ObjectT<{
|
|
79
|
+
luck: Schema<number, number>;
|
|
80
|
+
desc: Schema<string, string>;
|
|
81
|
+
}>[];
|
|
82
|
+
event: Schemastery.ObjectT<{
|
|
83
|
+
name: Schema<string, string>;
|
|
84
|
+
good: Schema<string, string>;
|
|
85
|
+
bad: Schema<string, string>;
|
|
86
|
+
}>[];
|
|
87
|
+
} & {
|
|
88
|
+
expCommand: string;
|
|
89
|
+
signCommand: string;
|
|
90
|
+
imageMode: boolean;
|
|
91
|
+
limit: number;
|
|
92
|
+
borderwidth: number;
|
|
93
|
+
next_ExpDisplay: boolean;
|
|
94
|
+
pre_next_LevelDisplay: boolean;
|
|
95
|
+
}>;
|
|
96
|
+
export declare const inject: {
|
|
97
|
+
required: string[];
|
|
98
|
+
optional: string[];
|
|
99
|
+
};
|
|
100
|
+
export declare function apply(ctx: Context, config: Config): void;
|
|
101
|
+
declare const _default: {
|
|
102
|
+
name: string;
|
|
103
|
+
apply: typeof apply;
|
|
104
|
+
Config: Schema<Schemastery.ObjectS<{
|
|
105
|
+
imgUrl: Schema<string, string>;
|
|
106
|
+
signExp: Schema<[number?, number?, ...any[]], [number?, number?, ...any[]]>;
|
|
107
|
+
}> | Schemastery.ObjectS<{
|
|
108
|
+
levelSet: Schema<Schemastery.ObjectS<{
|
|
109
|
+
level: Schema<number, number>;
|
|
110
|
+
levelExp: Schema<number, number>;
|
|
111
|
+
levelName: Schema<string, string>;
|
|
112
|
+
levelColor: Schema<string, string>;
|
|
113
|
+
}>[], Schemastery.ObjectT<{
|
|
114
|
+
level: Schema<number, number>;
|
|
115
|
+
levelExp: Schema<number, number>;
|
|
116
|
+
levelName: Schema<string, string>;
|
|
117
|
+
levelColor: Schema<string, string>;
|
|
118
|
+
}>[]>;
|
|
119
|
+
fortuneSet: Schema<Schemastery.ObjectS<{
|
|
120
|
+
luck: Schema<number, number>;
|
|
121
|
+
desc: Schema<string, string>;
|
|
122
|
+
}>[], Schemastery.ObjectT<{
|
|
123
|
+
luck: Schema<number, number>;
|
|
124
|
+
desc: Schema<string, string>;
|
|
125
|
+
}>[]>;
|
|
126
|
+
event: Schema<Schemastery.ObjectS<{
|
|
127
|
+
name: Schema<string, string>;
|
|
128
|
+
good: Schema<string, string>;
|
|
129
|
+
bad: Schema<string, string>;
|
|
130
|
+
}>[], Schemastery.ObjectT<{
|
|
131
|
+
name: Schema<string, string>;
|
|
132
|
+
good: Schema<string, string>;
|
|
133
|
+
bad: Schema<string, string>;
|
|
134
|
+
}>[]>;
|
|
135
|
+
}> | Schemastery.ObjectS<{
|
|
136
|
+
expCommand: Schema<string, string>;
|
|
137
|
+
signCommand: Schema<string, string>;
|
|
138
|
+
imageMode: Schema<boolean, boolean>;
|
|
139
|
+
limit: Schema<number, number>;
|
|
140
|
+
borderwidth: Schema<number, number>;
|
|
141
|
+
next_ExpDisplay: Schema<boolean, boolean>;
|
|
142
|
+
pre_next_LevelDisplay: Schema<boolean, boolean>;
|
|
143
|
+
}>, {
|
|
144
|
+
imgUrl: string;
|
|
145
|
+
signExp: [number?, number?, ...any[]];
|
|
146
|
+
} & import("cosmokit").Dict & {
|
|
147
|
+
levelSet: Schemastery.ObjectT<{
|
|
148
|
+
level: Schema<number, number>;
|
|
149
|
+
levelExp: Schema<number, number>;
|
|
150
|
+
levelName: Schema<string, string>;
|
|
151
|
+
levelColor: Schema<string, string>;
|
|
152
|
+
}>[];
|
|
153
|
+
fortuneSet: Schemastery.ObjectT<{
|
|
154
|
+
luck: Schema<number, number>;
|
|
155
|
+
desc: Schema<string, string>;
|
|
156
|
+
}>[];
|
|
157
|
+
event: Schemastery.ObjectT<{
|
|
158
|
+
name: Schema<string, string>;
|
|
159
|
+
good: Schema<string, string>;
|
|
160
|
+
bad: Schema<string, string>;
|
|
161
|
+
}>[];
|
|
162
|
+
} & {
|
|
163
|
+
expCommand: string;
|
|
164
|
+
signCommand: string;
|
|
165
|
+
imageMode: boolean;
|
|
166
|
+
limit: number;
|
|
167
|
+
borderwidth: number;
|
|
168
|
+
next_ExpDisplay: boolean;
|
|
169
|
+
pre_next_LevelDisplay: boolean;
|
|
170
|
+
}>;
|
|
171
|
+
};
|
|
172
|
+
export default _default;
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.inject = exports.Config = exports.name = void 0;
|
|
40
|
+
exports.apply = apply;
|
|
41
|
+
/**
|
|
42
|
+
* koishi-plugin-jrys-plus
|
|
43
|
+
* 今日运势签到 + 排行榜(精简版)
|
|
44
|
+
*
|
|
45
|
+
* 改动:
|
|
46
|
+
* - 移除金币/经验值展示和进度条
|
|
47
|
+
* - 🍀 替换为 ⭐
|
|
48
|
+
* - 日期问候模块移除半透明背景
|
|
49
|
+
* - 整合排名功能
|
|
50
|
+
*/
|
|
51
|
+
const koishi_1 = require("koishi");
|
|
52
|
+
const url_1 = require("url");
|
|
53
|
+
const fs_1 = __importDefault(require("fs"));
|
|
54
|
+
const path_1 = __importDefault(require("path"));
|
|
55
|
+
const si = __importStar(require("./signin"));
|
|
56
|
+
const roll_1 = require("./roll");
|
|
57
|
+
const event_1 = require("./event");
|
|
58
|
+
const ranks_1 = require("./ranks");
|
|
59
|
+
exports.name = 'jrys-plus';
|
|
60
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
61
|
+
exports.Config = koishi_1.Schema.intersect([
|
|
62
|
+
koishi_1.Schema.object({
|
|
63
|
+
imgUrl: koishi_1.Schema.string().role('link')
|
|
64
|
+
.description('随机横图api或者本地图片目录路径。填 URL 则直接用;填本地路径则随机取目录内图片。')
|
|
65
|
+
.required(),
|
|
66
|
+
signExp: koishi_1.Schema.tuple([Number, Number])
|
|
67
|
+
.description('签到获得经验范围(仅用于后端等级/排行计算,不在卡片展示)')
|
|
68
|
+
.default([1, 100]),
|
|
69
|
+
}).description('基础设置'),
|
|
70
|
+
koishi_1.Schema.object({
|
|
71
|
+
levelSet: koishi_1.Schema.array(koishi_1.Schema.object({
|
|
72
|
+
level: koishi_1.Schema.number().description('等级'),
|
|
73
|
+
levelExp: koishi_1.Schema.number().description('等级最低经验'),
|
|
74
|
+
levelName: koishi_1.Schema.string().description('等级名称'),
|
|
75
|
+
levelColor: koishi_1.Schema.string().role('color').description('等级颜色'),
|
|
76
|
+
})).role('table').default(si.defaultLevelInfo)
|
|
77
|
+
.description('经验等级设置(升序,最低等级经验必须为0)'),
|
|
78
|
+
fortuneSet: koishi_1.Schema.array(koishi_1.Schema.object({
|
|
79
|
+
luck: koishi_1.Schema.number().description('每级最低运势'),
|
|
80
|
+
desc: koishi_1.Schema.string().description('运势描述'),
|
|
81
|
+
})).role('table').default(si.defaultFortuneInfo)
|
|
82
|
+
.description('运势值描述(升序,最低一级必须为0,描述最长14个中文字符)'),
|
|
83
|
+
event: koishi_1.Schema.array(koishi_1.Schema.object({
|
|
84
|
+
name: koishi_1.Schema.string().description('事件名称'),
|
|
85
|
+
good: koishi_1.Schema.string().description('好的结局'),
|
|
86
|
+
bad: koishi_1.Schema.string().description('坏的结局'),
|
|
87
|
+
})).role('table').default([{ name: '网购', good: '买到超值好物', bad: '会被坑' }])
|
|
88
|
+
.description('自定义黄历事件'),
|
|
89
|
+
}).description('签到/运势设置'),
|
|
90
|
+
koishi_1.Schema.object({
|
|
91
|
+
expCommand: koishi_1.Schema.string().description('经验排行榜命令').default('jrysranks'),
|
|
92
|
+
signCommand: koishi_1.Schema.string().description('签到天数排行榜命令').default('jrysranksign'),
|
|
93
|
+
imageMode: koishi_1.Schema.boolean().description('排行榜是否使用图片模式(需要 puppeteer)').default(true),
|
|
94
|
+
limit: koishi_1.Schema.number().description('排行榜显示的最大条目数').min(1).max(100).default(10),
|
|
95
|
+
borderwidth: koishi_1.Schema.number().description('文本模式边框宽度').default(14),
|
|
96
|
+
next_ExpDisplay: koishi_1.Schema.boolean().description('排行榜中显示升级所需经验').default(true),
|
|
97
|
+
pre_next_LevelDisplay: koishi_1.Schema.boolean().description('排行榜中显示前后等级信息').default(true),
|
|
98
|
+
}).description('排行榜设置'),
|
|
99
|
+
]);
|
|
100
|
+
exports.inject = {
|
|
101
|
+
required: ['database'],
|
|
102
|
+
optional: ['puppeteer'],
|
|
103
|
+
};
|
|
104
|
+
const logger = new koishi_1.Logger('[JRYS+]');
|
|
105
|
+
/* ── 工具 ── */
|
|
106
|
+
async function getFolderImg(folder) {
|
|
107
|
+
const files = await readFilenamesRecursive(folder);
|
|
108
|
+
return files.filter(f => /\.(png|jpg|jpeg|ico|svg|webp)$/i.test(f));
|
|
109
|
+
}
|
|
110
|
+
function readFilenamesRecursive(dirPath) {
|
|
111
|
+
let result = [];
|
|
112
|
+
const entries = fs_1.default.readdirSync(dirPath);
|
|
113
|
+
for (const name of entries) {
|
|
114
|
+
const full = path_1.default.join(dirPath, name);
|
|
115
|
+
result = result.concat(fs_1.default.statSync(full).isDirectory() ? readFilenamesRecursive(full) : [name]);
|
|
116
|
+
}
|
|
117
|
+
return result;
|
|
118
|
+
}
|
|
119
|
+
async function fetchHitokoto() {
|
|
120
|
+
try {
|
|
121
|
+
const res = await fetch('https://v1.hitokoto.cn/?c=a&c=b&c=k');
|
|
122
|
+
const { hitokoto: text, from, from_who } = await res.json();
|
|
123
|
+
const author = from_who ? `—— ${from_who}「${from}」` : `——「${from}」`;
|
|
124
|
+
return `『${text}』<br>${author}`;
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
return '无法获取一言';
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/* ── 主入口 ── */
|
|
131
|
+
function apply(ctx, config) {
|
|
132
|
+
si.initDatabase(ctx);
|
|
133
|
+
const signin = new si.Signin(ctx, config);
|
|
134
|
+
const jrys = new roll_1.Jrys();
|
|
135
|
+
// 合并事件
|
|
136
|
+
const eventJson = [...event_1.defaultEventJson, ...config.event];
|
|
137
|
+
// 注册排行榜
|
|
138
|
+
(0, ranks_1.registerRanks)(ctx, config, () => config.levelSet);
|
|
139
|
+
/* ── 运势签到命令 ── */
|
|
140
|
+
ctx.command('jrys', '今日运势')
|
|
141
|
+
.userFields(['id', 'name'])
|
|
142
|
+
.action(async ({ session }) => {
|
|
143
|
+
const date = new Date();
|
|
144
|
+
let name = session.user?.name ? `@${session.user.name}` : '';
|
|
145
|
+
name = name.length > 13 ? name.slice(0, 12) + '...' : name;
|
|
146
|
+
const luck = await jrys.getFortune(session.user.id);
|
|
147
|
+
const sign = await signin.callSignin(session.user.id, session.author.id, luck);
|
|
148
|
+
if (sign.status === 1)
|
|
149
|
+
return '今天已经签到过了哦~';
|
|
150
|
+
const month = (date.getMonth() + 1).toString().padStart(2, '0');
|
|
151
|
+
const day = date.getDate().toString().padStart(2, '0');
|
|
152
|
+
const luckInfo = signin.getFortuneInfo(luck);
|
|
153
|
+
const [gd1, gd2, bd1, bd2] = await jrys.getRandomObjects(eventJson, session.user.id);
|
|
154
|
+
const hitokoto = await fetchHitokoto();
|
|
155
|
+
const greeting = signin.getGreeting(date.getHours());
|
|
156
|
+
const levelinfo = signin.getLevelInfo(sign.allExp);
|
|
157
|
+
// 背景图
|
|
158
|
+
let bgUrl;
|
|
159
|
+
if (/^https?:\/\//i.test(config.imgUrl)) {
|
|
160
|
+
bgUrl = config.imgUrl;
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
const imgs = await getFolderImg(config.imgUrl);
|
|
164
|
+
const picked = imgs[Math.floor(Math.random() * imgs.length)] || '';
|
|
165
|
+
bgUrl = (0, url_1.pathToFileURL)(path_1.default.resolve(config.imgUrl, picked)).href;
|
|
166
|
+
}
|
|
167
|
+
const avatarUrl = session.author?.avatar || 'avatar.png';
|
|
168
|
+
const gooddo = `${gd1.name}——${gd1.good}<br>${gd2.name}——${gd2.good}`;
|
|
169
|
+
const baddo = `${bd1.name}——${bd1.bad}<br>${bd2.name}——${bd2.bad}`;
|
|
170
|
+
let page;
|
|
171
|
+
try {
|
|
172
|
+
const template = fs_1.default.readFileSync(path_1.default.resolve(__dirname, 'templates', 'fortune.html'), 'utf-8');
|
|
173
|
+
const html = template
|
|
174
|
+
.replace('{{BG_URL}}', bgUrl)
|
|
175
|
+
.replace('{{AVATAR_URL}}', avatarUrl)
|
|
176
|
+
.replace('{{GREETING}}', greeting)
|
|
177
|
+
.replace('{{MONTH}}', month)
|
|
178
|
+
.replace('{{DAY}}', day)
|
|
179
|
+
.replace('{{HITOKOTO}}', hitokoto)
|
|
180
|
+
.replace('{{NAME}}', name)
|
|
181
|
+
.replace('{{LEVEL_NAME}}', levelinfo.levelInfo.levelName)
|
|
182
|
+
.replace('{{LEVEL_COLOR}}', levelinfo.levelInfo.levelColor)
|
|
183
|
+
.replace('{{LUCK}}', String(luck))
|
|
184
|
+
.replace('{{LUCK_INFO}}', luckInfo)
|
|
185
|
+
.replace('{{GOODDO}}', gooddo)
|
|
186
|
+
.replace('{{BADDO}}', baddo);
|
|
187
|
+
const outPath = path_1.default.resolve(__dirname, 'templates', '_fortune_render.html');
|
|
188
|
+
fs_1.default.writeFileSync(outPath, html);
|
|
189
|
+
page = await ctx.puppeteer.page();
|
|
190
|
+
await page.setViewport({ width: 600, height: 1080 * 2 });
|
|
191
|
+
await page.goto(`file:///${outPath}`);
|
|
192
|
+
await page.waitForSelector('#body', { timeout: 10000 });
|
|
193
|
+
const el = await page.$('#body');
|
|
194
|
+
let msg;
|
|
195
|
+
if (el) {
|
|
196
|
+
const buf = await el.screenshot({ encoding: 'binary' });
|
|
197
|
+
msg = koishi_1.h.image(buf, 'image/png');
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
msg = '截图失败';
|
|
201
|
+
}
|
|
202
|
+
await page.close();
|
|
203
|
+
return (0, koishi_1.h)('message', [koishi_1.h.quote(session.event.message.id), msg]);
|
|
204
|
+
}
|
|
205
|
+
catch (e) {
|
|
206
|
+
logger.error(e);
|
|
207
|
+
return '出错了,请稍后重试';
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
exports.default = { name: exports.name, apply, Config: exports.Config };
|
package/lib/ranks.d.ts
ADDED