lita-chilean-bip 1.0.0 → 1.1.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
  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