"실시간_설정_감시_Watchdog_기능_구현"
This commit is contained in:
@@ -3,15 +3,60 @@ from app.core.market_schedule import market_schedule
|
||||
from app.services.kis_client import kis_client
|
||||
from app.services.realtime_manager import realtime_manager
|
||||
from app.db.database import SessionLocal
|
||||
from app.db.models import StockItem, ReservedOrder
|
||||
from sqlalchemy import select, update
|
||||
import logging
|
||||
from datetime import datetime
|
||||
from app.core.startup import check_kis_connectivity, check_telegram_connectivity
|
||||
from app.db.models import StockItem, ReservedOrder, ApiSettings
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
scheduler = AsyncIOScheduler()
|
||||
|
||||
class ServiceState:
|
||||
last_keys_hash: str = ""
|
||||
telegram_active: bool = False
|
||||
naver_active: bool = False
|
||||
|
||||
@classmethod
|
||||
def get_keys_hash(cls, settings: ApiSettings):
|
||||
return f"{settings.appKey}{settings.appSecret}{settings.accountNumber}"
|
||||
|
||||
async def service_watchdog_job():
|
||||
"""
|
||||
Periodically checks settings and initiates services if they were newly enabled or changed.
|
||||
"""
|
||||
async with SessionLocal() as db_session:
|
||||
stmt = select(ApiSettings).where(ApiSettings.id == 1)
|
||||
result = await db_session.execute(stmt)
|
||||
settings_obj = result.scalar_one_or_none()
|
||||
|
||||
if not settings_obj: return
|
||||
|
||||
# 1. KIS Connectivity Watchdog
|
||||
current_hash = ServiceState.get_keys_hash(settings_obj)
|
||||
if current_hash != ServiceState.last_keys_hash and settings_obj.appKey:
|
||||
logger.info("Watchdog: KIS Credentials Changed or Initialized. Re-authenticating...")
|
||||
success = await check_kis_connectivity(db_session, settings_obj)
|
||||
if success:
|
||||
ServiceState.last_keys_hash = current_hash
|
||||
|
||||
# 2. Telegram Watchdog
|
||||
if settings_obj.useTelegram and not ServiceState.telegram_active:
|
||||
if settings_obj.telegramToken and settings_obj.telegramChatId:
|
||||
logger.info("Watchdog: Telegram newly enabled. Sending activation message.")
|
||||
from app.services.telegram_service import telegram_service
|
||||
msg = "🔔 <b>알림 서비스가 활성화되었습니다.</b>\n이제부터 주요 거래 알림을 이곳으로 보내드립니다."
|
||||
await telegram_service.send_message(settings_obj.telegramToken, settings_obj.telegramChatId, msg)
|
||||
ServiceState.telegram_active = True
|
||||
elif not settings_obj.useTelegram:
|
||||
ServiceState.telegram_active = False
|
||||
|
||||
# 3. Naver News Watchdog
|
||||
if settings_obj.useNaverNews and not ServiceState.naver_active:
|
||||
if settings_obj.naverClientId and settings_obj.naverClientSecret:
|
||||
logger.info("Watchdog: Naver News newly enabled. (Logic placeholder)")
|
||||
ServiceState.naver_active = True
|
||||
elif not settings_obj.useNaverNews:
|
||||
ServiceState.naver_active = False
|
||||
|
||||
async def market_check_job():
|
||||
"""
|
||||
Periodic check to ensure Realtime Manager is connected when market is open.
|
||||
@@ -167,6 +212,7 @@ def start_scheduler():
|
||||
scheduler.add_job(market_check_job, 'interval', minutes=5)
|
||||
scheduler.add_job(news_scrap_job, 'interval', minutes=10)
|
||||
scheduler.add_job(auto_trade_scan_job, 'interval', minutes=1)
|
||||
scheduler.add_job(service_watchdog_job, 'interval', minutes=1) # Check settings every 1 min
|
||||
scheduler.add_job(persist_market_data_job, 'interval', seconds=10) # Persist every 10s
|
||||
|
||||
scheduler.start()
|
||||
|
||||
Reference in New Issue
Block a user