diff --git a/src/listener/index.ts b/src/listener/index.ts index 7b5586c..caafe6f 100644 --- a/src/listener/index.ts +++ b/src/listener/index.ts @@ -2,7 +2,7 @@ import { HEARTBEAT, type AttentionChangeMsgHandler, DANMU_MSG, type DanmuMsgHandler, GUARD_BUY, type GuardBuyHandler, - INTERACT_WORD, type NewComerMsgHandler, + INTERACT_WORD, ENTRY_EFFECT, type NewComerMsgHandler, SEND_GIFT, type GiftHandler, SUPER_CHAT_MESSAGE, type SuperChatHandler, WATCHED_CHANGE, type WatchedChangeHandler, @@ -60,12 +60,16 @@ export const listenAll = (instance: KeepLiveTCP, roomId: number, handler?: MsgHa }) } - // INTERACT_WORD - if (handler[INTERACT_WORD.handlerName]) { + // INTERACT_WORD, ENTRY_EFFECT + if (handler[INTERACT_WORD.handlerName] || handler[ENTRY_EFFECT.handlerName]) { instance.on(INTERACT_WORD.eventName, (data: any) => { const parsedData = INTERACT_WORD.parser(data, roomId) handler[INTERACT_WORD.handlerName]?.(normalizeDanmu(INTERACT_WORD.eventName, parsedData)) }) + instance.on(ENTRY_EFFECT.eventName, (data: any) => { + const parsedData = ENTRY_EFFECT.parser(data, roomId) + handler[ENTRY_EFFECT.handlerName]?.(normalizeDanmu(ENTRY_EFFECT.eventName, parsedData)) + }) } // SEND_GIFT diff --git a/src/parser/DANMU_MSG.ts b/src/parser/DANMU_MSG.ts index 24ac960..6a8d6fc 100644 --- a/src/parser/DANMU_MSG.ts +++ b/src/parser/DANMU_MSG.ts @@ -4,7 +4,7 @@ import type { Message, User } from '../types/app' export interface DanmuMsg { user: User content: string - /** 弹幕表情·*/ + /** 弹幕表情 */ emoticon?: { id: string height: number diff --git a/src/parser/GUARD_BUY.ts b/src/parser/GUARD_BUY.ts index 3fcc54c..8bd6462 100644 --- a/src/parser/GUARD_BUY.ts +++ b/src/parser/GUARD_BUY.ts @@ -2,17 +2,17 @@ import type { Message, User, GuardLevel } from '../types/app' export interface GuardBuyMsg { user: User - /** 礼物id·*/ + /** 礼物id */ gift_id: number - /** 礼物名称·*/ + /** 礼物名称 */ gift_name: string /** 大航海信息 */ guard_level: GuardLevel - /** 价格·*/ + /** 价格,RMB */ price: number - /** 等级生效时间·*/ + /** 等级生效时间 */ start_time: number - /** 等级过期时间·*/ + /** 等级过期时间 */ end_time: number } diff --git a/src/parser/HEARTBEAT.ts b/src/parser/HEARTBEAT.ts index 2ccae81..166d583 100644 --- a/src/parser/HEARTBEAT.ts +++ b/src/parser/HEARTBEAT.ts @@ -1,7 +1,7 @@ import type { Message } from '../types/app' export interface AttentionChangeMsg { - /** 直播间热度·*/ + /** 直播间热度 */ attention: number } diff --git a/src/parser/INTERACT_WORD.ts b/src/parser/INTERACT_WORD.ts deleted file mode 100644 index fd7e008..0000000 --- a/src/parser/INTERACT_WORD.ts +++ /dev/null @@ -1,41 +0,0 @@ -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/INTERACT_WORD_ENTRY_EFFECT.ts b/src/parser/INTERACT_WORD_ENTRY_EFFECT.ts new file mode 100644 index 0000000..c06aed3 --- /dev/null +++ b/src/parser/INTERACT_WORD_ENTRY_EFFECT.ts @@ -0,0 +1,80 @@ +import { intToColorHex } from '../utils/color' +import type { Message, User } from '../types/app' + +export interface NewComerMsg { + user: User + /** 入场时间,毫秒时间戳 */ + timestamp: number +} + +const parserNormal = (data: any, roomId: number): NewComerMsg => { + const rawData = data.data + return { + user: { + uid: rawData.uid, + uname: rawData.uname, + face: rawData.face, + 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, + identity: { + rank: 0, + guard_level: rawData.privilege_type, + room_admin: false, + } + }, + timestamp: Math.ceil(rawData.trigger_time / 1000000), + } +} + +const parserGuard = (data: any, roomId: number): NewComerMsg => { + const rawData = data.data + const uname = /<%(.*)%>/.exec(rawData.copy_writing)?.[1] || '' + return { + user: { + uid: rawData.uid, + uname: uname, // 超长会有省略号 + identity: { + rank: 0, + guard_level: rawData.privilege_type, + room_admin: false, + } + }, + timestamp: Math.ceil(rawData.trigger_time / 1000000), + } +} + +const parser = (data: any, roomId: number): NewComerMsg => { + const msgType = data.cmd + if (msgType === 'ENTRY_EFFECT') { + return parserGuard(data, roomId) + } else { + // INTERACT_WORD + return parserNormal(data, roomId) + } +} + +export const INTERACT_WORD = { + parser, + eventName: 'INTERACT_WORD' as const, + handlerName: 'onNewComer' as const, +} + +export const ENTRY_EFFECT = { + parser, + eventName: 'ENTRY_EFFECT' as const, + handlerName: 'onNewComer' as const, +} + +export type Handler = { + onNewComer: (msg: Message) => void +} \ No newline at end of file diff --git a/src/parser/SEND_GIFT.ts b/src/parser/SEND_GIFT.ts index 1acd785..6a34b59 100644 --- a/src/parser/SEND_GIFT.ts +++ b/src/parser/SEND_GIFT.ts @@ -3,13 +3,15 @@ import type { Message, User } from '../types/app' export interface GiftMsg { user: User - /** 礼物id·*/ + /** 礼物id */ gift_id: number - /** 礼物名称·*/ + /** 礼物名称 */ gift_name: string - /** 礼物价格·*/ + /** 礼物价格类型 */ + coin_type: 'silver' | 'gold' + /** 礼物价格,除以1000为RMB */ price: number - /** 礼物数量·*/ + /** 礼物数量 */ amount: number } @@ -39,6 +41,7 @@ const parser = (data: any): GiftMsg => { }, gift_id: rawData.giftId, gift_name: rawData.giftName, + coin_type: rawData.coin_type, price: rawData.price, amount: rawData.num, } diff --git a/src/parser/SUPER_CHAT_MESSAGE.ts b/src/parser/SUPER_CHAT_MESSAGE.ts index d20621b..ecd5c7d 100644 --- a/src/parser/SUPER_CHAT_MESSAGE.ts +++ b/src/parser/SUPER_CHAT_MESSAGE.ts @@ -2,13 +2,13 @@ import type { Message, User } from '../types/app' export interface SuperChatMsg { user: User - /** 弹幕内容·*/ + /** 弹幕内容 */ content: string - /** 弹幕颜色·*/ + /** 弹幕颜色 */ content_color: string - /** 价格·*/ + /** 价格,RMB */ price: number - /** 持续时间·*/ + /** 持续时间 */ time: number } diff --git a/src/parser/WATCHED_CHANGE.ts b/src/parser/WATCHED_CHANGE.ts index 699449a..41b7d6b 100644 --- a/src/parser/WATCHED_CHANGE.ts +++ b/src/parser/WATCHED_CHANGE.ts @@ -1,9 +1,9 @@ import type { Message } from '../types/app' export interface WatchedChangeMsg { - /** 累计入场人数·*/ + /** 累计入场人数 */ num: number - /** 累计入场人数,格式化输出·*/ + /** 累计入场人数,格式化输出 */ text_small: string } diff --git a/src/parser/index.ts b/src/parser/index.ts index 56d4933..a2790fb 100644 --- a/src/parser/index.ts +++ b/src/parser/index.ts @@ -1,7 +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 { INTERACT_WORD, ENTRY_EFFECT, Handler as NewComerMsgHandler, NewComerMsg } from './INTERACT_WORD_ENTRY_EFFECT' 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'