diff --git a/package.json b/package.json index bd96501..9e8b797 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "blive-message-listener", - "version": "0.1.9", + "version": "0.1.10", "description": "Bilibili-live danmu listener with type", "main": "dist/index.js", "module": "dist/index.mjs", diff --git a/src/index.ts b/src/index.ts index 51dde70..e38b695 100644 --- a/src/index.ts +++ b/src/index.ts @@ -9,5 +9,5 @@ export const startListen = (roomId: number, handler: MsgHandler) => { } export type { MsgHandler } -export type { Message, GuardLevel } from './types/app' +export type { Message, GuardLevel, User } from './types/app' export * from './types/message' diff --git a/src/listener/index.ts b/src/listener/index.ts index d540a5b..7b5586c 100644 --- a/src/listener/index.ts +++ b/src/listener/index.ts @@ -2,6 +2,7 @@ import { HEARTBEAT, type AttentionChangeMsgHandler, DANMU_MSG, type DanmuMsgHandler, GUARD_BUY, type GuardBuyHandler, + INTERACT_WORD, type NewComerMsgHandler, SEND_GIFT, type GiftHandler, SUPER_CHAT_MESSAGE, type SuperChatHandler, WATCHED_CHANGE, type WatchedChangeHandler, @@ -13,6 +14,7 @@ export type MsgHandler = Partial< & AttentionChangeMsgHandler & DanmuMsgHandler & GuardBuyHandler + & NewComerMsgHandler & GiftHandler & SuperChatHandler & WatchedChangeHandler @@ -58,6 +60,14 @@ export const listenAll = (instance: KeepLiveTCP, roomId: number, handler?: MsgHa }) } + // INTERACT_WORD + if (handler[INTERACT_WORD.handlerName]) { + instance.on(INTERACT_WORD.eventName, (data: any) => { + const parsedData = INTERACT_WORD.parser(data, roomId) + handler[INTERACT_WORD.handlerName]?.(normalizeDanmu(INTERACT_WORD.eventName, parsedData)) + }) + } + // SEND_GIFT if (handler[SEND_GIFT.handlerName]) { instance.on(SEND_GIFT.eventName, (data: any) => { diff --git a/src/parser/INTERACT_WORD.ts b/src/parser/INTERACT_WORD.ts new file mode 100644 index 0000000..fd7e008 --- /dev/null +++ b/src/parser/INTERACT_WORD.ts @@ -0,0 +1,41 @@ +import { intToColorHex } from '../utils/color' +import type { Message, User } from '../types/app' + +export interface NewComerMsg { + user: User + /** 入场时间·*/ + timestamp: number +} + +const parser = (data: any, roomId: number): NewComerMsg => { + const rawData = data.data + return { + user: { + uid: rawData.uid, + uname: rawData.username, + badge: rawData.fans_medal?.target_id ? { + active: rawData.fans_medal?.is_lighted, + name: rawData.fans_medal?.medal_name, + level: rawData.fans_medal?.medal_level, + color: intToColorHex(rawData.fans_medal?.medal_color_start), + anchor: { + uid: rawData.fans_medal?.target_id, + uname: '', + room_id: rawData.fans_medal?.anchor_roomid, + is_same_room: rawData.fans_medal?.anchor_roomid === roomId, + } + } : undefined, + }, + timestamp: rawData.timestamp, + } +} + +export const INTERACT_WORD = { + parser, + eventName: 'INTERACT_WORD' as const, + handlerName: 'onNewComer' as const, +} + +export type Handler = { + onNewComer: (msg: Message) => void +} \ No newline at end of file diff --git a/src/parser/index.ts b/src/parser/index.ts index 9a306bd..56d4933 100644 --- a/src/parser/index.ts +++ b/src/parser/index.ts @@ -1,6 +1,7 @@ export { HEARTBEAT, Handler as AttentionChangeMsgHandler, AttentionChangeMsg } from './HEARTBEAT' export { DANMU_MSG, Handler as DanmuMsgHandler, DanmuMsg } from './DANMU_MSG' export { GUARD_BUY, Handler as GuardBuyHandler, GuardBuyMsg } from './GUARD_BUY' +export { INTERACT_WORD, Handler as NewComerMsgHandler, NewComerMsg } from './INTERACT_WORD' export { SEND_GIFT, Handler as GiftHandler, GiftMsg } from './SEND_GIFT' export { SUPER_CHAT_MESSAGE, Handler as SuperChatHandler, SuperChatMsg } from './SUPER_CHAT_MESSAGE' export { WATCHED_CHANGE, Handler as WatchedChangeHandler, WatchedChangeMsg } from './WATCHED_CHANGE' diff --git a/src/types/message.ts b/src/types/message.ts index 698f27c..ddad5c3 100644 --- a/src/types/message.ts +++ b/src/types/message.ts @@ -2,6 +2,7 @@ export type { AttentionChangeMsg, DanmuMsg, GuardBuyMsg, + NewComerMsg, GiftMsg, SuperChatMsg, WatchedChangeMsg,