Hosted rooms: seats, owner-first room IDs, T5 items in their scenes
CI / build (push) Successful in 31s
CI / build (push) Successful in 31s
- The seat chosen on joining, and "*msg SeatAssignment" room seats, go to the hub, so people joining get free seats (both stood on seat 1). - Instance IDs are "<owner>-<2100000000+n>" (the hub's change): the client takes the owner from them, so owners can decorate their rooms. - A hosted room's scene carries community products as the hub's IDs (placements too), turned into local IDs by each proxy, instead of being stripped; saved and loaded scenes translate placements too. Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
1 parent
13ee023836
commit
c483099558
6 files changed
+192
-31
No files matched your search
@@ -51,7 +51,7 @@ func (h *fakeHub) Call(ctx context.Context, method, path string, body, out any)
|
||||
"roomPid": 50168116, "rating": "general", "maxUsers": 10, "occupancy": 2},
|
||||
"scene": {"contents": [[1, 47477426, "37207-46"], [2, "coatcoat22", "37-11"], [3, "notherenn2", "37-12"]], "hash": "h1"}}`), out)
|
||||
case method == "GET" && path == "/api/v1/hosted-rooms":
|
||||
return json.Unmarshal([]byte(`{"rooms": [{"n": 3, "name": "Lounge", "ownerName": "Erin", "maxUsers": 10, "occupancy": 2}]}`), out)
|
||||
return json.Unmarshal([]byte(`{"rooms": [{"n": 3, "name": "Lounge", "ownerImvuId": 88, "ownerName": "Erin", "maxUsers": 10, "occupancy": 2}]}`), out)
|
||||
case method == "PUT" && path == "/api/v1/hosted-rooms/3/scene":
|
||||
h.mu.Lock()
|
||||
h.scene = append(h.scene, body)
|
||||
@@ -132,15 +132,15 @@ func TestHostedRoom(t *testing.T) {
|
||||
}
|
||||
|
||||
// Joining: the hub lets the client in; it sits in the first free seat.
|
||||
resp, _ := xmlrpcCall(t, r, "chat.imvu.com", "chat.getOrMakeChat", xmlrpc.Struct{{Name: "activity", Value: "publicroom-2100000000-3"}})
|
||||
resp, _ := xmlrpcCall(t, r, "chat.imvu.com", "chat.getOrMakeChat", xmlrpc.Struct{{Name: "activity", Value: "publicroom-88-2100000003"}})
|
||||
if get(resp.Params[0], "chatId") != int64(2100000003) || get(resp.Params[0], "seat") != int64(1) || get(resp.Params[0], "lastMessageId") != int64(4) {
|
||||
t.Fatalf("join answer %v", resp.Params[0])
|
||||
}
|
||||
if len(*events) != 1 || (*events)[0] != "join 2100000003 2100000000-3" {
|
||||
if len(*events) != 1 || (*events)[0] != "join 2100000003 88-2100000003" {
|
||||
t.Fatalf("events %v", *events)
|
||||
}
|
||||
// A full room: the client is told why.
|
||||
if resp, _ := xmlrpcCall(t, r, "chat.imvu.com", "chat.getOrMakeChat", xmlrpc.Struct{{Name: "activity", Value: "publicroom-2100000000-9"}}); resp.Fault == nil || resp.Fault.String != "This room is full." {
|
||||
if resp, _ := xmlrpcCall(t, r, "chat.imvu.com", "chat.getOrMakeChat", xmlrpc.Struct{{Name: "activity", Value: "publicroom-88-2100000009"}}); resp.Fault == nil || resp.Fault.String != "This room is full." {
|
||||
t.Fatalf("full room: %+v", resp)
|
||||
}
|
||||
|
||||
@@ -168,10 +168,13 @@ func TestHostedRoom(t *testing.T) {
|
||||
}
|
||||
|
||||
// Chat goes to the hub; sitting down too.
|
||||
if !r.Send("/chat/2100000003", "messages", []byte(`{"message": "*seat 2", "userId": 7}`)) || r.Send("/chat/1385863547", "messages", []byte(`{}`)) {
|
||||
if !r.Send("/chat/2100000003", "messages", []byte(`{"message": "*seat 2", "userId": 7}`), []byte(`{"message": "*seat 2", "userId": 7}`), false) || r.Send("/chat/1385863547", "messages", []byte(`{}`), []byte(`{}`), false) {
|
||||
t.Fatal("Send's answer")
|
||||
}
|
||||
if seats, sends := h.sentOf("room.seat"), h.sentOf("room.send"); len(seats) != 1 || seats[0]["seat"] != 2 || len(sends) != 1 {
|
||||
r.Send("/chat/2100000003", "messages", []byte(`{"message": "*msg SeatAssignment 0 7 3 0", "userId": 7}`), nil, false)
|
||||
r.Send("/chat/2100000003", "messages", []byte(`{"message": "*msg SeatAssignment 0 7 1 5521", "userId": 7}`), nil, false) // on furniture
|
||||
// The seat chosen on joining (1), "*seat 2", and the room seat 3.
|
||||
if seats, sends := h.sentOf("room.seat"), h.sentOf("room.send"); len(seats) != 3 || seats[0]["seat"] != 1 || seats[1]["seat"] != 2 || seats[2]["seat"] != 3 || len(sends) != 3 {
|
||||
t.Fatalf("seats %v, sends %v", seats, sends)
|
||||
}
|
||||
|
||||
@@ -188,17 +191,17 @@ func TestHostedRoom(t *testing.T) {
|
||||
}
|
||||
|
||||
// The room's card and scene come from the hub; the scene's community products as local IDs (missing ones left out).
|
||||
resp, _ = xmlrpcCall(t, r, "client-dynamic.imvu.com", "test.getRoomCardInfo", xmlrpc.Struct{{Name: "room_instance_id", Value: "2100000000-3"}})
|
||||
resp, _ = xmlrpcCall(t, r, "client-dynamic.imvu.com", "test.getRoomCardInfo", xmlrpc.Struct{{Name: "room_instance_id", Value: "88-2100000003"}})
|
||||
if get(resp.Params[0], "name") != "Lounge b" || get(resp.Params[0], "owner_cid") != int64(88) {
|
||||
t.Fatalf("card %v", resp.Params[0])
|
||||
}
|
||||
resp, _ = xmlrpcCall(t, r, "client-dynamic.imvu.com", "test.getRoomState", xmlrpc.Struct{{Name: "room_instance_id", Value: "2100000000-3"}})
|
||||
resp, _ = xmlrpcCall(t, r, "client-dynamic.imvu.com", "test.getRoomState", xmlrpc.Struct{{Name: "room_instance_id", Value: "88-2100000003"}})
|
||||
contents := get(get(resp.Params[0], "room_state"), "room_contents").([]xmlrpc.Value)
|
||||
if len(contents) != 2 || fmt.Sprint(contents[1]) != "[2 2000000005 37-11]" || get(get(get(resp.Params[0], "room_state"), "room_info"), "room_pid") != "50168116" {
|
||||
t.Fatalf("scene %v", resp.Params[0])
|
||||
}
|
||||
// Saving the scene: community products as the hub's IDs.
|
||||
xmlrpcCall(t, r, "client-dynamic.imvu.com", "test.setRoomState", xmlrpc.Struct{{Name: "room_instance_id", Value: "2100000000-3"},
|
||||
xmlrpcCall(t, r, "client-dynamic.imvu.com", "test.setRoomState", xmlrpc.Struct{{Name: "room_instance_id", Value: "88-2100000003"},
|
||||
{Name: "room_contents", Value: []xmlrpc.Value{[]xmlrpc.Value{int64(1), int64(47477426), "37-1"}, []xmlrpc.Value{int64(2), int64(2000000005), "37-2"}}}})
|
||||
if b, _ := json.Marshal(h.scene); string(b) != `[{"contents":[[1,47477426,"37-1"],[2,"coatcoat22","37-2"]]}]` {
|
||||
t.Fatalf("saved %s", b)
|
||||
@@ -214,7 +217,7 @@ func TestHostedRoom(t *testing.T) {
|
||||
}
|
||||
|
||||
// Anything else naming a hosted room is answered here, not sent to IMVU.
|
||||
for _, raw := range []string{"https://api.imvu.com/room/room-2100000000-3", "https://client-dynamic.imvu.com/api/rooms/room_rating.php?room_instance_id=2100000000-3",
|
||||
for _, raw := range []string{"https://api.imvu.com/room/room-88-2100000003", "https://client-dynamic.imvu.com/api/rooms/room_rating.php?room_instance_id=88-2100000003",
|
||||
"https://client-dynamic.imvu.com/api/whatever.php?chat=2100000003"} {
|
||||
u, _ := url.Parse(raw)
|
||||
req, _ := http.NewRequest("GET", u.String(), nil)
|
||||
@@ -245,7 +248,7 @@ func TestRoomList(t *testing.T) {
|
||||
}
|
||||
var l map[string]any
|
||||
json.Unmarshal(out, &l)
|
||||
if fmt.Sprint(l["customers_room_id"]) != "[644 3]" || fmt.Sprint(l["customers_id"]) != "[1 2100000000]" ||
|
||||
if fmt.Sprint(l["customers_room_id"]) != "[644 2100000003]" || fmt.Sprint(l["customers_id"]) != "[1 88]" ||
|
||||
fmt.Sprint(l["num_participants"]) != "[4 2]" || fmt.Sprint(l["odd"]) != "[map[x:1] map[]]" || l["number_of_rooms"] != float64(1) {
|
||||
t.Fatalf("list %s", out)
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user