fix(P3): 3 priority-3 fixes — timezone, decay rounding, rate limiter
#16 Timezone consistency — added TZ=Europe/Sofia to docker-compose.yml so datetime.now() returns local time inside the container. Removed the +3 hour hack from get_time_of_day(). All three time-of-day consumers (autonomous_v1_legacy, moods, autonomous_engine) now use the same correct local hour automatically. #17 Decay truncation — replaced int() with round() in decay_events() so a counter of 1 survives one more 15-minute cycle instead of being immediately zeroed (round(0.841)=1 vs int(0.841)=0). #20 Unpersisted rate limiter — _last_action_execution dict in autonomous.py is now seeded from the engine's persisted server_last_action on import, so restarts don't bypass the 30-second cooldown. Note: #18 (dead config fields) was a false positive — autonomous_interval_minutes IS used by the scheduler. #19 deferred to bipolar mode rework.
This commit is contained in:
@@ -15,7 +15,8 @@ from utils.task_tracker import create_tracked_task
|
|||||||
logger = get_logger('autonomous')
|
logger = get_logger('autonomous')
|
||||||
|
|
||||||
# Rate limiting: Track last action time per server to prevent rapid-fire
|
# Rate limiting: Track last action time per server to prevent rapid-fire
|
||||||
_last_action_execution = {} # guild_id -> timestamp
|
# Seeded from persisted engine data so restarts don't bypass cooldowns
|
||||||
|
_last_action_execution = dict(autonomous_engine.server_last_action)
|
||||||
_MIN_ACTION_INTERVAL = 30 # Minimum 30 seconds between autonomous actions
|
_MIN_ACTION_INTERVAL = 30 # Minimum 30 seconds between autonomous actions
|
||||||
|
|
||||||
# Per-guild locks to prevent race conditions from near-simultaneous messages
|
# Per-guild locks to prevent race conditions from near-simultaneous messages
|
||||||
|
|||||||
@@ -565,8 +565,8 @@ class AutonomousEngine:
|
|||||||
# Decay user events (half-life of 1 hour)
|
# Decay user events (half-life of 1 hour)
|
||||||
# For 15-minute intervals: decay_factor = 0.5^(1/4) ≈ 0.841
|
# For 15-minute intervals: decay_factor = 0.5^(1/4) ≈ 0.841
|
||||||
decay_factor = 0.5 ** (1/4) # ≈ 0.8408964...
|
decay_factor = 0.5 ** (1/4) # ≈ 0.8408964...
|
||||||
ctx.users_joined_recently = int(ctx.users_joined_recently * decay_factor)
|
ctx.users_joined_recently = round(ctx.users_joined_recently * decay_factor)
|
||||||
ctx.users_status_changed = int(ctx.users_status_changed * decay_factor)
|
ctx.users_status_changed = round(ctx.users_status_changed * decay_factor)
|
||||||
|
|
||||||
# Clean up old activities (older than 1 hour)
|
# Clean up old activities (older than 1 hour)
|
||||||
self._clean_old_activities(guild_id, max_age_seconds=3600)
|
self._clean_old_activities(guild_id, max_age_seconds=3600)
|
||||||
|
|||||||
@@ -682,7 +682,7 @@ def save_last_sent_tweets():
|
|||||||
logger.error(f"Failed to save last sent tweets: {e}")
|
logger.error(f"Failed to save last sent tweets: {e}")
|
||||||
|
|
||||||
def get_time_of_day():
|
def get_time_of_day():
|
||||||
hour = datetime.now().hour + 3
|
hour = datetime.now().hour
|
||||||
if 5 <= hour < 12:
|
if 5 <= hour < 12:
|
||||||
return "morning"
|
return "morning"
|
||||||
elif 12 <= hour < 18:
|
elif 12 <= hour < 18:
|
||||||
|
|||||||
@@ -109,6 +109,8 @@ services:
|
|||||||
miku-bot:
|
miku-bot:
|
||||||
build: ./bot
|
build: ./bot
|
||||||
container_name: miku-bot
|
container_name: miku-bot
|
||||||
|
environment:
|
||||||
|
- TZ=Europe/Sofia
|
||||||
volumes:
|
volumes:
|
||||||
- ./bot/memory:/app/memory
|
- ./bot/memory:/app/memory
|
||||||
- /home/koko210Serve/ComfyUI/output:/app/ComfyUI/output:ro
|
- /home/koko210Serve/ComfyUI/output:/app/ComfyUI/output:ro
|
||||||
|
|||||||
Reference in New Issue
Block a user