|
|
import Client from "./Client.js"; |
|
|
import { Config, Version } from './index.js' |
|
|
import { sleep } from '../model/index.js' |
|
|
import { redAdapter } from '../model/red/index.js' |
|
|
|
|
|
|
|
|
let sendSocketList = [] |
|
|
let allSocketList = [] |
|
|
|
|
|
async function createWebSocket(data) { |
|
|
if (typeof data.close != 'undefined' && typeof data.closed == 'undefined') { |
|
|
data.closed = data.close |
|
|
delete data.close |
|
|
} |
|
|
const client = new Client(data) |
|
|
setAllSocketList(client) |
|
|
if (data.address == 'ws_address') return |
|
|
if (data.closed) return |
|
|
sendSocketList = sendSocketList.filter(i => i.name != data.name) |
|
|
switch (Number(data.type)) { |
|
|
case 1: |
|
|
if (!await checkVersion(data)) return |
|
|
client.createWs() |
|
|
sendSocketList.push(client) |
|
|
break; |
|
|
case 2: |
|
|
if (!await checkVersion(data)) return |
|
|
client.createServer() |
|
|
sendSocketList.push(client) |
|
|
break |
|
|
case 3: |
|
|
client.createGSUidWs() |
|
|
sendSocketList.push(client) |
|
|
break |
|
|
case 4: |
|
|
if (Version.isTrss) return |
|
|
|
|
|
redAdapter.connect(client) |
|
|
break |
|
|
case 5: |
|
|
if (!await checkVersion(data)) return |
|
|
client.createHttp() |
|
|
break |
|
|
case 6: |
|
|
if (!await checkVersion(data)) return |
|
|
client.createHttpPost() |
|
|
sendSocketList.push(client) |
|
|
break |
|
|
default: |
|
|
return; |
|
|
} |
|
|
} |
|
|
|
|
|
function setAllSocketList(data) { |
|
|
allSocketList = allSocketList.filter(i => i.name != data.name) |
|
|
allSocketList.push(data) |
|
|
} |
|
|
|
|
|
async function checkVersion(data) { |
|
|
if (Version.isTrss) { |
|
|
if (!data.uin) { |
|
|
logger.warn(`[ws-plugin] ${data.name} 缺少配置项uin 请删除连接后重新#ws添加连接`) |
|
|
return false |
|
|
} else { |
|
|
let log = false |
|
|
for (let i = 0; i < 20; i++) { |
|
|
if (Version.protocol.some(i => i == Bot[data.uin]?.version?.name)) { |
|
|
return true |
|
|
} |
|
|
if (!log) { |
|
|
logger.warn(`[ws-plugin] ${data.name} 暂未适配当前协议端或未连接对应协议端,20秒后重新判断`) |
|
|
log = true |
|
|
} |
|
|
await sleep(1000) |
|
|
} |
|
|
logger.warn(`[ws-plugin] ${data.name} 暂未适配当前协议端或未连接对应协议端 ${data.uin}`) |
|
|
return false |
|
|
} |
|
|
} |
|
|
return true |
|
|
} |
|
|
|
|
|
function modifyWebSocket(target) { |
|
|
|
|
|
switch (target.type) { |
|
|
case 'add': |
|
|
case 'open': |
|
|
if (target.data.type == 4) { |
|
|
const client = new Client(target.data) |
|
|
setAllSocketList(client) |
|
|
redAdapter.connect(client) |
|
|
} else { |
|
|
createWebSocket(target.data) |
|
|
} |
|
|
break; |
|
|
case 'del': |
|
|
case 'close': |
|
|
for (const i of allSocketList) { |
|
|
if (i.name == target.data.name) { |
|
|
i.close() |
|
|
break |
|
|
} |
|
|
} |
|
|
break |
|
|
default: |
|
|
return; |
|
|
} |
|
|
} |
|
|
|
|
|
function clearWebSocket() { |
|
|
for (const i of allSocketList) { |
|
|
i.close() |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
function initWebSocket() { |
|
|
|
|
|
for (const i of Config.servers) { |
|
|
createWebSocket(i) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
export { |
|
|
initWebSocket, |
|
|
clearWebSocket, |
|
|
modifyWebSocket, |
|
|
allSocketList, |
|
|
setAllSocketList, |
|
|
sendSocketList, |
|
|
createWebSocket |
|
|
} |
|
|
|
|
|
|