Created
April 3, 2022 21:03
-
-
Save disco0/49ab09cc90355f0ed0a56b09ebf9b635 to your computer and use it in GitHub Desktop.
TwitterLiveFeed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
///<reference types="typed-query-selector"/> | |
///<reference types="typed-query-selector/parser"/> | |
///<reference path="./xpath-text-search.d.ts"/> | |
///<reference types="mousetrap"/> | |
// ==UserScript== | |
// @name TwitterLiveFeed | |
// @author disk0 | |
// @description Force Twitter feed to display latest tweets | |
// @version 0.2.1 | |
// @run-at document-idle | |
// @namespace disc0/github/TwitterLiveFeed | |
// @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAAGQCAYAAACAvzbMAAAEHWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS41LWMwMTEgNzkuMTQ5NTk4LCAyMDEyLzEwLzEwLTEyOjA5OjU2ICAgICAgICAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6bnMxPSJodHRwOi8vd3d3LmRheS5jb20vZGFtLzEuMCIKICAgIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIgogICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICBuczE6UGh5c2ljYWxoZWlnaHRpbmluY2hlcz0iLTEuMCIKICAgbnMxOlBoeXNpY2Fsd2lkdGhpbmluY2hlcz0iLTEuMCIKICAgbnMxOkZpbGVmb3JtYXQ9IlBORyIKICAgbnMxOlByb2dyZXNzaXZlPSJubyIKICAgbnMxOmV4dHJhY3RlZD0iMjAxNy0xMS0xOVQwMzozMDoyMy4wODJaIgogICBuczE6Qml0c3BlcnBpeGVsPSIzMiIKICAgbnMxOk1JTUV0eXBlPSJpbWFnZS9wbmciCiAgIG5zMTpDb21tZW50cz0iU29mdHdhcmU6IEFkb2JlIEltYWdlUmVhZHkmI3hBOyIKICAgbnMxOlBoeXNpY2Fsd2lkdGhpbmRwaT0iLTEiCiAgIG5zMTpQaHlzaWNhbGhlaWdodGluZHBpPSItMSIKICAgbnMxOk51bWJlcm9maW1hZ2VzPSIxIgogICBuczE6TnVtYmVyb2Z0ZXh0dWFsY29tbWVudHM9IjEiCiAgIG5zMTpzaGExPSJhY2MzNjQ5NDYwNzdiMGUzMmIyMzQzNDc0Y2U0MDY2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 | |
// @match https://*.twitter.com/* | |
// @match https://twitter.com/* | |
// @grant GM_info | |
// @grant GM_addStyle | |
// @grant GM_getValue | |
// @grant GM_setValue | |
// @grant GM_registerMenuCommand | |
// @grant GM_unregisterMenuCommand | |
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js | |
// @require https://gist.github.com/raw/2625891/waitForKeyElements.js | |
// ==/UserScript== | |
// Simple | |
//(()=>{let d=document,qs=(s,o=d)=>o.querySelector(s);[qs(`[aria-label="Top Tweets on"]`)].forEach(_=>{_.click();qs(`[role="menu"] [role="menuitem"]`).click();})})() | |
// Overkill | |
(async () => { | |
function isHTMLElement(obj) { return (!!obj) && obj instanceof HTMLElement; } | |
//#region Log | |
class StyledLog { | |
headerText; | |
headerArgs = []; | |
get headerSpread() { return [this.headerText, ...this.headerArgs]; } | |
get header() { return { text: this.headerText, args: this.headerArgs }; } | |
constructor(headerText = '', ...headerArgs) { | |
this.headerText = headerText; | |
Object.assign(this, { headerArgs }); | |
} | |
info = (...msg) => console.info(...(msg.length === 0) | |
? this.headerSpread : | |
(typeof msg[0] === 'string') | |
? [`${this.header.text} ${msg[0]}`, ...this.header.args, ...(msg.length > 1) ? msg.slice(1) : []] | |
: [...this.headerSpread, ...msg]); | |
log = (...msg) => console.log(...(msg.length === 0) | |
? this.headerSpread : | |
(typeof msg[0] === 'string') | |
? [`${this.header.text} ${msg[0]}`, ...this.header.args, ...(msg.length > 1) ? msg.slice(1) : []] | |
: [...this.headerSpread, ...msg]); | |
debug = (...msg) => console.debug(...(msg.length === 0) | |
? this.headerSpread : | |
(typeof msg[0] === 'string') | |
? [`${this.header.text} ${msg[0]}`, ...this.header.args, ...(msg.length > 1) ? msg.slice(1) : []] | |
: [...this.headerSpread, ...msg]); | |
warn = (...msg) => console.warn(...(msg.length === 0) | |
? this.headerSpread : | |
(typeof msg[0] === 'string') | |
? [`${this.header.text} ${msg[0]}`, ...this.header.args, ...(msg.length > 1) ? msg.slice(1) : []] | |
: [...this.headerSpread, ...msg]); | |
} | |
const log = new StyledLog(`%c[TwitterLiveFeed]%c`, `background: #44AAFF; color: white; padding: 0.2em 0.25em; margin-bottom: 0.15em; border-radius: 0.15em;`, ''); | |
function consoleGroupScope(...args) { | |
let fn, name; | |
if (typeof args[0] === 'string') { | |
[name, fn] = args; | |
} | |
else { | |
[fn, name = ""] = args; | |
} | |
try { | |
console.group(name); | |
fn(); | |
} | |
catch (error) { | |
console.warn(`Caught in console group wrapper: ${error}`); | |
} | |
finally { | |
console.groupEnd(); | |
} | |
} | |
//#region Userscript Info | |
class Script { | |
static namespace = "TwitterUtil"; | |
static settingsname = "TwitterUtil"; | |
//#region GM Value Controls | |
static AutoFixDisabledValueKey = 'autofix-disabled'; | |
static get AutoFixDisabledState() { | |
return GM_getValue(Script.AutoFixDisabledValueKey, false); | |
} | |
static ToggleDisableLiveFeedUpdate() { | |
log.debug(`Toggling automatic fixes`); | |
GM_setValue(Script.AutoFixDisabledValueKey, !Script.AutoFixDisabledState); | |
log.info(`Redrawing menu`); | |
Script.GM_Menubar_AutoFixState.update(); | |
} | |
static FixTotalValueKey = 'autofix-total'; | |
static get FixTotal() { | |
// No value returned implies no past changes | |
return ((value = 0) => { | |
// Idiot check | |
if (Number.isInteger(value)) | |
return value; | |
// Write warning if invalid | |
log.warn(`Read invalid value from storage (value: ${typeof value} => ${String(value)})`); | |
return 0; | |
})(GM_getValue(Script.FixTotalValueKey, 0)); | |
} | |
static IncrementFixTotal() { | |
const value = Script.FixTotal + 1; | |
GM_setValue(Script.FixTotalValueKey, value); | |
log.info(`Total timeline adjustments: ${value}`); | |
log.info(`Redrawing menu`); | |
Script.GM_Menubar_FixTotalView.update(); | |
} | |
//#endregion GM Value Controls | |
//#region GM Menubar Items | |
static GM_Menubar_AutoFixState = new class { | |
menuItemId; | |
constructor() { | |
this.menuItemId = this.update(); | |
} | |
update() { | |
// Remove existing display on repeat updates | |
if (typeof this.menuItemId === 'number') | |
GM_unregisterMenuCommand(this.menuItemId); | |
this.menuItemId = GM_registerMenuCommand((Script.AutoFixDisabledState | |
? `Disabled` | |
: `Enabled`), () => log.debug(`Info menu item no-op`)); | |
return this.menuItemId; | |
} | |
}; | |
static GM_Menubar_ToggleAutoFixState = new class { | |
menuItemId = GM_registerMenuCommand('Toggle automatic feed fixes', () => Script.ToggleDisableLiveFeedUpdate()); | |
}; | |
//#endregion GM Menubar Items | |
static GM_Menubar_FixTotalView = new class { | |
menuItemId; | |
constructor() { | |
this.menuItemId = this.update(); | |
} | |
update() { | |
// Remove existing display on repeat updates | |
if (typeof this.menuItemId === 'number') | |
GM_unregisterMenuCommand(this.menuItemId); | |
this.menuItemId = GM_registerMenuCommand(`Total Feed Fixes: ${Script.FixTotal}`, () => log.debug(`Info menu item no-op`)); | |
return this.menuItemId; | |
} | |
}; | |
static async run() { | |
// var menuHide = GM_registerMenuCommand( 'Force Twitter Live Feed', | |
// Main.toggleForceliveFeed ); | |
// consoleGroupScope('TwitterLiveFeed', async () => { await checkPage() }) | |
checkPage(); | |
} | |
} | |
//#endregion Userscript Info | |
const checkPage = async () => { | |
// Element selectors used to target/navigate page | |
const headerSel = `[data-testid="primaryColumn"] h2[aria-level="2"][role="heading"]`; | |
const menuSel = `div[aria-label="Top Tweets on"]`; | |
const buttonSel = `#layers [role="menu"] div[role="menuitem"]`; | |
// Store clicked state to avoid phantom second click | |
let clicked = false; | |
const clickLog = (...args) => { | |
const msg = typeof args[0] === 'string' | |
? args[0] | |
: 'Clicking element:'; | |
const el = args.slice(-1)[0]; | |
log.log(`${msg}\n%o`, el); | |
el.click(); | |
}; | |
const clickTimelineButton = async (el) => { | |
if (clicked) { | |
log.info(`Skipping clicking timeline menu button, clicked state has already been set.`); | |
return; | |
} | |
try { | |
clickLog(`Clicking timeline menu button:`, el); | |
clicked = true; | |
Script.IncrementFixTotal(); | |
} | |
catch (error) { | |
log.warn(`Error clicking timeline menu button element:\n%o`, error); | |
} | |
finally { | |
try { | |
const buttonEl = await waitSelector(buttonSel); | |
if (!buttonEl) { | |
log.warn(`Timeline update button not found`); | |
return; | |
} | |
clickLog(`Clicking latest tweets view button:`, buttonEl); | |
} | |
catch (error) { | |
log.warn(`Latest tweets view apply button not found. Error:\n%o`, error); | |
} | |
} | |
}; | |
const waitSelector = function (selector, timeout = 2000) { | |
return new Promise((resolve, reject) => { | |
const startTimeout = () => setTimeout(() => reject(), timeout); | |
if (typeof selector === 'undefined') | |
startTimeout(); | |
const waitForElement = function () { | |
const element = document.querySelector(selector); | |
if (element) | |
resolve(element); | |
else | |
window.requestAnimationFrame(waitForElement); | |
}; | |
startTimeout(); | |
waitForElement(); | |
}); | |
}; | |
const updateTimeline = async (headerEl = document.querySelector(headerSel)) => { | |
log.debug(`Heading Element:\n`, headerEl); | |
if (headerEl.textContent !== `Latest Tweets`) { | |
try { | |
const timelineButtonEl = await waitSelector(menuSel); | |
if (!timelineButtonEl) { | |
log.warn(`No value received from waitSelector for timeline element.`); | |
return; | |
} | |
else if (!isHTMLElement(timelineButtonEl)) { | |
log.warn(`Returned timeline element value is not an HTMLElement instance.`); | |
return; | |
} | |
else | |
clickTimelineButton(timelineButtonEl); | |
} | |
catch (error) { | |
log.warn(`Error thrown while searching for timeline button: ${error}`); | |
return; | |
} | |
} | |
else { | |
log.debug(`Already viewing latest tweets`); | |
return; | |
} | |
}; | |
try { | |
log.debug(`Waiting to check for header selector`); | |
const headerEl = await waitSelector(headerSel); | |
if (!headerEl) | |
return; | |
await updateTimeline(headerEl); | |
} | |
catch (error) { | |
log.warn(`Error thrown, timeline header element not found:\n%o`, error); | |
} | |
}; | |
await Script.run(); | |
})(); | |
//# sourceMappingURL=TwitterLiveFeed.js.map |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment