Версия Ruby - 2.7.2, но не исключено, что всё будет работать и с более ранними/поздними версиями.
Примерная структура приложения будет выглядеть вот так
Первым делом создадим Gemfile - основной держатель зависимостей для сторонних gem’s в Ruby.
Файл Gemfile:
Сохраняем файл и выполняем в терминале операцию
bundle install
Увидим успешную установку всех гемов (ну это же прелесть Ruby) и на этом с Gemfile будет покончено.
Если вы (как и я) лабораторная крыса GitHub’a, то создаем .gitignore для нашего репозитория, у меня прописан классический для продуктов JetBrains файл:
Файл .gitignore:
/.idea/
Далее создадим первый класс в корне проекта, называем как хотим этот класс будет выступать в роли инициализатора, в моем случае это FishSocket:
файл FishSocket.rb :
Как видим в этот файле упомянуты сразу 5 различных файлов :
Поэтому предлагаю сразу их создать и показать что к чему:
Файл mac-shake.rb:
Как видим в этом файле используется API-KEY для связи с нашим ботом, предлагаю сразу его получить, для этого обратимся к боту от Telegram API : Для просмотра ссылки Войди или Зарегистрируйся
API-Key который нам вернул бот, следует вставить в константу API-Key, упомянутую ранее.
Файл security.rb:
В этом файле происходит две проверки : на то, что бы сообщение было отправлено после старта бота (не обрабатывать команды которые были отпраленны в прошлой сессии). И вторая проверка, что бы не обрабатывать сообщение которым больше 5 минут (вдруг вы добавите очередь, и таким образом мы ограничиваем её длину)
Файл listener.rb:
В этом файле мы делим сообщения на две группы, являются ли они ответом на callback функцию, или они обычные. Сейчас проясню что такое callback сообщение в телеграме. Telegram API версии 2.0 предоставляет достаточно обширную поддержку InlineMessages. Это такие сообщение, которые в себе содержает UI элементы взаемодействия с пользователем, я в своем боте использоват Для просмотра ссылки Войди или Зарегистрируйся это кнопки, после нажатия на которые сообщение которые прийдет на бота, будет типа CallbackMessage, и текст сообщение будет равен тому, который мы указали в атрибут кнопки, при отправке запроса на Telegram API. Позже мы ешё вернёмся к этому принципу.
Файл Database.rb
В этом файле просто происходит инициализация бд и проверка/создание таблиц которые мы хотим использовать.
Можем попытатся запустить нашего бота, посредством выполнения файла Для просмотра ссылки Войдиили Зарегистрируйся. Если мы всё сделали правильно, то не должны увидеть никакого сообщения о завершеной работе, так как происходит Active Socket прослушывания ответа от Telegram API. Мы по-сути реестрируем наш локальный сервер прикрепляя его к Webhook от Telegram API, на который будут приходить сообщения о любых изменениях.
Попробуем добавить примитивный ответ на какое-то сообщение в боте
Создадим файл standart_messages.rb, модуль который будет обрабатывать стандартные (текстовые) сообщение нашего бота. Как помним сообщение бывают двух типов : Standart и Callback.
Файл standart_messages.rb :
Примерная структура приложения будет выглядеть вот так
Первым делом создадим Gemfile - основной держатель зависимостей для сторонних gem’s в Ruby.
Файл Gemfile:
Код:
source 'https://rubygems.org'
gem 'json'
gem 'net-http-persistent', '~> 2.9'
gem 'sqlite3'#gem для БД
gem 'telegram-bot-ruby'#основной гем для создания соеденения с Telegram ботом
Сохраняем файл и выполняем в терминале операцию
bundle install
Увидим успешную установку всех гемов (ну это же прелесть Ruby) и на этом с Gemfile будет покончено.
Если вы (как и я) лабораторная крыса GitHub’a, то создаем .gitignore для нашего репозитория, у меня прописан классический для продуктов JetBrains файл:
Файл .gitignore:
/.idea/
Далее создадим первый класс в корне проекта, называем как хотим этот класс будет выступать в роли инициализатора, в моем случае это FishSocket:
файл FishSocket.rb :
Код:
require 'telegram/bot'
require './library/mac-shake'
require './library/database'
require './modules/listener'
require './modules/security'
require './modules/standart_messages'
require './modules/response'
Entry point class
class FishSocket
include Database
def initialize
super
# Initialize BD
Database.setup
# Establishing webhook via @gem telegram/bot, using API-KEY
Telegram::Bot::Client.run(TelegramOrientedInfo::APIKEY) do |bot|
# Start time variable, for exclude message what was sends before bot starts
startbottime = Time.now.toi
# Active socket listener
bot.listen do |message|
# Processing the new income message #if that message sent after bot run.
Listener.catchnewmessage(message,bot) if Listener::Security.messageisnew(startbottime,message)
end
end
end
end
Bot start
FishSocket.new
Как видим в этот файле упомянуты сразу 5 различных файлов :
Код:
gem telegram/bot,
mac-shake,
listener,
security,
database.
Файл mac-shake.rb:
Код:
# frozen_string_literal: true
module TelegramOrientedInfo
API_KEY = '__YOUR_API_KEY__'
end
API-Key который нам вернул бот, следует вставить в константу API-Key, упомянутую ранее.
Файл security.rb:
Код:
require 'telegram/bot'
require './library/mac-shake'
require './library/database'
require './modules/listener'
require './modules/security'
# Entry point class
class FishSocket
include Database
def initialize
super
# Initialize BD
Database.setup
# Establishing webhook via @gem telegram/bot, using API-KEY
Telegram::Bot::Client.run(TelegramOrientedInfo::API_KEY) do |bot|
# Start time variable, for exclude message what was sends before bot starts
start_bot_time = Time.now.to_i
# Active socket listener
bot.listen do |message|
# Processing the new income message #if that message sent after bot run.
Listener.catch_new_message(message,bot) if Listener::Security.message_is_new(start_bot_time,message)
end
end
end
end
# Bot start
FishSocket.new
Файл listener.rb:
Код:
class FishSocket
# Sorting new message module
module Listener
attr_accessor :message, :bot
def catch_new_message(message,bot)
self.message = message
self.bot = bot
return false if Security.message_too_far
case self.message
when Telegram::Bot::Types::CallbackQuery
CallbackMessages.process
when Telegram::Bot::Types::Message
StandartMessages.process
end
end
module_function(
:catch_new_message,
:message,
:message=,
:bot,
:bot=
)
end
end
Файл Database.rb
Код:
# This module assigned to all database operations
module Database
attr_accessor :db
require 'sqlite3'
# This module assigned to create table action
module Create
def steam_account_list
Database.db.execute <<-SQL
CREATE TABLE steam_account_list (
accesses VARCHAR (128),
used INTEGER (1))
SQL
true
rescue SQLite3::SQLException
false
end
module_function(
:steam_account_list
)
end
def setup
# Initializing database file
self.db = SQLite3::Database.open 'autosteam.db'
# Try to get custom table, if table not exists - create this one
unless get_table('steam_account_list')
Create.steam_account_list
end
end
# Get all from the selected table
# @var table_name
def get_table(table_name)
db.execute <<-SQL
Select * from #{table_name}
SQL
rescue SQLite3::SQLException
false
end
module_function(
:get_table,
:setup,
:db,
:db=
)
end
Можем попытатся запустить нашего бота, посредством выполнения файла Для просмотра ссылки Войди
Попробуем добавить примитивный ответ на какое-то сообщение в боте
Создадим файл standart_messages.rb, модуль который будет обрабатывать стандартные (текстовые) сообщение нашего бота. Как помним сообщение бывают двух типов : Standart и Callback.
Файл standart_messages.rb :
Код:
class FishSocket
module Listener
# This module assigned to processing all standart messages
module StandartMessages
def process
case Listener.message.text
when '/get_account'
Response.std_message 'Very sorry, нету аккаунтов на данный момент'
else
Response.std_message 'Первый раз такое слышу, попробуй другой текст'
end
end
module_function(
:process
)
end
end
end