-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbot.py
More file actions
118 lines (98 loc) · 3.18 KB
/
Copy pathbot.py
File metadata and controls
118 lines (98 loc) · 3.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import logging
import os
from dotenv import load_dotenv
from telegram.ext import (
Application,
CallbackQueryHandler,
CommandHandler,
ConversationHandler,
MessageHandler,
filters,
)
from handlers.admin import admin_export, admin_recent, admin_stats
from handlers.conversation import (
AGE,
ARRIVAL,
BUDGET,
CONFIRM,
CONTACT,
COUNTRY,
EDUCATION,
FIELD,
LANGUAGE,
NAME,
PREFERENCES,
cancel,
choose_language,
confirm,
handle_age,
handle_arrival,
handle_budget,
handle_contact,
handle_country,
handle_education,
handle_field,
handle_name,
handle_preferences,
start,
)
load_dotenv()
logging.basicConfig(
format="%(asctime)s %(levelname)s %(name)s — %(message)s",
level=logging.INFO,
)
log = logging.getLogger(__name__)
def _admin_ids() -> list[int]:
raw = os.getenv("ADMIN_IDS", "")
return [int(x.strip()) for x in raw.split(",") if x.strip().isdigit()]
async def _notify_admins(app: Application, text: str) -> None:
for admin_id in _admin_ids():
try:
await app.bot.send_message(chat_id=admin_id, text=text)
except Exception as e:
log.warning("Could not notify admin %d: %s", admin_id, e)
async def on_startup(app: Application) -> None:
log.info("Bot started.")
await _notify_admins(app, "🟢 Bot is online and ready.")
async def on_shutdown(app: Application) -> None:
log.info("Bot shutting down.")
await _notify_admins(app, "🔴 Bot is shutting down (reboot or restart).")
def main() -> None:
token = os.getenv("BOT_TOKEN")
if not token:
raise RuntimeError("BOT_TOKEN is not set in .env")
app = (
Application.builder()
.token(token)
.post_init(on_startup)
.post_stop(on_shutdown)
.build()
)
conv = ConversationHandler(
entry_points=[
CommandHandler("start", start),
],
per_message=False,
states={
LANGUAGE: [CallbackQueryHandler(choose_language)],
NAME: [MessageHandler(filters.TEXT & ~filters.COMMAND, handle_name)],
AGE: [MessageHandler(filters.TEXT & ~filters.COMMAND, handle_age)],
COUNTRY: [MessageHandler(filters.TEXT & ~filters.COMMAND, handle_country)],
EDUCATION: [CallbackQueryHandler(handle_education)],
FIELD: [MessageHandler(filters.TEXT & ~filters.COMMAND, handle_field)],
ARRIVAL: [CallbackQueryHandler(handle_arrival)],
BUDGET: [CallbackQueryHandler(handle_budget)],
PREFERENCES: [CallbackQueryHandler(handle_preferences)],
CONTACT: [MessageHandler(filters.TEXT & ~filters.COMMAND, handle_contact)],
CONFIRM: [CallbackQueryHandler(confirm)],
},
fallbacks=[CommandHandler("cancel", cancel)],
)
app.add_handler(conv)
app.add_handler(CommandHandler("admin_stats", admin_stats))
app.add_handler(CommandHandler("admin_recent", admin_recent))
app.add_handler(CommandHandler("admin_export", admin_export))
log.info("Bot is running. Press Ctrl+C to stop.")
app.run_polling()
if __name__ == "__main__":
main()