Հեռագրային բոտ գրել R-ով (մաս 2). Բոտին ավելացնել հրամանների աջակցություն և հաղորդագրությունների զտիչներ

В նախորդ հրապարակումը մենք պարզեցինք, թե ինչպես ստեղծել բոտ, սկզբնավորեցինք դասի օրինակը Bot և ծանոթացավ դրա միջոցով հաղորդագրություններ ուղարկելու եղանակներին:

Այս հոդվածում ես շարունակում եմ այս թեման, ուստի խորհուրդ եմ տալիս սկսել կարդալ այս հոդվածը միայն կարդալուց հետո առաջին մասը.

Այս անգամ մենք կպարզենք, թե ինչպես վերակենդանացնել մեր բոտը և դրան ավելացնել հրամանի աջակցություն, ինչպես նաև կծանոթանանք դասի հետ Updater.

Հոդվածի ընթացքում մենք կգրենք մի քանի պարզ բոտեր, վերջիններս, ելնելով տվյալ ամսաթվից և երկրի ծածկագրից, կորոշեն՝ տվյալ երկրում օրը հանգստյան օր է, թե աշխատանքային օր՝ ըստ արտադրության օրացույցի։ Բայց, ինչպես նախկինում, հոդվածի նպատակն է ծանոթացնել ձեզ փաթեթի ինտերֆեյսին telegram.bot սեփական խնդիրները լուծելու համար։

Հեռագրային բոտ գրել R-ով (մաս 2). Բոտին ավելացնել հրամանների աջակցություն և հաղորդագրությունների զտիչներ

Բոլոր հոդվածները «Telegram bot գրել R-ում» շարքից

  1. Մենք ստեղծում ենք բոտ և օգտագործում այն ​​հեռագրում հաղորդագրություններ ուղարկելու համար
  2. Բոտին ավելացրեք հրամանների աջակցություն և հաղորդագրությունների զտիչներ

Պարունակություն

Եթե ​​դուք հետաքրքրված եք տվյալների վերլուծությամբ, ապա ձեզ կարող է հետաքրքրել իմը հեռագիր и youtube ալիքներ. Բովանդակության մեծ մասը նվիրված է R լեզվին։

  1. Թարմացնող դաս
  2. Handlers - handlers
  3. Առաջին հրամանը ավելացրեք բոտին՝ հրամանների մշակիչին
  4. Տեքստային հաղորդագրությունների պրոցեսոր և զտիչներ
  5. Պարամետրերով հրամանների ավելացում
  6. Գործարկեք բոտը հետին պլանում
  7. Ամփոփում

Թարմացնող դաս

Updater Դա դաս է, որը ձեզ համար հեշտացնում է հեռագրային բոտի մշակումը և օգտագործում է կափարիչի տակ գտնվող դասը Dispetcher. Դասարանային առաջադրանք Updater բոտից թարմացումներ ստանալն է (նախորդ հոդվածում մենք այդ նպատակով օգտագործել ենք մեթոդը getUpdates()), և դրանք տեղափոխեք հետագա Dispetcher.

Իր հերթին Dispetcher պարունակում է ձեր ստեղծած մշակողները, այսինքն. դասի օբյեկտներ Handler.

Handlers - handlers

Բեռնիչներով, որոնց դուք ավելացնում եք Dispetcher բոտի արձագանքը տարբեր իրադարձությունների: Այս հոդվածը գրելու պահին telegram.bot Ավելացվել են կարգավորիչների հետևյալ տեսակները.

  • MessageHandler — Հաղորդագրությունների մշակող
  • CommandHandler — Հրամանի մշակող
  • CallbackQueryHandler — Inline-ից ուղարկված ստեղնաշարերի տվյալների մշակիչ
  • ErrorHandler — Սխալների մշակիչ բոտից թարմացումներ խնդրելիս

Առաջին հրամանը ավելացրեք բոտին՝ հրամանների մշակիչին

Եթե ​​նախկինում երբեք չեք օգտագործել բոտեր և չգիտեք, թե ինչ է հրամանը, ապա հրամանները բոտին պետք է ուղարկվեն՝ օգտագործելով առաջ կտրվածք: / որպես նախածանց։

Մենք կսկսենք պարզ հրամաններից, այսինքն. եկեք սովորեցնենք մեր բոտին բարևել հրամանով /hi.

Կոդ 1. Բոտին սովորեցնել բարևել

library(telegram.bot)

# создаём экземпляр класса Updater
updater <- Updater('ТОКЕН ВАШЕГО БОТА')

# Пишем метод для приветсвия
say_hello <- function(bot, update) {

  # Имя пользователя с которым надо поздароваться
  user_name <- update$message$from$first_name

  # Отправка приветственного сообщения
  bot$sendMessage(update$message$chat_id, 
                  text = paste0("Моё почтение, ", user_name, "!"), 
                  parse_mode = "Markdown")

}

# создаём обработчик 
hi_hendler <- CommandHandler('hi', say_hello)

# добаляем обработчик в диспетчер
updater <- updater + hi_hendler

# запускаем бота
updater$start_polling()

Գործարկեք վերը նշված կոդի օրինակը՝ «ՁԵՐ ԲՈՏ ՏՈԿԵՆ»-ը փոխարինելուց հետո բոտը ստեղծելիս ստացած իրական նշանով: BotFather (Ես խոսեցի բոտ ստեղծելու մասին առաջին հոդվածը).

մեթոդ start_polling() դաս Updater, որն օգտագործվում է կոդի վերջում, սկսում է բոտից թարմացումների հարցումների և մշակման անվերջ օղակ:

Հիմա եկեք բացենք Telegram-ը և գրենք առաջին հրամանը մեր բոտին /hi.

Հեռագրային բոտ գրել R-ով (մաս 2). Բոտին ավելացնել հրամանների աջակցություն և հաղորդագրությունների զտիչներ

Այժմ մեր բոտը հասկանում է հրամանը /hi, և գիտի, թե ինչպես ողջունել մեզ:

Սխեմատիկորեն նման պարզ բոտ կառուցելու գործընթացը կարելի է պատկերել հետևյալ կերպ.

Հեռագրային բոտ գրել R-ով (մաս 2). Բոտին ավելացնել հրամանների աջակցություն և հաղորդագրությունների զտիչներ

  1. Ստեղծեք դասի օրինակ Updater;
  2. Մենք ստեղծում ենք մեթոդներ, այսինքն. գործառույթներ, որոնք կկատարի մեր բոտը: Կոդի օրինակում սա ֆունկցիա է say_hello(). Գործառույթները, որոնք դուք կօգտագործեք որպես բոտի մեթոդներ, պետք է ունենան երկու պահանջվող արգումենտ. bot и թարմացնելև մեկ կամընտիր- աղեղներ. Փաստարկ bot, սա ձեր բոտն է, որի օգնությամբ դուք կարող եք պատասխանել հաղորդագրություններին, ուղարկել հաղորդագրություններ կամ օգտագործել բոտին հասանելի ցանկացած այլ եղանակ։ Փաստարկ թարմացնել սա այն է, ինչ բոտը ստացել է օգտատերից, փաստորեն, այն, ինչ մենք ստացել ենք առաջին հոդվածում՝ օգտագործելով մեթոդը getUpdates(). Փաստարկ աղեղներ թույլ է տալիս հրամանի հետ միասին մշակել օգտատիրոջ ուղարկած լրացուցիչ տվյալները, այս թեմային կանդրադառնանք մի փոքր ուշ;
  3. Մենք ստեղծում ենք կարգավորիչներ, այսինքն. Մենք կապում ենք օգտվողի որոշ գործողություններ նախորդ քայլում ստեղծված մեթոդների հետ: Ըստ էության, կարգավորիչը ձգան է, իրադարձություն, որը կանչում է բոտի որոշ գործառույթ: Մեր օրինակում նման ձգան հրաման է ուղարկում /hi, և իրականացվում է թիմի կողմից hi_hendler <- CommandHandler('hi', say_hello). Առաջին ֆունկցիայի փաստարկը CommandHandler() թույլ է տալիս նշել հրաման, մեր դեպքում hi, ինչին բոտը կարձագանքի։ Երկրորդ փաստարկը թույլ է տալիս նշել բոտի մեթոդը, մենք կանվանենք մեթոդը say_hello, որը կկատարվի, եթե օգտագործողը կանչի առաջին արգումենտում նշված հրամանը.
  4. Հաջորդը, մենք ավելացնում ենք ստեղծված մշակիչը մեր դասի օրինակի դիսպետչերին Updater. Դուք կարող եք կարգավորիչներ ավելացնել մի քանի ձևով, վերը նշված օրինակում ես օգտագործել եմ ամենապարզը` օգտագործելով նշանը +Այսինքն, updater <- updater + hi_hendler. Նույնը կարելի է անել՝ օգտագործելով մեթոդը add_handler(), որը պատկանում է դասին Dispatcher, այս մեթոդը կարող եք գտնել հետևյալ կերպ. updater$dispatcher$add_handler();
  5. Գործարկեք բոտը՝ օգտագործելով հրամանը start_polling().

Տեքստային հաղորդագրությունների պրոցեսոր և զտիչներ

Մենք հասկացանք, թե ինչպես կարելի է հրամաններ ուղարկել բոտին, բայց երբեմն մեզ անհրաժեշտ է, որ բոտն արձագանքի ոչ միայն հրամաններին, այլև սովորական տեքստային հաղորդագրություններին: Դա անելու համար դուք պետք է օգտագործեք հաղորդագրությունների մշակիչներ − Message Handler.

սովորական Message Handler կպատասխանի բացարձակապես բոլոր մուտքային հաղորդագրություններին: Հետևաբար, հաղորդագրությունների մշակիչները հաճախ օգտագործվում են զտիչների հետ միասին: Սովորեցնենք բոտին բարևել ոչ միայն հրամանով /hi, բայց նաև ամեն անգամ, երբ բոտին ուղարկված հաղորդագրության մեջ հայտնվում է հետևյալ բառերից մեկը՝ բարև, բարև, ողջույն, hai, bonjour:

Առայժմ նոր մեթոդներ չենք գրի, քանի որ... Մենք արդեն ունենք մեթոդ, որով բոտը ողջունում է մեզ։ Մեզ անհրաժեշտ է միայն ստեղծել անհրաժեշտ զտիչ և հաղորդագրությունների մշակիչ:

Կոդ 2. Ավելացնել տեքստային հաղորդագրությունների մշակիչ և զտիչ

library(telegram.bot)

# создаём экземпляр класса Updater
updater <- Updater('ТОКЕН ВАШЕГО БОТА')

# Пишем метод для приветсвия
## команда приветвия
say_hello <- function(bot, update) {

  # Имя пользователя с которым надо поздароваться
  user_name <- update$message$from$first_name

  # Отправляем приветсвенное сообщение
  bot$sendMessage(update$message$chat_id, 
                  text = paste0("Моё почтение, ", user_name, "!"),
                  parse_mode = "Markdown",
                  reply_to_message_id = update$message$message_id)

}

# создаём фильтры
MessageFilters$hi <- BaseFilter(function(message) {

  # проверяем, встречается ли в тексте сообщения слова: привет, здравствуй, салют, хай, бонжур
  grepl(x           = message$text, 
        pattern     = 'привет|здравствуй|салют|хай|бонжур',
        ignore.case = TRUE)
  }
)

# создаём обработчик 
hi_hendler <- CommandHandler('hi', say_hello) # обработчик команды hi
hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi)

# добаляем обработчики в диспетчер
updater <- updater + 
             hi_hendler +
             hi_txt_hnd

# запускаем бота
updater$start_polling()

Գործարկեք վերը նշված կոդի օրինակը՝ «ՁԵՐ ԲՈՏ ՏՈԿԵՆ»-ը փոխարինելուց հետո բոտը ստեղծելիս ստացած իրական նշանով: BotFather (Ես խոսեցի բոտ ստեղծելու մասին առաջին հոդվածը).

Այժմ փորձենք բոտին ուղարկել մի քանի հաղորդագրություն, որոնք պարունակում են ավելի վաղ թվարկված ողջույնի խոսքերը.
Հեռագրային բոտ գրել R-ով (մաս 2). Բոտին ավելացնել հրամանների աջակցություն և հաղորդագրությունների զտիչներ

Այսպիսով, մենք առաջին հերթին բոտին սովորեցրել ենք ոչ թե պարզապես բարևել, այլ պատասխանել ողջույնին: Մենք դա արեցինք՝ օգտագործելով փաստարկը reply_to_message_id, որը հասանելի է մեթոդով sendMessage(), որի մեջ պետք է փոխանցեք հաղորդագրության ID-ն, որին ցանկանում եք պատասխանել: Դուք կարող եք ստանալ հաղորդագրության ID-ն այսպես. update$message$message_id.

Բայց հիմնական բանը, որ մենք արեցինք, ֆունկցիան օգտագործելով բոտին զտիչ ավելացրինք BaseFilter():

# создаём фильтры
MessageFilters$hi <- BaseFilter( 

  # анонимная фильтрующая функция
  function(message) {

    # проверяем, встречается ли в тексте сообщения слова приветствия
    grepl(x           = message$text, 
          pattern     = 'привет|здравствуй|салют|хай|бонжур',
          ignore.case = TRUE)
  }

)

Ինչպես նկատել եք, ֆիլտրերը պետք է ավելացվեն օբյեկտին Հաղորդագրությունների ֆիլտրեր, որն ի սկզբանե արդեն պարունակում է պատրաստի ֆիլտրերի փոքր հավաքածու։ Մեր օրինակում՝ օբյեկտին Հաղորդագրությունների ֆիլտրեր մենք ավելացրեցինք տարր hi, սա նոր զտիչ է։

Գործելու համար BaseFilter() դուք պետք է անցնեք ֆիլտրի գործառույթը: Ըստ էության, զտիչը պարզապես գործառույթ է, որը ստանում է հաղորդագրության օրինակ և վերադառնում TRUE կամ ԿԵՂԾ. Մեր օրինակում մենք գրել ենք մի պարզ ֆունկցիա, որն օգտագործելով հիմնական ֆունկցիան grepl() ստուգում է հաղորդագրության տեքստը և արդյոք այն համապատասխանում է կանոնավոր արտահայտությանը привет|здравствуй|салют|хай|бонжур վերադարձ TRUE.

Հաջորդը մենք ստեղծում ենք հաղորդագրությունների մշակիչ hi_txt_hnd <- MessageHandler(say_hello, filters = MessageFilters$hi). Առաջին ֆունկցիայի փաստարկը MessageHandler() այն մեթոդն է, որը կկանչի մշակողին, իսկ երկրորդ արգումենտը զտիչն է, որով այն կկանչվի: Մեր դեպքում սա մեր ստեղծած ֆիլտրն է MessageFilters$hi.

Դե, վերջում դիսպետչերին ավելացնում ենք ստեղծված կարգավորիչը hi_txt_hnd.

updater <- updater + 
             hi_hendler +
             hi_txt_hnd

Ինչպես գրել եմ վերեւում, փաթեթում telegram.bot և օբյեկտ Հաղորդագրությունների ֆիլտրեր Արդեն կա ներկառուցված ֆիլտրերի մի շարք, որոնք կարող եք օգտագործել.

  • բոլորը — Բոլոր հաղորդագրությունները
  • տեքստ — Տեքստային հաղորդագրություններ
  • հրաման — Հրամաններ, այսինքն. հաղորդագրություններ, որոնք սկսվում են /
  • պատասխանել — Հաղորդագրություններ, որոնք պատասխան են մեկ այլ հաղորդագրության
  • աուդիո — Աուդիո ֆայլ պարունակող հաղորդագրություններ
  • փաստաթուղթ - ուղարկված փաստաթղթով հաղորդագրություններ
  • լուսանկար - Ուղարկված պատկերներով հաղորդագրություններ
  • կպչուկ — Ուղարկված կպչուն հաղորդագրություններ
  • տեսանյութ — Հաղորդագրություններ տեսանյութով
  • ձայնային - Ձայնային հաղորդագրություններ
  • կոնտակտ — օգտատիրոջ հեռագրային բովանդակություն պարունակող հաղորդագրություններ
  • գտնվելու վայրը — հաղորդագրություններ աշխարհագրական դիրքով
  • վայր — Փոխանցված հաղորդագրություններ
  • խաղ — Խաղեր

Եթե ​​ցանկանում եք համատեղել որոշ զտիչներ մեկ կարգավորիչում, պարզապես օգտագործեք նշանը | - որպես տրամաբանական OR, և ստորագրիր & ինչպես տրամաբանական է И. Օրինակ, եթե ցանկանում եք, որ բոտը զանգի նույն մեթոդը, երբ ստանում է տեսանյութ, պատկեր կամ փաստաթուղթ, օգտագործեք հետևյալ օրինակը՝ հաղորդագրությունների մշակիչ ստեղծելու համար.

handler <- MessageHandler(callback, 
  MessageFilters$video | MessageFilters$photo | MessageFilters$document
)

Պարամետրերով հրամանների ավելացում

Մենք արդեն գիտենք, թե ինչ են հրամանները, ինչպես ստեղծել դրանք և ինչպես ստիպել բոտին կատարել ցանկալի հրամանը։ Բայց որոշ դեպքերում, բացի հրամանի անունից, մենք պետք է որոշ տվյալներ փոխանցենք այն կատարելու համար:

Ստորև բերված է բոտի օրինակ, որը, հաշվի առնելով տվյալ ամսաթիվը և երկիրը, ձեզ վերադարձնում է օրվա տեսակը արտադրության օրացույցից:

Ստորև բերված բոտն օգտագործում է արտադրական օրացույցի API isdayoff.ru.

Կոդ 3. Բոտ, որը հաղորդում է ըստ ամսաթվի և երկրի

library(telegram.bot)

# создаём экземпляр класса Updater
updater <- Updater('1165649194:AAFkDqIzQ6Wq5GV0YU7PmEZcv1gmWIFIB_8')

# Пишем метод для приветсвия
## команда приветвия
check_date <- function(bot, update, args) {

  # входящие данные
  day     <- args[1]  # дата
  country <- args[2]  # страна

  # проверка введённых параметров
  if ( !grepl('\d{4}-\d{2}-\d{2}', day) ) {

    # Send Custom Keyboard
    bot$sendMessage(update$message$chat_id, 
                    text = paste0(day, " - некорреткная дата, введите дату в формате ГГГГ-ММ-ДД"),
                    parse_mode = "Markdown")

  } else {
    day <- as.Date(day)
    # переводим в формат POSIXtl
    y <- format(day, "%Y")
    m <- format(day, "%m")
    d <- format(day, "%d")

  }

  # страна для проверки
  ## проверяем задана ли страна
  ## если не задана устанавливаем ru
  if ( ! country %in% c('ru', 'ua', 'by', 'kz', 'us') ) {

    # Send Custom Keyboard
    bot$sendMessage(update$message$chat_id, 
                    text = paste0(country, " - некорретктный код страны, возможнные значения: ru, by, kz, ua, us. Запрошены данные по России."),
                    parse_mode = "Markdown")

    country <- 'ru'

  }

  # запрос данных из API
  # компоновка HTTP запроса
  url <- paste0("https://isdayoff.ru/api/getdata?",
                "year=",  y, "&",
                "month=", m, "&",
                "day=",   d, "&",
                "cc=",    country, "&",
                "pre=1&",
                "covid=1")

  # получаем ответ
  res <- readLines(url)

  # интрепретация ответа
  out <- switch(res, 
                "0"   = "Рабочий день",
                "1"   = "Нерабочий день",
                "2"   = "Сокращённый рабочий день",
                "4"   = "covid-19",
                "100" = "Ошибка в дате",
                "101" = "Данные не найдены",
                "199" = "Ошибка сервиса")

  # отправляем сообщение
  bot$sendMessage(update$message$chat_id, 
                  text = paste0(day, " - ", out),
                  parse_mode = "Markdown")

}

# создаём обработчик 
date_hendler <- CommandHandler('check_date', check_date, pass_args = TRUE)

# добаляем обработчик в диспетчер
updater <- updater + date_hendler

# запускаем бота
updater$start_polling()

Գործարկեք վերը նշված կոդի օրինակը՝ «ՁԵՐ ԲՈՏ ՏՈԿԵՆ»-ը փոխարինելուց հետո բոտը ստեղծելիս ստացած իրական նշանով: BotFather (Ես խոսեցի բոտ ստեղծելու մասին առաջին հոդվածը).

Մենք ստեղծեցինք բոտ, որն իր զինանոցում ունի միայն մեկ մեթոդ check_date, այս մեթոդը կոչվում է համանուն հրամանով։

Բայց, բացի հրամանի անունից, այս մեթոդը պահանջում է մուտքագրել երկու պարամետր՝ երկրի կոդը և ամսաթիվը: Հաջորդը, բոտը ստուգում է, թե արդյոք նշված երկրում տվյալ օրը հանգստյան օր է, կրճատված օր կամ աշխատանքային օր՝ ըստ արտադրության պաշտոնական օրացույցի:

Որպեսզի մեր ստեղծած մեթոդը հրամանի հետ միասին ընդունի լրացուցիչ պարամետրեր, օգտագործեք արգումենտը pass_args = TRUE ֆունկցիայի մեջ CommandHandler(), իսկ մեթոդ ստեղծելիս՝ բացի պահանջվող փաստարկներից bot, թարմացնել ստեղծել կամընտիր մեկը - աղեղներ. Այս կերպ ստեղծված մեթոդը կընդունի այն պարամետրերը, որոնք դուք փոխանցում եք բոտին հրամանի անունից հետո: Պարամետրերը պետք է բաժանվեն բացատով, դրանք կուղարկվեն մեթոդին որպես տեքստային վեկտոր:

Եկեք գործարկենք և փորձարկենք մեր բոտը:

Հեռագրային բոտ գրել R-ով (մաս 2). Բոտին ավելացնել հրամանների աջակցություն և հաղորդագրությունների զտիչներ

Գործարկեք բոտը հետին պլանում

Վերջին քայլը, որը մենք պետք է կատարենք, բոտը հետին պլանում գործարկելն է:

Դա անելու համար հետևեք ստորև նկարագրված ալգորիթմին.

  1. Պահպանեք բոտի կոդը R ընդլայնմամբ ֆայլում: RStudio-ում աշխատելիս դա արվում է մենյուի միջոցով: Ֆայլ, թիմ Պահպանել որպես ....
  2. Ավելացնել ուղին դեպի bin թղթապանակ, որն իր հերթին գտնվում է այն թղթապանակում, որտեղ տեղադրել եք R լեզուն, Path փոփոխականին, հրահանգներին: այստեղ.
  3. Ստեղծեք սովորական տեքստային ֆայլ, որտեղ գրեք 1 տող. R CMD BATCH C:UsersAlseyDocumentsmy_bot.R. Փոխարեն C:UsersAlseyDocumentsmy_bot.R գրեք ձեր բոտի սցենարի ուղին: Միևնույն ժամանակ, կարևոր է, որ ճանապարհին չկան կիրիլյան գրանշաններ կամ բացատներ, քանի որ սա կարող է խնդիրներ առաջացնել բոտը գործարկելիս: Պահպանեք այն և փոխարինեք դրա ընդլայնումը txt մասին կերուխում.
  4. Բացեք Windows Task Scheduler-ը, դա անելու շատ եղանակներ կան, օրինակ՝ բացեք ցանկացած թղթապանակ և մուտքագրեք հասցեն %windir%system32taskschd.msc /s. Գործարկման այլ մեթոդներ կարելի է գտնել այստեղ.
  5. Ժամանակացույցի վերևի աջ ընտրացանկում սեղմեք «Ստեղծել առաջադրանք...»:
  6. «Ընդհանուր» ներդիրում տվեք ձեր առաջադրանքին հատուկ անուն և փոխարկիչը միացրեք «Գործարկել բոլոր օգտվողների համար» վիճակին:
  7. Գնացեք «Գործողություններ» ներդիր, սեղմեք «Ստեղծել»: «Ծրագիր կամ սցենար» դաշտում սեղմեք «Թերթել», գտեք երկրորդ քայլում ստեղծվածը կերուխում ֆայլ և սեղմեք OK:
  8. Սեղմեք OK և, անհրաժեշտության դեպքում, մուտքագրեք ձեր օպերացիոն համակարգի հաշվի գաղտնաբառը:
  9. Գտեք ստեղծված առաջադրանքը ժամանակացույցում, ընտրեք այն և կտտացրեք «Գործարկել» կոճակը ներքևի աջ անկյունում:

Մեր բոտն աշխատում է հետին պլանում և կաշխատի այնքան ժամանակ, մինչև չդադարեցնեք առաջադրանքը կամ անջատեք ձեր համակարգիչը կամ սերվերը, որի վրա այն գործարկվել է:

Ամփոփում

Այս հոդվածում մենք պարզեցինք, թե ինչպես կարելի է գրել լիարժեք բոտ, որը կարող է ոչ միայն հաղորդագրություններ ուղարկել, այլև պատասխանել մուտքային հաղորդագրություններին և հրամաններին: Ստացված գիտելիքներն արդեն բավական են ձեր խնդիրների մեծ մասը լուծելու համար։

Հաջորդ հոդվածում կխոսվի այն մասին, թե ինչպես կարելի է ստեղնաշար ավելացնել բոտին՝ ավելի հարմար աշխատանքի համար։

Բաժանորդագրվեք իմ հեռագիր и youtube ալիքներ.

Source: www.habr.com

Добавить комментарий