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.
- package/dist/hortimagic.iife.js +2 -2
- package/dist/hortimagic.js +4 -4
- package/dist/hortimagic.txt +4 -4
- package/dist/hortimagic.user.js +4 -4
- package/package.json +4 -3
- package/src/apps/config-app.ts +132 -0
- package/src/apps/dialog-app.ts +62 -0
- package/src/apps/index.ts +5 -0
- package/src/apps/log-app.ts +251 -0
- package/src/apps/main-app.ts +72 -0
- package/src/apps/script-app.ts +225 -0
- package/src/components/hm-swipe-cell.ts +2 -2
- package/src/core/Emitter.ts +129 -0
- package/src/core/Message.ts +179 -0
- package/src/core/decoder.ts +207 -0
- package/src/core/elements-hooks.ts +168 -0
- package/src/core/encoder.ts +154 -0
- package/src/core/index.ts +10 -0
- package/src/core/log-tools.ts +69 -0
- package/src/core/script-tools.ts +121 -0
- package/src/core/socket-tools.ts +118 -0
- package/src/core/store.ts +149 -0
- package/src/core/tools.ts +318 -0
- package/src/easy-tools.ts +141 -0
- package/src/holders/dialog.ts +9 -0
- package/src/holders/index.ts +4 -0
- package/src/holders/menu.ts +20 -0
- package/src/holders/move-panel.ts +9 -0
- package/src/holders/notification.ts +9 -0
- package/src/main.ts +49 -0
|
@@ -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
|
+
};
|