game_machine 0.0.11 → 1.0.2

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 (274) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +12 -1
  3. data/Gemfile.lock +32 -47
  4. data/Rakefile +0 -27
  5. data/bin/bundle_run.sh +1 -0
  6. data/bin/game_machine +29 -27
  7. data/config/cluster.conf +6 -5
  8. data/config/default.conf +164 -0
  9. data/config/game_machine.sql +33 -0
  10. data/config/game_messages.proto +87 -25
  11. data/config/gamecloud.conf +140 -0
  12. data/config/messages.proto +46 -53
  13. data/config/test.conf +149 -0
  14. data/game_machine.gemspec +10 -5
  15. data/games/boot.rb +3 -0
  16. data/games/example/data/game_data.yml +4 -4
  17. data/games/example/lib/aggressive_npc.rb +1 -1
  18. data/games/example/lib/game.rb +1 -2
  19. data/games/example/lib/player_register.rb +1 -1
  20. data/games/routes.rb +9 -0
  21. data/games/tutorial/boot.rb +12 -0
  22. data/games/tutorial/item_manager.rb +256 -0
  23. data/games/tutorial/object_store.rb +55 -0
  24. data/games/tutorial/seed.rb +52 -0
  25. data/games/tutorial/sql_store.rb +30 -0
  26. data/java/project/build.gradle +134 -0
  27. data/java/project/component.erb +719 -0
  28. data/java/{gradle.properties → project/gradle.properties} +1 -1
  29. data/java/project/gradle/wrapper/gradle-wrapper.jar +0 -0
  30. data/java/{gradle → project/gradle}/wrapper/gradle-wrapper.properties +2 -2
  31. data/java/{gradlew → project/gradlew} +0 -0
  32. data/java/{gradlew.bat → project/gradlew.bat} +0 -0
  33. data/java/project/local_lib/AdminUi.jar +0 -0
  34. data/java/{local_lib/protostuff-compiler-1.0.7-jarjar.jar → project/local_lib/protostuff-compiler-1.0.8-jarjar.jar} +0 -0
  35. data/java/project/local_lib/sigar/libsigar-amd64-freebsd-6.so +0 -0
  36. data/java/project/local_lib/sigar/libsigar-amd64-linux.so +0 -0
  37. data/java/project/local_lib/sigar/libsigar-amd64-solaris.so +0 -0
  38. data/java/project/local_lib/sigar/libsigar-ia64-hpux-11.sl +0 -0
  39. data/java/project/local_lib/sigar/libsigar-ia64-linux.so +0 -0
  40. data/java/project/local_lib/sigar/libsigar-pa-hpux-11.sl +0 -0
  41. data/java/project/local_lib/sigar/libsigar-ppc-aix-5.so +0 -0
  42. data/java/project/local_lib/sigar/libsigar-ppc-linux.so +0 -0
  43. data/java/project/local_lib/sigar/libsigar-ppc64-aix-5.so +0 -0
  44. data/java/project/local_lib/sigar/libsigar-ppc64-linux.so +0 -0
  45. data/java/project/local_lib/sigar/libsigar-s390x-linux.so +0 -0
  46. data/java/project/local_lib/sigar/libsigar-sparc-solaris.so +0 -0
  47. data/java/project/local_lib/sigar/libsigar-sparc64-solaris.so +0 -0
  48. data/java/project/local_lib/sigar/libsigar-universal-macosx.dylib +0 -0
  49. data/java/project/local_lib/sigar/libsigar-universal64-macosx.dylib +0 -0
  50. data/java/project/local_lib/sigar/libsigar-x86-freebsd-5.so +0 -0
  51. data/java/project/local_lib/sigar/libsigar-x86-freebsd-6.so +0 -0
  52. data/java/project/local_lib/sigar/libsigar-x86-linux.so +0 -0
  53. data/java/project/local_lib/sigar/libsigar-x86-solaris.so +0 -0
  54. data/java/project/local_lib/sigar/sigar-amd64-winnt.dll +0 -0
  55. data/java/project/local_lib/sigar/sigar-x86-winnt.dll +0 -0
  56. data/java/project/local_lib/sigar/sigar-x86-winnt.lib +0 -0
  57. data/java/project/model.erb +99 -0
  58. data/java/{settings.gradle → project/settings.gradle} +0 -0
  59. data/java/project/src/main/java/com/game_machine/authentication/DefaultAuthenticator.java +28 -0
  60. data/java/project/src/main/java/com/game_machine/authentication/PlayerAuthenticator.java +6 -0
  61. data/java/project/src/main/java/com/game_machine/authentication/PublicAuthenticator.java +20 -0
  62. data/java/{src → project/src}/main/java/com/game_machine/core/ActorFactory.java +0 -0
  63. data/java/{src → project/src}/main/java/com/game_machine/core/ActorUtil.java +13 -0
  64. data/java/project/src/main/java/com/game_machine/core/AuthorizedPlayers.java +23 -0
  65. data/java/project/src/main/java/com/game_machine/core/ClientMessageDecoder.java +36 -0
  66. data/java/project/src/main/java/com/game_machine/core/ClientMessageEncoder.java +19 -0
  67. data/java/project/src/main/java/com/game_machine/core/CloudClient.java +298 -0
  68. data/java/{src → project/src}/main/java/com/game_machine/core/CommandProxy.java +0 -0
  69. data/java/project/src/main/java/com/game_machine/core/Commands.java +20 -0
  70. data/java/project/src/main/java/com/game_machine/core/DatastoreCommands.java +43 -0
  71. data/java/project/src/main/java/com/game_machine/core/DbConnectionPool.java +72 -0
  72. data/java/project/src/main/java/com/game_machine/core/DefaultMovementVerifier.java +56 -0
  73. data/java/{src → project/src}/main/java/com/game_machine/core/EntitySerializer.java +0 -0
  74. data/java/project/src/main/java/com/game_machine/core/EntityTracking.java +119 -0
  75. data/java/{src → project/src}/main/java/com/game_machine/core/EventStreamHandler.java +1 -1
  76. data/java/project/src/main/java/com/game_machine/core/GameActor.java +73 -0
  77. data/java/project/src/main/java/com/game_machine/core/GameMachineLoader.java +43 -0
  78. data/java/project/src/main/java/com/game_machine/core/GameMessageActor.java +44 -0
  79. data/java/project/src/main/java/com/game_machine/core/Grid.java +255 -0
  80. data/java/{src → project/src}/main/java/com/game_machine/core/GridValue.java +0 -0
  81. data/java/project/src/main/java/com/game_machine/core/Hashring.java +66 -0
  82. data/java/{src → project/src}/main/java/com/game_machine/core/IActorFactory.java +0 -0
  83. data/java/project/src/main/java/com/game_machine/core/LocalLinkedBuffer.java +20 -0
  84. data/java/project/src/main/java/com/game_machine/core/MessageGateway.java +120 -0
  85. data/java/project/src/main/java/com/game_machine/core/MessagePersister.java +26 -0
  86. data/java/project/src/main/java/com/game_machine/core/MonoProxy.java +39 -0
  87. data/java/project/src/main/java/com/game_machine/core/MovementVerifier.java +7 -0
  88. data/java/{src → project/src}/main/java/com/game_machine/core/NetMessage.java +10 -6
  89. data/java/project/src/main/java/com/game_machine/core/PersistentMessage.java +9 -0
  90. data/java/project/src/main/java/com/game_machine/core/PlayerCommands.java +31 -0
  91. data/java/project/src/main/java/com/game_machine/core/TcpServer.java +100 -0
  92. data/java/project/src/main/java/com/game_machine/core/TcpServerHandler.java +54 -0
  93. data/java/project/src/main/java/com/game_machine/core/TcpServerInitializer.java +32 -0
  94. data/java/project/src/main/java/com/game_machine/core/UdpClient.java +86 -0
  95. data/java/{src → project/src}/main/java/com/game_machine/core/UdpServer.java +18 -27
  96. data/java/{src → project/src}/main/java/com/game_machine/core/UdpServerHandler.java +23 -26
  97. data/java/project/src/main/java/com/game_machine/core/Vector3.java +159 -0
  98. data/java/project/src/main/java/com/game_machine/orm/models/PlayerItem.java +118 -0
  99. data/java/project/src/main/java/com/game_machine/orm/models/TestObject.java +110 -0
  100. data/java/project/src/main/java/com/game_machine/tutorial/LootGenerator.java +26 -0
  101. data/java/{src → project/src}/main/resources/game_machine.java.stg +3 -1
  102. data/java/project/src/main/resources/logback.properties +13 -0
  103. data/java/project/src/main/resources/logback.xml +76 -0
  104. data/java/{src → project/src}/main/resources/protostuff.properties +0 -0
  105. data/java/src/main/java/game/MyGameActor.java +26 -0
  106. data/lib/game_machine.rb +17 -16
  107. data/lib/game_machine/actor.rb +1 -1
  108. data/lib/game_machine/actor/base.rb +8 -31
  109. data/lib/game_machine/actor/builder.rb +5 -6
  110. data/lib/game_machine/actor/game_actor.rb +55 -0
  111. data/lib/game_machine/actor/reloadable.rb +6 -1
  112. data/lib/game_machine/akka.rb +26 -32
  113. data/lib/game_machine/app_config.rb +39 -26
  114. data/lib/game_machine/application.rb +56 -62
  115. data/lib/game_machine/client_manager.rb +14 -8
  116. data/lib/game_machine/cloud_updater.rb +51 -0
  117. data/lib/game_machine/cluster_monitor.rb +3 -3
  118. data/lib/game_machine/commands.rb +1 -1
  119. data/lib/game_machine/commands/misc_commands.rb +4 -8
  120. data/lib/game_machine/commands/player_commands.rb +8 -0
  121. data/lib/game_machine/console.rb +1 -0
  122. data/lib/game_machine/console/build.rb +57 -24
  123. data/lib/game_machine/console/bundle.rb +95 -0
  124. data/lib/game_machine/console/deploy.rb +30 -0
  125. data/lib/game_machine/console/install.rb +70 -36
  126. data/lib/game_machine/console/server.rb +2 -69
  127. data/lib/game_machine/data_store.rb +111 -15
  128. data/lib/game_machine/data_stores/couchbase.rb +8 -3
  129. data/lib/game_machine/data_stores/gamecloud.rb +93 -0
  130. data/lib/game_machine/data_stores/jdbc.rb +98 -0
  131. data/lib/game_machine/default_handlers.rb +2 -0
  132. data/lib/game_machine/default_handlers/team_handler.rb +51 -0
  133. data/lib/game_machine/default_handlers/zone_manager.rb +30 -0
  134. data/lib/game_machine/endpoints.rb +0 -4
  135. data/lib/game_machine/endpoints/udp_incoming.rb +13 -5
  136. data/lib/game_machine/endpoints/udp_outgoing.rb +15 -9
  137. data/lib/game_machine/game_systems.rb +0 -2
  138. data/lib/game_machine/game_systems/agents/controller.rb +2 -2
  139. data/lib/game_machine/game_systems/entity_tracking.rb +0 -3
  140. data/lib/game_machine/game_systems/region_manager.rb +3 -2
  141. data/lib/game_machine/game_systems/region_service.rb +2 -2
  142. data/lib/game_machine/game_systems/remote_echo.rb +10 -0
  143. data/lib/game_machine/game_systems/team_manager.rb +2 -11
  144. data/lib/game_machine/grid.rb +5 -18
  145. data/lib/game_machine/handlers/authentication.rb +1 -9
  146. data/lib/game_machine/handlers/game.rb +27 -2
  147. data/lib/game_machine/handlers/player_authentication.rb +87 -0
  148. data/lib/game_machine/handlers/request.rb +9 -11
  149. data/lib/game_machine/hocon_config.rb +81 -0
  150. data/lib/game_machine/java_lib.rb +14 -1
  151. data/lib/game_machine/logger.rb +10 -23
  152. data/lib/game_machine/models.rb +1 -0
  153. data/lib/game_machine/mono_server.rb +6 -1
  154. data/lib/game_machine/object_db.rb +12 -6
  155. data/lib/game_machine/protobuf.rb +1 -1
  156. data/lib/game_machine/protobuf/game_messages.rb +13 -3
  157. data/lib/game_machine/protobuf/generate.rb +107 -5
  158. data/lib/game_machine/restart_watcher.rb +1 -1
  159. data/lib/game_machine/routes.rb +23 -0
  160. data/lib/game_machine/scheduler.rb +1 -1
  161. data/lib/game_machine/securerandom.rb +2 -0
  162. data/lib/game_machine/system_stats.rb +28 -7
  163. data/lib/game_machine/version.rb +1 -1
  164. data/lib/game_machine/wavefront_ext.rb +47 -0
  165. data/lib/game_machine/write_behind_cache.rb +24 -9
  166. data/mono/server/Makefile +1 -1
  167. data/mono/server/Newtonsoft.Json.dll +0 -0
  168. data/mono/server/build.bat +1 -1
  169. data/mono/server/callable.cs +9 -0
  170. data/mono/server/echo.cs +17 -0
  171. data/mono/server/message_router.cs +16 -23
  172. data/mono/server/messages.cs +1792 -417
  173. data/mono/server/protobuf-net.dll +0 -0
  174. data/mono/server/server.cs +120 -0
  175. data/mono/server/server.exe +0 -0
  176. data/pathfinding/astar.cpp +149 -0
  177. data/pathfinding/build.sh +6 -0
  178. data/pathfinding/build.txt +16 -0
  179. data/pathfinding/crowd.cpp +194 -0
  180. data/pathfinding/include/astar.h +49 -0
  181. data/pathfinding/include/common.h +5 -0
  182. data/pathfinding/include/crowd.h +43 -0
  183. data/pathfinding/include/micropather.h +511 -0
  184. data/pathfinding/include/navmesh.h +114 -0
  185. data/pathfinding/include/pathfinder.h +24 -0
  186. data/pathfinding/main.cpp +108 -17
  187. data/pathfinding/micropather.cpp +1062 -0
  188. data/pathfinding/navmesh.cpp +408 -0
  189. data/pathfinding/overrides/DetourCrowd.cpp +1446 -0
  190. data/pathfinding/overrides/DetourNavMeshQuery.cpp +3551 -0
  191. data/pathfinding/overrides/DetourNavMeshQuery.h +538 -0
  192. data/pathfinding/pathfinder.cpp +117 -0
  193. data/pathfinding/{bin → premake}/premake4 +0 -0
  194. data/pathfinding/premake/premake4.exe +0 -0
  195. data/pathfinding/premake4.lua +12 -3
  196. data/spec/actor/actor_spec.rb +0 -7
  197. data/spec/client_manager_spec.rb +1 -1
  198. data/spec/couchproxy_spec.rb +38 -0
  199. data/spec/entity_persistence_spec.rb +129 -0
  200. data/spec/game_systems/team_manager_spec.rb +2 -2
  201. data/spec/hashring_spec.rb +17 -39
  202. data/spec/java_grid_spec.rb +0 -2
  203. data/spec/misc_spec.rb +111 -0
  204. data/spec/mono_spec.rb +50 -3
  205. data/spec/reliable_message_spec.rb +38 -0
  206. data/spec/spec_helper.rb +4 -4
  207. data/spec/spec_helper_minimal.rb +10 -0
  208. data/web/app.rb +108 -86
  209. data/web/config/trinidad.yml +1 -0
  210. data/web/views/add_player.erb +25 -0
  211. data/web/views/index.erb +0 -0
  212. data/web/views/layout.erb +48 -0
  213. data/web/views/login.erb +25 -0
  214. data/web/views/players.erb +24 -0
  215. metadata +209 -94
  216. data/config/config.example.yml +0 -100
  217. data/config/regions.example.yml +0 -9
  218. data/games/example/lib/authentication_handler.rb +0 -69
  219. data/games/models.rb +0 -3
  220. data/games/models/clan_member.rb +0 -8
  221. data/games/models/clan_profile.rb +0 -9
  222. data/games/models/player.rb +0 -7
  223. data/games/plugins.rb +0 -1
  224. data/games/plugins/team_handler.rb +0 -49
  225. data/games/preload.rb +0 -13
  226. data/java/.gitignore +0 -1
  227. data/java/build.gradle +0 -95
  228. data/java/component.erb +0 -396
  229. data/java/gradle/wrapper/gradle-wrapper.jar +0 -0
  230. data/java/src/main/java/com/game_machine/core/GameMachineLoader.java +0 -25
  231. data/java/src/main/java/com/game_machine/core/Grid.java +0 -195
  232. data/java/src/main/resources/logback.xml +0 -14
  233. data/java/src/main/resources/logging.properties +0 -3
  234. data/lib/game_machine/actor/mono_actor.rb +0 -89
  235. data/lib/game_machine/auth_handlers/base.rb +0 -21
  236. data/lib/game_machine/auth_handlers/public.rb +0 -34
  237. data/lib/game_machine/endpoints/mono_gateway.rb +0 -87
  238. data/lib/game_machine/endpoints/tcp.rb +0 -51
  239. data/lib/game_machine/endpoints/tcp_handler.rb +0 -75
  240. data/lib/game_machine/endpoints/udp.rb +0 -88
  241. data/lib/game_machine/game_loader.rb +0 -46
  242. data/lib/game_machine/game_systems/region_settings.rb +0 -13
  243. data/lib/game_machine/hashring.rb +0 -48
  244. data/lib/game_machine/settings.rb +0 -11
  245. data/mono/server/actor.cs +0 -37
  246. data/mono/server/iactor.cs +0 -11
  247. data/mono/server/message_util.cs +0 -29
  248. data/mono/server/proxy_client.cs +0 -73
  249. data/mono/server/proxy_server.cs +0 -30
  250. data/mono/server/test_actor.cs +0 -33
  251. data/pathfinding/include/pathfind.h +0 -167
  252. data/pathfinding/pathfind.cpp +0 -174
  253. data/pathfinding/pathfinder.cs +0 -66
  254. data/script/server.sh +0 -109
  255. data/script/watch.sh +0 -11
  256. data/spec/commands/navigation_commands_spec.rb +0 -51
  257. data/spec/game_systems/entity_tracking_spec.rb +0 -64
  258. data/spec/navigation/detour_navmesh_spec.rb +0 -34
  259. data/spec/navigation/detour_path_spec.rb +0 -25
  260. data/spec/udp_server_spec.rb +0 -10
  261. data/web/controllers/auth_controller.rb +0 -19
  262. data/web/controllers/base_controller.rb +0 -16
  263. data/web/controllers/index_controller.rb +0 -7
  264. data/web/controllers/log_controller.rb +0 -47
  265. data/web/controllers/messages_controller.rb +0 -59
  266. data/web/controllers/player_register_controller.rb +0 -15
  267. data/web/views/game_messages.haml +0 -45
  268. data/web/views/index.haml +0 -6
  269. data/web/views/layout.haml +0 -41
  270. data/web/views/logs.haml +0 -32
  271. data/web/views/player_register.haml +0 -22
  272. data/web/views/player_registered.haml +0 -2
  273. data/web/views/register_layout.haml +0 -22
  274. data/web/views/restart.haml +0 -35
@@ -12,82 +12,27 @@ module GameMachine
12
12
  java_dir = File.join(File.expand_path(Dir.pwd),'java')
13
13
  unless File.directory?(java_dir)
14
14
  puts "Please run game_machine from your game directory"
15
- exit 0
15
+ exit 1
16
16
  end
17
17
  end
18
18
 
19
19
  def set_environment
20
20
  ENV['GAME_ENV'] = options[:environment]
21
- if options[:config]
22
- ENV['CONFIG_FILE'] = options[:config]
23
- end
24
- end
25
-
26
-
27
- def self.exit!
28
- clear_restart_file
29
- System.exit(0)
30
- end
31
-
32
- def self.ensure_tmp
33
- tmp_path = File.join(ENV['APP_ROOT'],'tmp')
34
- FileUtils.mkdir_p tmp_path
35
- end
36
-
37
- def self.restart?
38
- File.exists?(restart_file)
39
- end
40
-
41
- def self.restart!
42
- FileUtils.touch restart_file
43
- end
44
-
45
- def self.clear_restart_file
46
- if File.exists?(restart_file)
47
- FileUtils.rm(restart_file)
48
- end
49
- end
50
-
51
- def self.restart_file
52
- File.join(ENV['APP_ROOT'],'tmp','gm_restart.txt')
53
- end
54
-
55
- def self.run_in_loop
56
- ensure_tmp
57
- clear_restart_file
58
-
59
- build_cmd = "jruby bin/game_machine build"
60
- run_cmd = "jruby bin/game_machine s -r"
61
- loop do
62
- system(build_cmd)
63
- system(run_cmd)
64
- end
65
21
  end
66
22
 
67
23
  def run!
68
24
  check_start_dir
69
25
 
70
26
  GameMachine.logger.info "Starting with options = #{options.inspect}"
71
- GameMachine::Application.initialize!(options[:server],true)
27
+ GameMachine::Application.initialize!
72
28
  GameMachine::Application.start
73
29
  end
74
30
 
75
- def load_server_from_file
76
- path = File.join(File.expand_path(Dir.pwd),'servername.txt')
77
- if File.exists?(path)
78
- return File.read(path).chomp
79
- else
80
- nil
81
- end
82
- end
83
-
84
31
  def parse_arguments(arguments)
85
32
  options = {}
86
33
 
87
34
  OptionParser.new do |opt|
88
35
  opt.banner = "Usage: game_machine server [options]"
89
- opt.on('-r', '--restartable', 'If tmp/gm_restart.txt should trigger a restart') { |v| options[:restartable] = v }
90
- opt.on('-s', '--server=name', String, 'Server name') { |v| options[:server] = v.strip }
91
36
  opt.on('-c', '--config=name', String, 'Configuration file') { |v| options[:config] = v.strip }
92
37
  opt.on("-e", "--environment=name", String,
93
38
  "Specifies the environment to run under (development/production).",
@@ -95,23 +40,11 @@ module GameMachine
95
40
  opt.parse!(arguments)
96
41
  end
97
42
 
98
- if options.has_key?(:restartable)
99
- ENV['RESTARTABLE'] = 'true'
100
- end
101
43
 
102
44
  unless options.has_key?(:environment)
103
45
  options[:environment] = 'development'
104
46
  end
105
47
 
106
- unless options.has_key?(:server)
107
- options[:server] = 'default'
108
- end
109
-
110
- if server = load_server_from_file
111
- options[:server] = server
112
- puts "server name #{server} set from servername.txt"
113
- end
114
-
115
48
  options
116
49
  end
117
50
 
@@ -3,20 +3,35 @@ require_relative 'data_stores/memory'
3
3
  require_relative 'data_stores/couchbase'
4
4
  require_relative 'data_stores/mapdb'
5
5
  require_relative 'data_stores/redis'
6
+ require_relative 'data_stores/jdbc'
7
+ require_relative 'data_stores/gamecloud'
6
8
 
7
9
  module GameMachine
8
10
  class DataStore
9
11
  include Singleton
10
12
  extend Forwardable
11
13
 
12
- def_delegators :@store, :delete, :delete_all, :shutdown, :keys, :dump, :load
14
+ def_delegators :@store, :delete_all, :shutdown, :keys, :dump, :load
13
15
 
14
- attr_reader :store
16
+ attr_reader :store, :serialization, :classmap
15
17
  def initialize
16
- @store_name = Application.config.data_store
18
+ @store_name = Application.config.datastore.store
19
+ @serialization = Application.config.datastore.serialization
20
+ @classmap = {}
17
21
  connect
18
22
  end
19
23
 
24
+ def class_cache(classname)
25
+ return MessageLib::Entity if classname.nil?
26
+
27
+ if cached = classmap.fetch(classname,nil)
28
+ return cached
29
+ else
30
+ classmap[classname] = "GameMachine::MessageLib::#{classname}".constantize
31
+ classmap[classname]
32
+ end
33
+ end
34
+
20
35
  def set_store(store_name)
21
36
  @store = nil
22
37
  @store_name = store_name
@@ -24,23 +39,94 @@ module GameMachine
24
39
  end
25
40
 
26
41
 
27
- def get(key)
28
- value = @store.get(key)
42
+ # for get/set/delete, backend stores return a value or nil, and raise on any underlying error
43
+ # Propogating the error could mess up actor states so we don't do that.
44
+ # Callers should treat nil/false as a failure. We log errors so they
45
+ # can be dealt with
46
+
47
+ def get(key,classname='Entity')
48
+ value = nil
49
+ begin
50
+ value = @store.get(key)
51
+ rescue Exception => e
52
+ GameMachine.logger.error(e.message+"\n"+e.backtrace.join("\n"))
53
+ return nil
54
+ end
55
+
29
56
  return nil if value.nil?
30
- if value.is_a?(String)
31
- MessageLib::Entity.new.set_id(key).set_json_storage(
32
- MessageLib::JsonStorage.new.set_json(value)
33
- )
57
+ klass = class_cache(classname)
58
+
59
+ if serialization == 'json'
60
+ klass.parse_from_json(value)
34
61
  else
35
- MessageLib::Entity.parse_from(value)
62
+ klass.parse_from(value)
36
63
  end
37
64
  end
38
65
 
39
- def set(key,value)
40
- if value.has_json_storage
41
- @store.set(key,value.json_storage.json)
66
+ def query(scope,query_string,limit,classname)
67
+ query_string = scope + "##" + query_string
68
+ values = []
69
+ begin
70
+ # Returns an array
71
+ values = @store.query(query_string,limit)
72
+ rescue Exception => e
73
+ GameMachine.logger.error(e.message+"\n"+e.backtrace.join("\n"))
74
+ return values
75
+ end
76
+
77
+ return values if values.empty?
78
+ klass = class_cache(classname)
79
+
80
+ if serialization == 'json'
81
+ messages = values.map do |r|
82
+ message = klass.parse_from_json(r)
83
+ if message.id.match(/##/)
84
+ message.setId(klass.unscopeId(message.id))
85
+ end
86
+ message
87
+ end
42
88
  else
43
- @store.set(key,value.to_byte_array)
89
+ messages = values.map do |r|
90
+ message = klass.parse_from(r.to_byte_array)
91
+ if message.id.match(/##/)
92
+ message.setId(klass.unscopeId(message.id))
93
+ end
94
+ message
95
+ end
96
+ end
97
+
98
+ messages
99
+ end
100
+
101
+ def set(key,value)
102
+ begin
103
+ if serialization == 'json'
104
+ @store.set(key,value.to_json)
105
+ else
106
+ @store.set(key,value.to_byte_array)
107
+ end
108
+ rescue Exception => e
109
+ GameMachine.logger.error(e.message+"\n"+e.backtrace.join("\n"))
110
+ return false
111
+ end
112
+ end
113
+
114
+ def delete(key)
115
+ begin
116
+ @store.delete(key)
117
+ rescue Exception => e
118
+ GameMachine.logger.error(e.message+"\n"+e.backtrace.join("\n"))
119
+ return false
120
+ end
121
+ end
122
+
123
+ def delete_matching(scope,query_string)
124
+ query_string = scope + "##" + query_string
125
+ begin
126
+ @store.delete_matching(query_string)
127
+ rescue Exception => e
128
+ GameMachine.logger.error(e.message+"\n"+e.backtrace.join("\n"))
129
+ return false
44
130
  end
45
131
  end
46
132
 
@@ -51,8 +137,18 @@ module GameMachine
51
137
  send("connect_#{@store_name}")
52
138
  end
53
139
 
140
+ def connect_gamecloud
141
+ @store = DataStores::Gamecloud.new(serialization)
142
+ @store.connect
143
+ end
144
+
145
+ def connect_jdbc
146
+ @store = DataStores::Jdbc.new(serialization)
147
+ @store.connect
148
+ end
149
+
54
150
  def connect_couchbase
55
- @store = DataStores::Couchbase.new
151
+ @store = DataStores::Couchbase.new(serialization)
56
152
  @store.connect
57
153
  end
58
154
 
@@ -6,16 +6,21 @@ module GameMachine
6
6
 
7
7
  def_delegators :@client, :get, :set, :delete, :shutdown
8
8
 
9
+ attr_reader :serialization
10
+ def initialize(serialization)
11
+ @serialization = serialization
12
+ end
13
+
9
14
  def connect
10
15
  @client ||= JavaLib::CouchbaseClient.new(builder)
11
16
  end
12
17
 
13
18
  def bucket
14
- Application.config.couchbase_bucket || 'default'
19
+ Application.config.couchbase.bucket || 'default'
15
20
  end
16
21
 
17
22
  def password
18
- Application.config.couchbase_password || ''
23
+ Application.config.couchbase.password || ''
19
24
  end
20
25
 
21
26
  def builder
@@ -28,7 +33,7 @@ module GameMachine
28
33
  end
29
34
 
30
35
  def servers
31
- Application.config.couchbase_servers.map {|server| java.net.URI.new(server)}
36
+ Application.config.couchbase.servers.map {|server| java.net.URI.new(server)}
32
37
  end
33
38
  end
34
39
  end
@@ -0,0 +1,93 @@
1
+ module GameMachine
2
+ module DataStores
3
+ class Gamecloud
4
+
5
+ attr_reader :serialization
6
+ def initialize(serialization)
7
+ @serialization = serialization
8
+ end
9
+
10
+ def connect
11
+ JavaLib::CloudClient.get_instance.set_credentials(
12
+ Application.config.gamecloud.host,
13
+ Application.config.gamecloud.user,
14
+ Application.config.gamecloud.api_key
15
+ )
16
+ end
17
+
18
+ def handle_entity_response(response)
19
+ if response.status == 200
20
+ serialization == 'json' ? response.stringBody : response.byteBody
21
+ elsif response.status == 404
22
+ nil
23
+ else
24
+ raise "Gamecloud.get returned status: #{response.status}"
25
+ end
26
+ end
27
+
28
+ def handle_response(response)
29
+ if [200,204].include?(response.status)
30
+ true
31
+ elsif response.status == 404
32
+ false
33
+ else
34
+ raise "Gamecloud.get returned status: #{response.status}"
35
+ end
36
+ end
37
+
38
+ def query(query,limit)
39
+ response = JavaLib::CloudClient.get_instance.query(query,limit,serialization)
40
+ if response.status == 200
41
+ query_response = MessageLib::CloudQueryResponse.parse_from(response.byteBody)
42
+
43
+ if serialization == 'json'
44
+ if query_response.getJsonMessageList.nil?
45
+ messages = []
46
+ else
47
+ messages = query_response.getJsonMessageList
48
+ end
49
+ else
50
+ if query_response.getByteMessageList.nil?
51
+ messages = []
52
+ else
53
+ messages = query_response.getByteMessageList
54
+ end
55
+ end
56
+ messages
57
+ elsif response.status == 404
58
+ []
59
+ else
60
+ raise "Gamecloud.get returned status: #{response.status}"
61
+ end
62
+ end
63
+
64
+ def get(id)
65
+ if serialization == 'json'
66
+ response = JavaLib::CloudClient.get_instance.getString(id)
67
+ else
68
+ response = JavaLib::CloudClient.get_instance.getBytes(id)
69
+ end
70
+ handle_entity_response(response)
71
+ end
72
+
73
+ def delete(id)
74
+ response = JavaLib::CloudClient.get_instance.delete(id)
75
+ handle_response(response)
76
+ end
77
+
78
+ def delete_matching(query_string)
79
+ response = JavaLib::CloudClient.get_instance.delete_matching(query_string)
80
+ handle_response(response)
81
+ end
82
+
83
+ def set(id,value)
84
+ if serialization == 'json'
85
+ response = JavaLib::CloudClient.get_instance.putString(id,value)
86
+ else
87
+ response = JavaLib::CloudClient.get_instance.putBytes(id,value)
88
+ end
89
+ handle_response(response)
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,98 @@
1
+ module GameMachine
2
+ module DataStores
3
+ class Jdbc
4
+
5
+ attr_reader :serialization
6
+ def initialize(serialization)
7
+ @serialization = serialization
8
+ end
9
+
10
+ def dbname
11
+ 'game_machine'
12
+ end
13
+
14
+ def dbtype
15
+ @dbtype ||= case Application.config.jdbc_driver
16
+ when 'org.postgresql.Driver'
17
+ :postgres
18
+ when 'com.mysql.jdbc.Driver'
19
+ :mysql
20
+ else
21
+ raise "Unknown JDBC driver #{Application.config.jdbc_driver}"
22
+ end
23
+ end
24
+
25
+ def connect
26
+ @pool ||= GameMachine::JavaLib::DbConnectionPool.getInstance
27
+ unless @pool.connect(
28
+ dbname,
29
+ Application.config.jdbc.hostname,
30
+ Application.config.jdbc.port,
31
+ Application.config.jdbc.database,
32
+ Application.config.jdbc.ds,
33
+ Application.config.jdbc.username,
34
+ Application.config.jdbc.password || ''
35
+ )
36
+ GameMachine.logger.error "Unable to establish database connection, exiting"
37
+ System.exit 1
38
+ end
39
+ @pool
40
+ end
41
+
42
+ # type 0 = string, 1 = byte array
43
+ def set(id,value)
44
+ connection = @pool.get_connection(dbname)
45
+ if value.is_a?(String)
46
+ value = value.to_java_bytes
47
+ type = 0
48
+ else
49
+ type = 1
50
+ end
51
+
52
+ if dbtype == :mysql
53
+ s = connection.prepare_statement("INSERT INTO entities (id,value,datatype) VALUES (?,?,?) ON DUPLICATE KEY UPDATE value=VALUES(value)")
54
+ else
55
+ s = connection.prepare_statement("INSERT INTO entities (id,value,datatype) VALUES (?,?,?)")
56
+ end
57
+
58
+ s.setString(1,id.to_java_string)
59
+ s.setBytes(2,value)
60
+ s.setInt(3,type)
61
+ s.execute_update
62
+ s.close
63
+ connection.close
64
+ end
65
+
66
+ def delete(id)
67
+ connection = @pool.get_connection(dbname)
68
+ s = connection.prepare_statement("DELETE from entities where id = ?")
69
+ s.setString(1,id.to_java_string)
70
+ s.execute_update
71
+ s.close
72
+ connection.close
73
+ end
74
+
75
+ def get(key)
76
+ value = nil
77
+ type = nil
78
+ connection = @pool.get_connection(dbname)
79
+ s = connection.create_statement
80
+ res = s.execute_query("SELECT value,datatype from entities where id = '#{key}' LIMIT 1")
81
+ if res.next
82
+ value = res.get_bytes('value')
83
+ type = res.get_int("datatype")
84
+ end
85
+
86
+ s.close
87
+ connection.close
88
+
89
+ if type == 0
90
+ value.to_s
91
+ else
92
+ value
93
+ end
94
+ end
95
+
96
+ end
97
+ end
98
+ end