koishi-plugin-dew-bot 1.0.202 → 1.0.204
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/face/base.js +2 -0
- package/lib/face/enums.js +204 -0
- package/lib/face/index.js +10 -0
- package/lib/index.js +56 -0
- package/lib/inits.js +43 -0
- package/lib/msgCsl.js +95 -0
- package/lib/plugin/console.js +17 -0
- package/lib/plugin/messageQueue.js +134 -0
- package/lib/plugin/puppeteer.js +81 -0
- package/lib/plugin/rateLimiter.js +104 -0
- package/lib/plugin/server.js +206 -0
- package/lib/plugin/serverHandel/handel_base.js +27 -0
- package/lib/plugin/serverHandel/image.js +19 -0
- package/lib/plugin/serverHandel/none.js +15 -0
- package/lib/plugin/serverHandel/text.js +15 -0
- package/lib/plugin/sessions.js +33 -0
- package/lib/shared/IBody.js +2 -0
- package/lib/shared/IMassage.js +9 -0
- package/lib/shared/MsgMessage.js +4 -0
- package/lib/shared/PtlMessage.js +4 -0
- package/lib/shared/PtlSys.js +4 -0
- package/lib/shared/PtlTest.js +4 -0
- package/lib/shared/base.js +2 -0
- package/lib/shared/face/base.js +2 -0
- package/lib/shared/face/enums.js +204 -0
- package/lib/shared/face/index.js +10 -0
- package/lib/shared/serviceProto.js +376 -0
- package/package.json +1 -1
package/lib/face/base.js
ADDED
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ConditionOperator = exports.ConditionType = exports.effectKey = exports.defenseKey = exports.attackKey = exports.Attribute_base = exports.盲盒枚举 = exports.道具枚举 = exports.资源枚举 = exports.sort_type = exports.qualityGradient = exports.qualityName = exports.quality = exports.RankingType = exports.ItemType = exports.EquipAttType = exports.EffectClassType = exports.PassiveTriggerType = exports.SkillType = exports.TargetType = exports.LogType = void 0;
|
|
4
|
+
// 日志类型
|
|
5
|
+
var LogType;
|
|
6
|
+
(function (LogType) {
|
|
7
|
+
LogType["\u4F24\u5BB3"] = "damage";
|
|
8
|
+
LogType["\u6CBB\u7597"] = "healing";
|
|
9
|
+
LogType["\u62A4\u76FE"] = "shield";
|
|
10
|
+
})(LogType || (exports.LogType = LogType = {}));
|
|
11
|
+
// 技能目标类型
|
|
12
|
+
var TargetType;
|
|
13
|
+
(function (TargetType) {
|
|
14
|
+
TargetType["\u6211\u65B9\u4E0D\u542B\u81EA\u5DF1"] = "ally";
|
|
15
|
+
TargetType["\u6211\u65B9"] = "ally_self";
|
|
16
|
+
TargetType["\u654C\u65B9"] = "enemy";
|
|
17
|
+
TargetType["\u81EA\u5DF1"] = "self";
|
|
18
|
+
})(TargetType || (exports.TargetType = TargetType = {}));
|
|
19
|
+
// 技能类型
|
|
20
|
+
var SkillType;
|
|
21
|
+
(function (SkillType) {
|
|
22
|
+
SkillType["\u4E3B\u52A8\u6280\u80FD"] = "\u4E3B\u52A8\u6280\u80FD";
|
|
23
|
+
SkillType["\u88AB\u52A8\u6280\u80FD"] = "\u88AB\u52A8\u6280\u80FD";
|
|
24
|
+
SkillType["\u5149\u73AF\u6280\u80FD"] = "\u5149\u73AF\u6280\u80FD";
|
|
25
|
+
})(SkillType || (exports.SkillType = SkillType = {}));
|
|
26
|
+
// 被动触发时机
|
|
27
|
+
var PassiveTriggerType;
|
|
28
|
+
(function (PassiveTriggerType) {
|
|
29
|
+
PassiveTriggerType["\u56DE\u5408\u7ED3\u675F\u65F6"] = "\u56DE\u5408\u7ED3\u675F\u65F6";
|
|
30
|
+
PassiveTriggerType["\u53D7\u5230\u4F24\u5BB3\u65F6"] = "\u53D7\u5230\u4F24\u5BB3\u65F6";
|
|
31
|
+
PassiveTriggerType["\u53D7\u5230\u666E\u901A\u653B\u51FB\u65F6"] = "\u53D7\u5230\u666E\u901A\u653B\u51FB\u65F6";
|
|
32
|
+
})(PassiveTriggerType || (exports.PassiveTriggerType = PassiveTriggerType = {}));
|
|
33
|
+
// 技能分类
|
|
34
|
+
var EffectClassType;
|
|
35
|
+
(function (EffectClassType) {
|
|
36
|
+
EffectClassType["\u653B\u51FB\u578B"] = "\u653B\u51FB\u578B";
|
|
37
|
+
EffectClassType["\u8F85\u52A9\u578B"] = "\u8F85\u52A9\u578B";
|
|
38
|
+
EffectClassType["\u9632\u5FA1\u578B"] = "\u9632\u5FA1\u578B";
|
|
39
|
+
EffectClassType["\u5DE5\u5177\u578B"] = "\u5DE5\u5177\u578B";
|
|
40
|
+
EffectClassType["\u5168\u80FD\u578B"] = "\u5168\u80FD\u578B";
|
|
41
|
+
EffectClassType["\u63A7\u5236\u578B"] = "\u63A7\u5236\u578B";
|
|
42
|
+
EffectClassType["\u56DE\u590D\u578B"] = "\u56DE\u590D\u578B";
|
|
43
|
+
EffectClassType["\u589E\u76CA\u578B"] = "\u589E\u76CA\u578B";
|
|
44
|
+
EffectClassType["\u51CF\u76CA\u578B"] = "\u51CF\u76CA\u578B";
|
|
45
|
+
EffectClassType["\u6CBB\u7597\u578B"] = "\u6CBB\u7597\u578B";
|
|
46
|
+
})(EffectClassType || (exports.EffectClassType = EffectClassType = {}));
|
|
47
|
+
var EquipAttType;
|
|
48
|
+
(function (EquipAttType) {
|
|
49
|
+
EquipAttType["\u9B54\u6CD5\u4F20\u8BF4"] = "\u9B54\u6CD5\u4F20\u8BF4\u7C7B";
|
|
50
|
+
EquipAttType["\u79D1\u6280\u7C7B"] = "\u79D1\u6280\u7C7B";
|
|
51
|
+
EquipAttType["\u8F85\u52A9\u7C7B"] = "\u8F85\u52A9\u7C7B";
|
|
52
|
+
EquipAttType["\u5A31\u4E50\u7C7B"] = "\u5A31\u4E50\u7C7B";
|
|
53
|
+
})(EquipAttType || (exports.EquipAttType = EquipAttType = {}));
|
|
54
|
+
// RPG相关枚举迁移自index.ts和rpg/types/index.ts
|
|
55
|
+
var ItemType;
|
|
56
|
+
(function (ItemType) {
|
|
57
|
+
ItemType["\u8D44\u6E90"] = "prop_\u8D44\u6E90";
|
|
58
|
+
ItemType["\u88C5\u5907"] = "equipment";
|
|
59
|
+
ItemType["\u9053\u5177"] = "prop_\u9053\u5177";
|
|
60
|
+
ItemType["\u6280\u80FD\u4E66"] = "skill_book";
|
|
61
|
+
ItemType["\u5BA0\u7269\u86CB"] = "pet_egg";
|
|
62
|
+
ItemType["\u8840\u7EDF\u5377\u8F74"] = "talent_book";
|
|
63
|
+
ItemType["\u76F2\u76D2"] = "prop_\u76F2\u76D2";
|
|
64
|
+
ItemType["\u5F62\u8C61\u5361"] = "image_card";
|
|
65
|
+
})(ItemType || (exports.ItemType = ItemType = {}));
|
|
66
|
+
/**
|
|
67
|
+
* 排行榜类型
|
|
68
|
+
*/
|
|
69
|
+
var RankingType;
|
|
70
|
+
(function (RankingType) {
|
|
71
|
+
RankingType["\u7B49\u7EA7"] = "\u7B49\u7EA7";
|
|
72
|
+
RankingType["\u91D1\u5E01"] = "\u91D1\u5E01";
|
|
73
|
+
RankingType["\u7B7E\u5230"] = "\u7B7E\u5230\u6B21\u6570";
|
|
74
|
+
RankingType["\u6218\u529B"] = "\u6218\u529B";
|
|
75
|
+
})(RankingType || (exports.RankingType = RankingType = {}));
|
|
76
|
+
var quality;
|
|
77
|
+
(function (quality) {
|
|
78
|
+
quality[quality["F"] = 0] = "F";
|
|
79
|
+
quality[quality["D"] = 1] = "D";
|
|
80
|
+
quality[quality["C"] = 2] = "C";
|
|
81
|
+
quality[quality["B"] = 3] = "B";
|
|
82
|
+
quality[quality["A"] = 4] = "A";
|
|
83
|
+
quality[quality["S"] = 5] = "S";
|
|
84
|
+
quality[quality["SS"] = 6] = "SS";
|
|
85
|
+
quality[quality["SSS"] = 7] = "SSS";
|
|
86
|
+
quality[quality["SR"] = 8] = "SR";
|
|
87
|
+
quality[quality["SSR"] = 9] = "SSR";
|
|
88
|
+
})(quality || (exports.quality = quality = {}));
|
|
89
|
+
var qualityName;
|
|
90
|
+
(function (qualityName) {
|
|
91
|
+
qualityName["F"] = "\u666E\u901A";
|
|
92
|
+
qualityName["D"] = "\u9AD8\u7EA7";
|
|
93
|
+
qualityName["C"] = "\u7A00\u6709";
|
|
94
|
+
qualityName["B"] = "\u795E\u5668";
|
|
95
|
+
qualityName["A"] = "\u53F2\u8BD7";
|
|
96
|
+
qualityName["S"] = "\u4F20\u8BF4";
|
|
97
|
+
qualityName["SS"] = "\u795E\u8BDD";
|
|
98
|
+
qualityName["SSS"] = "\u81F3\u5C0A";
|
|
99
|
+
qualityName["SR"] = "\u6C38\u6052";
|
|
100
|
+
qualityName["SSR"] = "\u592A\u521D";
|
|
101
|
+
})(qualityName || (exports.qualityName = qualityName = {}));
|
|
102
|
+
var qualityGradient;
|
|
103
|
+
(function (qualityGradient) {
|
|
104
|
+
qualityGradient["F"] = "linear-gradient(to bottom, #C0C0C0, #808080)";
|
|
105
|
+
qualityGradient["D"] = "linear-gradient(to bottom, #8B4513, #654321)";
|
|
106
|
+
qualityGradient["C"] = "linear-gradient(to bottom, #32CD32, #228B22)";
|
|
107
|
+
qualityGradient["B"] = "linear-gradient(to bottom, #4169E1, #0000CD)";
|
|
108
|
+
qualityGradient["A"] = "linear-gradient(to bottom, #9370DB, #4B0082)";
|
|
109
|
+
qualityGradient["S"] = "linear-gradient(to bottom, #FFD700, #FFA500)";
|
|
110
|
+
qualityGradient["SS"] = "linear-gradient(to bottom, #FF4500, #DC143C)";
|
|
111
|
+
qualityGradient["SSS"] = "linear-gradient(to bottom, #FF1493, #C71585)";
|
|
112
|
+
qualityGradient["SR"] = "linear-gradient(to bottom, #00CED1, #008B8B)";
|
|
113
|
+
qualityGradient["SSR"] = "linear-gradient(to bottom, #FF69B4, #FF1493)";
|
|
114
|
+
})(qualityGradient || (exports.qualityGradient = qualityGradient = {}));
|
|
115
|
+
var sort_type;
|
|
116
|
+
(function (sort_type) {
|
|
117
|
+
sort_type["time_up"] = "\u65F6\u95F4\u2191";
|
|
118
|
+
sort_type["time_down"] = "\u65F6\u95F4\u2193";
|
|
119
|
+
sort_type["price_down"] = "\u4EF7\u683C\u2193";
|
|
120
|
+
sort_type["price_up"] = "\u4EF7\u683C\u2191";
|
|
121
|
+
sort_type["quality_up"] = "\u54C1\u8D28\u2191";
|
|
122
|
+
sort_type["quality_down"] = "\u54C1\u8D28\u2193";
|
|
123
|
+
sort_type["count_up"] = "\u6570\u91CF\u2191";
|
|
124
|
+
sort_type["count_down"] = "\u6570\u91CF\u2193";
|
|
125
|
+
})(sort_type || (exports.sort_type = sort_type = {}));
|
|
126
|
+
var 资源枚举;
|
|
127
|
+
(function (资源枚举) {
|
|
128
|
+
资源枚举["\u7ECF\u9A8C"] = "\u7ECF\u9A8C\u503C";
|
|
129
|
+
资源枚举["\u91D1\u5E01"] = "\u91D1\u5E01";
|
|
130
|
+
资源枚举["\u8840\u7EDF\u7ECF\u9A8C"] = "\u8840\u7EDF\u7ECF\u9A8C";
|
|
131
|
+
})(资源枚举 || (exports.资源枚举 = 资源枚举 = {}));
|
|
132
|
+
var 道具枚举;
|
|
133
|
+
(function (道具枚举) {
|
|
134
|
+
道具枚举["\u6539\u540D\u5361"] = "1";
|
|
135
|
+
道具枚举["\u7CBE\u7075\u7403"] = "2";
|
|
136
|
+
道具枚举["\u590D\u6D3B\u5E01"] = "3";
|
|
137
|
+
})(道具枚举 || (exports.道具枚举 = 道具枚举 = {}));
|
|
138
|
+
var 盲盒枚举;
|
|
139
|
+
(function (盲盒枚举) {
|
|
140
|
+
盲盒枚举["\u6D4B\u8BD5\u6B66\u5668"] = "3";
|
|
141
|
+
})(盲盒枚举 || (exports.盲盒枚举 = 盲盒枚举 = {}));
|
|
142
|
+
var Attribute_base;
|
|
143
|
+
(function (Attribute_base) {
|
|
144
|
+
Attribute_base["\u7269\u7406\u653B\u51FB"] = "\u7269\u7406\u653B\u51FB";
|
|
145
|
+
Attribute_base["\u6700\u5927\u751F\u547D\u503C"] = "\u6700\u5927\u751F\u547D\u503C";
|
|
146
|
+
Attribute_base["\u751F\u547D\u6062\u590D"] = "\u751F\u547D\u6062\u590D";
|
|
147
|
+
Attribute_base["\u7269\u7406\u9632\u5FA1"] = "\u7269\u7406\u9632\u5FA1";
|
|
148
|
+
Attribute_base["\u9B54\u6CD5\u653B\u51FB"] = "\u9B54\u6CD5\u653B\u51FB";
|
|
149
|
+
Attribute_base["\u9B54\u6CD5\u9632\u5FA1"] = "\u9B54\u6CD5\u9632\u5FA1";
|
|
150
|
+
Attribute_base["\u7269\u7406\u7A7F\u900F"] = "\u7269\u7406\u7A7F\u900F";
|
|
151
|
+
Attribute_base["\u9B54\u6CD5\u7A7F\u900F"] = "\u9B54\u6CD5\u7A7F\u900F";
|
|
152
|
+
Attribute_base["\u66B4\u51FB\u7387"] = "\u66B4\u51FB\u7387";
|
|
153
|
+
Attribute_base["\u95EA\u907F\u7387"] = "\u95EA\u907F\u7387";
|
|
154
|
+
Attribute_base["\u9B54\u6CD5\u66B4\u51FB\u7387"] = "\u9B54\u6CD5\u66B4\u51FB\u7387";
|
|
155
|
+
Attribute_base["\u7269\u7406\u66B4\u51FB\u7387"] = "\u7269\u7406\u66B4\u51FB\u7387";
|
|
156
|
+
Attribute_base["\u6280\u80FD\u7F29\u51CF"] = "\u6280\u80FD\u7F29\u51CF";
|
|
157
|
+
})(Attribute_base || (exports.Attribute_base = Attribute_base = {}));
|
|
158
|
+
var attackKey;
|
|
159
|
+
(function (attackKey) {
|
|
160
|
+
attackKey["\u666E\u901A\u653B\u51FB"] = "\u666E\u901A\u653B\u51FB";
|
|
161
|
+
attackKey["\u7269\u7406\u653B\u51FB"] = "\u7269\u7406\u653B\u51FB";
|
|
162
|
+
attackKey["\u9B54\u6CD5\u653B\u51FB"] = "\u9B54\u6CD5\u653B\u51FB";
|
|
163
|
+
attackKey["\u771F\u5B9E\u653B\u51FB"] = "\u771F\u5B9E\u653B\u51FB";
|
|
164
|
+
attackKey["\u6062\u590D\u751F\u547D"] = "\u6062\u590D\u751F\u547D";
|
|
165
|
+
attackKey["\u62A4\u76FE"] = "\u62A4\u76FE";
|
|
166
|
+
})(attackKey || (exports.attackKey = attackKey = {}));
|
|
167
|
+
var defenseKey;
|
|
168
|
+
(function (defenseKey) {
|
|
169
|
+
defenseKey["\u7269\u7406\u9632\u5FA1"] = "\u7269\u7406\u9632\u5FA1";
|
|
170
|
+
defenseKey["\u9B54\u6CD5\u9632\u5FA1"] = "\u9B54\u6CD5\u9632\u5FA1";
|
|
171
|
+
})(defenseKey || (exports.defenseKey = defenseKey = {}));
|
|
172
|
+
var effectKey;
|
|
173
|
+
(function (effectKey) {
|
|
174
|
+
effectKey["\u4F24\u5BB3\u7C7B_\u666E\u901A\u653B\u51FB"] = "\u4F24\u5BB3\u7C7B_\u666E\u901A\u653B\u51FB";
|
|
175
|
+
effectKey["\u4F24\u5BB3\u7C7B_\u7269\u7406\u4F24\u5BB3"] = "\u4F24\u5BB3\u7C7B_\u7269\u7406\u4F24\u5BB3";
|
|
176
|
+
effectKey["\u4F24\u5BB3\u7C7B_\u9B54\u6CD5\u4F24\u5BB3"] = "\u4F24\u5BB3\u7C7B_\u9B54\u6CD5\u4F24\u5BB3";
|
|
177
|
+
effectKey["\u4F24\u5BB3\u7C7B_\u771F\u5B9E\u4F24\u5BB3"] = "\u4F24\u5BB3\u7C7B_\u771F\u5B9E\u4F24\u5BB3";
|
|
178
|
+
effectKey["\u8F85\u52A9\u7C7B_\u751F\u547D\u56DE\u590D"] = "\u8F85\u52A9\u7C7B_\u751F\u547D\u56DE\u590D";
|
|
179
|
+
effectKey["\u8F85\u52A9\u7C7B_\u62A4\u76FE"] = "\u8F85\u52A9\u7C7B_\u62A4\u76FE";
|
|
180
|
+
effectKey["\u8F85\u52A9\u7C7B_\u5C5E\u6027\u63D0\u5347"] = "\u8F85\u52A9\u7C7B_\u5C5E\u6027\u63D0\u5347";
|
|
181
|
+
effectKey["\u5DE5\u5177\u7C7B_\u6DFB\u52A0buff"] = "\u6DFB\u52A0buff";
|
|
182
|
+
})(effectKey || (exports.effectKey = effectKey = {}));
|
|
183
|
+
var ConditionType;
|
|
184
|
+
(function (ConditionType) {
|
|
185
|
+
ConditionType["\u751F\u547D\u503C\u767E\u5206\u6BD4"] = "\u751F\u547D\u503C\u767E\u5206\u6BD4";
|
|
186
|
+
ConditionType["\u751F\u547D\u503C\u7EDD\u5BF9\u503C"] = "\u751F\u547D\u503C\u7EDD\u5BF9\u503C";
|
|
187
|
+
ConditionType["\u56DE\u5408\u6570"] = "\u56DE\u5408\u6570";
|
|
188
|
+
ConditionType["\u6280\u80FD\u51B7\u5374"] = "\u6280\u80FD\u51B7\u5374";
|
|
189
|
+
ConditionType["\u76EE\u6807\u6570\u91CF"] = "\u76EE\u6807\u6570\u91CF";
|
|
190
|
+
ConditionType["\u81EA\u8EAB\u72B6\u6001"] = "\u81EA\u8EAB\u72B6\u6001";
|
|
191
|
+
ConditionType["\u654C\u65B9\u72B6\u6001"] = "\u654C\u65B9\u72B6\u6001";
|
|
192
|
+
ConditionType["\u968F\u673A\u6982\u7387"] = "\u968F\u673A\u6982\u7387";
|
|
193
|
+
ConditionType["\u5C5E\u6027\u503C"] = "\u5C5E\u6027\u503C";
|
|
194
|
+
ConditionType["\u59CB\u7EC8\u89E6\u53D1"] = "\u59CB\u7EC8\u89E6\u53D1";
|
|
195
|
+
})(ConditionType || (exports.ConditionType = ConditionType = {}));
|
|
196
|
+
var ConditionOperator;
|
|
197
|
+
(function (ConditionOperator) {
|
|
198
|
+
ConditionOperator["\u5927\u4E8E"] = "\u5927\u4E8E";
|
|
199
|
+
ConditionOperator["\u5C0F\u4E8E"] = "\u5C0F\u4E8E";
|
|
200
|
+
ConditionOperator["\u7B49\u4E8E"] = "\u7B49\u4E8E";
|
|
201
|
+
ConditionOperator["\u5927\u4E8E\u7B49\u4E8E"] = "\u5927\u4E8E\u7B49\u4E8E";
|
|
202
|
+
ConditionOperator["\u5C0F\u4E8E\u7B49\u4E8E"] = "\u5C0F\u4E8E\u7B49\u4E8E";
|
|
203
|
+
ConditionOperator["\u4E0D\u7B49\u4E8E"] = "\u4E0D\u7B49\u4E8E";
|
|
204
|
+
})(ConditionOperator || (exports.ConditionOperator = ConditionOperator = {}));
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UserLevel = void 0;
|
|
4
|
+
var UserLevel;
|
|
5
|
+
(function (UserLevel) {
|
|
6
|
+
UserLevel[UserLevel["\u73A9\u5BB6"] = 0] = "\u73A9\u5BB6";
|
|
7
|
+
UserLevel[UserLevel["\u8D5E\u52A9\u4F1A\u5458"] = 1] = "\u8D5E\u52A9\u4F1A\u5458";
|
|
8
|
+
UserLevel[UserLevel["\u7BA1\u7406\u5458"] = 2] = "\u7BA1\u7406\u5458";
|
|
9
|
+
UserLevel[UserLevel["\u5F00\u53D1\u8005"] = 3] = "\u5F00\u53D1\u8005";
|
|
10
|
+
})(UserLevel || (exports.UserLevel = UserLevel = {}));
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.Config = exports.inject = exports.name = void 0;
|
|
7
|
+
exports.apply = apply;
|
|
8
|
+
const koishi_1 = require("koishi");
|
|
9
|
+
const inits_1 = __importDefault(require("./inits"));
|
|
10
|
+
const msgCsl_1 = require("./msgCsl");
|
|
11
|
+
const rateLimiter_1 = require("./plugin/rateLimiter");
|
|
12
|
+
exports.name = 'dew-bot';
|
|
13
|
+
exports.inject = ['puppeteer'];
|
|
14
|
+
exports.Config = koishi_1.Schema.object({
|
|
15
|
+
调试模式: koishi_1.Schema.boolean().default(false).description('个人开发调试用'),
|
|
16
|
+
服务器环境: koishi_1.Schema.union([
|
|
17
|
+
koishi_1.Schema.const('测试服').description('本地测试服务器'),
|
|
18
|
+
koishi_1.Schema.const('开发服').description('开发服务器'),
|
|
19
|
+
koishi_1.Schema.const('正式服').description('正式服务器'),
|
|
20
|
+
]).default('正式服').description('选择服务器环境'),
|
|
21
|
+
频率限制: koishi_1.Schema.number().default(5).description('频率限制后拉黑时间(分钟)'),
|
|
22
|
+
});
|
|
23
|
+
function apply(ctx, config) {
|
|
24
|
+
ctx.plugin(inits_1.default, config);
|
|
25
|
+
// 创建频率限制器实例,传入配置的拉黑时间
|
|
26
|
+
const rateLimiter = new rateLimiter_1.RateLimiter(config.频率限制);
|
|
27
|
+
// 设置 Koishi 上下文
|
|
28
|
+
rateLimiter.setContext(ctx);
|
|
29
|
+
// 启动定期清理
|
|
30
|
+
rateLimiter.startCleanup();
|
|
31
|
+
// 插件卸载时清理定时器
|
|
32
|
+
ctx.on('dispose', () => {
|
|
33
|
+
rateLimiter.stopCleanup();
|
|
34
|
+
});
|
|
35
|
+
// 记录已提示过的用户,避免重复提示
|
|
36
|
+
const notifiedUsers = new Set();
|
|
37
|
+
ctx.on('message', (session) => {
|
|
38
|
+
const userId = session.author.id;
|
|
39
|
+
// 检查频率限制
|
|
40
|
+
if (!rateLimiter.canSendMessage(userId)) {
|
|
41
|
+
// 被拉黑或触发频率限制
|
|
42
|
+
// 只在首次拉黑时提示
|
|
43
|
+
if (!notifiedUsers.has(userId)) {
|
|
44
|
+
session.send(`消息发送过于频繁,已拉黑${config.频率限制}分钟!`);
|
|
45
|
+
notifiedUsers.add(userId);
|
|
46
|
+
}
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
// 通过频率限制,正常处理消息
|
|
50
|
+
// 如果用户之前被拉黑过,现在可以正常发送消息了,从提示列表中移除
|
|
51
|
+
if (notifiedUsers.has(userId)) {
|
|
52
|
+
notifiedUsers.delete(userId);
|
|
53
|
+
}
|
|
54
|
+
new msgCsl_1.SendMsg(session);
|
|
55
|
+
});
|
|
56
|
+
}
|
package/lib/inits.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.default = apply;
|
|
7
|
+
const puppeteer_1 = __importDefault(require("./plugin/puppeteer"));
|
|
8
|
+
const server_1 = __importDefault(require("./plugin/server"));
|
|
9
|
+
const sessions_1 = __importDefault(require("./plugin/sessions"));
|
|
10
|
+
const messageQueue_1 = require("./plugin/messageQueue");
|
|
11
|
+
function apply(ctx, config) {
|
|
12
|
+
// 初始化消息队列
|
|
13
|
+
messageQueue_1.messageQueue.init(ctx);
|
|
14
|
+
ctx.inject(['puppeteer'], (ctx) => {
|
|
15
|
+
puppeteer_1.default.init(ctx, config);
|
|
16
|
+
});
|
|
17
|
+
sessions_1.default.init(ctx);
|
|
18
|
+
// 初始化服务器连接(异步)
|
|
19
|
+
server_1.default.init(ctx, config);
|
|
20
|
+
// 设置连接成功后的回调
|
|
21
|
+
server_1.default.onConnected(() => {
|
|
22
|
+
try {
|
|
23
|
+
server_1.default.lisentMsg('Message', ((data) => {
|
|
24
|
+
try {
|
|
25
|
+
// 使用消息队列处理消息
|
|
26
|
+
const success = messageQueue_1.messageQueue.addToQueue(data, ctx);
|
|
27
|
+
if (!success) {
|
|
28
|
+
console.error('消息队列已满,无法处理新消息');
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
console.error('添加消息到队列失败:', error);
|
|
33
|
+
}
|
|
34
|
+
}), this);
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
console.error('消息监听设置失败:', error);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
ctx.on('dispose', () => {
|
|
41
|
+
messageQueue_1.messageQueue.clearQueue();
|
|
42
|
+
});
|
|
43
|
+
}
|
package/lib/msgCsl.js
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.SendMsg = void 0;
|
|
7
|
+
const server_1 = __importDefault(require("./plugin/server"));
|
|
8
|
+
const sessions_1 = __importDefault(require("./plugin/sessions"));
|
|
9
|
+
/**
|
|
10
|
+
* 消息处理类
|
|
11
|
+
* 负责处理 Koishi 会话消息并发送到服务器
|
|
12
|
+
*/
|
|
13
|
+
class SendMsg {
|
|
14
|
+
/**
|
|
15
|
+
* 处理消息内容,移除斜杠和多余空格
|
|
16
|
+
* @param content 原始消息内容
|
|
17
|
+
* @returns 处理后的消息内容
|
|
18
|
+
*/
|
|
19
|
+
static processMessageContent(content) {
|
|
20
|
+
if (!content)
|
|
21
|
+
return '';
|
|
22
|
+
// 移除斜杠和多余空格
|
|
23
|
+
return content
|
|
24
|
+
.replace(/\//g, '')
|
|
25
|
+
.replace(/\s+/g, ' ')
|
|
26
|
+
.trim();
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* 创建机器人信息对象
|
|
30
|
+
* @param session Koishi 会话对象
|
|
31
|
+
* @returns 机器人信息
|
|
32
|
+
*/
|
|
33
|
+
static createClientInfo(session) {
|
|
34
|
+
return {
|
|
35
|
+
id: session.bot.userId,
|
|
36
|
+
platform: session.bot.platform,
|
|
37
|
+
name: session.bot.user.name,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* 创建用户信息对象
|
|
42
|
+
* @param session Koishi 会话对象
|
|
43
|
+
* @returns 用户信息
|
|
44
|
+
*/
|
|
45
|
+
static createUserInfo(session) {
|
|
46
|
+
return {
|
|
47
|
+
id: session.author.id,
|
|
48
|
+
name: session.author.name,
|
|
49
|
+
isBot: session.author.isBot,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* 创建消息信息对象
|
|
54
|
+
* @param session Koishi 会话对象
|
|
55
|
+
* @param processedContent 处理后的消息内容
|
|
56
|
+
* @returns 消息信息
|
|
57
|
+
*/
|
|
58
|
+
static createMessageInfo(session, processedContent) {
|
|
59
|
+
return {
|
|
60
|
+
userId: session.author.id,
|
|
61
|
+
guildId: session.guildId,
|
|
62
|
+
msgId: session.messageId,
|
|
63
|
+
private: !session.guildId,
|
|
64
|
+
content: processedContent,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* 构造函数
|
|
69
|
+
* @param session Koishi 会话对象
|
|
70
|
+
*/
|
|
71
|
+
constructor(session) {
|
|
72
|
+
try {
|
|
73
|
+
// 处理消息内容
|
|
74
|
+
const processedContent = SendMsg.processMessageContent(session.content);
|
|
75
|
+
// 创建各种信息对象
|
|
76
|
+
const botInfo = SendMsg.createClientInfo(session);
|
|
77
|
+
const userInfo = SendMsg.createUserInfo(session);
|
|
78
|
+
const msgInfo = SendMsg.createMessageInfo(session, processedContent);
|
|
79
|
+
// 存储会话信息
|
|
80
|
+
sessions_1.default.set(msgInfo.userId, session);
|
|
81
|
+
// 发送消息到服务器
|
|
82
|
+
server_1.default.api('Message', {
|
|
83
|
+
UserInfo: userInfo,
|
|
84
|
+
ClientInfo: botInfo,
|
|
85
|
+
Message: msgInfo
|
|
86
|
+
}).catch(error => {
|
|
87
|
+
console.error('发送消息到服务器失败:', error);
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
console.error('处理消息时发生错误:', error);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
exports.SendMsg = SendMsg;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.console = void 0;
|
|
4
|
+
class console {
|
|
5
|
+
_log;
|
|
6
|
+
constructor() {
|
|
7
|
+
// 调用的父类 类名
|
|
8
|
+
}
|
|
9
|
+
init(ctx, config) {
|
|
10
|
+
let name = this.constructor.name;
|
|
11
|
+
this._log = ctx.logger(`[${name}]`);
|
|
12
|
+
}
|
|
13
|
+
log(message, ...optionalParams) {
|
|
14
|
+
this._log.info(message, ...optionalParams);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
exports.console = console;
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.messageQueue = exports.MessageQueue = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* 消息队列管理器
|
|
6
|
+
* 负责按顺序处理消息,避免并发冲突
|
|
7
|
+
*/
|
|
8
|
+
class MessageQueue {
|
|
9
|
+
queue = [];
|
|
10
|
+
isProcessing = false;
|
|
11
|
+
processingTimeout = null;
|
|
12
|
+
MAX_QUEUE_SIZE = 9999; // 最大队列长度
|
|
13
|
+
PROCESSING_TIMEOUT = 5000; // 5秒处理超时
|
|
14
|
+
initialized = false;
|
|
15
|
+
ctx;
|
|
16
|
+
constructor() {
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 初始化队列
|
|
20
|
+
* @param ctx Koishi上下文
|
|
21
|
+
*/
|
|
22
|
+
init(ctx) {
|
|
23
|
+
this.ctx = ctx;
|
|
24
|
+
console.log('初始化消息队列');
|
|
25
|
+
this.initialized = true;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 添加消息到队列
|
|
29
|
+
* @param data 消息数据
|
|
30
|
+
* @param ctx Koishi上下文
|
|
31
|
+
* @returns 是否成功添加
|
|
32
|
+
*/
|
|
33
|
+
addToQueue(data, ctx) {
|
|
34
|
+
// 检查队列是否已满
|
|
35
|
+
if (this.queue.length >= this.MAX_QUEUE_SIZE) {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
const queueItem = {
|
|
39
|
+
id: this.generateQueueId(),
|
|
40
|
+
data,
|
|
41
|
+
ctx,
|
|
42
|
+
timestamp: Date.now()
|
|
43
|
+
};
|
|
44
|
+
// 添加到队列末尾
|
|
45
|
+
this.queue.push(queueItem);
|
|
46
|
+
// 启动处理
|
|
47
|
+
this.startProcessing();
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* 生成队列项ID
|
|
52
|
+
* @returns 唯一ID
|
|
53
|
+
*/
|
|
54
|
+
generateQueueId() {
|
|
55
|
+
return `msg_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* 启动消息处理
|
|
59
|
+
*/
|
|
60
|
+
startProcessing() {
|
|
61
|
+
if (this.isProcessing) {
|
|
62
|
+
return; // 已在处理中
|
|
63
|
+
}
|
|
64
|
+
this.isProcessing = true;
|
|
65
|
+
this.processNextMessage();
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* 处理下一条消息
|
|
69
|
+
*/
|
|
70
|
+
async processNextMessage() {
|
|
71
|
+
if (this.queue.length === 0) {
|
|
72
|
+
this.isProcessing = false;
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
const item = this.queue.shift();
|
|
76
|
+
// 设置处理超时
|
|
77
|
+
if (this.ctx) {
|
|
78
|
+
this.processingTimeout = this.ctx.setTimeout(() => {
|
|
79
|
+
this.processNextMessage();
|
|
80
|
+
}, this.PROCESSING_TIMEOUT);
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
83
|
+
// 处理消息
|
|
84
|
+
await this.processMessage(item);
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
console.log(`消息处理失败: ${item.id}, 错误: ${error}`);
|
|
88
|
+
}
|
|
89
|
+
finally {
|
|
90
|
+
// 清除超时标记(Koishi的setTimeout会自动清理)
|
|
91
|
+
this.processingTimeout = null;
|
|
92
|
+
// 立即处理下一条消息
|
|
93
|
+
this.processNextMessage();
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* 处理单条消息
|
|
98
|
+
* @param item 队列项
|
|
99
|
+
*/
|
|
100
|
+
async processMessage(item) {
|
|
101
|
+
try {
|
|
102
|
+
const module = require(`./serverHandel/${item.data.action}`).default;
|
|
103
|
+
let handel = new module(item.data);
|
|
104
|
+
handel.set(item.ctx);
|
|
105
|
+
await handel.start(item.data);
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
console.log(`模块加载失败: ${error}`);
|
|
109
|
+
throw error;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* 获取队列状态
|
|
114
|
+
* @returns 队列状态信息
|
|
115
|
+
*/
|
|
116
|
+
getQueueStatus() {
|
|
117
|
+
return {
|
|
118
|
+
length: this.queue.length,
|
|
119
|
+
isProcessing: this.isProcessing
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* 清空队列
|
|
124
|
+
*/
|
|
125
|
+
clearQueue() {
|
|
126
|
+
this.queue = [];
|
|
127
|
+
this.isProcessing = false;
|
|
128
|
+
this.processingTimeout = null;
|
|
129
|
+
console.log('队列已清空');
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
exports.MessageQueue = MessageQueue;
|
|
133
|
+
// 创建全局消息队列实例
|
|
134
|
+
exports.messageQueue = new MessageQueue();
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const fs_1 = __importDefault(require("fs"));
|
|
7
|
+
const koishi_1 = require("koishi");
|
|
8
|
+
const path = require('path');
|
|
9
|
+
const console_1 = require("./console");
|
|
10
|
+
class puppeteer extends console_1.console {
|
|
11
|
+
commonCss;
|
|
12
|
+
pageContents = new Map();
|
|
13
|
+
ctx;
|
|
14
|
+
tempDir;
|
|
15
|
+
init(ctx, config) {
|
|
16
|
+
super.init(ctx);
|
|
17
|
+
this.ctx = ctx;
|
|
18
|
+
this.log('初始化 puppeteer');
|
|
19
|
+
const pagesDir = path.resolve(__dirname, '../html/page');
|
|
20
|
+
const files = fs_1.default.readdirSync(pagesDir);
|
|
21
|
+
this.tempDir = path.resolve(path.resolve(__dirname, '../html/'), 'temp');
|
|
22
|
+
files.forEach(file => {
|
|
23
|
+
const filePath = path.join(pagesDir, file);
|
|
24
|
+
if (fs_1.default.lstatSync(filePath).isFile()) {
|
|
25
|
+
let content = fs_1.default.readFileSync(filePath, 'utf-8');
|
|
26
|
+
// 移除HTML注释
|
|
27
|
+
content = content.replace(/<!--[\s\S]*?-->/g, '');
|
|
28
|
+
let key = file.replace('.html', '');
|
|
29
|
+
this.pageContents.set(key, content);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
// 如果tempDir不存在,则创建
|
|
33
|
+
if (!fs_1.default.existsSync(this.tempDir)) {
|
|
34
|
+
fs_1.default.mkdirSync(this.tempDir, { recursive: true });
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
// 删除tempDir下的所有文件
|
|
38
|
+
fs_1.default.readdirSync(this.tempDir).forEach(file => {
|
|
39
|
+
fs_1.default.unlinkSync(path.resolve(this.tempDir, file));
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
async render(name, data) {
|
|
44
|
+
let tempHtml = this.pageContents.get(name).replace(/let data = \{[^]*?\};/, `let data = ${JSON.stringify(data)};`);
|
|
45
|
+
// 随机生成一个文件名
|
|
46
|
+
let randomName = `${name}_${Math.random().toString(36).substring(2, 15)}.html`;
|
|
47
|
+
const savePath = path.resolve(this.tempDir, randomName);
|
|
48
|
+
fs_1.default.writeFileSync(savePath, tempHtml, 'utf-8');
|
|
49
|
+
const page = await this.ctx.puppeteer.page();
|
|
50
|
+
const filePath = path.resolve(this.tempDir, randomName);
|
|
51
|
+
await page.goto(`file://${filePath}`, { waitUntil: 'networkidle2' });
|
|
52
|
+
const leaderboardElement = await page.$('body');
|
|
53
|
+
const boundingBox = await leaderboardElement.boundingBox();
|
|
54
|
+
if (boundingBox.height > 0 || boundingBox.width > 0) {
|
|
55
|
+
await page.setViewport({
|
|
56
|
+
width: Math.ceil(boundingBox.width),
|
|
57
|
+
height: Math.ceil(boundingBox.height),
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
61
|
+
const imgBuf = await leaderboardElement.screenshot({ captureBeyondViewport: false, type: 'jpeg' });
|
|
62
|
+
let sendBuff = new Uint8Array(imgBuf);
|
|
63
|
+
page.close();
|
|
64
|
+
let leaderboardImage;
|
|
65
|
+
// if (sendBuff.length < 200 * 1024) { // 如果小于200kb
|
|
66
|
+
this.log(`not compress ${sendBuff.length / 1024}KB`);
|
|
67
|
+
leaderboardImage = koishi_1.h.image(sendBuff, 'image/jpeg');
|
|
68
|
+
// } else {
|
|
69
|
+
// let req = await server.api('open/CompressImg', { imgBuf: sendBuff });
|
|
70
|
+
// this.log(`compress ${req.imgBuf.length / 1024}KB`);
|
|
71
|
+
// leaderboardImage = h.image(req.imgBuf, 'image/jpeg');
|
|
72
|
+
// }
|
|
73
|
+
return leaderboardImage;
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
page.close();
|
|
77
|
+
this.log(error);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
exports.default = new puppeteer();
|