hortimagic 1.1.0 → 1.1.1

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.
@@ -0,0 +1,207 @@
1
+ import { type MessageClass, Public, Private, Hidden, Danmu, Withdrawn, Stock, System, Unkonw } from "./Message";
2
+
3
+ /** 解析好后的消息列表 */
4
+ export let messageObjList: MessageClass[] = [];
5
+
6
+ /**
7
+ * 判断消息类型并返回对应的类型字符串
8
+ * @param message
9
+ */
10
+ export function judegMessageClass(messageObj: MessageClass) {
11
+ //判断消息类型并返回对应的类型字符串
12
+ if (messageObj instanceof Public) {
13
+ return 'public';
14
+ } else if (messageObj instanceof Private) {
15
+ return 'private';
16
+ } else if (messageObj instanceof Hidden) {
17
+ return 'hidden';
18
+ } else if (messageObj instanceof Danmu) {
19
+ return 'danmu';
20
+ } else if (messageObj instanceof Withdrawn) {
21
+ return 'withdrawn';
22
+ } else if (messageObj instanceof System) {
23
+ return 'system';
24
+ } else if (messageObj instanceof Stock) {
25
+ return 'stock';
26
+ } else {
27
+ return 'unknown';
28
+ }
29
+ }
30
+ function publicChat(message: string) {
31
+ let messageObj = new Public();
32
+ let message_list = message.split('>');
33
+ messageObj.timeStamp = message_list[0];
34
+ messageObj.headPortrait = message_list[1];
35
+ messageObj.name = message_list[2];
36
+ messageObj.message = message_list[3];
37
+ messageObj.color = message_list[5];
38
+ messageObj.gender = message_list[6];
39
+ messageObj.uid = message_list[8];
40
+ messageObj.designation = message_list[9];
41
+ messageObj.messageUid = message_list[10];
42
+ return messageObj;
43
+ }
44
+ function privateChat(message: string) {
45
+ // ""1726160459>61aef798c94e6>留不住别样年华>http://r.iirose.com/i/23/8/17/12/0120-9Y.jpg#e>1>6b4d44>>6b4d44>2>>593356694306
46
+ let messageObj = new Private();
47
+ let message_list = message.split('>');
48
+ messageObj.timeStamp = message_list[0].slice(1);
49
+ messageObj.uid = message_list[1];
50
+ messageObj.name = message_list[2];
51
+ messageObj.headPortrait = message_list[3];
52
+ messageObj.message = message_list[4];
53
+ messageObj.color = message_list[5];
54
+ messageObj.gender = message_list[8];
55
+ messageObj.messageUid = message_list[10];
56
+ return messageObj;
57
+ }
58
+
59
+ function danmu(message: string) {
60
+ // =narlen>http://r.iirose.com/i/23/12/17/9/4944-6D.jpg>7f544c>7f544c>2>anime/63>1726212024>655352ad667a8>>350>0>0,0,0.5>f0
61
+ let messageObj = new Danmu();
62
+ // console.log('弹幕消息', message)
63
+ let message_list = message.split('>');
64
+ messageObj.username = message_list[0];
65
+ messageObj.message = message_list[1];
66
+ messageObj.color = message_list[2];
67
+ messageObj.gender = message_list[4];
68
+ messageObj.avatar = message_list[5];
69
+ messageObj.timeStamp = message_list[6];
70
+ messageObj.uid = message_list[7];
71
+ return messageObj;
72
+ }
73
+
74
+ function hidden(message: string) {
75
+ let messageObj = new Hidden();
76
+ let temp;
77
+ temp = message.match(/(?<=^[/]<).*(?=>[0-9|a-z]{13}:.*)/gs);
78
+ messageObj.messageName = (temp == null) ? '' : temp[0];
79
+ temp = message.match(/(?<=^[/]<.*>)[0-9|a-z]{13}(?=:.*)/gs);
80
+ messageObj.uid = (temp == null) ? '' : temp[0];
81
+ temp = message.match(/(?<=^[/]<.*>[0-9|a-z]{13}:).*/gs);
82
+ messageObj.data = (temp == null) ? '' : temp[0];
83
+ return messageObj;
84
+ }
85
+ /**解码撤回消息 */
86
+ function withdrawn(message: string) {
87
+ // `v0#62506af353dd9_491855401763"`
88
+ // `v0#61aef798c94e6_656602774703"`
89
+ // `v0*61aef798c94e6"62506af353dd9_015913147468`
90
+ // console.log('撤回类型的原消息', message);
91
+ let messageObj = new Withdrawn();
92
+ if (message[2] == '#') {
93
+ messageObj.privateUID = '';
94
+ messageObj.uid = message.slice(3, 16);
95
+ messageObj.messageUid = message.slice(17, 29);
96
+ messageObj.dataUid = message.slice(3, 29);
97
+ }
98
+ else {
99
+ messageObj.privateUID = message.slice(3, 16);
100
+ messageObj.uid = message.slice(17, 30);
101
+ messageObj.messageUid = message.slice(31);
102
+ messageObj.dataUid = message.slice(17);
103
+ }
104
+ return messageObj;
105
+ }
106
+ function system(message: string) {
107
+ let messageObj = new System();
108
+ messageObj.userMessageList = message.split('<');
109
+ return messageObj;
110
+ }
111
+ function stock(message: string) {
112
+ // 查看">#"
113
+ // '>1507"1507"1"0"21.021'
114
+ // 买了一个">$1"
115
+ // '>1508"1508"1"20.021'
116
+ // 卖了一个">@1"
117
+ // '>1507"1507"0"21.021'
118
+ // 购买超出数量">$99999"
119
+ // 余额这么多'><20.676'
120
+ // 卖出超出持有的股票数量">@9999"
121
+ // 只有1股'>>1'
122
+ // 股票价格太低(低于0.1)购买失败
123
+ // ">*"
124
+ // >1000 "3177.2 "3.1772 "0 "21.732
125
+ // >1001 "3180.3 "1 "18.555
126
+ // >1000 "3177.2 "0 "21.732
127
+ let messageObj = new Stock();
128
+ messageObj.result = message[2];
129
+ // console.log('正在解析的股票消息', message);
130
+ if (messageObj.result == '*') {
131
+ return messageObj;
132
+ } else if (messageObj.result == '>') {
133
+ messageObj.holdingAmount = parseInt(message.slice(2))
134
+ return messageObj;
135
+ } else if (messageObj.result == '<') {
136
+ messageObj.balance = parseInt(message.slice(2))
137
+ return messageObj;
138
+ } else {
139
+ let L = message.split('"');
140
+ if (L.length == 5) {
141
+ messageObj.stockPrice = parseFloat(L[2]);
142
+ messageObj.totalStock = parseInt(L[0].slice(1));
143
+ messageObj.holdingAmount = parseInt(L[3]);
144
+ messageObj.totalEquity = parseFloat(L[1]);
145
+ messageObj.balance = parseFloat(L[4]);
146
+ return messageObj;
147
+ } else if (L.length == 4) {
148
+ messageObj.stockPrice = parseFloat(L[1]) / parseInt(L[0].slice(1));
149
+ messageObj.totalStock = parseInt(L[0].slice(1));
150
+ messageObj.holdingAmount = parseInt(L[2]);
151
+ messageObj.totalEquity = parseFloat(L[1]);
152
+ messageObj.balance = parseFloat(L[3]);
153
+ return messageObj;
154
+ }
155
+ }
156
+ // else {
157
+ // return messageObj;
158
+ // }
159
+ return messageObj;
160
+ }
161
+ function unkonw(message: string) {
162
+ let messageObj = new Unkonw();
163
+ messageObj.message = message;
164
+ return messageObj;
165
+ }
166
+
167
+ /**
168
+ * 解析消息字符串并将对应的消息对象添加到消息列表中
169
+ * @param message 原消息字符串
170
+ */
171
+ export function decodeMessage(message: string) {
172
+ messageObjList = [];
173
+ if (/^"[^"].*/gs.test(message)) {
174
+ // 房间的消息
175
+ let temp_list = message.slice(1).split('<')
176
+ for (let i = temp_list.length - 1; i >= 0; i--)
177
+ messageObjList.push(publicChat(temp_list[i]))
178
+ } else if (/^"".*/gs.test(message)) {
179
+ // 私聊消息
180
+ let temp_list = message.slice(1).split('<')
181
+ for (let i = temp_list.length - 1; i >= 0; i--) {
182
+ messageObjList.push(privateChat(temp_list[i]))
183
+ }
184
+ } else if (/^=.*/gs.test(message)) {
185
+ // 弹幕消息
186
+ let temp_list = message.slice(1).split('<')
187
+ for (let i = temp_list.length - 1; i >= 0; i--) {
188
+ messageObjList.push(danmu(temp_list[i]))
189
+ }
190
+ } else if (/^[/]<.*>[0-9|a-z]{13}:.*/gs.test(message)) {
191
+ // 隐式消息
192
+ messageObjList.push(hidden(message));
193
+ } else if (/^v0.*/gs.test(message)) {
194
+ // 撤回消息
195
+ messageObjList.push(withdrawn(message));
196
+ } else if (/^%\*".*/gs.test(message)) {
197
+ // 系统消息
198
+ messageObjList.push(system(message));
199
+ } else if (/^>.*/gs.test(message)) {
200
+ // 股票消息
201
+ messageObjList.push(stock(message));
202
+ } else {
203
+ // 未知消息
204
+ messageObjList.push(unkonw(message));
205
+ }
206
+ // console.log('正在解码消息', { message, list: messageObjList });
207
+ }
@@ -0,0 +1,168 @@
1
+ import { logger } from "./log-tools";
2
+ const Tag = "elements-hooks";
3
+
4
+ /** 原来界面的元素 */
5
+ export let elements = {
6
+ /** 移动窗口父元素,移动窗口容器 */
7
+ movePanelHolder: document.querySelector("#movePanelHolder"),
8
+ /** 侧边菜单按钮 */
9
+ functionHolder: document.querySelector("#functionHolder"),
10
+ /** 侧边菜单按钮列表 */
11
+ functionButtonGroupList: [
12
+ ...document.querySelectorAll(".functionButton.functionButtonGroup"),
13
+ ],
14
+ /** 主消息列表的父元素 */
15
+ msgholderBox: document.querySelector("#msgholder .fullBox.msgholderBox"),
16
+ /** home界面的消息列表父元素 */
17
+ homeHolderMsgBox: document.querySelector(
18
+ `#homeHolder .homeHolderMsgContentBox .homeHolderMsgBox.fullBox`
19
+ ),
20
+ /** 最近会话列表 */
21
+ sessionHolderPmTaskBoxItems: [
22
+ ...document.querySelectorAll(`.sessionHolderPmTaskBoxItem.whoisTouch2`),
23
+ ],
24
+ /** 主输入元素盒子 */
25
+ moveinputDisplay: document.querySelector("#moveinputDisplay"),
26
+ /** 主输入元素 */
27
+ moveinput: document.getElementById("moveinput"),
28
+ /** 可以打开home界面 */
29
+ moveinputSendBtnFunc: document.querySelector(
30
+ "#moveinputDisplay #moveinputSendBtnFunc"
31
+ ),
32
+ /** 发送按钮 */
33
+ moveinputSendBtnSend: document.querySelector(
34
+ "#moveinputDisplay #moveinputSendBtnSend"
35
+ ),
36
+ };
37
+
38
+ /**
39
+ * 更新一些element
40
+ */
41
+ export function refreshAll() {
42
+ elements.movePanelHolder = document.querySelector("#movePanelHolder");
43
+ elements.functionHolder = document.querySelector("#functionHolder");
44
+ elements.functionButtonGroupList = [
45
+ ...document.querySelectorAll(".functionButton.functionButtonGroup"),
46
+ ];
47
+ elements.msgholderBox = document.querySelector(
48
+ `#msgholder .fullBox .fullBox.msgholderBox`
49
+ );
50
+ elements.homeHolderMsgBox = document.querySelector(
51
+ `#homeHolder .homeHolderMsgContentBox .homeHolderMsgBox.fullBox`
52
+ );
53
+ elements.sessionHolderPmTaskBoxItems = [
54
+ ...document.querySelectorAll(`.sessionHolderPmTaskBoxItem.whoisTouch2`),
55
+ ];
56
+
57
+ elements.moveinputDisplay = document.querySelector("#moveinputDisplay");
58
+
59
+ elements.moveinput = document.getElementById("moveinput");
60
+
61
+ elements.moveinputSendBtnFunc = document.querySelector(
62
+ "#moveinputDisplay #moveinputSendBtnFunc"
63
+ );
64
+
65
+ elements.moveinputSendBtnSend = document.querySelector(
66
+ "#moveinputDisplay #moveinputSendBtnSend"
67
+ );
68
+ }
69
+ /** 钩子函数 */
70
+ export let Hooks = {
71
+ elementHooks: {
72
+ moveinput: {
73
+ oninputBefore: () => {
74
+ return true;
75
+ },
76
+ oninputAfter: () => {
77
+ return true;
78
+ },
79
+ onblurBefore: () => {
80
+ return true;
81
+ },
82
+ onblurAfter: () => {
83
+ return true;
84
+ },
85
+ onfocusBefore: () => {
86
+ return true;
87
+ },
88
+ onfocusAfter: () => {
89
+ return true;
90
+ },
91
+ },
92
+ },
93
+ functionHooks: {
94
+ processer: {
95
+ // @ts-ignore
96
+ onBefore: (e: any, s: any, t: any, r: any) => {
97
+ return true;
98
+ },
99
+ // @ts-ignore
100
+ onAfter: (e: any, s: any, t: any, r: any) => {
101
+ return true;
102
+ },
103
+ },
104
+ },
105
+
106
+ replaceMoveinput: () => {
107
+ try {
108
+ let temp = (elements.moveinput as HTMLTextAreaElement).oninput;
109
+ (elements.moveinput as HTMLTextAreaElement).oninput = function () {
110
+ // logger.log('监测到改变', (elements.moveinput as HTMLTextAreaElement).value);
111
+ if (Hooks.elementHooks.moveinput.oninputBefore() == true) {
112
+ // @ts-ignore
113
+ temp?.call(elements.moveinput);
114
+ Hooks.elementHooks.moveinput.oninputAfter();
115
+ }
116
+ };
117
+ } catch (error) {
118
+ logger.error(Tag, error);
119
+ }
120
+ try {
121
+ let temp = (elements.moveinput as HTMLTextAreaElement).oninput;
122
+ (elements.moveinput as HTMLTextAreaElement).onblur = function () {
123
+ // logger.log('element-hooks', '失去焦点');
124
+ if (Hooks.elementHooks.moveinput.onblurBefore() == true) {
125
+ // @ts-ignore
126
+ temp?.call(elements.moveinput);
127
+ Hooks.elementHooks.moveinput.onblurAfter();
128
+ }
129
+ };
130
+ } catch (error) {
131
+ logger.error(Tag, error);
132
+ }
133
+ try {
134
+ let temp = (elements.moveinput as HTMLTextAreaElement).oninput;
135
+ (elements.moveinput as HTMLTextAreaElement).onfocus = function () {
136
+ // logger.log('获得焦点');
137
+ if (Hooks.elementHooks.moveinput.onfocusBefore() == true) {
138
+ // @ts-ignore
139
+ temp?.call(elements.moveinput);
140
+ Hooks.elementHooks.moveinput.onfocusAfter();
141
+ }
142
+ };
143
+ } catch (error) {
144
+ logger.error(Tag, error);
145
+ }
146
+ },
147
+ replaceButtonProcesser: () => {
148
+ try {
149
+ let temp = buttonProcesser;
150
+ buttonProcesser = (e, s, t, r) => {
151
+ // logger.log('按键处理', e, s, t, r);
152
+ if (Hooks.functionHooks.processer.onBefore(e, s, t, r) == true) {
153
+ temp(e, s, t, r);
154
+ Hooks.functionHooks.processer.onAfter(e, s, t, r);
155
+ }
156
+ };
157
+ } catch (error) {
158
+ logger.error(Tag, error);
159
+ }
160
+ },
161
+ };
162
+ /**
163
+ * 注入钩子函数
164
+ */
165
+ export function initHooks() {
166
+ Hooks.replaceMoveinput();
167
+ Hooks.replaceButtonProcesser();
168
+ }
@@ -0,0 +1,154 @@
1
+ /**
2
+ * 生成公屏消息
3
+ * @param message 消息
4
+ * @param color 消息颜色
5
+ * @returns 返回格式化好的消息
6
+ */
7
+ function publicChat(message: string, color: string) {
8
+ if (message === 'cut') {
9
+ return `{0${JSON.stringify({
10
+ m: message,
11
+ mc: color,
12
+ i: Math.random().toString().slice(2, 12)
13
+ })}`
14
+ }
15
+ return JSON.stringify({
16
+ m: message,
17
+ mc: color,
18
+ i: Math.random().toString().slice(2, 12)
19
+ })
20
+ }
21
+ /**
22
+ * 生成隐藏发送的私聊消息,自己看不到
23
+ * @param uid 对方的UID
24
+ * @param message 消息
25
+ * @param color 消息颜色
26
+ * @returns 返回格式化好的消息
27
+ */
28
+ function privateChat(uid: string, message: string, color: string) {
29
+ return JSON.stringify({
30
+ g: uid,
31
+ m: message,
32
+ mc: color,
33
+ i: Math.random().toString().slice(2, 12)
34
+ })
35
+ }
36
+ /**
37
+ * 生成隐藏的消息
38
+ * @param messageNmae 消息的标题或者名字
39
+ * @param uid 要发送的对象
40
+ * @param data 消息数据
41
+ * @returns 返回生成的数据
42
+ */
43
+ function hidden(messageNmae: string, uid: string, data: string) {
44
+ return `/<${messageNmae}>${uid}:${data}`;
45
+ }
46
+ /**
47
+ * 生成一个音乐卡片消息
48
+ * @param typeId 音乐平台从0开始
49
+ * @param title 音乐名字
50
+ * @param singerName 歌手名字
51
+ * @param coverUrl 封面图片链接
52
+ * @param color 颜色
53
+ * @param resolutionRatio 音乐的压缩率
54
+ */
55
+ function musicCard(typeId: string, title: string, singerName: string, coverUrl: string, color: string, resolutionRatio: string) {
56
+ // "{"m":"m__4@0>今天开始自己上厕所>小兰>https://img2.doubanio.com/view/photo/l/public/p822890313.webp>24505b>128","mc":"24505b","i":"722254956566"}"
57
+ // 生成房间媒体卡片消息格式
58
+ let mediaCardContent = `m__4=${typeId}>${title}>${singerName}>${coverUrl}>${color}>${resolutionRatio}`;
59
+ // 转化成房间消息
60
+ return publicChat(mediaCardContent, color)
61
+ }
62
+ /**
63
+ * 生成一个视频卡片消息
64
+ * @param typeId 视频平台从0开始
65
+ * @param title 视频名字
66
+ * @param singerName 制作者名字
67
+ * @param coverUrl 封面图片链接
68
+ * @param color 颜色
69
+ * @param resolutionRatio 分辨率,64会被识别成1080p
70
+ */
71
+ function videoCard(typeId: string, title: string, singerName: string, coverUrl: string, color: string, resolutionRatio: string, time: string) {
72
+ // {"m":"m__4*3>今天开始自己上厕所>小兰>https://img2.doubanio.com/view/photo/l/public/p822890313.webp>352a31>>64>>5:36","mc":"352a31","i":"482200197882"}
73
+ // 生成房间媒体卡片消息格式
74
+ let mediaCardContent = `m__4*${typeId}>${title}>${singerName}>${coverUrl}>${color}>${resolutionRatio}>${time}`;
75
+ // 转化成房间消息
76
+ return publicChat(mediaCardContent, color)
77
+ }
78
+ /**
79
+ * 编码点赞消息
80
+ * @param targetUid 目标id
81
+ * @param content 正文
82
+ * @returns 格式化好的消息
83
+ */
84
+ function like(targetUid: string, content: string = "") {
85
+ // if (targetUid) return;
86
+ return `+*${targetUid}${content}`
87
+ }
88
+ /**
89
+ * 生成弹幕消息
90
+ * @param message 消息
91
+ * @param color 颜色
92
+ * @param v v,默认是0
93
+ * @returns 返回格式化好的弹幕消息
94
+ */
95
+ function danmu(message: string, color: string, v: string = '0') {
96
+ // ~{"t":"[http://r.iirose.com/i/22/3/21/18/3125-DK.gif#e]","c":"ffff00","v":0}
97
+ return `~{"t":"${message}","c":"${color}","v":${v}}`
98
+ }
99
+ /**
100
+ * 生成撤回的消息
101
+ * @param randomNumber 指定消息的随机数如:491855401763
102
+ * @param privateUID 私聊对象的UID
103
+ * @returns
104
+ */
105
+ function withdrawn(randomNumber: string, privateUID: string = '') {
106
+ // v0#491855401763
107
+ // v0*61aef798c94e6#015913147468
108
+ if (privateUID == '')
109
+ return `v0#${randomNumber}`;
110
+ else
111
+ return `v0*${privateUID}#${randomNumber}`;
112
+ }
113
+
114
+ /**
115
+ * 生成股票请求消息
116
+ * @param count 股票数量,不填或等于0时返回正常查看
117
+ * @returns
118
+ */
119
+ function stockRequest(count: number | undefined) {
120
+ // 查看">#"
121
+ // '>1507"1507"1"0"21.021'
122
+ // 买了一个">$1"
123
+ // '>1508"1508"1"20.021'
124
+ // 卖了一个">@1"
125
+ // '>1507"1507"0"21.021'
126
+ // 购买超出数量">$99999"
127
+ // 余额这么多'><20.676'
128
+ // 卖出超出持有的股票数量">@9999"
129
+ // 只有1股'>>1'
130
+ // 股票价格太低(低于0.1)购买失败
131
+ // ">*"
132
+ if (count == undefined)
133
+ return '>#';
134
+ else if (count > 0)
135
+ return `>$${Math.round(Math.abs(count))}`;
136
+ else if (count < 0)
137
+ return `>@${Math.round(Math.abs(count))}`;
138
+ else return '>#';
139
+
140
+
141
+ }
142
+
143
+ export {
144
+ publicChat,
145
+ privateChat,
146
+ hidden,
147
+ musicCard,
148
+ videoCard,
149
+ like,
150
+ danmu,
151
+ withdrawn,
152
+ stockRequest
153
+
154
+ }
@@ -0,0 +1,10 @@
1
+ export * as tools from "./tools";
2
+ export * as Message from "./Message";
3
+ export * as socket_tools from "./socket-tools";
4
+ export * as encoder from "./encoder";
5
+ export * as decoder from "./decoder";
6
+ export * as elements_hooks from "./elements-hooks";
7
+ export { Emitter } from "./Emitter";
8
+ export * as log_tools from "./log-tools";
9
+ export * as store from "./store";
10
+ export * as script_tools from "./script-tools";
@@ -0,0 +1,69 @@
1
+ import { Emitter } from "./Emitter";
2
+ import { HortimagicStore } from "./store";
3
+ /**
4
+ * 日志事件发射器
5
+ * 每次日志输出时都会触发'log'事件
6
+ */
7
+ export const logEmitter = new Emitter();
8
+ /**
9
+ * 日志记录器
10
+ * 根据配置中的日志级别来决定是否输出日志
11
+ * 只有当配置的日志级别与当前输出的日志级别匹配时才会输出日志
12
+ */
13
+ export const logger = {
14
+ /**
15
+ * 记录普通日志
16
+ * 只有在配置的日志级小于等于DEBUG时才会输出
17
+ * @param args 要输出的参数
18
+ */
19
+ log(tag: string, ...args: any[]): void {
20
+ if (HortimagicStore.logFlag.log) {
21
+ logEmitter.emit('log', tag, ...args);
22
+ console.log(tag, ...args);
23
+ }
24
+ },
25
+ /**
26
+ * 输出调试日志
27
+ * 仅在配置的日志级别小于等于DEBUG时才会输出
28
+ * @param args 要输出的参数
29
+ */
30
+ debug(tag: string, ...args: any[]): void {
31
+ if (HortimagicStore.logFlag.debug) {
32
+ logEmitter.emit('log', tag, ...args);
33
+ console.debug(tag, ...args);
34
+ }
35
+ },
36
+ /**
37
+ * 输出信息日志
38
+ * 仅在配置的日志级别小于等于INFO时才会输出
39
+ * @param args 要输出的参数
40
+ */
41
+ info(tag: string, ...args: any[]): void {
42
+ if (HortimagicStore.logFlag.info) {
43
+ logEmitter.emit('log', tag, ...args);
44
+ console.info(tag, ...args);
45
+ }
46
+ },
47
+ /**
48
+ * 输出警告日志
49
+ * 仅在配置的日志级别小于等于WARN时才会输出
50
+ * @param args 要输出的参数
51
+ */
52
+ warn(tag: string, ...args: any[]): void {
53
+ if (HortimagicStore.logFlag.warn) {
54
+ logEmitter.emit('log', tag, ...args);
55
+ console.warn(tag, ...args);
56
+ }
57
+ },
58
+ /**
59
+ * 输出错误日志
60
+ * 仅在配置的日志级别小于等于ERROR时才会输出
61
+ * @param args 要输出的参数
62
+ */
63
+ error(tag: string, ...args: any[]): void {
64
+ if (HortimagicStore.logFlag.error) {
65
+ logEmitter.emit('log', tag, ...args);
66
+ console.error(tag, ...args);
67
+ }
68
+ },
69
+ };