]> git.cworth.org Git - zombocom-ai/blobdiff - index.html
Reword Coda's final message
[zombocom-ai] / index.html
index d61e2d06e5d9f519db26b5e10adb67b98c6abfe2..8db8b695b93b68c2187af45978e1fe4e8a07e6c0 100644 (file)
@@ -64,7 +64,7 @@
             <label for="code">
               Numeric code:
             </label>
-            <input id="code" type="text" autocomplete="off" placeholder="(Leave blank for random)" />
+            <input id="code" type="number" min="0" max="4294967295" autocomplete="off" placeholder="(Leave blank for random)" />
           </div>
         </div>
 
     <div id="images">
     </div>
 
-    <dl id="comments" class="comments">
-    </dl>
-
-    <p>
-      <form action="" id="comment-form">
-        <input id="comment" type="text" style="width:100%" autocomplete="off" placeholder="Add a comment" />
-      </form>
-    </p>
-
     <audio loop="" src="/zombo_words.mp3" type="audio/mpeg"></audio>
     <button id="mute" class="menu-button fade volume">
       <div>🔊</div>
@@ -119,12 +110,10 @@ mute.addEventListener("click", () => {
   <script>
     var socket = io();
 
-    const name = document.querySelector("#name");
+    const name_input = document.querySelector("#name");
     const name_dialog = document.querySelector("#name-dialog");
+    var informed_name;
     const images = document.querySelector("#images");
-    const comments = document.querySelector("#comments");
-    const comment_form = document.querySelector("#comment-form");
-    const comment = document.querySelector("#comment");
     const zombo_form = document.querySelector("#zombo-form");
     const prompt = document.querySelector("#prompt");
     const code = document.querySelector("#code");
@@ -133,59 +122,144 @@ mute.addEventListener("click", () => {
     const profile = document.querySelector("#profile");
     var spinner_timeout;
 
-    comment.addEventListener('focus', () => {
-        /* Do nothing if name is already set. */
-        if (name.value)
-            return;
-
-        /* Otherwise, bring up the modal dialog to set the name. */
-        name_dialog.showModal();
-    });
-
     profile.addEventListener('click', () => {
         name_dialog.showModal();
     });
 
     name_dialog.addEventListener('close', () => {
-        socket.emit('set-name', name.value);
+        socket.emit('set-name', name_input.value);
     });
 
-    comment_form.addEventListener('submit', function(e) {
-        e.preventDefault();
-        if (comment.value) {
-            socket.emit('comment', comment.value);
-            comment.value = '';
-        }
-    });
-
-    socket.on('comment', function(comment) {
+    function add_comment(comments, comment) {
         const dt = document.createElement('dt');
         const dd = document.createElement('dd');
         dt.textContent = comment.name + ':';
         dd.textContent = comment.text;
         comments.appendChild(dt);
         comments.appendChild(dd);
+    }
+
+    // When we enter the endgame, we disable the art-generation form,
+    // (just hide it)
+    socket.on('endgame', () => {
+       zombo_form.style.display = "none";
+    });
+
+    socket.on('comment', function(comment) {
+        const comments = document.querySelector("#comments_" + comment.image_id);
+        add_comment(comments, comment);
     });
 
     socket.on('inform-name', (name) => {
         console.log("Received inform-name event: " + name);
-        name.value = name;
+
+        /* When we receive a name we store it in 3 places:
+         *
+         *   * The informed_name variable (confirming what the server knows)
+         *   * The name_input field (so the user will see that in their profile)
+         *   * In localStorage (for use in a future session)
+         */
+        informed_name = name;
+        name_input.value = name;
+        localStorage.setItem('name', name);
     });
 
     socket.on('reset', () => {
         images.replaceChildren();
-        comments.replaceChildren();
+
+        /* Since the server is seeing us for the first time, let it
+           know our name (if we have one). */
+        const name = localStorage.getItem('name');
+        if (name) {
+            socket.emit('set-name', name);
+            return;
+        }
     });
 
     socket.on('image', (image) => {
         const figure = document.createElement('figure');
+        figure.id = "image_" + image.id;
+
         const img = document.createElement('img');
         img.src = image.filename;
-        const figcaption = document.createElement('figcaption');
-        const caption_text = document.createTextNode(`${image.prompt} (${image.code})`);
-        figcaption.appendChild(caption_text);
-        figure.appendChild(img);
-        figure.appendChild(figcaption);
+
+        if (image.link) {
+            const a = document.createElement('a');
+            a.href = image.link;
+            a.appendChild(img);
+            figure.appendChild(a);
+        } else {
+            figure.appendChild(img);
+        }
+
+        if (image.censored) {
+            img.style.display = "none";
+        }
+
+        if (image.prompt && image.code) {
+            const figcaption = document.createElement('figcaption');
+            const caption_text = document.createTextNode(`${image.prompt} (${image.code}) `);
+            figcaption.appendChild(caption_text);
+
+            const reuse_button = document.createElement('button');
+            reuse_button.appendChild(document.createTextNode("Reuse"));
+            figcaption.appendChild(reuse_button);
+
+            reuse_button.addEventListener('click', () => {
+                prompt.value = image.prompt;
+                window.scrollTo(0,0);
+            });
+
+            if (image.censored) {
+                figcaption.style.display = "none";
+            }
+
+            figure.appendChild(figcaption);
+        }
+
+        const dl_comments = document.createElement('dl');
+        dl_comments.className = "comments";
+        dl_comments.id = "comments_" + image.id;
+
+        image.comments.forEach((comment) => {
+            add_comment(dl_comments, comment);
+        });
+
+        figure.appendChild(dl_comments);
+
+        const comment_form = document.createElement('form');
+        const comment_input = document.createElement('input')
+        comment_input.type = "text";
+        comment_input.className = "comment";
+        comment_input.placeholder = "Add a comment";
+        comment_form.appendChild(comment_input);
+        figure.appendChild(comment_form);
+
+        comment_input.addEventListener('focus', () => {
+            /* If the server has informed us it has our name, we are done. */
+            if (informed_name)
+                return;
+
+            /* If server has no name, check local storage. */
+            const name = localStorage.getItem('name');
+            if (name) {
+                socket.emit('set-name', name);
+                return;
+            }
+
+            /* Failing both, bring up the modal dialog to set the name. */
+            name_dialog.showModal();
+        });
+
+        comment_form.addEventListener('submit', function(e) {
+            e.preventDefault();
+            if (comment_input.value) {
+                socket.emit('comment', {image_id: image.id,
+                                        text: comment_input.value});
+                comment_input.value = '';
+            }
+        });
+
         images.prepend(figure);
     });
 
@@ -224,6 +298,8 @@ mute.addEventListener("click", () => {
             "An image of",
             "A pencil sketch of",
             "A watercolor of",
+            "A 3D rendering of",
+            "A marble statue of",
         ];
         const subject = [
             " a modern home",
@@ -236,6 +312,7 @@ mute.addEventListener("click", () => {
             " sci-fi buildings",
             " pastel purple clouds",
             " a Teenage Mutant Ninja Turtle",
+            " Pikachu",
         ];
         const scenery = [
             " in tropical surroundings",
@@ -254,6 +331,7 @@ mute.addEventListener("click", () => {
             " on the streets of London at night with neon lights flashing",
             " that is part octopus",
             " melting into a puddle",
+            " on a birthday cake",
         ];
         const artist = [
             ", unreal engine 5",
@@ -265,6 +343,8 @@ mute.addEventListener("click", () => {
             ", fantasy art, neon fog",
             ", epic lighting from above",
             ", trending on artstation",
+            " by Gustav Klimt",
+            " by Leonardo da Vinci",
         ];
 
         prompt.value = random_from(art_type) + random_from(subject) +