From 57b60e9128caf823524836306da55b4a407f2a9a Mon Sep 17 00:00:00 2001 From: Aevann Date: Wed, 4 Oct 2023 22:02:53 +0300 Subject: [PATCH] stop online and typing from hanging --- files/assets/js/chat.js | 25 +++++++++++++++++-------- files/routes/chat.py | 39 +++++++++++++++++++++++++-------------- 2 files changed, 42 insertions(+), 22 deletions(-) diff --git a/files/assets/js/chat.js b/files/assets/js/chat.js index 266e0554ae..8b2835197d 100644 --- a/files/assets/js/chat.js +++ b/files/assets/js/chat.js @@ -186,22 +186,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') @@ -311,6 +314,12 @@ document.onpaste = function(event) { handle_files() } +function send_hearbeat() { + socket.emit('heartbeat') +} +send_hearbeat() +setInterval(send_hearbeat, 3600000); + 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 71ad6d0742..6e722a9e33 100644 --- a/files/routes/chat.py +++ b/files/routes/chat.py @@ -39,7 +39,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) @@ -194,14 +194,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) @socketio.on('connect') @auth_required_socketio @@ -215,20 +217,19 @@ 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() - emit('typing', typing[g.referrer], room=g.referrer) return '', 204 + + @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 g.referrer not in ALLOWED_REFERRERS: return '', 400 @@ -240,6 +241,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):