| 
				
				
				
				 | 
			
			 | 
			@@ -1,6 +1,7 @@ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			from __future__ import annotations | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			import math | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			import os | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			import random | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			import sys | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			from datetime import datetime, timedelta | 
		
		
	
	
		
			
				| 
				
				
				
					
				
				 | 
			
			 | 
			@@ -13,6 +14,7 @@ import ephem  # type: ignore | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			import pygame | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			import pygame.gfxdraw | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			import pytchat  # type: ignore | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			import requests | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			from cv2 import VideoCapture | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			from ephem import Moon, Observer, Sun  # type: ignore | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			from pygame import Rect, Surface | 
		
		
	
	
		
			
				| 
				
				
				
					
				
				 | 
			
			 | 
			@@ -24,7 +26,7 @@ from pytchat.processors.default.processor import Chat  # type: ignore | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			from common_module import CommonModule | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			from nizika_ai.models import Answer, AnsweredFlag, Query, User | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			from nizika_ai.consts import Platform | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			from nizika_ai.consts import AnswerType, Character, GPTModel, Platform, QueryType | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			pygame.init () | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
	
		
			
				| 
				
				
				
					
				
				 | 
			
			 | 
			@@ -46,7 +48,7 @@ def main ( | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    Deerjika (game, DeerjikaPattern.RELAXED, x = CWindow.WIDTH * 3 / 4, y = CWindow.HEIGHT - 120) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    balloon = Balloon (game) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    CurrentTime (game, SYSTEM_FONT) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    broadcast = Broadcast () | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    broadcast = Broadcast (os.environ['BROADCAST_CODE']) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    try: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        Sound ('assets/bgm.mp3').play (loops = -1) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    except Exception: | 
		
		
	
	
		
			
				| 
				
				
				
					
				
				 | 
			
			 | 
			@@ -56,14 +58,17 @@ def main ( | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            if event.type == pygame.QUIT: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                pygame.quit () | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                sys.exit () | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        chat = broadcast.fetch_chat () | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if chat is not None: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            chat.message = emoji.emojize (chat.message) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            message: str = chat.message | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            user = (User.where ('platform', Platform.YOUTUBE.value) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                        .where ('code', chat.author.channelId) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                        .get ()) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            # chat.author | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        answer_flags = (AnsweredFlag.where ('platform', Platform.YOUTUBE.value) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                                    .where ('answered', False) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                                    .get ()) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if not balloon.enabled: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            if answer_flags: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                answer_id: int = random.choice (answer_flags).answer_id | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                answer = Answer.find (answer_id) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                if answer.answer_type == AnswerType.YOUTUBE_REPLY.value: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                    query = Query.find (answer.query_id) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                    balloon.talk (query.content, answer.content) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            add_query (broadcast) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        game.redraw () | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
	
		
			
				| 
				
					
				
				
					
				
				
				 | 
			
			 | 
			@@ -666,8 +671,9 @@ class Broadcast: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    def __init__ ( | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            self, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            broadcast_code, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    ): | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        self.chat = pytchat.create (os.environ['BROADCAST_CODE']) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        self.chat = pytchat.create (broadcast_code) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    def fetch_chat ( | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            self, | 
		
		
	
	
		
			
				| 
				
				
				
					
				
				 | 
			
			 | 
			@@ -684,5 +690,42 @@ class Log: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    ... | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			def fetch_bytes_from_url ( | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        url:    str, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			) -> bytes | None: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    res = requests.get (url, timeout = 60) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if res.status_code != 200: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        return None | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    return res.content | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			def add_query ( | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        broadcast:  Broadcast, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			) -> None: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    chat = broadcast.fetch_chat () | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if chat is None: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        return | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    chat.message = emoji.emojize (chat.message) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    message: str = chat.message | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    user = (User.where ('platform', Platform.YOUTUBE.value) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                .where ('code', chat.author.channelId) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                .first ()) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if user is None: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        user = User () | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        user.platform = Platform.YOUTUBE.value | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        user.code = chat.author.channelId | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    user.name = chat.author.name | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    user.icon = fetch_bytes_from_url (chat.author.imageUrl) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    user.save () | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    query = Query () | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    query.user_id = user.id | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    query.target_character = Character.DEERJIKA.value | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    query.content = chat.message | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    query.query_type = QueryType.YOUTUBE_COMMENT.value | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    query.model = GPTModel.GPT3_TURBO.value | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    query.sent_at = datetime.now () | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    query.answerd = False | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    query.save () | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			if __name__ == '__main__': | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    main () |