-
Notifications
You must be signed in to change notification settings - Fork 1
/
main.py
136 lines (105 loc) · 5.56 KB
/
main.py
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#!/usr/bin/env python
# pylint: disable=unused-argument
import asyncio
import logging
import os
from day import *
from telebot import BotApp
from telegram import Update
from telegram.constants import ParseMode
from telegram.ext import ContextTypes
import cache
import food
import util
from order import FileSystemOrderManager
from selection import UserSelector
bot = BotApp()
user_selector = UserSelector()
order_manager = FileSystemOrderManager()
@bot.command(text=True)
async def capture_order(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
async def capture():
(message, is_edit) = (update.message, False) if update.message else (update.edited_message, True)
if food.is_food(message.text):
user = util.current_user(update)
order_manager.add_order(message.id, user, message.text)
logging.info(f'adding {message.text} to the order {order_manager.list_orders()}')
await message.reply_text('تم التعديل' if is_edit else 'تمت الإضافة')
else:
logging.warning(f'{message.text} is not food, skipping...')
# no await
asyncio.create_task(capture()) # noinspection PyTypeChecker
@bot.command(name="add", desc="*إضافة طلبك")
async def add_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
order = " ".join(context.args)
if not order:
await update.message.reply_text("خطأ، قم بكتابة الطلب")
return
user = util.current_user(update)
order_manager.add_order(update.message.id, user, order)
await update.message.reply_text('تمت الإضافة')
@bot.command(name="delete", desc="مسح طلبك")
async def delete_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
user = util.current_user(update)
deleted_orders = order_manager.delete_order(user)
if deleted_orders:
for (_, _), o in deleted_orders:
await update.message.reply_text(f'تم مسح طلبك "{o}" بنجاح')
else:
await update.message.reply_text('لا توجد طلبات')
@bot.command(name="list", desc="عرض الطلبات")
async def list_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
orders = order_manager.list_orders()
if not orders:
await update.message.reply_text("لا توجد طلبات")
return
food_list = "\n".join(f'{u} -> {o}' for (_, (_, u)), o in orders.items())
logging.info(food_list)
await update.message.reply_text(food_list)
@bot.command(name="yalla", desc="اختيار اسم عشوائي")
async def yalla_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
await select_user(context, update.message.chat_id)
@bot.command(name="clear", desc="مسح جميع الطلبات", hidden=True)
async def clear_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
if not await util.is_admin(update, context):
await update.message.reply_text("هذه الخاصية متاحة فقط للأدمن")
return
order_manager.clear_orders()
msg = "تم مسح جميع الطلبات بنجاح"
if "+selection" in context.args:
msg += " و تم مسح جميع اختيارات المستخدمين"
user_selector.clear_history()
if "+food" in context.args:
msg += " و تم مسح مخزون الأكلات"
cache.clear("food")
await update.message.reply_text(msg)
@bot.command(name="ping", desc="اختبار البوت")
async def ping_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
await update.message.reply_text("Pong!")
@bot.command(name="about", desc="عن البوت")
async def about_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text(
'"لانشي بوت" مساعدك في طلب الغداء\n\n'
'تقوم فكرة عمل البوت بأنه يقوم بفحص الرسائل و إذا كانت الرسالة تحتوي على اسم طعام، '
'يقوم البوت بإضافة الطلب بشكل آلي إلى قائمة الطلبات\n\n'
'إذا لم يقم البوت بإضافة الطلب بشكل آلي (ربما لعدم تعرفه على نوع الطعام)، يمكن إضافته عن طريق الأمر "/add" \n\n'
'في النهاية يمكنك عرض الطلبات الحالية عن طريق الأمر "/list" '
'و بعد مراجعة الطلب يتم اختيار احد الأشخاص بشكل عشوائي عن طريق الأمر "/yalla"'
)
@bot.job(time=os.getenv("HEADS_UP_TIME", "08:00"), days=(SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY))
async def send_lunch_headsup(context: ContextTypes.DEFAULT_TYPE, chat_id):
order_manager.clear_orders()
await context.bot.send_message(chat_id, text="يلا يا شباب أبدأو ضيفو طلابتكم")
async def select_user(context: ContextTypes.DEFAULT_TYPE, chat_id):
users = [user for (_, user), _ in order_manager.list_orders().items()]
if users:
uid, u = user_selector.select(users)
mention_text = f"<a href='tg://user?id={uid}'>{u}</a>"
await context.bot.send_message(chat_id=chat_id, text=util.get_congrats_msg() + f" {mention_text}🎉",
parse_mode=ParseMode.HTML)
else:
logging.warning(f'user list might be empty: {users}')
await context.bot.send_message(chat_id=chat_id, text="قائمة الطلبات فارغة")
if __name__ == '__main__':
bot.help(desc="عرض المساعدة")
bot.application.run_polling(allowed_updates=Update.ALL_TYPES)