From b0e501b51b761ef58f79ca4766f3dbc7ee7d1f53 Mon Sep 17 00:00:00 2001 From: Aevann Date: Sat, 7 Oct 2023 13:54:21 +0300 Subject: [PATCH] restore heartbeat to remove online hangovers (especially after orgy) https://i.imgur.com/LLxlpY4.png --- files/assets/js/chat.js | 25 +++++++++++++++++-------- files/routes/chat.py | 41 +++++++++++++++++++++++++---------------- 2 files changed, 42 insertions(+), 24 deletions(-) diff --git a/files/assets/js/chat.js b/files/assets/js/chat.js index f7ec14625..d390f7d4f 100644 --- a/files/assets/js/chat.js +++ b/files/assets/js/chat.js @@ -188,22 +188,25 @@ ta.addEventListener("keydown", function(e) { }) socket.on('online', function(data){ - document.getElementsByClassName('board-chat-count')[0].innerHTML = data[0].length - document.getElementById('chat-count-header-bar').innerHTML = data[0].length + const online_li = Object.entries(data[0]) + const muted_li = Object.keys(data[1]) + + document.getElementsByClassName('board-chat-count')[0].innerHTML = online_li.length + document.getElementById('chat-count-header-bar').innerHTML = online_li.length const admin_level = parseInt(document.getElementById('admin_level').value) let online = '' let online2 = 'Users Online' - for (const u of data[0]) + for (const [k, val] of online_li) { let patron = '' - if (u[3]) - patron = ` class="patron" style="background-color:#${u[2]}"` + if (val[3]) + patron = ` class="patron" style="background-color:#${val[2]}"` online += `
  • ` - if (admin_level && Object.keys(data[1]).includes(u[1].toLowerCase())) + if (admin_level && muted_li.includes(val[1].toLowerCase())) online += 'X ' - online += `${u[1]}
  • ` - online2 += `
    @${u[1]}` + online += `${val[1]}` + online2 += `
    @${val[1]}` } const online_el = document.getElementById('online') @@ -314,6 +317,12 @@ document.onpaste = function(event) { handle_files() } +function send_hearbeat() { + socket.emit('heartbeat') +} +send_hearbeat() +setInterval(send_hearbeat, 5000); + box.scrollTo(0, box.scrollHeight) setTimeout(function () { box.scrollTo(0, box.scrollHeight) diff --git a/files/routes/chat.py b/files/routes/chat.py index 250c54876..7599cd338 100644 --- a/files/routes/chat.py +++ b/files/routes/chat.py @@ -40,7 +40,7 @@ typing = { f'{SITE_FULL}/chat': [], } online = { - f'{SITE_FULL}/chat': [], + f'{SITE_FULL}/chat': {}, } cache.set('loggedin_chat', len(online[f'{SITE_FULL}/chat']), timeout=0) @@ -199,17 +199,16 @@ def speak(data, v): return '', 204 def refresh_online(): + for li in online.values(): + for entry in li.values(): + if time.time() > entry[0]: + del li[entry] + if entry[1] in typing[g.referrer]: + typing[g.referrer].remove(entry[1]) + emit("online", [online[g.referrer], muted], room=g.referrer, broadcast=True) cache.set('loggedin_chat', len(online[f'{SITE_FULL}/chat']), timeout=0) -def remove_from_online(v): - for li in online.values(): - for entry in li: - if entry[0] == v.id: - li.remove(entry) - if g.referrer and v.username in typing[g.referrer]: - typing[g.referrer].remove(v.username) - @socketio.on('connect') @auth_required_socketio def connect(v): @@ -222,11 +221,8 @@ def connect(v): join_room(g.referrer) - remove_from_online(v) - - online[g.referrer].append([v.id, v.username, v.name_color, v.patron]) - - refresh_online() + if v.username in typing[g.referrer]: + typing[g.referrer].remove(v.username) emit('typing', typing[g.referrer], room=g.referrer) return '', 204 @@ -234,8 +230,11 @@ def connect(v): @socketio.on('disconnect') @auth_required_socketio def disconnect(v): - if g.referrer != f'{SITE_FULL}/notifications/messages': - remove_from_online(v) + for dictionary in online.values(): + dictionary.pop(v.id, None) + + if v.username in typing[g.referrer]: + typing[g.referrer].remove(v.username) if not g.referrer: return '', 400 @@ -247,6 +246,16 @@ def disconnect(v): return '', 204 +@socketio.on('heartbeat') +@auth_required_socketio +def heartbeat(v): + if g.referrer not in ALLOWED_REFERRERS: + return '', 400 + expire_utc = int(time.time()) + 3610 + online[g.referrer][v.id] = (expire_utc, v.username, v.name_color, v.patron) + refresh_online() + return '', 204 + @socketio.on('typing') @is_not_banned_socketio def typing_indicator(data, v):