Skip to content

Commit 3634a2a

Browse files
committed
添加事件&添加特性
1 parent 8b1c318 commit 3634a2a

File tree

4 files changed

+104
-22
lines changed

4 files changed

+104
-22
lines changed

Release-Description.md

+6-4
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
# TMBot Release Note
22

3-
#### Version 1.0.4
3+
#### Version 1.0.6
44

5-
## 更新描述:无
5+
## 更新描述:添加事件&添加特性
6+
7+
1. 添加事件 onHeartBeat
8+
2. 添加事件 onLifecycle
69

710
## 修复Bug
811

912
## 新增特性
1013

11-
1. OneBotDocking添加监听onClientDestroy(同 WebsocketClient.event.onDestroy)
12-
2. OneBotDocking监听改名: onClientClose => onClientDisconnect
14+
1. 为Event类添加事件参数,为了兼容旧代码,使用Event.onEx监听即可体验新特性

app.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ let Logo = String.raw`
1515
let logger = new Logger("TMBotMain");
1616

1717
export let Version = {
18-
"version": [1, 0, 4],
19-
"isBeta": true,
18+
"version": [1, 0, 6],
19+
"isBeta": false,
2020
"isDebug": false
2121
};
2222

modules/OneBotDocking.ts

+66-5
Original file line numberDiff line numberDiff line change
@@ -510,6 +510,7 @@ async function ProcessOneBotMessage(this: OneBotDocking, obj: obj) {
510510
// this.MsgIDMap.set(msg.msg_id, msg);
511511
this.events.onPrivateMsg.fire(
512512
"OneBotDockingProcess_Event_PrivateMsg",
513+
obj.time * 1000,
513514
sender,
514515
obj.sub_type,
515516
msg
@@ -534,6 +535,7 @@ async function ProcessOneBotMessage(this: OneBotDocking, obj: obj) {
534535
}
535536
this.events.onGroupMsg.fire(
536537
"OneBotDockingProcess_Event_GroupMsg",
538+
obj.time * 1000,
537539
group,
538540
obj.sub_type,
539541
member,
@@ -558,6 +560,7 @@ async function ProcessOneBotNotice(this: OneBotDocking, obj: obj) {
558560
let file = new FileInfo(obj.file);
559561
this.events.onGroupUploadFile.fire(
560562
"OneBotDockingProcess_Event_GroupUploadFile",
563+
obj.time * 1000,
561564
group,
562565
member,
563566
file
@@ -569,6 +572,7 @@ async function ProcessOneBotNotice(this: OneBotDocking, obj: obj) {
569572
let member = group.getMember(obj.user_id)!;
570573
this.events.onGroupAdminChange.fire(
571574
"OneBotDockingProcess_Event_GroupAdminChange",
575+
obj.time * 1000,
572576
group,
573577
member,
574578
obj.sub_type
@@ -584,6 +588,7 @@ async function ProcessOneBotNotice(this: OneBotDocking, obj: obj) {
584588
let op = await this.getStrangerInfoEx(obj.operator_id);
585589
this.events.onGroupLeave.fire(
586590
"OneBotDockingProcess_Event_GroupLeave",
591+
obj.time * 1000,
587592
group,
588593
obj.sub_type,
589594
member,
@@ -626,6 +631,7 @@ async function ProcessOneBotNotice(this: OneBotDocking, obj: obj) {
626631
}
627632
this.events.onGroupJoin.fire(
628633
"OneBotDockingProcess_Event_GroupJoin",
634+
obj.time * 1000,
629635
baseGroupInfo,
630636
(obj.sub_type == "invite"),
631637
strangeInfo as StrangerInfo,
@@ -639,6 +645,7 @@ async function ProcessOneBotNotice(this: OneBotDocking, obj: obj) {
639645
if (obj.user_id == 0) {
640646
this.events.onGroupWholeMute.fire(
641647
"OneBotDockingProcess_Event_GroupWholeMute",
648+
obj.time * 1000,
642649
group,
643650
(obj.sub_type == "lift_ban"),
644651
op
@@ -647,6 +654,7 @@ async function ProcessOneBotNotice(this: OneBotDocking, obj: obj) {
647654
let member = (await group.refreshMemberInfo(this, obj.user_id))!;
648655
this.events.onGroupMute.fire(
649656
"OneBotDockingProcess_Event_GroupMute",
657+
obj.time * 1000,
650658
group,
651659
(obj.sub_type == "lift_ban"),
652660
member,
@@ -666,6 +674,7 @@ async function ProcessOneBotNotice(this: OneBotDocking, obj: obj) {
666674
}
667675
this.events.onGroupRecall.fire(
668676
"OneBotDockingProcess_Event_GroupRecall",
677+
obj.time * 1000,
669678
group,
670679
member,
671680
op,
@@ -678,6 +687,7 @@ async function ProcessOneBotNotice(this: OneBotDocking, obj: obj) {
678687
await this.RefreshAllFriendInfo();
679688
this.events.onFriendAdd.fire(
680689
"OneBotDockingProcess_Event_FriendAdd",
690+
obj.time * 1000,
681691
strangerInfo
682692
);
683693
break;
@@ -690,6 +700,7 @@ async function ProcessOneBotNotice(this: OneBotDocking, obj: obj) {
690700
if (!msg) { return; }
691701
this.events.onFriendRecall.fire(
692702
"OneBotDockingProcess_Event_FriendRecall",
703+
obj.time * 1000,
693704
friendInfo,
694705
msg
695706
);
@@ -705,6 +716,7 @@ async function ProcessOneBotNotice(this: OneBotDocking, obj: obj) {
705716
let target = (await group.refreshMemberInfo(this, obj.target_id))!;
706717
this.events.onGroupPoke.fire(
707718
"OneBotDockingProcess_Event_GroupPoke",
719+
obj.time * 1000,
708720
group,
709721
sender,
710722
target
@@ -714,6 +726,7 @@ async function ProcessOneBotNotice(this: OneBotDocking, obj: obj) {
714726
let sender = this.getFriendInfoSync(obj.user_id)!;
715727
this.events.onFriendPoke.fire(
716728
"OneBotDockingProcess_Event_FriendPoke",
729+
obj.time * 1000,
717730
sender
718731
);
719732
}
@@ -724,6 +737,7 @@ async function ProcessOneBotNotice(this: OneBotDocking, obj: obj) {
724737
let target = (await group!.refreshMemberInfo(this, obj.target_id))!;
725738
this.events.onGroupRedPacketLuckKing.fire(
726739
"OneBotDockingProcess_Event_GroupRedPacketLuckKing",
740+
obj.time * 1000,
727741
group!,
728742
member,
729743
target
@@ -734,6 +748,7 @@ async function ProcessOneBotNotice(this: OneBotDocking, obj: obj) {
734748
let member = (await group!.refreshMemberInfo(this, obj.user_id))!;
735749
this.events.onGroupHonorChanged.fire(
736750
"OneBotDockingProcess_Event_GroupHonorChanged",
751+
obj.time * 1000,
737752
group!,
738753
obj.honor_type,
739754
member
@@ -748,6 +763,7 @@ async function ProcessOneBotNotice(this: OneBotDocking, obj: obj) {
748763
let member = group.getMember(obj.user_id)!;
749764
this.events.onGroupCardChanged.fire(
750765
"OneBotDockingProcess_Event_GroupCardChanged",
766+
obj.time * 1000,
751767
group,
752768
member,
753769
obj.card_new
@@ -760,6 +776,7 @@ async function ProcessOneBotNotice(this: OneBotDocking, obj: obj) {
760776
let file = new OfflineFileInfo(obj.file);
761777
this.events.onReceiveOfflineFile.fire(
762778
"OneBotDockingProcess_Event_ReceiveOfflineFile",
779+
obj.time * 1000,
763780
stranger,
764781
file
765782
);
@@ -769,6 +786,7 @@ async function ProcessOneBotNotice(this: OneBotDocking, obj: obj) {
769786
let device = new DeviceInfo(obj.client);
770787
this.events.onClientStatusChanged.fire(
771788
"OneBotDockingProcess_Event_ClientStatusChanged",
789+
obj.time * 1000,
772790
device,
773791
obj.online
774792
);
@@ -784,6 +802,7 @@ async function ProcessOneBotNotice(this: OneBotDocking, obj: obj) {
784802
let op = (await group.refreshMemberInfo(this, obj.operator_id))!;
785803
this.events.onGroupEssenceMsgChanged.fire(
786804
"OneBotDockingProcess_Event_GroupEssenceMsgChanged",
805+
obj.time * 1000,
787806
group,
788807
obj.sub_type,
789808
sender,
@@ -802,6 +821,7 @@ async function ProcessOneBotRequest(this: OneBotDocking, obj: obj) {
802821
let strangerInfo = (await this.getStrangerInfoEx(obj.user_id))!;
803822
this.events.onFriendRequestAdd.fire(
804823
"OneBotDockingProcess_Event_FriendRequestAdd",
824+
obj.time * 1000,
805825
strangerInfo,
806826
obj.comment,
807827
obj.flag
@@ -813,6 +833,7 @@ async function ProcessOneBotRequest(this: OneBotDocking, obj: obj) {
813833
let strangerInfo = (await this.getStrangerInfoEx(obj.user_id))!;
814834
this.events.onGroupRequestJoin.fire(
815835
"OneBotDockingProcess_Event_GroupRequestJoin",
836+
obj.time * 1000,
816837
groupBaseInfo,
817838
(obj.sub_type == "invite"),
818839
strangerInfo,
@@ -824,6 +845,28 @@ async function ProcessOneBotRequest(this: OneBotDocking, obj: obj) {
824845
}
825846
}
826847

848+
async function ProcessOneBotMetaEvent(this: OneBotDocking, obj: obj) {
849+
// console.log(obj);
850+
switch (obj.meta_event_type as "lifecycle" | "heartbeat") {
851+
case "lifecycle": {
852+
this.events.onLifecycle.fire(
853+
"OneBotDockingProcess_Event_Lifecycle",
854+
obj.time * 1000,
855+
obj.sub_type
856+
);
857+
break;
858+
}
859+
case "heartbeat": {
860+
this.events.onHeartBeat.fire(
861+
"OneBotDockingProcess_Event_HeartBeat",
862+
obj.time * 1000,
863+
obj.interval
864+
);
865+
break;
866+
}
867+
}
868+
}
869+
827870
// class ShareData {
828871
// private map = new Map<string, Map<any, any>>();
829872
// constructor() { }
@@ -858,6 +901,10 @@ export class OneBotDocking {
858901

859902
private _events = {
860903
"onRawMessage": new Event<(rawInfo: string, ori: (isExecute: boolean, raw: string) => void) => void>(this.DelayLogger),
904+
/**
905+
* 初始化数据成功
906+
* @note 此监听可能会重复触发,因为重新连接也会初始化一次数据
907+
*/
861908
"onInitSuccess": new Event<() => void>(this.DelayLogger),
862909
"onClientDisconnect": new Event<() => void>(this.DelayLogger),
863910
"onClientDestroy": new Event<() => void>(this.DelayLogger),
@@ -885,7 +932,17 @@ export class OneBotDocking {
885932
"onGroupHonorChanged": new Event<(group: GroupInfo, honor: HonorType, member: GroupMemberInfo) => void>(this.DelayLogger),
886933
"onGroupCardChanged": new Event<(group: GroupInfo, member: GroupMemberInfo, card: string) => void>(this.DelayLogger),
887934
"onReceiveOfflineFile": new Event<(stranger: StrangerInfo, offlineFile: OfflineFileInfo) => void>(this.DelayLogger),
888-
"onGroupEssenceMsgChanged": new Event<(group: GroupInfo, sub_type: "add" | "delete", sender: GroupMemberInfo, operator: GroupMemberInfo, msg: MsgInfo) => void>(this.DelayLogger)
935+
"onGroupEssenceMsgChanged": new Event<(group: GroupInfo, sub_type: "add" | "delete", sender: GroupMemberInfo, operator: GroupMemberInfo, msg: MsgInfo) => void>(this.DelayLogger),
936+
/**
937+
* 心跳包触发
938+
* @note interval是心跳包触发时间
939+
*/
940+
"onHeartBeat": new Event<(interval: number) => void>(this.DelayLogger),
941+
/**
942+
* 生命周期
943+
* @note 首次建立连接插件会错过connect生命周期,建议使用onInitSuccess代替connect生命周期
944+
*/
945+
"onLifecycle": new Event<(type: "enable" | "disable" | "connect") => void>(this.DelayLogger)
889946
}
890947

891948
public logger: Logger;
@@ -951,7 +1008,7 @@ export class OneBotDocking {
9511008
if ((await this._loadLoginInfo()) &&
9521009
(await this._loadFriends()) &&
9531010
(await this._loadGroupsInfo())) {
954-
this._events.onInitSuccess.fire("OneBotDockingProcess_Event_InitSuccess");
1011+
this._events.onInitSuccess.fire("OneBotDockingProcess_Event_InitSuccess", null);
9551012
this.logger.info(`基础信息初始化成功!`);
9561013
this._IsInitd = true;
9571014
} else {
@@ -962,7 +1019,7 @@ export class OneBotDocking {
9621019
if (isBuff) { this.logger.warn("暂不支持Buffer信息!"); return; }
9631020
let msg_ = msg as string, b = true;
9641021
this.events.onRawMessage.fire(
965-
"OneBotDockingProcess_Event_RawMessage",
1022+
"OneBotDockingProcess_Event_RawMessage", null,
9661023
msg_,
9671024
(boo, msg) => {
9681025
b = (b ? boo : b);
@@ -988,7 +1045,7 @@ export class OneBotDocking {
9881045
}
9891046
if (this._isClosing) { return; }
9901047
// console.log(obj)
991-
switch (obj.post_type as "message" | "notice" | "request") {
1048+
switch (obj.post_type as "message" | "notice" | "request" | "meta_event") {
9921049
case "message": {
9931050
ProcessOneBotMessage.call(this, obj);
9941051
break;
@@ -1001,6 +1058,10 @@ export class OneBotDocking {
10011058
ProcessOneBotRequest.call(this, obj);
10021059
break;
10031060
}
1061+
case "meta_event": {
1062+
ProcessOneBotMetaEvent.call(this, obj);
1063+
break;
1064+
}
10041065
}
10051066
});
10061067
this.wsc.events.onClose.on((code, desc) => {
@@ -1011,7 +1072,7 @@ export class OneBotDocking {
10111072
});
10121073
this.wsc.events.onDestroy.on(() => {
10131074
this._events.onClientDestroy.fire(
1014-
"OneBotDockingProcess_Event_ClientClose"
1075+
"OneBotDockingProcess_Event_ClientClose", null
10151076
);
10161077
});
10171078
this.events.onRawMessage.on((raw, ori) => {

modules/WebSocket.ts

+30-11
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,29 @@ import { Logger } from "../tools/logger";
77

88
let logger = new Logger("WebsocketClient", 4);
99

10-
export class Event<FUNCTION_T extends (...args: any[]) => void | Promise<void>>{
10+
export class Event<FUNCTION_T extends (...args: any[]) => any | Promise<any>>{
1111
private num = 0;
1212
constructor(
1313
private log: Logger | { "error": (...args: any[]) => any },
14-
private funcList: { [key: string]: FUNCTION_T } = {}
14+
private funcList: { [key: string]: (time: number, ...params: Parameters<FUNCTION_T>) => ReturnType<FUNCTION_T> } = {}
1515
) { }
1616
on(func: FUNCTION_T) {
17+
let name = (() => {
18+
try {
19+
if (func.name) { return func.name; }
20+
let res = ((func.toString().match(/function\s*([^(]*)\(/))![1]).trim();
21+
if (res == "*") { throw new Error("NameError"); }
22+
return res;
23+
} catch (_) {
24+
return `_NOT_FUNCTION_NAME_(${this.num++})`;
25+
}
26+
})();
27+
this.funcList[name] = (_t, ...p) => {
28+
return func(...p);
29+
};
30+
return name;
31+
}
32+
onEx(func: (time: number, ...params: Parameters<FUNCTION_T>) => ReturnType<FUNCTION_T>) {
1733
let name = (() => {
1834
try {
1935
if (func.name) { return func.name; }
@@ -38,16 +54,19 @@ export class Event<FUNCTION_T extends (...args: any[]) => void | Promise<void>>{
3854
size() {
3955
return Object.keys(this.funcList).length;
4056
}
41-
fire(api: string, ...params: Parameters<FUNCTION_T>) {
57+
fire(api: string, time: number | null | undefined, ...params: Parameters<FUNCTION_T>) {
4258
let keys = Object.keys(this.funcList);
4359
let l = keys.length, i = 0;
60+
if (time == null) {
61+
time = Date.now();
62+
}
4463
while (i < l) {
4564
let funcName = keys[i];
4665
let func = this.funcList[funcName];
4766
try {
48-
let res = func(...params);
67+
let res = func(time, ...params);
4968
if (isPromise(res)) {
50-
res.catch((e) => {
69+
(res as Promise<unknown>).catch((e) => {
5170
this.log.error(`Error in: ${api}(${funcName})[Promise]`);
5271
this.log.error((e instanceof Error) ? e.stack : e.toString());
5372
});
@@ -164,21 +183,21 @@ export class WebsocketClient {
164183
_Init() {
165184
this._client.onopen = (_e) => {
166185
logger.info("服务器连接成功!");
167-
this._events.onStart.fire("WebsocketProcessStart");
186+
this._events.onStart.fire("WebsocketProcessStart", null);
168187
};
169188
this._client.onmessage = (e) => {
170189
let isBuffer = typeof (e.data) != "string";
171190
if (!isBuffer) {
172-
this._events.onMsg.fire("WebsocketProcessUTF8Message", e.data as string, isBuffer);
191+
this._events.onMsg.fire("WebsocketProcessUTF8Message", null, e.data as string, isBuffer);
173192
} else {
174-
this._events.onMsg.fire("WebsocketProcessBINARYMessage", e.data as Buffer, isBuffer);
193+
this._events.onMsg.fire("WebsocketProcessBINARYMessage", null, e.data as Buffer, isBuffer);
175194
}
176195
};
177196
this._client.onclose = (e) => {
178-
this._events.onClose.fire("WebsocketProcessClose", e.code, e.reason);
197+
this._events.onClose.fire("WebsocketProcessClose", null, e.code, e.reason);
179198
};
180199
this._client.onerror = (e) => {
181-
this._events.onError.fire("WebsocketProcessFailed", e.error as Error);
200+
this._events.onError.fire("WebsocketProcessFailed", null, e.error as Error);
182201
//logger.error("ConnectFailed! ", err.stack);
183202
};
184203
// this._conn = this._client.();
@@ -233,7 +252,7 @@ export class WebsocketClient {
233252
* 销毁此对象(销毁不可逆!)
234253
*/
235254
destroy(code: number = 1000) {
236-
this._events.onDestroy.fire("WebsocketDestroy");
255+
this._events.onDestroy.fire("WebsocketDestroy", null);
237256
this.isDestroyed = true;
238257
this.close(code);
239258
return true;

0 commit comments

Comments
 (0)