lita-chilean-bip 1.0.0 → 1.1.0

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
  SHA1:
3
- metadata.gz: cd1046dde727035c3d52c48ee9d286c7dc56c9bb
4
- data.tar.gz: 53c0e721e9d6598e8200c663507db63e5f8aadba
3
+ metadata.gz: 190ff3e223f889a9963bc190ace1a1f658e23fd8
4
+ data.tar.gz: 081c324ca3c43d485141f570238c21c15bc3ff0c
5
5
  SHA512:
6
- metadata.gz: d3b5b3b7a703f03295603c95809d205d54832eab35d1c00bfcc649a5cb13385cbb0965a470df028bc5e9a729da31b9b0c0b1afd8182bb13c71390292610f8180
7
- data.tar.gz: 4a8dd33034fc48d148944626dc9d33a5be6f46436a97d23208920b5e899925f9263d108af28279f494e517eae22edcd9013a35fb72a39c614fc1bc5d26369e8a
6
+ metadata.gz: 673a460c18b2a11ef904fab2d9f508460f12c3a258c119f7b53beedb110375c4013946ff6cbeb49df260bffbcaf88894f310ee0679325766556994508f53f451
7
+ data.tar.gz: e81fe14a20c9639e8a5209078ab88a2f6e23e941c650da81de069c977412aea184800064840d157d9699f2d3600f530764eb2459766472ba62d92d68692eef9b
@@ -1,90 +1,90 @@
1
+ require 'net/http'
2
+
1
3
  module Lita
2
4
  module Handlers
3
- class Gitlab < Handler
5
+ class ChileanBip < Handler
6
+
7
+ REDIS_KEY = 'lita-chilean-bip'
4
8
 
5
- def self.default_config(config)
6
- config.default_room = '#general'
9
+ route %r{^bip\s*(\d+)}i, :bip_balance, help: { 'bip ...' => 'gets the balance for BIP card ...' }
10
+ route %r{^my bip is (\d+)}i, :store_bip, help: { 'my bip is ...' => "stores the user's BIP card ..." }
11
+ route %r{^bip}i, :stored_bip_balance, help: { 'bip' => "gets the balance for stored user's BIP card" }
12
+
13
+ def bip_balance(response)
14
+ card_number = card_number_from_response(response)
15
+ return response.reply interpolate_message('invalid_number') unless validate_card_number card_number
16
+ balance_for_card_number(card_number, response)
7
17
  end
8
18
 
9
- http.post '/lita/gitlab', :receive
19
+ def store_bip(response)
20
+ card_number = card_number_from_response(response)
21
+ return response.reply interpolate_message('invalid_number') unless validate_card_number card_number
22
+ key_user = key_from_user response.user
23
+ redis.hset(REDIS_KEY, key_user, card_number)
24
+ response.reply interpolate_message('card_stored', {})
25
+ end
10
26
 
11
- def receive(request, response)
12
- json_body = request.params['payload'] || extract_json_from_request(request)
13
- data = symbolize parse_payload(json_body)
14
- message = format_message(data)
15
- targets = request.params['targets'] || '#general'
16
- rooms = []
17
- targets.split(',').each do |param_target|
18
- rooms << param_target
19
- end
20
- rooms.each do |room|
21
- target = Source.new(room: room)
22
- robot.send_message(target, message)
23
- end
27
+ def stored_bip_balance(response)
28
+ key_user = key_from_user response.user
29
+ card_number = redis.hget(REDIS_KEY, key_user)
30
+ balance_for_card_number(card_number, response)
24
31
  end
25
32
 
26
33
  private
27
34
 
28
- def extract_json_from_request(request)
29
- request.body.rewind
30
- request.body.read
35
+ def card_number_from_response(response)
36
+ response.matches[0][0]
31
37
  end
32
38
 
33
- def format_message(data)
34
- data.key?(:event_name) ? system_message(data) : web_message(data)
39
+ def key_from_user(user)
40
+ user.to_s.downcase.strip
35
41
  end
36
42
 
37
- def system_message(data)
38
- build_message "system.#{data[:event_name]}", data
39
- rescue
40
- Lita.logger.warn "Error formatting message: #{data.inspect}"
43
+ def balance_for_card_number(card_number, response)
44
+ html = post_query_for_card card_number
45
+ data = parse_data_from_html html
46
+ return response.reply interpolate_message('service_down') if data[:balance] =~ /.*mal.*/
47
+ response.reply interpolate_message('actual_balance', data)
41
48
  end
42
49
 
43
- def web_message(data)
44
- if data.key? :object_kind
45
- if data[:object_attributes].key? :target_branch
46
- # Merge request
47
- data[:object_attributes][:link] = "#{data[:object_attributes][:target_branch]}/#{data[:object_attributes][:iid]}"
48
- build_message "web.#{data[:object_kind]}.#{data[:object_attributes][:state]}", data[:object_attributes]
49
- else
50
- # Issue
51
- build_message "web.#{data[:object_kind]}.#{data[:object_attributes][:state]}", data[:object_attributes]
52
- end
53
- else
54
- # Push has no object kind
55
- branch = data[:ref].split('/').drop(2).join('/')
56
- data[:link] = data[:repository][:name]
57
- if data[:before] =~ /^0+$/
58
- build_message 'web.push.new_branch', data
59
- else
60
- build_message 'web.push.add_to_branch', data
61
- end
62
- end
63
- rescue
64
- Lita.logger.warn "Error formatting message: #{data.inspect}"
50
+ def validate_card_number(card_number)
51
+ card_number =~ /\d{8}/
65
52
  end
66
53
 
67
- # General methods
54
+ def post_query_for_card(card_number)
55
+ headers = {
56
+ 'Content-Type' => 'application/x-www-form-urlencoded',
57
+ 'Host' => 'saldobip.com',
58
+ 'Origin' => 'http://saldobip.com',
59
+ 'Referer' => 'http://saldobip.com/',
60
+ 'User-Agent' => 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36'
61
+ }
68
62
 
69
- def build_message(key, data)
70
- t(key) % data
71
- end
63
+ conn = Faraday.new(:url => 'http://saldobip.com') do |faraday|
64
+ faraday.request :url_encoded # form-encode POST params
65
+ faraday.response :logger # log requests to STDOUT
66
+ faraday.adapter Faraday.default_adapter # make requests with Net::HTTP
67
+ end
72
68
 
73
- def parse_payload(payload)
74
- MultiJson.load(payload)
75
- rescue MultiJson::LoadError => e
76
- Lita.logger.error("Could not parse JSON payload from Github: #{e.message}")
77
- return
69
+ response = conn.post '/', { NumTarjeta: card_number, pedirSaldo: '' }, headers
70
+ response.body
78
71
  end
79
72
 
80
- def symbolize(obj)
81
- return obj.inject({}){|memo,(k,v)| memo[k.to_sym] = symbolize(v); memo} if obj.is_a? Hash
82
- return obj.inject([]){|memo,v | memo << symbolize(v); memo} if obj.is_a? Array
83
- return obj
73
+ def parse_data_from_html(response)
74
+ tag_data = []
75
+ doc = Nokogiri::HTML(response)
76
+ doc.css('#resultados #datos strong').each do |tag|
77
+ tag_data << tag.content
78
+ end
79
+ data = tag_data.empty? ? {} : { balance: tag_data[0], date: tag_data[1] }
80
+ data
84
81
  end
85
82
 
83
+ def interpolate_message(key, data={})
84
+ t(key) % data
85
+ end
86
86
  end
87
87
 
88
- Lita.register_handler(Gitlab)
88
+ Lita.register_handler(ChileanBip)
89
89
  end
90
90
  end
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = 'lita-chilean-bip'
3
- spec.version = '1.0.0'
3
+ spec.version = '1.1.0'
4
4
  spec.authors = ['Emilio Figueroa']
5
5
  spec.email = ['emiliofigueroatorres@gmail.com']
6
6
  spec.description = %q{A Lita handler for checking the BIP card balance}
data/locales/en.yml CHANGED
@@ -2,6 +2,7 @@ en:
2
2
  lita:
3
3
  handlers:
4
4
  chilean_bip:
5
+ card_stored: "Yay! I'll remember it for later."
5
6
  invalid_number: "Mmmh.. It seems like you gave me an invalid number"
6
7
  service_down: "Ouch! I can't get your balance for now"
7
- actual_balance: "Your Balance: %{balance} (to date %{date})"
8
+ actual_balance: "..and your balance is: %{balance} (until %{date})"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lita-chilean-bip
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Emilio Figueroa