From c810083b7411972f6b71bcd7d34b57da71a034a9 Mon Sep 17 00:00:00 2001 From: xys20071111 Date: Sat, 18 Feb 2023 10:37:32 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=A4=9A=E6=88=BF=E9=97=B4?= =?UTF-8?q?=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/APIServer.ts | 19 +++++++-------- src/Config.ts | 4 ++-- src/DanmakuCallbacks.ts | 28 +++++++++++----------- src/DanmakuReceiver.ts | 4 ++-- src/Deps.ts | 2 +- src/Main.ts | 52 ++++++++++++++++++++++------------------- src/SendDanmaku.ts | 8 +++---- 7 files changed, 59 insertions(+), 58 deletions(-) diff --git a/src/APIServer.ts b/src/APIServer.ts index e2fa380..88db36c 100644 --- a/src/APIServer.ts +++ b/src/APIServer.ts @@ -36,17 +36,14 @@ class APIMsgHandler extends EventEmitter { const serverEventEmitter = new APIMsgHandler() -serverEventEmitter.on("SEND", (_socket: WebSocketClient, data: string) => { - sendDanmaku({ - msg: data, - }) -}) - -serverEventEmitter.on("ROOMID", (socket: WebSocket) => { - socket.send(JSON.stringify({ - cmd: "ROOMID", - data: config.room_id, - })) +serverEventEmitter.on("SEND", (_socket: WebSocketClient, dataJson: string) => { + const data: { + msg: string + roomId: number + } = JSON.parse(dataJson) + sendDanmaku(data.roomId, { + msg: data.msg + }) }) server.on("connection", (client: WebSocketClient) => { diff --git a/src/Config.ts b/src/Config.ts index 1763acd..ab732cc 100644 --- a/src/Config.ts +++ b/src/Config.ts @@ -21,7 +21,7 @@ interface api_config { } interface ConfigStruct { - room_id: number + room_id: Array verify: Credential danmakus: DanmakuTemplate cold_down_time: number @@ -34,6 +34,6 @@ interface ConfigStruct { } const decoder = new TextDecoder('utf-8') -const config: ConfigStruct = JSON.parse(decoder.decode(Deno.readFileSync(`config/${Deno.args[0]}`))) +const config: ConfigStruct = JSON.parse(decoder.decode(Deno.readFileSync(Deno.args[0]))) export default config diff --git a/src/DanmakuCallbacks.ts b/src/DanmakuCallbacks.ts index 6de861c..9932ba9 100644 --- a/src/DanmakuCallbacks.ts +++ b/src/DanmakuCallbacks.ts @@ -12,13 +12,13 @@ let logFile = Deno.openSync(`./log/${getTimeString()}-${config.room_id}.log`, { const thanksColdDownSet = new Set() -export function receiveGift(data: any) { +export function receiveGift(roomId: number, data: any) { if(thanksColdDownSet.has(data.uname)){ return } logFile.writeSync(Encoding.UTF8.getBytes(`${getTimeString()} ${data.uname} 投喂了${data.super_gift_num}个 ${data.giftName} 价值${data.price / 1000 * data.super_gift_num}元\n`)) if (config.free_gift_action || data.super_gift_num > 0) { - sendDanmaku({ + sendDanmaku(roomId, { msg: FormatString(config.danmakus.gift, { name: data.uname, gift: data.giftName }) }) thanksColdDownSet.add(data.uname) @@ -26,46 +26,46 @@ export function receiveGift(data: any) { } } -export function onTotalGift(data: any) { +export function onTotalGift(roomId: number, data: any) { logFile.writeSync(Encoding.UTF8.getBytes(`${getTimeString()} ${data.uname}投喂了${data.total_num}个${data.gift_name}\n`)) - sendDanmaku({ + sendDanmaku(roomId, { msg: FormatString(config.danmakus.gift_total, { name: data.uname, gift: data.gift_name, count: data.total_num }) }) } -export function receiveDanmaku(data: any) { - logFile.writeSync(Encoding.UTF8.getBytes(`${getTimeString()} ${data[2][1]}:${data[2][0]} ${data[1]}\n`)) +export function receiveDanmaku(roomId:number, data: any) { + logFile.writeSync(Encoding.UTF8.getBytes(`${getTimeString()} ${roomId} ${data[2][1]}:${data[2][0]} ${data[1]}\n`)) } -export function onLiveStart() { +export function onLiveStart(roomId: number) { if(skipCount != 1){ skipCount ++ return } skipCount = 0 logFile.close() - sendDanmaku({ msg: config.danmakus.live_start }) + sendDanmaku(roomId, { msg: config.danmakus.live_start }) logFile = Deno.openSync(`./log/${getTimeString()}-${config.room_id}.log`, { create: true }) logFile.writeSync(Encoding.UTF8.getBytes(`${getTimeString()} 直播开始\n`)) } -export function onLiveEnd() { +export function onLiveEnd(roomId: number) { logFile.writeSync(Encoding.UTF8.getBytes(`${getTimeString()} 直播结束\n`)) - sendDanmaku({ msg: config.danmakus.live_end }) + sendDanmaku(roomId, { msg: config.danmakus.live_end }) } -export function onGraud(data: any) { +export function onGraud(roomId: number, data: any) { logFile.writeSync(Encoding.UTF8.getBytes(`${getTimeString()} ${data.username}:${data.uid} 购买了 ${data.gift_name}\n`)) - sendDanmaku({ + sendDanmaku(roomId, { msg: FormatString(config.danmakus.guard, { type: data.gift_name, name: data.username }) }) } -export function onSuperChat(data: any) { +export function onSuperChat(roomId: number, data: any) { logFile.writeSync(Encoding.UTF8.getBytes(`${getTimeString()} ${data.user_info.uname}发送了SC 价格${data.price}\n`)) - sendDanmaku({ + sendDanmaku(roomId, { msg: FormatString(config.danmakus.sc, { name: data.user_info.uname }) }) } diff --git a/src/DanmakuReceiver.ts b/src/DanmakuReceiver.ts index 3de75d6..c9ffe55 100644 --- a/src/DanmakuReceiver.ts +++ b/src/DanmakuReceiver.ts @@ -127,9 +127,9 @@ export class DanmakuReceiver extends EventEmitter { const packetData = resultRaw.slice(offset + 16, offset + length) const data = JSON.parse(decoder.decode(packetData)) const cmd = data.cmd.split(":")[0] - this.emit(cmd, data.info || data.data) + this.emit(cmd, this.roomId, data.info || data.data) apiServer.clients.forEach((client: WebSocketClient) => { - client.send(JSON.stringify({ cmd, data: data.info || data.data })) + client.send(JSON.stringify({ cmd, room: this.roomId, data: data.info || data.data })) }) offset += length } diff --git a/src/Deps.ts b/src/Deps.ts index d6456d2..969edb5 100644 --- a/src/Deps.ts +++ b/src/Deps.ts @@ -2,5 +2,5 @@ import * as events from 'https://deno.land/x/events@v1.0.0/mod.ts' const EventEmitter = events.default export { EventEmitter } -export * as brotli from 'https://deno.land/x/brotli@v0.1.4/mod.ts' +export * as brotli from 'https://deno.land/x/brotli@0.1.7/mod.ts' export { WebSocketServer, type WebSocketClient } from 'https://deno.land/x/websocket@v0.1.4/mod.ts' diff --git a/src/Main.ts b/src/Main.ts index 0c309ac..260e21b 100644 --- a/src/Main.ts +++ b/src/Main.ts @@ -4,31 +4,35 @@ import { onGraud, onLiveEnd, onLiveStart, onSuperChat, onTotalGift, receiveDanma import { printLog } from './utils/mod.ts' import { launchAllPlugins } from './Plugins.ts' -const danmakuReceiver = new DanmakuReceiver(config.room_id) -danmakuReceiver.on('connected', () => { - printLog('主程序', '连接成功') -}) +const roomReceiverMap: Map = new Map() +for(const room of config.room_id) { + const danmakuReceiver = new DanmakuReceiver(room) + danmakuReceiver.on('connected', () => { + printLog('主程序', '连接成功') + }) -if (!config.disable_gift_action) { - danmakuReceiver.on('COMBO_SEND', onTotalGift) - danmakuReceiver.on('SEND_GIFT', receiveGift) -} -if (!config.disable_super_chat_action) { - danmakuReceiver.on('GUARD_BUY', onGraud) -} -if (!config.disable_super_chat_action) { - danmakuReceiver.on('SUPER_CHAT_MESSAGE', onSuperChat) -} -globalThis.onunload = () => { - printLog('主程序', '退出') -} -danmakuReceiver.on('closed', () => { - printLog('主程序', '掉线了') + if (!config.disable_gift_action) { + danmakuReceiver.on('COMBO_SEND', onTotalGift) + danmakuReceiver.on('SEND_GIFT', receiveGift) + } + if (!config.disable_super_chat_action) { + danmakuReceiver.on('GUARD_BUY', onGraud) + } + if (!config.disable_super_chat_action) { + danmakuReceiver.on('SUPER_CHAT_MESSAGE', onSuperChat) + } + globalThis.onunload = () => { + printLog('主程序', '退出') + } + danmakuReceiver.on('closed', () => { + printLog('主程序', '掉线了') + danmakuReceiver.connect() + }) + danmakuReceiver.on('LIVE', onLiveStart) + danmakuReceiver.on('PREPARING', onLiveEnd) + danmakuReceiver.on('DANMU_MSG', receiveDanmaku) danmakuReceiver.connect() -}) -danmakuReceiver.on('LIVE', onLiveStart) -danmakuReceiver.on('PREPARING', onLiveEnd) -danmakuReceiver.on('DANMU_MSG', receiveDanmaku) + roomReceiverMap.set(room, danmakuReceiver) +} launchAllPlugins() -danmakuReceiver.connect() diff --git a/src/SendDanmaku.ts b/src/SendDanmaku.ts index 6a3d6cd..1e227dc 100644 --- a/src/SendDanmaku.ts +++ b/src/SendDanmaku.ts @@ -15,13 +15,13 @@ export interface DanmakuStruct { csrf_token?: string } -export function sendDanmaku(danmaku: DanmakuStruct) { +export function sendDanmaku(roomId: number, danmaku: DanmakuStruct) { if (danmaku.msg.length > 19) { - sendDanmaku({ + sendDanmaku(roomId, { msg: danmaku.msg.slice(0, 15), }) setTimeout(() => { - sendDanmaku({ + sendDanmaku(roomId, { msg: danmaku.msg.slice(15, danmaku.msg.length), }) }, 2000) @@ -40,7 +40,7 @@ export function sendDanmaku(danmaku: DanmakuStruct) { if (!danmaku.fontsize) { danmaku.fontsize = 24 } - danmaku.roomid = config.room_id as number + danmaku.roomid = roomId danmaku.csrf = danmaku.csrf_token = config.verify.csrf const data = new FormData() for (const k in danmaku) {