diff --git a/config.json b/config.json index 7c8a82d..251cbb0 100644 --- a/config.json +++ b/config.json @@ -1,6 +1,12 @@ { - "navbarBrandText": "Netzbegrünung Mastowall", + "navbarBrandText": "Netzbegrünung Mastowall - gruene.social", "defaultServerUrl": "https://gruene.social", "navbarColor": "#008939", + "duration": 10, + "refreshDuration": 30, + "maxAge": 604800, + "extraCards": [ + "" + ], "includeReplies": true } diff --git a/script.js b/script.js index af74d3b..b87dded 100644 --- a/script.js +++ b/script.js @@ -1,12 +1,6 @@ // The existingPosts array is used to track already displayed posts let existingPosts = []; -// below times are in milliseconds -// duration for slide animations -let duration = 5000; -// refresh rate -let refresh = 30000; - // getUrlParameter helps to fetch URL parameters function getUrlParameter(name) { name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]'); @@ -23,23 +17,44 @@ const secondsAgo = date => Math.floor((new Date() - date) / 1000); const timeAgo = function(seconds) { // An array of intervals for years, months, days, hours, and minutes. const intervals = [ - { limit: 31536000, text: 'Jahren' }, - { limit: 2592000, text: 'Monaten' }, - { limit: 86400, text: 'Tagen' }, - { limit: 3600, text: 'Stunden' }, - { limit: 60, text: 'Minuten' } + { limit: 31536000, singular: 'Jahre', plural: 'Jahren' }, + { limit: 2592000, singular: 'Monat', plural: 'Monaten' }, + { limit: 86400, singular: 'Tag', plural: 'Tagen' }, + { limit: 3600, singular: 'Stunde', plural: 'Stunden' }, + { limit: 60, singular: 'Minute', plural: 'Minuten' } ]; // Loop through the intervals to find which one is the best fit. for (let interval of intervals) { if (seconds >= interval.limit) { - return "Vor " + Math.floor(seconds / interval.limit) + ` ${interval.text}`; + let amount = Math.floor(seconds / interval.limit); + let text; + if (amount !== 1) { + text = interval.plural; + } else { + text = interval.singular; + } + return `Vor ${amount} ${text}`; } } - return "Vor " + Math.floor(seconds) + " Sekunden"; + let text = "Sekunde"; + let amount = Math.floor(seconds); + if (amount !== 1) { + text += "n"; + } + return `Vor ${amount} ${text}`; }; let includeReplies; +// max post age in seconds +let maxAge; +// below times are in milliseconds +// duration for slide animations +let duration; +// refresh rate +let refresh; +// extra cards text +let extraCards; // fetchConfig fetches the configuration from the config.json file const fetchConfig = async function() { @@ -48,12 +63,22 @@ const fetchConfig = async function() { $('#navbar-brand').text(config.navbarBrandText); $('.navbar').css('background-color', config.navbarColor); includeReplies = config.includeReplies; + maxAge = config.maxAge; + duration = config.duration * 1000; + refresh = config.refreshDuration * 1000; + extraCards = config.extraCards; return config.defaultServerUrl; } catch (error) { console.log("Error loading config.json:", error); - $('#navbar-brand').text("Netzbegrünung Mastowall"); + $('#navbar-brand').text("Netzbegrünung Mastowall - gruene.social"); $('.navbar').css('background-color', "#008939"); includeReplies = true; + maxAge = 60 * 60 * 24 * 7; + duration = 10000; + refresh = 30000; + extraCards = [ + "
" + ]; return "https://gruene.social"; } } @@ -88,7 +113,7 @@ const displayPost = function(post) {${DOMPurify.sanitize(post.account.display_name)}
+${DOMPurify.sanitize(post.account.display_name)} @${DOMPurify.sanitize(post.account.acct)}
${DOMPurify.sanitize(post.content)}
@@ -104,11 +129,22 @@ const displayPost = function(post) { return 1; }; +const processPosts = function(posts) { + posts = posts.filter((post) => { + return secondsAgo(new Date(post.created_at)) < maxAge && post.content.indexOf("nitter.") === -1 + }); + + return posts; +}; + // updateWall displays all posts const updateWall = function(posts) { if (!posts || posts.length === 0) return; + posts = processPosts(posts); + posts.sort((a, b) => new Date(a.created_at) - new Date(b.created_at)); + let ret = 0 posts.forEach(post => ret += displayPost(post)); $('.masonry-grid').masonry('layout'); @@ -120,8 +156,10 @@ const updateWall = function(posts) { const updateCarousel = function(slides, posts) { if (!posts || posts.length === 0) return; + posts = processPosts(posts); + posts.sort((a, b) => new Date(b.created_at) - new Date(a.created_at)); - + // remove slides in carousel slides.innerHTML = ""; var newHTML = ` ` @@ -141,7 +179,7 @@ const updateCarousel = function(slides, posts) {${DOMPurify.sanitize(post.account.display_name)}
+${DOMPurify.sanitize(post.account.display_name)} @${DOMPurify.sanitize(post.account.acct)}