Shitload of new overlays

E621 search with blacklist
This commit is contained in:
Michał Gdula 2023-09-11 19:38:11 +01:00
parent cc87c3e0ba
commit 960f452e4a
12 changed files with 179 additions and 14 deletions

View file

@ -4,10 +4,10 @@ import discord
from discord.ext import commands from discord.ext import commands
from discord.gateway import DiscordWebSocket from discord.gateway import DiscordWebSocket
from lynxie.config import DISCORD_TOKEN, LYNXIE_PREFIX from lynxie.config import DISCORD_TOKEN, LYNXIE_PREFIX, E621_BLACKLIST
from lynxie.commands import Help, Ping, Hello, Music, Animals, Img
from lynxie.database import CommandHistory, Database from lynxie.database import CommandHistory, Database
from lynxie.utils import mobile_status from lynxie.utils import mobile_status
from lynxie.commands import Help, Ping, Hello, Music, Animals, Img, E621
db = Database() db = Database()
@ -22,9 +22,32 @@ lynxie = commands.Bot(
@lynxie.event @lynxie.event
async def on_ready(): async def on_ready():
print(f"Logged in as {lynxie.user} (ID: {lynxie.user.id})") print(f"Logged in as {lynxie.user} (ID: {lynxie.user.id})")
print("------ Stats ------")
print(f"Guilds: {len(lynxie.guilds)}") in_guilds = "In Guilds: " + str(len(lynxie.guilds))
print(f"Users: {db.session.query(CommandHistory.user).distinct().count()}") commands_used = "Commands called: " + str(
db.session.query(CommandHistory.user).count()
)
unique_users = "Unique Users: " + str(
db.session.query(CommandHistory.user).distinct().count()
)
blacklisted_words = "Blacklisted Words: " + str(len(E621_BLACKLIST))
bar_len = (
max(
len(in_guilds),
len(commands_used),
len(unique_users),
len(blacklisted_words),
)
+ 4
)
print("---- Stats " + "-" * (bar_len - 11))
print(f"| {in_guilds}{' ' * (bar_len - len(in_guilds) - 3)}|")
print(f"| {commands_used}{' ' * (bar_len - len(commands_used) - 3)}|")
print(f"| {unique_users}{' ' * (bar_len - len(unique_users) - 3)}|")
print(f"| {blacklisted_words}{' ' * (bar_len - len(blacklisted_words) - 3)}|")
print("-" * bar_len)
@lynxie.event @lynxie.event
@ -62,6 +85,7 @@ async def run():
await lynxie.add_cog(Music(lynxie)) await lynxie.add_cog(Music(lynxie))
await lynxie.add_cog(Animals(lynxie)) await lynxie.add_cog(Animals(lynxie))
await lynxie.add_cog(Img(lynxie)) await lynxie.add_cog(Img(lynxie))
await lynxie.add_cog(E621(lynxie))
await lynxie.start(DISCORD_TOKEN) await lynxie.start(DISCORD_TOKEN)

View file

@ -0,0 +1,32 @@
cub
young
teen
teenager
diaper
pregnant
incest
father_and_son
father_and_daughter
mother_and_son
mother_and_daughter
brother_and_sister
sister_and_sister
brother_and_brother
bestiality
feral_and_anthro
gore
blood
vomit
torture
rape
forced
scat
watersports
urine
snuff
eating_feces

View file

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

View file

Before

Width:  |  Height:  |  Size: 934 B

After

Width:  |  Height:  |  Size: 934 B

View file

Before

Width:  |  Height:  |  Size: 9.9 KiB

After

Width:  |  Height:  |  Size: 9.9 KiB

View file

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

View file

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

View file

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

View file

@ -4,6 +4,7 @@ from .hello import Hello
from .music import Music from .music import Music
from .animals import Animals from .animals import Animals
from .image import Img from .image import Img
from .e621 import E621
__all__ = [ __all__ = [
"Help", "Help",
@ -12,4 +13,5 @@ __all__ = [
"Music", "Music",
"Animals", "Animals",
"Img", "Img",
"E621",
] ]

View file

@ -1,10 +1,100 @@
import json
from base64 import b64encode
import requests
import discord
from discord.ext import commands from discord.ext import commands
from lynxie.config import E621_API_KEY, E621_USERNAME, E621_BLACKLIST
from lynxie.utils import error_message
_E621_API_URL = "https://e621.net/"
_E621_AUTH = f"{E621_USERNAME}:{E621_API_KEY}".encode("utf-8")
_E621_API_HEADERS = {
"Accept": "application/json",
"Content-Type": "application/json",
"User-Agent": f"Lynxie/1.0 (by {E621_USERNAME} on e621)",
"Authorization": str(b"Basic " + b64encode(_E621_AUTH), "utf-8"),
}
class E621(commands.Cog): class E621(commands.Cog):
def __init__(self, bot): def __init__(self, bot):
self.bot = bot self.bot = bot
@commands.command() @commands.command()
async def e621(self, ctx): async def porb(self, ctx, *tags):
await ctx.reply(":3") # Base url for the request
url = _E621_API_URL + "posts.json/?limit=1&tags=order:random+rating:e+"
caught_tags = []
for tag in tags:
tag = tag.lower()
url += tag + "+"
if tag in E621_BLACKLIST:
caught_tags.append(tag)
for tag in E621_BLACKLIST:
url += f"-{tag}+"
if caught_tags:
error = (
"An error occurred while fetching the image! "
f"{', '.join(caught_tags)} is a blacklisted tag!"
)
await ctx.reply(embed=error_message(error))
return
request = requests.get(url, headers=_E621_API_HEADERS)
response = json.loads(request.text)
if request.status_code != 200:
error = (
"An error occurred while fetching the image! "
f"(Error code: {str(request.status_code)})"
)
await ctx.reply(embed=error_message(error))
return
if not response["posts"]:
error = "No results found for the given tags! " f"(Tags: {', '.join(tags)})"
await ctx.reply(embed=error_message(error))
return
embed = discord.Embed(
title="E621",
description=response["posts"][0]["description"]
or "No description provided.",
colour=discord.Colour.orange(),
)
embed.add_field(
name="Score",
value=f"^ {response['posts'][0]['score']['up']} | "
f"v {response['posts'][0]['score']['down']}",
)
embed.add_field(
name="Favorites",
value=response["posts"][0]["fav_count"],
)
embed.add_field(
name="Source",
value=", ".join(response["posts"][0]["sources"]) or "No source provided.",
inline=False,
)
embed.add_field(
name="Tags",
value=", ".join(response["posts"][0]["tags"]["general"]) or "No tags provided.",
inline=False,
)
embed.set_footer(
text=f"ID: {response['posts'][0]['id']} | "
f"Created: {response['posts'][0]['created_at']}"
)
embed.set_image(url=response["posts"][0]["file"]["url"])
await ctx.reply(embed=embed)

View file

@ -55,7 +55,7 @@ IMAGE_EXTENSIONS = ["png", "jpg", "jpeg", "webp"]
IMAGE_OVERLAYS = { IMAGE_OVERLAYS = {
"bubble": { "bubble": {
"path": os.path.join(ASSETS_PATH, "bubble.png"), "path": os.path.join(ASSETS_PATH, "overlays", "bubble.png"),
"options": [ "options": [
"default", # Positioned at top "default", # Positioned at top
"bottom", # Positioned at bottom "bottom", # Positioned at bottom
@ -64,23 +64,37 @@ IMAGE_OVERLAYS = {
], ],
}, },
"gang": { "gang": {
"path": os.path.join(ASSETS_PATH, "gang.png"), "path": os.path.join(ASSETS_PATH, "overlays", "gang.png"),
"options": ["default"], "options": ["default"],
}, },
"bandicam": { "bandicam": {
"path": os.path.join(ASSETS_PATH, "bandicam.png"), "path": os.path.join(ASSETS_PATH, "overlays", "bandicam.png"),
"options": ["default"], "options": ["default"],
}, },
"jerma": { "jerma": {
"path": os.path.join(ASSETS_PATH, "jerma.png"), "path": os.path.join(ASSETS_PATH, "overlays", "jerma.png"),
"options": ["default"], "options": ["default"],
}, },
"jerm-a": { "jerm-a": {
"path": os.path.join(ASSETS_PATH, "jerm-a.png"), "path": os.path.join(ASSETS_PATH, "overlays", "jerm-a.png"),
"options": ["default"], "options": ["default"],
}, },
"liveleak": { "liveleak": {
"path": os.path.join(ASSETS_PATH, "liveleak.png"), "path": os.path.join(ASSETS_PATH, "overlays", "liveleak.png"),
"options": ["default"], "options": ["default"],
}, },
} }
E621_API_KEY = (
dotenv.dotenv_values(".env").get("E621_API_KEY")
or os.environ.get("E621_API_KEY")
or None
)
E621_USERNAME = (
dotenv.dotenv_values(".env").get("E621_USERNAME")
or os.environ.get("E621_USERNAME")
or None
)
E621_BLACKLIST = set()
with open(os.path.join(ASSETS_PATH, "e621_blacklist.txt"), "r") as f:
[E621_BLACKLIST.add(line.strip()) for line in f.readlines() if line.strip()]

View file

@ -51,6 +51,9 @@ def error_message(error: str) -> discord.Embed:
title="Error :(", title="Error :(",
description=error, description=error,
colour=discord.Colour.red(), colour=discord.Colour.red(),
).set_footer(text=f"For more information, use the " f"{LYNXIE_PREFIX}help command.") )
embed.set_footer(
text=f"For more information, use the " f"{LYNXIE_PREFIX}help command."
)
return embed return embed