├── .gitignore ├── Gemfile ├── Gemfile.lock ├── autosteam.db ├── fish_socket.rb ├── library ├── database.rb └── mac-shake.rb └── modules ├── assets └── inline_button.rb ├── callback_messages.rb ├── listener.rb ├── promos.rb ├── response.rb ├── security.rb └── standart_messages.rb /.gitignore: -------------------------------------------------------------------------------- 1 | /.idea/ -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | gem 'json' 4 | gem 'net-http-persistent', '~> 2.9' 5 | gem 'sqlite3'#gem для БД 6 | gem 'telegram-bot-ruby'#основной гем для создания соеденения с Telegram ботом 7 | -------------------------------------------------------------------------------- /Gemfile.lock: -------------------------------------------------------------------------------- 1 | GEM 2 | remote: https://rubygems.org/ 3 | specs: 4 | axiom-types (0.1.1) 5 | descendants_tracker (~> 0.0.4) 6 | ice_nine (~> 0.11.0) 7 | thread_safe (~> 0.3, >= 0.3.1) 8 | coercible (1.0.0) 9 | descendants_tracker (~> 0.0.1) 10 | descendants_tracker (0.0.4) 11 | thread_safe (~> 0.3, >= 0.3.1) 12 | equalizer (0.0.11) 13 | faraday (1.1.0) 14 | multipart-post (>= 1.2, < 3) 15 | ruby2_keywords 16 | ice_nine (0.11.2) 17 | inflecto (0.0.2) 18 | json (2.1.0) 19 | multipart-post (2.1.1) 20 | net-http-persistent (2.9.4) 21 | ruby2_keywords (0.0.2) 22 | sqlite3 (1.3.13) 23 | telegram-bot-ruby (0.13.0) 24 | faraday 25 | inflecto 26 | virtus 27 | thread_safe (0.3.6) 28 | virtus (1.0.5) 29 | axiom-types (~> 0.1) 30 | coercible (~> 1.0) 31 | descendants_tracker (~> 0.0, >= 0.0.3) 32 | equalizer (~> 0.0, >= 0.0.9) 33 | 34 | PLATFORMS 35 | ruby 36 | 37 | DEPENDENCIES 38 | json 39 | net-http-persistent (~> 2.9) 40 | sqlite3 41 | telegram-bot-ruby 42 | 43 | BUNDLED WITH 44 | 2.1.4 45 | -------------------------------------------------------------------------------- /autosteam.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sorshireality/sorshireality-ruby-teleram-bot-native/dfb3de6f0bf6ff45f19eec2bb2295d7319d9836e/autosteam.db -------------------------------------------------------------------------------- /fish_socket.rb: -------------------------------------------------------------------------------- 1 | require 'telegram/bot' 2 | require './library/mac-shake' 3 | require './library/database' 4 | require './modules/listener' 5 | require './modules/security' 6 | require './modules/standart_messages' 7 | require './modules/response' 8 | require './modules/callback_messages' 9 | require './modules/assets/inline_button' 10 | require './modules/promos' 11 | 12 | # Entry point class 13 | class FishSocket 14 | include Database 15 | def initialize 16 | super 17 | # Initialize BD 18 | Database.setup 19 | # Establishing webhook via @gem telegram/bot, using API-KEY 20 | Telegram::Bot::Client.run(TelegramOrientedInfo::API_KEY) do |bot| 21 | # Start time variable, for exclude message what was sends before bot starts 22 | start_bot_time = Time.now.to_i 23 | # Active socket listener 24 | bot.listen do |message| 25 | # Processing the new income message #if that message sent after bot run. 26 | Listener.catch_new_message(message,bot) if Listener::Security.message_is_new(start_bot_time,message) 27 | end 28 | end 29 | end 30 | end 31 | # Bot start 32 | FishSocket.new -------------------------------------------------------------------------------- /library/database.rb: -------------------------------------------------------------------------------- 1 | # This module assigned to all database operations 2 | module Database 3 | attr_accessor :db 4 | 5 | require 'sqlite3' 6 | # This module assigned to create table action 7 | module Create 8 | def steam_account_list 9 | Database.db.execute <<-SQL 10 | CREATE TABLE steam_account_list ( 11 | accesses VARCHAR (128), 12 | used INTEGER (1)) 13 | SQL 14 | true 15 | rescue SQLite3::SQLException 16 | false 17 | end 18 | module_function( 19 | :steam_account_list 20 | ) 21 | end 22 | 23 | def setup 24 | # Initializing database file 25 | self.db = SQLite3::Database.open 'autosteam.db' 26 | # Try to get custom table, if table not exists - create this one 27 | unless get_table('steam_account_list') 28 | Create.steam_account_list 29 | end 30 | end 31 | 32 | # Get all from the selected table 33 | # @var table_name 34 | def get_table(table_name) 35 | db.execute <<-SQL 36 | Select * from #{table_name} 37 | SQL 38 | rescue SQLite3::SQLException 39 | false 40 | end 41 | 42 | module_function( 43 | :get_table, 44 | :setup, 45 | :db, 46 | :db= 47 | ) 48 | end 49 | -------------------------------------------------------------------------------- /library/mac-shake.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | module TelegramOrientedInfo 3 | API_KEY = '__YOUR_API_KEY__' 4 | end 5 | -------------------------------------------------------------------------------- /modules/assets/inline_button.rb: -------------------------------------------------------------------------------- 1 | class FishSocket 2 | # This module assigned to creating InlineKeyboardButton 3 | module Inline_Button 4 | GET_ACCOUNT = Telegram::Bot::Types::InlineKeyboardButton.new(text: 'Получить account', callback_data: 'get_account') 5 | HAVE_PROMO = Telegram::Bot::Types::InlineKeyboardButton.new(text: 'Есть промокод?', callback_data: 'force_promo') 6 | ADDITION_MENU = Telegram::Bot::Types::InlineKeyboardButton.new(text: 'Ништяки', callback_data: 'advanced_menu') 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /modules/callback_messages.rb: -------------------------------------------------------------------------------- 1 | class FishSocket 2 | module Listener 3 | # This module assigned to processing all callback messages 4 | module CallbackMessages 5 | attr_accessor :callback_message 6 | 7 | def process 8 | self.callback_message = Listener.message.message 9 | case Listener.message.data 10 | when 'get_account' 11 | Listener::Response.std_message('Нету аккаунтов на данный момент') 12 | when 'force_promo' 13 | Listener::Response.force_reply_message('Отправьте промокод') 14 | when 'advanced_menu' 15 | Listener::Response.inline_message('Дополнительное меню:', Listener::Response.generate_inline_markup([ 16 | Inline_Button::HAVE_PROMO 17 | ]), true) 18 | end 19 | end 20 | 21 | module_function( 22 | :process, 23 | :callback_message, 24 | :callback_message= 25 | ) 26 | end 27 | end 28 | end 29 | -------------------------------------------------------------------------------- /modules/listener.rb: -------------------------------------------------------------------------------- 1 | class FishSocket 2 | # Sorting new message module 3 | module Listener 4 | attr_accessor :message, :bot 5 | 6 | def catch_new_message(message,bot) 7 | self.message = message 8 | self.bot = bot 9 | 10 | return false if Security.message_too_far 11 | 12 | case self.message 13 | when Telegram::Bot::Types::CallbackQuery 14 | CallbackMessages.process 15 | when Telegram::Bot::Types::Message 16 | StandartMessages.process 17 | end 18 | end 19 | 20 | module_function( 21 | :catch_new_message, 22 | :message, 23 | :message=, 24 | :bot, 25 | :bot= 26 | ) 27 | end 28 | end -------------------------------------------------------------------------------- /modules/promos.rb: -------------------------------------------------------------------------------- 1 | class FishSocket 2 | module Listener 3 | # This module assigned to processing all promo-codes 4 | module Promos 5 | def validate(code) 6 | return true if code =~ /^1[a-zA-Z]*0$/ 7 | false 8 | end 9 | 10 | module_function( 11 | :validate 12 | ) 13 | end 14 | end 15 | end 16 | -------------------------------------------------------------------------------- /modules/response.rb: -------------------------------------------------------------------------------- 1 | class FishSocket 2 | module Listener 3 | # This module assigned to responses from bot 4 | module Response 5 | def std_message(message, chat_id = false ) 6 | chat = (defined?Listener.message.chat.id) ? Listener.message.chat.id : Listener.message.message.chat.id 7 | chat = chat_id if chat_id 8 | Listener.bot.api.send_message( 9 | parse_mode: 'html', 10 | chat_id: chat, 11 | text: message 12 | ) 13 | end 14 | 15 | def inline_message(message, inline_markup, editless = false, chat_id = false) 16 | chat = (defined?Listener.message.chat.id) ? Listener.message.chat.id : Listener.message.message.chat.id 17 | chat = chat_id if chat_id 18 | if editless 19 | return Listener.bot.api.edit_message_text( 20 | chat_id: chat, 21 | parse_mode: 'html', 22 | message_id: Listener.message.message.message_id, 23 | text: message, 24 | reply_markup: inline_markup 25 | ) 26 | end 27 | Listener.bot.api.send_message( 28 | chat_id: chat, 29 | parse_mode: 'html', 30 | text: message, 31 | reply_markup: inline_markup 32 | ) 33 | end 34 | 35 | def generate_inline_markup(kb, force = false) 36 | Telegram::Bot::Types::InlineKeyboardMarkup.new( 37 | inline_keyboard: kb 38 | ) 39 | end 40 | 41 | def force_reply_message(text, chat_id = false) 42 | chat = (defined?Listener.message.chat.id) ? Listener.message.chat.id : Listener.message.message.chat.id 43 | chat = chat_id if chat_id 44 | Listener.bot.api.send_message( 45 | parse_mode: 'html', 46 | chat_id: chat, 47 | text: text, 48 | reply_markup: Telegram::Bot::Types::ForceReply.new( 49 | force_reply: true, 50 | selective: true 51 | ) 52 | ) 53 | end 54 | 55 | module_function( 56 | :std_message, 57 | :generate_inline_markup, 58 | :inline_message, 59 | :force_reply_message 60 | ) 61 | end 62 | end 63 | end 64 | -------------------------------------------------------------------------------- /modules/security.rb: -------------------------------------------------------------------------------- 1 | class FishSocket 2 | module Listener 3 | # Module for checks 4 | module Security 5 | def message_is_new(start_time, message) 6 | message_time = (defined? message.date) ? message.date : message.message.date 7 | message_time.to_i > start_time 8 | end 9 | 10 | def message_too_far 11 | message_date = (defined? Listener.message.date) ? Listener.message.date : Listener.message.message.date 12 | message_delay = Time.now.to_i - message_date.to_i 13 | # if message delay less then 5 min then processing message, else ignore 14 | message_delay > (5 * 60) 15 | end 16 | module_function :message_is_new, :message_too_far 17 | end 18 | end 19 | end 20 | -------------------------------------------------------------------------------- /modules/standart_messages.rb: -------------------------------------------------------------------------------- 1 | class FishSocket 2 | module Listener 3 | # This module assigned to processing all standart messages 4 | module StandartMessages 5 | def process 6 | case Listener.message.text 7 | when '/get_account' 8 | Response.std_message 'Very sorry, нету аккаунтов на данный момент' 9 | when '/start' 10 | Response.inline_message 'Привет, выбери из доступных действий', Response::generate_inline_markup( 11 | [ 12 | Inline_Button::GET_ACCOUNT, 13 | Inline_Button::ADDITION_MENU 14 | ] 15 | ) 16 | else 17 | unless Listener.message.reply_to_message.nil? 18 | case Listener.message.reply_to_message.text 19 | when /Отправьте промокод/ 20 | return Listener::Response.std_message 'Промокод существует, вот бесплатный аккаунт :' if Promos::validate Listener.message.text 21 | 22 | return Listener::Response.std_message 'Промокод не найден' 23 | end 24 | end 25 | Response.std_message 'Первый раз такое слышу, попробуй другой текст' 26 | end 27 | end 28 | 29 | module_function( 30 | :process 31 | ) 32 | end 33 | end 34 | end 35 | --------------------------------------------------------------------------------