behave.io 0.0.1

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.
Files changed (3) hide show
  1. checksums.yaml +15 -0
  2. data/lib/behave.rb +185 -0
  3. metadata +73 -0
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ ZjZlMzdjY2Y4N2NlNDdhY2Q1OTJjMTc3ZGJjMzllN2I3MTk1NDBjMQ==
5
+ data.tar.gz: !binary |-
6
+ NjY1MDQ2NjBjNjY0YTkxZjFiZjk2ODIxYzIwNjNiYjhlYWQ1MjI0OA==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ YTc2ODI2ZTQ0M2YxNWQwZTk3NTkxYzRhNzBhYjMyNWU1ZTgxOTE2OGY4YTJl
10
+ MTFhMTVlYWQwMTBkZmZkMTEwZjkxNzI1ZGYzODY2Yzk3Yzc3OTQwYWU5Nzg2
11
+ YjZjOTBhODYyNTMzMjllMWRlNTIyNTY3NTA0MDliZTQxMTI5Y2Q=
12
+ data.tar.gz: !binary |-
13
+ ZTMwOWMxNjUxY2UwZmU5ZDNhNjlkYzBlMTQxNDRmZTk3YTRiN2NmY2NlZWI0
14
+ MjNlNWJiOGQwMzEyNDI4MDRkNTNjNTU5OGU5YjJkMzEyYTY4N2RkYzllYmQz
15
+ ODI3ZjkzNjhlNjk0ZDMzZTY4N2I2ZDcwMTAxYTRjZjA3NGM2NDA=
@@ -0,0 +1,185 @@
1
+ require 'httparty'
2
+ require 'json'
3
+
4
+ module Behave
5
+
6
+ include HTTParty
7
+
8
+ base_uri 'http://api.behave.io'
9
+ format :json
10
+ headers 'Content-Type' => 'application/json'
11
+
12
+ def self.init(token)
13
+ headers 'X-Behave-Api-Token' => token
14
+ end
15
+
16
+ def self.api(path, method=:get, options={})
17
+ # Convert body object to JSON string as the API only accepts JSON body
18
+ options[:body] = options[:body].to_json if options.has_key? :body
19
+ result = self.send method, path, options
20
+ raise Error.new(result.code), result.message if result.code != 200
21
+ # Empty response
22
+ return {} unless result.parsed_response["data"]
23
+ #
24
+ # @TODO: refactor - ugly hack we use Utils.symbolize_keys to change the type of the keys (string -> symbol)
25
+ #
26
+ # If response is a single object (Hash)
27
+ if result.parsed_response["data"].kind_of? Hash
28
+ return Utils.symbolize_keys result.parsed_response["data"]
29
+ # If response is an array of Hash
30
+ elsif result.parsed_response["data"].kind_of? Array
31
+ return result.parsed_response["data"].map {|h| Utils.symbolize_keys h}
32
+ end
33
+ end
34
+
35
+ def self.track(playerId, event, context={})
36
+ result = api "/players/#{playerId}/track", :post,
37
+ body: {
38
+ verb: event,
39
+ context: context
40
+ }
41
+ yield result if block_given?
42
+ result
43
+ end
44
+
45
+ def self.identify(playerId, traits={})
46
+ api "/players/#{playerId}/identify", :post,
47
+ body: {
48
+ traits: traits
49
+ }
50
+ end
51
+
52
+ class Player
53
+
54
+ # Fetch player's rank on a specific leaderboard
55
+ def self.rank(playerId, leaderboardId)
56
+ res = ranks playerId, leaderboards: [leaderboardId]
57
+ res[0]
58
+ end
59
+
60
+ # Fetch player's ranks on leaderboards is in
61
+ def self.ranks(playerId, options={})
62
+ options[:player_id] = playerId
63
+ Behave.api "/leaderboards/player-results", :post, body: options
64
+ end
65
+
66
+ # Fetch player's unlocked badges
67
+ def self.badges(playerId)
68
+ Behave.api "/players/#{playerId}/badges"
69
+ end
70
+
71
+ # Fetch player's locked badges
72
+ def self.lockedBadges(playerId)
73
+ Behave.api "/players/#{playerId}/badges/todo"
74
+ end
75
+
76
+ # Add an identity to the player (facebook, twitter, ...)
77
+ def self.addIdentity(playerId, identity, provider)
78
+ Behave.api "/players/#{playerId}/identities", :post,
79
+ body: {
80
+ reference_id: identity,
81
+ provider: provider
82
+ }
83
+ end
84
+
85
+ # Remove an identity from the player
86
+ def self.removeIdentity(playerId, provider)
87
+ Behave.api "/players/#{playerId}/identities/#{provider}", :delete
88
+ end
89
+
90
+ end
91
+
92
+ class Badge
93
+
94
+ # Remove a badge
95
+ def self.delete(badgeId)
96
+ Behave.api "/badges/#{badgeId}", :delete
97
+ end
98
+
99
+ end
100
+
101
+ class Leaderboard
102
+
103
+ module Config
104
+ TYPE_SCORE = 0
105
+ TYPE_BEHAVIOURAL = 1
106
+
107
+ TIME_ALLTIME = 0
108
+ TIME_DAILY = 1
109
+ TIME_WEEKLY = 2
110
+ TIME_MONTHLY = 3
111
+
112
+ SCORE_MAX = 0
113
+ SCORE_SUM = 1
114
+ end
115
+
116
+ # Create a new leaderboard
117
+ def self.create(name, referenceId, attrs={})
118
+ attrs[:name] = name
119
+ attrs[:reference_id] = referenceId
120
+ Behave.api "/leaderboards", :post, body: attrs
121
+ end
122
+
123
+ # Remove a leaderboard
124
+ def self.delete(leaderboardId)
125
+ Behave.api "/leaderboards/#{leaderboardId}", :delete
126
+ end
127
+
128
+ # Fetch leaderboard results
129
+ def self.results(leaderboardId, options={})
130
+ options[:limit] ||= 1000
131
+ options[:max] ||= 0
132
+ options[:page] ||= 1
133
+ begin
134
+ options[:offset] = (options[:page] - 1) * options[:limit]
135
+ res = Behave.api "/leaderboards/#{leaderboardId}/results", :post, body: options
136
+ count = res.count
137
+ # Get total fetched since start of iteration
138
+ total = (options[:page] - 1) * options[:limit] + count
139
+ # If above, keep only needed elements
140
+ res = res[0..(count - (total - options[:max]))] if options[:max] > 0 && total > options[:max]
141
+ return res unless block_given?
142
+ yield res, options[:page]
143
+ options[:page] += 1
144
+ # Continue wgile still need to fetch more results
145
+ end while count > 0 && count == options[:limit] && (options[:max] == 0 || total < options[:max])
146
+ end
147
+ end
148
+
149
+ class Error < StandardError
150
+ attr_reader :code
151
+
152
+ def initialize(code)
153
+ @code = code
154
+ end
155
+ end
156
+
157
+ class Utils
158
+ def self.symbolize_keys(hash)
159
+ hash.inject({}) do |memo, (k,v)|
160
+ if v.kind_of? Hash
161
+ memo[k.to_sym] = symbolize_keys v
162
+ elsif v.kind_of? Array
163
+ memo[k.to_sym] = v.map {|x| x.kind_of?(Hash) ? symbolize_keys(x) : x}
164
+ else
165
+ memo[k.to_sym] = v
166
+ end
167
+ memo
168
+ end
169
+ end
170
+
171
+ def self.symbolize_keys!(hash)
172
+ hash.each_key do |key|
173
+ val = hash[key]
174
+ if val.kind_of? Hash
175
+ symbolize_keys! val
176
+ elsif val.kind_of? Array
177
+ val.each {|x| symbolize_keys!(x) if x.kind_of?(Hash) }
178
+ else
179
+ hash[key.to_sym] = hash.delete[key]
180
+ end
181
+ end
182
+ end
183
+ end
184
+
185
+ end
metadata ADDED
@@ -0,0 +1,73 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: behave.io
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Olivier Thierry
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-02-28 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: json
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.8'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.8'
27
+ - !ruby/object:Gem::Dependency
28
+ name: httparty
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '0.13'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '0.13'
41
+ description: Behave.io SDK for ruby integration
42
+ email: olivier@behave.io
43
+ executables: []
44
+ extensions: []
45
+ extra_rdoc_files: []
46
+ files:
47
+ - lib/behave.rb
48
+ homepage: http://behave.io
49
+ licenses:
50
+ - MIT
51
+ metadata: {}
52
+ post_install_message:
53
+ rdoc_options: []
54
+ require_paths:
55
+ - lib
56
+ required_ruby_version: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ! '>='
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ required_rubygems_version: !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ requirements: []
67
+ rubyforge_project:
68
+ rubygems_version: 2.2.2
69
+ signing_key:
70
+ specification_version: 4
71
+ summary: Behave.io Ruby SDK
72
+ test_files: []
73
+ has_rdoc: