forked from rDrama/rDrama
make /notifications/messages LIVE
parent
22121ab051
commit
e7ab0be33b
|
@ -13,43 +13,11 @@ const socket = io()
|
||||||
const chatline = document.getElementsByClassName('chat-line')[0]
|
const chatline = document.getElementsByClassName('chat-line')[0]
|
||||||
const box = document.getElementById('chat-window')
|
const box = document.getElementById('chat-window')
|
||||||
const ta = document.getElementById('input-text')
|
const ta = document.getElementById('input-text')
|
||||||
const icon = document.querySelector("link[rel~='icon']")
|
|
||||||
|
|
||||||
const vid = document.getElementById('vid').value
|
const vid = document.getElementById('vid').value
|
||||||
const site_name = document.getElementById('site_name').value
|
|
||||||
const slurreplacer = document.getElementById('slurreplacer').value
|
const slurreplacer = document.getElementById('slurreplacer').value
|
||||||
|
|
||||||
let notifs = 0;
|
|
||||||
let focused = true;
|
|
||||||
let is_typing = false;
|
let is_typing = false;
|
||||||
let alert=true;
|
|
||||||
|
|
||||||
function flash(){
|
|
||||||
let title = document.getElementsByTagName('title')[0]
|
|
||||||
if (notifs >= 1 && !focused){
|
|
||||||
title.innerHTML = `[+${notifs}] Chat`;
|
|
||||||
if (alert) {
|
|
||||||
icon.href = `/i/${site_name}/alert.ico?v=3009`
|
|
||||||
alert=false;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
icon.href = `/i/${site_name}/icon.webp?x=6`
|
|
||||||
alert=true;
|
|
||||||
}
|
|
||||||
setTimeout(flash, 500)
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
icon.href = `/i/${site_name}/icon.webp?x=6`
|
|
||||||
notifs = 0
|
|
||||||
title.innerHTML = 'Chat';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (is_typing) {
|
|
||||||
is_typing = false
|
|
||||||
socket.emit('typing', false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const blocked_user_ids = document.getElementById('blocked_user_ids').value.split(', ')
|
const blocked_user_ids = document.getElementById('blocked_user_ids').value.split(', ')
|
||||||
|
|
||||||
|
@ -77,7 +45,7 @@ socket.on('speak', function(json) {
|
||||||
|
|
||||||
notifs = notifs + 1;
|
notifs = notifs + 1;
|
||||||
if (notifs == 1) {
|
if (notifs == 1) {
|
||||||
setTimeout(flash, 500);
|
flash();
|
||||||
}
|
}
|
||||||
|
|
||||||
const users = document.getElementsByClassName('user_id');
|
const users = document.getElementsByClassName('user_id');
|
||||||
|
@ -247,12 +215,6 @@ socket.on('online', function(data){
|
||||||
bs_trigger(document.getElementById('online3'))
|
bs_trigger(document.getElementById('online3'))
|
||||||
})
|
})
|
||||||
|
|
||||||
addEventListener('blur', function(){
|
|
||||||
focused = false
|
|
||||||
})
|
|
||||||
addEventListener('focus', function(){
|
|
||||||
focused = true
|
|
||||||
})
|
|
||||||
|
|
||||||
let timer_id;
|
let timer_id;
|
||||||
function remove_typing() {
|
function remove_typing() {
|
||||||
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
const SITE_NAME = document.querySelector("[property='og:site_name']").content
|
||||||
|
const icon = document.querySelector("link[rel~='icon']")
|
||||||
|
const page_title = document.getElementsByTagName('title')[0].innerHTML
|
||||||
|
|
||||||
|
let notifs = 0
|
||||||
|
let focused = true
|
||||||
|
let alert = true;
|
||||||
|
|
||||||
|
addEventListener('blur', function(){
|
||||||
|
focused = false
|
||||||
|
})
|
||||||
|
addEventListener('focus', function(){
|
||||||
|
focused = true
|
||||||
|
})
|
||||||
|
|
||||||
|
function flash(){
|
||||||
|
let title = document.getElementsByTagName('title')[0]
|
||||||
|
if (notifs >= 1 && !focused){
|
||||||
|
title.innerHTML = `[+${notifs}] ${page_title}`
|
||||||
|
if (alert) {
|
||||||
|
icon.href = `/i/${SITE_NAME}/alert.ico?v=3009`
|
||||||
|
alert = false
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
icon.href = `/i/${SITE_NAME}/icon.webp?x=6`
|
||||||
|
alert = true
|
||||||
|
}
|
||||||
|
setTimeout(flash, 500)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
icon.href = `/i/${SITE_NAME}/icon.webp?x=6`
|
||||||
|
notifs = 0
|
||||||
|
title.innerHTML = page_title
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
const socket = io()
|
||||||
|
|
||||||
|
socket.on('insert_reply', function(data) {
|
||||||
|
const replies = document.getElementById(`replies-of-c_${data[0]}`)
|
||||||
|
replies.insertAdjacentHTML('beforeend', data[1]);
|
||||||
|
|
||||||
|
notifs = notifs + 1;
|
||||||
|
if (notifs == 1) {
|
||||||
|
flash();
|
||||||
|
}
|
||||||
|
})
|
|
@ -27,7 +27,10 @@ socketio = SocketIO(
|
||||||
|
|
||||||
muted = cache.get(f'muted') or {}
|
muted = cache.get(f'muted') or {}
|
||||||
|
|
||||||
ALLOWED_REFERRERS = {f'{SITE_FULL}/chat'}
|
ALLOWED_REFERRERS = {
|
||||||
|
f'{SITE_FULL}/chat',
|
||||||
|
f'{SITE_FULL}/notifications/messages',
|
||||||
|
}
|
||||||
|
|
||||||
messages = cache.get(f'messages') or {
|
messages = cache.get(f'messages') or {
|
||||||
f'{SITE_FULL}/chat': {},
|
f'{SITE_FULL}/chat': {},
|
||||||
|
@ -192,6 +195,10 @@ def connect(v):
|
||||||
if request.referrer not in ALLOWED_REFERRERS:
|
if request.referrer not in ALLOWED_REFERRERS:
|
||||||
return '', 400
|
return '', 400
|
||||||
|
|
||||||
|
if request.referrer == f'{SITE_FULL}/notifications/messages':
|
||||||
|
join_room(v.id)
|
||||||
|
return ''
|
||||||
|
|
||||||
join_room(request.referrer)
|
join_room(request.referrer)
|
||||||
|
|
||||||
if [v.username, v.id, v.name_color, v.patron] not in online[request.referrer]:
|
if [v.username, v.id, v.name_color, v.patron] not in online[request.referrer]:
|
||||||
|
@ -213,6 +220,10 @@ def disconnect(v):
|
||||||
if request.referrer not in ALLOWED_REFERRERS:
|
if request.referrer not in ALLOWED_REFERRERS:
|
||||||
return '', 400
|
return '', 400
|
||||||
|
|
||||||
|
if request.referrer == f'{SITE_FULL}/notifications/messages':
|
||||||
|
leave_room(v.id)
|
||||||
|
return ''
|
||||||
|
|
||||||
leave_room(request.referrer)
|
leave_room(request.referrer)
|
||||||
|
|
||||||
for val in online.values():
|
for val in online.values():
|
||||||
|
@ -262,3 +273,115 @@ def close_running_threads():
|
||||||
cache.set('messages', messages)
|
cache.set('messages', messages)
|
||||||
cache.set('muted', muted)
|
cache.set('muted', muted)
|
||||||
atexit.register(close_running_threads)
|
atexit.register(close_running_threads)
|
||||||
|
|
||||||
|
|
||||||
|
@app.post("/reply")
|
||||||
|
@limiter.limit('1/second', scope=rpath)
|
||||||
|
@limiter.limit('1/second', scope=rpath, key_func=get_ID)
|
||||||
|
@limiter.limit("6/minute;50/hour;200/day", deduct_when=lambda response: response.status_code < 400)
|
||||||
|
@limiter.limit("6/minute;50/hour;200/day", deduct_when=lambda response: response.status_code < 400, key_func=get_ID)
|
||||||
|
@auth_required
|
||||||
|
def messagereply(v):
|
||||||
|
body = request.values.get("body", "")
|
||||||
|
body = body[:COMMENT_BODY_LENGTH_LIMIT].strip()
|
||||||
|
|
||||||
|
id = request.values.get("parent_id")
|
||||||
|
parent = get_comment(id, v=v)
|
||||||
|
|
||||||
|
if parent.parent_post or parent.wall_user_id:
|
||||||
|
abort(403, "You can only reply to messages!")
|
||||||
|
|
||||||
|
user_id = parent.author.id
|
||||||
|
|
||||||
|
if v.is_permabanned and parent.sentto != MODMAIL_ID:
|
||||||
|
abort(403, "You are permabanned and may not reply to messages!")
|
||||||
|
elif v.is_muted and parent.sentto == MODMAIL_ID:
|
||||||
|
abort(403, "You are forbidden from replying to modmail!")
|
||||||
|
|
||||||
|
if parent.sentto == MODMAIL_ID: user_id = None
|
||||||
|
elif v.id == user_id: user_id = parent.sentto
|
||||||
|
|
||||||
|
user = None
|
||||||
|
|
||||||
|
if user_id:
|
||||||
|
user = get_account(user_id, v=v, include_blocks=True)
|
||||||
|
if hasattr(user, 'is_blocking') and user.is_blocking:
|
||||||
|
abort(403, f"You're blocking @{user.username}")
|
||||||
|
elif (v.admin_level <= PERMS['MESSAGE_BLOCKED_USERS']
|
||||||
|
and hasattr(user, 'is_blocked') and user.is_blocked):
|
||||||
|
abort(403, f"You're blocked by @{user.username}")
|
||||||
|
|
||||||
|
if user.has_muted(v):
|
||||||
|
abort(403, f"@{user.username} is muting notifications from you, so messaging them is pointless!")
|
||||||
|
|
||||||
|
if not g.is_tor and get_setting("dm_media"):
|
||||||
|
body = process_files(request.files, v, body, is_dm=True, dm_user=user)
|
||||||
|
body = body[:COMMENT_BODY_LENGTH_LIMIT].strip() #process_files potentially adds characters to the post
|
||||||
|
|
||||||
|
if not body: abort(400, "Message is empty!")
|
||||||
|
|
||||||
|
body_html = sanitize(body)
|
||||||
|
|
||||||
|
if len(body_html) > COMMENT_BODY_HTML_LENGTH_LIMIT:
|
||||||
|
abort(400, "Message too long!")
|
||||||
|
|
||||||
|
if parent.sentto == MODMAIL_ID:
|
||||||
|
sentto = MODMAIL_ID
|
||||||
|
else:
|
||||||
|
sentto = user_id
|
||||||
|
|
||||||
|
c = Comment(author_id=v.id,
|
||||||
|
parent_post=None,
|
||||||
|
parent_comment_id=id,
|
||||||
|
top_comment_id=parent.top_comment_id,
|
||||||
|
level=parent.level + 1,
|
||||||
|
sentto=sentto,
|
||||||
|
body=body,
|
||||||
|
body_html=body_html,
|
||||||
|
)
|
||||||
|
g.db.add(c)
|
||||||
|
g.db.flush()
|
||||||
|
execute_blackjack(v, c, c.body_html, 'message')
|
||||||
|
execute_under_siege(v, c, c.body_html, 'message')
|
||||||
|
|
||||||
|
if user_id and user_id not in {v.id, MODMAIL_ID} | BOT_IDs:
|
||||||
|
notif = g.db.query(Notification).filter_by(comment_id=c.id, user_id=user_id).one_or_none()
|
||||||
|
if not notif:
|
||||||
|
notif = Notification(comment_id=c.id, user_id=user_id)
|
||||||
|
g.db.add(notif)
|
||||||
|
|
||||||
|
title = f'New message from @{c.author_name}'
|
||||||
|
|
||||||
|
url = f'{SITE_FULL}/notifications/messages'
|
||||||
|
|
||||||
|
push_notif({user_id}, title, body, url)
|
||||||
|
|
||||||
|
top_comment = c.top_comment
|
||||||
|
|
||||||
|
if top_comment.sentto == MODMAIL_ID:
|
||||||
|
admin_ids = [x[0] for x in g.db.query(User.id).filter(User.admin_level >= PERMS['NOTIFICATIONS_MODMAIL'], User.id != v.id)]
|
||||||
|
|
||||||
|
if SITE == 'watchpeopledie.tv':
|
||||||
|
if AEVANN_ID in admin_ids:
|
||||||
|
admin_ids.remove(AEVANN_ID)
|
||||||
|
if 'delete' in top_comment.body.lower() and 'account' in top_comment.body.lower():
|
||||||
|
admin_ids.remove(15447)
|
||||||
|
|
||||||
|
if parent.author.id not in admin_ids + [v.id]:
|
||||||
|
admin_ids.append(parent.author.id)
|
||||||
|
|
||||||
|
#Don't delete unread notifications, so the replies don't get collapsed and they get highlighted
|
||||||
|
ids = [top_comment.id] + [x.id for x in top_comment.replies(sort="old")]
|
||||||
|
notifications = g.db.query(Notification).filter(Notification.read == True, Notification.comment_id.in_(ids), Notification.user_id.in_(admin_ids))
|
||||||
|
for n in notifications:
|
||||||
|
g.db.delete(n)
|
||||||
|
|
||||||
|
for admin in admin_ids:
|
||||||
|
notif = Notification(comment_id=c.id, user_id=admin)
|
||||||
|
g.db.add(notif)
|
||||||
|
else:
|
||||||
|
c.unread = True
|
||||||
|
rendered = render_template("comments.html", v=get_account(top_comment.sentto), comments=[c])
|
||||||
|
emit('insert_reply', [parent.id, rendered], namespace='/', to=top_comment.sentto)
|
||||||
|
|
||||||
|
return {"comment": render_template("comments.html", v=v, comments=[c])}
|
||||||
|
|
|
@ -684,113 +684,6 @@ def message2(v, username=None, id=None):
|
||||||
return {"message": "Message sent!"}
|
return {"message": "Message sent!"}
|
||||||
|
|
||||||
|
|
||||||
@app.post("/reply")
|
|
||||||
@limiter.limit('1/second', scope=rpath)
|
|
||||||
@limiter.limit('1/second', scope=rpath, key_func=get_ID)
|
|
||||||
@limiter.limit("6/minute;50/hour;200/day", deduct_when=lambda response: response.status_code < 400)
|
|
||||||
@limiter.limit("6/minute;50/hour;200/day", deduct_when=lambda response: response.status_code < 400, key_func=get_ID)
|
|
||||||
@auth_required
|
|
||||||
def messagereply(v):
|
|
||||||
body = request.values.get("body", "")
|
|
||||||
body = body[:COMMENT_BODY_LENGTH_LIMIT].strip()
|
|
||||||
|
|
||||||
id = request.values.get("parent_id")
|
|
||||||
parent = get_comment(id, v=v)
|
|
||||||
|
|
||||||
if parent.parent_post or parent.wall_user_id:
|
|
||||||
abort(403, "You can only reply to messages!")
|
|
||||||
|
|
||||||
user_id = parent.author.id
|
|
||||||
|
|
||||||
if v.is_permabanned and parent.sentto != MODMAIL_ID:
|
|
||||||
abort(403, "You are permabanned and may not reply to messages!")
|
|
||||||
elif v.is_muted and parent.sentto == MODMAIL_ID:
|
|
||||||
abort(403, "You are forbidden from replying to modmail!")
|
|
||||||
|
|
||||||
if parent.sentto == MODMAIL_ID: user_id = None
|
|
||||||
elif v.id == user_id: user_id = parent.sentto
|
|
||||||
|
|
||||||
user = None
|
|
||||||
|
|
||||||
if user_id:
|
|
||||||
user = get_account(user_id, v=v, include_blocks=True)
|
|
||||||
if hasattr(user, 'is_blocking') and user.is_blocking:
|
|
||||||
abort(403, f"You're blocking @{user.username}")
|
|
||||||
elif (v.admin_level <= PERMS['MESSAGE_BLOCKED_USERS']
|
|
||||||
and hasattr(user, 'is_blocked') and user.is_blocked):
|
|
||||||
abort(403, f"You're blocked by @{user.username}")
|
|
||||||
|
|
||||||
if user.has_muted(v):
|
|
||||||
abort(403, f"@{user.username} is muting notifications from you, so messaging them is pointless!")
|
|
||||||
|
|
||||||
if not g.is_tor and get_setting("dm_media"):
|
|
||||||
body = process_files(request.files, v, body, is_dm=True, dm_user=user)
|
|
||||||
body = body[:COMMENT_BODY_LENGTH_LIMIT].strip() #process_files potentially adds characters to the post
|
|
||||||
|
|
||||||
if not body: abort(400, "Message is empty!")
|
|
||||||
|
|
||||||
body_html = sanitize(body)
|
|
||||||
|
|
||||||
if len(body_html) > COMMENT_BODY_HTML_LENGTH_LIMIT:
|
|
||||||
abort(400, "Message too long!")
|
|
||||||
|
|
||||||
if parent.sentto == MODMAIL_ID:
|
|
||||||
sentto = MODMAIL_ID
|
|
||||||
else:
|
|
||||||
sentto = user_id
|
|
||||||
|
|
||||||
c = Comment(author_id=v.id,
|
|
||||||
parent_post=None,
|
|
||||||
parent_comment_id=id,
|
|
||||||
top_comment_id=parent.top_comment_id,
|
|
||||||
level=parent.level + 1,
|
|
||||||
sentto=sentto,
|
|
||||||
body=body,
|
|
||||||
body_html=body_html,
|
|
||||||
)
|
|
||||||
g.db.add(c)
|
|
||||||
g.db.flush()
|
|
||||||
execute_blackjack(v, c, c.body_html, 'message')
|
|
||||||
execute_under_siege(v, c, c.body_html, 'message')
|
|
||||||
|
|
||||||
if user_id and user_id not in {v.id, MODMAIL_ID} | BOT_IDs:
|
|
||||||
notif = g.db.query(Notification).filter_by(comment_id=c.id, user_id=user_id).one_or_none()
|
|
||||||
if not notif:
|
|
||||||
notif = Notification(comment_id=c.id, user_id=user_id)
|
|
||||||
g.db.add(notif)
|
|
||||||
|
|
||||||
title = f'New message from @{c.author_name}'
|
|
||||||
|
|
||||||
url = f'{SITE_FULL}/notifications/messages'
|
|
||||||
|
|
||||||
push_notif({user_id}, title, body, url)
|
|
||||||
|
|
||||||
top_comment = c.top_comment
|
|
||||||
|
|
||||||
if top_comment.sentto == MODMAIL_ID:
|
|
||||||
admin_ids = [x[0] for x in g.db.query(User.id).filter(User.admin_level >= PERMS['NOTIFICATIONS_MODMAIL'], User.id != v.id)]
|
|
||||||
|
|
||||||
if SITE == 'watchpeopledie.tv':
|
|
||||||
if AEVANN_ID in admin_ids:
|
|
||||||
admin_ids.remove(AEVANN_ID)
|
|
||||||
if 'delete' in top_comment.body.lower() and 'account' in top_comment.body.lower():
|
|
||||||
admin_ids.remove(15447)
|
|
||||||
|
|
||||||
if parent.author.id not in admin_ids + [v.id]:
|
|
||||||
admin_ids.append(parent.author.id)
|
|
||||||
|
|
||||||
#Don't delete unread notifications, so the replies don't get collapsed and they get highlighted
|
|
||||||
ids = [top_comment.id] + [x.id for x in top_comment.replies(sort="old")]
|
|
||||||
notifications = g.db.query(Notification).filter(Notification.read == True, Notification.comment_id.in_(ids), Notification.user_id.in_(admin_ids))
|
|
||||||
for n in notifications:
|
|
||||||
g.db.delete(n)
|
|
||||||
|
|
||||||
for admin in admin_ids:
|
|
||||||
notif = Notification(comment_id=c.id, user_id=admin)
|
|
||||||
g.db.add(notif)
|
|
||||||
|
|
||||||
return {"comment": render_template("comments.html", v=v, comments=[c])}
|
|
||||||
|
|
||||||
@app.get("/2faqr/<secret>")
|
@app.get("/2faqr/<secret>")
|
||||||
@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400)
|
@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400)
|
||||||
@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400, key_func=get_ID)
|
@limiter.limit(DEFAULT_RATELIMIT, deduct_when=lambda response: response.status_code < 400, key_func=get_ID)
|
||||||
|
|
|
@ -31,11 +31,11 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<input id="vid" hidden value="{{v.id}}">
|
<input id="vid" hidden value="{{v.id}}">
|
||||||
<input id="site_name" hidden value="{{SITE_NAME}}">
|
|
||||||
<input id="slurreplacer" hidden value="{{v.slurreplacer}}">
|
<input id="slurreplacer" hidden value="{{v.slurreplacer}}">
|
||||||
<input id="admin_level" hidden value="{{v.admin_level}}">
|
<input id="admin_level" hidden value="{{v.admin_level}}">
|
||||||
<input id="blocked_user_ids" hidden value="{{(v.userblocks|string)[1:-1]}}">
|
<input id="blocked_user_ids" hidden value="{{(v.userblocks|string)[1:-1]}}">
|
||||||
<script defer src="{{'js/vendor/socketio.js' | asset}}"></script>
|
<script defer src="{{'js/vendor/socketio.js' | asset}}"></script>
|
||||||
|
<script defer src="{{'js/flash.js' | asset}}"></script>
|
||||||
<script defer src="{{'js/vendor/lozad.js' | asset}}"></script>
|
<script defer src="{{'js/vendor/lozad.js' | asset}}"></script>
|
||||||
<script defer src="{{'js/vendor/lite-youtube.js' | asset}}"></script>
|
<script defer src="{{'js/vendor/lite-youtube.js' | asset}}"></script>
|
||||||
<script defer src="{{'js/chat.js' | asset}}"></script>
|
<script defer src="{{'js/chat.js' | asset}}"></script>
|
||||||
|
|
|
@ -140,6 +140,12 @@
|
||||||
|
|
||||||
<link rel="stylesheet" href="{{('css/notifications.css') | asset}}">
|
<link rel="stylesheet" href="{{('css/notifications.css') | asset}}">
|
||||||
|
|
||||||
|
{% if request.path == '/notifications/messages' %}
|
||||||
|
<script defer src="{{'js/vendor/socketio.js' | asset}}"></script>
|
||||||
|
<script defer src="{{'js/flash.js' | asset}}"></script>
|
||||||
|
<script defer src="{{'js/messages.js' | asset}}"></script>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block GIFpicker %}{% endblock %}
|
{% block GIFpicker %}{% endblock %}
|
||||||
|
|
|
@ -47,11 +47,11 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<input id="vid" hidden value="{{v.id}}">
|
<input id="vid" hidden value="{{v.id}}">
|
||||||
<input id="site_name" hidden value="{{SITE_NAME}}">
|
|
||||||
<input id="slurreplacer" hidden value="{{v.slurreplacer}}">
|
<input id="slurreplacer" hidden value="{{v.slurreplacer}}">
|
||||||
<input id="admin_level" hidden value="{{v.admin_level}}">
|
<input id="admin_level" hidden value="{{v.admin_level}}">
|
||||||
<input id="blocked_user_ids" hidden value="{{(v.userblocks|string)[1:-1]}}">
|
<input id="blocked_user_ids" hidden value="{{(v.userblocks|string)[1:-1]}}">
|
||||||
<script defer src="{{'js/vendor/socketio.js' | asset}}"></script>
|
<script defer src="{{'js/vendor/socketio.js' | asset}}"></script>
|
||||||
|
<script defer src="{{'js/flash.js' | asset}}"></script>
|
||||||
<script defer src="{{'js/vendor/lozad.js' | asset}}"></script>
|
<script defer src="{{'js/vendor/lozad.js' | asset}}"></script>
|
||||||
<script defer src="{{'js/vendor/lite-youtube.js' | asset}}"></script>
|
<script defer src="{{'js/vendor/lite-youtube.js' | asset}}"></script>
|
||||||
<script defer src="{{'js/chat.js' | asset}}"></script>
|
<script defer src="{{'js/chat.js' | asset}}"></script>
|
||||||
|
|
|
@ -30,6 +30,10 @@ server {
|
||||||
proxy_pass http://localhost:5001/refresh_chat;
|
proxy_pass http://localhost:5001/refresh_chat;
|
||||||
include includes/headers;
|
include includes/headers;
|
||||||
}
|
}
|
||||||
|
location /reply {
|
||||||
|
proxy_pass http://localhost:5001/reply;
|
||||||
|
include includes/headers;
|
||||||
|
}
|
||||||
|
|
||||||
location =/offline.html {
|
location =/offline.html {
|
||||||
alias /d/files/templates/errors/offline.html;
|
alias /d/files/templates/errors/offline.html;
|
||||||
|
|
Loading…
Reference in New Issue