Advertisement
Guest User

Discourse Threader

a guest
Sep 14th, 2021
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ==UserScript==
  2. // @name         Mistie Discourse Threader
  3. // @namespace    https://forums.mst3k.com/*
  4. // @version      0.1
  5. // @description  Scroot the Inscrutible
  6. // @author       You
  7. // @match        https://forums.mst3k.com/*
  8. // @grant        all
  9. // ==/UserScript==
  10.  
  11.  
  12. (function() {
  13.     'use strict';
  14.  
  15.     const { REPLY } = require('discourse/models/composer').default;
  16.     const composer = Discourse.__container__.lookup('controller:composer');
  17.  
  18.  
  19.     var pageType;
  20.     var pageId;
  21.     var topicPost;
  22.  
  23.     setInterval(
  24.         function(){
  25.             if ((window.location.pathname.split("/")[1] == "t") && !(window.location.pathname.split("/")[3] == pageId)){
  26.                 pageType = window.location.pathname.split("/")[1];
  27.                 pageId   = window.location.pathname.split("/")[3];
  28.  
  29.                 loadPostJson();
  30.             }
  31.             if ( !(window.location.pathname.split("/")[1] == "t") ){
  32.                 pageType = window.location.pathname.split("/")[1];
  33.                 pageId   = null;
  34.             }
  35.         }
  36.     ,1000);
  37.  
  38.     function loadPostJson(){
  39.         /*
  40.         fetch( window.location.pathname + ".json" )
  41.             .then(response => response.json())
  42.             .then(data => createThreadedView(data));
  43.             */
  44.         var topic = Discourse.__container__.lookup("controller:topic").get("model");
  45.         createThreadedView(topic);
  46.     }
  47.  
  48.     function createThreadedView(data){
  49.         console.log(data);
  50.         var postContainer = document.querySelector(".container.posts");
  51.         postContainer.style.display = "block";
  52.         var posts = data.postStream.posts;
  53.         postContainer.innerHTML = `
  54.         <STYLE>
  55.         .container.posts {
  56.         }
  57.         .threaded-post {
  58.             display:block;
  59.             box-sizing:border-box;
  60.             width:100%;
  61.             margin:0px;
  62.             margin-top:10px;
  63.             padding:10px;
  64.             background:rgba(128,128,128,0.1);
  65.             border-radius:8px;
  66.             box-shadow:0px 2px 4px rgba(0,0,0,0.33);
  67.         }
  68.         .threaded-avatar {
  69.             border-radius:50%;
  70.         }
  71.         .threaded-username {
  72.             font-size:larger;
  73.             font-weight:600;
  74.             margin:10px;
  75.         }
  76.         .threaded-user-title, .threaded-post-date {
  77.             color:#888;
  78.         }
  79.         .threaded-post-date {
  80.             float:right;
  81.         }
  82.         .threaded-collapse-toggle {
  83.             float:right;
  84.             margin:5px;
  85.             width:16px;
  86.             height:16px;
  87.             line-height:8px;
  88.             text-align:center;
  89.         }
  90.         .threaded-post.collapsed > * {
  91.            display:none;
  92.         }
  93.         .threaded-post.collapsed > .threaded-post-header {
  94.            display:block;
  95.            font-size:smaller;
  96.            color:#888;
  97.         }
  98.         .threaded-post.collapsed > .threaded-post-header > img {
  99.            display:none;
  100.         }
  101.         </STYLE>`;
  102.  
  103.         for ( var i = 0; i < posts.length; i++ ){
  104.             createPostElement(posts[i], i);
  105.  
  106.             console.log( posts[i] );
  107.  
  108.             var parentPost = posts[ posts[i].reply_to_post_number-1 ];
  109.             var parentElement = postContainer;
  110.  
  111.             if ( parentPost ){
  112.                 parentElement = parentPost.repliesElement;
  113.             } else {
  114.                 if ( i > 0 ){ parentElement = posts[0].repliesElement; }
  115.             }
  116.             console.log(posts[i].element);
  117.             parentElement.appendChild( posts[i].element );
  118.         }
  119.     }
  120.  
  121.     function createPostElement(post, postId){
  122.         var postDate = new Date(post.created_at);
  123.  
  124.         post.element;
  125.         post.element = document.createElement("div");
  126.         post.element.setAttribute("id","post-"+postId);
  127.         post.element.setAttribute("class","threaded-post");
  128.  
  129.         post.headerElement;
  130.         post.headerElement = document.createElement("div");
  131.         post.headerElement.setAttribute("id","post-header-"+postId);
  132.         post.headerElement.setAttribute("class","threaded-post-header");
  133.         post.headerElement.innerHTML = `
  134.         <img src="`+post.avatar_template.replace("{size}","40")+`" class="threaded-avatar">
  135.         <span class="threaded-username">`+post.username+`</span>
  136.         <span class="threaded-user-title">`+post.user_title+`</span>
  137.         `;
  138.  
  139.         post.dateTime = document.createElement("span");
  140.         post.dateTime.setAttribute("class","threaded-post-date");
  141.         post.dateTime.innerText = postDate.toLocaleDateString()+" "+postDate.toLocaleTimeString();
  142.  
  143.         post.collapse = document.createElement("button");
  144.         post.collapse.setAttribute("class","threaded-collapse-toggle");
  145.         post.collapse.innerText = "-";
  146.         post.collapse.addEventListener("click",toggleCollapse);
  147.  
  148.         post.headerElement.appendChild(post.collapse);
  149.         post.headerElement.appendChild(post.dateTime);
  150.  
  151.         post.bodyElement;
  152.         post.bodyElement = document.createElement("div");
  153.         post.bodyElement.setAttribute("id","post-body-"+postId);
  154.         post.bodyElement.setAttribute("class","threaded-post-body");
  155.         post.bodyElement.innerHTML = post.cooked;
  156.  
  157.         post.repliesElement;
  158.         post.repliesElement = document.createElement("div");
  159.         post.repliesElement.setAttribute("id","post-replies-"+postId);
  160.         post.repliesElement.setAttribute("class","threaded-post-replies");
  161.  
  162.         post.replyButton;
  163.         post.replyButton = document.createElement("button");
  164.         post.replyButton.setAttribute("id","post-reply-button-"+postId);
  165.         post.replyButton.setAttribute("class","threaded-post-reply-button");
  166.         post.replyButton.innerText = "Reply";
  167.         post.replyButton.addEventListener("click",function(){
  168.             composer.open({
  169.                 action: REPLY,
  170.                 draftKey: 'post_'+post.id,
  171.                 post
  172.             })
  173.         });
  174.  
  175.         post.element.appendChild(post.headerElement);
  176.         post.element.appendChild(post.bodyElement);
  177.         post.element.appendChild(post.replyButton);
  178.         post.element.appendChild(post.repliesElement);
  179.  
  180.     }
  181.  
  182.     function toggleCollapse(event){
  183.         console.log(event);
  184.         var thread = event.target.closest(".threaded-post");
  185.  
  186.         if ( thread.classList.contains("collapsed") ){
  187.             thread.classList.remove("collapsed");
  188.         } else {
  189.             thread.classList.add("collapsed");
  190.         }
  191.     }
  192.  
  193. })();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement