From 855ea840f5bab0e3de67806c3102e9a2fd666a78 Mon Sep 17 00:00:00 2001 From: ddiu8081 Date: Tue, 11 Oct 2022 23:10:29 +0800 Subject: [PATCH] =?UTF-8?q?feat!:=20=E7=94=A8=E6=88=B7=E5=85=B3=E6=B3=A8/?= =?UTF-8?q?=E5=88=86=E4=BA=AB=E7=9B=B4=E6=92=AD=E9=97=B4=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 19 ++++++++------ src/listener/index.ts | 4 +-- src/parser/INTERACT_WORD_ENTRY_EFFECT.ts | 32 +++++++++++++++++------- src/parser/index.ts | 2 +- src/types/message.ts | 2 +- 5 files changed, 38 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 622fb54..0e4b824 100644 --- a/README.md +++ b/README.md @@ -175,7 +175,7 @@ export type Handler = { | onWatchedChange | 累计看过人数变化 | | onLikedChange | 累计点赞人数变化 | | onRankCountChange | 高能用户人数变化 | -| onNewComer | 观众进入直播间 | +| onUserAction | 用户进入、关注、分享直播间 | | onRoomInfoChange | 直播间信息修改 | ##### handler.onLiveStart @@ -290,25 +290,28 @@ export interface RankCountChangeMsg { } ``` -##### handler.onNewComer +##### handler.onUserAction -观众进入直播间 +用户进入、关注、分享直播间 -- 包括普通用户进入与舰长进入 - 舰长进入直播间时,有几率会触发两次 - 舰长进入直播间时,uname 超长可能会省略号截断 ```ts export type Handler = { - /** 观众进入直播间 */ - onNewComer: (msg: Message) => void + /** 用户进入、关注、分享直播间 */ + onUserAction: (msg: Message) => void } type msgType = 'INTERACT_WORD' | 'ENTRY_EFFECT' -export interface NewComerMsg { +type UserActionType = 'enter' | 'follow' | 'share' | 'unknown' + +export interface UserActionMsg { user: User - /** 入场时间,毫秒时间戳 */ + /** 事件类型 */ + type: UserActionType + /** 事件时间,毫秒时间戳 */ timestamp: number } ``` diff --git a/src/listener/index.ts b/src/listener/index.ts index 51157d1..3885041 100644 --- a/src/listener/index.ts +++ b/src/listener/index.ts @@ -4,7 +4,7 @@ import { PREPARING, type LiveStopMsgHandler, DANMU_MSG, type DanmuMsgHandler, GUARD_BUY, type GuardBuyHandler, - INTERACT_WORD, ENTRY_EFFECT, type NewComerMsgHandler, + INTERACT_WORD, ENTRY_EFFECT, type UserActionMsgHandler, LIKE_INFO_V3_UPDATE, type LikedChangeMsgHandler, ONLINE_RANK_COUNT, type RankCountChangeMsgHandler, ROOM_CHANGE, type RoomInfoChangeHandler, @@ -31,7 +31,7 @@ export type MsgHandler = Partial< & LiveStopMsgHandler & DanmuMsgHandler & GuardBuyHandler - & NewComerMsgHandler + & UserActionMsgHandler & LikedChangeMsgHandler & RankCountChangeMsgHandler & RoomInfoChangeHandler diff --git a/src/parser/INTERACT_WORD_ENTRY_EFFECT.ts b/src/parser/INTERACT_WORD_ENTRY_EFFECT.ts index 054ec20..33eea1d 100644 --- a/src/parser/INTERACT_WORD_ENTRY_EFFECT.ts +++ b/src/parser/INTERACT_WORD_ENTRY_EFFECT.ts @@ -1,14 +1,26 @@ import { intToColorHex } from '../utils/color' import type { Message, User } from '../types/app' -export interface NewComerMsg { +type UserActionType = 'enter' | 'follow' | 'share' | 'unknown' + +export interface UserActionMsg { user: User - /** 入场时间,毫秒时间戳 */ + /** 事件类型 */ + type: UserActionType + /** 事件时间,毫秒时间戳 */ timestamp: number } -const parserNormal = (data: any, roomId: number): NewComerMsg => { +const parserNormal = (data: any, roomId: number): UserActionMsg => { const rawData = data.data + let eventType: UserActionType = 'unknown' + if (rawData.msg_type === 1) { + eventType = 'enter' + } else if (rawData.msg_type === 2) { + eventType = 'follow' + } else if (rawData.msg_type === 3) { + eventType = 'share' + } return { user: { uid: rawData.uid, @@ -32,11 +44,12 @@ const parserNormal = (data: any, roomId: number): NewComerMsg => { room_admin: false, } }, + type: eventType, timestamp: Math.ceil(rawData.trigger_time / 1000000), } } -const parserGuard = (data: any, roomId: number): NewComerMsg => { +const parserGuard = (data: any, roomId: number): UserActionMsg => { const rawData = data.data const uname = /<%(.*)%>/.exec(rawData.copy_writing)?.[1] || '' return { @@ -49,11 +62,12 @@ const parserGuard = (data: any, roomId: number): NewComerMsg => { room_admin: false, } }, + type: 'enter', timestamp: Math.ceil(rawData.trigger_time / 1000000), } } -const parser = (data: any, roomId: number): NewComerMsg => { +const parser = (data: any, roomId: number): UserActionMsg => { const msgType = data.cmd if (msgType === 'ENTRY_EFFECT') { return parserGuard(data, roomId) @@ -66,16 +80,16 @@ const parser = (data: any, roomId: number): NewComerMsg => { export const INTERACT_WORD = { parser, eventName: 'INTERACT_WORD' as const, - handlerName: 'onNewComer' as const, + handlerName: 'onUserAction' as const, } export const ENTRY_EFFECT = { parser, eventName: 'ENTRY_EFFECT' as const, - handlerName: 'onNewComer' as const, + handlerName: 'onUserAction' as const, } export type Handler = { - /** 观众进入直播间 */ - onNewComer: (msg: Message) => void + /** 用户进入、关注、分享直播间 */ + onUserAction: (msg: Message) => void } \ No newline at end of file diff --git a/src/parser/index.ts b/src/parser/index.ts index 180d1c9..78a6802 100644 --- a/src/parser/index.ts +++ b/src/parser/index.ts @@ -3,7 +3,7 @@ export { LIVE, Handler as LiveStartMsgHandler, LiveStartMsg } from './LIVE' export { PREPARING, Handler as LiveStopMsgHandler, LiveEndMsg } from './PREPARING' export { DANMU_MSG, Handler as DanmuMsgHandler, DanmuMsg } from './DANMU_MSG' export { GUARD_BUY, Handler as GuardBuyHandler, GuardBuyMsg } from './GUARD_BUY' -export { INTERACT_WORD, ENTRY_EFFECT, Handler as NewComerMsgHandler, NewComerMsg } from './INTERACT_WORD_ENTRY_EFFECT' +export { INTERACT_WORD, ENTRY_EFFECT, Handler as UserActionMsgHandler, UserActionMsg } from './INTERACT_WORD_ENTRY_EFFECT' export { LIKE_INFO_V3_UPDATE, Handler as LikedChangeMsgHandler, LikedChangeMsg } from './LIKE_INFO_V3_UPDATE' export { ONLINE_RANK_COUNT, Handler as RankCountChangeMsgHandler, RankCountChangeMsg } from './ONLINE_RANK_COUNT' export { ROOM_CHANGE, Handler as RoomInfoChangeHandler, RoomInfoChangeMsg } from './ROOM_CHANGE' diff --git a/src/types/message.ts b/src/types/message.ts index ddad5c3..eb1afe4 100644 --- a/src/types/message.ts +++ b/src/types/message.ts @@ -2,7 +2,7 @@ export type { AttentionChangeMsg, DanmuMsg, GuardBuyMsg, - NewComerMsg, + UserActionMsg, GiftMsg, SuperChatMsg, WatchedChangeMsg,