leftypol/js/thread-stats.js

115 lines
3.5 KiB
JavaScript
Raw Permalink Normal View History

/*
* thread-stats.js
* - Adds statistics of the thread below the posts area
* - Shows ID post count beside each postID on hover
2024-08-20 10:53:36 +02:00
*
* Usage:
* $config['additional_javascript'][] = 'js/jquery.min.js';
* $config['additional_javascript'][] = 'js/thread-stats.js';
*/
2024-08-20 10:53:36 +02:00
if (active_page == 'thread') {
2024-08-20 10:53:36 +02:00
$(document).ready(function() {
// Check if page uses unique ID.
let IDsupport = ($('.poster_id').length > 0);
let threadId = (document.location.pathname + document.location.search).split('/');
threadId = threadId[threadId.length -1].split('+')[0].split('.')[0];
2024-08-20 10:53:36 +02:00
$('.clear').before('<div id="thread_stats"></div>');
let el = $('#thread_stats');
el.prepend('Page <span id="thread_stats_page">?</span>');
if (IDsupport) {
2024-08-20 10:53:36 +02:00
el.prepend('<span id="thread_stats_uids">0</span> UIDs |&nbsp;');
}
el.prepend('<span id="thread_stats_images">0</span> images |&nbsp;');
el.prepend('|&nbsp<span id="thread_stats_posts">0</span> replies |&nbsp;');
delete el;
function fetchPageNumber() {
$.getJSON('//' + document.location.host + '/' + board_name + '/threads.json', function(data) {
let found;
let page = '???';
let threadIdInt = parseInt(threadId);
for (let i = 0; data[i]; i++) {
let threads = data[i].threads;
for (let j = 0; threads[j]; j++) {
if (parseInt(threads[j].no) === threadIdInt) {
page = data[i].page +1;
found = true;
break;
}
}
if (found) {
break;
}
}
let threadStatsPage = $('#thread_stats_page');
threadStatsPage.text(page);
if (!found) {
threadStatsPage.css('color', 'red');
} else {
threadStatsPage.css('color', '');
}
});
}
function updateThreadStats() {
let op = $('#thread_' + threadId).find('div.post.op:not(.post-hover):not(.inline)').first();
let replies = $('#thread_' + threadId).find('div.post.reply:not(.post-hover):not(.inline)');
2024-08-20 10:53:36 +02:00
// Post count.
$('#thread_stats_posts').text(replies.length);
// Image count.
$('#thread_stats_images').text(replies.filter(function() {
2024-08-20 11:21:06 +02:00
return $(this).find('>> .files').text().trim() != false;
2024-08-20 10:53:36 +02:00
}).length);
// Unique ID count.
if (IDsupport) {
let opID = op.find('> .intro > .poster_id').text();
let ids = {};
replies.each(function() {
let cur = $(this).find('> .intro > .poster_id');
let curID = cur.text();
if (ids[curID] === undefined) {
ids[curID] = 0;
}
ids[curID]++;
});
if (ids[opID] === undefined) {
ids[opID] = 0;
}
2024-08-20 10:53:36 +02:00
ids[opID]++;
let cur = op.find('>.intro >.poster_id');
cur.find('+.posts_by_id').remove();
2024-08-20 10:53:36 +02:00
cur.after('<span class="posts_by_id"> (' + ids[cur.text()] + ')</span>');
replies.each(function() {
cur = $(this).find('>.intro >.poster_id');
cur.find('+.posts_by_id').remove();
cur.after('<span class="posts_by_id"> (' + ids[cur.text()] + ')</span>');
});
let size = function(obj) {
let size = 0
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
size++;
}
}
return size;
};
$('#thread_stats_uids').text(size(ids));
}
fetchPageNumber();
2024-08-20 10:53:36 +02:00
}
// Load the current page the thread is on.
// Uses ajax call so it gets loaded on a delay (depending on network resources available).
setInterval(fetchPageNumber, 30000);
2024-08-20 10:53:36 +02:00
$('body').append('<style>.posts_by_id{display:none;}.poster_id:hover+.posts_by_id{display:initial}</style>');
updateThreadStats();
$('#update_thread').click(updateThreadStats);
$(document).on('new_post', updateThreadStats);
2024-08-20 10:53:36 +02:00
});
}