using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Text; using System.Threading.Tasks; string BACKEND_URL = "http://localhost:3000/api/room-data"; HttpClient httpClient = new HttpClient(); Log("🚀 Room Data Collector v2.0 started"); async Task SendRoomUpdate() { try { var data = new { roomId = RoomId, roomName = Room?.Name ?? "Unknown", timestamp = DateTime.UtcNow.ToString("o"), furniture = new List(), users = new List() }; if (FloorItems != null) { foreach (var item in FloorItems) { try { if (item?.Location == null) continue; string itemName = "Unknown"; try { itemName = item.GetName() ?? $"Item_{item.Kind}"; } catch { itemName = $"Furni_{item.Kind}"; } data.furniture.Add(new { id = item.Id, className = item.Kind, name = itemName, x = item.Location.X, y = item.Location.Y, z = item.Location.Z, direction = item.Direction, state = item.State, owner = item.OwnerName ?? "Unknown" }); } catch (Exception ex) { Log($"❌ Error processing floor item {item?.Id}: {ex.Message}"); } } } if (WallItems != null) { foreach (var item in WallItems) { try { if (item?.Location == null) continue; string itemName = "Unknown"; try { itemName = item.GetName() ?? $"WallItem_{item.Kind}"; } catch { itemName = $"Wall_{item.Kind}"; } data.furniture.Add(new { id = item.Id, className = item.Kind + 10000, name = itemName, x = item.Location.WX, y = item.Location.WY, z = 0.0, direction = 0, state = item.State, owner = item.OwnerName ?? "Unknown", isWallItem = true }); } catch (Exception ex) { Log($"❌ Error processing wall item {item?.Id}: {ex.Message}"); } } } if (Users != null) { foreach (var user in Users) { try { if (user?.Location == null) continue; data.users.Add(new { id = user.Id, name = user.Name ?? "Unknown", x = user.Location.X, y = user.Location.Y, z = user.Location.Z, figure = user.Figure ?? "hr-100-61.hd-180-1.ch-210-66", direction = user.Direction, motto = user.Motto ?? "", gender = user.Gender.ToString() }); } catch (Exception ex) { Log($"❌ Error processing user {user?.Name}: {ex.Message}"); } } } var json = System.Text.Json.JsonSerializer.Serialize(data); var content = new StringContent(json, Encoding.UTF8, "application/json"); var response = await httpClient.PostAsync(BACKEND_URL, content); if (response.IsSuccessStatusCode) { Log($"✅ Sent: {data.furniture.Count} furniture, {data.users.Count} users to browser"); } else { Log($"❌ Failed: {response.StatusCode}"); } } catch (Exception ex) { Log($"❌ Error: {ex.Message}"); } } OnEnteredRoom(async e => { Log($"🏠 Entered room: {Room?.Name} (ID: {RoomId})"); await Task.Delay(2000); await SendRoomUpdate(); }); OnIntercept(In["ObjectAdd"], async e => { Log("🪑 Furniture added"); await Task.Delay(500); await SendRoomUpdate(); }); OnIntercept(In["ObjectRemove"], async e => { Log("🗑️ Furniture removed"); await SendRoomUpdate(); }); OnIntercept(In["ObjectUpdate"], async e => { Log("🔄 Furniture updated"); await SendRoomUpdate(); }); OnIntercept(In["Users"], async e => { Log("👥 Users list updated"); await Task.Delay(500); await SendRoomUpdate(); }); OnIntercept(In["UserRemove"], async e => { Log("👋 User left"); await SendRoomUpdate(); }); OnIntercept(In["UserUpdate"], async e => { await SendRoomUpdate(); }); while (Run) { try { if (IsInRoom) { await SendRoomUpdate(); } await Task.Delay(15000); } catch (Exception ex) { Log($"❌ Main loop error: {ex.Message}"); await Task.Delay(5000); } } httpClient.Dispose(); Log("🛑 Room Data Collector stopped");