Adding all files
This commit is contained in:
81
scheduler.py
Normal file
81
scheduler.py
Normal file
@@ -0,0 +1,81 @@
|
||||
# scheduler.py
|
||||
|
||||
import datetime
|
||||
import pytz
|
||||
from disnake.ext import tasks
|
||||
|
||||
MOSCOW_TZ = pytz.timezone("Europe/Moscow")
|
||||
|
||||
SCHEDULED_EVENTS = [
|
||||
{
|
||||
"name": "ECHO TTvT",
|
||||
"day": 4,
|
||||
"create_hour": 8,
|
||||
"create_minute": 0,
|
||||
"event_hour": 19,
|
||||
"event_minute": 30,
|
||||
"key": "echottvt"
|
||||
},
|
||||
{
|
||||
"name": "AS VDV PSG",
|
||||
"day": 4,
|
||||
"create_hour": 22,
|
||||
"create_minute": 0,
|
||||
"event_hour": 16,
|
||||
"event_minute": 30,
|
||||
"key": "asvdvpsg"
|
||||
},
|
||||
{
|
||||
"name": "ECHO TvT",
|
||||
"day": 5,
|
||||
"create_hour": 8,
|
||||
"create_minute": 0,
|
||||
"event_hour": 19,
|
||||
"event_minute": 30,
|
||||
"key": "echotvt_saturday"
|
||||
}
|
||||
]
|
||||
|
||||
def get_next_datetime(now, target_day, hour, minute):
|
||||
days_ahead = (target_day - now.weekday()) % 7
|
||||
next_date = now + datetime.timedelta(days=days_ahead)
|
||||
return MOSCOW_TZ.localize(datetime.datetime.combine(next_date.date(), datetime.time(hour, minute)))
|
||||
|
||||
# Этот объект будет заполнен из main.py
|
||||
event_loop_context = {}
|
||||
AUTO_EVENTS_ENABLED = False
|
||||
|
||||
@tasks.loop(minutes=1)
|
||||
async def scheduled_event_loop():
|
||||
if not AUTO_EVENTS_ENABLED:
|
||||
return # ⛔ автосоздание запрещено командой
|
||||
|
||||
now = datetime.datetime.now(MOSCOW_TZ)
|
||||
|
||||
create_poll = event_loop_context["create_poll"]
|
||||
event_tasks = event_loop_context["event_tasks"]
|
||||
generate_event_id = event_loop_context["generate_event_id"]
|
||||
|
||||
for event in SCHEDULED_EVENTS:
|
||||
create_time = get_next_datetime(now, event["day"], event["create_hour"], event["create_minute"])
|
||||
if abs((now - create_time).total_seconds()) < 60:
|
||||
start_time = get_next_datetime(now, event["day"], event["event_hour"], event["event_minute"])
|
||||
event_id = generate_event_id(event["name"], start_time)
|
||||
if event_id in event_tasks:
|
||||
print(f"⏩ Уже существует: {event_id}")
|
||||
continue
|
||||
|
||||
info = {
|
||||
"name": event["name"],
|
||||
"start_time": start_time,
|
||||
}
|
||||
|
||||
print(f"🆕 Автосоздание: {info['name']} в {start_time}")
|
||||
await create_poll(info, message_id=event["key"])
|
||||
|
||||
|
||||
|
||||
def init_scheduler(create_poll_func, event_tasks_dict, generate_event_id_func):
|
||||
event_loop_context["create_poll"] = create_poll_func
|
||||
event_loop_context["event_tasks"] = event_tasks_dict
|
||||
event_loop_context["generate_event_id"] = generate_event_id_func
|
||||
Reference in New Issue
Block a user