rDrama/files/assets/js/chat.js

331 lines
10 KiB
JavaScript
Raw Normal View History

2023-01-21 10:36:21 +00:00
function timeSince(timeStamp) {
2023-01-28 11:33:59 +00:00
const now = new Date(),
2023-01-21 10:36:21 +00:00
secondsPast = (now.getTime() - timeStamp) / 1000;
if (secondsPast < 60) {
return parseInt(secondsPast) + 's';
}
if (secondsPast < 3600) {
return parseInt(secondsPast / 60) + 'm';
}
if (secondsPast <= 86400) {
return parseInt(secondsPast / 3600) + 'h';
}
if (secondsPast > 86400) {
day = timeStamp.getDate();
month = timeStamp.toDateString().match(/ [a-zA-Z]*/)[0].replace(" ", "");
year = timeStamp.getFullYear() == now.getFullYear() ? "" : " " + timeStamp.getFullYear();
return day + " " + month + year;
}
}
const ua=window.navigator.userAgent
let socket
socket=io()
const chatline = document.getElementsByClassName('chat-line')[0]
const box = document.getElementById('chat-window')
2023-03-04 23:07:05 +00:00
const ta = document.getElementById('input-text')
2023-01-22 02:43:28 +00:00
const icon = document.querySelector("link[rel~='icon']")
2023-01-21 10:36:21 +00:00
const vid = document.getElementById('vid').value
const site_name = document.getElementById('site_name').value
const slurreplacer = document.getElementById('slurreplacer').value
let notifs = 0;
let focused = true;
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) {
2023-01-22 02:43:28 +00:00
icon.href = `/i/${site_name}/alert.ico?v=3009`
2023-01-21 10:36:21 +00:00
alert=false;
}
else {
2023-01-22 02:43:28 +00:00
icon.href = `/i/${site_name}/icon.webp?v=3009`
2023-01-21 10:36:21 +00:00
alert=true;
}
setTimeout(flash, 500)
}
else {
2023-01-22 02:43:28 +00:00
icon.href = `/i/${site_name}/icon.webp?v=3009`
2023-01-21 10:36:21 +00:00
notifs = 0
title.innerHTML = 'Chat';
}
if (is_typing) {
is_typing = false
socket.emit('typing', false);
}
}
2023-01-22 02:43:28 +00:00
socket.on('speak', function(json) {
2023-01-21 10:36:21 +00:00
let text = json['text']
let text_html
2023-01-22 02:43:28 +00:00
if (slurreplacer != '0') text_html = json['text_censored']
2023-01-21 10:36:21 +00:00
else text_html = json['text_html']
2023-01-22 05:30:57 +00:00
chatline.classList.remove('chat-mention');
2023-01-21 10:36:21 +00:00
if (text_html.includes(`<a href="/id/${vid}">`)){
chatline.classList.add('chat-mention');
}
notifs = notifs + 1;
if (notifs == 1) {
setTimeout(flash, 500);
}
2023-01-22 05:30:57 +00:00
const users = document.getElementsByClassName('user_id');
const last_user = users[users.length-1].value;
2023-01-21 10:36:21 +00:00
const scrolled_down = (box.scrollHeight - box.scrollTop <= window.innerHeight)
2023-01-22 05:30:57 +00:00
if (last_user != json['user_id']) {
2023-01-21 10:36:21 +00:00
document.getElementsByClassName('avatar-pic')[0].src = '/pp/' + json["user_id"]
2023-01-22 02:43:28 +00:00
2023-01-21 10:36:21 +00:00
if (json['hat'])
document.getElementsByClassName('avatar-hat')[0].src = json['hat'] + "?h=7"
else
document.getElementsByClassName('avatar-hat')[0].removeAttribute("src")
2023-01-25 03:30:08 +00:00
const userlink = document.getElementsByClassName('userlink')[0]
userlink.innerHTML = userlink.innerHTML.replace(userlink.textContent, json['username'])
userlink.href = '/@' + json['username']
userlink.style.color = '#' + json['namecolor']
2023-01-22 02:43:28 +00:00
2023-01-22 05:30:57 +00:00
document.getElementsByClassName('user_id')[0].value = json['user_id']
2023-01-21 11:19:46 +00:00
if (Date.now() - json['time']*1000 > 5000)
document.getElementsByClassName('time')[0].innerHTML = timeSince(json['time']*1000) + ' ago'
else
document.getElementsByClassName('time')[0].innerHTML = "just now"
2023-01-21 10:36:21 +00:00
}
document.getElementsByClassName('chat-line')[0].id = json['id']
document.getElementsByClassName('text')[0].innerHTML = escapeHTML(text)
document.getElementsByClassName('chat-message')[0].innerHTML = text_html.replace(/data-src/g, 'src').replace(/data-cfsrc/g, 'src').replace(/style="display:none;visibility:hidden;"/g, '')
2023-01-21 23:19:46 +00:00
document.getElementsByClassName('quotes')[0].classList.add("d-none")
2023-01-21 10:36:21 +00:00
if (json['quotes']) {
const quoted = document.getElementById(json['quotes'])
2023-01-21 23:19:46 +00:00
if (quoted) {
2023-01-22 05:30:57 +00:00
const quoted_user = quoted.parentElement.querySelector('.user_id').value
if (quoted_user == vid){
chatline.classList.add('chat-mention');
}
2023-01-21 23:19:46 +00:00
document.getElementsByClassName('quotes')[0].classList.remove("d-none")
document.getElementsByClassName('QuotedMessageLink')[0].href = '#' + json['quotes']
2023-01-25 03:30:08 +00:00
document.getElementsByClassName('QuotedUser')[0].innerHTML = quoted.parentElement.querySelector('.userlink').textContent
2023-01-21 23:19:46 +00:00
document.getElementsByClassName('QuotedMessage')[0].innerHTML = quoted.querySelector('.text').innerHTML
}
2023-01-21 10:36:21 +00:00
}
let line = document.getElementsByClassName('chat-line')[0].cloneNode(true)
register_new_elements(line);
bs_trigger(line)
2023-01-22 05:30:57 +00:00
if (last_user == json['user_id']) {
2023-01-21 10:36:21 +00:00
box.querySelector('.chat-group:last-child').append(line)
}
else {
2023-01-22 02:43:28 +00:00
const chatgroup = document.getElementsByClassName('chat-group')[0].cloneNode(true)
2023-01-21 10:36:21 +00:00
chatgroup.append(line)
box.append(chatgroup)
}
2023-02-18 16:08:48 +00:00
const line2 = document.getElementById(json['id'])
register_new_elements(line2);
bs_trigger(line2)
2023-01-22 05:30:57 +00:00
if (scrolled_down || json['user_id'] == vid)
2023-01-21 10:36:21 +00:00
box.scrollTo(0, box.scrollHeight)
})
function send() {
2023-03-04 23:07:05 +00:00
const text = ta.value.trim();
2023-02-27 15:02:35 +00:00
const input = document.getElementById('file');
const files = input.files;
2023-01-21 10:36:21 +00:00
if (text || files)
{
let sending;
if (files[0]) sending = files[0]
else sending = ''
socket.emit('speak', {
"message": text,
"quotes": document.getElementById('quotes_id').value,
"file": sending,
});
2023-03-04 23:07:05 +00:00
ta.value = ''
2023-01-21 10:36:21 +00:00
is_typing = false
socket.emit('typing', false);
2023-03-04 23:07:05 +00:00
autoExpand(ta);
2023-01-21 10:36:21 +00:00
document.getElementById("quotes").classList.add("d-none")
2023-01-21 11:05:58 +00:00
document.getElementById('quotes_id').value = null;
2023-03-04 23:09:36 +00:00
oldfiles[ta.id] = [];
2023-02-27 15:02:35 +00:00
input.value = null;
2023-03-06 18:02:12 +00:00
input.previousElementSibling.innerHTML = '<i class="fas fa-image" style="font-size:1.3rem!important"></i>'
2023-02-27 15:02:35 +00:00
input.parentElement.nextElementSibling.classList.add('d-none');
2023-01-21 11:58:10 +00:00
box.scrollTo(0, box.scrollHeight);
setTimeout(function () {
2023-01-21 11:58:10 +00:00
box.scrollTo(0, box.scrollHeight)
}, 200);
2023-01-21 10:36:21 +00:00
}
}
function quote(t) {
document.getElementById("quotes").classList.remove("d-none")
2023-02-10 13:44:47 +00:00
const text = t.parentElement.parentElement.getElementsByClassName("text")[0].innerHTML.replace(/\*/g,"\\*").split('\n').pop()
2023-01-21 10:36:21 +00:00
document.getElementById('QuotedMessage').innerHTML = text
2023-02-10 13:44:47 +00:00
const username = t.parentElement.parentElement.parentElement.parentElement.parentElement.getElementsByClassName('userlink')[0].textContent
2023-01-21 10:36:21 +00:00
document.getElementById('QuotedUser').innerHTML = username
2023-02-10 13:44:47 +00:00
const id = t.parentElement.parentElement.parentElement.parentElement.id
2023-01-21 10:36:21 +00:00
document.getElementById('quotes_id').value = id
document.getElementById('QuotedMessageLink').href = `#${id}`
2023-01-21 11:05:58 +00:00
2023-03-04 23:07:05 +00:00
ta.focus()
2023-01-21 10:36:21 +00:00
}
2023-03-04 23:07:05 +00:00
ta.addEventListener("keyup", function(e) {
2023-01-21 10:36:21 +00:00
if (e.key === 'Enter') {
e.preventDefault();
send();
}
})
socket.on('online', function(data){
2023-01-23 06:04:02 +00:00
document.getElementsByClassName('board-chat-count')[0].innerHTML = data[0].length
document.getElementById('chat-count-header-bar').innerHTML = data[0].length
2023-01-24 05:28:56 +00:00
const admin_level = parseInt(document.getElementById('admin_level').value)
2023-01-21 10:36:21 +00:00
let online = ''
let online2 = '<b>Users Online</b>'
2023-01-23 06:04:02 +00:00
for (const u of data[0])
2023-01-21 10:36:21 +00:00
{
2023-01-23 06:04:02 +00:00
online += `<li>`
if (admin_level && Object.keys(data[1]).includes(u[0].toLowerCase()))
2023-01-23 06:04:02 +00:00
online += '<b class="text-danger muted" data-bs-toggle="tooltip" title="Muted">X</b> '
2023-01-27 18:15:38 +00:00
online += `<a class="font-weight-bold" target="_blank" href="/@${u[0]}" style="color:#${u[2]}"><img loading="lazy" class="mr-1" src="/pp/${u[1]}">${u[0]}</a></li>`
online2 += `<br>@${u[0]}`
2023-01-21 10:36:21 +00:00
}
document.getElementById('online').innerHTML = online
2023-01-23 06:04:02 +00:00
bs_trigger(document.getElementById('online'))
2023-01-21 10:36:21 +00:00
document.getElementById('online2').setAttribute("data-bs-original-title", online2);
document.getElementById('online3').innerHTML = online
2023-01-23 06:04:02 +00:00
bs_trigger(document.getElementById('online3'))
2023-01-21 10:36:21 +00:00
})
window.addEventListener('blur', function(){
2023-01-21 10:36:21 +00:00
focused=false
})
window.addEventListener('focus', function(){
2023-01-21 10:36:21 +00:00
focused=true
})
ta.addEventListener("input", function() {
2023-03-04 23:07:05 +00:00
text = ta.value
2023-01-21 10:36:21 +00:00
if (!text && is_typing==true){
is_typing=false;
socket.emit('typing', false);
}
else if (text && is_typing==false) {
is_typing=true;
socket.emit('typing', true);
}
})
socket.on('typing', function (users){
if (users.length==0){
document.getElementById('typing-indicator').innerHTML = '';
document.getElementById('loading-indicator').classList.add('d-none');
}
else if (users.length==1){
document.getElementById('typing-indicator').innerHTML = '<b>'+users[0]+"</b> is typing...";
document.getElementById('loading-indicator').classList.remove('d-none');
}
else if (users.length==2){
document.getElementById('typing-indicator').innerHTML = '<b>'+users[0]+"</b> and <b>"+users[1]+"</b> are typing...";
document.getElementById('loading-indicator').classList.remove('d-none');
}
else {
document.getElementById('typing-indicator').innerHTML = '<b>'+users[0]+"</b>, <b>"+users[1]+"</b>, and <b>"+users[2]+"</b> are typing...";
document.getElementById('loading-indicator').classList.remove('d-none');
}
})
function del(t) {
2023-02-10 13:44:47 +00:00
const chatline = t.parentElement.parentElement.parentElement.parentElement
2023-01-21 10:36:21 +00:00
socket.emit('delete', chatline.id);
chatline.remove()
}
socket.on('delete', function(text) {
const text_spans = document.getElementsByClassName('text')
for(const span of text_spans) {
if (span.innerHTML == text)
{
span.parentElement.parentElement.parentElement.parentElement.parentElement.remove()
}
}
})
document.addEventListener('click', function (e) {
2023-02-18 16:02:19 +00:00
if (e.target.classList.contains('delconfirm')) {
2023-01-21 10:36:21 +00:00
e.target.nextElementSibling.classList.remove('d-none');
e.target.classList.add('d-none');
}
else {
for (const btn of document.querySelectorAll('.delmsg:not(.d-none)')) {
btn.classList.add('d-none');
btn.previousElementSibling.classList.remove('d-none');
}
}
2023-02-22 17:27:33 +00:00
2023-01-21 10:36:21 +00:00
if (e.target.id == "cancel") {
2023-01-21 11:02:19 +00:00
document.getElementById("quotes").classList.add("d-none");
document.getElementById('quotes_id').value = null;
2023-01-21 10:36:21 +00:00
}
});
2023-01-21 11:23:09 +00:00
2023-03-06 18:02:12 +00:00
const input = document.getElementById('file')
function handle_files() {
if (!input.files.length) return
input.previousElementSibling.textContent = input.files[0].name.substr(0, 50);
}
input.onchange = handle_files
document.onpaste = function(event) {
input.files = structuredClone(event.clipboardData.files);
handle_files()
}
2023-01-22 05:17:25 +00:00
box.scrollTo(0, box.scrollHeight)
setTimeout(function () {
2023-01-22 05:33:26 +00:00
box.scrollTo(0, box.scrollHeight)
}, 200);
setTimeout(function () {
2023-01-22 05:33:26 +00:00
box.scrollTo(0, box.scrollHeight)
}, 500);
setTimeout(function () {
2023-01-22 05:34:01 +00:00
box.scrollTo(0, box.scrollHeight)
}, 1000);
setTimeout(function () {
2023-01-22 23:17:59 +00:00
box.scrollTo(0, box.scrollHeight)
}, 1500);
document.addEventListener('DOMContentLoaded', function () {
2023-01-22 03:16:37 +00:00
box.scrollTo(0, box.scrollHeight)
});