udp tcp 逻辑优化
This commit is contained in:
parent
7e05ec862e
commit
64bd47670f
@ -5,6 +5,9 @@ import FileUtil from '../../common/utils/File'
|
|||||||
import { GlobalConfig } from '../../config/index'
|
import { GlobalConfig } from '../../config/index'
|
||||||
|
|
||||||
export async function getTCP(flag = false) {
|
export async function getTCP(flag = false) {
|
||||||
|
if (globalThis.TcpClient && globalThis.TcpClient.closeTcp && !flag) {
|
||||||
|
return
|
||||||
|
}
|
||||||
globalThis.getCloseTcp = true
|
globalThis.getCloseTcp = true
|
||||||
const fileUtil = new FileUtil(globalThis.context)
|
const fileUtil = new FileUtil(globalThis.context)
|
||||||
const data = await fileUtil.readFile(GlobalConfig.comoonfileWriteAddress + '/config/ipConfig.txt');
|
const data = await fileUtil.readFile(GlobalConfig.comoonfileWriteAddress + '/config/ipConfig.txt');
|
||||||
@ -14,74 +17,34 @@ export async function getTCP(flag = false) {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
const result = JSON.parse(data)
|
const result = JSON.parse(data)
|
||||||
if (globalThis.TcpClient && globalThis.TcpClient.closeTcp && !flag) {
|
console.log("tcp init", result.tcplocalIp, result.tcplocalIpPort, result.tcpOppositeIp, result.tcpOppositePort)
|
||||||
globalThis.TcpClient.closeTcp(async () => {
|
const tcpClient: TcpClient = new TcpClient(result.tcplocalIp, result.tcplocalIpPort, result.tcpOppositeIp, result.tcpOppositePort)
|
||||||
console.log("tcp init", result.tcplocalIp, result.tcplocalIpPort, result.tcpOppositeIp, result.tcpOppositePort)
|
globalThis.TcpClient = tcpClient
|
||||||
setTimeout(async () => {
|
await globalThis.TcpClient.bindTcp()
|
||||||
const tcpClient: TcpClient = new TcpClient(result.tcplocalIp, result.tcplocalIpPort, result.tcpOppositeIp, result.tcpOppositePort)
|
await globalThis.TcpClient.connectTcp()
|
||||||
globalThis.TcpClient = tcpClient
|
await globalThis.TcpClient.sendMsg(globalThis.carInfo.carNo) //1002
|
||||||
await globalThis.TcpClient.bindTcp()
|
|
||||||
await globalThis.TcpClient.connectTcp()
|
|
||||||
|
|
||||||
clearInterval(globalThis.intervalSendmsg)
|
clearInterval(globalThis.intervalSendmsg)
|
||||||
globalThis.intervalSendmsg = setInterval(() => {
|
globalThis.intervalSendmsg = setInterval(() => {
|
||||||
console.log('getCloseTcp', globalThis.getCloseTcp)
|
if (!globalThis.getCloseTcp) {
|
||||||
if (!globalThis.getCloseTcp) {
|
globalThis.TcpClient.sendMsg(globalThis.carInfo.carNo) //1002
|
||||||
globalThis.TcpClient.sendMsg(globalThis.carInfo.carNo) //1002
|
}
|
||||||
}
|
}, 1000 / 3)
|
||||||
}, 1000 / 3)
|
globalThis.TcpClient.onError((val) => {
|
||||||
globalThis.TcpClient.onError((val) => {
|
setTimeout(() => {
|
||||||
setTimeout(() => {
|
getTCP()
|
||||||
getTCP()
|
}, 1000)
|
||||||
}, 1000)
|
})
|
||||||
})
|
await globalThis.TcpClient.onMessage((val) => {
|
||||||
await globalThis.TcpClient.onMessage((val) => {
|
setTimeout(() => {
|
||||||
setTimeout(() => {
|
if (val && globalThis.udpClient?.sendMsg) {
|
||||||
if (val) {
|
globalThis.udpClient?.sendMsg(val)
|
||||||
console.log('socketTag[PLC.UdpClient] status:', globalThis.udpClient.getStatus())
|
globalThis.udpClientGps2?.sendMsg(val)
|
||||||
globalThis.udpClient?.sendMsg(val)
|
|
||||||
globalThis.udpClientGps2?.sendMsg(val)
|
|
||||||
}
|
|
||||||
}, 1000)
|
|
||||||
|
|
||||||
})
|
|
||||||
}, 2000)
|
|
||||||
})
|
|
||||||
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
console.log("tcp init", result.tcplocalIp, result.tcplocalIpPort, result.tcpOppositeIp, result.tcpOppositePort)
|
|
||||||
const tcpClient: TcpClient = new TcpClient(result.tcplocalIp, result.tcplocalIpPort, result.tcpOppositeIp, result.tcpOppositePort)
|
|
||||||
globalThis.TcpClient = tcpClient
|
|
||||||
await globalThis.TcpClient.bindTcp()
|
|
||||||
await globalThis.TcpClient.connectTcp()
|
|
||||||
await globalThis.TcpClient.sendMsg(globalThis.carInfo.carNo) //1002
|
|
||||||
|
|
||||||
clearInterval(globalThis.intervalSendmsg)
|
|
||||||
globalThis.intervalSendmsg = setInterval(() => {
|
|
||||||
// console.log('getCloseTcp',globalThis.getCloseTcp)
|
|
||||||
if (!globalThis.getCloseTcp) {
|
|
||||||
globalThis.TcpClient.sendMsg(globalThis.carInfo.carNo) //1002
|
|
||||||
}
|
}
|
||||||
}, 1000 / 3)
|
}, 1000)
|
||||||
globalThis.TcpClient.onError((val) => {
|
|
||||||
setTimeout(() => {
|
|
||||||
getTCP()
|
|
||||||
}, 1000)
|
|
||||||
})
|
|
||||||
await globalThis.TcpClient.onMessage((val) => {
|
|
||||||
setTimeout(() => {
|
|
||||||
if (val && globalThis.udpClient?.sendMsg) {
|
|
||||||
globalThis.udpClient?.sendMsg(val)
|
|
||||||
globalThis.udpClientGps2?.sendMsg(val)
|
|
||||||
}
|
|
||||||
}, 1000)
|
|
||||||
|
|
||||||
})
|
})
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// globalThis.udpClient.bindUdp()
|
|
||||||
|
|||||||
@ -9,9 +9,12 @@ export async function sendMsg(val) {
|
|||||||
|
|
||||||
export async function getUDP(context, errorFlag?) {
|
export async function getUDP(context, errorFlag?) {
|
||||||
return new Promise(async (resolve, reject) => {
|
return new Promise(async (resolve, reject) => {
|
||||||
|
if (globalThis.udpClient && globalThis.udpClient.closeUdp && !errorFlag) {
|
||||||
|
resolve(true)
|
||||||
|
return
|
||||||
|
}
|
||||||
const fileUtil = new FileUtil(context)
|
const fileUtil = new FileUtil(context)
|
||||||
const data = await fileUtil.readFile(GlobalConfig.comoonfileWriteAddress + '/config/ipConfig.txt');
|
const data = await fileUtil.readFile(GlobalConfig.comoonfileWriteAddress + '/config/ipConfig.txt');
|
||||||
console.log('ttttt', data)
|
|
||||||
if (data === '' || data === undefined) {
|
if (data === '' || data === undefined) {
|
||||||
console.log(` getUDP has no IPConfigTable `);
|
console.log(` getUDP has no IPConfigTable `);
|
||||||
globalThis.udpClient = {}
|
globalThis.udpClient = {}
|
||||||
@ -19,56 +22,34 @@ export async function getUDP(context, errorFlag?) {
|
|||||||
resolve('')
|
resolve('')
|
||||||
} else {
|
} else {
|
||||||
const result = JSON.parse(data)
|
const result = JSON.parse(data)
|
||||||
console.log(` getUDP has IPConfigTable `);
|
// 未绑定
|
||||||
if (globalThis.udpClient && globalThis.udpClient.closeUdp) {
|
console.log(` getUDP has no udp clent and bind `);
|
||||||
console.log(` getUDP has udclent close and rebind `);
|
const udpClient: UdpClientByCenter = new UdpClientByCenter(result.udplocalIp, result.udplocalIpPort, result.udpOppositeIp, result.udpOppositeIpPort)
|
||||||
globalThis.udpClient.closeUdp(() => {
|
udpClient.bindUdp()
|
||||||
setTimeout(() => {
|
udpClient.sendMsg('111')
|
||||||
globalThis.udpClient.rebindUdp(result.udplocalIp, result.udplocalIpPort, result.udpOppositeIp, result.udpOppositeIpPort)
|
globalThis.host = `http://${result.centerIp}:${result.centerPort}`
|
||||||
globalThis.udpClient.sendMsg('111', null)
|
globalThis.udpClient = udpClient
|
||||||
globalThis.host = `http://${result.centerIp}:${result.centerPort}`
|
globalThis.udpClient.onMessage_1(() => {
|
||||||
globalThis.udpClient.onError_Callback(() => {
|
console.log('getUDPonMessage_1msgmsgByGloalUdp')
|
||||||
console.log('getUDPgetUDPgetUDP')
|
})
|
||||||
getUDP(context, true)
|
globalThis.udpClient.onError_Callback(() => {
|
||||||
if (errorFlag && globalThis.udpClient && globalThis.udpClient.onMessage_1) {
|
getUDP(context, true)
|
||||||
globalThis.udpClient.onMessage_1 = globalThis.udpClient.onMessage_1
|
if (errorFlag && globalThis.udpClient && globalThis.udpClient.onMessage_1) {
|
||||||
}
|
globalThis.udpClient.onMessage_1 = globalThis.udpClient.onMessage_1
|
||||||
})
|
}
|
||||||
resolve(`http://${result.centerIp}:${result.centerPort}`)
|
})
|
||||||
|
getChuankouFn()
|
||||||
}, 1000)
|
resolve(`http://${result.centerIp}:${result.centerPort}`)
|
||||||
})
|
|
||||||
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// 未绑定
|
|
||||||
console.log(` getUDP has no udclent and bind `);
|
|
||||||
console.log('ttttttdata', JSON.stringify(result))
|
|
||||||
const udpClient: UdpClientByCenter = new UdpClientByCenter(result.udplocalIp, result.udplocalIpPort, result.udpOppositeIp, result.udpOppositeIpPort)
|
|
||||||
udpClient.bindUdp()
|
|
||||||
udpClient.sendMsg('111')
|
|
||||||
globalThis.host = `http://${result.centerIp}:${result.centerPort}`
|
|
||||||
globalThis.udpClient = udpClient
|
|
||||||
|
|
||||||
globalThis.udpClient.onMessage_1(() => {
|
|
||||||
console.log('getUDPonMessage_1msgmsgByGloalUdp')
|
|
||||||
})
|
|
||||||
globalThis.udpClient.onError_Callback(() => {
|
|
||||||
getUDP(context, true)
|
|
||||||
if (errorFlag && globalThis.udpClient && globalThis.udpClient.onMessage_1) {
|
|
||||||
globalThis.udpClient.onMessage_1 = globalThis.udpClient.onMessage_1
|
|
||||||
}
|
|
||||||
})
|
|
||||||
getChuankouFn()
|
|
||||||
resolve(`http://${result.centerIp}:${result.centerPort}`)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function getUDPGps2(context, errorFlag?) {
|
export async function getUDPGps2(context, errorFlag?) {
|
||||||
return new Promise(async (resolve, reject) => {
|
return new Promise(async (resolve, reject) => {
|
||||||
|
if (globalThis.udpClientGps2 && globalThis.udpClientGps2.closeUdp && !errorFlag) {
|
||||||
|
resolve(true)
|
||||||
|
return
|
||||||
|
}
|
||||||
const fileUtil = new FileUtil(context)
|
const fileUtil = new FileUtil(context)
|
||||||
const data = await fileUtil.readFile(GlobalConfig.comoonfileWriteAddress + '/config/ipConfig.txt');
|
const data = await fileUtil.readFile(GlobalConfig.comoonfileWriteAddress + '/config/ipConfig.txt');
|
||||||
console.log('ttttt', data)
|
console.log('ttttt', data)
|
||||||
@ -77,49 +58,31 @@ export async function getUDPGps2(context, errorFlag?) {
|
|||||||
resolve('')
|
resolve('')
|
||||||
} else {
|
} else {
|
||||||
const result = JSON.parse(data)
|
const result = JSON.parse(data)
|
||||||
if (globalThis.udpClientGps2 && globalThis.udpClientGps2.closeUdp) {
|
// 未绑定
|
||||||
console.log(` getUDPGPS2 has udclent close and rebind `);
|
console.log(` getUDPGPS2 has no udclent and bind `);
|
||||||
globalThis.udpClientGps2.closeUdp(() => {
|
const udpClient: UdpClientByCenter = new UdpClientByCenter(result.udplocalIp, (Number(result.udplocalIpPort) + 1).toString(), result.udpOppositeIp2, (Number(result.udpOppositeIpPort) + 1).toString())
|
||||||
setTimeout(() => {
|
udpClient.bindUdp()
|
||||||
globalThis.udpClientGps2.rebindUdp(result.udplocalIp, Number(result.udplocalIpPort) + 1, result.udpOppositeIp2, Number(result.udpOppositeIpPort) + 1)
|
udpClient.sendMsg('111')
|
||||||
globalThis.udpClientGps2.sendMsg('111', null)
|
globalThis.udpClientGps2 = udpClient
|
||||||
globalThis.udpClientGps2.onError_Callback(() => {
|
|
||||||
console.log('getUDPGPS')
|
|
||||||
getUDP(context, true)
|
|
||||||
if (errorFlag && globalThis.udpClientGps2 && globalThis.udpClientGps2.onMessage_1) {
|
|
||||||
globalThis.udpClientGps2.onMessage_1 = globalThis.udpClientGps2.onMessage_1
|
|
||||||
}
|
|
||||||
})
|
|
||||||
resolve(`http://${result.centerIp}:${result.centerPort}`)
|
|
||||||
}, 1000)
|
|
||||||
})
|
|
||||||
|
|
||||||
}
|
globalThis.udpClientGps2.onMessage_1(() => {
|
||||||
else {
|
console.log('getUDPGPS2 onMessage_1 MsgByGlobalUdpGPS2')
|
||||||
// 未绑定
|
})
|
||||||
console.log(` getUDPGPS2 has no udclent and bind `);
|
globalThis.udpClientGps2.onError_Callback(() => {
|
||||||
const udpClient: UdpClientByCenter = new UdpClientByCenter(result.udplocalIp, (Number(result.udplocalIpPort) + 1).toString(), result.udpOppositeIp2, (Number(result.udpOppositeIpPort) + 1).toString())
|
getUDPGps2(context, true)
|
||||||
udpClient.bindUdp()
|
if (errorFlag && globalThis.udpClientGps2 && globalThis.udpClientGps2.onMessage_1) {
|
||||||
udpClient.sendMsg('111')
|
globalThis.udpClientGps2.onMessage_1 = globalThis.udpClientGps2.onMessage_1
|
||||||
globalThis.udpClientGps2 = udpClient
|
}
|
||||||
|
})
|
||||||
globalThis.udpClientGps2.onMessage_1(() => {
|
resolve(`http://${result.centerIp}:${result.centerPort}`)
|
||||||
console.log('getUDPGPS2 onMessage_1 MsgByGlobalUdpGPS2')
|
|
||||||
})
|
|
||||||
globalThis.udpClientGps2.onError_Callback(() => {
|
|
||||||
getUDPGps2(context, true)
|
|
||||||
if (errorFlag && globalThis.udpClientGps2 && globalThis.udpClientGps2.onMessage_1) {
|
|
||||||
globalThis.udpClientGps2.onMessage_1 = globalThis.udpClientGps2.onMessage_1
|
|
||||||
}
|
|
||||||
})
|
|
||||||
resolve(`http://${result.centerIp}:${result.centerPort}`)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function getUDP2(context, errorFlag?) {
|
export async function getUDP2(context, errorFlag?) {
|
||||||
|
if (globalThis.udpClient2 && globalThis.udpClient2.closeUdp && !errorFlag) {
|
||||||
|
return
|
||||||
|
}
|
||||||
const fileUtil = new FileUtil(context)
|
const fileUtil = new FileUtil(context)
|
||||||
const data = await fileUtil.readFile(GlobalConfig.comoonfileWriteAddress + '/config/ipConfig.txt');
|
const data = await fileUtil.readFile(GlobalConfig.comoonfileWriteAddress + '/config/ipConfig.txt');
|
||||||
if (data === '' || data === undefined) {
|
if (data === '' || data === undefined) {
|
||||||
@ -129,74 +92,56 @@ export async function getUDP2(context, errorFlag?) {
|
|||||||
} else {
|
} else {
|
||||||
const result = JSON.parse(data)
|
const result = JSON.parse(data)
|
||||||
console.log(` getUDP2 has IPConfigTable `);
|
console.log(` getUDP2 has IPConfigTable `);
|
||||||
if (globalThis.udpClient2 && globalThis.udpClient2.closeUdp) {
|
// 未绑定
|
||||||
console.log(` getUDP2 has udclent ,close and rebind `);
|
console.log(` getUDP2 has no udclent and bind `);
|
||||||
globalThis.udpClient2.closeUdp(async () => {
|
const udpClient2: UdpClientByCenter = new UdpClientByCenter(result.udplocalIp, '8800', globalThis.carInfo?.udpAddress, globalThis.carInfo?.messagePort)
|
||||||
setTimeout(() => {
|
console.info('surenjun udp2=> ', globalThis.carInfo?.messagePort)
|
||||||
globalThis.udpClient2.rebindUdp(result.udplocalIp, '8800', globalThis.carInfo?.udpAddress, globalThis.carInfo?.messagePort)
|
udpClient2.bindUdp()
|
||||||
globalThis.udpClient2.onError_Callback(() => {
|
udpClient2.onError_Callback(() => {
|
||||||
getUDP2(context, true);
|
getUDP2(context, true);
|
||||||
if (errorFlag && globalThis.udpClient2 && globalThis.udpClient2.onMessage_2) {
|
if (errorFlag && globalThis.udpClient2 && globalThis.udpClient2.onMessage_2) {
|
||||||
globalThis.udpClient2.onMessage_2 = globalThis.udpClient2.onMessage_2
|
globalThis.udpClient2.onMessage_2 = globalThis.udpClient2.onMessage_2
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}, 1000)
|
if (!errorFlag) {
|
||||||
})
|
udpClient2.onMessage_2((val) => {
|
||||||
}
|
if (val.id == '32') {
|
||||||
else {
|
globalThis.signNum = val.body[1]
|
||||||
// 未绑定
|
if (val.body[0] == 5) {
|
||||||
console.log(` getUDP2 has no udclent and bind `);
|
console.info('surenjun', `接收到平台扣分请求,请求指令为:${val.body[1]}`)
|
||||||
const udpClient2: UdpClientByCenter = new UdpClientByCenter(result.udplocalIp, '8800', globalThis.carInfo?.udpAddress, globalThis.carInfo?.messagePort)
|
globalThis.udpEvent.sendOnKf(val.body[1])
|
||||||
console.info('surenjun udp2=> ', globalThis.carInfo?.messagePort)
|
}
|
||||||
udpClient2.bindUdp()
|
if (val.body[0] == 11) {
|
||||||
udpClient2.onError_Callback(() => {
|
console.info('surenjun', 'GlobalUdp收到beginExam事件')
|
||||||
getUDP2(context, true);
|
globalThis.udpEvent.sendBeginExam(val.body[1])
|
||||||
if (errorFlag && globalThis.udpClient2 && globalThis.udpClient2.onMessage_2) {
|
}
|
||||||
globalThis.udpClient2.onMessage_2 = globalThis.udpClient2.onMessage_2
|
if (val.body[0] == 12) {
|
||||||
|
console.info('surenjun', 'GlobalUdp收到endExam事件')
|
||||||
|
globalThis.udpEvent.sendEndExam(val.body[1])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (val.id == '36') {
|
||||||
|
//获取远程扣分内容
|
||||||
|
console.info('surenjun', '考车收到远程扣分项目内容,扣分代码:' + val.body[0])
|
||||||
|
globalThis.udpEvent.sendKfContent(val.body[0])
|
||||||
|
} else if (val.id == '46') {
|
||||||
|
let tmpList = []
|
||||||
|
const str = globalThis.lsh
|
||||||
|
for (let i = 0; i < str.length; i++) {
|
||||||
|
tmpList.push(this.string2Bytes(str.charCodeAt(i), 1 * 8)[0])
|
||||||
|
}
|
||||||
|
const param = {
|
||||||
|
id: 47,
|
||||||
|
list: tmpList,
|
||||||
|
carNo: globalThis.carInfo.carNo,
|
||||||
|
placeId: globalThis.carInfo.examinationRoomId
|
||||||
|
}
|
||||||
|
globalThis.udpClient2.send(param)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
if (!errorFlag) {
|
|
||||||
udpClient2.onMessage_2((val) => {
|
|
||||||
if (val.id == '32') {
|
|
||||||
globalThis.signNum = val.body[1]
|
|
||||||
if (val.body[0] == 5) {
|
|
||||||
console.info('surenjun', `接收到平台扣分请求,请求指令为:${val.body[1]}`)
|
|
||||||
globalThis.udpEvent.sendOnKf(val.body[1])
|
|
||||||
}
|
|
||||||
if (val.body[0] == 11) {
|
|
||||||
console.info('surenjun', 'GlobalUdp收到beginExam事件')
|
|
||||||
globalThis.udpEvent.sendBeginExam(val.body[1])
|
|
||||||
}
|
|
||||||
if (val.body[0] == 12) {
|
|
||||||
console.info('surenjun', 'GlobalUdp收到endExam事件')
|
|
||||||
globalThis.udpEvent.sendEndExam(val.body[1])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (val.id == '36') {
|
|
||||||
//获取远程扣分内容
|
|
||||||
console.info('surenjun', '考车收到远程扣分项目内容,扣分代码:' + val.body[0])
|
|
||||||
globalThis.udpEvent.sendKfContent(val.body[0])
|
|
||||||
} else if (val.id == '46') {
|
|
||||||
let tmpList = []
|
|
||||||
const str = globalThis.lsh
|
|
||||||
for (let i = 0; i < str.length; i++) {
|
|
||||||
tmpList.push(this.string2Bytes(str.charCodeAt(i), 1 * 8)[0])
|
|
||||||
}
|
|
||||||
const param = {
|
|
||||||
id: 47,
|
|
||||||
list: tmpList,
|
|
||||||
carNo: globalThis.carInfo.carNo,
|
|
||||||
placeId: globalThis.carInfo.examinationRoomId
|
|
||||||
}
|
|
||||||
globalThis.udpClient2.send(param)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
globalThis.udpClient2 = udpClient2
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
globalThis.udpClient2 = udpClient2
|
||||||
}
|
}
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function setTopLineUdp() {
|
export async function setTopLineUdp() {
|
||||||
@ -227,7 +172,6 @@ export async function setJudgeUdp() {
|
|||||||
// const config = await getSyncData('IpConfigTable');
|
// const config = await getSyncData('IpConfigTable');
|
||||||
let udpIndex = 0;
|
let udpIndex = 0;
|
||||||
let currentUdpIndex = 0;
|
let currentUdpIndex = 0;
|
||||||
let judgeUdpTimer
|
|
||||||
clearInterval(globalThis.judgeUdpTimer)
|
clearInterval(globalThis.judgeUdpTimer)
|
||||||
globalThis.judgeUdpTimer = setInterval(() => {
|
globalThis.judgeUdpTimer = setInterval(() => {
|
||||||
udpIndex += 1;
|
udpIndex += 1;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user