behave.io 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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: