الروبوت "مخطط ذكي": يفهم تماما

إذا أردت يومًا ما أن يكون لديك خادم شخصي يذكرك بكل ما تخبره عنه ، ولكن لم تتح لك الفرصة لتوظيفه ، فإن الروبوت الذي طورته سيكون بديلاً مناسبًا له.







هل تريد اختبار الوظيفة؟ اكتب إلى الروبوت باستخدام هذا الرابط وسيجيب عليك.



وبالنسبة لأولئك المهتمين بكيفية عمله وكيف تمكن طالب يبلغ من العمر 16 عامًا من كتابته ، سأخبرك بكل سرور بكل شيء بالتفصيل في هذه المقالة.



خلفية



بدأ كل شيء مع الروبوت الآخر الخاص بي لـ VK على العقدة js ، والذي قام بفك تشفير الرسائل الصوتية (وبما أن هذه الروبوتات هي عشرة سنتات ، فقد قررت عدم كتابة مقال عن تطوره ، على الرغم من أنه يحتوي أيضًا على العديد من الميزات المميزة). بعد أن قمت بإطلاقه ، اقترح والدي أن أقوم بتطوير روبوت آخر لدردشة عائلتنا عبر البرقية. كان جوهر هذا الروبوت بسيطًا - لاستخراج التاريخ والوقت من رسالة نصية لشخص ما ، واستخدام الرسائل المتأخرة برقية ، وإنشاء تذكيرات مباشرة في الدردشة العائلية.



لكن سرعان ما شعرت بخيبة أمل. اتضح أن الروبوتات لا يمكنها إنشاء رسائل مؤجلة ، لذلك قررت أن أكتب نظامي الخاص لتخزين التذكيرات وتنفيذها.



تطوير



معلومات عامة



هذا الروبوت مكتوب في node js ويعيش على heroku .



إنه قادر على تخزين أي تذكيرات نصية دقيقة حتى الدقيقة.



يمكنه أيضًا العمل في المحادثات الجماعية.



في الوقت الحالي ، يتعرف الروبوت على التاريخ والوقت باللغة الروسية فقط.



SmartScheduler هو مشروع مفتوح المصدر متاح على جيثب الخاص بي .



استخراج التاريخ والوقت من الرسالة



قررت أن أبدأ بأصعب مهمة: تقسيم تذكير نصي إلى تاريخ وتذكير نفسه. للقيام بذلك ، كان علينا أن نأخذ في الاعتبار جميع المعايير الممكنة لكتابة التاريخ من قبل شخص ، من " الساعة 12:00 " إلى " الأحد المقبل في الساعة الخامسة والعشرين إلى الثامنة مساءً ".



تم إنشاء قاعدة بيانات كبيرة (constValues.js) ، لتخزين التعبيرات الثابتة وخصائصها التي يستخدمها الشخص في حديثه. ثم تمت كتابة الدالات للتعرف على كل تهجئة للوقت.



على سبيل المثال ، يتم استخدام دالة للتعرف على تاريخ في النموذج "خلال X ٪ time_type ٪" FindAdditiveLiterals، ولإيجاد يوم الأسبوع FindDayOfWeek.



كل خيار تعيين الوقت له الأولوية الخاصة به.



نتيجة لذلك ، تبدو خوارزمية المحلل كما يلي:



  1. السلسلة الأصلية مقسمة إلى كلمات. لا يمكن أن تتجاوز الكلمات التي يتم البحث عن الوقت فيها 40 كلمة.
  2. يتم تمرير مجموعة من الكلمات من خلال وظيفة تحويل الكلمة إلى رقم.
  3. تم العثور على جميع مؤشرات الوقت في الرسالة ، كما تم تمييز الكلمات المستخدمة في المؤشرات (على سبيل المثال ، في الإشارة "المنبه الساعة 8 صباحًا" يتم تمييز الكلمتين "8" و "ساعات").

  4. إذا لم يتم العثور على بعض خصائص الوقت (على سبيل المثال ، الشهر) في رسالة نصية ، فسيتم أخذ القيمة الحالية لهذه الخاصية.
  5. بالنسبة للحكم النهائي ، يتم تحديد مؤشرات الوقت ذات الأولوية القصوى والمؤشرات المجاورة التي لها نفس الكلمة المصدر (على سبيل المثال ، في الكلمة "10:30" يشار إلى كل من الساعة والدقيقة في وقت واحد).
  6. , , , .
  7. , .
  8. ,

    { string: answer, string: text, date: date }





    { string: answer, string: text }

    (answer – , text – , date – ).




كانت الأسئلة التالية هي مكان تخزين جميع التذكيرات وكيفية تتبع تنفيذها.



في البداية ، كنت أرغب في استخدام مكتبة جدول العقدة ، لكنني تخليت عن هذه الفكرة ، لأنني لم أرغب في انسداد ذاكرة الوصول العشوائي بكل التذكيرات.



بدلاً من ذلك ، قررت دراسة كيفية عمل قواعد بيانات SQL وإنشاء قواعد بيانات خاصة بي.



بعد قراءة العديد من المقالات على الإنترنت ، قمت بإنشاء قاعدة بيانات postgresql على منصة heroku ، حيث يمكنك تضمين قواعد البيانات في تطبيقاتك فيها ، وهو أمر مريح للغاية.



للتفاعل مع قاعدة البيانات ، كتبت نصًا صغيرًا (db.js) ، قمت فيه بتنفيذ جميع الوظائف الضرورية ، مثل تهيئة قاعدة البيانات ، والحصول على قائمة بالتذكيرات ، إلخ.



يوجد جدولين في قاعدة البيانات الخاصة بي: الأول لتخزين التذكيرات ، والثاني لتخزين المناطق الزمنية للمستخدمين (المزيد حول ذلك لاحقًا).



بعد ذلك ، قمت بحفظ تذكير تم تحليله من رسالة نصية إلى قاعدة البيانات. يقوم المؤقت ، الذي يعمل مرة واحدة في الدقيقة ، بفحص وقت التذكيرات. إذا حان وقت التذكير ، فسيتم حذفه من قاعدة البيانات ، ويتم إرسال رسالة بنص التذكير إلى المستخدم الذي قام بذلك.



أضفت أيضًا عرض جميع التذكيرات عبر الأمر list / .







(يوجد أمر / N قابل للنقر بجوار كل تذكير ، والذي يزيله عند النقر عليه)



ضبط المنطقة الزمنية



قبل أن أقرر كتابة هذا المقال ووضعه في Habr ، كانت المنطقة الزمنية في موسكو مشفرة في متغيرات البيئة. كان هذا كافيًا للاستخدام داخل عائلتنا ، ولكن من أجل الاستفادة من كل مباهج ووسائل الراحة في الحياة باستخدام برنامج SmartScheduler الروبوت الذي يمكن لأي شخص ، قررت إضافة إعداد منطقة زمنية فردية.



لإكمال التكوين ، تحتاج إلى كتابة الأمر / tz ، الذي سيحذر الروبوت المستخدم بشأنه إذا لم يحدد المنطقة الزمنية الخاصة به بعد:







(نظرًا لحقيقة أن المنطقة الزمنية غير محددة ، فإن الاستجابة لا تستخدم التوقيت المحلي ، ولكن توقيت غرينتش)



عند إدخال الأمر / tz تبدأ عملية تحديد المنطقة الزمنية وتظهر لوحة مفاتيح بثلاثة أزرار:







  1. باستخدام موقع المستخدم.
  2. إدخال يدوي.
  3. إلغاء.



يسأل الزر الأول المستخدم عن موقعه ، بناءً على حساب المنطقة الزمنية.



مثال على الاستخدام




يتيح لك الزر الثاني إدخال منطقتك الزمنية يدويًا بالتنسيق ± HH: MM ،

حيث ± - زائد أو ناقص ، HH - ساعة ، MM - دقيقة.



مثال على الاستخدام




الزر الثالث يلغي عملية التعريف.



بعد أن يحدد المستخدم منطقته الزمنية ، سيعرض الروبوت وقت التذكير بشكل صحيح ويحفظه.



التحسينات النهائية



بعد الانتهاء من الوظيفة الرئيسية ، أضفت لوحة المفاتيح الرئيسية بالوظائف الرئيسية ، وصححت الإجابات لأوامر البدء و / المساعدة ، وللأشياء الصغيرة.



قررت أيضًا استبدال المنطقة الزمنية الافتراضية لجميع المستخدمين بموسكو .



نتيجة



الميزة الرئيسية لروبوت SmartScheduler هي ، بالطبع ، تحليل التاريخ ، والذي يسمح لك بكتابة المعلومات أو المهمة الضرورية بسرعة وسهولة في شكل تذكير حتى في أكثر المواقف التي لا يمكن التنبؤ بها.



لم تعد بحاجة إلى التنقل خلال التقويم بحثًا عن اليوم الصحيح وتشغيل الساعة لضبط الوقت المناسب ، يكفي أن تخبر الروبوت "ماذا" و "متى" ، وبعد ذلك سيفعل كل شيء بنفسه.



خاتمة



قبل تطوير برامج الروبوت على node js ، لم أكن على دراية كاملة بجافا سكريبت ، لذلك ، تم أخذ كل المعرفة التي استخدمتها في كتابة الكود من الإنترنت ، حيث يمكنك غالبًا العثور على ما لا تحتاجه بالضبط. لهذا السبب ، على الأرجح ، توجد أخطاء غبية في مكان ما في الكود الخاص بي ، والتي ما زلت لا أعرف الكثير بما يكفي لتحديدها.



في البداية ، لم يكن هدفي إنشاء الأكثر تقدمًا والأكثر مثالية من وجهة نظر هيكل المشروع ، بل كان الأمر الأكثر أهمية بالنسبة لي اكتساب معرفة جديدة ، وتعلم لغة برمجة جديدة لتحسين فهم علوم الكمبيوتر بشكل عام ، وإنشاء منتج MVP.



ولكن إذا كان هذا التطوير مطلوبًا ، فسأستمر في تحسينه بكل سرور ، وإذا كان لديك أي أفكار أو وجدت خطأ ، فمرحبا بكم في موقع جيثب الخاص بالمشروع. لدي بالفعل أفكار حول مكان وكيفية تغيير ماذا (على سبيل المثال ، إعادة كتابة رمز السباغيتي الرهيب في وحدة التحليل باستخدام نمط الزائر العادي) ، بالإضافة إلى خطط لإضافة دعم للغة الإنجليزية.



آمل أن يساعدك هذا الروبوت كما أنه يساعدني وعائلتي في أنشطتنا اليومية.



شكرآ لك على أهتمامك!



محدث: دعم إضافي للرسائل الصوتية حسب الطلب الشائع.

UPD 2: تلقى الروبوت تحديثًا رئيسيًا منذ نشر المقالة. قائمة التغييرات .



All Articles