From 3605311570ae35d11cd1d5d4ae2030fce8cb13ae Mon Sep 17 00:00:00 2001 From: tmddn3070 Date: Mon, 27 Nov 2023 00:27:32 +0900 Subject: [PATCH] Add edit mode functionality to Mail_Confirm_Button and implement mail checking feature --- Christmas/Cogs/Commands_Aiart.py | 38 +++++++++++--- Christmas/Cogs/Commands_Mail.py | 38 +++++++++++++- Christmas/Database/__init__.py | 40 +++++++++++--- Christmas/Module.py | 87 +++++++++++++++++++++++++++++-- Christmas/UI/Buttons.py | 11 ++-- Christmas/UI/Embed.py | 89 ++++++++++++++++++++++++++++++-- Christmas/UI/Modal.py | 83 +++++++++++++++++++++++++++-- Christmas/UI/Paginator.py | 62 ++++++++++++++++++++++ 8 files changed, 416 insertions(+), 32 deletions(-) create mode 100644 Christmas/UI/Paginator.py diff --git a/Christmas/Cogs/Commands_Aiart.py b/Christmas/Cogs/Commands_Aiart.py index 2ba5290..3c90be4 100644 --- a/Christmas/Cogs/Commands_Aiart.py +++ b/Christmas/Cogs/Commands_Aiart.py @@ -1,18 +1,40 @@ -from discord import ApplicationContext, DiscordException -from discord.ext.commands import Cog - +from discord import ApplicationContext, DiscordException, SlashCommandGroup, Option, Member, File, Attachment, Color, utils, User, Message, TextChannel, Forbidden, HTTPException +from discord.ext.commands import Cog, BucketType, cooldown +from Christmas.Database import database +from Christmas.UI.Embed import Aiart_Embed, ChristmasEmbed +from Christmas.UI.Modal import Aiart class CAiart(Cog): def __init__(self, bot): self.bot = bot + + ART = SlashCommandGroup("그림", "그림 기능") + + @ART.command(name="생성", description="루나가 그림을 그려줍니다.") + @cooldown(1, 10, BucketType.user) + async def _생성(self, ctx, ress: Option(str, name="해상도",description="그림의 해상도를 입력해주세요. (기본값: 512x512)", required=False, choices=["1:1", "2:3", "7:4","3:4"], default="1:1"), + shows: Option(str, name="보기여부",description="생성된 그림을 나를 제외한 사람한테 보여줄지 말지를 지정합니다.", choices=["보여주기","보여주지 말기"],required=False, default="보여주기"), + style1: Option(float, name="디테일표현",description="그림의 디테일정도를 지정합니다. -1에 가까울수록 단순한 그림이 나오고 1에 가까울수록 높은 디테일을 구현 합니다.", required=False, min_value=-1,max_value=1, default=0), + style2: Option(float, name="광선표현", description="그림의 광선 디테일 정도를 지정합니다. 0.8에 가까울수록 더 부드럽고 좋은 광선표현을 하지만 그림의 디테일이 떨어지거나 캐릭터일 경우 손이 제대로 생성되지 않을수 있습니다.", required=False, min_value=0,max_value=0.8, default=0), + afterprocess: Option(float, name="후처리정도", description="그림의 후처리 정도를 정합니다. 0.99에 가까울수록 후처리랑 강하게 합니다", required=False, min_value=0,max_value=0.99, default=0.5) + ): + if not await database.get_guild(ctx.guild.id): return await ctx.respond(embed=ChristmasEmbed(title="❌ 에러!", description="서버가 가입되어있지 않아요! 서버를 가입해주세요!", color=Color.red()),ephemeral=True) + nsfw = False + afterprocess = 1 - afterprocess + if ctx.channel.is_nsfw(): nsfw = True + if shows == "보여주기": shows = True + else: shows = False + if ress == "1:1": resoultion = [512,512] + elif ress == "2:3": resoultion = [512,768] + elif ress == "7:4": resoultion = [896,512] + elif ress == "3:4": resoultion = [600,800] + # allownsfw: bool, res: list, style1: float, style2: float, afterprocess: float + modal = Aiart(title="태그를 입력해주세요",allownsfw=nsfw, res=resoultion, style1=style1, style2=style2, afterprocess=afterprocess, show=shows) + await ctx.send_modal(modal) - - @Cog.listener() - async def on_application_command_error(ctx: ApplicationContext, exception: DiscordException) -> None: - pass - + def setup(bot): diff --git a/Christmas/Cogs/Commands_Mail.py b/Christmas/Cogs/Commands_Mail.py index 6d4531e..5e747cd 100644 --- a/Christmas/Cogs/Commands_Mail.py +++ b/Christmas/Cogs/Commands_Mail.py @@ -1,8 +1,12 @@ +import pendulum + from discord import Member, SlashCommandGroup, Option from discord.ext.commands import Cog, cooldown, BucketType, command, has_permissions, bot_has_permissions, Context, guild_only, bot_has_guild_permissions, check from Christmas.UI.Modal import Send_Mail_Modal - +from Christmas.UI.Embed import Mail_Embed +from Christmas.Database import database +from Christmas.UI.Paginator import Mail_Paginator class CMail(Cog): def __init__(self, bot): self.bot = bot @@ -13,8 +17,38 @@ class CMail(Cog): @cooldown(1, 10, BucketType.user) @guild_only() async def _send(self, ctx: Context, member: Option(Member, name="보낼사람", description="편지를 받을 사람을 선택해주세요.", required=True)): - modal = Send_Mail_Modal(reciveuser=member, title="편지 보내기") + if pendulum.now().year >= 2023 and pendulum.now().month >= 12 and pendulum.now().day >= 24 and pendulum.now().hour >= 11 and pendulum.now().minute >= 59 and pendulum.now().second >= 59: + await ctx.respond("이미 편지를 보낼수 있는 기간이 지났어요! 받은 편지가 있다면 확인해보세요!", ephemeral=True) + return + if await database.get_mail_user(member.id, ctx.author.id): + if await database.get_instered_mail_edited(member.id, ctx.author.id): + await ctx.respond(embed=Mail_Embed.mail_cant_edit(), ephemeral=True) + return + else: + modal = Send_Mail_Modal(reciveuser=member, editmode=True, title="편지 수정하기") + await ctx.send_modal(modal) + return + modal = Send_Mail_Modal(editmode=False, reciveuser=member, title="편지 보내기") await ctx.send_modal(modal) + @MAIL.command(name="확인", description="받은 편지를 확인합니다.") + @cooldown(1, 10, BucketType.user) + async def _check(self, ctx: Context): + #관리자를 제외하고는 2023년 12월 25일 00시 00분 00초 이후부터 확인 가능 + #if pendulum.now().year >= 2023 and pendulum.now().month >= 12 and pendulum.now().day >= 25 and pendulum.now().hour >= 00 and pendulum.now().minute >= 00 and pendulum.now().second >= 00: + # await ctx.respond("아직 편지를 확인할수 있는 기간이 아니에요! 조금만 기다려주세요!") + # return + mails = await database.get_mail(ctx.author.id) + if mails == None: + await ctx.respond(embed=Mail_Embed.mail_notfound(), ephemeral=True) + return + else: + mails = mails["mails"] + embeds = [] + for data in mails: + embeds.append(Mail_Embed.mail_page(data)) + print(embeds) + paginator = Mail_Paginator(embeds=embeds, senduser=ctx.author, timeout=None) + await ctx.respond(embed=embeds[0], view=paginator, ephemeral=True) def setup(bot): bot.add_cog(CMail(bot)) \ No newline at end of file diff --git a/Christmas/Database/__init__.py b/Christmas/Database/__init__.py index 80b1475..4da8600 100644 --- a/Christmas/Database/__init__.py +++ b/Christmas/Database/__init__.py @@ -21,20 +21,48 @@ class database: conn = await MongoDBClient().connect() await conn.guild.insert_one({"_id": guild_id}) - async def insert_mail(send_user_id: int, user_id: int, mail_title: str, mail_content: str): + async def insert_mail(send_user_id: int, user_id: int, user_name: str, mail_title: str, mail_content: str): try: conn = await MongoDBClient().connect() mail_title = f"""{mail_title}""" mail_content = f"""{mail_content}""" if await conn.mail.find_one({"_id": user_id}) == None: - await conn.mail.insert_one({"_id": user_id, "mails": [{"userid": send_user_id, "title": mail_title, "content": mail_content}]}) + await conn.mail.insert_one({"_id": user_id, "mails": [{"userid": send_user_id, "username": user_name, "title": mail_title, "content": mail_content, "edited": False}]}) else: - await conn.db.mail.update_one({"_id": user_id}, {"$push": {"mails": {"userid": send_user_id, "title": mail_title, "content": mail_content}}}) + result = await conn.mail.update_one({"_id": user_id}, {"$push": {"mails": {"userid": send_user_id, "username": user_name, "title": mail_title, "content": mail_content, "edited": False}}}) + print(result) except Exception as e: print(e) - async def get_mail(user_id: int) -> dict: + async def update_inserted_mail(send_user_id: int, user_id: int, mail_title: str, mail_content: str): + try: + conn = await MongoDBClient().connect() + await conn.mail.update_one({"_id": user_id, "mails.userid": send_user_id}, {"$set": {"mails.$.title": mail_title, "mails.$.content": mail_content, "mails.$.edited": True}}) + return True + except Exception as e: + print(e) + return None + + async def get_instered_mail_edited(send_user_id: int, user_id: int): + try: + conn = await MongoDBClient().connect() + data = await conn.mail.find_one({"_id": user_id, "mails.userid": send_user_id}) + return data["mails"][0]["edited"] + except Exception as e: + print(e) + return None + + async def get_mail(user_id: int): conn = await MongoDBClient().connect() - return await conn.mail.find_one({"_id": user_id}) + data = await conn.mail.find_one({"_id": user_id}) + if data == None: return None + return data - + async def get_mail_user(one_user_id: int, two_user_id: int): + conn = await MongoDBClient().connect() + data = await conn.mail.find_one({"_id": one_user_id}) + if data == None: return False + for mail in data["mails"]: + if mail["userid"] == two_user_id: + return True + \ No newline at end of file diff --git a/Christmas/Module.py b/Christmas/Module.py index c751537..f7c006e 100644 --- a/Christmas/Module.py +++ b/Christmas/Module.py @@ -1,7 +1,86 @@ -import korcen +import io +import PIL +import base64 +import re +import random +import aiohttp +import asyncio +from aiogoogletrans import Translator +from typing import Any, Dict +from discord import File -korcen_checker = korcen.Korcen() +translator = Translator() +weight = [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.7, 0.8, 0.9] +cfg = [6,7,8,9,10,11] +#def check_curse(text: str): +# return korcen_checker.check(text) +def is_korean(string): + pattern = re.compile(r"[ㄱ-ㅎㅏ-ㅣ가-힣]") + match = pattern.search(string) + return bool(match) + +async def process_prompt(prompt: str, remove: str, res: list, isnsfw: bool, style1: float, style2: float, afterprocess: float): + if is_korean(prompt): + prompt = await translator.translate(prompt, dest="en") + prompt = prompt.text + if is_korean(remove): + remove = await translator.translate(remove, dest="en") + remove = remove.text + default_negative = """(KHFB, AuroraNegative, easynegative, negative_hand-neg, verybadimagenegative_v1.3:0.8), (Worst Quality, Low Quality:1.4), border, skimpy, grayscale, multiple_girls, 3d, realistic, string, multiple hands, chinese, thick abs, chubby abs, lowres, bad anatomy, asymmetric wings, elf, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, large areolae, worst quality, low quality, normal quality, jpeg artifacts, signature, watermark, username, blurry, Multiple legs, multiple feet, tie, (necktie:1.5), several hands, three feet, four legs, three legs,animal ears""" + if style1 != 0: + prompt = prompt + f"" + if style2 != 0: + prompt = prompt + f"" + if remove != None: + negative_prompt = default_negative + "," + remove + add_prompt = random.choice([True, False]) + if add_prompt == True: + qprompt = prompt + f"" + payloads = { + "prompt": prompt, + "negative_prompt": negative_prompt, + "seed": random.randint(0, 1000000000), + "steps": 25, + "cfg_scale": random.choice(cfg), + "width": res[0], + "height": res[1], + "sampler_index": "DPM++ 2M Karras", + "refiner_checkpoint": "smooREFINERV2R10_half", + "refiner_switch_at": afterprocess, + "alwayson_scripts": { + "ADetailer": { + 'args': [ + { + 'ad_model': 'face_yolov8n.pt', + 'ad_inpaint_only_masked': True + }] + }}} + return payloads -def check_curse(text: str): - return korcen_checker.check(text) \ No newline at end of file +async def post_gpu_server(url: str, payload: Dict[str, Any]): + async with aiohttp.ClientSession() as session: + try: + async with session.post(url, json=payload, timeout=300) as response: + if response.status == 200: + return {"status": True, "data": await response.json()} + else: + return {"status": False, "data": None} + except Exception as e: + if isinstance(e, asyncio.TimeoutError): + return {"status": False, "data": None} + + +async def image_to_base64(image) -> str: + img = PIL.Image.open(image) + img = img.convert("RGB") + img_byte_arr = io.BytesIO() + img.save(img_byte_arr, format='PNG') + img_byte_arr = img_byte_arr.getvalue() + img_str = base64.b64encode(img_byte_arr).decode("utf-8") + return img_str + + +async def base64_to_image(base642) -> File: + attachment = File(io.BytesIO(base64.b64decode(base642)), filename="image.png") + return attachment \ No newline at end of file diff --git a/Christmas/UI/Buttons.py b/Christmas/UI/Buttons.py index ce33912..32797e4 100644 --- a/Christmas/UI/Buttons.py +++ b/Christmas/UI/Buttons.py @@ -5,7 +5,8 @@ from Christmas.UI.Embed import Mail_Embed from Christmas.Database import database class Mail_Confirm_Button(View): - def __init__(self, recive_user: Member, title: str, description: str, *args, **kwargs): + def __init__(self, editmode: bool, recive_user: Member, title: str, description: str, *args, **kwargs): + self.editmode = editmode self.recive_user = recive_user self.title = title self.description = description @@ -18,8 +19,12 @@ class Mail_Confirm_Button(View): await interaction.edit_original_response(embed=Embed(title="❌ 에러!", description="서버가 가입되어있지 않아요! 서버에 가입해주세요!"), view=None) return else: - await database.insert_mail(interaction.user.id, self.recive_user.id, self.title, self.description) - await interaction.edit_original_response(embed=Mail_Embed.mail_sended(receive_user=self.recive_user), view=None) + if self.editmode == True: + await database.update_inserted_mail(self.recive_user.id, interaction.user.id, self.title, self.description) + await interaction.edit_original_response(embed=Mail_Embed.mail_edit_sended(receive_user=self.recive_user), view=None) + else: + await database.insert_mail(interaction.user.id, self.recive_user.id, interaction.user.name, self.title, self.description) + await interaction.edit_original_response(embed=Mail_Embed.mail_sended(receive_user=self.recive_user), view=None) @button(label="취소", style=ButtonStyle.red, custom_id="mail_cancel") async def cancel(self, button, interaction: Interaction): diff --git a/Christmas/UI/Embed.py b/Christmas/UI/Embed.py index 5d9b997..67f86d0 100644 --- a/Christmas/UI/Embed.py +++ b/Christmas/UI/Embed.py @@ -2,6 +2,7 @@ from typing import Any, Optional from discord import Embed, Colour, Embed, Member from discord.types.embed import EmbedType from datetime import datetime +from korcen import korcen class ChristmasEmbed(Embed): def __init__(self, *, @@ -21,8 +22,8 @@ class ChristmasEmbed(Embed): timestamp=timestamp, ) - def set_footer(self, *, text: Any | None = "크돌이", icon_url: Any | None = "https://discord.com/assets/6dbfff5aae6b1de2b83f.svg") -> None: - super().set_footer(text=text, icon_url=icon_url) + def set_footer(self, *, text: Any | None = "크돌이⛄", icon_url: Any | None = "https://discord.com/assets/6dbfff5aae6b1de2b83f.svg") -> None: + super().set_footer(text=text) class Default_Embed: @@ -56,18 +57,96 @@ class Mail_Embed: @staticmethod def mail_confirm(title: str, description: str, receive_user: Member) -> Embed: embed = ChristmasEmbed(title="⚠️ 전송전 확인", description="편지를 정말로 전송하시겠습니까?") - embed.add_field(name="⚠️ 주의사항 ⚠️", value="편지는 한 번 전송하면 취소할 수 없어요!\n 내용을 잘 읽고 ``전송``버튼을 눌러주세요!", inline=False) + embed.add_field(name="⚠️ 주의사항 ⚠️", value="편지는 한 번 전송하면 한번의 수정 기회 이후에는 취소할 수 없어요!\n 내용을 잘 읽고 ``전송``버튼을 눌러주세요!", inline=False) embed.add_field(name="받는이", value=f"{receive_user.mention}", inline=False) embed.add_field(name="제목", value=title, inline=False) embed.add_field(name="내용", value=description, inline=False) embed.set_footer() return embed + @staticmethod + def mail_confirm_edit(title: str, description: str, receive_user: Member) -> Embed: + embed = ChristmasEmbed(title="⚠️ 수정전 확인", description="편지를 정말로 수정하시겠습니까?") + embed.add_field(name="⚠️ 주의사항 ⚠️", value="이번에 편지를 수정하면 다시는 수정할 수 없게 되요!\n 내용을 잘 읽고 ``전송``버튼을 눌러주세요!", inline=False) + embed.add_field(name="받는이", value=f"{receive_user.mention}", inline=False) + embed.add_field(name="제목", value=title, inline=False) + embed.add_field(name="내용", value=description, inline=False) + embed.set_footer() + return embed + + @staticmethod + def mail_cant_edit(): + embed = ChristmasEmbed(title="❌ 편지 수정 실패!", description="편지 수정에 실패했어요!") + embed.add_field(name="안내", value="편지는 한 번 전송하면 한번의 수정 기회 이후에는 취소할 수 없어요!", inline=False) + embed.set_footer() + return embed + + @staticmethod def mail_sended(receive_user: Member) -> Embed: embed = ChristmasEmbed(title="✅ 전송완료!", description="편지 전송을 완료했어요!") - embed.add_field(name="안내", value="보낸 편지는 2023년 12월 25일부터 열람 가능해요", inline=False) + embed.add_field(name="안내", value="보낸 편지는 2023년 12월 25일부터 열람 가능해요!", inline=False) + embed.add_field(name="받는이", value=f"{receive_user.mention}", inline=False) + return embed + + @staticmethod + def mail_edit_sended(receive_user: Member) -> Embed: + embed = ChristmasEmbed(title="✅ 수정완료!", description="편지 수정을 완료했어요!") + embed.add_field(name="안내", value="수정된 편지는 2023년 12월 25일부터 열람 가능해요!", inline=False) embed.add_field(name="받는이", value=f"{receive_user.mention}", inline=False) return embed - \ No newline at end of file + @staticmethod + def mail_notfound() -> Embed: + embed = ChristmasEmbed(title="❌ 편지 없음!", description="편지가 없어요!") + embed.add_field(name="안내", value="받은 편지가 없어요!", inline=False) + embed.set_footer() + return embed + + @staticmethod + def mail_already_sended() -> Embed: + embed = ChristmasEmbed(title="❌ 편지 전송 실패!", description="이미 편지를 보냈어요!") + embed.add_field(name="안내", value="이미 편지를 보냈어요!", inline=False) + embed.set_footer() + return embed + + @staticmethod + def mail_page(data) -> Embed: + embed = ChristmasEmbed(title="📨 편지", description="편지를 확인해보세요!(욕설등 민감한 내용이 포함된 내용은 자동으로 스포일러처리되요!)") + username = data["username"] + userid = data["userid"] + title = data["title"] + description = data["content"] + if korcen.check(title) == True: + title = "||" + title + "||" + if korcen.check(description) == True: + description = "||" + description + "||" + embed.add_field(name="보낸이", value=f"{username}({userid})", inline=False) + embed.add_field(name="제목", value=title, inline=False) + embed.add_field(name="내용", value=description, inline=False) + embed.set_footer() + return embed + +class Aiart_Embed: + + @staticmethod + def failed_generate() -> Embed: + embed = ChristmasEmbed(title="❌ 그림 생성 실패!", description="그림 생성에 실패했어요!") + embed.add_field(name="안내", value="그림 생성에 실패했어요! 이 현상이 지속된다면 서비스 서버에 문의해주세요!", inline=False) + embed.set_footer() + return embed + + @staticmethod + def sucess_generate(prompt: str, remove: str) -> Embed: + embed = ChristmasEmbed(title="✅ 그림 생성 성공!", description="그림 생성에 성공했어요!") + embed.add_field(name="프롬포트", value=prompt, inline=False) + embed.add_field(name="지운 프롬포트", value=remove, inline=False) + embed.set_image(url="attachment://image.png") + embed.set_footer() + return embed + @staticmethod + def generating() -> Embed: + embed = ChristmasEmbed(title="그림 생성중...", description="그림을 생성하는 중이에요!") + embed.add_field(name="안내", value="그림 생성에는 최대 2분이 소요될 수 있어요!(크돌이는 돈이 없어요...)", inline=False) + embed.set_footer() + return embed diff --git a/Christmas/UI/Modal.py b/Christmas/UI/Modal.py index e851942..e6a71c4 100644 --- a/Christmas/UI/Modal.py +++ b/Christmas/UI/Modal.py @@ -3,11 +3,43 @@ from discord.ui import Modal, InputText #from Christmas.Module import check_curse -from Christmas.UI.Embed import Mail_Embed +from Christmas.UI.Embed import Mail_Embed, Aiart_Embed from Christmas.UI.Buttons import Mail_Confirm_Button +from Christmas.Module import process_prompt, post_gpu_server, base64_to_image + +BLOCKTAG = [ + "nsfw", + "nude", + "nipples", + "nipple", + "pussy", + "public hair", + "gay", + "lesbian", + "corpse", + "no panties", + "no panty", + "no bra", + "bra", + "panty", + "panties", + "underwear", + "undergarment", + "underpants", + "underpant", + "blowjob", + "sex", + "sexy", + "pennis" + "realistic", + "open breasts", + "breasts" +] + class Send_Mail_Modal(Modal): - def __init__(self, reciveuser: Member, *args, **kwargs): + def __init__(self, reciveuser: Member, editmode: bool, *args, **kwargs): self.reciveuser = reciveuser + self.editmode = editmode super().__init__(timeout=None, *args, **kwargs) self.add_item(InputText(label="제목", placeholder="제목을 입력해주세요.", style=InputTextStyle.short, required=True, custom_id="mail_title")) @@ -15,5 +47,48 @@ class Send_Mail_Modal(Modal): async def callback(self, interaction: Interaction): - await interaction.response.send_message(embed=Mail_Embed.mail_confirm(self.children[0].value, self.children[1].value, self.reciveuser), view=Mail_Confirm_Button(self.reciveuser, title=self.children[0].value, description=self.children[1].value),ephemeral=True) - \ No newline at end of file + if self.editmode == False: + await interaction.response.send_message(embed=Mail_Embed.mail_confirm(self.children[0].value, self.children[1].value, self.reciveuser), view=Mail_Confirm_Button(recive_user=self.reciveuser, title=self.children[0].value, description=self.children[1].value, editmode=False),ephemeral=True) + else: + await interaction.response.send_message(embed=Mail_Embed.mail_confirm_edit(self.children[0].value, self.children[1].value, self.reciveuser), view=Mail_Confirm_Button(recive_user=self.reciveuser, title=self.children[0].value, description=self.children[1].value, editmode=True),ephemeral=True) +class Aiart(Modal): + def __init__(self, show: bool, allownsfw: bool, res: list, style1: float, style2: float, afterprocess: float, *args, **kwargs): + self.show = show + self.allownsfw = allownsfw + self.res = res + self.style1 = style1 + self.style2 = style2 + self.afterprocess = afterprocess + super().__init__(timeout=None, *args, **kwargs) + + self.add_item(InputText(label="그람에 포함시키고 싶은 태그를 입력해주세요.", placeholder="한글도 입력 가능해요!", style=InputTextStyle.long, required=True, custom_id="aiart_tag")) + self.add_item(InputText(label="그림에서 제거하고 싶은 태그를 입력해주세요.", placeholder="한글도 입력 가능해요!", style=InputTextStyle.long, required=False, custom_id="aiart_remove_tag")) + + async def callback(self, interaction: Interaction): + prompt = self.children[0].value + remove = self.children[1].value + #255자까지 자름 + original_prompt = prompt + original_remove = remove + if len(prompt) > 255: + original_prompt = original_prompt[:255] + if len(remove) > 255: + original_remove = original_remove[:255] + if self.allownsfw is False: + for i in BLOCKTAG: + if i in prompt: + prompt = prompt.replace(i, "") + await interaction.response.send_message(embed=Aiart_Embed.generating(), ephemeral=self.show) + #prompt: str, remove: str, res: list, isnsfw: bool, style1: float, style2: float, afterprocess: float + payload = await process_prompt(prompt, remove, self.res, self.allownsfw, self.style1, self.style2, self.afterprocess) + result = await post_gpu_server("http://172.30.1.49:7860/sdapi/v1/txt2img", payload) + if result["status"] != True: + return await interaction.edit_original_response(embed=Aiart_Embed.failed_generate()) + else: + try: + #print(result) + attachment = await base64_to_image(result["data"]["images"][0]) + except Exception as e: + return await interaction.edit_original_response(embed=Aiart_Embed.failed_generate()) + await interaction.edit_original_response(embed=Aiart_Embed.sucess_generate(original_prompt,original_remove), file=attachment) + \ No newline at end of file diff --git a/Christmas/UI/Paginator.py b/Christmas/UI/Paginator.py new file mode 100644 index 0000000..23c1375 --- /dev/null +++ b/Christmas/UI/Paginator.py @@ -0,0 +1,62 @@ +from functools import cached_property +from typing import Any, Dict, List, Union + +from discord.ui import button + +from discord.enums import ButtonStyle +from discord.interactions import Interaction +from discord.ui import Button, View + +from Christmas.UI.Embed import ChristmasEmbed + +class Mail_Paginator(View): + def __init__( + self, + senduser: int, + embeds: list[ChristmasEmbed], + timeout: int = 180, + + ): + super().__init__(timeout=timeout) + self.embeds = embeds + self.index = 0 + self.senduser = senduser + self.selected = False + + @cached_property + def total(self) -> int: + return len(self.embeds) + + async def interaction_check(self, interaction: Interaction) -> bool: + if user := interaction.user: + if user.id == self.senduser.id: + return True + + await interaction.response.send_message( + "명령어 실행자만 상호작용이 가능합니다.", ephemeral=True + ) + + return False + + @button(label="이전", style=ButtonStyle.primary, emoji="◀") + async def prev(self, button, interaction: Interaction) -> None: + self.index -= 1 + + if self.index < 0: + self.index = self.total - 1 + + await interaction.response.edit_message(embed=self.embeds[self.index]) + + @button(label="다음", style=ButtonStyle.primary, emoji="▶️") + async def next(self, button, interaction: Interaction) -> None: + self.index += 1 + + if self.index >= self.total: + self.index = 0 + + await interaction.response.edit_message(embed=self.embeds[self.index]) + + @button(label="닫기", style=ButtonStyle.danger, emoji="✖️") + async def close(self, button, interaction: Interaction) -> None: + await interaction.response.defer() + self.stop() \ No newline at end of file