BigTSDMB / SDMB Tweaker 2

// ==UserScript==
// @name         SDMB Tweaker 2
// @namespace    BigTSDMB
// @version      3.3
// @description  New tweaks for the new(er) Discourse SDMB
// @author       BigTSDMB
// @updateURL    https://openuserjs.org/meta/BigTSDMB/SDMB_Tweaker_2.meta.js
// @downloadURL  https://openuserjs.org/install/BigTSDMB/SDMB_Tweaker_2.user.js
// @license      MIT
// @match        https://boards.straightdope.com/*
// @grant        none
// @run-at       document-start
// @require      https://openuserjs.org/src/libs/BigTSDMB/setStyle.js
// ==/UserScript==
/* jshint esversion: 6 */ /* globals setStyle */


//------------------------
// DYNAMIC CONTENT HELPERS
//------------------------

//Create url-change event
  ['pushState', 'replaceState'].forEach( changeState => {
    window.history[changeState] = new Proxy(window.history[changeState], {
      apply: (target, thisArg, argArray) => {
        let output = target.apply(thisArg, argArray);
        window.dispatchEvent(new Event('url-change'));
        console.log('Event url-change fired');
        return output;
      },
    });
  });
  addEventListener('popstate', _=>{ window.dispatchEvent(new Event('url-change')); });
  setTimeout(/*'DOMContentLoaded',*/ _=>{ window.dispatchEvent(new Event('url-change')); });
//-----------------------

function onElement(selector, callback, persistent, observerOptions) {
  if (!observerOptions) { observerOptions = { childList:true, subtree: true }; }
  let elementArrival = new MutationObserver(_=>{
    let elements = document.querySelectorAll(selector);
    if (elements.length) {
      if (!persistent) { elementArrival.disconnect(); }
      callback(elements[0], elements);
    }
  }); elementArrival.observe(document, observerOptions);
}

//-------------
// GET OPTIONS
//-------------

let optionsList = JSON.parse(localStorage.getItem('sdmb-tweaker-options') || '{}');

//--------------------
// VISUAL-ONLY TWEAKS
//--------------------

let mainStyles = `
  .cooked a:not(.mention)/*, .d-editor-preview a:not(.mention)*/ {
     text-decoration: underline;
     text-decoration-skip: trailing-spaces; /* currently doesn't work. used gradient workaround */
  }
  .cooked :not(.source) > a:not(.mention):visited:not([href*="youtube.com"]), aside.onebox .onebox-body a[href]:visited {
     color: var(--success);
  }
  a:hover:not(.post-activity), .title a:hover {
     text-decoration: underline !important;
  }
  .title a, .menu-panel a:hover {
     text-decoration: none !important;
  }
  .badge-notification.clicks {
     left: -0.7ch;
     margin-right: -0.7ch;
     border-radius: 10px 10px 10px 0px;
     background: radial-gradient(67% 79%, var(--primary-low) 68%, transparent 73%),
                 linear-gradient(to left, var(--primary-low) 60%, var(--secondary) 60%);
  }
  .MJXc-TeX-sans-R {
     font-family: var(--font-family) !important;
  }
  /*.d-editor-textarea-column {
    flex: none;
  }*/
  a.mention {
    font-weight: bold;
    color: var(--primary-very-high);
  }
  .time-gap {
    background: var(--primary-200);
    font-weight: bold;
    height: 30px;
  }
  user-menu-button-likes {
    display: none;
  }
`;

var optionalStyles = '';
if (!optionsList['sticky-avatars']) { optionalStyles += `
  .topic-post.sticky-avatar .topic-avatar {
    position: unset !important;
  }
`; }

if (optionsList['bolder-titles']) { optionalStyles +=`
  .topic-list .main-link a.title {
    font-weight: bold;
  }
  .visited .main-link a.title {
    font-weight: normal;
  }
`; }

if (optionsList['tighter-buttons']) { optionalStyles +=`
  .d-editor-button-bar {
    grid-template-columns: repeat(auto-fill, minmax(2em, 1fr)) !important;
  }
`; }

if (optionsList['remove-share']) { optionalStyles +=`
  .quote-sharing, .copy-quote {
    display: none !important;
  }
`; }

if (optionsList['change-font-text']) {
  let font = optionsList['change-font-text'];
  if (font == 'Arial SS01' || font == 'Arial SS1') {
    optionalStyles += `
      body { font-feature-settings: 'ss01' 1; }
    `;
  } else {
    optionalStyles +=`
      :root { --font-family: "${font}"; }
  `;
  }
}

function addConditionalStyling() {
  let conditionalStyles = '';
  if (document.querySelector('[data-theme-name="straight dope light"]')) {
   conditionalStyles += `
      a, .cooked :not(.source) > a:active:not(.mention):not([href*="youtube.com"]), /*aside.onebox .onebox-body a[href],*/
      .cooked :not(.source) > a:hover:not(.mention) {
         color: var(--tertiary-high);
      }
      .cooked :not(.source) > a:not(.mention):visited:not([href*="youtube.com"]), aside.onebox .onebox-body a[href]:visited {
         color: #551a8b; /* default visited color in most browsers */
      }
    `;
  } else if (document.querySelector('[data-theme-name="vincent"]')) {
    conditionalStyles = `
      .moderator .cooked p {
        color: white !important;
        -webkit-text-stroke: 0.05px gray !important;
       }
      .moderator .cooked {
        background: rgba(211,80,30,0.65) !important;
        padding-left: 67px !important;
      }
      .moderator .topic-body {
        border-left: none !important;
      }
      /* fix font to actually have bold */
      @font-face {
        font-family: "Assistant-google";
        font-style: normal;
        font-weight: 200 800;
        font-display: swap;
        src: url(https://fonts.gstatic.com/s/assistant/v19/2sDcZGJYnIjSi6H75xkzaGW5.woff2) format('woff2');
      }
      html {
        font-family: "Assistant-google", "Assistant", sans;
      }
      b, strong {
        font-weight: bold; /* not bolder, which doesn't work */
        /*
        text-shadow: -0.6px 0, 0 0.6px, 0.6px 0, 0 -0.6px, -0.6px -0.6px, 0.6px 0.6px,
                     -0.6px 0.6px, 0.6px -0.6px;
        font-synthesis: weight;
        filter: brightness(110%)
        /**/
      }
    `;
  } else if (document.querySelector('[data-theme-name="minima"]')) {
    conditionalStyles = `
      .MJXc-TeX-sans-R {
         font-family: sans-serif !important;
      }
    `;
  } else if (document.querySelector('[data-theme-name~="dark"]')) {
    conditionalStyles = `
      .custom-footer {
        background: var(--primary-low);
        color: var(--primary-very-high);
        font-weight: 600;
      }
      .custom-footer .flexbox {
        color: var(--primary-very-high);
      }
    `;
}
  setStyle(mainStyles + optionalStyles + conditionalStyles, 'sdmb-tweaker');
}

//-----------------
// REPLYBOX TWEAKS
//-----------------

function addButtons() {
  makeButton('underline','Underline','u','italic', _=>{ wrapSelection('[u]', 'underlined text') });
  makeButton('strikethrough', 'Strikethrough', 's', 'underline-button', _=>{ wrapSelection('[s]', 'struckthrough text') });
}

function makeButton(name, displayName, shortcutKey, beforeButton, callback) {
  if (document.querySelector('#reply-control.open') === null) { return; }
  if (document.querySelector(`.${name}-button`)) { return; }
  let cloneButton = beforeButton;
  if (beforeButton instanceof Array) { [beforeButton, cloneButton] = beforeButton; }

  let shiftRequired = /^[A-Z]$/.test(shortcutKey);
  let shortcutText = 'Ctrl-' + ( shiftRequired ? 'Shift-' : '' ) +
      shortcutKey.replace(/^Arrow/, '').toUpperCase();
  let newButton = document.querySelector(`button.${cloneButton}`).cloneNode(true);
  document.querySelector(`button.${beforeButton}`).after(newButton);
  newButton.id = `${name}-button`; //may remove later
  newButton.classList.replace(cloneButton, `${name}-button`);
  newButton.title = `${displayName} (${shortcutText})`;
  newButton.addEventListener('click', callback);
  addShortcutKey(shortcutKey, shiftRequired, newButton);
  newButton.querySelector('svg').classList.remove(`d-icon-${cloneButton}`);
  newButton.querySelector('use').href.baseVal = `#${name}`;
}

function addShortcutKey(shortcutKey, shiftRequired, button) {
  let textbox = document.querySelector('textarea');
  textbox.addEventListener('keydown', event => {
    if (event.ctrlKey && event.key == shortcutKey) {
      if (shiftRequired && !event.shiftKey) { return; }
      button.click();
      event.preventDefault();
      event.stopPropagation();
    }
  });
}

function fixLinkButton() { // fix link button behavior for elements surrounded by [tag][/tag]
  let linkButton = document.querySelector('button.link');
  if (linkButton) {
    if (document.querySelector('.link.clone')) { return; }
    let cloneButton = linkButton.cloneNode(true);
    linkButton.classList.add('original');
    linkButton.style.display = 'none';
    linkButton.after(cloneButton);
    cloneButton.classList.add('clone');
    cloneButton.onclick = _=>{ //addEventListner adds multiples, even with a named function
      let replyBox = document.querySelector('textarea');
      let selection = getTextareaSelection(replyBox);
      selection.replace(/^(\[)(.+]).+(\[\/\2)$/, (e, p1, p2, p3) => {
        replyBox.selectionStart += p1.length + p2.length;
        replyBox.selectionEnd -= p3.length;
      });
      document.querySelector('.link.original').click();
    };
  }
}

function addButtonSVG() {
  if (document.querySelector('svg.tweak-icons') == null) {
    let svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
    svg.setAttribute('xmlns', 'http://www.w3.org/2000/svg'); //for dev console aesthetics only
    svg.className.baseVal = 'tweak-icons';
    svg.style.display = 'none';
    svg.innerHTML = `
      <symbol id="underline" viewBox="0 0 448 512">
        <path d="M416 448H32c-17.69 0-32 14.31-32 32s14.31 32 32 32h384c17.69 0 32-14.31 32-32S433.7 448 416 448zM48 64.01H64v160c0 88.22 71.78 159.1 160 159.1s160-71.78 160-159.1v-160h16c17.69 0 32-14.32 32-32s-14.31-31.1-32-31.1l-96-.0049c-17.69 0-32 14.32-32 32s14.31 32 32 32H320v160c0 52.94-43.06 95.1-96 95.1S128 276.1 128 224v-160h16c17.69 0 32-14.31 32-32s-14.31-32-32-32l-96 .0049c-17.69 0-32 14.31-32 31.1S30.31 64.01 48 64.01z"/>
      </symbol>
      <symbol id="strikethrough" viewBox="0 0 512 512">
        <path d="M161.3 144c3.2-17.2 14-30.1 33.7-38.6c21.1-9 51.8-12.3 88.6-6.5c11.9 1.9 48.8 9.1 60.1 12c17.1 4.5 34.6-5.6 39.2-22.7s-5.6-34.6-22.7-39.2c-14.3-3.8-53.6-11.4-66.6-13.4c-44.7-7-88.3-4.2-123.7 10.9c-36.5 15.6-64.4 44.8-71.8 87.3c-.1 .6-.2 1.1-.2 1.7c-2.8 23.9 .5 45.6 10.1 64.6c4.5 9 10.2 16.9 16.7 23.9H32c-17.7 0-32 14.3-32 32s14.3 32 32 32H480c17.7 0 32-14.3 32-32s-14.3-32-32-32H270.1c-.1 0-.3-.1-.4-.1l-1.1-.3c-36-10.8-65.2-19.6-85.2-33.1c-9.3-6.3-15-12.6-18.2-19.1c-3.1-6.1-5.2-14.6-3.8-27.4zM348.9 337.2c2.7 6.5 4.4 15.8 1.9 30.1c-3 17.6-13.8 30.8-33.9 39.4c-21.1 9-51.7 12.3-88.5 6.5c-18-2.9-49.1-13.5-74.4-22.1c-5.6-1.9-11-3.7-15.9-5.4c-16.8-5.6-34.9 3.5-40.5 20.3s3.5 34.9 20.3 40.5c3.6 1.2 7.9 2.7 12.7 4.3l0 0 0 0c24.9 8.5 63.6 21.7 87.6 25.6l0 0 .2 0c44.7 7 88.3 4.2 123.7-10.9c36.5-15.6 64.4-44.8 71.8-87.3c3.6-21 2.7-40.4-3.1-58.1H335.1c7 5.6 11.4 11.2 13.9 17.2z"/>
      </symbol>

    `; document.documentElement.appendChild(svg);
  }
  setStyle(`
    button.upload, button.local-dates { display: none; }
    #underline-button > svg { padding-top: 1px; }
    /*.tweaked-date { text-align: center; white-space: pre }*/
  `);
}

function fixQuoteButton() { //prevents Discourse from removing fully quoted posts
  let quoteButton = document.querySelector('.quote.btn');
  if (!quoteButton) { return; }
  function clickAction() { //named function to avoid adding event listener more than once.
    let replybox = document.querySelector('textarea');
    replybox.onchange = _=> { //faster than addEventListener, needed to catch quote being added
      setTimeout( () => {
        replybox.value = replybox.value.replace(/([^\u2062])(\n\[\/quote]\n)/g, '$1 \u2062$2');
        console.log('replybox = ' + replybox.value.replace(/\u2062/g, '{@}'))
      }, 50);
      replybox.onchange = null;
    };
  };
  quoteButton.onclick = clickAction; //addEventListener adds multiple copies for some reason
}

function changeDefaultText(string) {
  let textarea = document.querySelector('textarea');
  if (!textarea) { return; }
  if (!string) {
    let remove = / Drag or paste images\.$/;
    string = textarea.placeholder.replace(remove, '');
  }
  textarea.placeholder = string;
  textarea.ariaLabel = string;
}

//--------------------------
// TEXTBOX HELPER FUNCTIONS
//--------------------------

function escapeRegex(string) {
  return string.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
}

function getTextareaSelection(textarea, trim = true, before, after) {
  if (!textarea) { textarea = document.querySelector('textarea'); }
  if (typeof textarea == 'string') { textarea = document.querySelector(textarea) }
  textarea.focus();
  let selectionStart = textarea.selectionStart + (before || 0);
  let selectionEnd = textarea.selectionEnd + (after || 0);
  let selection = textarea.value.slice(selectionStart, selectionEnd);
  if (trim && selection.trim() !== '' ) {
    while (selection[0] == ' ') {
      textarea.selectionStart++;
      selection = selection.slice(1);
    }
    while (selection.slice(-1) == ' ') {
      textarea.selectionEnd--;
      selection = selection.slice(0, -1);
    }
  }
  return selection;
}

function wrapSelection(tag, dummyText, trim = true, textarea) {
  if (!textarea) { textarea = document.querySelector('textarea'); }
  if (typeof textarea == 'string') { textarea = document.querySelector(textarea); }
  if (typeof tag != 'object') {
    tag = [tag, tag];
    if (tag[0][0] == '[' || tag[0][0] == '<') {
      tag[1] = tag[0][0] + '/' + tag[0].slice(1);
    }
  }
  textarea.focus();
  let selection = getTextareaSelection(textarea, trim) || dummyText;
  let output = tag[0] + selection + tag[1];
  //undo if already underlined
  if (textarea.value.slice(textarea.selectionStart - tag[0].length, //remove dummy text
      textarea.selectionEnd + tag[1].length) == tag[0] + dummyText + tag[1]) {
    textarea.selectionStart -= tag[0].length; textarea.selectionEnd += tag[1].length;
    output = '';
  } else if (selection.match('^' + escapeRegex(tag[0]) + '.*' + escapeRegex(tag[1]) + '$')) {
     output = selection.replace(new RegExp('^' + escapeRegex(tag[0])), '');
     output = output.replace(new RegExp(escapeRegex(tag[1]) + '$'), '');
  }
  textarea.setRangeText(output);
  //select dummy text if necessary
  if (textarea.selectionStart == textarea.selectionEnd && output != '') {
    textarea.selectionEnd = textarea.selectionStart + output.length - tag[1].length;
    textarea.selectionStart += tag[0].length;
  }
  textarea.dispatchEvent( new Event('change') );
}

//------------------------
// CATEGORY/THREAD TWEAKS
// -----------------------

function fixDates() {
  //console.log ('fixDates fired');
  document.querySelectorAll('span.relative-date').forEach(span => {
    let dateString;
    if (false && optionsList?.['full-date-time'] && !span.firstChild?.classList?.contains('tweaked-date')) {
      dateString = span.title || msToDiscourseDate(span.getAttribute('data-time'));
      if (span.parentElement?.classList.contains('post-activity')) {
        dateString = dateString.replace(/ (\d*:)/, '<br> $1');
      }
    } else {
      if ( span.firstChild?.classList?.contains('tweaked-date') || /m|h$/.test(span.textContent) ) {
        return span.textContent;
      }
      //console.log('attempt to fix datestrings');
      dateString = span.title || msToDiscourseDate(span.getAttribute('data-time'));
      dateString = dateString.replace(/^(.*) \d\d?:\d\d [ap]m$/, (_, date) => {
        let [monthDay, year] = date.split(',');
        if (year == new Date().getFullYear()) { return monthDay; }
        return date;
      })
      //console.log(span);
      if (span.parentElement?.classList.contains('post-activity')) {
       dateString = dateString.replace(/,/, '\n ');
      }
    }
    span.innerHTML =
     `<span class="tweaked-date" style="text-align: center; white-space: pre">${dateString}</span>`;
  });
}
function injectFixedDates() {
  if ( !(new RegExp('^/[tc]/')).test(location.pathname) ) { return; }
  //console.log ('date tweaker fired')
  onElement('span.relative-date', _=> {
    fixDates();
    setTimeout(fixDates, 100);
    let postsColumn = document.querySelector('div.posts-wrapper');
    let observer = new MutationObserver(_=> {
      observer.disconnect();
      fixDates();
      if (postsColumn) { observer.observe(postsColumn, {childList: true, subtree: true}); }
    });
    if (postsColumn) { observer.observe(postsColumn, {childList: true, subtree: true}); }
  });
}

function msToDiscourseDate(milliseconds) {
  let dateTime = new Date(+milliseconds);
  let date = dateTime.toLocaleDateString('en-us', { dateStyle: 'medium' });
  let time = dateTime.toLocaleTimeString('en-us', { timeStyle:'short' }).toLowerCase();
  return `${date} ${time}`;
}

function fixTwitterNames() {
  onElement('.twitter-screen-name > a', (_, nameList) => {
    nameList.forEach(name => {
      name.textContent = '@' + name.href.split('/')[3];
    });
  });
}

//----------------------------
// PROFILE/PREFERENCES TWEAKS
//----------------------------

function addMutedThreadsShow() {
  if (!location.pathname.endsWith('/preferences/tags') || !document.body) { return }
  onElement('svg.muted', mutedIcon => {
    let mutedLabel = mutedIcon.parentNode;
    if (mutedLabel) {
      mutedLabel.style.display = 'block';
      mutedLabel.appendChild(Object.assign(document.createElement('a'), {
        style: 'float: right;',
        href: 'https://boards.straightdope.com/latest?state=muted',
        textContent: 'Show'
      }));
    }
  });
}

//-------------------
// ADD OPTIONS PANEL
//-------------------

function createOptionHTML(optionList) {
  let output = '<legend class="control-label">SDMB Tweaker</legend>';
  for (let key in optionList) {
    if (key.endsWith('-text')) {
      output += `
        <div class="controls" style="width: max-content;">
          <label class="checkbox-label">${optionList[key]}
            <input id="${key}" maxlength="255" type="text" class="sdmb-tweaker-setting"
               style="padding: 0 0 0 0.2em; margin: 0 0.5em 0 0.5em;">
            <small>(press Enter to apply)
          </label>

        </div>
      `;
    } else {
      output += `
        <div class="controls">
          <label class="checkbox-label">
            <input id="${key}" type="checkbox" class="ember-checkbox sdmb-tweaker-setting">
            ${optionList[key]}
          </label>
        </div>
      `;
    }
  };
  output += '<small>(You may need to refresh the page to activate Tweaker settings.)</small>'
  return output;
}
function addOptions() {
  if (!location.pathname.endsWith('/preferences/interface') || !document.body) { return; }
  let observer = new MutationObserver( () => {
    if (document.querySelector('fieldset.sdmb-tweaker-preferences')) { return; }
    let fieldset = document.querySelector('fieldset.other');
    if (fieldset) {
      observer.disconnect();
      let additionalOptions = document.createElement('fieldset');
      additionalOptions.className = 'control-group sdmb-tweaker-preferences';
      fieldset.after(additionalOptions);
      additionalOptions.innerHTML = createOptionHTML({
        'bolder-titles': 'Make unread thread titles more bold',
        'sticky-avatars': 'Move avatars as you scroll',
        'full-date-time': 'Always show full date/timestamp',
        'tighter-buttons': 'Decrease space between buttons in text editor',
        'remove-share': 'Remove share options when highlighting text',
        'change-font-text': 'Replace main font with '
      });
      let optionsList = JSON.parse(localStorage.getItem('sdmb-tweaker-options') || '{}');
      let settingsList = document.getElementsByClassName('sdmb-tweaker-setting');
      for (let option of settingsList) {
        if (optionsList[option.id] == true) { option.checked = true; }
        if (typeof optionsList[option.id] == 'string' ) { option.value = optionsList[option.id]; }
        option.addEventListener('change', () => {
          let value = option.value;
          if (value == 'on') { value = option.checked }
          optionsList[option.id] = value;
          console.log (value);
          localStorage.setItem('sdmb-tweaker-options', JSON.stringify(optionsList) );
        });
      }
    }
  }); observer.observe(document.body, { childList:true, subtree: true });
}

//-----------------
// ACTIVATE TWEAKS
//-----------------

setStyle(mainStyles + optionalStyles, 'sdmb-tweaker');
onElement('body', _=>{ //Do not know why, but sometimes the above doesn't work.
  if (!document.getElementById('sdmb-tweaker')) {
    setStyle(mainStyles + optionalStyles, 'sdmb-tweaker');
  }
});
addEventListener('DOMContentLoaded', _=> {
  addConditionalStyling()
  addButtonSVG();
  onElement('#reply-control', _=>{
    let tasks = _=> {
      addButtons();
      fixLinkButton();
      fixQuoteButton();
      changeDefaultText();
    }; tasks();
    let getReplybox = new MutationObserver(tasks);
    getReplybox.observe(document.querySelector('#reply-control'),
        { attributes: true, attributeFilter: ['class'], attributeOldValue: true }
      );
  });
});
addEventListener('url-change', _=>{
  console.log ('inserting changes')
  addOptions();
  addMutedThreadsShow();
  injectFixedDates();
  //fixTwitterNames();
});

/*scratch for later
<details id="ember115" class="options select-kit single-select dropdown-select-box toolbar-popup-menu-options is-expanded ember-view">
  <summary aria-label="Select a value to filter" name="Select a value to filter" data-name="" tabindex="-1" role="listbox" id="ember115-header" class="select-kit-header single-select-header dropdown-select-box-header btn no-text btn-icon ember-view">
    <div class="select-kit-header-wrapper">
      <svg class="fa d-icon d-icon-cog svg-icon svg-string" xmlns="http://www.w3.org/2000/svg">
        <use href="#cog"></use>
      </svg>
    </div>
  </summary>
<!----->
<div id="ember115-body" class="select-kit-body ember-view" style="position: fixed; min-width: 220px; max-width: 300px; inset: 0px auto auto 0px; margin: 0px; transform: translate3d(${element.getBoundingClientRect().x}px, ${element.getBoundingClientRect().y}px, 0px);" data-popper-placement="bottom-start">
  <div id="ember115-filter" class="select-kit-filter ember-view"></div>
  <ul class="select-kit-collection" aria-live="polite" role="menu">
    <li data-guid="ember201" aria-checked="false" role="menuitemradio" data-name="Hide Details" data-value="insertDetails" title="Hide Details" tabindex="0" id="ember202" class="select-kit-row dropdown-select-box-row ember-view">
      <div class="icons">
        <span class="selection-indicator"></span>
        <span class="svg-icon-title" title="hide-details">
          <svg class="fa d-icon d-icon-caret-right svg-icon svg-string" xmlns="http://www.w3.org/2000/svg">
            <use href="#caret-right"></use>
          </svg>
        </span>
      </div>
      <div class="texts">
        <span class="name">Hide Details</span>
        <span class="desc"><!----></span>
      </div>
    </li>
  </ul>
</div>
<!---->

</details>

Request URL: https://boards.straightdope.com/t/950518/notifications
Request Method: POST
Status Code: 200
Remote Address: 64.71.144.203:443
Referrer Policy: strict-origin-when-cross-origin
cache-control: no-cache, no-store
cdck-proxy-id: app-router-tiehunter03.sea1
cdck-proxy-id: app-balancer-tieinterceptor1b.sea1
content-encoding: gzip
content-type: application/json; charset=utf-8
date: Thu, 30 Jun 2022 03:48:56 GMT
referrer-policy: strict-origin-when-cross-origin
server: nginx
set-cookie: _forum_session=7hljlWzitxpsY4A%2F%2Bmjt9Lyy8v%2BKoANCylQTb9ezO310kvfFEH9tose7CEROyRHy8q4KrDptlB71bDhoNRw0%2BmBGzE94lIBI7Yo%2Fe%2FgeUO4Zwvl3bmVBhcivPC4oAGkhwccwLWs%2F0cL3Qo%2FJXentnS3vJQ%2F46yfhzZyArWh%2FU9KpYB7TDZW7KoZJ8DC50DZWHGav8LFumTivsx4HB5JxMfWSNbW%2FWA5x1jEYgikKFJTHvBckCBzhMJ%2BRxbJO1Ozf3ozkPUUZs7e%2FtMFGNdRhFKgqe7bvWKzJ5dxxBU%2BOOy2BinQv7%2Br%2BYW%2FWMNZgzIwmBPjxxXJpnma7sti7VDXEeWp7d4eMzdyHiUWrzgH0Z7u9lt0sN9bQKPR9cM8LUYUQ42p%2B2oJ5KUYq3UBrKdbhcGd0x5VNKQFyQ2mKZbdveALgREbfcPmtqn9AZO1a2JzLGPfA%2B5g%2F8XzkKDi5mEK1efS76t1SRu7xZgct%2F9fAW1oT9UyLI191SxEOXB6FT8PepGWt5SYIFdKRoA7WvO7vMx3%2BZS6wNeikLPe2A5K7QNR1%2BCsgemQuMEwoxVm9wapNlx3Eaoo9EveHceCqhVw%3D--oenVyqEu7bfJSpGO--Sqp88jqcNk6J7mKuBeiELA%3D%3D; path=/; secure; HttpOnly; SameSite=Lax; Secure
strict-transport-security: max-age=31536000
vary: Accept-Encoding
vary: Accept
x-content-type-options: nosniff
x-discourse-route: topics/set_notifications
x-discourse-username: BigT
x-download-options: noopen
x-frame-options: SAMEORIGIN
x-permitted-cross-domain-policies: none
x-request-id: a8b41a07-cdd9-4fc8-a446-0c1dc53c61ec
x-xss-protection: 0
:authority: boards.straightdope.com
:method: POST
:path: /t/950518/notifications
:scheme: https
accept: *\/*
accept-encoding: gzip, deflate, br
accept-language: en-US,en;q=0.9
cache-control: no-cache
content-length: 20
content-type: application/x-www-form-urlencoded; charset=UTF-8
cookie: mjx.menu=zscale%3A200%25%26%3Brenderer%3ACommonHTML%26%3Bscale%3A100; vmidv1=9d38b8f8-2eaa-43fd-b805-99990016ffaf; _t=eQsHLjioTH23Z9vqU0pr7mC8DlhIkSpR9vZ3exfrugxIxgjCOP4Uk6DHwc9yvJq5Y3xgrIj4Dz2PcpUj%2B6TYhyWnut2l9DQZzgwL6Ys8eHbBV4hIGnI7Y2QUo3Aq9pTGu5%2FnhC4jbz83zZxarD6OUKHwJKqOSzo4t%2FJ%2FN4o3mt1KodAJpAPJF5GwExcmlGPHwz0zgtSyUXJceTbSQALvol9bjxDpDBh7bb%2BRk0FA0zzhulTZYvovD2K9RSxzdGb5sgGHLmdp3zprJW7gi6B2zw%3D%3D--SFoyHI0vE2QqdX4f--wW%2FGaT9BROoCahgz7Obqig%3D%3D; _forum_session=93akPS3Vb4IkmiM2jioJyY0J6bJJ0LyUsxR9XTl78TivCU%2FsD6ZU2qv02KYo1a%2B4rivCGiStArPOUtIMjIBfl0CgsWdum%2BpCWoKU5PG42127arCcKQgmcanDPImatFT%2FPMizlx1L%2Bat%2BGfhB2KeH%2F%2FCXDkKd3YrjhEidPHfj8S6GhniYXMzftl%2F%2BDdSV8M1rxDY0GAu%2BXJi4sg1urdH2PEGgIKAffrfR19HcqoI%2BXNv3DYJz3nOU2Town20PL5d132wUYpnzb6ZTDYQJGQ1t9P8Ydz3s7Zy9RG5sC4uJDGNnCPTK2F3SC0vdFHxUO6l1tVNiwuMvSM4L1s7qSBW54dFuePgvg5rWtWRhYhzBRhPDrDwBSZ7XrV5K7yiSv0nXwjGwBSxuC2L7pOQ0TbZdVx82YMlAFdidqaKIR8zl11fjINTYHYLiBA9OYGoaQ9mEZ%2BeLU9q4zZxBeIVBNGKjMKLMnW9uxyC3Ta4DzEzUQ7XVLqjm80m9%2BWxPTj5WVDUz9N3YmqVEq7%2FrYHba1Ah126KOxPqofe5LJOMakKDvqPpi%2FTt2G2PsVGpZUXX7BReo22HJn4E9lBQfgRN1%2Fxg%3D--Af2b5bIsduzPDDsA--XcMk%2F%2B5m%2BD3zUhPyj8fPQQ%3D%3D
discourse-logged-in: true
discourse-present: true
origin: https://boards.straightdope.com
pragma: no-cache
referer: https://boards.straightdope.com/t/trolls-r-us-resurrections/950518/1915
sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="102", "Google Chrome";v="102"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
sec-fetch-dest: empty
sec-fetch-mode: cors
sec-fetch-site: same-origin
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36
x-csrf-token: DH8FyPkLH2FwcJXAaIjzf0CH8hy3VnE2KZT8xFh3g652xD9cUmoxdDUHULf0vj1Mx1k3nfA_x_U-OBDdnSR5hQ
x-requested-with: XMLHttpRequest
*/