| @@ -0,0 +1,227 @@ | |||
| interface Keybind | |||
| { | |||
| functionName: string; | |||
| displayName: string | null; | |||
| callback: Function; | |||
| modifiedCallback: Function | null; | |||
| } | |||
| const keybinds: Keybind[] = [ | |||
| { | |||
| functionName: 'move', | |||
| displayName: null, | |||
| callback: () => { | |||
| const moveButton: HTMLButtonElement = document.querySelector('button[name=move_region]') as HTMLButtonElement; | |||
| if (moveButton) | |||
| moveButton.click(); | |||
| }, | |||
| modifiedCallback: null | |||
| }, | |||
| { | |||
| functionName: 'endorse', | |||
| displayName: null, | |||
| callback: () => { | |||
| const endorseButton: HTMLButtonElement = (document.querySelector('button[class="endorse button icon wa"]') as HTMLButtonElement); | |||
| if (endorseButton) | |||
| endorseButton.click(); | |||
| }, | |||
| modifiedCallback: async () => { | |||
| if (urlParams['view'] === `region.${await getStorageValue('jp')}`) { | |||
| const nationsToEndorse: string[] = []; | |||
| const lis: NodeList = document.querySelectorAll('li'); | |||
| for (let i = 0; i < lis.length; i++) { | |||
| const li: HTMLUListElement = lis[i] as HTMLUListElement; | |||
| const nationName: string = canonicalize(li.querySelector('.nnameblock').innerHTML); | |||
| if (li.innerHTML.indexOf('was admitted') !== -1) | |||
| nationsToEndorse.push(nationName); | |||
| else if (li.innerHTML.indexOf('resigned') !== -1) | |||
| nationsToEndorse.splice(nationsToEndorse.indexOf(nationName), 1); | |||
| } | |||
| await setStorageValue('nationstoendorse', nationsToEndorse); | |||
| if (nationsToEndorse.length > 0) | |||
| window.location.href = `/template-overall=none/nation=${nationsToEndorse[0]}`; | |||
| } | |||
| else if (urlParams['nation']) { | |||
| let nationsToEndorse: string[] = await getStorageValue('nationstoendorse'); | |||
| const endorseButton: HTMLButtonElement = (document.querySelector('button[class="endorse button icon wa"]') as HTMLButtonElement); | |||
| if (endorseButton && (nationsToEndorse.indexOf(urlParams['nation']) !== -1)) | |||
| endorseButton.click(); | |||
| else if (nationsToEndorse.indexOf(urlParams['nation']) !== -1) { | |||
| const nextNation: string = nationsToEndorse[nationsToEndorse.indexOf(urlParams['nation']) + 1]; | |||
| if (!nextNation) | |||
| return; | |||
| nationsToEndorse.splice(nationsToEndorse.indexOf(urlParams['nation']), 1); | |||
| await setStorageValue('nationstoendorse', nationsToEndorse); | |||
| window.location.href = `/template-overall=none/nation=${nextNation}`; | |||
| } | |||
| } | |||
| } | |||
| }, | |||
| { | |||
| functionName: 'refresh', | |||
| displayName: null, | |||
| callback: () => { | |||
| location.reload(); | |||
| }, | |||
| modifiedCallback: null | |||
| }, | |||
| { | |||
| functionName: 'dossier', | |||
| displayName: null, | |||
| callback: () => { | |||
| const dossierButton: HTMLButtonElement = document.querySelector('button[value=add]') as HTMLButtonElement; | |||
| if (dossierButton) | |||
| dossierButton.click(); | |||
| }, | |||
| modifiedCallback: async () => { | |||
| if (urlParams['view'] && (urlParams['view'] !== `region.${await getStorageValue('jp')}`)) { | |||
| const nationsToDossier: string[] = []; | |||
| const lis: NodeList = document.querySelectorAll('li'); | |||
| for (let i = 0; i < lis.length; i++) { | |||
| const li: HTMLUListElement = lis[i] as HTMLUListElement; | |||
| const nationName: string = canonicalize(li.querySelector('.nnameblock').innerHTML); | |||
| if (li.innerHTML.indexOf('was admitted') !== -1) | |||
| nationsToDossier.push(nationName); | |||
| else if (li.innerHTML.indexOf('resigned') !== -1) | |||
| nationsToDossier.splice(nationsToDossier.indexOf(nationName), 1); | |||
| } | |||
| await setStorageValue('nationstodossier', nationsToDossier); | |||
| if (nationsToDossier.length > 0) | |||
| window.location.href = `/template-overall=none/nation=${nationsToDossier[0]}`; | |||
| } | |||
| else if (urlParams['nation']) { | |||
| let nationsToDossier: string[] = await getStorageValue('nationstodossier'); | |||
| const dossierButton: HTMLButtonElement = document.querySelector('button[value=add]') as HTMLButtonElement; | |||
| if (dossierButton && (nationsToDossier.indexOf(urlParams['nation']) !== -1)) | |||
| dossierButton.click(); | |||
| else { | |||
| const nextNation: string = nationsToDossier[nationsToDossier.indexOf(urlParams['nation']) + 1]; | |||
| if (!nextNation) | |||
| return; | |||
| nationsToDossier.splice(nationsToDossier.indexOf(urlParams['nation']), 1); | |||
| await setStorageValue('nationstodossier', nationsToDossier); | |||
| window.location.href = `/template-overall=none/nation=${nextNation}`; | |||
| } | |||
| } | |||
| else if (urlParams['page'] === 'dossier') { | |||
| let nationsToDossier: string[] = await getStorageValue('nationstodossier'); | |||
| const currentNation: string = new RegExp('nation=(.+)$').exec((document.querySelector('.info > a') as HTMLAnchorElement).href)[1]; | |||
| const nextNation: string = nationsToDossier[nationsToDossier.indexOf(currentNation) + 1]; | |||
| if (!nextNation) | |||
| return; | |||
| nationsToDossier.splice(nationsToDossier.indexOf(currentNation), 1); | |||
| await setStorageValue('nationstodossier', nationsToDossier); | |||
| window.location.href = `/template-overall=none/nation=${nextNation}`; | |||
| } | |||
| } | |||
| }, | |||
| { | |||
| functionName: 'backtojp', | |||
| displayName: "Move Back to Jump Point", | |||
| callback: async () => { | |||
| const moveButton: HTMLButtonElement = document.querySelector('button[name=move_region]') as HTMLButtonElement; | |||
| const jumpPoint: string = await getStorageValue('jp'); | |||
| if ((urlParams['region'] === jumpPoint) && moveButton) | |||
| moveButton.click(); | |||
| else if (!(urlParams['region'] === jumpPoint)) | |||
| window.location.href = `/template-overall=none/region=${jumpPoint}`; | |||
| }, | |||
| modifiedCallback: null | |||
| }, | |||
| { | |||
| functionName: 'endodel', | |||
| displayName: "Endorse WA Delegate", | |||
| callback: () => { | |||
| const delegate: HTMLAnchorElement = document.querySelector('#regioncontent > p:nth-child(1) > a') as HTMLAnchorElement; | |||
| if (urlParams['region']) | |||
| delegate.click(); | |||
| else if (urlParams['nation']) { | |||
| const endorseButton: HTMLButtonElement = (document.querySelector('button[class="endorse button icon wa"]') as HTMLButtonElement); | |||
| if (endorseButton) | |||
| endorseButton.click(); | |||
| } | |||
| }, | |||
| modifiedCallback: null | |||
| }, | |||
| { | |||
| functionName: 'checkifupdated', | |||
| displayName: "Check If Your Nation Updated", | |||
| callback: () => { | |||
| window.location.href = '/page=ajax2/a=reports/view=self/filter=change/'; | |||
| }, | |||
| modifiedCallback: null | |||
| }, | |||
| { | |||
| functionName: 'toggletemplate', | |||
| displayName: "Toggle Template", | |||
| callback: () => { | |||
| if (urlParams['template-overall']) | |||
| window.location.href = document.URL.replace('template-overall=none/', ''); | |||
| else | |||
| window.location.href = `/template-overall=none/${document.URL.replace('https://www.nationstates.net/', '')}`; | |||
| }, | |||
| modifiedCallback: null | |||
| }, | |||
| { | |||
| functionName: 'activitypage', | |||
| displayName: "Open Activity Page", | |||
| callback: () => { | |||
| window.location.href = '/page=activity/view=world/filter=move+member+endo'; | |||
| }, | |||
| modifiedCallback: null | |||
| }, | |||
| { | |||
| functionName: 'appointro', | |||
| displayName: "Appoint As Regional Officer", | |||
| callback: () => {}, | |||
| modifiedCallback: null | |||
| }, | |||
| { | |||
| functionName: 'reports', | |||
| displayName: "Open Reports Page", | |||
| callback: () => { | |||
| window.location.href = '/template-overall=none/page=reports'; | |||
| }, | |||
| modifiedCallback: null | |||
| }, | |||
| { | |||
| functionName: 'regionajax', | |||
| displayName: "Open Region Ajax2 Page", | |||
| callback: () => { | |||
| if (urlParams['region']) | |||
| window.location.href = `/page=ajax2/a=reports/view=region.${urlParams['region']}/filter=move+member+endo`; | |||
| }, | |||
| modifiedCallback: null | |||
| } | |||
| ]; | |||
| let keyFunctions: object = {}; | |||
| const urlParams: object = getUrlParameters(document.URL); | |||
| document.addEventListener('keyup', (e: KeyboardEvent) => | |||
| { | |||
| const textboxSelected: boolean = document.querySelector('input:focus, textarea:focus') !== null; | |||
| const key = e.key.toUpperCase(); | |||
| if (e.altKey || e.ctrlKey || textboxSelected) | |||
| return; | |||
| else if (e.shiftKey && (key in keyFunctions) && (keyFunctions[key].modifiedCallback !== null)) | |||
| keyFunctions[key].modifiedCallback(); | |||
| else if (key in keyFunctions) | |||
| keyFunctions[key].callback(); | |||
| }); | |||
| (async () => | |||
| { | |||
| for (let i = 0; i < keybinds.length; i++) { | |||
| const currentKeybind: Keybind = keybinds[i]; | |||
| keyFunctions[await getStorageValue(currentKeybind.functionName)] = { | |||
| callback: currentKeybind.callback, | |||
| modifiedCallback: currentKeybind.modifiedCallback | |||
| }; | |||
| } | |||
| // Set up some default values for settings if they aren't set | |||
| if (await getStorageValue('jp') === undefined) | |||
| await setStorageValue('jp', 'artificial_solar_system'); | |||
| if (await getStorageValue('nationstoendorse') === undefined) | |||
| await setStorageValue('nationstoendorse', []); | |||
| })(); | |||