153 lines
5.4 KiB
Batchfile
153 lines
5.4 KiB
Batchfile
# plugin_prelaunch.py - With connection check
|
||
from switchboard.devices.device_base import Device, DeviceStatus
|
||
from switchboard.devices.device_widget_base import DeviceWidget
|
||
from switchboard.switchboard_logging import LOGGER
|
||
from switchboard.config import IntSetting, StringSetting
|
||
|
||
from PySide6 import QtCore
|
||
|
||
|
||
class DevicePreLaunch(Device):
|
||
"""PreLaunch device - executes batch file on connect"""
|
||
|
||
csettings = {
|
||
'batch_file': StringSetting(
|
||
attr_name="batch_file",
|
||
nice_name="Batch File Path",
|
||
value="D:\\Projects\\DEV_TheStudio_Plugin\\Source\\git_management.bat",
|
||
tool_tip="Full path to the batch file on the remote machine",
|
||
category="PreLaunch Settings",
|
||
),
|
||
'port': IntSetting(
|
||
attr_name="port",
|
||
nice_name="Listener Port",
|
||
value=2980,
|
||
tool_tip="Port of SwitchboardListener",
|
||
category="Network Settings",
|
||
),
|
||
}
|
||
|
||
def __init__(self, name, address, **kwargs):
|
||
super().__init__(name, address, **kwargs)
|
||
LOGGER.info(f"PreLaunch device '{name}' created")
|
||
|
||
def device_settings(self):
|
||
return super().device_settings()
|
||
|
||
def connect(self):
|
||
"""Called when connect button clicked"""
|
||
LOGGER.info(f">>> {self.name}: connect() called!")
|
||
|
||
# First, check if listener is reachable
|
||
LOGGER.info(f">>> {self.name}: Checking listener connection...")
|
||
|
||
# Try a simple connectivity test
|
||
try:
|
||
# Send a simple test message
|
||
test_message = {'command': 'state'}
|
||
success, response = self.unreal_client.send_message(test_message)
|
||
|
||
if not success:
|
||
LOGGER.error(f">>> {self.name}: Cannot connect to listener!")
|
||
self.device_qt_handler.signal_device_connect_failed.emit(self)
|
||
return
|
||
|
||
LOGGER.info(f">>> {self.name}: Listener responded: {response}")
|
||
|
||
except Exception as e:
|
||
LOGGER.error(f">>> {self.name}: Connection test failed: {e}")
|
||
self.device_qt_handler.signal_device_connect_failed.emit(self)
|
||
return
|
||
|
||
# Set status to READY
|
||
self.status = DeviceStatus.READY
|
||
LOGGER.info(f">>> {self.name}: Status set to READY, executing batch file...")
|
||
|
||
# Execute batch file
|
||
self.execute_batch_file()
|
||
|
||
def disconnect(self):
|
||
"""Called when disconnect button clicked"""
|
||
LOGGER.info(f">>> {self.name}: disconnect() called!")
|
||
self.status = DeviceStatus.DISCONNECTED
|
||
|
||
def execute_batch_file(self):
|
||
"""Execute the batch file"""
|
||
batch_file = self.batch_file.get_value()
|
||
|
||
if not batch_file:
|
||
LOGGER.warning(f" {self.name}: No batch file configured")
|
||
return False
|
||
|
||
LOGGER.info(f">>> {self.name}: ========== EXECUTING ==========")
|
||
LOGGER.info(f">>> {self.name}: File: {batch_file}")
|
||
LOGGER.info(f">>> {self.name}: Address: {self.address}")
|
||
LOGGER.info(f">>> {self.name}: Port: {self.port.get_value()}")
|
||
|
||
try:
|
||
message = {
|
||
'command': 'start',
|
||
'bTryKill': False,
|
||
'bUpdateWorkingDir': False,
|
||
'caller': self.name,
|
||
'name': 'cmd.exe',
|
||
'args': f'/c "{batch_file}"',
|
||
'working_dir': '',
|
||
}
|
||
|
||
LOGGER.info(f">>> {self.name}: Sending message...")
|
||
success, msg = self.unreal_client.send_message(message)
|
||
|
||
if success:
|
||
LOGGER.info(f">>> {self.name}: SUCCESS!")
|
||
LOGGER.info(f">>> Response: {msg}")
|
||
return True
|
||
else:
|
||
LOGGER.error(f">>> L {self.name}: Send failed!")
|
||
return False
|
||
|
||
except Exception as e:
|
||
LOGGER.error(f">>> L {self.name}: ERROR: {e}")
|
||
import traceback
|
||
LOGGER.error(traceback.format_exc())
|
||
return False
|
||
|
||
|
||
class DeviceWidgetPreLaunch(DeviceWidget):
|
||
"""Widget for PreLaunch device"""
|
||
|
||
def __init__(self, name, device_hash, address, icons, parent=None):
|
||
super().__init__(name, device_hash, address, icons, parent=parent)
|
||
LOGGER.info(f"PreLaunch widget created for {name}")
|
||
|
||
def _add_control_buttons(self):
|
||
"""Add connect button"""
|
||
super()._add_control_buttons()
|
||
|
||
CONTROL_BUTTON_ICON_SIZE = QtCore.QSize(21, 21)
|
||
|
||
self.connect_button = self.add_control_button(
|
||
icon_size=CONTROL_BUTTON_ICON_SIZE,
|
||
checkable=True,
|
||
tool_tip='Connect and execute batch file',
|
||
hover_focus=False,
|
||
name='connect')
|
||
|
||
self.connect_button.clicked.connect(self.connect_button_clicked)
|
||
|
||
def connect_button_clicked(self):
|
||
"""Handle connect button click"""
|
||
if self.connect_button.isChecked():
|
||
self._connect()
|
||
else:
|
||
self._disconnect()
|
||
|
||
def _connect(self):
|
||
"""Connect"""
|
||
self.connect_button.setChecked(True)
|
||
self.signal_device_widget_connect.emit(self)
|
||
|
||
def _disconnect(self):
|
||
"""Disconnect"""
|
||
self.connect_button.setChecked(False)
|
||
self.signal_device_widget_disconnect.emit(self) |