ααααα·αααΎα’αααααΆαα’αΆααα½α
α αΎα
αα αααα»αα’αααααααα ααΎαααΉααααααΈααααααααα bot αααααΉααααααΆααΆαααααααΆααΆααααΆααα ααΆαααααα bot ααΉααα½αα’αααααΌααααα½α α αΎααααα αΆαα’ααααααα αΌαααααααΆααα½αα ααα½αα α’αΆαααααααΎαα·αααααααααα’ααααααα αΌα bot ααΉαα’αα»αααααααααααΆααα½αα ααα½αα
ααααααα
αααα»αα’ααααααααααΎαααΉααααααΈααααααααΎααΌαααααΆααα·αααααααα
ααααααααααΆαααα bot αααα»αα§ααΆα αααααααααΎαααΆααΉαααΆ SQLite ααα»ααααα’αααα’αΆα
ααααΎ DBMS ααααααααα αααα»αααΆαααααααααα’α·ααααααααααα’αααΈα’ααααααααααΆαα½αααΌαααααΆααα·αααααααα
αααα»αααΆααΆ R αα
αααα»α
α’αααααααΆααα’ααααΈαααααΈ "ααΆααααααααΆαααΌααααααΆα’αααα R"
ααΎααααααΎα bot α αΎαααααΎααΆααΎααααΈααααΎααΆααααα»αααΌαααα ααααααααΆαααΆααααααΆααααααααΆ αα·ααααααααΆααα bot ααααααααααααΆαααΆααααααααΆαα α»α αα ααΌα ααΆααααΆαααΆαααααααΆααα ααα»αα αα·αααα ααα»ααααΆαα½αααΌα
ααΆαα·ααΆ
ααααα·αααΎα’αααα
αΆααα’αΆααααααααΎααΆααα·ααΆααα·αααααα α’ααααααα ααααΆα
αΆααα’αΆααααααααΎαααααααα»α
ααα ααααΈααααΆα ααααΎαααΆαααΆααααααΌα αα ααΆαααααααααααααα ααααααα ααΆααααααααααΌα αααααΎαα’αααααα·ααααΆα ααΆααααααΎαααΌαααααΆααα·αααααα αα»αααΆααααααααΎααααΈααααΎααΆαααΆαα½αααΌαααααΆααα·αααααα αα·ααΈααΆαααααααΌα αααααααΆα α’ααααααααααΆα ααΌαααΎαααααΎαααΆαααΌα ααα ααααΈααααα·ααααΆα
ααα ααααΈααααΆα
ααΎααααΈα±αα bot ααααΎαα»ααα·ααααααααΈα’ααα α αΎααααα αΆαα’ααααααα αΌαααααααΆαααΆαα½α α’αααααΉαααααΌααααααααΆααααΆαααΆααα αα α»ααααααααααΆαααααααΆα αααααααΆαααααα’αααα»αααΎααααΈααααΎααΆααΊααααΌαααααΎααααααααααΌαααααΆααα·αααααααααααΆαααααααααΌα ααΆ SQLite α
ααΆαααααα αααααα·ααααΆααΉαααΆαααΌα ααΆααααααα ααΎαα α αα·ααΈααΆααααα bot α αΎα bot ααααΎαα»αααααααΆααα½αα ααα½αααΈααΎαααΆαααααααααΆαα α αΎααα ααα αΆαααΈαα½αα ααΆαααα αΆαααααααΆαααααααα αΌα α αΎαα’αΆα αα·αα·αααααΎαααΆααΆαα
ααΎαααΉαααααα bot ααααΆαααααααα»ααααα’αΆα ααααΎαα ααΆα ααααΌαααΆααΉααα½ααααααααααααα’ααα αααααΆααααα’αΆαα»ααααα’ααα α αΎαααΉααααααΆαα»ααα·αααααααααααα½αααΆααα αααα»αααΌαααααΆααα·ααααααα αα ααααα½αααα’αΆαα» ααΆααΉααα·αα·αααααΎαααΆαα·αααααααααααΆααααα αΌαααΊααΆααα αα·ααααα’αααααααα
ααΆαααααααΆααααΆαααααααααα ααΉαααΆαααααααααΈααα»αααααα
- ααΆαα αΆααααααΎαααΊααΆααααΆαααΆαααααααΆαααα bot ααααααα»ααααααΆαα·αααααΉαααΆααΉαααΆαααααααΆαααΆαα½αααΈα’αααααα
- wait_name - ααααΆαααΆαααα bot αααα αΆαααααααααααααΌααααα αΌα
- wait_age ααΊααΆααααΆαααΆαααα bot αααα αΆαα’αΆαα»ααααα’αααααααΌαααΆααααα αΌα α ααα½αααααΆααααα
ααααΎαααΆαααΆααααααΌα
αααα»αα’αα‘α»ααααα’ααααα ααΎαααΉααααααΎα bot αα½αααα αΆααααααα½αα ααααΎαααΆαααΆααααΌαα’αΆα
ααααΌαααΆααα·αααααΆααΆααααααααΆαααααΌα
ααΆαααααα:
- ααΎααααααΎα bot config αααααΎαααΉααααααΆαα»αααΆαααααααα½αα ααα½αα αααα»αααααΈααααααΎα bot token αα·αααααΌααα ααΆααα―αααΆα databaseα
- ααΎααααααΎαα’αααααα·ααααΆααααααααΌααα ααΆααααααααααΆαα½α bot ααΉαααααΌαααΆααααααΆαα»αα
- ααΎααααααΎαααΌαααααΆααα·ααααααααααααα½αα―α αα·ααα»αααΆααα½αα ααα½αααΎααααΈα±αα bot α’αΆα ααααΎα’ααααααααααΆαα½αααΆααΆαα
- ααΎαααααα bot method, i.e. αα»αααΆααααααΆααΉαα’αα»ααααα
- ααΆααααααααααααααΆαα αααααΆααααα½αααα bot ααΉαα αΌαααααΎαα·ααΈααΆαααααα αΆαααΆα α α’αΆαααααααΎααααΆαααΆααα αα α»ααααααααααΆαααααα
- ααΎαααααααα§ααααααααααααΆααααααΉαααααΆααααΆααααααααΆ αα·αααΆαααΆαα½αααΉααα·ααΈααΆααααα bot α αΆαααΆα αα
- αααααΎαααααΎαααΆα bot α
αα ααΆαααααααααααααα
ααΎααααΈααΆαααΆααααα½α ααΎαααΉααααα ααααΌααα bot ααααααΎα αα·αα―αααΆαααΆααααααααααααααααα ααΆαα ααΆααααααααααΌα ααΆααααααα
- bot.R - αααααΌαααααΆαααα bot ααααααΎαα
- db_bot_function.R - αααα»αααααΌααααααΆααα»αααΆααααααΆααααααΎααΆαααΆαα½αααΌαααααΆααα·αααααα
- bot_methods.R - ααΌααααα·ααΈααΆααααα bot
- message_filters.R - αααααααΆα
- α’ααααααααααΆα.R - α’ααααααααααΆα
- config.cfg - ααΆαααααααα ααΆαααααααα bot
- create_db_data.sql - ααααααΈα SQL αααααΆαααααααΎαααΆααΆααααααΆααα·αααααααααααααα»αααΌαααααΆααα·αααααα
- create_db_state.sql - ααααααΈα SQL αααααΆαααααααΎαααΆααΆαααααααΆαααΆααααααα αα α»αααααααα αααα»αααΌαααααΆααα·αααααα
- bot.db - ααΌαααααΆααα·αααααα bot
α’αααα’αΆα
ααΎααααααα bot ααΆααααΌα α¬
ααααααα ααΆααααααααααΌα
ααΎαααΉαααααΎααααααΆααΆααΆαααααα
[bot_settings]
bot_token=Π’ΠΠΠΠ_ΠΠΠ¨ΠΠΠ_ΠΠΠ’Π
[db_settings]
db_path=C:/ΠΠ£Π’Π¬/Π/ΠΠΠΠΠ/ΠΠ ΠΠΠΠ’Π/bot.db
αα αααα»α config ααΎαααααα bot token αα·αααααΌααα ααΆαα database i.e. αα α―αααΆα bot.db ααΎαααΉααααααΎαα―αααΆαααααααα½αα―ααα ααα αΆααααααΆααα
αααααΆαα bots αααα»αααααααΆαααΆααααα αααΎα α’αααα’αΆα αααααΎα configs αααα»αααααααΆαααααααααα αααα ααΈαααααΆαα·αα αΆαααΆα ααααα»αααΆαααααα ini config αα α’αααα’αΆα ααααΎαααααααααααααααα½αααΆαα JSON αααααα
αααααΎαα’αααααα·ααααΆα
αα
ααΎαα»αααααΌαααααΈαα½αα ααα―αααΆααααααΆααααααα bot α’αΆα
ααΆαααΈααΆαααα
αααα»αααααααααααααΆ αα·ααα
ααΎααααΆααααααααααΆ ααΌα
αααααα
αααα»αααΌαααααΌααα
ααΆααααααααααααΉαααααΌαααΆααααααααΆααααα’αααααα·ααααΆαα TG_BOT_PATH
.
ααΆααα·ααΈααΆα αααΎαααΎααααΈαααααΎαα’αααααα·ααααΆα αααααΆαααααααα»αααΊαααααααΆαα αααα»αα―αααΆα .ααααααΈααα»α.
α’αααα’αΆα
αααααΎα α¬ααααααα½αα―αααΆαααααααααααΎααΆααααααααΆ file.edit(path.expand(file.path("~", ".Renviron")))
. ααααα·ααααα·ααΆ α αΎααααααααααααΆαααα½ααα
α―αααΆαα
TG_BOT_PATH=C:/ΠΠ£Π’Π¬/Π/ΠΠΠ¨ΠΠΠ£/ΠΠ ΠΠΠΠ’Π£
αααααΆαααααααΆαα»αα―αααΆα .ααααααΈααα»α α αΎαα αΆααααααΎα RStudio α‘αΎααα·αα
ααΆααααααΎαααΌαααααΆααα·αααααα
ααα αΆααααααΆααααΊαααααΎαααΌαααααΆααα·ααααααα ααΎαααΉαααααΌαααΆααα»α ααα½α α’α
- chat_data β αα·ααααααααα bot ααΆαααααΎαα»αααΈα’αααααααΎααααΆαα
- chat_state β ααααΆαααΆααα αα α»ααααααααααΆαααααααΆααα’ααα
α’αααα’αΆα αααααΎαααΆααΆαααΆααααααααααααΎαααα½α 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
);
ααααα·αααΎα’αααααΆαααΆααααααααα bot ααΈ
# Π‘ΠΊΡΠΈΠΏΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
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]])
}
ααΎαααΆααααααΎααα»αααΆαααΆααααα ααα½α α€α
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 ααΆαααααα·αααααΆαα―ααα αα·αααΆαααααΉαα ααααααααΆααΆαα ααΆααααΌα ααΎαααααΆααΆαααααααααααααΆααα αααα»αααΆααΆα α αΎαααΎαααα½αααΆαααα α»α ααααα·αααΎαα·αααααααααααΆααααΆααααααα αα α»ααααααααΆαααααααΆααα½α α αΎα αααα»αααααΈααα ααΎαααααΆααααααααΎαα αα α»ααααααααΆαααααααΆααααααΆααααΆααααααααα
αααααΆαααα ααΎαααΉαααααΎαα»αααΆαααΆααααααα αααα»ααα·ααΈ αα·αααααααααα bot α
αα·ααΈααΆαααααααΌα
ααα αΆααααααΆαααααα»αααΆααααααΎα bot ααααααΎαααΊαααααΎααα·ααΈααΆαααααα ααααα·αααΎα’αααααΆαααΆαααααααααααΈ
ααΌααα·ααΈααΆααααα Bot
# ###########################################################
# 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')
}
}
ααΎαααΆααααααΎααα·ααΈααΆαααααα ααα½α α₯α
- α αΆααααααΎα - α αΆααααααΎααααα’αα
- αααα - ααα½αααΆαααααΆαααΆααααααα αα α»αααααα
- αααααα‘αΎααα·α - αααααααααΆαααΆααααααα αα α»ααααααα‘αΎααα·α
- enter_name - bot αα½ααααααααααααα’αααα
- enter_age β bot αα½αααα’αΆαα»ααααα’αααα
αα·ααΈααΆααααα start
αα½ααααααααααααα’ααα α αΎαααααΌαααααΆαααΆααααααα
wait_name, i.e. ααΎααααΈαααα
αΆααααααΆααααΆααααα
αΌααααααααααα’αααα
αααααΆααα’αααααααΎαααααα αΎαααΆααααΌαααΆαααααΎαααΆαααααα·ααΈααΆααααα enter_name
bot ααααΆααααα’ααα αααααααααααααααα½αααΆααα
αααα»αααΌαααααΆααα·αααααα α αΎαααααΌαααΆααααααα
ααΆααααΆαααΆα αααα
αΆα_α’αΆαα».
αα
ααααΆααααΆαααα bot ααααΉαααΆα’αααααΉαα
αΌαα’αΆαα»ααααα’αααα α’αααααααΎα’αΆαα»ααααα’ααα bot αα·αα·αααααΆα ααααα·αααΎα’αααααααΎα’ααααααα½αα
ααα½ααααα½αα±ααααα ααΆααΉααα·ααΆαααΆα Π’Ρ Π²Π²ΡΠ» Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅, Π²Π²Π΅Π΄ΠΈ ΡΠΈΡΠ»ΠΎ
α αΎαααΉααααα
αΆαα±ααα’ααααααα
αΌααα·ααααααααααα’αααα‘αΎααα·αα ααααα·αααΎα’αααααΆαααααΎααααα½α bot ααΉαααΆαααΆαααααΆααΆααΆαααα½αααα’αΆαα»ααααα’ααα ααααααα·αααααααααααα½αααΆααα
ααΌαααααΆααα·αααααα ααΆαααΆααααα·ααααααααΆααα’αααααααα½αααΆαααΈα’ααα α αΎααααα‘ααααααΆαααΆααααααα
ααΈααΆααααΎαααααααΆ αααααΊα§α α start
.
αααα α
αα·ααΈααΆααααα state
α’αααβα’αΆα
βααααΎβαα»αβααααΆαααΆαβααααβααααΆαααβαα
αα
α»ααααααβαα
βαααβααΆβααβααΆα α αΎαβαααβααααΎβααΆαααβαααααΆ reset
αααα‘ααααΆααααααα
αααΆαααΎαααααααΆα
αααααααΆα
αααα»αααααΈααααααΎααααααΊααΆααααααα½αααααααΆαααααα»ααααα»αααΆααααααΎα bot α ααΆααΊαααααΆααααα½αααΈαααααααΆαααα bot ααΉααααααΈααααααΆααααααΆααααΉααα»αααΈα’ααα αα·ααααααααααΆαα½αααααααΌαααΆαααααΎαααΆαα
αα
αααα»ααααααααα
ααΎ
ααΌααααααααΆαα
# ###########################################################
# 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"
}
)
αα
αααα»ααααααααΎαααααΎαα»αααΆααααααΆααααααααΈαα»α get_state()
ααΎααααΈααααΎαα»αααααΆαααΆααα
αα
α»ααααααααααΆαααααα αα»αααΆααααααααΌαααΆααα 1 α’αΆαα»ααααα ααααααααΆααααΆαααααα
ααααααααααΆαα wait_name ααααΎαααΆαααΆααα
ααααααααΆααααααααα·ααααα»αααααΆαααΆααα½αα wait_name
α αΎαααααα
ααΆαααααα αααα
αΆα_α’αΆαα» ααααΎαααΆαααΆααα
ααααααααΆααααααααα·ααααα»αααααΆαααΆααα½αα wait_age
.
α’ααααααααααΆα
α―αααΆααααααΆαα’ααααααααααΆαααααΌαααΆαααα α ααΆ α’ααααααααααΆα.Rαα·αααΆααααααΌαααΌα ααΆααααααα
# ###########################################################
# 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)
ααααΌαααΎααααααΎααααααα·ααΈαααααααααααΆααααααααΆαααααΉαα’αα»ααααΆαα±ααα’αααααααΎαααΆααα·ααΈααΆαααααααΎααααΈα αΆααααααΎααααα’αα αααααααΆα‘αΎααα·α αα·ααα½αααααΆαααΆααα αα α»ααααααα
αααααΆαααα ααΎααααααΎααααααα·ααΈαααααααΆαααΆαα
ααα½α 2 αααααααΎααααααααααΆααααααΎααααα»αααα αΆααα»α α αΎαααααααααααααα
αα½αααα !MessageFilters$command
ααΌα
ααααααΎαα’αΆα
ααααΎααΆααααααααΆαααα»αααααΆαααΆαααααααΆαα½αα
ααΌαααΎαααααΎαααΆαααΌα
α₯α‘αΌααααααΎαααΆαα’αααΈααααααααΆααααααααααα½α ααΆααααα ααΎααααΈααΎαααααΎαααΆα ααΌαα αααααααααΆααααΆαααΎαααααΎαααΆα bot ααΊαα αααα»αα―αααΆα bot.R.
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()
ααΆααααααααΎαααα½αααΆα bot αααα
αα
αααααΆαα½ααααααααΎααΆααααααααΆ /state
ααΎαα’αΆα
αα½αααααΆαααΆααααααα
αα
α»αααααα αα·ααααααααΎααΆααααααααΆ /reset
αααα‘ααααΆααααααα
αααΆαααΎαααααααΆ α αΎαα
αΆααααααΎαααΆαααααααΆαααααααα
ααα ααααΈααααα·ααααΆα
αα αααα»αα’αααααααα ααΎαααΆαααααααααααΈααααααααΎααΌαααααΆααα·αααααααα ααΆααααα»α bot αα·ααααααααααΎαααΆαααααααΆαααααα·ααααΆααΆαααααΆαααααααααααααααααΆααααΆαααΆαααααα
αααα»αααααΈααα ααΎαααΆααααα‘ααααΎαα§ααΆα αααααααααα»α ααΎααααΈα’ααα’ααααααααΆααααα αααΆααααΈαααα·αααααΆααααααΎα bots αααααα α αΎααα αααα»αααΆαα’αα»αααα α’αααα’αΆα αααααΎαααΆαααααααΆααααααα»αααααΆαααΆααααα
αα αααα»αα’ααααααααααΆαααα αααα»ααααααΈααα ααΎαααΉααααααΈααααααΆααααααα·ααα·αααα·ααααα’αααααααΎ bot ααΎααααΈααααΎαα·ααΈααΆαααααααααααααααααΆα
ααααα: www.habr.com