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.
- checksums.yaml +15 -0
- data/lib/behave.rb +185 -0
- metadata +73 -0
checksums.yaml
ADDED
@@ -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=
|
data/lib/behave.rb
ADDED
@@ -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:
|