راه اندازی یک بازو با قابلیت پرداخت در پیام رسان بله - قسمت سوم

سلام در قسمت دوم یه قول داده بودم که در رابطه ایجاد یک گفتگو با هم بحث کنیم.الان که بیشتر فکر کردم، فهمیدم که قبلش باید یه سری جزییاتی رو باهم یاد بگیریم تا بتونیم یک محاوره یا گفتگو ی با کیفیت رو بسازیم.در قسمت های قبلی تونستیم یه گوش برای بازو بسازیم که به یک پیام خاص، کامند یا دستور خاص و یا به همه پیام ها گوش بده و مطابق با اون پیام کاری رو شروع کنه.حالا از این به بعد کار رو باید با جدیت بیشتری پیگیری کینم. چرا؟ چون مدیریت گفتگو ها رو از قبل باید پیش بینی کنید و به صورتی یک گفتگو رو برنامه ریزی و سناریو نویسی کنین که دوتا گفتگو با هم قاطی نشن و کاربر با هر کاری فقط وارد یک بخش خاصی از بازو بشه! منظورم اینه که اگر یه پیام داد، دو تا کار توی بازو برای یک پیام تعریف نشده باشن! این یه تجربه خیلی سختی بود که بعد از مدت ها بهش رسیدم. پس وارث خوبی باشین :)یک مثال بزنم:مرحله اول: کاربر دستور « من قهوه لاته میخوام » رو برای بازو ارسال میکنه.به چند طریق میتونید این کار رو انجام بدین: ۱- استفاده از یک کامند خاص مثلا : get_latte_coffee/۲- استفاده از دکمه هایی که بازوی بله در اختیارمون میزاره: این موارد رو در قالب پیام های template_message باید بسازیم و روش کار کنیم که بهش مفصل میپردازیم ان شاءالله۳- ارسال یک پیام متنی که شامل کلید واژه های «قهوه» یا «لاته» که این مورد اخر یکم پیچیده میشه و توصیه میکنم از این روش استفاده نکنین - راه های ۱ و ۲ به صورت کامل نیاز های شماره رو براورده می کنن.مرحله ۲: اگر موارد دیگه ای برای قهوه مد نظر تون بود رو میتونید در مراحل بعدی از کاربر بگیرید. فرض کنید کامند get_latte_coffee/ رو زده و شما برای این کامند از طریق dispatcher یک کامند هندلر گذاشتی( ارجاع به قسمت دوم اموزش). در این مرحله بازو برای تهیه یک قهوه آماده میشه و اگر سوال دیگه ای داشته باشه رو از کاربر میپرسه! میپرسه؟ چجوری میپرسه؟ اینجاست که باید با یک تعریف دیگه ای در بازو اشنا بشیم به اسم next_step!یعنی اینکه بعد از شنیدن یک دستور خاص وارد یک تابع خاص میشیم و از اون به بعد محدوده شنیداری بازو رو باید به صورتی تعیین کنیم که به پیام های خاص دیگه ای گوش بده و اگر توی next_step هاش بود، کاری رو انجام بده! همین روال رو تا پایان گفتگو باید انجام بدین.مثال مرحله ۲: آیا قهوه خود را با عسل نوش جان می نمایید یا با شهد خرما؟اینجا باید از template_message استفاده کنیم. که دوتا دکمه داره! دکمه عسل و دکمه شهد خرماتمپلیت مسیج دارای یک متن هست و یه سری دکمه. متنش رو باید از نوع TextMessage بسازید و دکمه هاش رو اینجوری:TemplateMessageButton(text="عسل", value="عسل", action=0) این دکمه همراه پیام میاد. دکمه ها رو باید به صورت لیستی از دکمه ها به بازو بدین.در کد زیر نمونه ای لیست رو میبنید:btn = [ TemplateMessageButton(text="عسل", value="عسل", action=0), TemplateMessageButton(text="شهد خرما", value="شهد خرما", action=0) ] و حالا ساخت یک پیام تمپلیت مسیج:text_message = TextMessage("قهوه شما دارای چه افزودنی باشد سرورم؟") btn = [ TemplateMessageButton(text="عسل", value="عسل", action=0), TemplateMessageButton(text="شهد خرما", value="شهد خرما", action=0) ] template_message = TemplateMessage(general_message=text_message, btn_list=btn) که text چیزی هست که به کاربر در پیام نشون میدیم. مث چیزی که تصویر زیر نشون میده.و value مقداری هست که هنگام فشردن دکمه برای بازو ارسال میشه.پارامتر action هم فعلا نیاز به توضیح نداره.اینم پیام ارسالی که کاربر در بازو خواهد دید:حالا شما میتونید بقیه گفتگو رو اینجوری جلو ببرید. ولی مث اینکه هنوز زنجیره گفتگو کامل نشده و ما نمیتونیم با اطلاعات فعلی مراحل رو به هم وصل کنیم.در اینجا باید از dispatcher استفاده کنیم و محدوده شنوایی که بالا بهش اشاره کردم رو برای ادامه گفتگو تعبیه کنیم.فرض کنید میخوایم یک تابع بنویسیم که اضافه کردن عسل رو به عهده داشته باشه و یک تابع دیگه اضافه کردن شهد خرما.پس برای هر دکمه باید تابع جداگانه بنویسید و پردازشش رو به اون تابع محول کنین.خب سوالی که پیش میاد اینه که چجوری این زنجیره گفتگو رو به هم وصل کنیم؟اینجوری:با استفاده از تابع register_conversation_next_step_handler که یکی از توابع دیسپچر هست. این تابع دوتا پارامتر میگیره. یکی update هست و دیگری لیستی از هندلر ها یا مراحل بعدی که بازو توی این مرحله می شنوه و بهشون عمل میکنهبدین گونه:dispatcher.register_conversation_next_step_handler(update, [ MessageHandler(TemplateResponseFilter(keywords="عسل"), add_assal), MessageHandler(TemplateResponseFilter(keywords="شهد خرما"), add_shahd_khorma), ])هندلر های متفاوتی داشتیم! یادتونه؟ مسیج هندلر و کامند هندلر.اینجا هم روی مسیج ها هندلر میزاریم و از مسیج هندلر میسازیم. مسیج هندلر که در بالا لیستی از اون ها رو میبیند دارای ۲ پارامتر هست. یکی نوع پیامی که باید بهش گوش بده و دیگری تابعی هست که بعد از شنیدن پیام مورد نظر باید بهش هدایت کنه.در اینجا اگر کاربر عسل رو بزنه به که عسل یک جواب تمپلیت مسیج هست، به تابع add_assal میره و اگر شهد خرما رو بزنه به تابع add_shahd_khorma میره.اینم از نمونه کار بازو تا اینجا: اینم کد کلی بازو تا اینجا:"""Simple Bot to Reply to Bale messages.""" import asyncio from balebot.filters import DefaultFilter, TemplateResponseFilter from balebot.handlers import MessageHandler from balebot.models.messages import TextMessage, TemplateMessageButton, TemplateMessage from balebot.updater import Updater # Bale Bot Authorization Token updater = Updater(token="توکن بازوی خود را در اینجا بگذارید.", loop=asyncio.get_event_loop()) # Define dispatcher dispatcher = updater.dispatcher # Both of success and failure functions are optional def success(response, user_data): print("success : ", response) print(user_data) def failure(response, user_data): print("failure : ", response) print(user_data) @dispatcher.command_handler(["get_latte_coffee"]) def coffee_request_starter(bot, update): user = update.get_effective_user() text_message = TextMessage("قهوه شما دارای چه افزودنی باشد سرورم؟") btn = [ TemplateMessageButton(text="عسل", value="عسل", action=0), TemplateMessageButton(text="شهد خرما", value="شهد خرما", action=0) ] template_message = TemplateMessage(general_message=text_message, btn_list=btn) bot.send_message(template_message, user,success_callback=success, failure_callback=failure) dispatcher.register_conversation_next_step_handler(update, [ MessageHandler(TemplateResponseFilter(keywords="عسل"), add_assal), MessageHandler(TemplateResponseFilter(keywords="شهد خرما"), add_shahd_khorma), ]) def add_assal(bot, update): text_msg = TextMessage("عسل به قهوه حضرت والا اضافه گردید.") bot.send_message(text_msg, update.get_effective_user(), success_callback=success, failure_callback=failure) dispatcher.finish_conversation(update) def add_shahd_khorma(bot, update): text_msg = TextMessage("شهد توت به قهوه حضرت والا اضافه گردید.") bot.send_message(text_msg, update.get_effective_user(), success_callback=success, failure_callback=failure) dispatcher.finish_conversation(update) # Run the bot! updater.run()