diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1111709..5883594 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,16 +1,16 @@ lockfileVersion: 5.4 specifiers: - tiny-bilibili-ws: ^0.0.5 + tiny-bilibili-ws: ^0.0.7 tsup: ^6.5.0 - typescript: ^4.9.3 + typescript: ^4.9.4 dependencies: - tiny-bilibili-ws: 0.0.5 + tiny-bilibili-ws: 0.0.7 devDependencies: - tsup: 6.5.0_typescript@4.9.3 - typescript: 4.9.3 + tsup: 6.5.0_typescript@4.9.4 + typescript: 4.9.4 packages: @@ -360,8 +360,8 @@ packages: esbuild-windows-arm64: 0.15.6 dev: true - /eventemitter3/4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + /eventemitter3/5.0.0: + resolution: {integrity: sha512-riuVbElZZNXLeLEoprfNYoDSwTBRR44X3mnhdI1YcnENpWTCsTTVZ2zFuqQcpoyqPQIUXdiPEU0ECAq0KQRaHg==} dev: false /execa/5.1.1: @@ -597,8 +597,8 @@ packages: mimic-fn: 2.1.0 dev: true - /pako/2.0.4: - resolution: {integrity: sha512-v8tweI900AUkZN6heMU/4Uy4cXRc2AYNRggVmTR+dEncawDJgCdLMximOVA2p4qO57WMynangsfGRb5WD6L1Bg==} + /pako/2.1.0: + resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} dev: false /path-is-absolute/1.0.1: @@ -741,12 +741,12 @@ packages: any-promise: 1.3.0 dev: true - /tiny-bilibili-ws/0.0.5: - resolution: {integrity: sha512-MRJfp4h2BOuJE05RGEXP+chVa+6xlvKZXFVKWrXW+B50kuF5R4q0sX6P6ZzRS3gV8rsXCKgdWI9vk5DvbUkGHw==} + /tiny-bilibili-ws/0.0.7: + resolution: {integrity: sha512-2ZtocYHXXATD2RaMKEkLU57OEm3NdOufOcOz9MQRkhjoD4yvBb9zmnHHepiHB0JMdzoqbLaePJqLF3kgIiVlAQ==} dependencies: - eventemitter3: 4.0.7 - pako: 2.0.4 - ws: 8.9.0 + eventemitter3: 5.0.0 + pako: 2.1.0 + ws: 8.11.0 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -774,7 +774,7 @@ packages: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} dev: true - /tsup/6.5.0_typescript@4.9.3: + /tsup/6.5.0_typescript@4.9.4: resolution: {integrity: sha512-36u82r7rYqRHFkD15R20Cd4ercPkbYmuvRkz3Q1LCm5BsiFNUgpo36zbjVhCOgvjyxNBWNKHsaD5Rl8SykfzNA==} engines: {node: '>=14'} hasBin: true @@ -804,14 +804,14 @@ packages: source-map: 0.8.0-beta.0 sucrase: 3.25.0 tree-kill: 1.2.2 - typescript: 4.9.3 + typescript: 4.9.4 transitivePeerDependencies: - supports-color - ts-node dev: true - /typescript/4.9.3: - resolution: {integrity: sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==} + /typescript/4.9.4: + resolution: {integrity: sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==} engines: {node: '>=4.2.0'} hasBin: true dev: true @@ -840,8 +840,8 @@ packages: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true - /ws/8.9.0: - resolution: {integrity: sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg==} + /ws/8.11.0: + resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 diff --git a/src/listener/index.ts b/src/listener/index.ts index 1ea562c..cfb162c 100644 --- a/src/listener/index.ts +++ b/src/listener/index.ts @@ -2,7 +2,7 @@ import { HEARTBEAT, type AttentionChangeMsgHandler, LIVE, type LiveStartMsgHandler, PREPARING, type LiveStopMsgHandler, - DANMU_MSG, DANMU_MSG_402220, type DanmuMsgHandler, + DANMU_MSG, type DanmuMsgHandler, GUARD_BUY, type GuardBuyHandler, INTERACT_WORD, ENTRY_EFFECT, type UserActionMsgHandler, LIKE_INFO_V3_UPDATE, type LikedChangeMsgHandler, @@ -13,7 +13,7 @@ import { WATCHED_CHANGE, type WatchedChangeHandler, } from '../parser' import type { KeepLiveTCP, KeepLiveWS, Message as WSMessage } from 'tiny-bilibili-ws' -import { normalizeDanmu, checkIsDuplicateDanmuMsg } from '../utils/message' +import { normalizeDanmu } from '../utils/message' export type MsgHandler = Partial< { @@ -82,7 +82,7 @@ export const listenAll = (instance: KeepLiveTCP | KeepLiveWS, roomId: number, ha // LIVE if (handler[LIVE.handlerName] || rawHandlerNames.has(LIVE.eventName)) { rawHandlerNames.delete(LIVE.eventName) - instance.on(LIVE.eventName, (data: WSMessage) => { + instance.on(LIVE.eventName as any, (data: WSMessage) => { isHandleRaw && rawHandler[LIVE.eventName]?.(data.data) const parsedData = LIVE.parser(data.data) handler[LIVE.handlerName]?.(normalizeDanmu(LIVE.eventName, parsedData, data.data)) @@ -92,7 +92,7 @@ export const listenAll = (instance: KeepLiveTCP | KeepLiveWS, roomId: number, ha // PREPARING if (handler[PREPARING.handlerName] || rawHandlerNames.has(PREPARING.eventName)) { rawHandlerNames.delete(LIVE.eventName) - instance.on(PREPARING.eventName, (data: WSMessage) => { + instance.on(PREPARING.eventName as any, (data: WSMessage) => { isHandleRaw && rawHandler[PREPARING.eventName]?.(data.data) const parsedData = PREPARING.parser(data.data) handler[PREPARING.handlerName]?.(normalizeDanmu(PREPARING.eventName, parsedData, data.data)) @@ -100,22 +100,12 @@ export const listenAll = (instance: KeepLiveTCP | KeepLiveWS, roomId: number, ha } // DANMU_MSG - if (handler[DANMU_MSG.handlerName] || rawHandlerNames.has(DANMU_MSG.eventName) || rawHandlerNames.has(DANMU_MSG_402220.eventName)) { + if (handler[DANMU_MSG.handlerName] || rawHandlerNames.has(DANMU_MSG.eventName)) { rawHandlerNames.delete(DANMU_MSG.eventName) - rawHandlerNames.delete(DANMU_MSG_402220.eventName) - const msgCallback = handler[DANMU_MSG.handlerName]! - const handleDanmuMsg = (data: WSMessage) => { - const parsedData = DANMU_MSG.parser(data.data, roomId) - if (checkIsDuplicateDanmuMsg(parsedData)) return - msgCallback(normalizeDanmu(DANMU_MSG.eventName, parsedData, data.data)) - } instance.on(DANMU_MSG.eventName, (data: WSMessage) => { isHandleRaw && rawHandler[DANMU_MSG.eventName]?.(data.data) - handleDanmuMsg(data) - }) - instance.on(DANMU_MSG_402220.eventName, (data: WSMessage) => { - isHandleRaw && rawHandler[DANMU_MSG_402220.eventName]?.(data.data) - handleDanmuMsg(data) + const parsedData = DANMU_MSG.parser(data.data, roomId) + handler[DANMU_MSG.handlerName]?.(normalizeDanmu(DANMU_MSG.eventName, parsedData, data.data)) }) } @@ -168,7 +158,7 @@ export const listenAll = (instance: KeepLiveTCP | KeepLiveWS, roomId: number, ha // ROOM_CHANGE if (handler[ROOM_CHANGE.handlerName] || rawHandlerNames.has(ROOM_CHANGE.eventName)) { rawHandlerNames.delete(ROOM_CHANGE.eventName) - instance.on(ROOM_CHANGE.eventName, (data: WSMessage) => { + instance.on(ROOM_CHANGE.eventName as any, (data: WSMessage) => { isHandleRaw && rawHandler[ROOM_CHANGE.eventName]?.(data.data) const parsedData = ROOM_CHANGE.parser(data.data) handler[ROOM_CHANGE.handlerName]?.(normalizeDanmu(ROOM_CHANGE.eventName, parsedData, data.data)) @@ -208,7 +198,7 @@ export const listenAll = (instance: KeepLiveTCP | KeepLiveWS, roomId: number, ha // Rest raw events rawHandlerNames.forEach((eventName) => { console.log('rest', eventName) - instance.on(eventName, (data: WSMessage) => { + instance.on(eventName as any, (data: WSMessage) => { rawHandler[eventName](data.data) }) }) diff --git a/src/parser/DANMU_MSG.ts b/src/parser/DANMU_MSG.ts index 21aa9b5..65144c0 100644 --- a/src/parser/DANMU_MSG.ts +++ b/src/parser/DANMU_MSG.ts @@ -65,12 +65,6 @@ export const DANMU_MSG = { handlerName: 'onIncomeDanmu' as const, } -export const DANMU_MSG_402220 = { - parser, - eventName: 'DANMU_MSG:4:0:2:2:2:0' as const, - handlerName: 'onIncomeDanmu' as const, -} - export type Handler = { /** 收到普通弹幕消息 */ onIncomeDanmu: (msg: Message) => void diff --git a/src/parser/index.ts b/src/parser/index.ts index b9fbaa9..a29638c 100644 --- a/src/parser/index.ts +++ b/src/parser/index.ts @@ -1,7 +1,7 @@ export { HEARTBEAT, type Handler as AttentionChangeMsgHandler, type AttentionChangeMsg } from './HEARTBEAT' export { LIVE, type Handler as LiveStartMsgHandler, type LiveStartMsg } from './LIVE' export { PREPARING, type Handler as LiveStopMsgHandler, type LiveEndMsg } from './PREPARING' -export { DANMU_MSG, DANMU_MSG_402220, type Handler as DanmuMsgHandler, type DanmuMsg } from './DANMU_MSG' +export { DANMU_MSG, type Handler as DanmuMsgHandler, type DanmuMsg } from './DANMU_MSG' export { GUARD_BUY, type Handler as GuardBuyHandler, type GuardBuyMsg } from './GUARD_BUY' export { INTERACT_WORD, ENTRY_EFFECT, type Handler as UserActionMsgHandler, type UserActionMsg } from './INTERACT_WORD_ENTRY_EFFECT' export { LIKE_INFO_V3_UPDATE, type Handler as LikedChangeMsgHandler, type LikedChangeMsg } from './LIKE_INFO_V3_UPDATE' diff --git a/src/utils/message.ts b/src/utils/message.ts index 1e43ef5..86fe12e 100644 --- a/src/utils/message.ts +++ b/src/utils/message.ts @@ -1,24 +1,4 @@ import type { Message } from '../types/app' -import type { DanmuMsg } from '../parser' - -type QueueItem = [number, string] -class MsgQueue { - private items: QueueItem[] = [] - push = (item: QueueItem) => { - this.items.push(item) - if (this.items.length > 10) { - this.items.shift() - } - } - has = ( [timestamp, content]: QueueItem ) => { - return this.items.some(i => { - const [queueTimestamp, queueContent] = i - return Math.abs(timestamp - queueTimestamp) < 1200 && content === queueContent - }) - } -} - -const msgQueue = new MsgQueue() export const normalizeDanmu = (msgType: string, body: T, rawBody: any): Message => { const timestamp = Date.now() @@ -33,13 +13,3 @@ export const normalizeDanmu = (msgType: string, body: T, rawBody: any): Messa raw: rawBody, } } - -export const checkIsDuplicateDanmuMsg = (msg: DanmuMsg) => { - const msgIdentifier = `${msg.user.uid}:${msg.content}` - const queueItem: QueueItem = [msg.timestamp, msgIdentifier] - if (msgQueue.has(queueItem)) { - return true - } - msgQueue.push(queueItem) - return false -} \ No newline at end of file