spoiler filtering

This commit is contained in:
Klemek
2021-05-19 15:11:29 +02:00
parent da5e3fdb35
commit a8b1ede962
6 changed files with 69 additions and 10 deletions
+23 -3
View File
@@ -3,16 +3,24 @@ import random
# Custom libs
from utils import mention, from_now, str_datetime, message_link, SPLIT_TOKEN
from utils import (
mention,
from_now,
str_datetime,
message_link,
SPLIT_TOKEN,
FilterLevel,
should_allow_spoiler,
)
MAX_RANDOM_TRIES = 10
MAX_RANDOM_TRIES = 100
class History:
def __init__(self):
self.messages = []
async def to_string_image(self, *, type: str) -> List[str]:
async def to_string_image(self, *, type: str, spoiler: FilterLevel) -> List[str]:
if len(self.messages) == 0:
return ["There was no messages matching your filters"]
message = None
@@ -24,6 +32,10 @@ class History:
while real_message is None and index < len(self.messages):
message = self.messages[index]
real_message = await message.fetch()
if real_message is not None and not should_allow_spoiler(
real_message, spoiler
):
real_message = None
index += 1
intro = f"First image out of {len(self.messages):,}"
elif type == "last":
@@ -32,6 +44,10 @@ class History:
while real_message is None and index < len(self.messages):
message = self.messages[index]
real_message = await message.fetch()
if real_message is not None and not should_allow_spoiler(
real_message, spoiler
):
real_message = None
index += 1
intro = f"Last image out of {len(self.messages):,}"
elif type == "random":
@@ -40,6 +56,10 @@ class History:
while real_message is None and tries < MAX_RANDOM_TRIES:
message = random.choice(self.messages)
real_message = await message.fetch()
if real_message is not None and not should_allow_spoiler(
real_message, spoiler
):
real_message = None
tries += 1
if real_message is None:
+7 -2
View File
@@ -12,7 +12,10 @@ class FirstScanner(HistoryScanner):
return generate_help(
"first",
"Read first message (add text to filter like %find)",
args=["image - pull an image instead of a message"],
args=[
"image - pull an image instead of a message",
"spoiler:allow/only - allow spoiler images",
],
)
def __init__(self):
@@ -20,6 +23,8 @@ class FirstScanner(HistoryScanner):
async def get_results(self, intro: str) -> List[str]:
if self.images_only:
return await self.history.to_string_image(type="first")
return await self.history.to_string_image(
type="first", spoiler=self.spoiler
)
else:
return self.history.to_string(type="first")
+8 -1
View File
@@ -8,13 +8,14 @@ import re
from .scanner import Scanner
from data_types import History
from logs import ChannelLogs, MessageLog
from utils import FilterLevel
class HistoryScanner(Scanner, ABC):
def __init__(self, *, help: str):
super().__init__(
has_digit_args=True,
valid_args=["all", "everyone"],
valid_args=["all", "everyone", "spoiler", "spoiler:allow", "spoiler:only"],
help=help,
intro_context="",
all_args=True,
@@ -24,6 +25,12 @@ class HistoryScanner(Scanner, ABC):
self.history = History()
self.all_messages = "all" in args or "everyone" in args
self.images_only = "image" in args
if "spoiler" in args or "spoiler:allow" in args:
self.spoiler = FilterLevel.ALLOW
elif "spoiler:only" in args:
self.spoiler = FilterLevel.ONLY
else:
self.spoiler = FilterLevel.NONE
if not self.images_only:
self.queries = [
(
+5 -2
View File
@@ -12,7 +12,10 @@ class LastScanner(HistoryScanner):
return generate_help(
"last",
"Read last message (add text to filter like %find)",
args=["image - pull an image instead of a message"],
args=[
"image - pull an image instead of a message",
"spoiler:allow/only - allow spoiler images",
],
)
def __init__(self):
@@ -20,6 +23,6 @@ class LastScanner(HistoryScanner):
async def get_results(self, intro: str) -> List[str]:
if self.images_only:
return await self.history.to_string_image(type="last")
return await self.history.to_string_image(type="last", spoiler=self.spoiler)
else:
return self.history.to_string(type="last")
+7 -2
View File
@@ -12,7 +12,10 @@ class RandomScanner(HistoryScanner):
return generate_help(
"rand",
"Read a random message (add text to filter like %find)",
args=["image - pull an image instead of a message"],
args=[
"image - pull an image instead of a message",
"spoiler:allow/only - allow spoiler images",
],
)
def __init__(self):
@@ -20,6 +23,8 @@ class RandomScanner(HistoryScanner):
async def get_results(self, intro: str) -> List[str]:
if self.images_only:
return await self.history.to_string_image(type="random")
return await self.history.to_string_image(
type="random", spoiler=self.spoiler
)
else:
return self.history.to_string(type="random")
+19
View File
@@ -100,6 +100,25 @@ class FakeMessage:
self.id = id
def is_image_spoiler(message: discord.Message) -> bool:
if len(message.attachments) > 0:
return message.attachments[0].is_spoiler()
elif len(message.embeds) > 0:
return re.match(r"||[^|]*http[^|]||", message.content.lower()) is not None
else:
return False
def should_allow_spoiler(message: discord.Message, spoiler: FilterLevel) -> bool:
is_spoiler = is_image_spoiler(message)
return (
not is_spoiler
and spoiler <= FilterLevel.ALLOW
or is_spoiler
and spoiler >= FilterLevel.ALLOW
)
# FILE