taboo1993/ ap-mo-sever-4import asyncio
from datetime import datetime, date
from aiogram import Bot, Dispatcher, F
from aiogram.types import (
Message,
CallbackQuery,
InlineKeyboardMarkup,
InlineKeyboardButton
)
# ================== НАСТРОЙКИ ==================
BOT_TOKEN = "PASTE_YOUR_BOT_TOKEN"
WORK_CHAT_ID = -1001111111111 # рабочий чат
SUPERVISOR_ID = 222222222 # супервайзер
CONTROL_TIMES = {
"morning": "09:00",
"day": "12:30",
"evening": "17:00"
}
TERRITORIES = [
"Дмитров",
"Долгопрудный",
"Зеленоград",
"Клин",
"Митино",
"Солнечногорск"
]
# ================== ХРАНИЛИЩЕ (IN-MEMORY) ==================
users = {} # user_id: {fio, territory}
reports = {} # user_id: {date: {morning, day, evening}}
discipline = {} # user_id: {late, missed}
def today():
return date.today().isoformat()
# ================== КНОПКИ ==================
def territory_kb():
return InlineKeyboardMarkup(
inline_keyboard=[
[InlineKeyboardButton(text=t, callback_data=f"territory:{t}")]
for t in TERRITORIES
]
)
def report_kb():
return InlineKeyboardMarkup(
inline_keyboard=[
[InlineKeyboardButton(text="🌅 Утро", callback_data="report:morning")],
[InlineKeyboardButton(text="🕧 День", callback_data="report:day")],
[InlineKeyboardButton(text="🌙 Вечер", callback_data="report:evening")]
]
)
# ================== BOT ==================
bot = Bot(token=BOT_TOKEN)
dp = Dispatcher()
# ================== HANDLERS ==================
@dp.message(F.text == "/start")
async def start(msg: Message):
await msg.answer(
"👋 Добро пожаловать!\nВыберите территорию:",
reply_markup=territory_kb()
)
@dp.callback_query(F.data.startswith("territory:"))
async def set_territory(cb: CallbackQuery):
territory = cb.data.split(":")[1]
users[cb.from_user.id] = {
"fio": cb.from_user.full_name,
"territory": territory
}
await cb.message.answer(
f"📍 Территория закреплена: {territory}\n\n"
f"Выберите тип отчета:",
reply_markup=report_kb()
)
await cb.answer()
@dp.callback_query(F.data.startswith("report:"))
async def submit_report(cb: CallbackQuery):
report_type = cb.data.split(":")[1]
uid = cb.from_user.id
reports.setdefault(uid, {}).setdefault(today(), {})
reports[uid][today()][report_type] = True
await cb.message.answer(
f"✅ Отчет «{report_type.upper()}» принят"
)
await bot.send_message(
WORK_CHAT_ID,
f"📊 Отчет сдан\n"
f"👤 {users[uid]['fio']}\n"
f"📍 {users[uid]['territory']}\n"
f"🕘 Тип: {report_type}"
)
await cb.answer()
# ================== SCHEDULER ==================
async def check_reports():
now = datetime.now().strftime("%H:%M")
for report_type, control_time in CONTROL_TIMES.items():
if now == control_time:
for uid, user in users.items():
user_reports = reports.get(uid, {}).get(today(), {})
if not user_reports.get(report_type):
# личка ТП
await bot.send_message(
uid,
f"❗ ВНИМАНИЕ\n\n"
f"{user['fio']}, отчет НЕ СДАН\n"
f"Тип: {report_type.upper()}\n"
f"📍 Территория: {user['territory']}"
)
# рабочий чат
await bot.send_message(
WORK_CHAT_ID,
f"⏰ Контроль отчетов\n"
f"❌ {user['fio']} — {user['territory']}\n"
f"Отчет: {report_type.upper()}"
)
# дисциплина
discipline.setdefault(uid, {"late": 0, "missed": 0})
discipline[uid]["missed"] += 1
# эскалация
await bot.send_message(
SUPERVISOR_ID,
f"🚨 ЭСКАЛАЦИЯ\n\n"
f"ТП не сдал отчет:\n"
f"{user['fio']} — {user['territory']}\n"
f"Тип: {report_type.upper()}"
)
async def scheduler():
while True:
await check_reports()
await asyncio.sleep(60)
# ================== START ==================
async def main():
asyncio.create_task(scheduler())
await dp.start_polling(bot)
if __name__ == "__main__":
asyncio.run(main())
Обновлено 15 дней назад Открыть в SourceCraft