Add WIP for whitelist and blacklist

This commit is contained in:
2022-12-20 05:10:01 +01:00
parent 9740947692
commit b88ce8a1f5
5 changed files with 213 additions and 11 deletions

View File

@ -24,7 +24,7 @@ Exceptions:
from typing import Iterable
from discord_webhook import DiscordWebhook
from reader import Entry, Reader
from reader import Entry, Reader, TagNotFoundError
from requests import Response
from discord_rss_bot.settings import get_reader
@ -57,17 +57,79 @@ def send_to_discord(custom_reader: Reader | None = None, feed=None, do_once=Fals
for entry in entries:
# Set the webhook to read, so we don't send it again.
reader.set_entry_read(entry, True)
reader.set_entry_read(entry, True) # type: ignore
# Get the webhook from the feed.
try:
webhook_url: str = str(reader.get_tag(entry.feed_url, "webhook"))
except TagNotFoundError:
print(f"Webhook not found for feed {entry.feed_url}")
continue
webhook_message: str = f":robot: :mega: {entry.title}\n{entry.link}"
webhook: DiscordWebhook = DiscordWebhook(url=webhook_url, content=webhook_message, rate_limit_retry=True)
# Send the webhook.
try:
whitelist_title = reader.get_tag(feed, "whitelist_title")
except TagNotFoundError:
whitelist_title = ""
try:
whitelist_summary = reader.get_tag(feed, "whitelist_summary")
except TagNotFoundError:
whitelist_summary = ""
try:
whitelist_content = reader.get_tag(feed, "whitelist_content")
except TagNotFoundError:
whitelist_content = ""
try:
blacklist_title = reader.get_tag(feed, "blacklist_title")
except TagNotFoundError:
blacklist_title = ""
try:
blacklist_summary = reader.get_tag(feed, "blacklist_summary")
except TagNotFoundError:
blacklist_summary = ""
try:
blacklist_content = reader.get_tag(feed, "blacklist_content")
except TagNotFoundError:
blacklist_content = ""
# Check if the entry should be sent. If on the blacklist, mark as read and continue.
if whitelist_title:
if whitelist_title.lower() in entry.title.lower():
print(f"Whitelisted because of title: {entry.title}")
response: Response = webhook.execute()
if not response.ok:
reader.set_entry_read(entry, False)
print(f"Error: {response.status_code} {response.reason}")
reader.set_entry_read(entry, False) # type: ignore
if whitelist_summary:
if whitelist_summary.lower() in entry.summary.lower():
print(f"Whitelisted because of summary: {entry.title}")
response: Response = webhook.execute()
if not response.ok:
print(f"Error: {response.status_code} {response.reason}")
reader.set_entry_read(entry, False) # type: ignore
# if whitelist_content.lower() in entry.content.lower():
if blacklist_title:
if blacklist_title.lower() in entry.title.lower():
print(f"Blacklisted because of title: {entry.title}")
reader.set_entry_read(entry, True) # type: ignore
if blacklist_summary:
if blacklist_summary.lower() in entry.summary.lower():
print(f"Blacklisted because of summary: {entry.title}")
reader.set_entry_read(entry, True) # type: ignore
# if blacklist_content.lower() in entry.content.lower():
else:
response: Response = webhook.execute()
if not response.ok:
print(f"Error: {response.status_code} {response.reason}")
reader.set_entry_read(entry, False) # type: ignore
# If we only want to send one entry, we will break the loop. This is used when testing this function.
if do_once:

View File

@ -27,6 +27,8 @@ Functions:
Runs on startup.
"""
import urllib.parse
from datetime import datetime
from enum import Enum
from typing import Any, Iterable
import uvicorn
@ -195,24 +197,90 @@ async def create_feed(feed_url: str = Form(), webhook_dropdown: str = Form()) ->
@app.post("/pause")
async def pause_feed(feed_url: str = Form()) -> dict[str, str] | RedirectResponse:
clean_url: str = urllib.parse.quote(feed_url)
# Disable/pause the feed.
reader.disable_feed_updates(feed_url)
# Clean URL is used to redirect to the feed page.
clean_url: str = urllib.parse.quote(feed_url)
return RedirectResponse(url=f"/feed/?feed_url={clean_url}", status_code=303)
@app.post("/unpause")
async def unpause_feed(feed_url: str = Form()) -> dict[str, str] | RedirectResponse:
clean_url: str = urllib.parse.quote(feed_url)
# Enable/unpause the feed.
reader.enable_feed_updates(feed_url)
# Clean URL is used to redirect to the feed page.
clean_url: str = urllib.parse.quote(feed_url)
return RedirectResponse(url=f"/feed/?feed_url={clean_url}", status_code=303)
@app.post("/whitelist")
async def set_whitelist(whitelist_title: str, whitelist_summary: str, whitelist_content: str, feed_url: str = Form()):
# Add the whitelist to the feed.
if whitelist_title:
reader.set_tag(feed_url, "whitelist_title", whitelist) # type: ignore
if whitelist_summary:
reader.set_tag(feed_url, "whitelist_summary", whitelist) # type: ignore
if whitelist_content:
reader.set_tag(feed_url, "whitelist_content", whitelist) # type: ignore
# Clean URL is used to redirect to the feed page.
clean_url: str = urllib.parse.quote(feed_url)
return RedirectResponse(url=f"/feed/?feed_url={clean_url}", status_code=303)
@app.get("/whitelist", response_class=HTMLResponse)
async def get_whitelist(feed_url: str, request: Request) -> _TemplateResponse:
# Make feed_url a valid URL.
url: str = urllib.parse.unquote(feed_url)
feed: Feed = reader.get_feed(url)
try:
whitelist = reader.get_tag(url, "whitelist")
except TagNotFoundError:
whitelist = ""
context = {"request": request, "feed": feed, "whitelist": whitelist}
return templates.TemplateResponse("whitelist.html", context)
@app.post("/blacklist")
async def set_blacklist(blacklist_title: str, blacklist_summary: str, blacklist_content: str, feed_url: str = Form()):
# Add the blacklist to the feed.
if blacklist_title:
reader.set_tag(feed_url, "blacklist_title", blacklist) # type: ignore
if blacklist_summary:
reader.set_tag(feed_url, "blacklist_summary", blacklist) # type: ignore
if blacklist_content:
reader.set_tag(feed_url, "blacklist_content", blacklist) # type: ignore
# Clean URL is used to redirect to the feed page.
clean_url: str = urllib.parse.quote(feed_url)
return RedirectResponse(url=f"/feed/?feed_url={clean_url}", status_code=303)
@app.get("/blacklist", response_class=HTMLResponse)
async def get_blacklist(feed_url: str, request: Request) -> _TemplateResponse:
# Make feed_url a valid URL.
url: str = urllib.parse.unquote(feed_url)
feed: Feed = reader.get_feed(url)
try:
blacklist = reader.get_tag(url, "blacklist")
except TagNotFoundError:
blacklist = ""
context = {"request": request, "feed": feed, "blacklist": blacklist}
return templates.TemplateResponse("blacklist.html", context)
@app.get("/add", response_class=HTMLResponse)
def get_add(request: Request) -> _TemplateResponse:
"""

View File

@ -0,0 +1,35 @@
{% extends "base.html" %}
{% block title %} | Blacklist{% endblock %}
{% block content %}
<div class="p-2 border border-dark">
<form action="/blacklist" method="post">
<!-- Feed URL -->
<div class="row pb-2">
<div class="col-sm-12">
<div class="form-text">Comma separated list of words to blacklist. If a word is found in the
corresponding blacklists, the feed will not be sent. Whitelist always takes precedence over
blacklist. Leave empty to disable. Words are case-insensitive.
</div>
<label for="blacklist_title" class="col-sm-6 col-form-label">Blacklist - Title</label>
<input name="blacklist_title" type="text" class="form-control bg-dark border-dark text-muted"
id="blacklist_title" placeholder="primogem, events, gameplay preview, special program">
<label for="blacklist_summary" class="col-sm-6 col-form-label">Blacklist - Summary</label>
<input name="blacklist_summary" type="text" class="form-control bg-dark border-dark text-muted"
id="blacklist_summary" placeholder="primogem, events, gameplay preview, special program">
<label for="blacklist_content" class="col-sm-6 col-form-label">Blacklist - Content</label>
<input name="blacklist_content" type="text" class="form-control bg-dark border-dark text-muted"
id="blacklist_content" placeholder="primogem, events, gameplay preview, special program">
</div>
</div>
<!-- Submit button -->
<div class="d-md-flex">
<button class="btn btn-dark btn-sm">Update blacklist</button>
</div>
</form>
</div>
{% endblock %}

View File

@ -24,6 +24,8 @@
<button class="btn btn-danger btn-sm" name="feed_url" value="{{ feed.url }}">Pause</button>
</form>
{% endif %}
<a class="text-muted" href="/whitelist?feed_url={{ feed.url|encode_url }}">Whitelist</a>
<a class="text-muted" href="/blacklist?feed_url={{ feed.url|encode_url }}">Blacklist</a>
</div>
{% for entry in entries %}

View File

@ -0,0 +1,35 @@
{% extends "base.html" %}
{% block title %} | Blacklist{% endblock %}
{% block content %}
<div class="p-2 border border-dark">
<form action="/whitelist" method="post">
<!-- Feed URL -->
<div class="row pb-2">
<div class="col-sm-12">
<div class="form-text">Comma separated list of words to whitelist. Only send message to
Discord if one of these words are present in the corresponding fields.
Whitelist always takes precedence over blacklist. Leave empty to disable.
Words are case-insensitive.
</div>
<label for="whitelist_title" class="col-sm-6 col-form-label">Whitelist - Title</label>
<input name="whitelist_title" type="text" class="form-control bg-dark border-dark text-muted"
id="whitelist_title" placeholder="primogem, events, gameplay preview, special program">
<label for="whitelist_summary" class="col-sm-6 col-form-label">Whitelist - Summary</label>
<input name="whitelist_summary" type="text" class="form-control bg-dark border-dark text-muted"
id="whitelist_summary" placeholder="primogem, events, gameplay preview, special program">
<label for="whitelist_content" class="col-sm-6 col-form-label">Whitelist - Content</label>
<input name="whitelist_content" type="text" class="form-control bg-dark border-dark text-muted"
id="whitelist_content" placeholder="primogem, events, gameplay preview, special program">
</div>
</div>
<!-- Submit button -->
<div class="d-md-flex">
<button class="btn btn-dark btn-sm">Update whitelist</button>
</div>
</form>
</div>
{% endblock %}