Skip to content

bot.main

cancel_handler(message, state) async

Allow the user to cancel any action

Parameters:

Name Type Description Default
message Message

The cancel command (/cancel)

required
state FSMContext

The state in which the user is

required
Source code in src/bot/main.py
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
@form_router.message(Command("cancel"))
@form_router.message(F.text.casefold() == "cancel")
async def cancel_handler(message: Message, state: FSMContext) -> None:
    """Allow the user to cancel any action

    Args:
        message (Message): The cancel command (/cancel)
        state (FSMContext): The state in which the user is
    """

    current_state = await state.get_state()
    if current_state is None:
        return

    logging.info("Cancelling state %r", current_state)
    await state.clear()
    await message.answer(
        "عملیات لغو شد.",
        reply_markup=ReplyKeyboardRemove(),
    )

command_start(message, state) async

Triggered by /start command in Telegram

Parameters:

Name Type Description Default
message Message

The message sent by user

required
state FSMContext

The state in which user is

required
Source code in src/bot/main.py
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
@form_router.message(CommandStart())
async def command_start(message: Message, state: FSMContext) -> None:
    """Triggered by /start command in Telegram

    Args:
        message (Message): The message sent by user
        state (FSMContext): The state in which user is
    """

    await message.answer(
        "سلام!\n"
        "به یونیف خوش اومدین. برای ورود به حسابتون دستور"
        " /login "
        "رو بزنید.",
        reply_markup=ReplyKeyboardRemove(),
    )

get_chat_id(message) async

Get the current chat ID

Parameters:

Name Type Description Default
message Message

The message sent by user

required
Source code in src/bot/main.py
170
171
172
173
174
175
176
177
178
179
180
181
@form_router.message(Command("chat_id"))
async def get_chat_id(message: Message) -> None:
    """Get the current chat ID

    Args:
        message (Message): The message sent by user
    """
    chat_id = message.chat.id
    await message.answer(
        f"آیدی چت شما:\n<code>{chat_id}</code>",
        parse_mode=ParseMode.HTML
    )

main() async

Run the bot with the form_router included

Source code in src/bot/main.py
196
197
198
199
200
201
202
203
204
205
async def main():
    """Run the bot with the form_router included"""

    bot = Bot(
        token=TOKEN, default=DefaultBotProperties(parse_mode=ParseMode.HTML)
    )
    dp = Dispatcher()
    dp.include_router(form_router)
    await set_commands(bot)
    await dp.start_polling(bot)

process_lms_password(message, state) async

Save LMS Password and start the process

Parameters:

Name Type Description Default
message Message

The message containing LMS Password

required
state FSMContext

The state in which the user is

required
Source code in src/bot/main.py
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
@transaction.atomic
@form_router.message(Form.lms_password)
async def process_lms_password(message: Message, state: FSMContext) -> None:
    """Save LMS Password and start the process

    Args:
        message (Message): The message containing LMS Password
        state (FSMContext): The state in which the user is
    """

    password = message.text
    data = await state.get_data()
    username = data.get("lms_username")
    lms_user, created = await LMSUser.objects.aget_or_create(
        username=username, password=password
    )
    if not created:
        await message.answer(
            f"کاربر {username} قبلا در سیستم ثبت نام شده است.",
            reply_markup=ReplyKeyboardRemove(),
        )
        await state.clear()
        return

    # get_login
    cookie = await get_cookie(user=lms_user)
    if not cookie.cookie:
        await message.answer(
            f"ورود با نام کاربری {username} ناموفق بود.",
            reply_markup=ReplyKeyboardRemove(),
        )
        await lms_user.adelete()
        await state.clear()
        return

    await ChatID.objects.aupdate_or_create(
        user=lms_user,
        defaults={
            "chat_id": message.chat.id,
        },
    )
    await sync_to_async(
        lambda: transaction.on_commit(
            chain(
                update_user_courses_task.si(user_id=lms_user.pk),
                check_new_messages_task.si(
                    user_id=lms_user.pk, is_first_time=True
                ),
                send_welcome_message_task.s(chat_id=message.chat.id),
            ).delay
        )
    )()

    await schedule_periodic_tasks(user_id=lms_user.pk)

    await state.clear()

process_lms_username(message, state) async

Save LMS Username

Parameters:

Name Type Description Default
message Message

The message containing LMS Username

required
state FSMContext

The state in which the user is

required
Source code in src/bot/main.py
 98
 99
100
101
102
103
104
105
106
107
108
109
110
@form_router.message(Form.lms_username)
async def process_lms_username(message: Message, state: FSMContext) -> None:
    """Save LMS Username

    Args:
        message (Message): The message containing LMS Username
        state (FSMContext): The state in which the user is
    """

    username = message.text
    await state.update_data(lms_username=username)
    await state.set_state(Form.lms_password)
    await message.answer("لطفا رمز عبور LMS خود را وارد کنید:")

process_login_command(message, state) async

Receive LMS Username

Parameters:

Name Type Description Default
message Message

The login command (/login)

required
state FSMContext

The state in which the user is

required
Source code in src/bot/main.py
85
86
87
88
89
90
91
92
93
94
95
@form_router.message(Command("login"))
async def process_login_command(message: Message, state: FSMContext) -> None:
    """Receive LMS Username

    Args:
        message (Message): The login command (/login)
        state (FSMContext): The state in which the user is
    """

    await state.set_state(Form.lms_username)
    await message.answer("لطفا نام کاربری LMS خود را وارد کنید:")

set_commands(bot) async

Set bot commands to show in the menu

Source code in src/bot/main.py
184
185
186
187
188
189
190
191
192
193
async def set_commands(bot: Bot):
    """Set bot commands to show in the menu"""
    commands = [
        BotCommand(command="start", description="شروع کار با ربات"),
        BotCommand(command="chat_id", description="دریافت آیدی چت فعلی"),
        BotCommand(command="login", description="ورود به سامانه LMS"),
        BotCommand(command="cancel", description="لغو عملیات فعلی")
        # Add other commands as needed
    ]
    await bot.set_my_commands(commands)