From ccd01264ae4656401b5cc1f9aaf9f3d58e63921a Mon Sep 17 00:00:00 2001 From: Brett Laptop Date: Mon, 7 Jul 2025 21:29:01 -0400 Subject: [PATCH] security --- news/main.py | 4 +++ news/static/view.html | 58 +++++++++++++++++++++++++++++++++++++++---- 2 files changed, 57 insertions(+), 5 deletions(-) diff --git a/news/main.py b/news/main.py index be43c6f..b61f360 100644 --- a/news/main.py +++ b/news/main.py @@ -337,6 +337,10 @@ async def on_message(message: discord.Message) -> None: if not (is_dm or is_mention): return + if is_dm and message.author.id != 199680010267656192: + await message.channel.send("Only authorized users are allowed to use this bot.") + return + url = extract_first_url(message.content) if not url: await message.channel.send("Please send me a link to a news article.") diff --git a/news/static/view.html b/news/static/view.html index 217ba5c..e5de6d3 100644 --- a/news/static/view.html +++ b/news/static/view.html @@ -100,7 +100,13 @@ max-width:900px; margin:0 auto; } + /* make each paragraph a little flex-box so we can place + the coloured badge on the right-hand side */ .paragraph-card{ + display:flex; + justify-content:space-between; + align-items:flex-start; + gap:.75rem; background:var(--card-bg); border-radius:6px; padding:1rem 1.2rem; @@ -111,6 +117,22 @@ box-shadow:0 3px 8px rgba(0,0,0,.14); } + /* ─────────── Relevance badge ─────────── */ + .relevance-badge{ + min-width:72px; + font-size:.75rem; + font-weight:600; + line-height:1.4; + color:#fff; + padding:.25rem .4rem; + border-radius:4px; + text-align:center; + user-select:none; + flex-shrink:0; + } + .relevance-low {background:#d32f2f;} /* red */ + .relevance-med {background:#f57c00;} /* amber */ + .relevance-high {background:#388e3c;} /* green */ .error{ color:#c00; text-align:center; @@ -209,16 +231,42 @@ const card = document.createElement('div'); card.className = 'paragraph-card'; - /* store ratings for future use */ + /* main paragraph text */ + const p = document.createElement('p'); + p.textContent = pData.text; + p.style.margin = 0; + card.appendChild(p); + + /* relevance badge --------------------------------------- */ + const badge = document.createElement('span'); + badge.classList.add('relevance-badge'); + + /* fall-back to 0 if the API did not supply a number */ + const summary_rating = Number.parseFloat(pData.summary_rating ?? 0) / 100; + const ratingsArr = pData.topic_ratings ?? []; + const totalTrue = ratingsArr.reduce( + (sum, r) => sum + (r.rating ? 1 : 0), + 0 + ); + const topic_ratings = totalTrue / ratingsArr.length; + const rating = (summary_rating + topic_ratings) / 2; + + let cssClass = 'relevance-low'; + if (rating >= 0.66) cssClass = 'relevance-high'; + else if (rating >= 0.33) cssClass = 'relevance-med'; + badge.classList.add(cssClass); + + /* display as percentage for clarity */ + const pct = Math.round(rating * 100); + badge.textContent = pct + '% relevant'; + card.appendChild(badge); + + /* store ratings for possible later use */ card.dataset.summaryRating = pData.summary_rating ?? ''; card.dataset.topicRatings = JSON.stringify( (pData.topic_ratings ?? []).map(r => !!r.rating) ); - const p = document.createElement('p'); - p.textContent = pData.text; - card.appendChild(p); - elParagraphs.appendChild(card); }); }