gamerocket 1.0.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 +7 -0
- data/LICENSE +24 -0
- data/README +52 -0
- data/Rakefile +48 -0
- data/lib/gamerocket/achievement.rb +26 -0
- data/lib/gamerocket/achievement_gateway.rb +19 -0
- data/lib/gamerocket/achievement_template.rb +15 -0
- data/lib/gamerocket/action.rb +26 -0
- data/lib/gamerocket/action_gateway.rb +30 -0
- data/lib/gamerocket/base_module.rb +36 -0
- data/lib/gamerocket/configuration.rb +121 -0
- data/lib/gamerocket/crypto.rb +46 -0
- data/lib/gamerocket/error_result.rb +15 -0
- data/lib/gamerocket/exceptions.rb +48 -0
- data/lib/gamerocket/game.rb +22 -0
- data/lib/gamerocket/game_gateway.rb +19 -0
- data/lib/gamerocket/gateway.rb +36 -0
- data/lib/gamerocket/http.rb +113 -0
- data/lib/gamerocket/player.rb +52 -0
- data/lib/gamerocket/player_gateway.rb +61 -0
- data/lib/gamerocket/purchase.rb +26 -0
- data/lib/gamerocket/purchase_gateway.rb +30 -0
- data/lib/gamerocket/successful_result.rb +20 -0
- data/lib/gamerocket/util.rb +138 -0
- data/lib/gamerocket/version.rb +9 -0
- data/lib/gamerocket.rb +45 -0
- metadata +97 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 37895025aecc1ccb572dc9432737f7a48afd3e44
|
4
|
+
data.tar.gz: 8cf474027374df10ffb4d511a74d3f9421b7d6f9
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 443abd226ecff43f51a2b4cd9ceb02ebfc6fdb9e1187dd37439482c2dccc94efed7916d3af3a05cfefee120026a3f784dd6b20682fefb1bafa00e0fed90bb091
|
7
|
+
data.tar.gz: 83e86b52cc1f95c066c5d64cdb1b07e8801ef93f77159e32563a3419868bc0cd749b4b9082c5165543d76f7465cda5fb955017d5f3f1dff484b4fec6c95a7313
|
data/LICENSE
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
(The MIT License)
|
2
|
+
|
3
|
+
Copyright (c) 2012-2013 Work Bandits
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person
|
6
|
+
obtaining a copy of this software and associated documentation
|
7
|
+
files (the "Software"), to deal in the Software without
|
8
|
+
restriction, including without limitation the rights to use,
|
9
|
+
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
10
|
+
copies of the Software, and to permit persons to whom the
|
11
|
+
Software is furnished to do so, subject to the following
|
12
|
+
conditions:
|
13
|
+
|
14
|
+
The above copyright notice and this permission notice shall be
|
15
|
+
included in all copies or substantial portions of the Software.
|
16
|
+
|
17
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
18
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
19
|
+
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
20
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
21
|
+
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
22
|
+
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
23
|
+
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
24
|
+
OTHER DEALINGS IN THE SOFTWARE.
|
data/README
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
= GameRocket Ruby Client Library
|
2
|
+
|
3
|
+
The GameRocket gem provides integration access to the GameRocket Gateway.
|
4
|
+
|
5
|
+
== Dependencies
|
6
|
+
|
7
|
+
* builder
|
8
|
+
* json
|
9
|
+
* base64
|
10
|
+
* cgi
|
11
|
+
|
12
|
+
== Quick Start Example
|
13
|
+
|
14
|
+
require "base64"
|
15
|
+
require "cgi"
|
16
|
+
require "date"
|
17
|
+
require "digest/sha2"
|
18
|
+
require "logger"
|
19
|
+
require "net/http"
|
20
|
+
require "net/https"
|
21
|
+
require "openssl"
|
22
|
+
require "stringio"
|
23
|
+
require "time"
|
24
|
+
require "zlib"
|
25
|
+
|
26
|
+
require "builder"
|
27
|
+
require "json"
|
28
|
+
require "gamerocket"
|
29
|
+
|
30
|
+
GameRocket::Configuration.environment = :development
|
31
|
+
GameRocket::Configuration.apiKey = "your_api_key"
|
32
|
+
GameRocket::Configuration.secretKey = "your_secret_key"
|
33
|
+
|
34
|
+
result = GameRocket::Player.create(
|
35
|
+
:name => "Bob",
|
36
|
+
:locale => "fr_FR"
|
37
|
+
)
|
38
|
+
|
39
|
+
if result.success?
|
40
|
+
p "success!"
|
41
|
+
else
|
42
|
+
p result.error
|
43
|
+
end
|
44
|
+
|
45
|
+
== Documentation
|
46
|
+
|
47
|
+
* Documentation[https://www.gamerocket.io:443/docs/ruby/guide/overview]
|
48
|
+
|
49
|
+
|
50
|
+
== License
|
51
|
+
|
52
|
+
See the LICENSE file.
|
data/Rakefile
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
#
|
2
|
+
# To change this template, choose Tools | Templates
|
3
|
+
# and open the template in the editor.
|
4
|
+
|
5
|
+
|
6
|
+
require 'rubygems'
|
7
|
+
require 'rake'
|
8
|
+
require 'rake/clean'
|
9
|
+
require 'rubygems/package_task'
|
10
|
+
require 'rdoc/task'
|
11
|
+
require 'rake/testtask'
|
12
|
+
|
13
|
+
spec = Gem::Specification.new do |s|
|
14
|
+
s.name = 'gamerocket'
|
15
|
+
s.version = '1.0.0'
|
16
|
+
s.has_rdoc = true
|
17
|
+
s.extra_rdoc_files = ['README', 'LICENSE']
|
18
|
+
s.summary = 'Your summary here'
|
19
|
+
s.description = s.summary
|
20
|
+
s.author = 'Work Bandits'
|
21
|
+
s.email = 'contact@gamerocket.io'
|
22
|
+
# s.executables = ['your_executable_here']
|
23
|
+
s.files = %w(LICENSE README Rakefile) + Dir.glob("{bin,lib,spec}/**/*")
|
24
|
+
s.require_path = "lib"
|
25
|
+
s.bindir = "bin"
|
26
|
+
s.add_dependency "builder", ">= 2.0.0"
|
27
|
+
s.add_dependency "json"
|
28
|
+
end
|
29
|
+
|
30
|
+
Gem::PackageTask.new(spec) do |p|
|
31
|
+
p.gem_spec = spec
|
32
|
+
p.need_tar = true
|
33
|
+
p.need_zip = true
|
34
|
+
end
|
35
|
+
|
36
|
+
Rake::RDocTask.new do |rdoc|
|
37
|
+
files =['README', 'LICENSE', 'lib/**/*.rb']
|
38
|
+
rdoc.rdoc_files.add(files)
|
39
|
+
rdoc.main = "README" # page to start on
|
40
|
+
rdoc.title = "gamerocket-ruby Docs"
|
41
|
+
rdoc.rdoc_dir = 'doc/rdoc' # rdoc output folder
|
42
|
+
rdoc.options << '--line-numbers'
|
43
|
+
end
|
44
|
+
|
45
|
+
Rake::TestTask.new do |t|
|
46
|
+
t.test_files = FileList['test/**/*.rb']
|
47
|
+
end
|
48
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module GameRocket
|
2
|
+
class Achievement
|
3
|
+
include BaseModule
|
4
|
+
|
5
|
+
attr_accessor :id, :progression, :unlocked, :unlockedDate, :dynProp, :template
|
6
|
+
|
7
|
+
def initialize(gateway, attributes)
|
8
|
+
@gateway = gateway
|
9
|
+
if attributes.is_a?(Hash)
|
10
|
+
set_instance_variables_from_hash(attributes)
|
11
|
+
self.dynProp = attributes["dynProp"].is_a?(Hash) ? attributes["dynProp"] : {}
|
12
|
+
if attributes["template"].is_a?(Hash)
|
13
|
+
self.template = AchievementTemplate._new(attributes["template"])
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.find(player, id, params)
|
19
|
+
Configuration.gateway.achievement.find(player, id, params)
|
20
|
+
end
|
21
|
+
|
22
|
+
def self._new(*args)
|
23
|
+
self.new *args
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module GameRocket
|
2
|
+
class AchievementGateway
|
3
|
+
|
4
|
+
def initialize(gateway)
|
5
|
+
@gateway = gateway
|
6
|
+
@config = gateway.config
|
7
|
+
end
|
8
|
+
|
9
|
+
def find(player, id, params)
|
10
|
+
raise InvalidArgument, "Expected id to be set" if player.nil? || player == "" || id.nil? || id.to_s == ""
|
11
|
+
json = @config.http.get("/players/#{player}/achievements/#{id}", params)
|
12
|
+
if !json["achievement"].nil?
|
13
|
+
Achievement._new(@gateway, json["achievement"])
|
14
|
+
else
|
15
|
+
raise NotFoundError, "Achievement with id #{id} not found."
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module GameRocket
|
2
|
+
class AchievementTemplate
|
3
|
+
include BaseModule
|
4
|
+
|
5
|
+
attr_accessor :id, :ref, :name, :description, :image, :goal, :points, :dynProp
|
6
|
+
|
7
|
+
def initialize(attributes)
|
8
|
+
set_instance_variables_from_hash(attributes)
|
9
|
+
end
|
10
|
+
|
11
|
+
def self._new(*args)
|
12
|
+
self.new *args
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module GameRocket
|
2
|
+
class Action
|
3
|
+
|
4
|
+
attr_accessor :id, :ref, :name, :dynProp, :secured
|
5
|
+
|
6
|
+
def initialize(gateway, attributes)
|
7
|
+
@gateway = gateway
|
8
|
+
if !attributes.nil?
|
9
|
+
set_instance_variables_from_hash(attributes) if !attributes.nil?
|
10
|
+
self.dynProp = attributes[:dynProp].nil ? attributes[:dynProp] : {}
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.find(id)
|
15
|
+
Configuration.gateway.action.find(id)
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.run(id, attributes)
|
19
|
+
Configuration.gateway.action.run(id, attributes)
|
20
|
+
end
|
21
|
+
|
22
|
+
def self._new(*args)
|
23
|
+
self.new *args
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module GameRocket
|
2
|
+
class ActionGateway
|
3
|
+
|
4
|
+
def initialize(gateway)
|
5
|
+
@gateway = gateway
|
6
|
+
@config = gateway.config
|
7
|
+
end
|
8
|
+
|
9
|
+
def find(id)
|
10
|
+
raise InvalidArgument, "Expected id to be set" if id.nil? || id.to_s == ""
|
11
|
+
response = @config.http.get("/games/#{@config.apiKey}/actions/#{id}")
|
12
|
+
if !response["action"].nil?
|
13
|
+
Action._new(@gateway, response["action"])
|
14
|
+
else
|
15
|
+
raise NotFoundError, "Action with id #{id} not found."
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def run(id, attributes)
|
20
|
+
response = @config.http.post("/games/#{@config.apiKey}/actions/#{id}/run", attributes)
|
21
|
+
if response["error"].nil?
|
22
|
+
SuccessfulResult.new(response)
|
23
|
+
else
|
24
|
+
ErrorResult.new(attributes, response)
|
25
|
+
end
|
26
|
+
rescue NotFoundError
|
27
|
+
raise NotFoundError, "Action with id #{id} not found."
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module GameRocket
|
2
|
+
module BaseModule
|
3
|
+
module Methods
|
4
|
+
|
5
|
+
def return_object_or_raise(object_to_return)
|
6
|
+
result = yield
|
7
|
+
if result.success?
|
8
|
+
result.send object_to_return
|
9
|
+
else
|
10
|
+
raise ValidationsFailed.new(result)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def copy_instance_variables_from_object(object)
|
15
|
+
object.instance_variables.each do |ivar|
|
16
|
+
instance_variable_set ivar, object.instance_variable_get(ivar)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def set_instance_variables_from_hash(hash)
|
21
|
+
hash.each do |key, value|
|
22
|
+
instance_variable_set "@#{key}", value
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def singleton_class
|
27
|
+
class <<self; self; end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.included(klass)
|
32
|
+
klass.extend Methods
|
33
|
+
end
|
34
|
+
include Methods
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,121 @@
|
|
1
|
+
module GameRocket
|
2
|
+
class Configuration
|
3
|
+
API_VERSION ="1"
|
4
|
+
|
5
|
+
class << self
|
6
|
+
attr_writer :custom_user_agent, :logger, :apiKey, :secretKey
|
7
|
+
end
|
8
|
+
attr_reader :apiKey, :secretKey
|
9
|
+
|
10
|
+
def self.expectant_reader(*attributes)
|
11
|
+
attributes.each do |attribute|
|
12
|
+
(class << self; self; end).send(:define_method, attribute) do
|
13
|
+
attribute_value = instance_variable_get("@#{attribute}")
|
14
|
+
raise ConfigurationError.new(attribute.to_s, "needs to be set") unless attribute_value
|
15
|
+
attribute_value
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
expectant_reader :environment, :apiKey, :secretKey
|
20
|
+
|
21
|
+
def self.environment=(env)
|
22
|
+
unless [:development, :production].include?(env)
|
23
|
+
raise ArgumentError, "#{env.inspect} is not a valid environment"
|
24
|
+
end
|
25
|
+
@environment = env
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.gateway
|
29
|
+
GameRocket::Gateway.new(instantiate)
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.instantiate
|
33
|
+
config = new(
|
34
|
+
:custom_user_agent => @custom_user_agent,
|
35
|
+
:environment => environment,
|
36
|
+
:logger => logger,
|
37
|
+
:apiKey => apiKey,
|
38
|
+
:secretKey => secretKey
|
39
|
+
)
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.logger
|
43
|
+
@logger ||=_default_logger
|
44
|
+
end
|
45
|
+
|
46
|
+
def initialize(options = {})
|
47
|
+
[:environment, :apiKey, :secretKey, :custom_user_agent, :logger].each do |attr|
|
48
|
+
instance_variable_set "@#{attr}", options[attr]
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def api_version
|
53
|
+
API_VERSION
|
54
|
+
end
|
55
|
+
|
56
|
+
def baseUrl
|
57
|
+
"#{protocol}://#{server}:#{port}/api/#{API_VERSION}"
|
58
|
+
end
|
59
|
+
|
60
|
+
def ca_file
|
61
|
+
case @environment
|
62
|
+
when :production
|
63
|
+
File.expand_path(File.join(File.dirname(_FILE_), "..", "ssl", "www_gamerocket_io.ca.crt" ))
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def http
|
68
|
+
Http.new(self)
|
69
|
+
end
|
70
|
+
|
71
|
+
def logger
|
72
|
+
@logger ||=self.class._default_logger
|
73
|
+
end
|
74
|
+
|
75
|
+
def port
|
76
|
+
case @environment
|
77
|
+
when :development
|
78
|
+
ENV['GATEWAY_PORT'] || 8180
|
79
|
+
when :production
|
80
|
+
443
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def protocol
|
85
|
+
ssl? ? "https" : "http"
|
86
|
+
end.to_s
|
87
|
+
|
88
|
+
def server
|
89
|
+
case @environment
|
90
|
+
when :development
|
91
|
+
"localhost"
|
92
|
+
when :production
|
93
|
+
"www.gamerocket.io"
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def ssl?
|
98
|
+
case @environment
|
99
|
+
when :development
|
100
|
+
false
|
101
|
+
when :production
|
102
|
+
true
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def user_agent
|
107
|
+
base_user_agent = "GameRocket Ruby Gem #{GameRocket::Version::String}"
|
108
|
+
@custom_user_agent ? "#{base_user_agent} (#{@custom_user_agent}" : base_user_agent
|
109
|
+
end
|
110
|
+
|
111
|
+
def self._default_logger
|
112
|
+
logger = Logger.new(STDOUT)
|
113
|
+
logger.level = Logger::INFO
|
114
|
+
logger
|
115
|
+
end
|
116
|
+
|
117
|
+
def inspect
|
118
|
+
super.gsub(/@secretKey=\".*\"/, '@secrectKey="[FILTERED]"')
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module GameRocket
|
2
|
+
module Crypto
|
3
|
+
|
4
|
+
def self.sign(method, url, parameters, secretKey)
|
5
|
+
base_string = self.build_base_string(method, url, parameters)
|
6
|
+
self._sign(base_string, secretKey)
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
def self.build_base_string(method, url, parameters)
|
11
|
+
base_string = "#{method}&" + "#{CGI.escape("#{url.downcase}").gsub("+", "%20")}&"
|
12
|
+
if !parameters.nil?
|
13
|
+
parameters.each{|key, value|
|
14
|
+
if value.is_a?(Hash)
|
15
|
+
value.each{|key_bis, value_bis|
|
16
|
+
if value_bis.is_a?(Hash)
|
17
|
+
value_bis.each{ |key_ter, value_ter|
|
18
|
+
CGI.escape(value_ter).gsub("+", "%20")
|
19
|
+
}
|
20
|
+
value_bis = GameRocket::Util.hash_to_query_string(value_bis)
|
21
|
+
else
|
22
|
+
CGI.escape(value_bis).gsub("+", "%20")
|
23
|
+
end
|
24
|
+
|
25
|
+
}
|
26
|
+
value = GameRocket::Util.hash_to_query_string(value)
|
27
|
+
CGI.escape(value).gsub("+", "%20")
|
28
|
+
else
|
29
|
+
CGI.escape(value).gsub("+", "%20")
|
30
|
+
end
|
31
|
+
|
32
|
+
}
|
33
|
+
parameters = parameters.sort
|
34
|
+
querystring = GameRocket::Util.hash_to_query_string(parameters)
|
35
|
+
base_string += CGI.escape(querystring).gsub("+", "%20")
|
36
|
+
end
|
37
|
+
|
38
|
+
base_string
|
39
|
+
end
|
40
|
+
|
41
|
+
def self._sign(base_string, secretKey)
|
42
|
+
digest = Digest::SHA256.hexdigest(base_string + secretKey)
|
43
|
+
Base64.strict_encode64(digest)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module GameRocket
|
2
|
+
class GameRocketError < ::StandardError; end
|
3
|
+
|
4
|
+
class AuthenticationError < GameRocketError; end
|
5
|
+
|
6
|
+
class AuthorizationError < GameRocketError; end
|
7
|
+
|
8
|
+
class ConfigurationError < GameRocketError
|
9
|
+
def initialize(setting, message)
|
10
|
+
super "GameRocket::Configuration.#{setting} #{message}"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class DownForMaintenanceError < GameRocketError; end
|
15
|
+
|
16
|
+
class ForgedQueryString < GameRocketError; end
|
17
|
+
|
18
|
+
class InvalidArgument < GameRocketError; end
|
19
|
+
|
20
|
+
class InvalidSignature < GameRocketError; end
|
21
|
+
|
22
|
+
class NotFoundError < GameRocketError; end
|
23
|
+
|
24
|
+
class ServerError < GameRocketError; end
|
25
|
+
|
26
|
+
class SSLCertificateError < GameRocketError; end
|
27
|
+
|
28
|
+
class UnexpectedError < GameRocketError; end
|
29
|
+
|
30
|
+
class UpgradeRequiredError < GameRocketError; end
|
31
|
+
|
32
|
+
class ValidationsFailed < GameRocketError
|
33
|
+
attr_reader :error_result
|
34
|
+
|
35
|
+
def initialize(error_result)
|
36
|
+
@error_result = error_result
|
37
|
+
end
|
38
|
+
|
39
|
+
def inspect
|
40
|
+
"#<#{self.class} error_result: #{@error_result.inspect}>"
|
41
|
+
end
|
42
|
+
|
43
|
+
def to_s
|
44
|
+
inspect
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module GameRocket
|
2
|
+
class Game
|
3
|
+
|
4
|
+
attr_accessor :id, :name, :status, :dynProp
|
5
|
+
|
6
|
+
def initialize(gateway, attributes)
|
7
|
+
@gateway = gateway
|
8
|
+
if !attributes.nil?
|
9
|
+
set_instance_variables_from_hash(attributes)
|
10
|
+
self.dynProp = attributes[:dynProp].is_a?(Hash) ? attributes[:dynProp] : {}
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.find(id)
|
15
|
+
Configuration.gateway.game.find(id)
|
16
|
+
end
|
17
|
+
|
18
|
+
def self._new(*args)
|
19
|
+
self.new *args
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module GameRocket
|
2
|
+
class GameGateway
|
3
|
+
|
4
|
+
def initialize(gateway)
|
5
|
+
@gateway = gateway
|
6
|
+
@config = gateway.config
|
7
|
+
end
|
8
|
+
|
9
|
+
def find(id)
|
10
|
+
raise InvalidArgument, "Expected id to be set" if id.nil? || id.to_s == ""
|
11
|
+
response = @config.http.get("/games/#{id}")
|
12
|
+
if !response["game"].nil?
|
13
|
+
Game._new(@gateway, response[:game])
|
14
|
+
else
|
15
|
+
raise NotFoundError, "Game with id #{id} not found."
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module GameRocket
|
2
|
+
class Gateway
|
3
|
+
|
4
|
+
attr_reader :config
|
5
|
+
|
6
|
+
def initialize(config)
|
7
|
+
if config.is_a?(Hash)
|
8
|
+
@config = Configuration.new config
|
9
|
+
elsif config.is_a?(GameRocket::Configuration)
|
10
|
+
@config = config
|
11
|
+
else
|
12
|
+
raise ArgumentError, "config is an invalid type"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def player
|
17
|
+
PlayerGateway.new(self)
|
18
|
+
end
|
19
|
+
|
20
|
+
def achievement
|
21
|
+
AchievementGateway.new(self)
|
22
|
+
end
|
23
|
+
|
24
|
+
def action
|
25
|
+
ActionGateway.new(self)
|
26
|
+
end
|
27
|
+
|
28
|
+
def game
|
29
|
+
GameGateway.new(self)
|
30
|
+
end
|
31
|
+
|
32
|
+
def purchase
|
33
|
+
PurchaseGateway.new(self)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
module GameRocket
|
2
|
+
class Http
|
3
|
+
|
4
|
+
def initialize(config)
|
5
|
+
@config = config
|
6
|
+
end
|
7
|
+
|
8
|
+
def get(path, params = {})
|
9
|
+
params[:signature] = GameRocket::Crypto::sign('GET', @config.baseUrl + path, params, @config.secretKey)
|
10
|
+
qs = GameRocket::Util.hash_to_query_string(params)
|
11
|
+
|
12
|
+
response = _http_do Net::HTTP::Get, @config.baseUrl + path + "?" + qs
|
13
|
+
if response.code.to_i == 200 || response.code.to_i == 422
|
14
|
+
JSON.parse(_body(response))
|
15
|
+
else
|
16
|
+
Util.raise_exception_for_status_code(response.code)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
def post(path, params = {})
|
22
|
+
params[:signature] = GameRocket::Crypto::sign('POST', @config.baseUrl + path, params, @config.secretKey)
|
23
|
+
qs = GameRocket::Util.hash_to_query_string(params)
|
24
|
+
|
25
|
+
response = _http_do Net::HTTP::Post, @config.baseUrl + path, qs
|
26
|
+
if response.code.to_i == 200 || response.code.to_i == 201 || response.code.to_i == 422
|
27
|
+
JSON.parse(_body(response))
|
28
|
+
else
|
29
|
+
Util.raise_exception_for_status_code(response.code)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def put(path, params = {})
|
34
|
+
params[:signature] = GameRocket::Crypto::sign('PUT', @config.baseUrl + path, params, @config.secretKey)
|
35
|
+
qs = GameRocket::Util.hash_to_query_string(params)
|
36
|
+
|
37
|
+
response = _http_do Net::HTTP::Put, @config.baseUrl + path, qs
|
38
|
+
if response.code.to_i == 200 || response.code.to_i == 201 || response.code.to_i == 422
|
39
|
+
JSON.parse(_body(response))
|
40
|
+
else
|
41
|
+
Util.raise_exception_for_status_codes(response.code)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def delete(path, params = {})
|
46
|
+
params[:signature] = GameRocket::Crypto::sign('DELETE', @config.baseUrl + path, params, @config.secretKey)
|
47
|
+
qs = GameRocket::Util.hash_to_query_string(params)
|
48
|
+
|
49
|
+
response = _http_do Net::HTTP::Delete, @config.baseUrl + path + "?" + qs
|
50
|
+
if response.code.to_i == 200
|
51
|
+
JSON.parse(_body(response))
|
52
|
+
else
|
53
|
+
Util.raise_exception_for_status_code(response.code)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def _http_do(http_verb, path, body = nil)
|
58
|
+
connection = Net::HTTP.new(@config.server, @config.port)
|
59
|
+
connection.read_timeout = 60
|
60
|
+
if @config.ssl?
|
61
|
+
connection.use_ssl= true
|
62
|
+
connection.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
63
|
+
connection.ca_file = @config.ca_file
|
64
|
+
connection.verify_callback = proc { |preverify_ok, ssl_context| _verify_ssl_certificate(preverify_ok, ssl_context) }
|
65
|
+
end
|
66
|
+
connection.start do |http|
|
67
|
+
request = http_verb.new("#{path}")
|
68
|
+
request["Accept"] = "application/json"
|
69
|
+
request["User-Agent"] = @config.user_agent
|
70
|
+
request["Accept-Encoding"] = "gzip"
|
71
|
+
request["X-ApiVersion"] = @config.api_version
|
72
|
+
@config.logger.debug "[GameRocket] [#{_current_time}] #{request.method} #{path}"
|
73
|
+
if body
|
74
|
+
request.body = body
|
75
|
+
@config.logger.debug body
|
76
|
+
end
|
77
|
+
response = http.request(request)
|
78
|
+
@config.logger.info "[GameRocket] [#{_current_time}] #{request.method} #{path} #{response.code}"
|
79
|
+
@config.logger.debug "[GameRocket] [#{_current_time}] #{response.code} #{response.message}"
|
80
|
+
if @config.logger.level == Logger::DEBUG
|
81
|
+
@config.logger.debug _body(response)
|
82
|
+
end
|
83
|
+
response
|
84
|
+
end
|
85
|
+
rescue OpenSSL::SSL::SSLError
|
86
|
+
raise GameRocket::SSLCertificateError
|
87
|
+
end
|
88
|
+
|
89
|
+
def _body(response)
|
90
|
+
if response.header["Content-Encoding"].nil?
|
91
|
+
response.body
|
92
|
+
elsif response.header["Content-Encoding"] == "gzip"
|
93
|
+
Zlib::GzipReader.new(StringIO.new(response.body)).read
|
94
|
+
else
|
95
|
+
raise UnexpectedError, "expected a gzipped response"
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def _current_time
|
100
|
+
Time.now.utc.strftime("%d/%b/%Y %H:%M:%S %Z")
|
101
|
+
end
|
102
|
+
|
103
|
+
def _verify_ssl_certificate(preverify_ok, ssl_context)
|
104
|
+
if preverify_ok != true || ssl_context.error != 0
|
105
|
+
err_msg = "SSL Verification failed -- Preverify: #{preverify_ok}, Error: #{ssl_context.error_string} (#{ssl_context.error})"
|
106
|
+
@config.logger.error err_msg
|
107
|
+
false
|
108
|
+
else
|
109
|
+
true
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module GameRocket
|
2
|
+
class Player
|
3
|
+
include BaseModule
|
4
|
+
|
5
|
+
attr_accessor :id, :name, :emailHash, :totalPointsAchievements, :locale, :dynProp
|
6
|
+
|
7
|
+
def initialize(gateway, attributes)
|
8
|
+
@gateway = gateway
|
9
|
+
set_instance_variables_from_hash(attributes) unless attributes.nil?
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.create(attributes = {})
|
13
|
+
Configuration.gateway.player.create(attributes)
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.find(id)
|
17
|
+
Configuration.gateway.player.find(id)
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.update(id, attributes)
|
21
|
+
Configuration.gateway.player.update(id, attributes)
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.delete(id)
|
25
|
+
Configuration.gateway.player.delete(id)
|
26
|
+
end
|
27
|
+
|
28
|
+
def delete
|
29
|
+
@gateway.player.delete(id)
|
30
|
+
end
|
31
|
+
|
32
|
+
def ==(other)
|
33
|
+
return false unless other.is_a?(Player)
|
34
|
+
id == other.id
|
35
|
+
end
|
36
|
+
|
37
|
+
class << self
|
38
|
+
protected :new
|
39
|
+
end
|
40
|
+
|
41
|
+
def self._new(*args)
|
42
|
+
self.new *args
|
43
|
+
end
|
44
|
+
|
45
|
+
def self._attributes
|
46
|
+
[
|
47
|
+
:id, :name, :emailHash, :totalPointsAchievements, :locale, :dynProp
|
48
|
+
]
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module GameRocket
|
2
|
+
class PlayerGateway
|
3
|
+
|
4
|
+
def initialize(gateway)
|
5
|
+
@gateway = gateway
|
6
|
+
@config = gateway.config
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.createSignature
|
10
|
+
signature = ['name', 'locale']
|
11
|
+
signature
|
12
|
+
end
|
13
|
+
|
14
|
+
def create(attributes = {})
|
15
|
+
Util.verify_keys(PlayerGateway.createSignature, attributes)
|
16
|
+
result = _do_create "/games/" + GameRocket::Configuration::apiKey + "/players", attributes
|
17
|
+
end
|
18
|
+
|
19
|
+
def find(id)
|
20
|
+
raise ArgumentError, "id contains invalid characters" unless id.to_s =~ /\A[\w_]+\z/
|
21
|
+
raise ArgumentError, "id cannot be blank" if id.nil?|| id.to_s.strip ==""
|
22
|
+
json = @config.http.get("/players/#{id}")
|
23
|
+
if !json["player"].nil?
|
24
|
+
Player._new(@gateway, json["player"])
|
25
|
+
else
|
26
|
+
raise NotFoundError, "player with id#{id.inspect} not found"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def update(id, attributes)
|
31
|
+
_do_update(:put, "/players/#{id}", attributes)
|
32
|
+
end
|
33
|
+
|
34
|
+
def delete(id)
|
35
|
+
json = @config.http.delete("/players/#{id}")
|
36
|
+
SuccessfulResult.new
|
37
|
+
end
|
38
|
+
|
39
|
+
def _do_create(url, params = nil)
|
40
|
+
json = @config.http.post url, params
|
41
|
+
if json["player"]
|
42
|
+
SuccessfulResult.new(:player => Player._new(@gateway, json["player"]))
|
43
|
+
elsif json["error"]
|
44
|
+
ErrorResult.new(@gateway, json)
|
45
|
+
else
|
46
|
+
raise "expected :player or :error"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def _do_update(http_verb, url, params)
|
51
|
+
json = @config.http.send http_verb, url, params
|
52
|
+
if json["player"]
|
53
|
+
SuccessfulResult.new(:player => Player._new(@gateway, json["player"]))
|
54
|
+
elsif json["error"]
|
55
|
+
ErrorResult.new(@gateway, json)
|
56
|
+
else
|
57
|
+
raise UnexpectedError, "expected :player or :error"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module GameRocket
|
2
|
+
class Purchase
|
3
|
+
|
4
|
+
attr_accessor :id, :ref, :name, :price, :dynProp
|
5
|
+
|
6
|
+
def initialize(gateway, attributes)
|
7
|
+
@gateway = gateway
|
8
|
+
if !attributes.nil?
|
9
|
+
set_instance_variables_from_hash(attributes)
|
10
|
+
self.dynProp = attributes[:dynProp].is_a?(Hash) ? attributes[:dynProp] : {}
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.find(id)
|
15
|
+
Configuration.gateway.purchase.find(id)
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.buy(id, attributes)
|
19
|
+
Configuration.gateway.purchase.buy(id, attributes)
|
20
|
+
end
|
21
|
+
|
22
|
+
def self._new(*args)
|
23
|
+
self.new *args
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module GameRocket
|
2
|
+
class PurchaseGateway
|
3
|
+
|
4
|
+
def initialize(gateway)
|
5
|
+
@gateway = gateway
|
6
|
+
@config = gateway.config
|
7
|
+
end
|
8
|
+
|
9
|
+
def find(id)
|
10
|
+
raise InvalidArgument, "Expected id to be set" if id.nil? || id.to_s == ""
|
11
|
+
response = @config.http.get("/games/#{@config.apiKey}/purchases/#{id}")
|
12
|
+
if !response["purchase"].nil?
|
13
|
+
Purchase._new(@gateway, response["purchase"])
|
14
|
+
else
|
15
|
+
raise NotFoundError, "Purchase with id #{id} not found."
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def buy(id, attributes)
|
20
|
+
response = @config.http.post("/games/#{@config.apiKey}/purchases/#{id}/buy", attributes)
|
21
|
+
if response["error"].nil?
|
22
|
+
SuccessfulResult.new(response)
|
23
|
+
else
|
24
|
+
ErrorResult.new(@gateway, response)
|
25
|
+
end
|
26
|
+
rescue NotFoundError
|
27
|
+
raise NotFoundError, "Purchase with id #{id} not found."
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module GameRocket
|
2
|
+
class SuccessfulResult
|
3
|
+
include BaseModule
|
4
|
+
|
5
|
+
def initialize(attributes = {})
|
6
|
+
@attrs = attributes.keys
|
7
|
+
singleton_class.class_eval do
|
8
|
+
attributes.each do |key, value|
|
9
|
+
define_method key do
|
10
|
+
value
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def success?
|
17
|
+
true
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,138 @@
|
|
1
|
+
module GameRocket
|
2
|
+
module Util
|
3
|
+
|
4
|
+
def self.extract_attribute_as_array(hash, attribute)
|
5
|
+
raise UnexpectedError.new("Unprocessable entity due to an invalid request") if hash.nil?
|
6
|
+
value = hash.has_key?(attribute) ? hash.delete(attribute) : []
|
7
|
+
value.is_a?(Array) ? value : [value]
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.hash_to_query_string(hash, namespace = nil)
|
11
|
+
hash.collect do |key, value|
|
12
|
+
full_key = namespace ? "#{namespace}[#{key}]" : key
|
13
|
+
if value.is_a?(Hash)
|
14
|
+
hash_to_query_string(value, full_key)
|
15
|
+
else
|
16
|
+
if full_key.eql? :signature
|
17
|
+
full_key.to_s.to_str + "=" + value.to_s.to_str
|
18
|
+
else
|
19
|
+
url_encode(full_key) + "=" + url_encode(value)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end.sort * '&'
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.parse_query_string(qs)
|
26
|
+
qs.split('&').inject({}) do |result, couplet|
|
27
|
+
pair = couplet.split('=')
|
28
|
+
result[CGI.unescape(pair[0]).to_sym] = CGI.unescapeHTML(pair[1] || '')
|
29
|
+
result
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.url_decode(text)
|
34
|
+
CGI.escape text.to_s.to_str
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.url_encode(text)
|
38
|
+
CGI.escape text.to_s.to_str
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.symbolize_keys(hash)
|
42
|
+
hash.inject({}) do |new_hash, (key, value)|
|
43
|
+
if value.is_a?(Hash)
|
44
|
+
value = symbolize_keys(value)
|
45
|
+
elsif value.is_a?(Array) && value.all? { |v| v.is_a?(Hash) }
|
46
|
+
value = value.map {|v| symbolize_keys(v)}
|
47
|
+
end
|
48
|
+
new_hash.merge(key.to_sym => value)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.raise_exception_for_status_code(status_code, message=nil)
|
53
|
+
case status_code.to_i
|
54
|
+
when 401
|
55
|
+
raise AuthenticationError
|
56
|
+
when 403
|
57
|
+
raise AuthorizationError, message
|
58
|
+
when 404
|
59
|
+
raise NotFoundError
|
60
|
+
when 426
|
61
|
+
raise UpgradeRequiredError, "Please upgrade your client library."
|
62
|
+
when 500
|
63
|
+
raise ServerError
|
64
|
+
when 503
|
65
|
+
raise DownForMaintenanceError
|
66
|
+
else
|
67
|
+
raise UnexpectedError, "unexpected HTTP_RESPONSE #{status_code.to_i}"
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.to_big_decimal(decimal)
|
72
|
+
case decimal
|
73
|
+
when BigDecimal, NilClass
|
74
|
+
decimal
|
75
|
+
when String
|
76
|
+
BigDecimal.new(decimal)
|
77
|
+
else
|
78
|
+
raise ArgumentError, "Argument must be a String or BigDecimal"
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def self.verify_keys(valid_keys, hash)
|
83
|
+
flattened_valid_keys = _flatten_valid_keys(valid_keys)
|
84
|
+
invalid_keys = _flatten_hash_keys(hash) - flattened_valid_keys
|
85
|
+
invalid_keys = _remove_wildcard_keys(flattened_valid_keys, invalid_keys)
|
86
|
+
if invalid_keys.any?
|
87
|
+
sorted = invalid_keys.sort_by { |k| k.to_s}.join(", ")
|
88
|
+
raise ArgumentError, "invalid keys: #{sorted}"
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def self._flatten_valid_keys(valid_keys, namespace = nil)
|
93
|
+
valid_keys.inject([]) do |result, key|
|
94
|
+
if key.is_a?(Hash)
|
95
|
+
full_key = key.keys[0]
|
96
|
+
full_key = (namespace ? "#{namespace}[#{full_key}]" : full_key)
|
97
|
+
nested_keys = key.values[0]
|
98
|
+
if nested_keys.is_a?(Array)
|
99
|
+
result += _flatten_valid_keys(nested_keys, full_key)
|
100
|
+
else
|
101
|
+
result << "#{full_key}[#{nested_keys}]"
|
102
|
+
end
|
103
|
+
else
|
104
|
+
result << (namespace ? "#{namespace}[#{key}]" : key.to_s)
|
105
|
+
end
|
106
|
+
result
|
107
|
+
end.sort
|
108
|
+
end
|
109
|
+
|
110
|
+
def self._flatten_hash_keys(element, namespace = nil)
|
111
|
+
element = [element] if element.is_a?(String)
|
112
|
+
element.inject([]) do |result, (key, value)|
|
113
|
+
full_key = (namespace ? "#{namespace}[#{key}]" : key.to_s)
|
114
|
+
if value.is_a?(Hash)
|
115
|
+
result += _flatten_hash_keys(value, full_key)
|
116
|
+
elsif value.is_a?(Array)
|
117
|
+
value.each do |item|
|
118
|
+
result += _flatten_hash_keys(item, full_key)
|
119
|
+
end
|
120
|
+
else
|
121
|
+
result << full_key
|
122
|
+
end
|
123
|
+
result
|
124
|
+
end.sort
|
125
|
+
end
|
126
|
+
|
127
|
+
def self._remove_wildcard_keys(valid_keys, invalid_keys)
|
128
|
+
wildcard_keys = valid_keys.select {|k| k.include? "[_any_key_]"}
|
129
|
+
return invalid_keys if wildcard_keys.empty?
|
130
|
+
wildcard_keys.map! { |wk| wk.sub "[_any]", ""}
|
131
|
+
invalid_keys.select do |invalid_key|
|
132
|
+
wildcard_keys.all? do |wildcard_key|
|
133
|
+
invalid_key.index(wildcard_key) != 0
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
data/lib/gamerocket.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
require "base64"
|
2
|
+
require "cgi"
|
3
|
+
require "date"
|
4
|
+
require "digest/sha2"
|
5
|
+
require "logger"
|
6
|
+
require "net/http"
|
7
|
+
require "net/https"
|
8
|
+
require "openssl"
|
9
|
+
require "stringio"
|
10
|
+
require "time"
|
11
|
+
require "zlib"
|
12
|
+
|
13
|
+
require "builder"
|
14
|
+
require "json"
|
15
|
+
|
16
|
+
require File.dirname(__FILE__) + "/gamerocket/exceptions"
|
17
|
+
|
18
|
+
require File.dirname(__FILE__) + "/gamerocket/base_module"
|
19
|
+
|
20
|
+
require File.dirname(__FILE__) + "/gamerocket/achievement"
|
21
|
+
require File.dirname(__FILE__) + "/gamerocket/achievement_gateway"
|
22
|
+
require File.dirname(__FILE__) + "/gamerocket/achievement_template"
|
23
|
+
require File.dirname(__FILE__) + "/gamerocket/action"
|
24
|
+
require File.dirname(__FILE__) + "/gamerocket/action_gateway"
|
25
|
+
require File.dirname(__FILE__) + "/gamerocket/game"
|
26
|
+
require File.dirname(__FILE__) + "/gamerocket/game_gateway"
|
27
|
+
require File.dirname(__FILE__) + "/gamerocket/purchase"
|
28
|
+
require File.dirname(__FILE__) + "/gamerocket/purchase_gateway"
|
29
|
+
require File.dirname(__FILE__) + "/gamerocket/player"
|
30
|
+
require File.dirname(__FILE__) + "/gamerocket/player_gateway"
|
31
|
+
|
32
|
+
require File.dirname(__FILE__) + "/gamerocket/gateway"
|
33
|
+
require File.dirname(__FILE__) + "/gamerocket/http"
|
34
|
+
require File.dirname(__FILE__) + "/gamerocket/successful_result"
|
35
|
+
require File.dirname(__FILE__) + "/gamerocket/error_result"
|
36
|
+
|
37
|
+
require File.dirname(__FILE__) + "/gamerocket/crypto"
|
38
|
+
require File.dirname(__FILE__) + "/gamerocket/util"
|
39
|
+
require File.dirname(__FILE__) + "/gamerocket/configuration"
|
40
|
+
require File.dirname(__FILE__) + "/gamerocket/version"
|
41
|
+
|
42
|
+
|
43
|
+
GameRocket::Configuration.environment = "your_environment"#:development or :production
|
44
|
+
GameRocket::Configuration.apiKey = "your_apiKey"#use your apiKey
|
45
|
+
GameRocket::Configuration.secretKey = "your_secret_key"#use your secretKey
|
metadata
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: gamerocket
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Work Bandits
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-07-18 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: builder
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 2.0.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 2.0.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: json
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
description: Your summary here
|
42
|
+
email: contact@gamerocket.io
|
43
|
+
executables: []
|
44
|
+
extensions: []
|
45
|
+
extra_rdoc_files:
|
46
|
+
- README
|
47
|
+
- LICENSE
|
48
|
+
files:
|
49
|
+
- LICENSE
|
50
|
+
- README
|
51
|
+
- Rakefile
|
52
|
+
- lib/gamerocket/game_gateway.rb
|
53
|
+
- lib/gamerocket/player_gateway.rb
|
54
|
+
- lib/gamerocket/base_module.rb
|
55
|
+
- lib/gamerocket/achievement_gateway.rb
|
56
|
+
- lib/gamerocket/achievement_template.rb
|
57
|
+
- lib/gamerocket/http.rb
|
58
|
+
- lib/gamerocket/purchase_gateway.rb
|
59
|
+
- lib/gamerocket/game.rb
|
60
|
+
- lib/gamerocket/purchase.rb
|
61
|
+
- lib/gamerocket/gateway.rb
|
62
|
+
- lib/gamerocket/version.rb
|
63
|
+
- lib/gamerocket/util.rb
|
64
|
+
- lib/gamerocket/action.rb
|
65
|
+
- lib/gamerocket/configuration.rb
|
66
|
+
- lib/gamerocket/crypto.rb
|
67
|
+
- lib/gamerocket/error_result.rb
|
68
|
+
- lib/gamerocket/successful_result.rb
|
69
|
+
- lib/gamerocket/exceptions.rb
|
70
|
+
- lib/gamerocket/player.rb
|
71
|
+
- lib/gamerocket/achievement.rb
|
72
|
+
- lib/gamerocket/action_gateway.rb
|
73
|
+
- lib/gamerocket.rb
|
74
|
+
homepage:
|
75
|
+
licenses: []
|
76
|
+
metadata: {}
|
77
|
+
post_install_message:
|
78
|
+
rdoc_options: []
|
79
|
+
require_paths:
|
80
|
+
- lib
|
81
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
82
|
+
requirements:
|
83
|
+
- - '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - '>='
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
91
|
+
requirements: []
|
92
|
+
rubyforge_project:
|
93
|
+
rubygems_version: 2.0.3
|
94
|
+
signing_key:
|
95
|
+
specification_version: 4
|
96
|
+
summary: Your summary here
|
97
|
+
test_files: []
|