abot-info 0.2.4 → 0.2.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7d58b0e5421210e4d455de713e558820168d1a1ad094e203bdf69fe3244a7dbe
4
- data.tar.gz: 4a61b59b59a4ff4fbed7219c44b1063bcd14d7f46d4ea43cb930b3b4820d7313
3
+ metadata.gz: c356808904955eec165f429c9a0012bc095865983303853d48ff09239e988e19
4
+ data.tar.gz: 930de8a6a519242048f9e02603090cdd9560c8040866ec0d23f80b3affa2062e
5
5
  SHA512:
6
- metadata.gz: 96859eb095d54fe84a84f506c8356a9f7bf44b0a0ee80dd3f9e54a947390c18e3d7ebf21f39ea24cee7f105d407fa3f2b8efac62534280bdd9023bd63ce79927
7
- data.tar.gz: af692d94de52095dcaa092b7829e817d60bad1f65ef9826a1843a46d4ccde0415ef3213003e165b92afd64c8ff29e9dd33fede1a0f5e460485edcafacb50e886
6
+ metadata.gz: a5fbf25ee4fc34c87213f122de255590ae13e316741b0d049f6bde84dd3cacb52f10e8a002eafb6c4eb269b13f4396e8ea06d6d99acf6f2763d59f29dfbe448d
7
+ data.tar.gz: f833ee553da12be027dd6e72ebc2544527ec2e64e9080939b2bcbc15628675111e70c1caaf691cbfca2229540bb2778f64c0a0a7f46e3777ca129ebbe7ad35cb
data/Gemfile CHANGED
@@ -5,3 +5,4 @@ gem 'paint', '~> 2.2.1'
5
5
  gem 'sqlite3', '~> 1.4.2'
6
6
  gem 'terminal-table', '~> 3.0.1'
7
7
  gem 'binance-ruby', '~> 1.3.1'
8
+ gem 'telegram-bot-ruby', '~> 0.16.0'
data/abot-info.gemspec CHANGED
@@ -38,4 +38,5 @@ Gem::Specification.new do |spec|
38
38
  spec.add_dependency "sqlite3", '~> 1.4.2'
39
39
  spec.add_dependency "terminal-table", '~> 3.0.1'
40
40
  spec.add_dependency "binance-ruby", '~> 1.3.1'
41
+ spec.add_dependency 'telegram-bot-ruby', '~> 0.16.0'
41
42
  end
@@ -14,6 +14,8 @@ module Abot
14
14
  API_KEY_TABLE = BASE_CONNECTION.execute('SELECT * FROM api_key').freeze
15
15
  API_KEY = API_KEY_TABLE.first['api'].freeze
16
16
  SECRET_KEY = API_KEY_TABLE.first['secret'].freeze
17
+ TG_TOKEN = API_KEY_TABLE.first['tg_token'].freeze
18
+ TG_NAME = API_KEY_TABLE.first['tg_name'].freeze
17
19
 
18
20
  class << self
19
21
  def data_coins
@@ -7,15 +7,7 @@ module Abot
7
7
  def decorated_sell_up
8
8
  return '-' if sell_up == Float::INFINITY
9
9
 
10
- rounded_sell_up = sell_up.round(2)
11
- case num_averaging
12
- when 1, 2
13
- rounded_sell_up > 2 ? Paint[rounded_sell_up, :red] : rounded_sell_up
14
- when 3, 4, 5
15
- rounded_sell_up > 2 ? rounded_sell_up : Paint[rounded_sell_up, :red]
16
- else
17
- rounded_sell_up
18
- end
10
+ sell_up.round(2)
19
11
  end
20
12
 
21
13
  def decorated_current_profit
@@ -44,19 +36,15 @@ module Abot
44
36
  end
45
37
 
46
38
  def decorated_name
47
- arrow = if account.symbol_info(symbol).try(:[], :lastPrice).to_f < account.symbol_info(symbol).try(:[], :askPrice).to_f
48
- Paint[' ↑', :green]
49
- elsif account.symbol_info(symbol).try(:[], :lastPrice).to_f > account.symbol_info(symbol).try(:[], :askPrice).to_f
50
- Paint[' ↓', :red]
51
- else
52
- ''
53
- end
54
- "#{decorated_name_mobile} (#{account.symbol_info(symbol).try(:[], :priceChangePercent)}%)#{arrow}"
39
+ "#{name} (#{account.symbol_info(symbol).try(:[], :priceChangePercent)}%)#{pump}"
40
+ end
41
+
42
+ def pump
43
+ pump_detector == 'True' ? Paint[' (P)', :blue] : ''
55
44
  end
56
45
 
57
46
  def decorated_name_mobile
58
- pump_det = pump_detector == 'True' ? '👁 ' : ''
59
- "#{pump_det}#{name}"
47
+ "#{name} #{pump}"
60
48
  end
61
49
 
62
50
  def decorated_sell_price
@@ -13,14 +13,17 @@ module Abot
13
13
  ].freeze
14
14
 
15
15
  def self.today_info_str
16
+ profit_array = DatabaseTable.data_daily_profit
17
+ return "Сегодня сделок не было \n" if profit_array.blank?
18
+
16
19
  profit = 'Профит сегодня:'
17
20
  transactions_count = 'Сделок '
18
- DatabaseTable.data_daily_profit.each do |c|
21
+ profit_array.each do |c|
19
22
  tick_size = (c['quote'] == 'BTC' ? 7 : 2)
20
23
  profit += "#{Paint[" #{c['sum'].round(tick_size)} #{c['quote']}", :green]};"
21
24
  transactions_count += "#{c['quote']}: #{Paint[c['count'], :green]}; "
22
25
  end
23
- "#{profit} #{transactions_count}"
26
+ "#{profit} #{transactions_count}\n"
24
27
  end
25
28
 
26
29
  def self.balance_str(account, current_coins, trade_params)
@@ -57,15 +60,54 @@ module Abot
57
60
  "#{symbol_name}: " + Paint["#{symbol[:askPrice].to_f} (#{symbol[:priceChangePercent]}%)", percent_color]
58
61
  end
59
62
 
60
- def self.check_abot
61
- Paint['WARNING: ПРОВЕРЬТЕ БОТА !!!', :black, :red] + "\n" if (Time.now - File.mtime(DatabaseTable::DB_PATH)) > 10
63
+ def self.check_abot(current_coins, telegram)
64
+ if (Time.now - File.mtime(DatabaseTable::DB_PATH)) > 40
65
+ if TelegramSender::SENDED_ERROR.blank?
66
+ TelegramSender::SENDED_ERROR[:warn_send] = true
67
+ telegram.send_message('WARNING: ПРОВЕРЬТЕ БОТА !!!') if telegram.present?
68
+ end
69
+ return Paint['WARNING: ПРОВЕРЬТЕ БОТА !!!', :black, :red] + "\n"
70
+ elsif TelegramSender::SENDED_ERROR
71
+ TelegramSender::SENDED_ERROR.clear
72
+ end
73
+
74
+ error_coins = current_coins.map { |c| c.current_price > c.sell_price ? c.name : nil }.compact
75
+ TelegramSender::SENDED_SELL_ERROR.delete_if { |key, _| !error_coins.include?(key) }
76
+
77
+ error_coins.each do |c|
78
+ if TelegramSender::SENDED_SELL_ERROR[c].to_i < 4
79
+ TelegramSender::SENDED_SELL_ERROR[c] = TelegramSender::SENDED_SELL_ERROR[c].to_i + 1
80
+ end
81
+ end
82
+
83
+ error_coins.select! { |s| TelegramSender::SENDED_SELL_ERROR[s].to_i > 2 }
84
+
85
+ return nil if error_coins.blank?
86
+
87
+ if telegram.present? &&
88
+ error_coins.find { |c| TelegramSender::SENDED_SELL_ERROR[c] == 3 }.present? &&
89
+ error_coins.find { |c| TelegramSender::SENDED_SELL_ERROR[c] == 4 }.blank?
90
+ telegram.send_message('WARNING: ПРОВЕРЬТЕ БОТА, ВОЗМОЖНО НУЖЕН РЕБУТ')
91
+ end
92
+ Paint['WARNING: ПРОВЕРЬТЕ БОТА, ВОЗМОЖНО НУЖЕН РЕБУТ', :black, :red] + "\n"\
62
93
  end
63
94
 
64
- def self.check_coins(account, quote_assets)
95
+ def self.check_coins(account, quote_assets, telegram)
65
96
  coins_without_order = account.coins_without_order(quote_assets)
66
- if coins_without_order.present?
67
- Paint["Монеты без ордера: #{coins_without_order.join(', ')}", :black, :red] + "\n"
97
+ TelegramSender::SENDED_LOST_COINS.delete_if { |key, _| !coins_without_order.include?(key) }
98
+
99
+ coins_without_order.each do |c|
100
+ if TelegramSender::SENDED_LOST_COINS[c].to_i < 4
101
+ TelegramSender::SENDED_LOST_COINS[c] = TelegramSender::SENDED_LOST_COINS[c].to_i + 1
102
+ end
68
103
  end
104
+
105
+ coins_without_order.select! { |s| TelegramSender::SENDED_LOST_COINS[s].to_i > 2 }
106
+
107
+ return nil if coins_without_order.blank?
108
+
109
+ telegram.send_lost_coins(coins_without_order) if telegram.present?
110
+ Paint["Монеты без ордера: #{coins_without_order.join(', ')}", :black, :red] + "\n"\
69
111
  end
70
112
  end
71
113
  end
@@ -6,7 +6,7 @@ module Abot
6
6
  class Table < Terminal::Table
7
7
  include Abot::Info::Helpers
8
8
 
9
- attr_reader :current_coins, :account, :rate_coins, :columns, :trade_params
9
+ attr_reader :current_coins, :account, :rate_coins, :columns, :trade_params, :telegram
10
10
 
11
11
  ALL_HEADINGS = {
12
12
  name: 'Coin',
@@ -57,12 +57,13 @@ module Abot
57
57
  @rate_coins = options.fetch(:rate_coins, [])
58
58
  @trade_params ||= DatabaseTable.data_settings
59
59
  @current_coins = Coin.current_coins(account, trade_params)
60
-
60
+ @telegram = Info::TelegramSender.new if options[:telegram_enable] == 'true'
61
61
 
62
62
  options = {
63
63
  headings: columns.map { |h| { value: ALL_HEADINGS[h], alignment: :center } },
64
64
  style: { border_x: '=' }
65
65
  }
66
+
66
67
  super options
67
68
  end
68
69
 
@@ -97,9 +98,9 @@ module Abot
97
98
  end
98
99
 
99
100
  def info_str
100
- "#{Helpers.check_coins(account, trade_params["quote_asset"].split(' '))}" \
101
- "#{Helpers.check_abot}" \
102
- "#{Helpers.today_info_str}\n" \
101
+ "#{Helpers.check_coins(account, trade_params["quote_asset"].split(' '), telegram)}" \
102
+ "#{Helpers.check_abot(current_coins, telegram)}" \
103
+ "#{Helpers.today_info_str}" \
103
104
  "#{Helpers.balance_str(account, current_coins, trade_params)}\n" \
104
105
  "#{Helpers.potential_balance_str(account, current_coins, trade_params)}\n" \
105
106
  "#{rate_coins_str}"
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Abot
4
+ module Info
5
+ class TelegramSender
6
+ attr_reader :chat_id, :token
7
+ SENDED_LOST_COINS = {}
8
+ SENDED_ERROR = {}
9
+ SENDED_SELL_ERROR = {}
10
+
11
+ def initialize
12
+ @chat_id = DatabaseTable::TG_NAME
13
+ @token = DatabaseTable::TG_TOKEN
14
+ end
15
+
16
+ def send_message(text)
17
+ Telegram::Bot::Client.run(token) do |bot|
18
+ message = bot.api.send_message(chat_id: chat_id, text: text)
19
+ if message['ok'] == true
20
+ bot.api.pin_chat_message(chat_id: chat_id, message_id: message.dig('result', 'message_id'))
21
+ end
22
+ end
23
+ end
24
+
25
+ def send_lost_coins(coins_without_order)
26
+ coins_without_order.each do |coin|
27
+ send_message("WARNING обнаружена монета без ордера: #{coin}") if SENDED_LOST_COINS[coin].to_i == 3
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Abot
4
4
  module Info
5
- VERSION = '0.2.4'
5
+ VERSION = '0.2.8'
6
6
  end
7
7
  end
data/lib/abot/info.rb CHANGED
@@ -5,12 +5,14 @@ require 'sqlite3'
5
5
  require 'terminal-table'
6
6
  require 'paint'
7
7
  require 'binance-ruby'
8
+ require 'telegram/bot'
8
9
 
9
10
  require_relative 'info/option_parser'
10
11
  require_relative 'info/coin'
11
12
  require_relative 'info/binance_account'
12
13
  require_relative 'info/table'
13
14
  require_relative 'info/version'
15
+ require_relative 'info/telegram_sender'
14
16
 
15
17
  module Abot
16
18
  module Info
@@ -74,11 +76,19 @@ module Abot
74
76
  :symbols, '--symbols=SYMBOL1,SYMBOL2,SYMBOL3',
75
77
  'Пары для отображения курсов',
76
78
  )
79
+ parser.add_option(
80
+ :telegram_enable, '--telegram_enable=true',
81
+ 'Отправка в телеграм канал справочной информации',
82
+ )
83
+ parser.add_option(
84
+ :update_time, '--update_time=SECONDS',
85
+ 'Период обновления информации, секунд, мин. 10',
86
+ )
77
87
  end.final!
78
88
 
79
89
  require_relative 'info/database_table'
80
90
 
81
- start_stats({ rate_coins: rate_coins, columns: columns })
91
+ start_stats({ rate_coins: rate_coins, columns: columns, telegram_enable: telegram_enable, update_time: update_time })
82
92
  end
83
93
 
84
94
  def start_stats(opts)
@@ -92,7 +102,7 @@ module Abot
92
102
  puts "ERROR: #{e.message}"
93
103
  end
94
104
 
95
- sleep 10
105
+ sleep update_time
96
106
  end
97
107
  end
98
108
 
@@ -106,6 +116,10 @@ module Abot
106
116
  @template ||= Info::OptionParser.instance.options[:template]
107
117
  end
108
118
 
119
+ def telegram_enable
120
+ @telegram_enable ||= Info::OptionParser.instance.options[:telegram_enable]
121
+ end
122
+
109
123
  def columns
110
124
  add = Info::OptionParser.instance.options[:add]&.split(',')&.map { |m| m.to_sym } || []
111
125
  del = Info::OptionParser.instance.options[:del]&.split(',')&.map { |m| m.to_sym } || []
@@ -125,6 +139,11 @@ module Abot
125
139
  def binance_account
126
140
  BinanceAccount.new(DatabaseTable::API_KEY, DatabaseTable::SECRET_KEY)
127
141
  end
142
+
143
+ def update_time
144
+ sec = Info::OptionParser.instance.options[:update_time].to_i
145
+ sec > 10 ? sec : 10
146
+ end
128
147
  end
129
148
  end
130
149
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: abot-info
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.2.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - w_dmitrii
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-08-19 00:00:00.000000000 Z
11
+ date: 2021-09-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -122,6 +122,20 @@ dependencies:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
124
  version: 1.3.1
125
+ - !ruby/object:Gem::Dependency
126
+ name: telegram-bot-ruby
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: 0.16.0
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: 0.16.0
125
139
  description:
126
140
  email:
127
141
  - wiz.work2021@gmail.com
@@ -146,6 +160,7 @@ files:
146
160
  - lib/abot/info/helpers.rb
147
161
  - lib/abot/info/option_parser.rb
148
162
  - lib/abot/info/table.rb
163
+ - lib/abot/info/telegram_sender.rb
149
164
  - lib/abot/info/version.rb
150
165
  - spec/abot/statistics_spec.rb
151
166
  homepage: