import discord import logging import os from io import BytesIO from gradio_client import Client # 로깅 설정 logging.basicConfig(level=logging.DEBUG, format='%(asctime)s:%(levelname)s:%(name)s: %(message)s', handlers=[logging.StreamHandler()]) # 인텐트 설정 intents = discord.Intents.default() intents.message_content = True # API 클라이언트 설정 api_client = Client("http://211.233.58.202:7960/") # 디스코드 봇 클래스 class MyClient(discord.Client): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.is_processing = False async def on_ready(self): logging.info(f'{self.user}로 로그인되었습니다!') # 상호 대화 기능 알림 channel = self.get_channel(int(os.getenv("DISCORD_CHANNEL_ID", "123456789012345678"))) await channel.send("저는 이미지 생성을 수행할 수 있으며, 생성된 이미지에 대한 설명을 한글로 제공하고 상호 대화를 할 수 있습니다. '!image <프롬프트>'를 사용하여 이미지를 요청하세요.") async def on_message(self, message): if message.author == self.user: return if message.content.startswith('!image '): if self.is_processing: await message.channel.send("이미지 생성이 이미 진행 중입니다. 잠시만 기다려 주세요.") return self.is_processing = True try: prompt = message.content[len('!image '):] image_path, used_seed, translated_prompt = await self.generate_image(prompt) user_id = message.author.id await message.channel.send( f"<@{user_id}> 님이 요청하신 이미지입니다.\n" f"사용된 시드: {used_seed}\n" f"번역된 프롬프트: {translated_prompt}", file=discord.File(image_path) ) # 이미지 생성 후 설명 제공 및 대화 await initiate_conversation(prompt, message) except Exception as e: logging.error(f'이미지 생성 중 오류 발생: {e}') await message.channel.send("사용 예시: !image 고양이가 'HAPPY WORLD'라고 쓰여진 표지판을 들고있다. ") finally: self.is_processing = False async def generate_image(self, prompt): if not prompt: raise ValueError("Prompt is empty or None") logging.debug(f"Sending request to API with prompt: {prompt}") try: result = api_client.predict( prompt=prompt, seed=123, randomize_seed=False, width=1024, height=576, guidance_scale=5, num_inference_steps=28, api_name="/infer_t2i" ) logging.debug(f"API response received: {result}") if isinstance(result, tuple) and len(result) == 3: image_path, used_seed, translated_prompt = result logging.info(f"Image generated at: {image_path}") logging.info(f"Used seed: {used_seed}") logging.info(f"Translated prompt: {translated_prompt}") return image_path, used_seed, translated_prompt else: raise ValueError("Unexpected API response format") except gradio_client.exceptions.AppError as e: logging.error(f"Gradio App Error: {e}") raise RuntimeError(f"API 서버 오류: {str(e)}. 서버 관리자에게 문의하세요.") except Exception as e: logging.error(f'API 요청 중 오류 발생: {e}', exc_info=True) raise RuntimeError(f"API 요청 중 오류 발생: {str(e)}") async def initiate_conversation(prompt, message): logging.debug(f'대화 시작 중: {prompt}') # 이미지 설명을 한글로 생성 description = "생성된 이미지입니다." logging.debug(f'이미지 설명: {description}') await message.channel.send(f"이미지 설명: {description}") await continue_conversation(prompt, message) async def continue_conversation(prompt, message): # 대화 지속 기능 logging.debug(f'대화 지속 중: {prompt}') # 계속 대화 내용을 받아 상호작용하도록 구현 # 디스코드 토큰 및 봇 실행 if __name__ == "__main__": discord_token = os.getenv('DISCORD_TOKEN') discord_client = MyClient(intents=intents) discord_client.run(discord_token)