···12 PlaceStreamSegment,
13} from "streamplace";
14import { SystemMessages } from "../lib/system-messages";
015import { reduceChat } from "./chat";
16import { LivestreamState } from "./livestream-state";
17import { findProblems } from "./problems";
···129 activeTeleport: teleportRecord,
130 };
131 } else if (PlaceStreamLivestream.isTeleportArrival(message)) {
00132 const arrival = message as PlaceStreamLivestream.TeleportArrival;
133- // when receiving a teleportArrival, we're the target
134- // the source is teleporting to us
135- console.log("Received teleport arrival", arrival);
136- // TODO: show notification or UI for incoming teleport
00000137 } else if (PlaceStreamLivestream.isTeleportCanceled(message)) {
138 // teleport was canceled (deleted or denied)
139 state = {
···12 PlaceStreamSegment,
13} from "streamplace";
14import { SystemMessages } from "../lib/system-messages";
15+import { formatHandleWithAt } from "../utils/format-handle";
16import { reduceChat } from "./chat";
17import { LivestreamState } from "./livestream-state";
18import { findProblems } from "./problems";
···130 activeTeleport: teleportRecord,
131 };
132 } else if (PlaceStreamLivestream.isTeleportArrival(message)) {
133+ console.log("teleport succeeded");
134+ // teleport has succeeded, we are now at the target stream
135 const arrival = message as PlaceStreamLivestream.TeleportArrival;
136+ const systemMessage = SystemMessages.teleportArrival(
137+ formatHandleWithAt(arrival.source),
138+ arrival.viewerCount,
139+ );
140+ // set proper times
141+ systemMessage.indexedAt = arrival.startsAt;
142+ systemMessage.record.createdAt = arrival.startsAt;
143+144+ state = reduceChat(state, [systemMessage], []);
145 } else if (PlaceStreamLivestream.isTeleportCanceled(message)) {
146 // teleport was canceled (deleted or denied)
147 state = {