Skip to content

Instantly share code, notes, and snippets.

@tpoisseau
Last active November 23, 2018 11:52
Show Gist options
  • Save tpoisseau/973e575b8ec812830c66c915120ae78c to your computer and use it in GitHub Desktop.
Save tpoisseau/973e575b8ec812830c66c915120ae78c to your computer and use it in GitHub Desktop.
listen cheat code on web page
/**
* @namespace registerCheatCode
*/
/**
* @typedef {object} registerCheatCode~api
* @property {registerCheatCode~api~on} on
* @property {registerCheatCode~api~remove} remove
* @property {registerCheatCode~api~register} register
*/
/**
* @callback registerCheatCode~api~on
* @param {EventListener} listener
* @return {registerCheatCode~api}
*/
/**
* @callback registerCheatCode~api~remove
* @return {registerCheatCode~api}
*/
/**
* @callback registerCheatCode~api~register
* @return {registerCheatCode~api}
*/
/**
* @function registerCheatCode
* @param {string} name - cheat code name
* @param {string[]} sequence - cheat code sequence
* @return {{on: function(function), listener: function}} minimal object for listen cheatcode finish
* @example
* registerCheatCode('konami_code', [
* 'ArrowUp', 'ArrowUp',
* 'ArrowDown', 'ArrowDown',
* 'ArrowLeft', 'ArrowRight',
* 'ArrowLeft', 'ArrowRight',
* 'b', 'a',
* ]).on(evt => alert('Great! Your good enougth for enter konami code.'))
*/
function registerCheatCode(name, sequence) {
let progress = 0;
const listener = ({key}) => {
if (sequence[progress] === key) {
if (++progress < sequence.length) return
window.dispatchEvent(new CustomEvent(name, {detail: listener}))
}
progress = 0
}
const onListeners = []
const api = {
on(cheatListener) {
onListeners.push(cheatListener)
window.addEventListener(name, cheatListener)
return api
},
remove() {
window.removeEventListener('keyup', listener)
let cl;
while (cl = onListeners.pop()) {
window.removeEventListener(name, cl)
}
return api
},
register() {
progress = 0
window.addEventListener('keyup', listener)
return api
}
}
return api.register()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment