هن آرٽيڪل ۾، اسان سکنداسين ته هڪ بوٽ ڪيئن لکجي جيڪو مسلسل گفتگو برقرار رکندو. اهي. بوٽ توهان کان سوال پڇندو ۽ توهان کي ڪجهه معلومات داخل ڪرڻ جو انتظار ڪندو. توهان جي داخل ڪيل ڊيٽا تي منحصر ڪري، بوٽ ڪجهه ڪارناما انجام ڏيندو.
انهي آرٽيڪل ۾ پڻ اسان سکنداسين ته ڪيئن استعمال ڪجي ڊيٽابيس جي هود هيٺ، اسان جي مثال ۾ اهو SQLite هوندو، پر توهان ڪنهن ٻئي DBMS استعمال ڪري سگهو ٿا. مون آر ٻولي ۾ ڊيٽابيس سان رابطي جي باري ۾ وڌيڪ تفصيل سان لکيو اهو مضمون.
بوٽ لاءِ توھان کان ڊيٽا جي درخواست ڪرڻ ۽ توھان جي ڪا به معلومات داخل ڪرڻ لاءِ انتظار ڪرڻ لاءِ، توھان کي گفتگو جي موجوده حالت کي رڪارڊ ڪرڻ جي ضرورت پوندي. اهو ڪرڻ جو بهترين طريقو اهو آهي ته ڪنهن قسم جي ايمبيڊڊ ڊيٽابيس کي استعمال ڪيو وڃي، جهڙوڪ SQLite.
اهي. منطق هن ريت هوندي. اسان bot طريقي کي سڏيندا آهيون، ۽ بوٽ ترتيب سان اسان کان ڪجهه معلومات جي درخواست ڪري ٿو، ۽ هر قدم تي هن معلومات داخل ٿيڻ جو انتظار ڪري ٿو ۽ ان کي چيڪ ڪري سگهي ٿو.
اسان سڀ کان آسان ممڪن بوٽ لکنداسين، پھريائين اھو توھان جو نالو پڇندو، پوءِ توھان جي عمر، ۽ وصول ڪيل ڊيٽا کي ڊيٽابيس ۾ محفوظ ڪندو. جڏهن عمر لاء پڇي، اهو چيڪ ڪندو ته داخل ٿيل ڊيٽا هڪ نمبر آهي ۽ متن نه آهي.
اهڙي سادي گفتگو ۾ فقط ٽي حالتون هونديون:
start بوٽ جي عام حالت آهي، جنهن ۾ اهو توهان کان ڪنهن به معلومات جي اميد نٿو رکي
wait_name - رياست جنهن ۾ بوٽ هڪ نالو داخل ٿيڻ جو انتظار ڪري ٿو
wait_age اها حالت آهي جنهن ۾ بوٽ توهان جي عمر داخل ٿيڻ جو انتظار ڪري ٿو، مڪمل سالن جو تعداد.
بوٽ جي تعمير جو عمل
آرٽيڪل جي دوران، اسان قدم سان هڪ بوٽ ٺاهي سگهنداسين؛ سڄي عمل کي هيٺ ڏنل طريقي سان بيان ڪري سگهجي ٿو:
اسان هڪ بوٽ ترتيب ٺاهيندا آهيون جنهن ۾ اسان ڪجهه سيٽنگون ذخيرو ڪنداسين. اسان جي صورت ۾، بوٽ ٽوڪن، ۽ ڊيٽابيس فائل ڏانهن رستو.
اسان هڪ ماحولي تبديلي ٺاهيندا آهيون جنهن ۾ بوٽ سان منصوبي جو رستو محفوظ ڪيو ويندو.
اسان ڊيٽابيس پاڻ ٺاهيندا آهيون، ۽ ڪيترن ئي ڪمن کي ته جيئن بوٽ ان سان رابطو ڪري سگهي.
اسان بوٽ جا طريقا لکون ٿا، يعني. افعال جيڪي ان کي انجام ڏيندو.
پيغام جا فلٽر شامل ڪرڻ. جنهن جي مدد سان بوٽ ضروري طريقن تائين پهچندو، چيٽ جي موجوده حالت تي منحصر آهي.
اسان هينڊلر شامل ڪندا آهيون جيڪي ضروري بوٽ طريقن سان حڪم ۽ پيغام کي ڳنڍيندا.
اچو ته بوٽ لانچ ڪريون.
بوٽ پروجيڪٽ جي جوڙجڪ
سهولت لاءِ، اسان اسان جي بوٽن جو ڪوڊ، ۽ ٻين لاڳاپيل فائلن کي، هيٺين ڍانچي ۾ ورهائينداسين.
بوٽ آر - اسان جي بوٽ جو بنيادي ڪوڊ
db_bot_function.R - ڊيٽابيس سان ڪم ڪرڻ لاءِ ڪمن سان گڏ ڪوڊ جو هڪ بلاڪ
وڌيڪ پيچيده بوٽن لاء، توهان وڌيڪ پيچيده ترتيب ٺاهي سگهو ٿا، ان کان علاوه، ini config لکڻ ضروري ناهي، توهان JSON سميت ڪنهن ٻئي فارميٽ استعمال ڪري سگهو ٿا.
ماحوليات جي متغير ٺاهي
هر پي سي تي، بوٽ پروجيڪٽ سان گڏ فولڊر مختلف ڊائريڪٽرن ۾ ۽ مختلف ڊرائيو تي واقع ٿي سگهي ٿو، تنهنڪري ڪوڊ ۾ پروجيڪٽ فولڊر ڏانهن رستو مقرر ڪيو ويندو ماحول جي متغير ذريعي. TG_BOT_PATH.
ماحوليات جي متغير ٺاهڻ جا ڪيترائي طريقا آهن، سڀ کان آسان اهو آهي ته ان کي فائل ۾ لکجي .رنويرون.
توھان ھي ڪمانڊ استعمال ڪندي ھي فائل ٺاھي يا ايڊٽ ڪري سگھو ٿا file.edit(path.expand(file.path("~", ".Renviron"))). ان کي عمل ڪريو ۽ فائل ۾ ھڪڙي لائن شامل ڪريو:
TG_BOT_PATH=C:/ПУТЬ/К/ВАШЕМУ/ПРОЕКТУ
اڳيون فائل محفوظ ڪريو .رنويرون ۽ RStudio ٻيهر شروع ڪريو.
ڊيٽابيس ٺاهڻ
ايندڙ قدم هڪ ڊيٽابيس ٺاهڻ آهي. اسان کي 2 ٽيبل جي ضرورت پوندي:
# Скрипт создания базы данных
library(DBI) # интерфейс для работы с СУБД
library(configr) # чтение конфига
library(readr) # чтение текстовых SQL файлов
library(RSQLite) # драйвер для подключения к SQLite
# директория проекта
setwd(Sys.getenv('TG_BOT_PATH'))
# чтение конфига
cfg <- read.config('config.cfg')
# подключение к SQLite
con <- dbConnect(SQLite(), cfg$db_settings$db_path)
# Создание таблиц в базе
dbExecute(con, statement = read_file('create_db_data.sql'))
dbExecute(con, statement = read_file('create_db_state.sql'))
# ###########################################################
# Function for work bot with database
# получить текущее состояние чата
get_state <- function(chat_id) {
con <- dbConnect(SQLite(), cfg$db_settings$db_path)
chat_state <- dbGetQuery(con, str_interp("SELECT state FROM chat_state WHERE chat_id == ${chat_id}"))$state
return(unlist(chat_state))
dbDisconnect(con)
}
# установить текущее состояние чата
set_state <- function(chat_id, state) {
con <- dbConnect(SQLite(), cfg$db_settings$db_path)
# upsert состояние чата
dbExecute(con,
str_interp("
INSERT INTO chat_state (chat_id, state)
VALUES(${chat_id}, '${state}')
ON CONFLICT(chat_id)
DO UPDATE SET state='${state}';
")
)
dbDisconnect(con)
}
# запись полученных данных в базу
set_chat_data <- function(chat_id, field, value) {
con <- dbConnect(SQLite(), cfg$db_settings$db_path)
# upsert состояние чата
dbExecute(con,
str_interp("
INSERT INTO chat_data (chat_id, ${field})
VALUES(${chat_id}, '${value}')
ON CONFLICT(chat_id)
DO UPDATE SET ${field}='${value}';
")
)
dbDisconnect(con)
}
# read chat data
get_chat_data <- function(chat_id, field) {
con <- dbConnect(SQLite(), cfg$db_settings$db_path)
# upsert состояние чата
data <- dbGetQuery(con,
str_interp("
SELECT ${field}
FROM chat_data
WHERE chat_id = ${chat_id};
")
)
dbDisconnect(con)
return(data[[field]])
}
اسان 4 سادي فنڪشن ٺاهيا:
get_state() - ڊيٽابيس مان موجوده چيٽ اسٽيٽ حاصل ڪريو
set_state() - ڊيٽابيس ۾ موجوده چيٽ اسٽيٽ کي لکو
get_chat_data() - صارف پاران موڪليل ڊيٽا وصول ڪريو
set_chat_data() - صارف کان حاصل ڪيل ڊيٽا کي رڪارڊ ڪريو
سڀئي ڪم بلڪل سادو آھن، اھي يا ته ڊيٽابيس مان ڊيٽا پڙھندا آھن حڪم استعمال ڪندي dbGetQuery()، يا انجام ڏيو UPSERT آپريشن (موجوده ڊيٽا کي تبديل ڪرڻ يا ڊيٽابيس ۾ نئين ڊيٽا لکڻ)، فنڪشن استعمال ڪندي dbExecute().
UPSERT آپريشن لاءِ نحو هن ريت آهي:
INSERT INTO chat_data (chat_id, ${field})
VALUES(${chat_id}, '${value}')
ON CONFLICT(chat_id)
DO UPDATE SET ${field}='${value}';
اهي. اسان جي ٽيبل جي ميدان ۾ chat_id ھڪڙي انفراديت جي پابندي آھي ۽ جدولن جي بنيادي ڪنجي آھي. شروعات ۾، اسان ٽيبل تي معلومات شامل ڪرڻ جي ڪوشش ڪندا آهيون، ۽ اسان کي هڪ غلطي ملي ٿي جيڪڏهن موجوده چيٽ لاء ڊيٽا اڳ ۾ ئي موجود آهي، انهي صورت ۾ اسان صرف هن چيٽ جي معلومات کي اپڊيٽ ڪندا آهيون.
اڳيون، اسان انهن ڪمن کي بوٽ جي طريقن ۽ فلٽرن ۾ استعمال ڪنداسين.
بوٽ جا طريقا
اسان جي بوٽن جي تعمير ۾ ايندڙ قدم طريقا پيدا ڪرڻ آهي. جيڪڏهن توهان پروجيڪٽ تان ڊائون لوڊ ڪيو آهي GitHub، پوءِ سڀئي طريقا فائل ۾ آھن bot_methods.R.
بوٽ جو طريقو ڪوڊ
# ###########################################################
# bot methods
# start dialog
start <- function(bot, update) {
#
# Send query
bot$sendMessage(update$message$chat_id,
text = "Введи своё имя")
# переключаем состояние диалога в режим ожидания ввода имени
set_state(chat_id = update$message$chat_id, state = 'wait_name')
}
# get current chat state
state <- function(bot, update) {
chat_state <- get_state(update$message$chat_id)
# Send state
bot$sendMessage(update$message$chat_id,
text = unlist(chat_state))
}
# reset dialog state
reset <- function(bot, update) {
set_state(chat_id = update$message$chat_id, state = 'start')
}
# enter username
enter_name <- function(bot, update) {
uname <- update$message$text
# Send message with name
bot$sendMessage(update$message$chat_id,
text = paste0(uname, ", приятно познакомится, я бот!"))
# Записываем имя в глобальную переменную
#username <<- uname
set_chat_data(update$message$chat_id, 'name', uname)
# Справшиваем возраст
bot$sendMessage(update$message$chat_id,
text = "Сколько тебе лет?")
# Меняем состояние на ожидание ввода имени
set_state(chat_id = update$message$chat_id, state = 'wait_age')
}
# enter user age
enter_age <- function(bot, update) {
uage <- as.numeric(update$message$text)
# проверяем было введено число или нет
if ( is.na(uage) ) {
# если введено не число то переспрашиваем возраст
bot$sendMessage(update$message$chat_id,
text = "Ты ввёл некорректные данные, введи число")
} else {
# если введено число сообщаем что возраст принят
bot$sendMessage(update$message$chat_id,
text = "ОК, возраст принят")
# записываем глобальную переменную с возрастом
#userage <<- uage
set_chat_data(update$message$chat_id, 'age', uage)
# сообщаем какие данные были собраны
username <- get_chat_data(update$message$chat_id, 'name')
userage <- get_chat_data(update$message$chat_id, 'age')
bot$sendMessage(update$message$chat_id,
text = paste0("Тебя зовут ", username, " и тебе ", userage, " лет. Будем знакомы"))
# возвращаем диалог в исходное состояние
set_state(chat_id = update$message$chat_id, state = 'start')
}
}
اسان 5 طريقا ٺاهيا:
شروعات - هڪ ڊائلاگ شروع ڪريو
رياست - موجوده چيٽ اسٽيٽ حاصل ڪريو
ري سيٽ ڪريو - موجوده چيٽ اسٽيٽ کي ري سيٽ ڪريو
enter_name - بوٽ توهان جو نالو پڇي ٿو
enter_age - بوٽ توهان جي عمر لاءِ پڇي ٿو
طريقو start توھان جو نالو پڇي ٿو، ۽ چيٽ اسٽيٽ کي تبديل ڪري ٿو انتظار_ نالو، i.e. توھان جو نالو داخل ڪرڻ لاء تيار ٿيڻ لاء.
اڳيون، توھان نالو موڪليو ۽ اھو طريقي سان عمل ڪيو ويندو enter_name، بوٽ توهان کي سلام ڪري ٿو، وصول ٿيل نالو ڊيٽابيس ۾ لکي ٿو، ۽ چيٽ کي رياست ڏانهن تبديل ڪري ٿو انتظار_عمر.
هن مرحلي تي، بوٽ توهان جي عمر ۾ داخل ٿيڻ جي اميد رکي ٿو. توهان پنهنجي عمر موڪليو، بوٽ پيغام چيڪ ڪري ٿو، جيڪڏهن توهان هڪ نمبر جي بدران ڪجهه متن موڪليو، اهو چوندو: Ты ввёл некорректные данные, введи число، ۽ توهان جي ڊيٽا کي ٻيهر داخل ڪرڻ جو انتظار ڪندو. جيڪڏهن توهان هڪ نمبر موڪليو، بوٽ رپورٽ ڪندو ته اهو توهان جي عمر کي قبول ڪيو آهي، وصول ڪيل ڊيٽا کي ڊيٽابيس ۾ لکندو، توهان کان حاصل ڪيل سڀني ڊيٽا کي رپورٽ ڪندي ۽ چيٽ اسٽيٽ کي ان جي اصل پوزيشن ڏانهن واپس آڻيندو، يعني. وي start.
طريقت کي سڏڻ سان state توهان ڪنهن به وقت موجوده چيٽ اسٽيٽس جي درخواست ڪري سگهو ٿا، ۽ استعمال ڪندي reset چيٽ کي ان جي اصل حالت ۾ واپس آڻيو.
پيغام جا فلٽر
اسان جي صورت ۾، هي بوٽ تعمير ڪرڻ ۾ سڀ کان اهم حصن مان هڪ آهي. اهو ميسيج فلٽرن جي مدد سان آهي ته بوٽ سمجهي سگهندو ته اها ڪهڙي معلومات توهان کان توقع رکي ٿي ۽ ان کي ڪيئن پروسيس ڪيو وڃي.
library(telegram.bot)
library(tidyverse)
library(RSQLite)
library(DBI)
library(configr)
# переходим в папку проекта
setwd(Sys.getenv('TG_BOT_PATH'))
# читаем конфиг
cfg <- read.config('config.cfg')
# создаём экземпляр бота
updater <- Updater(cfg$bot_settings$bot_token)
# Загрузка компонентов бота
source('db_bot_function.R') # функции для работы с БД
source('bot_methods.R') # методы бота
source('message_filters.R') # фильтры сообщений
source('handlers.R') # обработчики сообщений
# Добавляем обработчики в диспетчер
updater <- updater +
start_h +
wait_age_h +
wait_name_h +
state_h +
reset_h
# Запускаем бота
updater$start_polling()
نتيجي طور، اسان هي بوٽ حاصل ڪيو:
ڪنهن به وقت حڪم استعمال ڪندي /state اسان موجوده چيٽ اسٽيٽ بابت سوال ڪري سگھون ٿا، ۽ حڪم استعمال ڪندي /reset چيٽ کي ان جي اصل حالت ۾ واپس آڻيو ۽ ٻيهر گفتگو شروع ڪريو.
ٿڪل
هن آرٽيڪل ۾، اسان اهو معلوم ڪيو ته هڪ بوٽ اندر ڊيٽابيس کي ڪيئن استعمال ڪجي، ۽ چيٽ اسٽيٽ کي رڪارڊ ڪندي ترتيب وار منطقي گفتگو ڪيئن ٺاهيو.
هن معاملي ۾، اسان سڀ کان وڌيڪ ابتدائي مثال تي غور ڪيو، ته جيئن توهان کي اهڙي بوٽن ٺاهڻ جي خيال کي سمجهڻ آسان بڻائي سگهجي؛ عملي طور تي، توهان تمام گهڻو پيچيده گفتگو ٺاهي سگهو ٿا.
هن سلسلي ۾ ايندڙ مضمون ۾، اسان سکو ته ڪيئن بوٽ استعمال ڪندڙن جي حقن کي محدود ڪرڻ لاء ان جي مختلف طريقن کي استعمال ڪرڻ لاء.