""" 유틸리티 함수들 """ import random import requests from PIL import Image, ImageDraw, ImageFont import io from config import CHATBOT_RESPONSES, MEME_TEMPLATES def create_meme_image(template_info, top_text, bottom_text): """밈 이미지 생성""" try: # 기본 캔버스 생성 (실제 환경에서는 템플릿 이미지 로드) width, height = 500, 400 img = Image.new('RGB', (width, height), color='white') draw = ImageDraw.Draw(img) # 폰트 설정 (기본 폰트 사용) try: font_large = ImageFont.truetype("arial.ttf", 32) font_small = ImageFont.truetype("arial.ttf", 24) except: font_large = ImageFont.load_default() font_small = ImageFont.load_default() # 배경 그라데이션 효과 for y in range(height): color_value = int(255 * (y / height)) color = (color_value, color_value, 255) draw.line([(0, y), (width, y)], fill=color) # 텍스트 추가 if top_text: # 상단 텍스트 text_width = draw.textlength(top_text, font=font_large) x = (width - text_width) // 2 y = 30 # 텍스트 외곽선 for dx in [-1, 0, 1]: for dy in [-1, 0, 1]: if dx != 0 or dy != 0: draw.text((x+dx, y+dy), top_text, font=font_large, fill='black') draw.text((x, y), top_text, font=font_large, fill='white') if bottom_text: # 하단 텍스트 text_width = draw.textlength(bottom_text, font=font_large) x = (width - text_width) // 2 y = height - 70 # 텍스트 외곽선 for dx in [-1, 0, 1]: for dy in [-1, 0, 1]: if dx != 0 or dy != 0: draw.text((x+dx, y+dy), bottom_text, font=font_large, fill='black') draw.text((x, y), bottom_text, font=font_large, fill='white') return img except Exception as e: print(f"이미지 생성 오류: {e}") return create_error_image(str(e)) def create_error_image(error_msg): """에러 이미지 생성""" img = Image.new('RGB', (400, 300), color='red') draw = ImageDraw.Draw(img) try: font = ImageFont.load_default() draw.text((50, 150), f"오류: {error_msg}", font=font, fill='white') except: pass return img def add_text_to_image(img, text, position, font_size=32, color='white'): """이미지에 텍스트 추가""" draw = ImageDraw.Draw(img) try: font = ImageFont.truetype("arial.ttf", font_size) except: font = ImageFont.load_default() x, y = position # 외곽선 효과 for dx in [-1, 0, 1]: for dy in [-1, 0, 1]: if dx != 0 or dy != 0: draw.text((x+dx, y+dy), text, font=font, fill='black') draw.text((x, y), text, font=font, fill=color) return img def generate_response(message, qa_pipeline=None, text_generator=None): """챗봇 응답 생성""" message_lower = message.lower() # 인사말 처리 if any(greeting in message_lower for greeting in ['안녕', '하이', '헬로', '반가']): return random.choice(CHATBOT_RESPONSES["greetings"]) # 밈 관련 질문 처리 if any(word in message_lower for word in ['밈', 'meme', '이미지', '생성']): return random.choice(CHATBOT_RESPONSES["meme_help"]) # AI 모델을 사용한 응답 생성 시도 if qa_pipeline and len(message) > 10: try: # 간단한 컨텍스트로 QA 수행 context = "이것은 밈 생성과 AI 채팅 서비스입니다. 사용자들이 재미있는 밈을 만들고 AI와 대화할 수 있습니다." result = qa_pipeline(question=message, context=context) if result and 'answer' in result: return f"🤖 {result['answer']}" except Exception as e: print(f"QA 파이프라인 오류: {e}") # 텍스트 생성 모델 사용 시도 if text_generator: try: result = text_generator(f"사용자: {message}\n봇:", max_length=50, num_return_sequences=1) if result and len(result) > 0: generated_text = result[0]['generated_text'] bot_response = generated_text.split('봇:')[-1].strip() if bot_response and len(bot_response) > 5: return f"🤖 {bot_response}" except Exception as e: print(f"텍스트 생성 오류: {e}") # 기본 응답 return random.choice(CHATBOT_RESPONSES["default"]) def validate_input(text, max_length=100): """입력 텍스트 검증""" if not text or not text.strip(): return False, "텍스트를 입력해주세요." if len(text) > max_length: return False, f"텍스트가 너무 깁니다. {max_length}자 이하로 입력해주세요." # 특수문자 필터링 (선택적) forbidden_chars = ['<', '>', '&', '"', "'"] if any(char in text for char in forbidden_chars): return False, "허용되지 않는 특수문자가 포함되어 있습니다." return True, "검증 통과" def get_random_meme_idea(): """랜덤 밈 아이디어 제공""" ideas = [ ("When you finish your project", "But remember you didn't write tests"), ("Me: I'll go to bed early tonight", "Also me at 3 AM:"), ("CSS in theory", "CSS in practice"), ("My code works", "I have no idea why"), ("Expected behavior", "Actual behavior") ] return random.choice(ideas) def format_trend_data(keyword, data=None): """트렌드 데이터 포맷팅""" if not data: # 시뮬레이션 데이터 생성 popularity = random.randint(60, 95) growth = random.randint(-20, 50) related_terms = random.sample([ '바이럴', '인기', '트렌드', '웃긴', '재미있는', '핫이슈', '화제', '밈', '패러디', '유머' ], 3) result = f""" 📊 '{keyword}' 트렌드 분석 결과 🔥 인기도: {popularity}/100 📈 성장률: {growth:+d}% 🏷️ 관련 키워드: {', '.join(related_terms)} ⏰ 분석 시간: 방금 전 💡 추천: {'상승 트렌드입니다!' if growth > 0 else '관심을 끌 수 있는 키워드입니다.'} """ return result.strip() return str(data)