
قبل التاريخ
قبل عام ، قررت إنشاء روبوت تيليجرام من أجل لعب لعبة "سانتا سيكريت" الشهيرة في العام الجديد. لقد استلهمت من حقيقة أننا قبل عامين كنا في العمل كشركة قررت أن تلعب هذه اللعبة (بدت رائعة للغاية) ، بالإضافة إلى ذلك ، لقد كنت منذ فترة طويلة أتابع
نادي ADM على Habré. في شهري أكتوبر ونوفمبر من العام الماضي ، أدركت أنني بحاجة للعب بين شركتي الخاصة هذا العام مرة أخرى ، لكن هذه المرة دون سحب الأسماء المكتوبة على قطعة من ورق من قبعة سانتا كلوز ، ولكن من الناحية التكنولوجية ، أو شيء ما. نظرًا لأن الجميع كانوا في برقية وكان من المثير جدًا بالنسبة لي أن أكتب روبوت هناك ، فقد قررت أن أفعل ذلك على هذه المنصة
بالمناسبة ، قبل عام
كتبت مقالًا حول هذا المشروع عن حبري ، لكنني لم أقل شيئًا عن التنفيذ. لم أتحدث لسبب وجيه ، لأنه كان عارًا أو شيئًا :) تم إعداد المشروع فقط للشركة في العمل (15-20 شخصًا بأقصى سرعة) ، لكن اتضح أن المشروع "أطلق النار" في دوائر أخرى بعد بضع مقالات عن الموارد. علاوة على ذلك ، بدأت الموارد الأكثر شعبية في الإعلان عني (لم أكن أعرف عنها حتى قبل خروج عدد كبير من الناس من أي مكان).
لمدة شهر ، وبدون استثمار واحد في الإعلان ، جمعت أكثر من 5000 من اللاعبين الراضين ووقعت في حب هذا المشروع. ولكن إلى جانب كل فوائده ، كان هناك ناقص واحد ضخم فيه ، وهذا هو التنفيذ.
كيف كان الحال قبل عام
كان من المضحك أن لدي زر في الروبوت "انضم إلى الغرفة". نعم ، إنه بالضبط الذي ينضم. لقد كتبوا إليّ لإصلاح هذا الخطأ النحوي ، لكنني لم أخاطر به ، وإليكم السبب: :) بعد ذلك ، أرفق قطعة من الشفرة من نسخة العام الماضي من الروبوت.
elseif ($user['state'] == 7) { if (mb_stripos($textMessage, '') !== false) { if (!empty($user['santa_for_user_id'])) { $text = ' , '; } else { $text = "! - , "; $db->updateState($userId, 8); } }
بوت كامل - كان ملف index.php ضخمًا واحدًا عاش في الواقع وظيفة mb_stripos. علاوة على ذلك ، كان هناك الكثير من "متطابقة". أي mb_stripos ($ textMessage ، 'join')! == false قد تحدث أكثر من مرة. إذا قمت بتغيير كلمة "join" في الزر إلى "join" ، ونسيت تغيير نوع من ifchik (والذي ، مرة أخرى ، كثيرًا) ، يمكن أن يرش كل شيء. في ما قد لا يكون ملحوظًا على الفور (مجرد روبوت في بعض السيناريوهات لن يستجيب كما ينبغي). بمجرد أن قمت بتغيير النص ، بدأ المستخدمون يكتبون أنه في سيناريو معين ، لا يستجيب الروبوت كما ينبغي. لم أكن أريد المجازفة ، واعتقدت أن الخطأ لم يكن بالغ الأهمية :) من حيث المبدأ ، أنت تفهم ذلك. إذا كان هناك زر ، على سبيل المثال ، "البحث عن سانتا العشوائي" ، فقد كنت مدمن مخدرات على كلمة "عشوائي" من خلال mb_stripos. كان الأمر ممتعًا عندما ظهر زر مماثل ، بنص مشابه ، وعندما لم يكن ضروريًا ، أصبح كل شيء غير ضروري إذا (على سبيل المثال ، هناك كلمة "عشوائي") :)
بالمناسبة ، هل لاحظت $ user ['state']؟ في ذلك الوقت ، قدمت "حالات" لفهم الحالة التي يكون فيها المستخدم حاليًا. هل أراد الانضمام إلى الغرفة ، على سبيل المثال ، أو إنشاء ، أو ربما أراد أن يلعب لعبة واحدة؟ وبالنسبة لكل ولاية ، جاءت مجموعة ifchi الخاصة بها ، والتي كان من المهم أيضًا عدم كسرها.
بالمناسبة ، يوجد ملف Cron بجوار index.php ، ويمكن تشغيله مباشرة من أسفل المتصفح (يبدو أنه لم يزعجني حقًا). علاوة على ذلك ، عندما أردت فجأة إضافة نوع من "الحالة" (كنت أتمنى ألا أريد هذا) اضطررت إلى الغرق في هذه المدينة ... وبالطبع ، لم يخرج شيء من المحاولة الأولى. كل هذا يكمن أيضًا في أرخص خدمة استضافة تبلغ دولارًا واحدًا في الشهر ، مما قد يرسلني إلى الجحيم عندما يبدأ الكثير من الناس في الكتابة في ساعة الذروة.
كان بالتأكيد الجحيم لمبرمج :)
ما قررت القيام به هذا العام
هذا العام ، بالطبع ، قررت إعادة كتابة الروبوت (حيث كان هناك طلب كبير في العام الماضي) ، أردت أن أذهب إلى الكود القديم وأكتشف كيف كان ذلك العام من أجل نقل منطق العمل. لسوء الحظ ، لم أتمكن من 70٪ حتى من معرفة الكود القديم ، رغم أنني حاولت ترك التعليقات بنفسي في الكود لتساعد نفسي في عام :)
قررت فقط أن أتذكر السيناريوهات الرئيسية ، وهناك وأضف شيئًا جديدًا على طول الطريق. لقد بدأ بالسؤال: "ما الذي يجب استخدامه للكتابة المعمارية حتى لا تبكي لاحقًا؟" بعد الكثير من الأبحاث ، وقع الاختيار على
Botman . لدينا مقالات صغيرة عن حبري حول هذا الموضوع. باختصار ، بوتمان شيء رائع للغاية. يمكن تثبيته على حد سواء على "نظيف" ، ويمكنك تثبيت التجميع على الفور مع Laravel (نعم ، هناك botman مثبت مباشرة على قمة Laravel). قررت أن أبقى على هذا الإصدار ، نظرًا لأن Laravel أفضل بشكل واضح عما كان عليه قبل عام :) فهو يتمتع بالقدرة على التخزين المؤقت من "المربع" ، والتوجيه المريح ، والحرفيين ، والوسيطة ، والراحة ، والقدرة على العمل مع قاعدة البيانات والمزايا الأخرى.
إذا كنت لا تحب Laravel فجأة ، يمكنك استخدام أي إطار عمل آخر ، وتثبيت Botman فوقه ، أو لا يمكنك استخدام الإطار على الإطلاق . بالمناسبة ، تم بناء Botman على رأس ReactPHP ، وهو بارد :)
بعد ذلك ، سوف أصف فوائد Botman:
يوجد ملف botman.php واحد يمكنك من خلاله وصف جميع الأوامر. مثال:
$botman->hears('/start', function (BotMan $bot) { $bot->startConversation(new StartConversation()); })->stopsConversation();
عند كتابة الأمر / start ، سيبدأ StartConv Conversation (والذي يجب أن يرث من فئة المحادثة المجردة) وتطبيق طريقة التشغيل ().
يتم طرح الأسئلة بسهولة تامة ، على سبيل المثال:
$question = Question::create(" , ?")->addButtons([Button::create('')->value('create'), Button::create('')->value('join')]); $this->ask($question, function (Answer $answer) { if ($answer->isInteractiveMessageReply()) { if ($answer->getValue() == 'join') {
لاحظ أنه في Button يمكننا تحديد قيمة ، والتشبث بها لاحقًا؟ وهذا هو ، قبل عينيك ، تم إصلاح الخلل مع "الصلة" ، ويرجع ذلك إلى حقيقة أنني التشبث بقيمة () :)
بالمناسبة ، لا يزال بإمكانك استخدام الأسلوب isInteractiveMessageReply ، والذي سوف يجيب على السؤال عما إذا كنت قد كتبت نصًا أو قمت بالنقر فوق الزر التفاعلي عند الإجابة على السؤال المطروح للمستخدم.
لقد ساعد Botman في التخلص من الحالات ، ويمكنني إنشاء طريقة أخرى للطلب في طريقة الطلب ، على سبيل المثال ، إذا نقر أحد الأشخاص على "انضمام" ، فأنا فقط أسأل شخصًا آخر داخل هذا إذا.
فيما يلي بعض الأساليب (من عدد كبير جدًا) التي يوفرها botman ، والتي يمكن فهمها بسهولة من الاسم:
$ this-> كرر ($ question) ؛
$ this-> bot-> typesAndWaits ($ secondsToWait)؛
$ this-> bot-> الرد ($ reply) ؛
قاتل ميزات botman هو أنه يمكن تشغيل رمز واحد على العديد من المنصات. هذا هو ، يمكنك كتابة التعليمات البرمجية الخاصة بك ، في البداية تشغيله فقط من أجل Telegram. بعد ذلك ، قرر أنك لا تزال ترغب في الذهاب إلى Facebook Manager ، ولا يلزمك البدء في التعامل مع Facebook SDK على الإطلاق ، فقد قام مطورو Botman بهذا بالفعل من أجلك. كل ما تحتاجه هو
تثبيت برنامج التشغيل وتعيين واجهة برمجة تطبيقات Token لروبوت Facebook Messenger في .env. ستعمل جميع الوظائف تلقائيًا في Facebook messenger.
لا يدعم Botman Facebook Messenger و Telegram فحسب ، بل تتضمن هذه القائمة أيضًا Slack و Skype و WeChat (يمكن العثور على قائمة كاملة على موقعه على الويب).
يشتهر "بطل المناسبة" أيضًا بحقيقة أنه يمتلك بالفعل اختبارات الأب / Botman (يمكنك كتابة اختبارات الوحدات ، وحدتك) ، وكذلك الوثائق الجيدة. من الصعب تسمية جميع المزايا ، لأنني من الواضح أنني لم أعمل مع الجميع ، لا أتذكر كل شيء ، لكنني أعتقد أن ما وصفته يجب أن يكون بالفعل كافياً لأهتم بهم على الأقل :)
حسنًا ، حسنًا ، ولكن هل سنستضيف مرة أخرى على الاستضافة بمبلغ 1 دولار؟
لا ، هذا كل شيء خطير. استضافة 10 دولارات في الشهر ومجال مجاني مع المرجع. مجرد مزاح :)
قررت زيادة معرفتي بالإرساء ، واشتريت VPS على DigitalOcean ، وأطلقت المشروع في الإرساء. اتضح بشكل جيد ، على الرغم من حقيقة أنني فعلت ذلك تقريبا في المرة الأولى.
والمثير للدهشة أن العامل لم يسقط أبداً .
مع VPS ، بالطبع ، برودة :)
عندما عامل ميناء ، كان أكثر ملاءمة لإجراء التنمية (الإصدار على البكر وعلى الحفاظ على همز).
الشيء المضحك هو أنه عندما قدمت وظيفة مدفوعة في الروبوت ، كنت بحاجة للحصول على ترقية من نظام الدفع. عاد نظام الدفع لي باستمرار لطلبي للحصول على ترقية ، وقال "الموقع معطّل". عملت لي ، وعملت لأصدقائي (نحن من أوكرانيا) ، لكن لم يعمل مع شباب من الاتحاد الروسي. دون أي تردد ، رأيت أن Roskomnadzor ما زالت تحظر عنوان IP الخاص بحيئتي قبل عام (تم إتلاف الكثير من خوادم DigitalOcean بواسطة ILV في ذلك الوقت). ثم قرروا أيضا على هذا.
ما هو الروبوت الخاص بك مكتوب على؟
وإنني أنصح الجميع باستخدام هذا المكدس المعين عند كتابة روبوتاتهم في PHP (حتى لا تطلق النار في ساقك لاحقًا ، كما فعلت).
ما الجديد في الروبوت؟
تعلمت سانتا للاتصال
يمكنك طلب مكالمة من سانتا! سوف يفهمك ويستمع إليك حتى :)
اتصل سانتا بالعدد المشار إليه (من أرقام الولايات المتحدة الأمريكية) ، وطرح أسئلة ، على سبيل المثال ، "كيف تصرفت في العام؟" ، "ماذا تريد للعام الجديد؟" ، "هل تعرف القصيدة؟" ، إلخ. إذا قال المستخدم أنه لا يعرف القافية ، فسوف تتبع سانتا سيناريو مختلفًا للأسئلة ، وإذا قال أنه يعرف ذلك ، فسوف يطلب منك سانتا أن تخبره عن القافية :) المزيد: عندما يقول شخص ما قائمة تمنياته للعام الجديد إلى سانتا ، يستمع سانتا ، ثم يرسل هذه قائمة الأمنيات للمستخدم الذي طلب المكالمة (فجأة ، تم إغلاق الطفل من والديه في الغرفة ، ولكن بطريقة ما يحتاجون إلى معرفة ما طلب سانتا؟). يرسل سانتا أيضا التسجيل الصوتي للمكالمة مع سانتا كتذكار :)
الآن يمكنك معرفة من هو سانتا الخاص بك.
Zrada؟ هذا يتناقض مع اسم لعبة "سر سانتا" ، أليس كذلك؟ من حيث المبدأ ، نعم. ولكن في العام الماضي ، من عدد الأشخاص الذين أرادوا معرفة سانتا الخاصة بهم ، تم مزقت المخدرات بلدي. "هل يعطيني الرئيس هدية؟" ، "شخص ما لم يقدم لنا هدية لشخص ما ، هل يمكنك معرفة من كان ينبغي أن يعطيها؟" ، وهلم جرا. الآن هناك مثل هذه الفرصة ، ولكن مهما كانت - هذه المتعة ستخرج بسعر 5.99 دولار :)
النتائج
يجب ألا تأمل أن يكون مشروعك دائمًا صغيرًا. ليست هناك حاجة لإنشاء index.php واحد مع مجموعة من ifs ، حتى لو كان المشروع يبدأ مع اثنين فقط من ifs (أعرف ما يكفي من هذه المشاريع)). من الأفضل القيام بذلك على الفور. حتى إذا كنت تقضي وقتًا أطول في ذلك ، فسوف يوفر لك فوائد ذلك عندما تحتاج بشكل عاجل إلى تغيير / إضافة منطق إلى المشروع ، لم يكن عليك التفكير في كيفية تغيير ifas حتى لا يسقط الروبوت ، كما اتضح لي :). أيضًا ، يعلمك هذا النهج (مع ifas) اتخاذ جميع القرارات الأخرى (وليس أفضل مهارة ، توافق). حسنًا ، بالطبع ، فكر في نفسك ، سوف تضطر إلى الدخول إلى هذا الكود لاحقًا ، وعليك أن تتعامل معه ، وبعد ذلك لن يكون حلوًا جدًا :(
كل رمز جيد ، وكتابة روبوتات الدردشة الخاصة بك ، وكذلك كتابة المشاريع الخاصة بك. هذا رائع!
في النهاية ، أود أن أذكر أنني قرأت في مكان ما:
إذا كنت تعرف أن مشاريعك المفضلة التي تستخدمها (Facebook ، VK ، إلخ) مبنية بحيث تكون على وشك السقوط ، فستتفاجأ. نعم ، في الواقع ، لقد لعب الجميع بكل سرور ، ولا حتى تخيلوا ما يجري داخل هذا الروبوت (لقد صُدمت بنفسي كيف نجا في ديسمبر :)).
إذا كنت تريد أن تلعب -
ويلكوم :)