Commit Graph
36 Commits
Author SHA1 Message Date
dhkatzandClaude Opus 5.5 8ae45fc07a Choose the hub: Settings' choice, else the install's channel's; state kept per hub
CI / build (push) Successful in 18s
The client's Settings > T5DE chooses the hub from the next start on (POST /hub/server, kept in server.json);
without a choice, -channel (which the client passes) decides: staging for nightly and dev, T5DE's hub for
releases. $T5DE_HUB still wins. Each hub's sign-in, product IDs and products are kept in their own folder
(T5DE's hub in the data folder as before, others in hubs/<host>), so a hub never gets another's token and
product IDs from two hubs never clash; a sign-in saved for another hub is ignored. Signing in always goes to
this run's hub.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
v0.2.0 nightly
2026-11-02 09:09:34 -08:00
dhkatzandClaude Opus 5.5 8daf91ede3 Manage T5DE rooms from the client; the AP+ badge on avatar cards
CI / build (push) Successful in 28s
Chat Rooms > Manage (the t5de-room-manage patch) lists the person's T5DE rooms
(room_management_info.php?t5de=1) and saves them from IMVU's room dialog (room_management.php: create
with t5de=1, edit and delete naming a hosted room) as hub calls: the room, its moderators by name, and a
picture from the person's IMVU gallery, uploaded to the hub. The hub's refusals show in the dialog
(hub.Error keeps their message).

Avatar cards get show_ap_plus again, which IMVU stopped sending, from the person's public IMVU profile
(is_ap_plus).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 08:19:33 -07:00
dhkatzandClaude Opus 5.5 6aac769246 Full hosted rooms are refused with IMVU's own full-room code
CI / build (push) Successful in 29s
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 07:07:31 -07:00
dhkatzandClaude Opus 5.5 56c47e806f Remove the hosted rooms' old owner mapping
CI / build (push) Successful in 28s
Hosted rooms' instance IDs start with their owner's IMVU account now, so the client asks about their
products as the owner itself, and the mapping from 2100000000 is never used.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 07:05:25 -07:00
dhkatzandClaude Opus 5.5 2df46da3ad Invitations into hosted rooms: the dialog's details, and joining as a public room
CI / build (push) Successful in 34s
The invitation carries the room as the dialog shows it (name, owner, image, occupancy, description)
and the inviter's picture, age and gender from IMVU's public profile. Accepting names the room
(room_instance_id), so the client joins it as a public room with the invite rather than opening a
private chat, and getParticipants before joining asks the hub, so the client sees its inviter there.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 06:44:33 -07:00
dhkatzandClaude Opus 5.5 210bc064e9 Hosted rooms phase 2: boots, invitations, favorites, ratings, live occupancy
CI / build (push) Successful in 36s
The client's own room actions work in hosted rooms, through the hub (t5de-hub's docs/hosted-rooms.md,
Phase 2): a "*boot" line goes to the room, then to the hub as room.boot; refused joins are declined as
the client's own are (booted ones as booted). Invitations: chat.attemptInvite polls the hub's answer,
and the invitee's client gets chatInvite on its user queue, accepting with the invite. Favorites
(favorite_rooms.php, add/removeFavoriteRoom, the favorites list), ratings (room_rating.php), the room
card's moderators, image and score, and room_occupancy queues fed from room.watch.

Web API parameters are read from JSON bodies too (imvu.http.securePost), and hosted rows added to an
empty IMVU list keep their flags numeric ("0" counted as set).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 06:30:42 -07:00
dhkatzandClaude Opus 5.5 fc59367ba6 T5 badge on room cards and the Manage tab; room_info.php for hosted rooms
CI / build (push) Successful in 44s
room_info.php (the room card's participants, asked for every room) is answered for hosted rooms from
the hub (it was refused as naming a hosted room, which the client showed as an error), with max_users;
it and getRoomCardInfo get t5de_t5 for hosted and decorated rooms, as do the person's own rooms in
room_management_info.php.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 06:09:41 -07:00
dhkatzandClaude Opus 5.5 d379d848c1 Mark rooms needing T5DE in the room list (t5de_t5), for the client's T5 badge
CI / build (push) Successful in 30s
Hosted rooms, and IMVU rooms the hub has decorations for (asked 20 at a time), on every page; hosted
rooms are added to recent rooms from the hub's recent list when it has one.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 05:58:12 -07:00
dhkatzandClaude Opus 5.5 08a2ed94a3 Keep the gateway connection alive and resume hosted queues after reconnecting
CI / build (push) Successful in 30s
The client doesn't ping while it's sending, so when the proxy answers its frames itself (everything it
sends in a hosted room), IMVU's gateway saw an idle connection and closed it after about a minute. A
ping now goes to the gateway in place of each answered frame. And after a reconnect, hosted rooms'
queues are taken out of C2gOpenFloodgates and answered here (the gateway never answered them, so the
client gave up and closed the room).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 05:37:53 -07:00
dhkatzandClaude Opus 5.5 c483099558 Hosted rooms: seats, owner-first room IDs, T5 items in their scenes
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]>
2026-10-30 05:26:02 -07:00
dhkatzandClaude Opus 5.5 13ee023836 Decorations: keep them through IMVU's own room updates
CI / build (push) Successful in 33s
After the owner saves, IMVU's server sends everyone the saved room ({"command": "SetRoomState"} from
admin on the chat's control mount), which has no decorations: the proxy now adds them to it, and takes
community products out of any outgoing one. A change notice from the hub also no longer empties the
remembered decorations while the new ones are asked for (a broadcast arriving meanwhile went through
without them).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 05:00:11 -07:00
dhkatzandClaude Opus 5.5 0be2cd8f4e T5 furniture and poses in IMVU rooms (decorations)
CI / build (push) Successful in 44s
Community products are taken out of rooms their owners save and broadcast, kept on the hub per room,
and added back when anyone with T5DE loads the room or gets its owner's broadcast; the hub's decor
notice resends the room with the new ones. Placements are stored with the hub's product ID.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 04:03:21 -07:00
dhkatzandClaude Opus 5.5 d8332b21a8 Serve T5DE-hosted rooms; a second client instance's own data
CI / build (push) Successful in 36s
Hosted rooms (internal/hosted): room calls for them answered here, their IMQ queues served (a new
proxy.IMQRouter hook takes them out of subscriptions to IMVU), chat relayed through the hub's
WebSocket (hub.Client gains Send, OnRoom and OnConnect), the room list extended, room products
checked against the real owner, and anything else naming a hosted room kept from IMVU.

T5DE_INSTANCE gives a second client's proxy its own data folder and log.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 03:36:17 -07:00
dhkatzandClaude Opus 5.5 455dae1013 Answer the client's T5 badge lookups
CI / build (push) Successful in 29s
POST http://t5de-proxy.local/badges {imvuIds} -> {badges}: which IMVU accounts show the T5 badge,
asked of the hub (POST /api/v1/badges, in batches of 200) and remembered for 10 minutes.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 02:52:55 -07:00
dhkatzandClaude Opus 5.5 171e8173af Recently added, shop sorting, and outfit cards with T5 products
CI / build (push) Successful in 34s
- The inventory's Recently Added puts T5 products added to the library in the last 30 days first.
- The shop's T5 listing follows its sort menu: Best Match ranks by name, Newest by upload date
  (oldest first ascending); ratings and prices (T5 products have neither) sort by newest.
- Outfit cards: outfit_products.php gets the outfit's community products added (not for sale),
  find_bundle.php is asked about IMVU's products only, and removing one in the card (remove_pids)
  keeps it from IMVU and forgets it in the outfit.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 02:45:02 -07:00
dhkatzandClaude Opus 5.5 af9158513b Answer IMVU's product REST API for community products
CI / build (push) Successful in 27s
Trying a product on in the shop asks api.imvu.com/product/product-<id>/uml_products for related
products; the guard refused it for T5 products, and the client showed an error. Community products
now get an empty list (and not found for anything else) from the proxy.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 01:26:04 -07:00
dhkatzandClaude Opus 5.5 2280ad6314 Show T5 products in the client's shop; keep float IDs and unknown paths off IMVU
CI / build (push) Successful in 34s
The shop's T5 filter (maturity_rating "t5") is answered from the hub's products, fetched so they can be
shown and tried on; buying T5 products adds them to the hub library, and product.php details for
community products are answered here.

The client sends some product IDs as floats ("2000000008.0"): product.php passed the worn community
product to IMVU that way. Every ID is now read either way, and products.Guard refuses any request to
IMVU that still names a local ID given out. T5DE_PROXY_DUMP logs request and response bodies.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 01:15:16 -07:00
dhkatzandClaude Opus 5.5 6506c641f0 Keep community products out of saved outfits
CI / build (push) Successful in 43s
Saving an outfit (POST /api/outfits.php) sent its community products to IMVU. They're now taken out (any ID in
the community range, known or not), the request re-signed, and the products remembered under the outfit's ID,
then added back when the client loads its saved outfits (marked AP if one is adult).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-29 19:30:59 -07:00
dhkatzandClaude Opus 5.5 400831bf3c Sign in again to the hub last signed in to
CI / build (push) Successful in 30s
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-29 19:25:47 -07:00
dhkatzandClaude Opus 5.5 5eca0b57a6 Sign in and out of the hub from the client: the proxy answers t5de-proxy.local
CI / build (push) Successful in 28s
A manager runs the hub connection, so signing in or out takes effect while the client runs; the client's T5DE
settings page asks it for the status and to sign in (showing the code and opening the hub's page) or out.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-29 19:18:14 -07:00
dhkatzandClaude Opus 5.5 5b4e44c4e7 Refresh the inventory on the user's queue, which the client joins by connecting
CI / build (push) Successful in 25s
The client never subscribes to its user queue; the proxy now follows every IMQ connection and the signed-in
account (from the login answer), and delivers the refresh event on /user/<id>. Checked live: removing a product
from the library on the hub reloads the client's inventory.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-29 19:16:30 -07:00
dhkatzandClaude Opus 5.5 ca7a86ce89 T5 products in the client's inventory
CI / build (push) Successful in 25s
The inventory's product list (test.showInventory) gets the community products the person has: local packs, and
hub products in their library. Hiding one is answered by the proxy (and removes a hub product from the library).
When the library changes, the client is told to load its inventory again, with the server event IMVU sends
after a purchase. A product whose revision or info changes gets a new local ID, since the client keeps product
info for good; names lose characters the client's pages could take as HTML.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-29 18:59:52 -07:00
dhkatzandClaude Opus 5.5 c281fb572c Get T5 products from the hub's catalogs
CI / build (push) Successful in 25s
The proxy keeps the person's library in a cache folder (hub-products in its data folder), one pack per
product, served like any other pack: the hub says which revision to load and which catalogs host it, each file
comes from a catalog and is checked against the hub's sha256 (files are kept by hash, so a new revision only
downloads what changed), and adult files are fetched with the hub's access token. Products someone wears in a
room that aren't here yet are fetched too, and put on them when they arrive.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-29 18:56:26 -07:00
dhkatzandClaude Opus 5.5 93fa2f5d90 Room channel: other T5DE users' community products on their avatars
CI / build (push) Successful in 28s
The proxy follows the client's IMQ chat subscriptions and tells the hub which chats it's in (and the room, from
chat.getOrMakeChat). For the other T5DE users the hub says are in a chat, it gives the client the community
products it has packs for, as *use and *remove lines from them, and adds them to the whole outfits they send.
It also takes community products out of the outfit the client posts to IMVU's chat participant endpoint, which
had been sending them to IMVU.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-29 18:14:44 -07:00
dhkatzandClaude Opus 5.5 e394f1dc24 hub: send an empty outfit as a list
CI / build (push) Successful in 26s
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-29 05:07:30 -07:00
dhkatzandClaude Opus 5.5 bfd25e2b84 Sign in to the hub with its Better Auth device flow; session token as bearer
CI / build (push) Successful in 28s
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-29 04:40:35 -07:00
dhkatzandClaude Opus 5.5 7887eada61 Sign in to T5DE's hub and report presence and community outfits
CI / build (push) Successful in 1m6s
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-29 03:45:55 -07:00
dhkatzandClaude Opus 5.5 50e4db8521 README: tidy the feature list
CI / build (push) Successful in 20s
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-29 03:20:15 -07:00
dhkatzandClaude Opus 5.5 92103098f8 Use the published t5de-api
CI / build (push) Successful in 43s
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-29 03:20:03 -07:00
dhkatzandClaude Opus 5.5 0e5ecf54ae Document community products
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-29 03:17:30 -07:00
dhkatzandClaude Opus 5.5 887e8a2364 Serve community products from local packs
The proxy serves products from local packs (t5de-api's format) under local IDs from 2,000,000,000: product
info and permission answers (with the parent's derivation chain from IMVU), the product's CFL, and the shop's
bundle lookup. Community products are taken out of outfit saves and outfit chat commands before IMVU sees
them, remembered per account with the outfit they belong to, and added back when the client loads that
outfit. Changed requests are re-signed with the session key from the login response.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-29 03:17:14 -07:00
dhkatz b2eed27b99 Merge branch 'xmlrpc' into products 2026-10-29 02:49:10 -07:00
dhkatzandClaude Opus 5.5 0c4f6caec1 Products: chat command filter, request signing, saved state
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-29 02:49:10 -07:00
dhkatzandClaude Opus 5.5 bee95533c0 Add an XML-RPC codec
Parses and writes calls and responses with Python 2.7 xmlrpclib's and
IMVU's PHP server's types, keeping struct member order.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-29 02:48:29 -07:00
dhkatzandClaude Opus 5.5 2190230f81 Frame-by-frame IMQ with an outgoing filter; HTTP interceptor hook
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-29 02:47:48 -07:00
dhkatzandClaude Opus 5.5 2551888ed6 T5DE's local proxy for IMVU Classic
CI / build (push) Successful in 45s
The client sends it every HTTP request and its IMQ connection; it makes them with current TLS and
certificates, upgrades IMVU's plain-HTTP hosts to HTTPS, and refuses IMVU's reporting endpoints. CI
tests it and publishes t5de-proxy.exe as nightlies and tagged releases.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
v0.1.0
2026-10-29 00:03:51 -07:00