lita-onewheel-finance 0.6.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '0650867d30743080da877fdbad93bd7ddbd9f525a7921fa566c7da0a64d9850c'
4
- data.tar.gz: 0ad45310e357e2e5ed9b2e10bb1721cd0ba91da863507ff5a4dc728b10f14bd9
3
+ metadata.gz: ef2f754f9b1fe08aa1fe7749a6cc7b338e83b0ecb5d2745decb441f8773f278e
4
+ data.tar.gz: 95d1163691c52c32eeae155112c0d86fad7bec95226ec56156e28ef94eceb616
5
5
  SHA512:
6
- metadata.gz: 495d556d163bf461fa1d521ed7176054636a591c1fb2772fcad41634740bc54d5bc4c8d8a464dc936a58d9eb2d6066336fed012bed60e292949bdc5344b3e677
7
- data.tar.gz: 9b7bc63735e850c56bfe52dd83d39cce2979be507b400237dea7b5f30b50ba35fad55dd5f24fe220b9f927da241295ac65dd73a41426f23bc93a2cc99b933be6
6
+ metadata.gz: 33982576f1623d697254375a928dab14974cac4173d8f6079d30c381d8ce56b62d13013ec799f7ca07c1b6e6c8a5f585cdce4d2ae0aaa329072483890b155e71
7
+ data.tar.gz: cd8eb5c4a74651005cf8579511af016206fbceca03337c4b323b892e6c4204057c8d7df8bc00b05c7df5788648aa7ce0940197c2533ed920d0488c5e4d5d40cb
@@ -0,0 +1,68 @@
1
+ class AlphaVantageQuote
2
+ attr_reader :open, :high, :low, :price, :volume, :trading_day, :prev_close, :change, :change_percent, :exchange, :error, :name, :message, :is_index
3
+ attr_accessor :symbol
4
+
5
+ def initialize(symbol, apikey)
6
+ # Lita.logger.debug "parsing: #{json_blob}"
7
+ # hash = JSON.parse(json_blob)
8
+ @symbol = symbol
9
+ @apikey = apikey
10
+ @is_index = false
11
+
12
+ if @symbol[0] == '^'
13
+ @is_index = true
14
+ end
15
+
16
+ response = call_api
17
+ hash = JSON.parse response
18
+
19
+ quote = hash["Global Quote"]
20
+
21
+ quote.keys.each do |key|
22
+ case key
23
+ when "01. symbol"
24
+ @symbol = quote[key]
25
+ when "02. open"
26
+ @open = self.fix_number quote[key]
27
+ when "03. high"
28
+ @high = self.fix_number quote[key]
29
+ when "04. low"
30
+ @low = self.fix_number quote[key]
31
+ when "05. price"
32
+ @price = self.fix_number quote[key]
33
+ when "06. volume"
34
+ @volume = quote[key]
35
+ when "07. latest trading day"
36
+ @trading_day = quote[key]
37
+ when "08. previous close"
38
+ @prev_close = self.fix_number quote[key]
39
+ when "09. change"
40
+ @change = self.fix_number quote[key]
41
+ when "10. change percent"
42
+ @change_percent = self.fix_number quote[key]
43
+ end
44
+ end
45
+ end
46
+
47
+ def fix_number(price_str)
48
+ price_str.to_f.round(2)
49
+ end
50
+
51
+ def is_index?
52
+ @is_index
53
+ end
54
+
55
+ def call_api
56
+ url = "https://www.alphavantage.co/query"
57
+ params = {function: 'GLOBAL_QUOTE', symbol: @symbol, apikey: @apikey}
58
+ Lita.logger.debug "#{url} #{params.inspect}"
59
+ response = RestClient.get url, {params: params}
60
+
61
+ # if @exchange
62
+ # params[:stock_exchange] = @exchange
63
+ # end
64
+
65
+ Lita.logger.debug "response: #{response}"
66
+ response
67
+ end
68
+ end
@@ -0,0 +1,43 @@
1
+ module IrcColors
2
+ prefix = "\x03"
3
+ @white = "#{prefix}00"
4
+ @black = "#{prefix}01"
5
+ @blue = "#{prefix}02"
6
+ @green = "#{prefix}03"
7
+ @red = "#{prefix}04"
8
+ @brown = "#{prefix}05"
9
+ @purple = "#{prefix}06"
10
+ @orange = "#{prefix}07"
11
+ @yellow = "#{prefix}08"
12
+ @lime = "#{prefix}09"
13
+ @teal = "#{prefix}10"
14
+ @aqua = "#{prefix}11"
15
+ @royal = "#{prefix}12"
16
+ @pink = "#{prefix}13"
17
+ @grey = "#{prefix}14"
18
+ @silver = "#{prefix}15"
19
+ @reset = prefix
20
+
21
+ class << self
22
+ attr_reader :white,
23
+ :black,
24
+ :blue,
25
+ :green,
26
+ :red,
27
+ :brown,
28
+ :purple,
29
+ :orange,
30
+ :yellow,
31
+ :lime,
32
+ :teal,
33
+ :aqua,
34
+ :royal,
35
+ :pink,
36
+ :grey,
37
+ :silver,
38
+ :reset
39
+ end
40
+
41
+ def initialize
42
+ end
43
+ end
@@ -1,226 +1,32 @@
1
+ require_relative 'irc_colors'
2
+ require_relative 'alphavantage_quote'
3
+ require_relative 'worldtradedata_quote'
4
+ require_relative 'yahoo_quote'
1
5
  require 'rest-client'
2
6
 
3
- class IrcColors
4
- prefix = "\x03"
5
- @white = "#{prefix}00"
6
- @black = "#{prefix}01"
7
- @blue = "#{prefix}02"
8
- @green = "#{prefix}03"
9
- @red = "#{prefix}04"
10
- @brown = "#{prefix}05"
11
- @purple = "#{prefix}06"
12
- @orange = "#{prefix}07"
13
- @yellow = "#{prefix}08"
14
- @lime = "#{prefix}09"
15
- @teal = "#{prefix}10"
16
- @aqua = "#{prefix}11"
17
- @royal = "#{prefix}12"
18
- @pink = "#{prefix}13"
19
- @grey = "#{prefix}14"
20
- @silver = "#{prefix}15"
21
- @reset = prefix
22
-
23
- class << self
24
- attr_reader :white,
25
- :black,
26
- :blue,
27
- :green,
28
- :red,
29
- :brown,
30
- :purple,
31
- :orange,
32
- :yellow,
33
- :lime,
34
- :teal,
35
- :aqua,
36
- :royal,
37
- :pink,
38
- :grey,
39
- :silver,
40
- :reset
41
- end
42
-
43
- def initialize
44
- end
45
- end
46
-
47
- class AlphaVantageQuote
48
- attr_reader :symbol, :open, :high, :low, :price, :volume, :trading_day, :prev_close, :change, :change_percent
49
-
50
- def initialize(json_blob)
51
- Lita.logger.debug "parsing: #{json_blob}"
52
- hash = JSON.parse(json_blob)
53
- quote = hash["Global Quote"]
54
-
55
- quote.keys.each do |key|
56
- case key
57
- when "01. symbol"
58
- @symbol = quote[key]
59
- when "02. open"
60
- @open = self.fix_number quote[key]
61
- when "03. high"
62
- @high = self.fix_number quote[key]
63
- when "04. low"
64
- @low = self.fix_number quote[key]
65
- when "05. price"
66
- @price = self.fix_number quote[key]
67
- when "06. volume"
68
- @volume = quote[key]
69
- when "07. latest trading day"
70
- @trading_day = quote[key]
71
- when "08. previous close"
72
- @prev_close = self.fix_number quote[key]
73
- when "09. change"
74
- @change = self.fix_number quote[key]
75
- when "10. change percent"
76
- @change_percent = self.fix_number quote[key]
77
- end
78
- end
79
- end
80
-
81
- def fix_number(price_str)
82
- price_str.to_f.round(2)
83
- end
84
- end
85
-
86
- class WorldTradeDataQuote
87
- attr_reader :open, :high, :low, :price, :volume, :trading_day, :prev_close, :change, :change_percent, :exchange, :error, :name, :message, :is_index
88
- attr_accessor :symbol
89
-
90
- def initialize(symbol, api_key)
91
- @base_uri = 'https://api.worldtradingdata.com/api/v1'
92
- @symbol = symbol
93
- @api_key = api_key
94
-
95
- if @symbol[':']
96
- (@exchange, @symbol) = @symbol.split /:/
97
- end
98
-
99
- if @symbol['^']
100
- @is_index = true
101
- else
102
- @is_index = false
103
- end
104
-
105
- self.call_api
106
-
107
- hash = JSON.parse(@response)
108
-
109
- # We couldn't find the stock. Let's look for it real quick.
110
- if hash['Message'].to_s.include? 'Error'
111
- @error = true
112
- self.run_search
113
-
114
- if @message
115
- @error = true
116
- return
117
- else
118
- self.call_api
119
- hash = JSON.parse(@response)
120
- @error = false
121
- end
122
- else
123
- @error = false
124
- end
125
-
126
- unless hash['data']
127
- @message = "Error getting data for #{@symbol}"
128
- @error = true
129
- return
130
- end
131
-
132
- quote = hash['data'][0]
133
-
134
- quote.keys.each do |key|
135
- case key
136
- when "symbol"
137
- @symbol = quote[key]
138
- when "price_open"
139
- @open = self.fix_number quote[key]
140
- when "day_high"
141
- @high = self.fix_number quote[key]
142
- when "day_low"
143
- @low = self.fix_number quote[key]
144
- when "price"
145
- @price = self.fix_number quote[key]
146
- when "volume"
147
- @volume = quote[key].to_i
148
- when "last_trade_time"
149
- @trading_day = quote[key]
150
- when "08. previous close"
151
- @prev_close = self.fix_number quote[key]
152
- when "day_change"
153
- @change = self.fix_number quote[key]
154
- when "change_pct"
155
- @change_percent = self.fix_number quote[key]
156
- when 'stock_exchange_short'
157
- @exchange = quote[key].sub /NYSEARCA/, 'NYSE'
158
- when 'name'
159
- @name = quote[key]
160
- end
161
- end
162
-
163
- def is_index?
164
- is_index
165
- end
166
- end
167
-
168
- # Let's see what we can get from the api.
169
- def call_api
170
- url = "#{@base_uri}/stock"
171
- params = {symbol: @symbol, api_token: @api_key}
172
-
173
- if @exchange
174
- params[:stock_exchange] = @exchange
175
- end
176
-
177
- Lita.logger.debug "call_api: #{url} #{params.inspect}"
178
-
179
- @response = RestClient.get url, {params: params}
180
-
181
- Lita.logger.debug "response: #{@response}"
182
- end
183
-
184
- def run_search
185
- url = "#{@base_uri}/stock_search"
186
- params = {search_term: @symbol,
187
- search_by: 'symbol,name',
188
- stock_exchange: 'NASDAQ,NYSE',
189
- limit: 5,
190
- page: 1,
191
- api_token: @api_key
192
- }
193
-
194
- Lita.logger.debug "run_search: #{url} #{params.inspect}"
195
-
196
- response = RestClient.get url, {params: params}
197
-
198
- Lita.logger.debug "response: #{response}"
199
- result = JSON.parse(response)
200
-
201
- if result['total_returned'] == 1
202
- @symbol = result['data'][0]['symbol']
203
- elsif result['total_returned'].to_i > 1
204
- Lita.logger.debug "many search results: #{result.inspect}"
205
- x = result['data'].map { |k| k.values[0] }
206
- @message = "`#{symbol}` not found, did you mean one of #{x.join(', ')}?"
207
- end
208
- end
209
-
210
- def fix_number(price_str)
211
- price_str.to_f.round(2)
212
- end
213
- end
214
-
215
7
  module Lita
216
8
  module Handlers
217
9
  class OnewheelFinance < Handler
218
10
  config :apikey, required: true
11
+ config :mode, default: 'irc'
12
+ config :handler, default: 'alphavantage'
219
13
  route /qu*o*t*e*\s+(.+)/i, :handle_quote, command: true
14
+ # route /q2\s+(.+)/i, :handle_alphavantage, command: true
220
15
 
221
16
  def handle_quote(response)
222
- stock = handle_world_trade_data response.matches[0][0]
17
+ stock = nil
18
+ if config.handler == 'worldtradedata'
19
+ stock = handle_world_trade_data response.matches[0][0]
20
+ elsif config.handler == 'alphavantage'
21
+ stock = handle_alphavantage response.matches[0][0]
22
+ elsif config.handler == 'yahoo'
23
+ stock = handle_yahoo response.matches[0][0]
24
+ else
25
+ Lita.logger.error "Unknown/missing config.handler #{config.handler}. Try 'worldtradedata' or 'alphavantage'"
26
+ return
27
+ end
223
28
 
29
+ # Continue!
224
30
  if stock.error
225
31
  if stock.message
226
32
  str = stock.message
@@ -233,14 +39,27 @@ module Lita
233
39
  dollar_sign = ''
234
40
  end
235
41
 
236
- str = "#{IrcColors::grey}#{stock.exchange} - #{IrcColors::reset}#{stock.symbol}: #{IrcColors::blue}#{dollar_sign}#{stock.price}#{IrcColors::reset} "
237
- if stock.change >= 0
238
- # if irc
239
- str += "#{IrcColors::green} ⬆#{dollar_sign}#{stock.change}#{IrcColors::reset}, #{IrcColors::green}#{stock.change_percent}%#{IrcColors::reset} "
240
- str += "#{IrcColors::grey}(#{stock.name})#{IrcColors::reset}"
42
+ # IRC mode
43
+ if config.mode == 'irc'
44
+ str = "#{IrcColors::grey}#{stock.exchange} - #{IrcColors::reset}#{stock.symbol}: #{IrcColors::blue}#{dollar_sign}#{stock.price}#{IrcColors::reset} "
45
+ if stock.change >= 0
46
+ # if irc
47
+ str += "#{IrcColors::green} ⬆#{dollar_sign}#{stock.change}#{IrcColors::reset}, #{IrcColors::green}#{stock.change_percent}%#{IrcColors::reset} "
48
+ str += "#{IrcColors::grey}(#{stock.name})#{IrcColors::reset}"
49
+ else
50
+ str += "#{IrcColors::red} ↯#{dollar_sign}#{stock.change}#{IrcColors::reset}, #{IrcColors::red}#{stock.change_percent}%#{IrcColors::reset} "
51
+ str += "#{IrcColors::grey}(#{stock.name})#{IrcColors::reset}"
52
+ end
241
53
  else
242
- str += "#{IrcColors::red} ↯#{dollar_sign}#{stock.change}#{IrcColors::reset}, #{IrcColors::red}#{stock.change_percent}%#{IrcColors::reset} "
243
- str += "#{IrcColors::grey}(#{stock.name})#{IrcColors::reset}"
54
+ str = "#{stock.exchange} - #{stock.symbol}: #{dollar_sign}#{stock.price} "
55
+ if stock.change >= 0
56
+ # if irc
57
+ str += " :arrow_up:#{dollar_sign}#{stock.change}, :heavy_plus_sign:#{stock.change_percent}% "
58
+ str += "(#{stock.name})"
59
+ else
60
+ str += " :chart_with_downwards_trend:#{dollar_sign}#{stock.change}, :heavy_minus_sign:#{stock.change_percent}% "
61
+ str += "(#{stock.name})"
62
+ end
244
63
  end
245
64
  end
246
65
 
@@ -256,13 +75,14 @@ module Lita
256
75
  end
257
76
 
258
77
  # deprecated for now
259
- #def handle_alphavantage
260
- # url = "https://www.alphavantage.co/query"
261
- # params = {function: 'GLOBAL_QUOTE', symbol: response.matches[0][0], apikey: config.apikey}
262
- # Lita.logger.debug "#{url} #{params.inspect}"
263
- # resp = RestClient.get url, {params: params}
264
- # stock = GlobalQuote.new resp
265
- #end
78
+ def handle_alphavantage(symbol)
79
+ stock = AlphaVantageQuote.new symbol, config.apikey
80
+ end
81
+
82
+ # welp
83
+ def handle_yahoo(symbol)
84
+ stock = YahooQuote.new symbol, config.apikey
85
+ end
266
86
 
267
87
  Lita.register_handler(self)
268
88
  end
@@ -0,0 +1,128 @@
1
+ class WorldTradeDataQuote
2
+ attr_reader :open, :high, :low, :price, :volume, :trading_day, :prev_close, :change, :change_percent, :exchange, :error, :name, :message, :is_index
3
+ attr_accessor :symbol
4
+
5
+ def initialize(symbol, api_key)
6
+ @base_uri = 'https://api.worldtradingdata.com/api/v1'
7
+ @symbol = symbol
8
+ @api_key = api_key
9
+
10
+ if @symbol[':']
11
+ (@exchange, @symbol) = @symbol.split /:/
12
+ end
13
+
14
+ if @symbol['^']
15
+ @is_index = true
16
+ else
17
+ @is_index = false
18
+ end
19
+
20
+ self.call_api
21
+
22
+ hash = JSON.parse(@response)
23
+
24
+ # We couldn't find the stock. Let's look for it real quick.
25
+ if hash['Message'].to_s.include? 'Error'
26
+ @error = true
27
+ self.run_search
28
+
29
+ if @message
30
+ @error = true
31
+ return
32
+ else
33
+ self.call_api
34
+ hash = JSON.parse(@response)
35
+ @error = false
36
+ end
37
+ else
38
+ @error = false
39
+ end
40
+
41
+ unless hash['data']
42
+ @message = "Error getting data for #{@symbol}"
43
+ @error = true
44
+ return
45
+ end
46
+
47
+ quote = hash['data'][0]
48
+
49
+ quote.keys.each do |key|
50
+ case key
51
+ when "symbol"
52
+ @symbol = quote[key]
53
+ when "price_open"
54
+ @open = self.fix_number quote[key]
55
+ when "day_high"
56
+ @high = self.fix_number quote[key]
57
+ when "day_low"
58
+ @low = self.fix_number quote[key]
59
+ when "price"
60
+ @price = self.fix_number quote[key]
61
+ when "volume"
62
+ @volume = quote[key].to_i
63
+ when "last_trade_time"
64
+ @trading_day = quote[key]
65
+ when "08. previous close"
66
+ @prev_close = self.fix_number quote[key]
67
+ when "day_change"
68
+ @change = self.fix_number quote[key]
69
+ when "change_pct"
70
+ @change_percent = self.fix_number quote[key]
71
+ when 'stock_exchange_short'
72
+ @exchange = quote[key].sub /NYSEARCA/, 'NYSE'
73
+ when 'name'
74
+ @name = quote[key]
75
+ end
76
+ end
77
+
78
+ def is_index?
79
+ is_index
80
+ end
81
+ end
82
+
83
+ # Let's see what we can get from the api.
84
+ def call_api
85
+ url = "#{@base_uri}/stock"
86
+ params = {symbol: @symbol, api_token: @api_key}
87
+
88
+ if @exchange
89
+ params[:stock_exchange] = @exchange
90
+ end
91
+
92
+ Lita.logger.debug "call_api: #{url} #{params.inspect}"
93
+
94
+ @response = RestClient.get url, {params: params}
95
+
96
+ Lita.logger.debug "response: #{@response}"
97
+ end
98
+
99
+ def run_search
100
+ url = "#{@base_uri}/stock_search"
101
+ params = {search_term: @symbol,
102
+ search_by: 'symbol,name',
103
+ stock_exchange: 'NASDAQ,NYSE',
104
+ limit: 5,
105
+ page: 1,
106
+ api_token: @api_key
107
+ }
108
+
109
+ Lita.logger.debug "run_search: #{url} #{params.inspect}"
110
+
111
+ response = RestClient.get url, {params: params}
112
+
113
+ Lita.logger.debug "response: #{response}"
114
+ result = JSON.parse(response)
115
+
116
+ if result['total_returned'] == 1
117
+ @symbol = result['data'][0]['symbol']
118
+ elsif result['total_returned'].to_i > 1
119
+ Lita.logger.debug "many search results: #{result.inspect}"
120
+ x = result['data'].map { |k| k.values[0] }
121
+ @message = "`#{symbol}` not found, did you mean one of #{x.join(', ')}?"
122
+ end
123
+ end
124
+
125
+ def fix_number(price_str)
126
+ price_str.to_f.round(2)
127
+ end
128
+ end