NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==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 */