Shitload of new overlays
E621 search with blacklist
|
@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
|
32
lynxie/assets/e621_blacklist.txt
Normal 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
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.1 KiB |
Before Width: | Height: | Size: 934 B After Width: | Height: | Size: 934 B |
Before Width: | Height: | Size: 9.9 KiB After Width: | Height: | Size: 9.9 KiB |
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 30 KiB |
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.9 KiB |
|
@ -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",
|
||||||
]
|
]
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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()]
|
||||||
|
|
|
@ -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
|
||||||
|
|