1
0

Compare commits

...

5 Commits

View File

@@ -114,13 +114,13 @@ async def save_image_async(image, filepath, vm_name, vm_data, current_hash):
image.save, filepath, format="WEBP", quality=65, method=6, minimize_size=True image.save, filepath, format="WEBP", quality=65, method=6, minimize_size=True
) )
vm_data["last_frame_hash"] = current_hash vm_data["last_frame_hash"] = current_hash
log.info(f"Saved snapshot of {vm_name} to {filepath}") log.info(f"Saved snapshot of {vm_name} ({datetime.now(timezone.utc).strftime('%H:%M:%S')} UTC)")
except Exception as e: except Exception as e:
log.error(f"Failed to save snapshot for {vm_name}: {e}") log.error(f"Failed to save snapshot for {vm_name}: {e}")
async def connect(vm_obj: dict): async def connect(vm_obj: dict):
log.info(f"Connecting to VM at {vm_obj['ws_url']} with origin {get_origin_from_ws_url(vm_obj['ws_url'])}") log.debug(f"Connecting to VM at {vm_obj['ws_url']} with origin {get_origin_from_ws_url(vm_obj['ws_url'])}")
global vms global vms
global vm_botuser global vm_botuser
fqdn = urlparse(vm_obj["ws_url"]).netloc fqdn = urlparse(vm_obj["ws_url"]).netloc
@@ -136,12 +136,9 @@ async def connect(vm_obj: dict):
} }
ws_url = vm_obj["ws_url"] ws_url = vm_obj["ws_url"]
log_directory = getattr(config, "log_directory", "./logs") log_directory = getattr(config, "log_directory", "./logs")
# Ensure the log directory exists # Create VM-specific log directory
os.makedirs(log_directory, exist_ok=True) vm_log_directory = os.path.join(log_directory, log_label)
log_file_path = os.path.join(log_directory, f"{log_label}.json") os.makedirs(vm_log_directory, exist_ok=True)
if not os.path.exists(log_file_path):
with open(log_file_path, "w") as log_file:
log_file.write("{}")
origin = Origin(vm_obj.get("origin_override", get_origin_from_ws_url(ws_url))) origin = Origin(vm_obj.get("origin_override", get_origin_from_ws_url(ws_url)))
@@ -187,7 +184,7 @@ async def connect(vm_obj: dict):
f"Connected to VM '{log_label}' successfully. Turns enabled: {bool(int(turns_enabled))}, Votes enabled: {bool(int(votes_enabled))}, Uploads enabled: {bool(int(uploads_enabled))}" f"Connected to VM '{log_label}' successfully. Turns enabled: {bool(int(turns_enabled))}, Votes enabled: {bool(int(votes_enabled))}, Uploads enabled: {bool(int(uploads_enabled))}"
) )
else: else:
log.error( log.debug(
f"Failed to connect to VM '{log_label}'. Connection status: {connection_status}" f"Failed to connect to VM '{log_label}'. Connection status: {connection_status}"
) )
STATE = CollabVMState.WS_DISCONNECTED STATE = CollabVMState.WS_DISCONNECTED
@@ -240,37 +237,30 @@ async def connect(vm_obj: dict):
utc_day = utc_now.strftime("%Y-%m-%d") utc_day = utc_now.strftime("%Y-%m-%d")
timestamp = utc_now.isoformat() timestamp = utc_now.isoformat()
with open(log_file_path, "r+") as log_file: # Get daily log file path
try: daily_log_path = os.path.join(vm_log_directory, f"{utc_day}.json")
log_data = json.load(log_file)
except json.JSONDecodeError:
log_data = {}
if utc_day not in log_data: # Load existing log data or create new
log_data[utc_day] = [] if os.path.exists(daily_log_path):
with open(daily_log_path, "r") as log_file:
try:
log_data = json.load(log_file)
except json.JSONDecodeError:
log_data = []
else:
log_data = []
# for i in range(0, len(backlog), 2): log_data.append(
# backlog_user = backlog[i] {
# backlog_message = backlog[i + 1] "type": "chat",
# if not any(entry["message"] == backlog_message and entry["username"] == backlog_user for entry in log_data[utc_day]): "timestamp": timestamp,
# log.info(f"[{vm_name} - {backlog_user} (backlog)]: {backlog_message}") "username": user,
# log_data[utc_day].append({ "message": message,
# "timestamp": timestamp, }
# "username": backlog_user, )
# "message": backlog_message
# })
log_data[utc_day].append( with open(daily_log_path, "w") as log_file:
{
"type": "chat",
"timestamp": timestamp,
"username": user,
"message": message,
}
)
log_file.seek(0)
json.dump(log_data, log_file, indent=4) json.dump(log_data, log_file, indent=4)
log_file.truncate()
if config.commands["enabled"] and message.startswith( if config.commands["enabled"] and message.startswith(
config.commands["prefix"] config.commands["prefix"]
@@ -424,27 +414,30 @@ async def connect(vm_obj: dict):
utc_day = utc_now.strftime("%Y-%m-%d") utc_day = utc_now.strftime("%Y-%m-%d")
timestamp = utc_now.isoformat() timestamp = utc_now.isoformat()
with open(log_file_path, "r+") as log_file: # Get daily log file path
try: daily_log_path = os.path.join(vm_log_directory, f"{utc_day}.json")
log_data = json.load(log_file)
except json.JSONDecodeError:
log_data = {}
if utc_day not in log_data: # Load existing log data or create new
log_data[utc_day] = [] if os.path.exists(daily_log_path):
with open(daily_log_path, "r") as log_file:
try:
log_data = json.load(log_file)
except json.JSONDecodeError:
log_data = []
else:
log_data = []
log_data[utc_day].append( log_data.append(
{ {
"type": "turn", "type": "turn",
"timestamp": timestamp, "timestamp": timestamp,
"active_turn_user": current_turn, "active_turn_user": current_turn,
"queue": queue, "queue": queue,
} }
) )
log_file.seek(0) with open(daily_log_path, "w") as log_file:
json.dump(log_data, log_file, indent=4) json.dump(log_data, log_file, indent=4)
log_file.truncate()
case ["remuser", count, *list]: case ["remuser", count, *list]:
for i in range(int(count)): for i in range(int(count)):
@@ -477,17 +470,17 @@ for vm_dict_label, vm_obj in config.vms.items():
log.error( log.error(
f"Connection to VM '{vm_obj['ws_url']}' closed with error: {e}. Reconnecting..." f"Connection to VM '{vm_obj['ws_url']}' closed with error: {e}. Reconnecting..."
) )
await asyncio.sleep(5) # Wait before attempting to reconnect await asyncio.sleep(0)
except websockets.exceptions.ConnectionClosedOK: except websockets.exceptions.ConnectionClosedOK:
log.warning( log.warning(
f"Connection to VM '{vm_obj['ws_url']}' closed cleanly (code 1005). Reconnecting..." f"Connection to VM '{vm_obj['ws_url']}' closed cleanly (code 1005). Reconnecting..."
) )
await asyncio.sleep(5) # Wait before attempting to reconnect await asyncio.sleep(0)
except websockets.exceptions.InvalidStatus as e: except websockets.exceptions.InvalidStatus as e:
log.error( log.debug(
f"Failed to connect to VM '{vm_obj['ws_url']}' with status code: {e}. Reconnecting..." f"Failed to connect to VM '{vm_obj['ws_url']}' with status code: {e}. Reconnecting..."
) )
await asyncio.sleep(10) # Wait longer for HTTP errors await asyncio.sleep(0)
except websockets.exceptions.WebSocketException as e: except websockets.exceptions.WebSocketException as e:
log.error( log.error(
f"WebSocket error connecting to VM '{vm_obj['ws_url']}': {e}. Reconnecting..." f"WebSocket error connecting to VM '{vm_obj['ws_url']}': {e}. Reconnecting..."
@@ -497,7 +490,7 @@ for vm_dict_label, vm_obj in config.vms.items():
log.error( log.error(
f"Unexpected error connecting to VM '{vm_obj['ws_url']}': {e}. Reconnecting..." f"Unexpected error connecting to VM '{vm_obj['ws_url']}': {e}. Reconnecting..."
) )
await asyncio.sleep(10) # Wait longer for unexpected errors await asyncio.sleep(0)
# Create tasks for VM connections # Create tasks for VM connections
vm_tasks = [connect_with_reconnect(vm) for vm in config.vms.values()] vm_tasks = [connect_with_reconnect(vm) for vm in config.vms.values()]