Iwe unogona kugadzira kana kugadzirisa iyi faira uchishandisa rairo file.edit(path.expand(file.path("~", ".Renviron"))). Iite uye wedzera mutsara mumwe kune faira:
chat_data - data iyo bot yakakumbira kubva kumushandisi
chat_state - mamiriro aripo ezvese chats
Unogona kugadzira matafura aya uchishandisa inotevera SQL mubvunzo:
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
);
Kana iwe wakarodha bot purojekiti kubva GitHub, wobva wagadzira dhatabhesi iwe unogona kushandisa inotevera kodhi muR.
# Скрипт создания базы данных
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'))
Kunyora mabasa ekushanda nedatabase
Isu tatova nefaira rekugadzirisa rakagadzirira uye dhatabhesi rakagadzirwa. Iye zvino iwe unofanirwa kunyora mabasa ekuverenga nekunyora data kune iyi database.
Kana iwe wakarodha purojekiti kubva GitHub, ipapo unogona kuwana mabasa mufaira db_bot_function.R.
Basa rekodhi rekushanda nedatabase
# ###########################################################
# 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]])
}
Isu takagadzira 4 mabasa akareruka:
get_state() - tora ikozvino chat mamiriro kubva kudhatabhesi
set_state() - nyora yazvino chat state kune database
get_chat_data() - gamuchira data inotumirwa nemushandisi
set_chat_data() - rekodha data yakagamuchirwa kubva kumushandisi
Ese mabasa ari nyore, ivo vanoverenga data kubva kudhatabhesi vachishandisa murairo dbGetQuery(), kana kuti kuzvipira UPSERT kushanda (kushandura data iripo kana kunyora data idzva kune dhatabhesi), uchishandisa basa dbExecute().
Iyo syntax yeUPSERT mashandiro ndeaya anotevera:
INSERT INTO chat_data (chat_id, ${field})
VALUES(${chat_id}, '${value}')
ON CONFLICT(chat_id)
DO UPDATE SET ${field}='${value}';
Avo. mumunda wematafura edu chat_id ine chinomanikidzira chakasiyana uye ndicho kiyi yekutanga yematafura. Pakutanga, tinoedza kuwedzera ruzivo patafura, uye tinowana chikanganiso kana data yekutaura kwazvino yatovepo, mune iyo nyaya tinongogadzirisa ruzivo rweiyi chat.
Tevere, isu tichashandisa mabasa aya munzira dzebhoti uye mafirita.
Bot nzira
Nhanho inotevera mukuvaka bot yedu kugadzira nzira. Kana iwe wakarodha purojekiti kubva GitHub, ipapo nzira dzese dziri mufaira bot_methods.R.
Bot nzira kodhi
# ###########################################################
# 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')
}
}
Isu takagadzira 5 nzira:
kutanga - Tanga nhaurirano
state - Tora mamiriro ekutaura aripo
reset - Gadzirisa iyo yazvino chat state
enter_name - Iyo bot inobvunza zita rako
enter_age - Iyo bot inobvunza zera rako
Method start inobvunza zita rako, uye inoshandura chat state kuita wait_name, i.e. kumira pakuisa zita rako.
Panguva ino, bot inotarisira kuti iwe upinde muzera rako. Iwe unotumira zera rako, bot inotarisa meseji, kana iwe wakatumira mamwe mameseji panzvimbo yenhamba, inozoti: Ты ввёл некорректные данные, введи число, uye ichakumirira iwe kuti uise zvakare data rako. Kana iwe wakatumira nhamba, bhoti ichashuma kuti yakagamuchira makore ako, nyora iyo yakagamuchirwa data kune database, taura data yose yakagamuchirwa kubva kwauri uye udzorere nyika yekutaura panzvimbo yayo yepakutanga, i.e. V start.
Nokudaidza nzira state iwe unogona kukumbira ikozvino chat mamiriro chero nguva, uye uchishandisa iyo reset dzorera chat kuchimiro chayo chepakutanga.