Komanso m'nkhaniyi tiphunzira momwe tingagwiritsire ntchito deta pansi pa bot bot, mu chitsanzo chathu chidzakhala SQLite, koma mungagwiritse ntchito DBMS ina iliyonse. Ndinalemba mwatsatanetsatane za kuyanjana ndi ma database mu chilankhulo cha R nkhaniyi.
Zolemba zonse zakuti "Kulemba telegalamu bot mu R"
Mu config timalemba chizindikiro cha bot ndi njira yopita ku database, i.e. ku fayilo ya bot.db; tidzapanga fayilo yokha mu sitepe yotsatira.
Kwa bots zovuta kwambiri, mutha kupanga ma configs ovuta kwambiri, kupatulapo, sikoyenera kulemba ini config, mungagwiritse ntchito mtundu wina uliwonse kuphatikizapo JSON.
Pangani kusintha kwa chilengedwe
Pa PC iliyonse, chikwatu chomwe chili ndi projekiti ya bot chikhoza kupezeka m'madongosolo osiyanasiyana komanso pama drive osiyanasiyana, kotero mu code njira yopita ku chikwatu cha polojekiti idzakhazikitsidwa kudzera pakusintha kwachilengedwe. TG_BOT_PATH.
chat_data - zomwe bot idapempha kwa wogwiritsa ntchito
chat_state - momwe macheza onse alipo
Mutha kupanga matebulo awa pogwiritsa ntchito funso la SQL:
CREATE TABLE chat_data (
chat_id BIGINT PRIMARY KEY
UNIQUE,
name TEXT,
age INTEGER
);
CREATE TABLE chat_state (
chat_id BIGINT PRIMARY KEY
UNIQUE,
state TEXT
);
Ngati mudatsitsa pulojekiti ya bot kuchokera GitHub, kenako kuti mupange database mutha kugwiritsa ntchito nambala iyi mu R.
# Скрипт создания базы данных
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'))
Kulemba ntchito zogwirira ntchito ndi database
Tili ndi kale fayilo yokonzekera ndipo nkhokwe yapangidwa. Tsopano muyenera kulemba ntchito kuti muwerenge ndi kulemba deta ku database iyi.
# ###########################################################
# 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]])
}
# ###########################################################
# 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')
}
}
Kwa ife, ichi ndi chimodzi mwazinthu zofunika kwambiri pomanga bot. Ndi chithandizo cha zosefera mauthenga kuti bot idzamvetsetsa zomwe ikuyembekezera kuchokera kwa inu ndi momwe iyenera kusinthidwa.
Mu polojekiti pa GitHub zosefera zimalembetsedwa mufayilo message_filters.R.
Khodi yosefera uthenga:
# ###########################################################
# message state filters
# фильтр сообщений в состоянии ожидания имени
MessageFilters$wait_name <- BaseFilter(function(message) {
get_state( message$chat_id ) == "wait_name"
}
)
# фильтр сообщений в состоянии ожидания возраста
MessageFilters$wait_age <- BaseFilter(function(message) {
get_state( message$chat_id ) == "wait_age"
}
)
Muzosefera timagwiritsa ntchito zomwe zidalembedwa kale get_state(), kuti mufunse momwe macheza akuyendera. Izi zimafuna mkangano umodzi wokha, id yochezera.
Chosefera chotsatira wait_name amakonza mauthenga pamene macheza ali mu chikhalidwe wait_name, ndipo molingana ndi fyuluta dikirani_zaka amakonza mauthenga pamene macheza ali mu chikhalidwe wait_age.
Ogwira ntchito
Fayilo yokhala ndi othandizira imatchedwa ogwira ntchito.R, ndipo ili ndi code iyi:
# ###########################################################
# handlers
# command handlers
start_h <- CommandHandler('start', start)
state_h <- CommandHandler('state', state)
reset_h <- CommandHandler('reset', reset)
# message handlers
## !MessageFilters$command - означает что команды данные обработчики не обрабатывают,
## только текстовые сообщения
wait_age_h <- MessageHandler(enter_age, MessageFilters$wait_age & !MessageFilters$command)
wait_name_h <- MessageHandler(enter_name, MessageFilters$wait_name & !MessageFilters$command)