From 1697cbff5c93b068c2525d17b8496775e62c48d8 Mon Sep 17 00:00:00 2001
From: Marshall Quander <marshall@quander.me>
Date: Thu, 28 Jun 2018 15:20:21 -0700
Subject: [PATCH] Don't load bot recordings unless you are a bot

---
 src/components/avatar-replay.js | 20 ++++++++++++--------
 src/hub.html                    |  2 --
 src/hub.js                      | 22 +++++++++++++++++-----
 webpack.config.js               | 12 ++++++++++++
 4 files changed, 41 insertions(+), 15 deletions(-)

diff --git a/src/components/avatar-replay.js b/src/components/avatar-replay.js
index 260744549..b1dd13bf7 100644
--- a/src/components/avatar-replay.js
+++ b/src/components/avatar-replay.js
@@ -1,5 +1,3 @@
-import botRecording from "../assets/avatars/bot-recording.json";
-
 // These controls are removed from the controller entities so that motion-capture-replayer is in full control of them.
 const controlsBlacklist = [
   "tracked-controls",
@@ -20,24 +18,30 @@ AFRAME.registerComponent("avatar-replay", {
   schema: {
     camera: { type: "selector" },
     leftController: { type: "selector" },
-    rightController: { type: "selector" }
+    rightController: { type: "selector" },
+    recordingUrl: { type: "string" }
   },
   init: function() {
-    const { camera, leftController, rightController } = this.data;
+    this.modelLoaded = new Promise(resolve => this.el.addEventListener("model-loaded", resolve));
+  },
 
+  update: function() {
+    const { camera, leftController, rightController, recordingUrl } = this.data;
+    const fetchRecording = fetch(recordingUrl).then(resp => resp.json());
     camera.setAttribute("motion-capture-replayer", { loop: true });
     this._setupController(leftController);
     this._setupController(rightController);
 
-    this.el.addEventListener("model-loaded", () => {
+    this.dataLoaded = Promise.all([fetchRecording, this.modelLoaded]).then(([recording]) => {
       const cameraReplayer = camera.components["motion-capture-replayer"];
-      cameraReplayer.startReplaying(botRecording.camera);
+      cameraReplayer.startReplaying(recording.camera);
       const leftControllerReplayer = leftController.components["motion-capture-replayer"];
-      leftControllerReplayer.startReplaying(botRecording.left);
+      leftControllerReplayer.startReplaying(recording.left);
       const rightControllerReplayer = rightController.components["motion-capture-replayer"];
-      rightControllerReplayer.startReplaying(botRecording.right);
+      rightControllerReplayer.startReplaying(recording.right);
     });
   },
+
   _setupController: function(controller) {
     controlsBlacklist.forEach(controlsComponent => controller.removeAttribute(controlsComponent));
     controller.setAttribute("visible", true);
diff --git a/src/hub.html b/src/hub.html
index d54fac093..da521280d 100644
--- a/src/hub.html
+++ b/src/hub.html
@@ -23,8 +23,6 @@
 </head>
 
 <body data-html-prefix="<%= HTML_PREFIX %>">
-    <audio id="bot-recording" loop muted crossorigin="anonymous" src="./assets/avatars/bot-recording.mp3"></audio>
-
     <audio id="test-tone">
         <source src="./assets/sfx/tone.webm" type="audio/webm"/>
         <source src="./assets/sfx/tone.mp3" type="audio/mpeg"/>
diff --git a/src/hub.js b/src/hub.js
index aeb047d7a..9482d7ae7 100644
--- a/src/hub.js
+++ b/src/hub.js
@@ -336,15 +336,27 @@ const onReady = async () => {
         playerRig.setAttribute("avatar-replay", {
           camera: "#player-camera",
           leftController: "#player-left-controller",
-          rightController: "#player-right-controller"
+          rightController: "#player-right-controller",
+          recordingUrl: "assets/avatars/bot-recording.json"
         });
-        const audio = document.getElementById("bot-recording");
-        mediaStream.addTrack(audio.captureStream().getAudioTracks()[0]);
+
+        const audioEl = document.createElement("audio");
+        audioEl.loop = true;
+        audioEl.muted = true;
+        audioEl.crossorigin = "anonymous";
+        audioEl.src = "assets/avatars/bot-recording.mp3";
+        document.body.appendChild(audioEl);
+
         // Wait for runner script to interact with the page so that we can play audio.
-        await new Promise(resolve => {
+        const interacted = new Promise(resolve => {
           window.interacted = resolve;
         });
-        audio.play();
+        const canPlay = new Promise(resolve => {
+          audioEl.addEventListener("canplay", resolve);
+        });
+        await Promise.all([canPlay, interacted]);
+        mediaStream.addTrack(audioEl.captureStream().getAudioTracks()[0]);
+        audioEl.play();
       }
 
       if (mediaStream) {
diff --git a/webpack.config.js b/webpack.config.js
index 6f66a85c9..7f4daa883 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -223,6 +223,18 @@ const config = {
         to: "hub-preview.png"
       }
     ]),
+    new CopyWebpackPlugin([
+      {
+        from: "src/assets/avatars/bot-recording.json",
+        to: "assets/avatars/bot-recording.json"
+      }
+    ]),
+    new CopyWebpackPlugin([
+      {
+        from: "src/assets/avatars/bot-recording.mp3",
+        to: "assets/avatars/bot-recording.mp3"
+      }
+    ]),
     // Extract required css and add a content hash.
     new ExtractTextPlugin({
       filename: "assets/stylesheets/[name]-[contenthash].css",
-- 
GitLab