[Update] WebSocket: Disable server by default and add port availability check

This commit is contained in:
misyaguziya
2025-05-20 11:08:11 +09:00
parent 7289770f9c
commit 60fb58f6d5
3 changed files with 94 additions and 21 deletions

View File

@@ -1172,7 +1172,7 @@ class Config:
self._LOGGER_FEATURE = False self._LOGGER_FEATURE = False
self._VRC_MIC_MUTE_SYNC = False self._VRC_MIC_MUTE_SYNC = False
self._NOTIFICATION_VRC_SFX = True self._NOTIFICATION_VRC_SFX = True
self._WEBSOCKET_SERVER = True self._WEBSOCKET_SERVER = False
self._WEBSOCKET_HOST = "127.0.0.1" self._WEBSOCKET_HOST = "127.0.0.1"
self._WEBSOCKET_PORT = 2231 self._WEBSOCKET_PORT = 2231

View File

@@ -295,10 +295,12 @@ class Controller:
"transliteration":transliteration "transliteration":transliteration
}) })
if config.WEBSOCKET_SERVER is True: if model.checkWebSocketServerAlive() is True:
model.websocketSendMessage( model.websocketSendMessage(
{ {
"type":"SENT", "type":"SENT",
"src_languages":config.SELECTED_YOUR_LANGUAGES[config.SELECTED_TAB_NO],
"dst_languages":config.SELECTED_TARGET_LANGUAGES[config.SELECTED_TAB_NO],
"message":message, "message":message,
"translation":translation, "translation":translation,
"transliteration":transliteration "transliteration":transliteration
@@ -389,10 +391,12 @@ class Controller:
"transliteration":transliteration, "transliteration":transliteration,
}) })
if config.WEBSOCKET_SERVER is True: if model.checkWebSocketServerAlive() is True:
model.websocketSendMessage( model.websocketSendMessage(
{ {
"type":"RECEIVED", "type":"RECEIVED",
"src_languages":config.SELECTED_TARGET_LANGUAGES[config.SELECTED_TAB_NO],
"dst_languages":config.SELECTED_YOUR_LANGUAGES[config.SELECTED_TAB_NO],
"message":message, "message":message,
"translation":translation, "translation":translation,
"transliteration":transliteration "transliteration":transliteration
@@ -456,10 +460,12 @@ class Controller:
overlay_image = model.createOverlayImageLargeLog("send", message, translation[0] if len(translation) > 0 else "") overlay_image = model.createOverlayImageLargeLog("send", message, translation[0] if len(translation) > 0 else "")
model.updateOverlayLargeLog(overlay_image) model.updateOverlayLargeLog(overlay_image)
if config.WEBSOCKET_SERVER is True: if model.checkWebSocketServerAlive() is True:
model.websocketSendMessage( model.websocketSendMessage(
{ {
"type":"CHAT", "type":"CHAT",
"src_languages":config.SELECTED_YOUR_LANGUAGES[config.SELECTED_TAB_NO],
"dst_languages":config.SELECTED_TARGET_LANGUAGES[config.SELECTED_TAB_NO],
"message":message, "message":message,
"translation":translation, "translation":translation,
"transliteration":transliteration "transliteration":transliteration
@@ -1816,11 +1822,31 @@ class Controller:
@staticmethod @staticmethod
def setWebSocketHost(data, *args, **kwargs) -> dict: def setWebSocketHost(data, *args, **kwargs) -> dict:
config.WEBSOCKET_HOST = data if isValidIpAddress(data) is False:
if model.checkWebSocketServer() is True: response = {
"status":400,
"result":{
"message":"Invalid IP address",
"data": config.WEBSOCKET_HOST
}
}
else:
if model.checkWebSocketServerAlive() is True:
model.stopWebSocketServer() model.stopWebSocketServer()
model.startWebSocketServer()
return {"status":200, "result":config.WEBSOCKET_HOST} if model.checkWebSocketServerPortAvailable() is True:
model.startWebSocketServer(data, config.WEBSOCKET_PORT)
config.WEBSOCKET_HOST = data
response = {"status":200, "result":config.WEBSOCKET_HOST}
else:
response = {
"status":400,
"result":{
"message":"WebSocket server port is not available",
"data": config.WEBSOCKET_HOST
}
}
return response
@staticmethod @staticmethod
def getWebSocketPort(*args, **kwargs) -> dict: def getWebSocketPort(*args, **kwargs) -> dict:
@@ -1828,11 +1854,21 @@ class Controller:
@staticmethod @staticmethod
def setWebSocketPort(data, *args, **kwargs) -> dict: def setWebSocketPort(data, *args, **kwargs) -> dict:
config.WEBSOCKET_PORT = int(data) if model.checkWebSocketServerAlive() is True:
if model.checkWebSocketServer() is True:
model.stopWebSocketServer() model.stopWebSocketServer()
model.startWebSocketServer() if model.checkWebSocketServerPortAvailable() is True:
return {"status":200, "result":config.WEBSOCKET_PORT} model.startWebSocketServer(config.WEBSOCKET_HOST, int(data))
config.WEBSOCKET_PORT = int(data)
response = {"status":200, "result":config.WEBSOCKET_PORT}
else:
response = {
"status":400,
"result":{
"message":"WebSocket server port is not available",
"data": config.WEBSOCKET_PORT
}
}
return response
@staticmethod @staticmethod
def getWebSocketServer(*args, **kwargs) -> dict: def getWebSocketServer(*args, **kwargs) -> dict:
@@ -1840,9 +1876,19 @@ class Controller:
@staticmethod @staticmethod
def setEnableWebSocketServer(*args, **kwargs) -> dict: def setEnableWebSocketServer(*args, **kwargs) -> dict:
model.startWebSocketServer() if model.checkWebSocketServerPortAvailable() is True:
model.startWebSocketServer(config.WEBSOCKET_HOST, config.WEBSOCKET_PORT)
config.WEBSOCKET_SERVER = True config.WEBSOCKET_SERVER = True
return {"status":200, "result":config.WEBSOCKET_SERVER} response = {"status":200, "result":config.WEBSOCKET_SERVER}
else:
response = {
"status":400,
"result":{
"message":"WebSocket server port is not available",
"data": config.WEBSOCKET_SERVER
}
}
return response
@staticmethod @staticmethod
def setDisableWebSocketServer(*args, **kwargs) -> dict: def setDisableWebSocketServer(*args, **kwargs) -> dict:
@@ -1951,7 +1997,12 @@ class Controller:
printLog("Init WebSocket Server") printLog("Init WebSocket Server")
if config.WEBSOCKET_SERVER is True: if config.WEBSOCKET_SERVER is True:
model.startWebSocketServer() if model.checkWebSocketServerPortAvailable() is True:
model.startWebSocketServer(config.WEBSOCKET_HOST, config.WEBSOCKET_PORT)
else:
config.WEBSOCKET_SERVER = False
model.stopWebSocketServer()
printLog("WebSocket server port is not available")
printLog("Update settings") printLog("Update settings")
self.updateConfigSettings() self.updateConfigSettings()

View File

@@ -1,6 +1,8 @@
import copy import copy
import gc import gc
import asyncio import asyncio
import socket
import errno
import json import json
from subprocess import Popen from subprocess import Popen
from os import makedirs as os_makedirs from os import makedirs as os_makedirs
@@ -838,16 +840,36 @@ class Model:
"""WebSocketメッセージ受信時の処理""" """WebSocketメッセージ受信時の処理"""
pass pass
def startWebSocketServer(self): def checkWebSocketServerPortAvailable(self):
"""WebSocketサーバーのポートが使用中かどうかを確認する"""
response = True
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as chk:
try:
chk.bind((config.WEBSOCKET_HOST, config.WEBSOCKET_PORT))
chk.shutdown(socket.SHUT_RDWR)
chk.close()
except OSError as e:
if e.errno == errno.EADDRINUSE:
response = False
else:
errorLogging(e)
response = False
return response
def startWebSocketServer(self, host, port):
"""WebSocketサーバーを起動し、別スレッドで実行する""" """WebSocketサーバーを起動し、別スレッドで実行する"""
if self.websocket_server_alive is True:
# サーバーが既に起動している場合は何もしない
return
self.websocket_server_loop = True self.websocket_server_loop = True
self.websocket_server_alive = False # 初期状態を明示 self.websocket_server_alive = False # 初期状態を明示
async def WebSocketServerMain(): async def WebSocketServerMain():
try: try:
self.websocket_server = WebSocketServer( self.websocket_server = WebSocketServer(
host=config.WEBSOCKET_HOST, host=host,
port=config.WEBSOCKET_PORT, port=port,
) )
self.websocket_server.set_message_handler(self.message_handler) self.websocket_server.set_message_handler(self.message_handler)
self.websocket_server.start() self.websocket_server.start()
@@ -893,7 +915,7 @@ class Model:
self.websocket_server = None self.websocket_server = None
self.websocket_server_alive = False self.websocket_server_alive = False
def checkWebSocketServer(self): def checkWebSocketServerAlive(self):
"""WebSocketサーバーの稼働状態を確認する""" """WebSocketサーバーの稼働状態を確認する"""
return self.websocket_server_alive return self.websocket_server_alive