BotBuster

Script anti-spam pour JVC

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey, Greasemonkey или Violentmonkey.

You will need to install an extension such as Tampermonkey to install this script.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Userscripts.

За да инсталирате скрипта, трябва да инсталирате разширение като Tampermonkey.

За да инсталирате този скрипт, трябва да имате инсталиран скриптов мениджър.

(Вече имам скриптов мениджър, искам да го инсталирам!)

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

(Вече имам инсталиран мениджър на стиловете, искам да го инсталирам!)

// ==UserScript==
// @name        BotBuster
// @namespace   hello://astrolopitheque.fr
// @author      astrolopitheque
// @description Script anti-spam pour JVC
// @version     1.2
// @icon        https://www.dropbox.com/s/5wiyryouux3padk/BotBusterIcon.png?raw=1
// @match       *://www.jeuxvideo.com/*
// @require     https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js
// @grant       GM.getValue
// @grant       GM.setValue
// @grant       GM.notification 
// ==/UserScript==

class LocalArray {
	constructor(key) {
  	this._key = key
  }
  async get() {
    let a
    try {
      a = JSON.parse(await GM.getValue(this._key))
    } catch(e){
      return []
    }
    return a
  }
  async set(array) {
  	await GM.setValue(this._key, JSON.stringify(array))
  }
  async push(value) {
  	const array = await this.get()
    if(!array.includes(value))
    	array.push(value)
    this.set(array)
  }
  async remove(value) {
  	const array = await this.get()
    const index = array.indexOf(value)
    if(index > -1)
      array.splice(index, 1)
    this.set(array)
  }
}

const getPseudo = () => {
	return $('.account-pseudo').first().text()
}

const createButton = (p) => {
 	const button = document.createElement('span')
 	button.classList.add('bot-buster-button')
 	button.setAttribute('title', 'BotBuster')
  button.setAttribute('pseudo', p)
 	return button
}

const addButtons = (pseudo) => {
  const pseudos = $('.bloc-pseudo-msg')
	$('.bloc-options-msg').each( (i, el) => {
    const p = pseudos.eq(i).text().trim()
    if( p !== pseudo )
			$(el).append( createButton(p) )
	})
}

const addOptions = async () => {
	await $.get( 'https://www.dropbox.com/s/ut7716l274nov1a/optionsHTML.txt?raw=1', function( data ) {
  	$('body').append(data)
	})
}

const showOptions = () => {
	$('#bot-buster-opt').css('display', 'block')
}

const hideOptions = () => {
	$('#bot-buster-opt').css('display', 'none')
}

const getInfos = async (pseudo, bl, wl) => {
	const blacklisted = (await bl.get()).includes(pseudo)
  const whitelisted = (await wl.get()).includes(pseudo)
  return {blacklisted, whitelisted}
}

const setUser = async (pseudo, bl, wl) => {
	$('#bot-buster-opt-pseudo').text(pseudo)
  $('.bot-buster-tab[tab="user"]').text(pseudo)
  const infos = await getInfos(pseudo, bl, wl)
  if(infos.blacklisted) {
    $('#bot-buster-bl-remove').css('display', 'inline-block')
    $('#bot-buster-bl-add').css('display', 'none')
  } else {
    $('#bot-buster-bl-add').css('display', 'inline-block')
  	$('#bot-buster-bl-remove').css('display', 'none')
  }
  if(infos.whitelisted) {
    $('#bot-buster-wl-remove').css('display', 'inline-block')
    $('#bot-buster-wl-add').css('display', 'none')
  } else {
    $('#bot-buster-wl-add').css('display', 'inline-block')
  	$('#bot-buster-wl-remove').css('display', 'none')
  }
}

const updateInfos = (bl, wl) => {
	setUser($('#bot-buster-opt-pseudo').text(), bl, wl)
  bl.get().then(b => {
    $('#bot-buster-blacklist-div').html('')
    b = b.sort()
    b.forEach(u => {
      $('#bot-buster-blacklist-div').append(`<div class="bot-buster-horizontal bot-buster-list-i"><p class="bot-buster-pseudo-i">${u}</p><button class="bot-buster-button-cross bot-buster-bl-remove">🗙</button></div>`)
    })
    $('.bot-buster-bl-remove').click(e => {
      const button = e.target,
            div    = $(button).parent()
            pseudo = div.find('p').first().text()
      bl.remove(pseudo).then(() => updateInfos(bl,wl))
  	})
  })
  wl.get().then(w => {
    $('#bot-buster-whitelist-div').html('')
    w = w.sort()
    w.forEach(u => {
      $('#bot-buster-whitelist-div').append(`<div class="bot-buster-horizontal bot-buster-list-i"><p class="bot-buster-pseudo-i">${u}</p><button class="bot-buster-button-cross bot-buster-wl-remove">🗙</button></div>`)
    })
    $('.bot-buster-wl-remove').click(e => {
      const button = e.target,
            div    = $(button).parent()
            pseudo = div.find('p').first().text()
      wl.remove(pseudo).then(() => updateInfos(bl,wl))
  	})
  })
}

const addStyle = () => {
  $('.bot-buster-button').css('width', '1rem')
  $('.bot-buster-button').css('height', '1rem')
  $('.bot-buster-button').css('display', 'inline-block')
  $('.bot-buster-button').css('background-image', 'url("https://www.dropbox.com/s/156xzh0bomvezdf/BotBusterButton.png?raw=1")')
}

const addEvents = (bl, wl) => {
	$('.bot-buster-button').click(e => {
    setUser($(e.target).attr('pseudo'), bl, wl)
  	showOptions()
  })
  $('#bot-buster-opt-close').click(() => {
  	hideOptions()
  })
  $('.bot-buster-tab').click(e => {
  	$('.bot-buster-tab.active').toggleClass('active')
    $(e.target).toggleClass('active')
    $('.bot-buster-tab-content').css('display', 'none')
    $('#bot-buster-opt-'+$(e.target).attr('tab')).css('display', 'block')
    updateInfos(bl, wl)
  })
  $('#bot-buster-bl-add').click(async () => {
    $('#bot-buster-bl-add').css('display', 'none')
  	const pseudo = $('#bot-buster-opt-pseudo').text()
    const infos = await getInfos(pseudo, bl, wl)
    if( infos.whitelisted ) {
      $('#bot-buster-wl-remove').css('display', 'none')
      wl.remove(pseudo)
    }
    await bl.push(pseudo)
    updateInfos(bl, wl)
  })
  $('#bot-buster-bl-remove').click(() => {
    $('#bot-buster-bl-remove').css('display', 'none')
  	const pseudo = $('#bot-buster-opt-pseudo').text()
    bl.remove(pseudo).then(() => updateInfos(bl, wl))
  })
  $('#bot-buster-wl-add').click( async () => {
    $('#bot-buster-wl-add').css('display', 'none')
  	const pseudo = $('#bot-buster-opt-pseudo').text()
    const infos = await getInfos(pseudo, bl, wl)
    if( infos.blacklisted ) {
      $('#bot-buster-bl-remove').css('display', 'none')
      bl.remove(pseudo)
    }
    await wl.push(pseudo)
    updateInfos(bl, wl)
  })
  $('#bot-buster-wl-remove').click(() => {
    $('#bot-buster-wl-remove').css('display', 'none')
    const pseudo = $('#bot-buster-opt-pseudo').text()
    wl.remove(pseudo).then(() => updateInfos(bl, wl))
  })
  $('#bot-buster-bl-form').submit(e => {
    e.preventDefault()
    const pseudo = $('#bot-buster-bl-input').val().trim()
    $('#bot-buster-bl-input').val('')
    if(pseudo) {
      bl.push(pseudo).then(() => updateInfos(bl,wl))
    }
  })
  $('#bot-buster-wl-form').submit(e => {
    e.preventDefault()
    const pseudo = $('#bot-buster-wl-input').val().trim()
    $('#bot-buster-wl-input').val('')
    if(pseudo) {
      wl.push(pseudo).then(() => updateInfos(bl,wl))
    }
  })
}

const waitForElement = (elementPath, callBack) => {
  window.setTimeout(function(){
    if($(elementPath).length){
      callBack($(elementPath));
    }else{
      waitForElement(elementPath, callBack);
    }
  },500)
}

const interceptMP = (bl,wl) => {
	const hasNotif = $('.jv-account-number-mp').hasClass('has-notif')
  if(hasNotif) return
  $('.jv-account-number-mp').click()
  $('.jv-account-number-mp').click()
  waitForElement('.jv-nav-dropdown-item', mps => {
  	waitForElement('.jv-nav-dropdown-author', async authors => {
  		for( let i = 0; i < mps.length; i++ ) {
      	const mp     = mps.eq(i),
              author = authors.eq(i).text().trim()
        const b = await bl.get()
        if(b.includes(author)) {
          mp.css('display', 'none')
        }
      }
  	})
  })
}

const initBuster = async () => {
  const bl = new LocalArray('bot-buster-blacklist')
  const wl = new LocalArray('bot-buster-whitelist')
  const pseudo = getPseudo()
	addButtons(pseudo)
  addStyle()
  await addOptions()
  addEvents(bl, wl)
  interceptMP(bl,wl)
}

initBuster()