server.pyโข3.85 kB
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
๐ง Server State Management
์๋ฒ ์ํ ๊ด๋ฆฌ ๋ฐ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์
"""
import asyncio
import random
import time
class ServerState:
"""์๋ฒ์ ๋ชจ๋ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ํด๋์ค"""
def __init__(self, boss_alertness: int, boss_alertness_cooldown: int):
"""
Args:
boss_alertness: Boss ๊ฒฝ๊ณ๋ ์์น ํ๋ฅ (0-100%)
boss_alertness_cooldown: Boss ๊ฒฝ๊ณ๋ ์๋ ๊ฐ์ ์ฃผ๊ธฐ (์ด)
"""
self.stress_level: int = 50
self.boss_alert_level: int = 0
self.boss_alertness_prob: float = boss_alertness / 100.0
self.boss_alertness_cooldown: int = boss_alertness_cooldown
self.last_stress_increase_time: float = time.time()
self.last_alert_decrease_time: float = time.time()
# ํด๊ทผ ๊ด๋ จ ์ํ
self.is_off_work: bool = False
self.last_off_work_stress_decrease: float = time.time()
# ๋น๋๊ธฐ ํ๊ฒฝ์์ ์ํ ๋ณ๊ฒฝ์ ์์์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํ ๋ฝ
self._lock: asyncio.Lock = asyncio.Lock()
async def increase_stress_over_time(self) -> None:
"""์๊ฐ ๊ฒฝ๊ณผ์ ๋ฐ๋ฅธ ์คํธ๋ ์ค ์๋ ์ฆ๊ฐ (3์ด๋ง๋ค 1ํฌ์ธํธ)"""
async with self._lock:
now = time.time()
if now - self.last_stress_increase_time >= 3:
self.stress_level = min(100, self.stress_level + 1)
self.last_stress_increase_time = now
async def decrease_stress(self, amount: int) -> None:
"""์คํธ๋ ์ค ๊ฐ์"""
async with self._lock:
self.stress_level = max(0, self.stress_level - amount)
async def maybe_increase_boss_alert(self) -> None:
"""ํ๋ฅ ์ ์ผ๋ก Boss ๊ฒฝ๊ณ๋ ์ฆ๊ฐ"""
if random.random() < self.boss_alertness_prob:
async with self._lock:
if self.boss_alert_level < 5:
self.boss_alert_level += 1
# ๊ฒฝ๊ณ๋ ์์น ์ ์ฟจ๋ค์ด ํ์ด๋จธ ๋ฆฌ์
ํ์ง ์์
# (์ฟจ๋ค์ด์ ๋
๋ฆฝ์ ์ผ๋ก ์๋ํด์ผ ํจ)
async def decrease_boss_alert_over_time(self) -> None:
"""์ฟจ๋ค์ด ์ฃผ๊ธฐ๋ง๋ค Boss ๊ฒฝ๊ณ๋ ์๋ ๊ฐ์"""
async with self._lock:
now = time.time()
if self.boss_alert_level > 0 and now - self.last_alert_decrease_time >= self.boss_alertness_cooldown:
self.boss_alert_level = max(0, self.boss_alert_level - 1)
self.last_alert_decrease_time = now
async def check_off_work_status(self) -> None:
"""ํด๊ทผ ์ํ ํ์ธ ๋ฐ ๊ด๋ฆฌ"""
async with self._lock:
# Stress Level์ด 100์ด ๋๋ฉด ํด๊ทผ
if self.stress_level >= 100 and not self.is_off_work:
self.is_off_work = True
self.last_off_work_stress_decrease = time.time()
return
# ํด๊ทผ ์ค์ผ ๋ 5์ด๋ง๋ค ์คํธ๋ ์ค 10 ๊ฐ์
if self.is_off_work:
now = time.time()
if now - self.last_off_work_stress_decrease >= 5:
self.stress_level = max(0, self.stress_level - 10)
self.last_off_work_stress_decrease = now
# ์คํธ๋ ์ค๊ฐ 90 ์ดํ๊ฐ ๋๋ฉด ์ถ๊ทผ
if self.stress_level <= 90:
self.is_off_work = False
async def state_ticker(state: ServerState) -> None:
"""์ฃผ๊ธฐ์ ์ผ๋ก ์๋ฒ ์ํ๋ฅผ ์
๋ฐ์ดํธํ๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์
"""
while True:
await state.increase_stress_over_time()
await state.decrease_boss_alert_over_time()
await state.check_off_work_status()
await asyncio.sleep(1) # 1์ด๋ง๋ค ์ฒดํฌ