game_machine 0.0.10 → 0.0.11
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 +4 -4
- data/Gemfile.lock +13 -9
- data/config/config.example.yml +8 -1
- data/config/game_messages.proto +1 -0
- data/config/messages.proto +4 -0
- data/games/example/lib/npc.rb +8 -7
- data/games/models.rb +3 -0
- data/games/models/clan_member.rb +8 -0
- data/games/models/clan_profile.rb +9 -0
- data/games/models/player.rb +7 -0
- data/games/plugins.rb +1 -0
- data/games/plugins/team_handler.rb +49 -0
- data/games/preload.rb +5 -0
- data/java/build.gradle +3 -1
- data/java/gradle.properties +1 -1
- data/lib/game_machine/actor/base.rb +5 -1
- data/lib/game_machine/application.rb +13 -3
- data/lib/game_machine/commands/datastore_commands.rb +3 -7
- data/lib/game_machine/commands/player_commands.rb +3 -0
- data/lib/game_machine/data_store.rb +22 -1
- data/lib/game_machine/data_stores/couchbase.rb +18 -1
- data/lib/game_machine/endpoints/udp_incoming.rb +0 -1
- data/lib/game_machine/game_systems.rb +2 -0
- data/lib/game_machine/game_systems/chat.rb +33 -13
- data/lib/game_machine/game_systems/chat_manager.rb +24 -3
- data/lib/game_machine/game_systems/json_model_persistence.rb +23 -0
- data/lib/game_machine/game_systems/region_manager.rb +1 -1
- data/lib/game_machine/game_systems/team_manager.rb +421 -0
- data/lib/game_machine/handlers/request.rb +4 -0
- data/lib/game_machine/model.rb +59 -13
- data/lib/game_machine/models.rb +17 -0
- data/lib/game_machine/models/create_team.rb +9 -0
- data/lib/game_machine/models/destroy_team.rb +8 -0
- data/lib/game_machine/models/echo_test.rb +6 -0
- data/lib/game_machine/models/end_match.rb +7 -0
- data/lib/game_machine/models/find_match.rb +7 -0
- data/lib/game_machine/models/join_team.rb +7 -0
- data/lib/game_machine/models/leave_team.rb +7 -0
- data/lib/game_machine/models/match.rb +9 -0
- data/lib/game_machine/models/player_team.rb +9 -0
- data/lib/game_machine/models/start_match.rb +8 -0
- data/lib/game_machine/models/team.rb +11 -0
- data/lib/game_machine/models/team_accept_invite.rb +9 -0
- data/lib/game_machine/models/team_invite.rb +8 -0
- data/lib/game_machine/models/team_joined.rb +7 -0
- data/lib/game_machine/models/team_left.rb +7 -0
- data/lib/game_machine/models/teams.rb +7 -0
- data/lib/game_machine/models/teams_request.rb +6 -0
- data/lib/game_machine/object_db.rb +17 -11
- data/lib/game_machine/version.rb +1 -1
- data/lib/game_machine/write_behind_cache.rb +1 -1
- data/spec/actor/actor_spec.rb +5 -5
- data/spec/actor/ref_spec.rb +10 -10
- data/spec/client_manager_spec.rb +9 -9
- data/spec/commands/chat_commands_spec.rb +1 -1
- data/spec/commands/datastore_commands_spec.rb +10 -14
- data/spec/commands/navigation_commands_spec.rb +3 -3
- data/spec/commands/player_commands_spec.rb +1 -1
- data/spec/game_systems/agents/controller_spec.rb +6 -6
- data/spec/game_systems/chat_manager_spec.rb +1 -1
- data/spec/game_systems/chat_spec.rb +15 -17
- data/spec/game_systems/region_manager_spec.rb +31 -21
- data/spec/game_systems/team_manager_spec.rb +291 -0
- data/spec/grid_spec.rb +11 -1
- data/spec/handlers/authentication_spec.rb +1 -10
- data/spec/handlers/game_spec.rb +2 -2
- data/spec/handlers/request_spec.rb +10 -21
- data/spec/hashring_spec.rb +11 -11
- data/spec/java_grid_spec.rb +1 -1
- data/spec/misc_spec.rb +2 -2
- data/spec/model_spec.rb +26 -14
- data/spec/write_behind_cache_spec.rb +15 -15
- metadata +29 -8
- data/lib/game_machine/bot/chat.rb +0 -66
- data/lib/game_machine/bot/client.rb +0 -54
- data/spec/data_stores/mapdb_spec.rb +0 -46
- data/spec/data_stores/redis_spec.rb +0 -44
@@ -22,7 +22,11 @@ module GameMachine
|
|
22
22
|
aspect %w(ChatInvite Player)
|
23
23
|
|
24
24
|
def define_update_procs
|
25
|
-
commands.datastore.define_dbproc(:chat_remove_subscriber) do |current_entity,update_entity|
|
25
|
+
commands.datastore.define_dbproc(:chat_remove_subscriber) do |id,current_entity,update_entity|
|
26
|
+
if current_entity.nil?
|
27
|
+
current_entity = MessageLib::Entity.new.set_id(id)
|
28
|
+
end
|
29
|
+
|
26
30
|
if current_entity.has_subscribers
|
27
31
|
if subscriber_id_list = current_entity.subscribers.get_subscriber_id_list.to_a
|
28
32
|
current_entity.subscribers.set_subscriber_id_list(nil)
|
@@ -36,10 +40,15 @@ module GameMachine
|
|
36
40
|
current_entity
|
37
41
|
end
|
38
42
|
|
39
|
-
commands.datastore.define_dbproc(:chat_add_subscriber) do |current_entity,update_entity|
|
43
|
+
commands.datastore.define_dbproc(:chat_add_subscriber) do |id,current_entity,update_entity|
|
44
|
+
if current_entity.nil?
|
45
|
+
current_entity = MessageLib::Entity.new.set_id(id)
|
46
|
+
end
|
47
|
+
|
40
48
|
unless current_entity.has_subscribers
|
41
49
|
current_entity.set_subscribers(MessageLib::Subscribers.new)
|
42
50
|
end
|
51
|
+
|
43
52
|
subscriber_id_list = current_entity.subscribers.get_subscriber_id_list.to_a
|
44
53
|
unless subscriber_id_list.include?(update_entity.id)
|
45
54
|
current_entity.subscribers.add_subscriber_id(update_entity.id)
|
@@ -54,6 +63,14 @@ module GameMachine
|
|
54
63
|
end
|
55
64
|
|
56
65
|
def on_receive(message)
|
66
|
+
if message.is_a?(MessageLib::ChatDestroy)
|
67
|
+
if @chat_actors.has_key?(message.player_id)
|
68
|
+
ask_child(message.player_id,message)
|
69
|
+
destroy_child(message.player_id)
|
70
|
+
end
|
71
|
+
return
|
72
|
+
end
|
73
|
+
|
57
74
|
if message.has_chat_invite
|
58
75
|
send_invite(message.chat_invite)
|
59
76
|
elsif message.has_chat_register
|
@@ -85,12 +102,16 @@ module GameMachine
|
|
85
102
|
if @chat_actors.has_key?(chat_id)
|
86
103
|
forward_chat_request(chat_id,JavaLib::PoisonPill.get_instance)
|
87
104
|
@chat_actors.delete(chat_id)
|
88
|
-
GameMachine.logger.
|
105
|
+
GameMachine.logger.info "Chat child for #{chat_id} killed"
|
89
106
|
else
|
90
107
|
GameMachine.logger.info "chat actor for chat_id #{chat_id} not found"
|
91
108
|
end
|
92
109
|
end
|
93
110
|
|
111
|
+
def ask_child(chat_id,message)
|
112
|
+
@chat_actors[chat_id].ask(message,500)
|
113
|
+
end
|
114
|
+
|
94
115
|
def forward_chat_request(chat_id,message)
|
95
116
|
@chat_actors[chat_id].tell(message,nil)
|
96
117
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module GameMachine
|
2
|
+
module GameSystems
|
3
|
+
class JsonModelPersistence < Actor::Base
|
4
|
+
include Commands
|
5
|
+
|
6
|
+
def on_receive(message)
|
7
|
+
json_model = message
|
8
|
+
if json_model.id
|
9
|
+
if json_model.id.match(/find_by_id/)
|
10
|
+
id = json_model.id.sub('find_by_id','')
|
11
|
+
if json_model = json_model.class.find(id)
|
12
|
+
commands.player.send_message(json_model,message.player_id)
|
13
|
+
end
|
14
|
+
else
|
15
|
+
json_model.save
|
16
|
+
end
|
17
|
+
else
|
18
|
+
unhandled(message)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,421 @@
|
|
1
|
+
module GameMachine
|
2
|
+
module GameSystems
|
3
|
+
class TeamManager < Actor::Base
|
4
|
+
include Models
|
5
|
+
include Commands
|
6
|
+
|
7
|
+
attr_reader :team_handler
|
8
|
+
def post_init(*args)
|
9
|
+
if Application.config.team_handler
|
10
|
+
@team_handler = Application.config.team_handler.constantize.new
|
11
|
+
end
|
12
|
+
define_update_procs
|
13
|
+
commands.misc.client_manager_register(self.class.name)
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.match_id_for(team_names)
|
17
|
+
team_names.sort.join('_')
|
18
|
+
end
|
19
|
+
|
20
|
+
def chat_channel(topic,flags)
|
21
|
+
MessageLib::ChatChannel.new.set_name(topic).set_flags(flags)
|
22
|
+
end
|
23
|
+
|
24
|
+
def player_entity(player_id)
|
25
|
+
MessageLib::Entity.new.set_player(MessageLib::Player.new.set_id(player_id))
|
26
|
+
end
|
27
|
+
|
28
|
+
def flags
|
29
|
+
'subscribers'
|
30
|
+
end
|
31
|
+
|
32
|
+
def leave_chat(topic,player_id)
|
33
|
+
leave_chat = MessageLib::LeaveChat.new.add_chat_channel(chat_channel(topic,flags))
|
34
|
+
entity = player_entity(player_id).set_leave_chat(leave_chat)
|
35
|
+
ChatManager.find.tell(entity)
|
36
|
+
end
|
37
|
+
|
38
|
+
def join_chat(topic,player_id)
|
39
|
+
join_chat = MessageLib::JoinChat.new.add_chat_channel(chat_channel(topic,flags))
|
40
|
+
entity = player_entity(player_id).set_join_chat(join_chat)
|
41
|
+
ChatManager.find.tell(entity)
|
42
|
+
end
|
43
|
+
|
44
|
+
def send_team_joined(team_name,player_id)
|
45
|
+
commands.player.send_message(TeamJoined.new(:name => team_name),player_id)
|
46
|
+
end
|
47
|
+
|
48
|
+
def send_team_left(team_name,player_id)
|
49
|
+
commands.player.send_message(TeamLeft.new(:name => team_name),player_id)
|
50
|
+
end
|
51
|
+
|
52
|
+
def create_player_team(team_name,player_id)
|
53
|
+
player_team = PlayerTeam.new(:id => player_id, :name => team_name)
|
54
|
+
player_team.save!
|
55
|
+
end
|
56
|
+
|
57
|
+
def send_team(message)
|
58
|
+
if player_team = PlayerTeam.find!(message.player_id)
|
59
|
+
if team = Team.find!(player_team.name)
|
60
|
+
commands.player.send_message(team,message.player_id)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def teams_request(message)
|
66
|
+
if teams = Teams.find('teams')
|
67
|
+
teams = handler_teams_filter(teams,message)
|
68
|
+
commands.player.send_message(teams,message.player_id)
|
69
|
+
end
|
70
|
+
send_team(message)
|
71
|
+
end
|
72
|
+
|
73
|
+
def destroy_player_team(player_id)
|
74
|
+
if player_team = PlayerTeam.find!(player_id)
|
75
|
+
player_team.destroy!
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def team_id(team_name)
|
80
|
+
Uniqueid.generate_token(team_name)
|
81
|
+
end
|
82
|
+
|
83
|
+
def default_max_members
|
84
|
+
100
|
85
|
+
end
|
86
|
+
|
87
|
+
def can_add_member?(team_name,player_id)
|
88
|
+
return true unless team_handler
|
89
|
+
team_handler.can_add_member?(team_name, player_id)
|
90
|
+
end
|
91
|
+
|
92
|
+
def can_create_team?(team_name,player_id)
|
93
|
+
return true unless team_handler
|
94
|
+
team_handler.can_create_team?(team_name, player_id)
|
95
|
+
end
|
96
|
+
|
97
|
+
def handler_update_teams
|
98
|
+
return true unless team_handler
|
99
|
+
team_handler.update_teams
|
100
|
+
end
|
101
|
+
|
102
|
+
def destroy_on_owner_leave?
|
103
|
+
return true unless team_handler
|
104
|
+
team_handler.destroy_on_owner_leave?
|
105
|
+
end
|
106
|
+
|
107
|
+
def handler_teams_filter(teams,teams_request)
|
108
|
+
return teams unless team_handler
|
109
|
+
team_handler.teams_filter(teams,teams_request)
|
110
|
+
end
|
111
|
+
|
112
|
+
def handler_find_match(team_name)
|
113
|
+
return true unless team_handler
|
114
|
+
team_handler.match!(team_name)
|
115
|
+
end
|
116
|
+
|
117
|
+
def handler_match_started(match)
|
118
|
+
return true unless team_handler
|
119
|
+
team_handler.match_started(match)
|
120
|
+
end
|
121
|
+
|
122
|
+
def create_team(message)
|
123
|
+
unless can_create_team?(message.name,message.player_id)
|
124
|
+
return false
|
125
|
+
end
|
126
|
+
|
127
|
+
if team = Team.find!(message.name)
|
128
|
+
send_team_joined(team.name,message.player_id)
|
129
|
+
return false
|
130
|
+
end
|
131
|
+
|
132
|
+
message.max_members ||= default_max_members
|
133
|
+
|
134
|
+
team = Team.new(
|
135
|
+
:id => message.name,
|
136
|
+
:team_id => team_id(message.name),
|
137
|
+
:name => message.name,
|
138
|
+
:owner => message.owner,
|
139
|
+
:access => message.access,
|
140
|
+
:max_members => message.max_members,
|
141
|
+
:destroy_on_owner_leave => destroy_on_owner_leave?,
|
142
|
+
:members => [message.owner]
|
143
|
+
)
|
144
|
+
|
145
|
+
create_player_team(team.name,message.player_id)
|
146
|
+
if team.access == 'private'
|
147
|
+
team.invite_id = Uniqueid.generate_token(team.name)
|
148
|
+
end
|
149
|
+
|
150
|
+
team.save!
|
151
|
+
commands.datastore.call_dbproc(:team_add_team,'teams',team.to_storage_entity,false)
|
152
|
+
join_chat(team.name,team.owner)
|
153
|
+
send_team_joined(team.name,message.player_id)
|
154
|
+
handler_update_teams
|
155
|
+
end
|
156
|
+
|
157
|
+
def member_disconnected(message)
|
158
|
+
if player_team = PlayerTeam.find!(message.player_id)
|
159
|
+
leave = LeaveTeam.new(
|
160
|
+
:name => player_team.name,
|
161
|
+
:player_id => message.player_id
|
162
|
+
)
|
163
|
+
leave_team(leave)
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
def destroy_team(message,force=false)
|
168
|
+
if team = Team.find!(message.name)
|
169
|
+
if team.owner == message.player_id || force
|
170
|
+
team.members.each do |member|
|
171
|
+
leave_chat(message.name,member)
|
172
|
+
destroy_player_team(member)
|
173
|
+
send_team_left(team.name,member)
|
174
|
+
end
|
175
|
+
commands.datastore.call_dbproc(:team_remove_team,'teams',team.to_storage_entity,false)
|
176
|
+
team.destroy!
|
177
|
+
handler_update_teams
|
178
|
+
|
179
|
+
# team destroyed ends match
|
180
|
+
if team.match_id
|
181
|
+
end_match(EndMatch.new(:match_id => team.match_id))
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
185
|
+
unless force
|
186
|
+
send_team_left(message.name,message.player_id)
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
def join_team(message,invite_accepted=false)
|
191
|
+
unless can_add_member?(message.name,message.player_id)
|
192
|
+
return false
|
193
|
+
end
|
194
|
+
|
195
|
+
if team = Team.find!(message.name)
|
196
|
+
|
197
|
+
if (team.max_members.nil? || team.max_members == 0)
|
198
|
+
team.max_members = default_max_members
|
199
|
+
end
|
200
|
+
|
201
|
+
if team.members.size >= team.max_members
|
202
|
+
return
|
203
|
+
end
|
204
|
+
|
205
|
+
if team.access == 'public' || invite_accepted
|
206
|
+
unless team.members.include?(message.player_id)
|
207
|
+
team.members << message.player_id
|
208
|
+
team.save!
|
209
|
+
create_player_team(team.name,message.player_id)
|
210
|
+
commands.datastore.call_dbproc(:team_update_team,'teams',team.to_storage_entity,false)
|
211
|
+
end
|
212
|
+
join_chat(team.name,message.player_id)
|
213
|
+
send_team_joined(message.name,message.player_id)
|
214
|
+
end
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
def leave_team(message)
|
219
|
+
if team = Team.find!(message.name)
|
220
|
+
if message.player_id == team.owner && destroy_on_owner_leave?
|
221
|
+
destroy_team(
|
222
|
+
DestroyTeam.new(
|
223
|
+
:name => team.name,
|
224
|
+
:player_id => message.player_id
|
225
|
+
)
|
226
|
+
)
|
227
|
+
return
|
228
|
+
end
|
229
|
+
|
230
|
+
|
231
|
+
# Last member, just destroy
|
232
|
+
if team.members.include?(message.player_id) && team.members.size == 1
|
233
|
+
destroy_team(
|
234
|
+
DestroyTeam.new(
|
235
|
+
:name => team.name,
|
236
|
+
:player_id => message.player_id
|
237
|
+
),
|
238
|
+
true
|
239
|
+
)
|
240
|
+
return
|
241
|
+
end
|
242
|
+
|
243
|
+
team.members.delete_if {|member| member == message.player_id}
|
244
|
+
|
245
|
+
# Reassign owner if they leave
|
246
|
+
if team.owner == message.player_id
|
247
|
+
team.owner = team.members.first
|
248
|
+
end
|
249
|
+
|
250
|
+
team.save!
|
251
|
+
commands.datastore.call_dbproc(:team_update_team,'teams',team.to_storage_entity,false)
|
252
|
+
destroy_player_team(message.player_id)
|
253
|
+
send_team_left(message.name,message.player_id)
|
254
|
+
leave_chat(message.name,message.player_id)
|
255
|
+
else
|
256
|
+
send_team_left(message.name,message.player_id)
|
257
|
+
end
|
258
|
+
end
|
259
|
+
|
260
|
+
def team_invite(message)
|
261
|
+
if team = Team.find!(message.name)
|
262
|
+
if message.player_id == team.owner
|
263
|
+
message.invite_id = team.invite_id
|
264
|
+
commands.player.send_message(message,message.invitee)
|
265
|
+
end
|
266
|
+
end
|
267
|
+
end
|
268
|
+
|
269
|
+
def team_accept_invite(message)
|
270
|
+
if team = Team.find!(message.name)
|
271
|
+
if message.invite_id == team.invite_id
|
272
|
+
join_team(JoinTeam.new(:name => team.name, :player_id => message.player_id),true)
|
273
|
+
end
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
277
|
+
def end_match(message)
|
278
|
+
if message.player_id
|
279
|
+
return
|
280
|
+
end
|
281
|
+
|
282
|
+
if match = Match.find!(message.match_id)
|
283
|
+
match.teams.each do |team|
|
284
|
+
if team = Team.find!(team.name)
|
285
|
+
team.match_id = nil
|
286
|
+
team.save!
|
287
|
+
end
|
288
|
+
end
|
289
|
+
match.destroy
|
290
|
+
end
|
291
|
+
end
|
292
|
+
|
293
|
+
# Called internally or from another actor to start an already defined match
|
294
|
+
def start_match(message)
|
295
|
+
# Don't accept requests from clients
|
296
|
+
if message.player_id
|
297
|
+
return
|
298
|
+
end
|
299
|
+
|
300
|
+
match_id = self.class.match_id_for(message.team_names)
|
301
|
+
if match = Match.find!(match_id)
|
302
|
+
GameMachine.logger.warn "Match #{match_id} already created"
|
303
|
+
return
|
304
|
+
end
|
305
|
+
|
306
|
+
teams = message.team_names.collect {|name| Team.find!(name)}.compact
|
307
|
+
if teams.size != message.team_names.size
|
308
|
+
GameMachne.logger.warn "#{self.class.name} Unable to find all teams for match"
|
309
|
+
return
|
310
|
+
end
|
311
|
+
|
312
|
+
server = Akka.instance.hashring.bucket_for(match_id)
|
313
|
+
server = server.sub('akka.tcp://cluster@','').split(':').first
|
314
|
+
|
315
|
+
match = Match.new(
|
316
|
+
:id => match_id,
|
317
|
+
:teams => teams,
|
318
|
+
:server => server,
|
319
|
+
:game_handler => message.game_handler
|
320
|
+
)
|
321
|
+
|
322
|
+
teams.each do |team|
|
323
|
+
team.match_id = match_id
|
324
|
+
team.match_server = server
|
325
|
+
team.save
|
326
|
+
commands.datastore.call_dbproc(:team_update_team,'teams',team.to_storage_entity,false)
|
327
|
+
end
|
328
|
+
|
329
|
+
match.save
|
330
|
+
handler_match_started(match)
|
331
|
+
GameMachine.logger.info "#{self.class.name} Match #{match} started"
|
332
|
+
end
|
333
|
+
|
334
|
+
def find_match(message)
|
335
|
+
if team = Team.find(message.team_name)
|
336
|
+
if s = handler_find_match(message.team_name)
|
337
|
+
GameMachine.logger.info "Match found: #{s}"
|
338
|
+
start_match(s)
|
339
|
+
end
|
340
|
+
end
|
341
|
+
end
|
342
|
+
|
343
|
+
def on_receive(message)
|
344
|
+
if message.is_a?(CreateTeam)
|
345
|
+
create_team(message)
|
346
|
+
send_team(message)
|
347
|
+
elsif message.is_a?(DestroyTeam)
|
348
|
+
destroy_team(message)
|
349
|
+
elsif message.is_a?(TeamInvite)
|
350
|
+
team_invite(message)
|
351
|
+
elsif message.is_a?(TeamAcceptInvite)
|
352
|
+
team_accept_invite(message)
|
353
|
+
elsif message.is_a?(JoinTeam)
|
354
|
+
join_team(message)
|
355
|
+
send_team(message)
|
356
|
+
elsif message.is_a?(LeaveTeam)
|
357
|
+
leave_team(message)
|
358
|
+
elsif message.is_a?(TeamsRequest)
|
359
|
+
teams_request(message)
|
360
|
+
elsif message.is_a?(FindMatch)
|
361
|
+
find_match(message)
|
362
|
+
elsif message.is_a?(StartMatch)
|
363
|
+
start_match(message)
|
364
|
+
elsif message.is_a?(EndMatch)
|
365
|
+
end_match(message)
|
366
|
+
elsif message.is_a?(MessageLib::ClientManagerEvent)
|
367
|
+
if message.event == 'disconnected'
|
368
|
+
member_disconnected(message)
|
369
|
+
GameMachine.logger.info "#{self.class.name} #{message.player_id} removed from team(disconnected)"
|
370
|
+
end
|
371
|
+
else
|
372
|
+
unhandled(message)
|
373
|
+
end
|
374
|
+
end
|
375
|
+
|
376
|
+
def define_update_procs
|
377
|
+
commands.datastore.define_dbproc(:team_update_team) do |id,current_entity,update_entity|
|
378
|
+
if current_entity.nil?
|
379
|
+
teams = Teams.new(:teams => [],:id => id)
|
380
|
+
else
|
381
|
+
teams = Teams.from_entity(current_entity,:json_storage)
|
382
|
+
end
|
383
|
+
|
384
|
+
team = Team.from_entity(update_entity,:json_storage)
|
385
|
+
team_to_update = teams.teams.select {|t| t.name == team.name}.first
|
386
|
+
if team_to_update
|
387
|
+
teams.teams.delete_if {|t| t.name == team.name}
|
388
|
+
teams.teams << team
|
389
|
+
end
|
390
|
+
teams.to_storage_entity
|
391
|
+
end
|
392
|
+
|
393
|
+
commands.datastore.define_dbproc(:team_add_team) do |id,current_entity,update_entity|
|
394
|
+
if current_entity.nil?
|
395
|
+
teams = Teams.new(:teams => [],:id => id)
|
396
|
+
else
|
397
|
+
teams = Teams.from_entity(current_entity,:json_storage)
|
398
|
+
end
|
399
|
+
|
400
|
+
team = Team.from_entity(update_entity,:json_storage)
|
401
|
+
teams.teams.delete_if {|t| t.name == team.name}
|
402
|
+
teams.teams << team
|
403
|
+
teams.to_storage_entity
|
404
|
+
end
|
405
|
+
|
406
|
+
commands.datastore.define_dbproc(:team_remove_team) do |id,current_entity,update_entity|
|
407
|
+
if current_entity.nil?
|
408
|
+
teams = Teams.new(:teams => [],:id => id)
|
409
|
+
else
|
410
|
+
teams = Teams.from_entity(current_entity,:json_storage)
|
411
|
+
end
|
412
|
+
|
413
|
+
team = Team.from_entity(update_entity,:json_storage)
|
414
|
+
teams.teams.delete_if {|t| t.name == team.name}
|
415
|
+
teams.to_storage_entity
|
416
|
+
end
|
417
|
+
|
418
|
+
end
|
419
|
+
end
|
420
|
+
end
|
421
|
+
end
|