From e72e45c2b41cde8217c484b9c1a8a0753a5b79bc Mon Sep 17 00:00:00 2001 From: ninya9k Date: Thu, 15 Apr 2021 15:18:46 +0000 Subject: [PATCH] show broadcaster the list of banned users; undo bans; fix colour -> tag generation --- website/chat.py | 30 +++++++++++++--------- website/routes.py | 27 ++++++++++++++++---- website/static/platform.css | 4 +-- website/templates/chat-iframe.html | 37 +++++++++++++++++++++------ website/templates/index.html | 20 ++++++++------- website/templates/users-iframe.html | 39 +++++++++++++++++++++++------ website/utils/colour.py | 2 +- website/viewership.py | 22 +++++++++++----- 8 files changed, 131 insertions(+), 50 deletions(-) diff --git a/website/chat.py b/website/chat.py index 065ddb5..c9f6926 100644 --- a/website/chat.py +++ b/website/chat.py @@ -82,23 +82,29 @@ def comment(text, token, c_response, c_token, nonce): viewers[BROADCASTER_TOKEN]['verified'] = True return failure_reason -def mod(message_ids, hide, ban, ban_and_purge): +def mod_messages(message_ids, hide, ban, ban_and_purge): purge = ban_and_purge ban = ban_and_purge or ban - if ban: - banned = {message_id.split('-')[0] for message_id in message_ids} - for token in banned: - viewers[token]['banned'] = True + with viewership.lock: + if ban: + banned = {message_id.split('-')[0] for message_id in message_ids} + for token in banned: + viewers[token]['banned'] = True - for message in messages: - if hide and message['id'] in message_ids: - message['hidden'] = True - if purge and message['viewer']['token'] in banned: - message['hidden'] = True + for message in messages: + if hide and message['id'] in message_ids: + message['hidden'] = True + if purge and message['viewer']['token'] in banned: + message['hidden'] = True - viewership.setdefault(BROADCASTER_TOKEN) - viewers[BROADCASTER_TOKEN]['banned'] = False + viewership.setdefault(BROADCASTER_TOKEN) + viewers[BROADCASTER_TOKEN]['banned'] = False + +def mod_users(tokens, banned): + with viewership.lock: + for token in tokens: + viewers[token]['banned'] = banned def get_captcha(token): viewership.setdefault(token) diff --git a/website/routes.py b/website/routes.py index 4510e46..8d52b54 100644 --- a/website/routes.py +++ b/website/routes.py @@ -230,14 +230,24 @@ def settings(): viewership.preset_comment_iframe[token] = {'note': note, 'show_settings': True} return redirect(url_for('comment_iframe', token=token)) -# TODO: undo bans; undo hides; optionally show that a comment was hidden -@current_app.route('/mod', methods=['POST']) +# TODO: undo hides; optionally show that a comment was hidden; optionally show bans in chat +@current_app.route('/mod/messages', methods=['POST']) @current_app.auth.login_required -def mod(): +def mod_messages(): message_ids = request.form.getlist('message_id[]') - chat.mod(message_ids, request.form.get('hide'), request.form.get('ban'), request.form.get('ban_purge')) + chat.mod_messages(message_ids, request.form.get('hide'), request.form.get('ban'), request.form.get('ban_purge')) return f'
it is done
' +@current_app.route('/mod/users', methods=['POST']) +@current_app.auth.login_required +def mod_users(): + tokens = request.form.getlist('token[]') + banned = bool(request.form.get('banned', type=int)) + chat.mod_users(tokens, banned=banned) + + noscript = bool(request.form.get('noscript', type=int)) + return f'
it is done
' + @current_app.route('/stream-info') def stream_info(): token = get_token() @@ -263,7 +273,14 @@ def stream_info(): def users(): token = get_token() viewership.made_request(token) - return render_template('users-iframe.html', token=token, people=viewership.get_people_list(), default_nickname=viewership.default_nickname, broadcaster_colour=BROADCASTER_COLOUR, len=len) + return render_template('users-iframe.html', + token=token, + people=viewership.get_people_list(), + default_nickname=viewership.default_nickname, + broadcaster=token == BROADCASTER_TOKEN, + debug=request.args.get('debug'), + broadcaster_colour=BROADCASTER_COLOUR, + len=len) @current_app.route('/static/radial.apng') def radial(): diff --git a/website/static/platform.css b/website/static/platform.css index 44955c0..4b2618e 100644 --- a/website/static/platform.css +++ b/website/static/platform.css @@ -44,7 +44,7 @@ svg.users-logo { .chat-banner-left { float: left; width: 1em; - margin-top: 2px; + margin-top: 2px; /* wasn't centred vertically for some reason */ } .users-logo:hover { border-radius: 6px; @@ -112,4 +112,4 @@ body.dark-theme { e.g. https://raw.githubusercontent.com/33kk/uso-archive/flomaster/data/usercss/2154.user.css */ div[class="vjs-text-track-display"] { display: none; -} +} \ No newline at end of file diff --git a/website/templates/chat-iframe.html b/website/templates/chat-iframe.html index 7e5f86e..4d94438 100644 --- a/website/templates/chat-iframe.html +++ b/website/templates/chat-iframe.html @@ -63,7 +63,7 @@
{% if broadcaster %} -
+
@@ -98,21 +98,26 @@
Manual refresh required
+{% if broadcaster %} + +
+
+
+ + +
Banned ({{ len(people['banned']) }})
+
+ {% for person in people['banned'] %} +
+ {{ person['nickname'] or default_nickname(person['token']) }}{% with tag = person['nickname'] == None %}{% if tag %}{{ person['tag'] }}{% endif %}{% if person['tripcode']['string'] %}{% if tag %}{% endif %}
{{ person['tripcode']['string'] }}
{% endif %}{% endwith %} +
+ {% endfor %} +
+ +
+{% endif %}
- + \ No newline at end of file diff --git a/website/templates/index.html b/website/templates/index.html index e71da27..e4a0de8 100644 --- a/website/templates/index.html +++ b/website/templates/index.html @@ -31,6 +31,10 @@ #users-toggle:checked + .banner form[target="users"] { display: revert; } + /* noscript acting weird with svg */ + #svg-container { + display: none; + } @@ -38,6 +42,7 @@
+
@@ -96,11 +103,6 @@ replaceFrameURL("stream-info-container", "{{ url_for('stream_info', token=token) }}", "stream-info", ""); replaceFrameURL("chat-container", "{{ url_for('chat_iframe') }}?token={{ token }}&users=1", "chat", "chat"); - /* ensure that svg only appears when scripts are enabled */ - for ( element of document.querySelectorAll("svg") ) { - element.style.display = null; - } - const chat = document.getElementById("chat"); const usersToggle = document.getElementById("users-toggle"); usersToggle.onchange = function() { @@ -122,4 +124,4 @@ - \ No newline at end of file + diff --git a/website/templates/users-iframe.html b/website/templates/users-iframe.html index ba26ff8..b2e202e 100644 --- a/website/templates/users-iframe.html +++ b/website/templates/users-iframe.html @@ -1,8 +1,8 @@ - +{% if not debug %}{% endif %} - {% with broadcaster = people['broadcaster'] %} - {% if broadcaster %} + {% with person = people['broadcaster'] %} + {% if person %}
Broadcaster
- 🎥{{ broadcaster['nickname'] or default_nickname(broadcaster['token']) }}{% if broadcaster['tripcode']['string'] %}
{{ broadcaster['tripcode']['string'] }}
{% endif %} + 🎥{{ person['nickname'] or default_nickname(person['token']) }}{% if person['tripcode']['string'] %}
{{ person['tripcode']['string'] }}
{% endif %}
{% endif %} {% endwith %} +{% if broadcaster %} +
+ + +{% endif %}
Users watching ({{ len(people['watching']) }})
{% for person in people['watching'] %}
- {{ person['nickname'] or default_nickname(person['token']) }}{% with tag = person['nickname'] == None %}{% if tag %}{{ person['tag'] }}{% endif %}{% if person['tripcode']['string'] %}{% if tag %}{% endif %}
{{ person['tripcode']['string'] }}
{% endif %}{% endwith %}{% if person['token'] == token %}(You){% endif %} + {% if broadcaster %}{% endif %}{{ person['nickname'] or default_nickname(person['token']) }}{% with tag = person['nickname'] == None %}{% if tag %}{{ person['tag'] }}{% endif %}{% if person['tripcode']['string'] %}{% if tag %}{% endif %}
{{ person['tripcode']['string'] }}
{% endif %}{% endwith %}{% if person['token'] == token %}(You){% endif %}
{% endfor %}
@@ -43,9 +48,27 @@
Users not watching ({{ len(people['not_watching']) }})
{% for person in people['not_watching'] %}
- {{ person['nickname'] or default_nickname(person['token']) }}{% with tag = person['nickname'] == None %}{% if tag %}{{ person['tag'] }}{% endif %}{% if person['tripcode']['string'] %}{% if tag %}{% endif %}
{{ person['tripcode']['string'] }}
{% endif %}{% endwith %}{% if person['token'] == token %}(You){% endif %} + {% if broadcaster %}{% endif %}{{ person['nickname'] or default_nickname(person['token']) }}{% with tag = person['nickname'] == None %}{% if tag %}{{ person['tag'] }}{% endif %}{% if person['tripcode']['string'] %}{% if tag %}{% endif %}
{{ person['tripcode']['string'] }}
{% endif %}{% endwith %}{% if person['token'] == token %}(You){% endif %}
{% endfor %}
+{% if broadcaster %} + + +
+
+ + +
Banned ({{ len(people['banned']) }})
+
+ {% for person in people['banned'] %} +
+ {{ person['nickname'] or default_nickname(person['token']) }}{% with tag = person['nickname'] == None %}{% if tag %}{{ person['tag'] }}{% endif %}{% if person['tripcode']['string'] %}{% if tag %}{% endif %}
{{ person['tripcode']['string'] }}
{% endif %}{% endwith %} +
+ {% endfor %} +
+ +
+{% endif %} - + \ No newline at end of file diff --git a/website/utils/colour.py b/website/utils/colour.py index 29d2e88..6db0135 100644 --- a/website/utils/colour.py +++ b/website/utils/colour.py @@ -38,5 +38,5 @@ def gen_colour(seed, background=BACKGROUND_COLOUR, *avoid): return best_colour def tag(colour): - tag = ((colour[2] & 0xf0) >> 2) | ((colour[1] & 0xf0) >> 6) | ((colour[2] & 0xf0) >> 10) + tag = ((colour[2] & 0xf0) >> 4) | (colour[1] & 0xf0) | ((colour[0] & 0xf0) << 4) return f'#{tag:03x}' \ No newline at end of file diff --git a/website/viewership.py b/website/viewership.py index dbd783c..727e29f 100644 --- a/website/viewership.py +++ b/website/viewership.py @@ -28,6 +28,7 @@ def setdefault(token): return viewers[token] = {'token': token, 'last_comment': float('-inf'), + 'last_segment': float('-inf'), 'last_request': float('-inf'), 'first_request': float('-inf'), 'verified': False, @@ -62,11 +63,15 @@ def view_segment(n, token=None, check_exists=True): if check_exists and not os.path.isfile(os.path.join(SEGMENTS_DIR, f'stream{n}.m4s')): return + now = int(time.time()) with lock: - now = int(time.time()) segment_views.setdefault(n, []).append({'time': now, 'token': token}) if token: - made_request(token) + setdefault(token) + if viewers[token]['first_request'] == float('-inf'): + viewers[token]['first_request'] = now + viewers[token]['last_request'] = now + viewers[token]['last_segment'] = now print(f'seg{n}: {token}') #def count_site_tokens(): @@ -155,11 +160,16 @@ def get_people_list(): users = filter(lambda token: now - viewers[token]['last_request'] < 24, users) users = sorted(users, key=lambda token: viewers[token]['first_request']) - people = {'broadcaster': None, 'users': []} + people = {'broadcaster': None, 'watching': [], 'not_watching': [], 'banned': []} for token in users: - if viewers[token]['broadcaster']: - people['broadcaster'] = viewers[token] + person = viewers[token] + if person['broadcaster']: + people['broadcaster'] = person + elif now - person['last_segment'] < 24: + people['watching'].append(person) else: - people['users'].append(viewers[token]) + people['not_watching'].append(person) + if person['banned']: + people['banned'].append(person) return people