diff --git a/assets/instance_buttons.js b/assets/instance_buttons.js index 71cf4c6..1cd4f1f 100644 --- a/assets/instance_buttons.js +++ b/assets/instance_buttons.js @@ -1,5 +1,7 @@ (function instance_buttons(){ + const SLOTS = 5; + const STORAGE_KEY = 'forget_known_instances'; const container = document.querySelector('#mastodon_instance_buttons'); @@ -20,19 +22,73 @@ known = await resp.json(); } else { - known = []; + known = [{ + "instance": "mastodon.social", + "hits": 0 + }]; } - localStorage.setItem(STORAGE_KEY, JSON.stringify(known)); + save(known) fetch('/api/known_instances', {method: 'DELETE'}) } return known; } + function normalize(known){ + /* + + move instances with the most hits to the top SLOTS slots, + making sure not to reorder anything that is already there + + */ + let head = known.slice(0, SLOTS); + let tail = known.slice(SLOTS); + + if(tail.length == 0){ + return known; + } + + for(let i = 0; i < SLOTS; i++){ + let head_min = head.reduce((acc, cur) => acc.hits < cur.hits ? acc : cur); + let tail_max = tail.reduce((acc, cur) => acc.hits > cur.hits ? acc : cur); + if(head_min.hits < tail_max.hits){ + // swappy + let i = head.indexOf(head_min); + let j = tail.indexOf(tail_max); + let buf = head[i]; + head[i] = tail[j]; + tail[j] = buf; + } + } + + return head.concat(tail) + } + + function save(known){ + localStorage.setItem(STORAGE_KEY, JSON.stringify(known)); + } + async function replace_buttons(){ let known = await get_known(); - let instances = known.concat(top_instances).slice(0, 5); + known = normalize(known); + save(known); + + let filtered_top_instances = [] + for(let instance of top_instances){ + let found = false; + for(let k of known){ + if(k['instance'] == instance){ + found = true; + break; + } + } + if(!found){ + filtered_top_instances.push(instance) + } + } + + let instances = known.concat(filtered_top_instances).slice(0, SLOTS); let html = '';