TornAPI Quick Fill

Prefill API key and check 'pretty' radio buttons.

// ==UserScript==
// @name         TornAPI Quick Fill
// @namespace    TornTos
// @version      2.3
// @description  Prefill API key and check 'pretty' radio buttons.
//               Makes available fields clickable and fires try it button when clicked.
//               Ctrl-Click to add multiple selections, try-it button will need to be click manually with this method.
// @author       tos
// @match       *.torn.com/api.html*
// @grant        GM_addStyle
// ==/UserScript==

const keyup = new Event('keyup')
let APIkey = localStorage.getItem('x_apikey') || ''

GM_addStyle(`
span.click_select {
  cursor: pointer;
}
#save_api_key {
  margin: 0em 0.5em;
}
`)

const sections = {
  u: `https://api.torn.com/user/?selections=lookup&key=`,
  p: `https://api.torn.com/property/?selections=lookup&key=`,
  f: `https://api.torn.com/faction/?selections=lookup&key=`,
  c: `https://api.torn.com/company/?selections=lookup&key=`,
  i: `https://api.torn.com/market/?selections=lookup&key=`,
  t: `https://api.torn.com/torn/?selections=lookup&key=`
}

const fill_selections = async () => {
  for (const s in sections) {
    const res = await fetch(sections[s]+APIkey).then(r => r.json())
    document.querySelector(`p.${s}_fields`).innerHTML = `<small><strong>Available fields: </strong><span class="click_select">${res.selections.join('</span>, <span class="click_select">')}</span></small>`
  }
  document.querySelectorAll('span.click_select').forEach((span) => {
    span.addEventListener('click', (e) => {
      const panel = e.target.closest('div.panel-group')
      const selections_input = panel.querySelector('input[id*=selections]')
      if (e.ctrlKey) {
        if (selections_input.value === '') selections_input.value = e.target.innerText
        else selections_input.value += ','+e.target.innerText
      }
      else {
        selections_input.value = e.target.innerText
        panel.querySelector('BUTTON').click()
      }
      selections_input.dispatchEvent(keyup)
    })
  })
}


document.getElementById('documentation').style.display = 'none'
document.getElementById('demo').style.display = 'block'
$('#api_key').unbind('focusout')
$('.updateURL').unbind('keyup')
const api_key_input = document.getElementById('api_key')
api_key_input.value = APIkey
api_key_input.insertAdjacentHTML('afterend', `<button id="save_api_key">Save</button>`)
const save_button = document.querySelector('#save_api_key')
save_button.addEventListener('click', (e) => {
  APIkey = api_key_input.value
  localStorage.setItem('x_apikey', APIkey)
})
document.querySelectorAll('input[type=radio][value=pretty]').forEach((radio) => {radio.checked = true})
document.querySelectorAll('input[id*=id],input[id*=selections]').forEach((input) => {
  input.addEventListener('keyup', (e)=> {
    const panel = e.target.closest('div.panel-group')
    const url_shown = document.querySelector(`#${e.target.getAttribute('data-field')}url`)
    const url_split = url_shown.innerText.split('/')
    url_split[4] = `${panel.querySelector('input[id*=id]').value}?selections=${panel.querySelector('input[id*=selections]').value}&key=`
    url_shown.innerText = url_split.join('/')
  })
})

document.querySelectorAll('BUTTON.btn').forEach(try_it_button => try_it_button.addEventListener('click', (e) => {
  e.target.parentElement.querySelector('div[class$=_result]').innerHTML = '' //fix for site adding a new panel every request
}))

fill_selections()