انجمن برنامه نویسان البرز

تبلیغات

Strategy Pattern در ساخت ربات های تلگرام با سی شارپ

Strategy Pattern در ساخت ربات های تلگرام با سی شارپ


اگر با Design Pattern ها آشنایی ندارید، حتما سعی کنید هر چند تا از آنها را که میتوانید یاد بگیرید. راستش را بخواهید خود من هم تا همین اواخر با Design Pattern ها آشنایی نداشتم. بی پرده بگویم: تا وقتی که Design Pattern ها را یاد نگرفته اید، بی انصافی است اگر خودتان را برنامه نویس حرفه ای بدانید. در این مطلب از Strategy Pattern استفاده خواهیم کرد.

موضوع این مقاله، کمی از سطح برنامه نویسان مبتدی و متوسط بالاتر است. بنابراین احتمال دارد با خواندن این مقاله کمی گیج بشوید. کدی که از آن استفاده میکنیم، با استفاده از Strategy Pattern سعی دارد مفهوم Open/Close از مفاهیم SOLID را بر روی ربات های تلگرام پیاده سازی کند.

قبل از خواندن این مقاله، حتما آموزش مربوط به استفاده از Interface در سی شارپ را مطالعه کنید.

اگر با ربات های تلگرام آشنایی داشته باشید، قطعا میدانید که یک از بزرگترین مشکلات ربات ها این هست که شما تنها با رشته ها سر و کار دارید. اگر ربات شما عملیات زیادی را انجام بدهد، ابتدایی ترین راه این است که بر اساس رشته ها تصمیم گیری کنید. مثلا اگر پیغامی که از کاربر میگیرید مساوی با start بود فلان کار را میکنید. اگر مساوی با info بود یک کار دیگر را میکنید و به همین ترتیب یک زنجیره بزرگ از if/else و یا دستور Switch دارید. مثل کد زیر:


            if(e.Message.Text=="/start")
            {
                bot.SendTextMessageAsync(chatID, "خوش آمدید");
            }
            else if (e.Message.Text == "/info")
            {
                bot.SendTextMessageAsync(chatID, "اطلاعات شما به شرح زیر است...");
            }
            else if (e.Message.Text == "/Name")
            {
                bot.SendTextMessageAsync(chatID, "ا...");
            }

این کد ۲ مشکل بزرگ دارد:

اول اینکه در صورت زیاد بودن تعداد دستورات برنامه، دیباگ آن بسیار سخت خواهد بود و حجم کد بسیار زیادی را به یک کلاس تحمیل میکند. که البته این مشکل اصلی نیست.

مشکل دوم و اصلی این است که این کد، به وضوح قاعده Open/Close را نقض میکند. در نتیجه با اضافه شدن دستورات، نیاز داریم دائما کلاسمان را ادیت کنیم که مطمئنا مطلوب نیست.

راه حل این مشکل استفاده از Strategy Pattern است تا کد ما منظم شود و همینطور قاعده Open/Close در آن رعایت شود. و اما برای استفاده از Strategy Pattern باید چه کنیم؟ با ویدیوی جدید ما همراه باشید:

بعد از دیدن ویدیو، مشکلی که امکان دارد با آن برخورد کنید این است که چطور در داخل کلاس های Message میتوانید یک مسیج تلگرام بفرستید؟ در ویدیو، ما strin Message را به متد Proccess پاس داده ایم. سعی کنید کل کلاس Update را به Proccess پاس بدهید. انجامش به عنوان تمرین، به عهده شما باشد.

دانلود سورس برنامه




کلمات کلیدی :

نظر بدهید

43 دیدگاه برای “Strategy Pattern در ساخت ربات های تلگرام با سی شارپ

  • سید امیرحسین گفته
    9 نوامبر 17

    سلام مهندس جان! کارت بیسته اصن! واقعا دستت درد نکنه

    • علیرضا صبوئی گفته
      9 نوامبر 17

      زنده باشید دوست عزیزم.

  • سیدامیر گفته
    9 نوامبر 17

    سلام ، خیلی ممنون عالی بود
    یه سوال ، بعضی از ربات ها درخواست شماره موبایل به کاربر میدن که بعد از تایید کاربر شماره موبایل داده میشه ، با چه دستوری این کار انجام میشه؟

    • علیرضا صبوئی گفته
      9 نوامبر 17

      دوست عزیز اگر درست یادم باشه
      button هایی که میسازید، ۲ تا پراپرتی دارن. یکیش RequestLocation بود که درخواست لوکیشن هستش. اگر اشتباه نکنم اون یکی مربوط به تلفن بود. بررسی کنید اگر این نبود، به من اطلاع بدید.

      • سیدامیر گفته
        9 نوامبر 17

        سلام
        ممنون از پاسخ شما
        همان طور که گفتید KeyboardButton ها خاصیت RequestContact و RequestLocation دارند که اگر True بشه لکیشن یا کانتکت ارسال میشه
        ممنون میشم آموزش ربات رو ادامه بدید. نحوه ادیت پیام ها (مخصوصا برای InlineKeyboardButton مثل روبات پدر) و یا ارسال فایل موضوعات کاربردی هستند

        • علیرضا صبوئی گفته
          9 نوامبر 17

          زنده باشید. اگر خدا بخواهد سعی میکنم این آموزش را ادامه بدهم

  • سید امیرحسین گفته
    9 نوامبر 17

    سلام مجدد
    جناب مهندس صبویی، من از دستور زیر استفاده می کنم:
    await Bot.deleteMessageAsynce(e.message.chat.Id,e.message.messageId)
    ظاهرا پیام های حاوی مدیا رو پاک نمی کنه (تصویر،صوت، ویدئو) و صرفا text ها پاک می شن، واسه این مشکل راه حلی هست؟؟؟ سری قبل که مطرح کردم فرمودین شاید ایراد از If باشه، بررسی کردم ولی مشکلی نداشت. مرسی

    • علیرضا صبوئی گفته
      9 نوامبر 17

      دوست عزیز سلام. من امروز این موضوعو چک میکنم و خبرشو بهتون میدم

  • امین احمدی گفته
    9 نوامبر 17

    سلام.
    چه پیشنهادی برای دریافت اطلاعات یک جدول از کاربر می دهید؟
    مثلاً جدول ثبت نام
    نام،
    نام خانوادگی،
    نام پدر و …

    • علیرضا صبوئی گفته
      9 نوامبر 17

      دوست عزیز یک جدول ایجاد کنید به نام History و در اون چت آی دی به همراه آخرین سوال پرسیده شده رو نگه دارید. توی هر کدوم از کلاس هایی که IMessage رو Implement میکنن، هیستوری رو چک کنید و ببینید که آیا پاسخ مربوطه، مال اون کلاس هستش یا خیر

  • محسن گفته
    9 نوامبر 17

    سلام خسته نباشید
    من میخواستم تصویر ارسالی از طرف کاربر رو بر روی دیتا بیس ذخیره کنم ؟
    باید از چه متدی از ربات استفاده کنم ؟
    var photo = e.Message.Photo;
    در واقع میخوام عکس رو تو یه فولدر ذخیره کنم و آدرس تصویر رو در دیتا بیس.

    • علیرضا صبوئی گفته
      9 نوامبر 17

      دوست عزیز هر عکسی که فرستاده میشه در غالب آرایه ای از عکس ها به ربات ارسال میشه. آرایه ای از همان عکس اما با ابعاد مختلف.
      آخرین عضو این آرایه، ابعاد واقعی عکسو داره. بنابراین ابتدا باید fileID آخرین عضو آرایه را در یک متغیر بریزید:

      
      var fileID = e.Message.Photo[e.Message.Photo.Length - 1].FileId;
      

      حالا آی دی فایل مربوطه رو که نزد تلگرام هستش داریم. در این مرحله باید اون فایل رو از تلگرام بگیریم و در یک Stream نگه داریم. که بعدا میتونیم اون Stream رو به صورت فایل باینری روی هارد ذخیره کنیم.

      
      var fileID = e.Message.Photo[e.Message.Photo.Length - 1].FileId;
      var stream=bot.GetFileAsync(fileID).Result.FileStream;
      

      در کل یک کمی سخته 🙂

  • محسن گفته
    9 نوامبر 17

    ممنون از پاسخ خوبتون

    • علیرضا صبوئی گفته
      9 نوامبر 17

      زنده باشید

  • فاطمه گفته
    9 نوامبر 17

    سلام
    برای افرادی که در حد اموزش برنامه c++ برنامه نویسی میدانند و تا به اکنون این تجربه در نوشتن کد در تلگرام نداشته اند این ویدیو های اموزشیتان را پیشنهاد میکنید؟
    و اینکه بااستفاده از روش دوم( استفاده نکردن از هاست) باید هزینه ای برای خواندن کدها از تلگرام پرداخت شود؟

  • سید مرتضی گفته
    9 نوامبر 17

    سلام مهندس

    ببین آموزش ساخت ربات مث ربات دیجی کالا میدید ؟؟
    یه چیزی تو مایه های InLine ولی موقعی که میزنی /Digikala
    اجناس رو میاره بالای متن نوشته شده و میتونی انتخاب کنی و خرید بزنی

  • سید مرتضی گفته
    9 نوامبر 17

    سلام مهندس صبوئی
    ببین من به یه مشکلی برخوردم
    با این که .net فریم ورک رو تا ۴٫۷ دانلود کردم ولی بازم به دانلود پکیج ناگت برای ایمپورت کتابخانه ای که مال رابین مولره گیر میده چ کنم ب نظرت ؟؟

  • سید مرتضی گفته
    9 نوامبر 17

    http://uupload.ir/files/65pg_001.png
    این عکس ارور هستش
    سعی کردم هرچی برای توظیح لازمه رو توش بندازم
    ارورش به نت فریم ورک هستش فک کنم؛
    نسخه انتخابیم رو بین ۴٫۱تا ۴٫۷ هرچی زدم نشد همونی رو انتخاب کردم که قبلا هم کرده بودم و شمام کردی با کنسول هم زدم نشد الان با فرم زدم میخوام ی چیزایی بهش اضافه کنم ی طرحی تو ذهنمه راهنمایی کن لطفا واقعا لازمه قبلا زده بودم میشد همین امروز مشتری میخواست اینجوری شد

  • erfan گفته
    9 نوامبر 17

    سلام ممنون برای فیلم های عالیتون خواستم ازتون یه درخواست کنم آموزش ارسال فایل صوتی و یا عکس به کاربر رو می شه یاد بدین مممنون

    • علیرضا صبوئی گفته
      9 نوامبر 17

      دوست عزیزم برای ارسال هر نوع فایلی، از توابع موجود در این کتابخانه میتونید استفاده کنید. اگر بزنید bot.Send براتون لیستشون میکنه.

  • erfan گفته
    9 نوامبر 17

    ببخشید ممنون می شم اموزش استفاده از بانک اطلاعاتی رو در این نوع اموزش یاد بدین

    • علیرضا صبوئی گفته
      9 نوامبر 17

      عرفان عزیز برای یادگیری کار با بانک اطلاعاتی، به پروژه آموزشی پارکینگ مراجعه کنید.

  • محمد گفته
    9 نوامبر 17

    چطوری کاری کنم برای استفاده از ربات حتما باید عضو کانال من باشن ؟ لطفا کامل تو ضیح بدین ممنون

    • علیرضا صبوئی گفته
      9 نوامبر 17

      Bot.GetMemberAsync
      توضیحاتی که intelissence در این مورد بهتون میده، کامل هستش

  • محمد حسین اسماعیلی گفته
    9 نوامبر 17

    سلام واقعا مرسی از شما من یک مشکلی دارم اینم این هست که میخوام مقدار جدیدی در e.message.text بریزم اما خرید آنلاین ریخته میشه در این e.message.text

    else if(e.Message.Text== “خرید آنلاین”)
    {
    bot.SendTextMessageAsync(e.Message.Chat.Id, “username ke mikhain sabt she ro vared konin”);

    using (SqlCeConnection connection = new SqlCeConnection(@”Data Source = C:\Users\Mohamad Hossein\Documents\Visual Studio 2015\Projects\ConsoleApplication1\robotdbtest.sdf”))
    {
    String query = “INSERT INTO [user] (username,password) VALUES (@username,@password)”;

    using (SqlCeCommand command = new SqlCeCommand(query, connection))
    {

    command.Parameters.AddWithValue(“@username”, e.Message.Text);
    command.Parameters.AddWithValue(“@password”, e.Message.Text);

    connection.Open();
    int result = command.ExecuteNonQuery();

    //Check Error
    if (result < 0)
    Console.WriteLine("Error inserting data into Database!");
    }
    }
    این کد من هستش که میگم خرید انلاین و زد بیا به ترتیب پسورد و نام کاربری آن را بگیر
    هر کاری کردم نشد تو دیتابیس همین خرید آنلاین سیو میشه

    ممنون میشم کمکم کنین چون واقعا بهش نیاز دارم مرسی

  • مرجان اصغری گفته
    9 نوامبر 17

    سلام و با عرض تشکر
    برای ایجاد لینک دعوت کاربر و گرفتن InviteLink چه روشی باید به کار برد؟
    https://telegram.me/dotsgamebot?start=invite= به این صورت ایجاد کردم ولی InviteLink را خالی میفرستد.
    ممنون میشم راهنمایی کنیید

    • علیرضا صبوئی گفته
      9 نوامبر 17

      با سلام. امکانش هست بیشتر توضیح بدید؟ من متوجه منظورتون نشدم

  • nader گفته
    9 نوامبر 17

    با سلام
    لطفا در مورد نحوه استفاده از پایگاه داده توسط ربات تلگرام توضیحاتی بیان کنید
    با تشکر

  • کاوه نوروزی گفته
    9 نوامبر 17

    باسلام و تشکر بابت آموزش های عالی تون
    میشه یه راهنمایی در مورد MakeRequestAsync توضیح بدین و یا اگه مطلبی در مورد چگونگی استفاده ازش هست بگین؟

  • امیر گفته
    9 نوامبر 17

    سلام
    ممنون از آموزش های خوبتون
    من میخواستم دسترسی داشته باشم به کلیه امکاناتی که کتابخونه مولر داره و در موردش بخونم برای استفاده در ربات
    در کجا میتونم پیدا کنم؟

    • علیرضا صبوئی گفته
      9 نوامبر 17

      دوست عزیز مستندات کتابخونه اعلام نشده اما متدهاش کاملا آرگومانهای ورودیشون مشخص هستن

  • امیر گفته
    9 نوامبر 17

    سلام من نظر خیلی کم میدم ولی این اموزشتون عالییی بود و دلم نیومد ازتون تشکر نکنم ممنونم بابت اموزش خوبتون خدا قوت

    • علیرضا صبوئی گفته
      9 نوامبر 17

      ممنونم. لطف شماست

  • moien007 گفته
    9 نوامبر 17

    سلام, ممنون از اموزشتون.
    فقط می خواستم یه نکته بگم. بهتر نبود از dictionary استفاده کنیم ؟ این طوری دیگه لازم نبود اول هر متد Process بنویسیم if

    بازم ممنون 🙂

    • علیرضا صبوئی گفته
      9 نوامبر 17

      معین عزیز برام جالب شد. منظورتون دقیقا چجوریه یعنی؟

  • پیمان گفته
    9 نوامبر 17

    سلام. ممنون از آموزشتون. strategy pattern که آموزش دادید خیلی کاربردی بود اما برای حالت سلسله مراتبی باید چطور عمل کرد؟ مثلا فرض کنید تو هر کدوم از اون کلاس ها (اسم/ فامیل/…) تعداد شرطها باز زیاد (و تو در تو) باشه. یعنی میشه با همین پترن و مثلا با چندتا هندلر بصورت تو در تو استفاده کرد؟ یا روش خاصی پیشنهاد میکنید؟ کلا این مشکل وقتی پیش میاد که گزینه های بعدی (که ممکنه تعدادشون زیاد باشه) وابسته به انتخاب قبلی کاربر باشه (و اون قبلی هم باز وابسته به قبلیش و …و همینطور سلسله مراتبی)
    ممنون میشم راهنمایی کنید

    • علیرضا صبوئی گفته
      9 نوامبر 17

      پیمان عزیزم در اینجور مواقع یک Pattern دیگر به اسم chain of responsibility استفاده میشه

      • پیمان گفته
        9 نوامبر 17

        ممنون از راهنماییتون. منبعی هست که بشه یک نمونه از این روش رو دید؟ یا ممکنه تو یک قسمت اون رو هم یک توضیح مختصری بدین؟
        ارادتمند..

        • علیرضا صبوئی گفته
          9 نوامبر 17

          پیمان جان توضیح مفصلی داره. برای شروع، در گوگل سرچ کنید Chain of responsibility Design pattern

          • پیمان گفته
            9 نوامبر 17

            ممنونم. بله، سرچ کردم و توضیحات زیادی هست ولی هیچکدوم مشخصا برای تلگرام نبود (یا من ندیدم). بعضی از آموزشها هم با مثالهایی بودن که کلا درکش (و انطباقش با بات تلگرلم) سخته یکمی. اگر میشد یک مثال برای تلگرام با این پترن بود خیلی خوب میشد ولی به هر حال خیلی ممنونم

  • ss گفته
    9 نوامبر 17

    سلام خسته نباشید ببخشید از اونجا که توی این اموزش از api تلگرام استفاده نکردید میشه سورس یک ربات تلگرام نوشته شده با استراتژی پترن رو بدید بهم؟؟؟؟؟ واقعا نیاز دارم به همچنین سورسی چون من درست متوجه نشدم چطوری کار میکنه اگه خود ربات تلگرام واقعی باشه خیلی بهتره
    خیلی ممتنون از اموزش خوبتون🙏🏻🙏🏻🙏🏻