Add slash command
This commit is contained in:
parent
7047538a78
commit
50034cf7b0
@ -3,43 +3,7 @@ import os
|
|||||||
|
|
||||||
import discord
|
import discord
|
||||||
|
|
||||||
TIPS_MESSAGE = ":bulb: TIPS: You can disable Discord's default preview for link by wrapping it around `<` and `>`."
|
TIPS_MESSAGE = ":bulb: TIPS: You can disable Discord's default preview for link by wrapping it around `<` `>`"
|
||||||
|
|
||||||
|
|
||||||
async def send_message_with_embed(
|
|
||||||
message: discord.Message, files, title: str, tmp_dir: str, url: str
|
|
||||||
):
|
|
||||||
to_send_files = []
|
|
||||||
to_send_embeds = []
|
|
||||||
|
|
||||||
for file in files:
|
|
||||||
joined = os.path.join(tmp_dir, file)
|
|
||||||
embed = discord.Embed(url=url)
|
|
||||||
embed.set_image(url=f"attachment://{file}")
|
|
||||||
to_send_files.append(discord.File(joined, file))
|
|
||||||
to_send_embeds.append(embed)
|
|
||||||
if len(to_send_embeds) > 4:
|
|
||||||
parts = math.ceil(len(to_send_embeds) / 4)
|
|
||||||
i = 1
|
|
||||||
while len(to_send_embeds) > 4:
|
|
||||||
splited_file = to_send_files[:4]
|
|
||||||
to_send_files = to_send_files[4:]
|
|
||||||
splited_embed = to_send_embeds[:4]
|
|
||||||
to_send_embeds = to_send_embeds[4:]
|
|
||||||
for embed in splited_embed:
|
|
||||||
embed.title = f"{title} - Part {i}/{parts}"
|
|
||||||
if i == 1:
|
|
||||||
await message.reply(files=splited_file, embeds=splited_embed)
|
|
||||||
else:
|
|
||||||
await message.channel.send(files=splited_file, embeds=splited_embed)
|
|
||||||
i = i + 1
|
|
||||||
for embed in to_send_embeds:
|
|
||||||
embed.title = f"{title} - Part {i}/{parts}"
|
|
||||||
await message.channel.send(files=to_send_files, embeds=to_send_embeds)
|
|
||||||
else:
|
|
||||||
for embed in to_send_embeds:
|
|
||||||
embed.title = title
|
|
||||||
await message.reply(files=to_send_files, embeds=to_send_embeds)
|
|
||||||
|
|
||||||
|
|
||||||
async def send_message(message: discord.Message, files, tmp_dir: str, muted: bool):
|
async def send_message(message: discord.Message, files, tmp_dir: str, muted: bool):
|
||||||
@ -64,3 +28,38 @@ async def send_message(message: discord.Message, files, tmp_dir: str, muted: boo
|
|||||||
await message.reply(
|
await message.reply(
|
||||||
files=to_send_files, content=(TIPS_MESSAGE if not muted else None)
|
files=to_send_files, content=(TIPS_MESSAGE if not muted else None)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
async def send_command_reply(
|
||||||
|
interaction: discord.Interaction,
|
||||||
|
files,
|
||||||
|
tmp_dir: str,
|
||||||
|
muted: bool,
|
||||||
|
title: str,
|
||||||
|
url: str,
|
||||||
|
author: discord.User | discord.Member,
|
||||||
|
):
|
||||||
|
to_send_files = []
|
||||||
|
for file in files:
|
||||||
|
joined = os.path.join(tmp_dir, file)
|
||||||
|
to_send_files.append(discord.File(joined, file))
|
||||||
|
if len(to_send_files) > 10:
|
||||||
|
if interaction.channel is not None:
|
||||||
|
first = True
|
||||||
|
while len(to_send_files) > 10:
|
||||||
|
splited_file = to_send_files[:10]
|
||||||
|
to_send_files = to_send_files[10:]
|
||||||
|
if first:
|
||||||
|
await interaction.followup.send(
|
||||||
|
files=splited_file,
|
||||||
|
content=f"{title} - Submited by {author.mention} - <{url}> {chr(10) + TIPS_MESSAGE if not muted else ''}",
|
||||||
|
)
|
||||||
|
first = False
|
||||||
|
else:
|
||||||
|
await interaction.channel.send(files=splited_file) # type: ignore
|
||||||
|
await interaction.channel.send(files=to_send_files) # type: ignore
|
||||||
|
else:
|
||||||
|
await interaction.followup.send(
|
||||||
|
files=to_send_files,
|
||||||
|
content=f"{title} - Submited by {author.mention} - <{url}> {chr(10) + TIPS_MESSAGE if not muted else ''}",
|
||||||
|
)
|
||||||
|
@ -16,3 +16,10 @@ def should_process(
|
|||||||
else:
|
else:
|
||||||
return (False, False, match)
|
return (False, False, match)
|
||||||
return (False, False, None)
|
return (False, False, None)
|
||||||
|
|
||||||
|
|
||||||
|
def check_pixiv_url(url: str):
|
||||||
|
if match := re.search(link_regexp, url):
|
||||||
|
return (True, match)
|
||||||
|
else:
|
||||||
|
return (False, None)
|
||||||
|
71
src/main.py
71
src/main.py
@ -21,7 +21,17 @@ if DISCORD_TOKEN is None:
|
|||||||
intents = discord.Intents.default()
|
intents = discord.Intents.default()
|
||||||
intents.message_content = True
|
intents.message_content = True
|
||||||
|
|
||||||
client = discord.Client(intents=intents)
|
|
||||||
|
class MyClient(discord.Client):
|
||||||
|
def __init__(self, *, intents: discord.Intents):
|
||||||
|
super().__init__(intents=intents)
|
||||||
|
self.tree = discord.app_commands.CommandTree(self)
|
||||||
|
|
||||||
|
async def setup_hook(self):
|
||||||
|
await self.tree.sync()
|
||||||
|
|
||||||
|
|
||||||
|
client = MyClient(intents=intents)
|
||||||
|
|
||||||
|
|
||||||
@client.event
|
@client.event
|
||||||
@ -29,6 +39,65 @@ async def on_ready():
|
|||||||
print(f"We have logged in as {client.user}")
|
print(f"We have logged in as {client.user}")
|
||||||
|
|
||||||
|
|
||||||
|
@client.tree.command()
|
||||||
|
@discord.app_commands.describe(
|
||||||
|
url="Pixiv art url",
|
||||||
|
)
|
||||||
|
async def pixivprev(interaction: discord.Interaction, url: str):
|
||||||
|
"""Create pixiv preview"""
|
||||||
|
(result, match) = discord_tools.pixiv_link_extractor.check_pixiv_url(url)
|
||||||
|
if result and match is not None:
|
||||||
|
await interaction.response.defer()
|
||||||
|
with TemporaryDirectory() as tmp_dir:
|
||||||
|
title = pixiv_api.dowload_pixiv_images(
|
||||||
|
int(match.group("id")), tmp_dir, REFRESH_TOKEN
|
||||||
|
)
|
||||||
|
files = os.listdir(tmp_dir)
|
||||||
|
files.sort()
|
||||||
|
await discord_tools.message.send_command_reply(
|
||||||
|
interaction,
|
||||||
|
files,
|
||||||
|
tmp_dir,
|
||||||
|
True,
|
||||||
|
title=title,
|
||||||
|
url=url,
|
||||||
|
author=interaction.user,
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
await interaction.response.send_message("Invalid pixiv url", ephemeral=True)
|
||||||
|
|
||||||
|
|
||||||
|
@client.tree.context_menu(name="Create pixiv preview")
|
||||||
|
async def pixiv_preview(interaction: discord.Interaction, message: discord.Message):
|
||||||
|
(result, muted, match) = discord_tools.pixiv_link_extractor.should_process(message)
|
||||||
|
if result and match is not None:
|
||||||
|
await interaction.response.defer()
|
||||||
|
with TemporaryDirectory() as tmp_dir:
|
||||||
|
title = pixiv_api.dowload_pixiv_images(
|
||||||
|
int(match.group("id")), tmp_dir, REFRESH_TOKEN
|
||||||
|
)
|
||||||
|
files = os.listdir(tmp_dir)
|
||||||
|
files.sort()
|
||||||
|
await discord_tools.message.send_command_reply(
|
||||||
|
interaction=interaction,
|
||||||
|
files=files,
|
||||||
|
tmp_dir=tmp_dir,
|
||||||
|
muted=muted,
|
||||||
|
title=title,
|
||||||
|
url=match.group("url"),
|
||||||
|
author=interaction.user,
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
await interaction.response.send_message(
|
||||||
|
"Can't find any valid pixiv link.", ephemeral=True
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@client.event
|
||||||
|
async def on_guild_join(guild: discord.Guild):
|
||||||
|
print(f"Joined new guild: {guild.name}")
|
||||||
|
|
||||||
|
|
||||||
@client.event
|
@client.event
|
||||||
async def on_message(message: discord.Message):
|
async def on_message(message: discord.Message):
|
||||||
if message.author == client.user:
|
if message.author == client.user:
|
||||||
|
@ -13,10 +13,9 @@ def dowload_pixiv_images(
|
|||||||
illust = json_result.illust
|
illust = json_result.illust
|
||||||
pages = illust["meta_pages"]
|
pages = illust["meta_pages"]
|
||||||
if len(pages) > 0:
|
if len(pages) > 0:
|
||||||
print(f"Dowloading mutiple images to {dest_folder}")
|
print(f"Dowloading mutiple images to {dest_folder} ({len(pages)})")
|
||||||
for page in pages:
|
for page in pages:
|
||||||
url = page["image_urls"]["original"]
|
url = page["image_urls"]["original"]
|
||||||
print(url)
|
|
||||||
api.download(url=url, path=dest_folder)
|
api.download(url=url, path=dest_folder)
|
||||||
else:
|
else:
|
||||||
print(f"Dowloading single image to {dest_folder}")
|
print(f"Dowloading single image to {dest_folder}")
|
||||||
|
Loading…
Reference in New Issue
Block a user