Example #1
0
 def on_join(self, lobby_id):
     """Join lobby"""
     lobby_id = int(lobby_id)
     lobby = Lobby.query.get(lobby_id)
     if g.player:
         # Leave or delete old lobbies
         lobby_deletes = leave_or_delete_all_lobbies(g.player)
         lobby.join(g.player)
         db.session.commit()
         # Broadcast update to the joined lobby and lobby listing
         self.broadcast_event('/lobby/', 'update',
                 make_lobby_item_dict(lobby))
         self.broadcast_event('/lobby/%d' % lobby_id, 'update',
                 make_lobby_dict(lobby))
         # Send leave or deletes
         [self.broadcast_leave_or_delete(*l_d) for l_d in lobby_deletes]
         # Update ACL
         self.add_acl_method('on_set_team')
         self.del_acl_method('on_create_lobby')
         self.del_acl_method('on_join')
         if lobby.owner == g.player:
             self.add_acl_method('on_kick')
             self.add_acl_method('on_set_lobby_name')
             self.add_acl_method('on_set_team_name')
     self.add_acl_method('on_leave')
     # Set lobby id and start listening on redis
     self.lobby_id = lobby_id
     self.subscribe('/lobby/%d' % lobby_id)
     current_app.logger.info('Player %s joined Lobby %d', (g.player.id if
         g.player else 'Anonymous', lobby_id))
     return True, make_lobby_dict(lobby)
Example #2
0
 def on_join(self, lobby_id):
     """Join lobby"""
     lobby = Lobby.query.get(lobby_id)
     if g.player:
         # Leave or delete old lobbies
         lobby_deletes = leave_or_delete_all_lobbies(g.player)
         lobby.join(g.player)
         db.session.commit()
         # Broadcast update to the joined lobby and lobby listing
         self.broadcast_event('/lobby/', 'update',
                 make_lobby_item_dict(lobby))
         self.broadcast_event('/lobby/%d' % lobby_id, 'update',
                 make_lobby_dict(lobby))
         # Send leave or deletes
         [self.broadcast_leave_or_delete(*l_d) for l_d in lobby_deletes]
         # Update ACL
         self.add_acl_method('on_set_team')
         self.del_acl_method('on_create_lobby')
         self.del_acl_method('on_join')
         if lobby.owner == g.player:
             self.add_acl_method('on_kick')
             self.add_acl_method('on_set_lobby_name')
             self.add_acl_method('on_set_team_name')
     self.add_acl_method('on_leave')
     # Set lobby id and start listening on redis
     self.lobby_id = lobby_id
     self.subscribe('/lobby/%d' % lobby_id)
     current_app.logger.info('Player %s joined Lobby %d', (g.player.id if
         g.player else 'Anonymous', lobby_id))
     return True, make_lobby_dict(lobby)
Example #3
0
 def on_leave(self):
     """Leave lobby"""
     assert self.lobby_id
     assert self.listener_job
     lobby = Lobby.query.get(self.lobby_id)
     # If we're auth'd do actual leave, otherwise just kill job and lobby_id
     if g.player:
         # If we're owner delete, if not just leave
         if lobby.owner is g.player:
             db.session.remove(lobby)
             db.session.commit()
             # Broadcast delete to lobby and lobby listing
             self.broadcast_event('/lobby/', 'delete', self.lobby_id)
             self.broadcast_event('/lobby/%d' % self.lobby_id, 'delete')
         else:
             lobby.leave(g.player)
             db.session.commit()
             # Broadcast leave to lobby and lobby listing
             self.broadcast_event('/lobby/', 'update',
                     make_lobby_item_dict(lobby))
             self.broadcast_event('/lobby/%d', 'update',
                     make_lobby_dict(lobby))
         # Update ACL
         self.del_acl_method('on_set_team')
         if 'on_set_class' in self.allowed_methods:
             self.del_acl_method('on_set_class')
             self.del_acl_method('on_toggle_ready')
         self.del_acl_method('on_leave')
         self.add_acl_method('on_join')
         self.add_acl_method('on_create_lobby')
     self.unsubscribe('/lobby/%d' % self.lobby_id)
     current_app.logger.info('Player %s left Lobby %d', (g.player.id if
         g.player else 'Anonymous', self.lobby_id))
     self.lobby_id = None
     return True
Example #4
0
 def on_leave(self):
     """Leave lobby"""
     assert self.lobby_id
     lobby = Lobby.query.get(self.lobby_id)
     # If we're auth'd do actual leave, otherwise just kill job and lobby_id
     if g.player:
         # If we're owner delete, if not just leave
         if lobby.owner is g.player:
             db.session.remove(lobby)
             db.session.commit()
             # Broadcast delete to lobby and lobby listing
             self.broadcast_event('/lobby/', 'delete', self.lobby_id)
             self.broadcast_event('/lobby/%d' % self.lobby_id, 'delete')
         else:
             lobby.leave(g.player)
             db.session.commit()
             # Broadcast leave to lobby and lobby listing
             self.broadcast_event('/lobby/', 'update',
                     make_lobby_item_dict(lobby))
             self.broadcast_event('/lobby/%d', 'update',
                     make_lobby_dict(lobby))
         # Update ACL
         self.del_acl_method('on_set_team')
         if 'on_set_class' in self.allowed_methods:
             self.del_acl_method('on_set_class')
             self.del_acl_method('on_toggle_ready')
         self.del_acl_method('on_leave')
         self.add_acl_method('on_join')
         self.add_acl_method('on_create_lobby')
     self.unsubscribe('/lobby/%d' % self.lobby_id)
     current_app.logger.info('Player %s left Lobby %d', (g.player.id if
         g.player else 'Anonymous', self.lobby_id))
     self.lobby_id = None
     return True
Example #5
0
 def broadcast_leave_or_delete(self, lobby, is_delete):
     """Broadcast leave or delete to redis"""
     if is_delete:
         self.broadcast_event('/lobby/', 'delete', lobby.id)
         self.broadcast_event('/lobby/%d', 'delete', lobby.id)
     else:
         self.broadcast_event('/lobby/', 'update',
                 make_lobby_item_dict(lobby))
         self.broadcast_event('/lobby/%d', 'update', make_lobby_dict(lobby))
Example #6
0
 def broadcast_leave_or_delete(self, lobby, is_delete):
     """Broadcast leave or delete to redis"""
     if is_delete:
         self.broadcast_event('/lobby/', 'delete', lobby.id)
         self.broadcast_event('/lobby/%d', 'delete', lobby.id)
     else:
         self.broadcast_event('/lobby/', 'update',
                 make_lobby_item_dict(lobby))
         self.broadcast_event('/lobby/%d', 'update', make_lobby_dict(lobby))
Example #7
0
 def on_set_class(self, class_id):
     """Set class in lobby"""
     assert self.lobby_id
     assert g.player
     lobby = Lobby.query.get(self.lobby_id)
     lobby.set_class(g.player, class_id)
     db.session.commit()
     # Broadcast redis update
     self.broadcast_event('/lobby/', 'update', make_lobby_item_dict(lobby))
     self.broadcast_event('/lobby/%d', 'update', make_lobby_dict(lobby))
     current_app.logger.info('Player: %d set class to %s', (g.player.id,
         class_id if class_id else 'Random'))
     return True
Example #8
0
 def on_set_class(self, class_id):
     """Set class in lobby"""
     assert self.lobby_id
     assert g.player
     lobby = Lobby.query.get(self.lobby_id)
     lobby.set_class(g.player, class_id)
     db.session.commit()
     # Broadcast redis update
     self.broadcast_event('/lobby/', 'update', make_lobby_item_dict(lobby))
     self.broadcast_event('/lobby/%d', 'update', make_lobby_dict(lobby))
     current_app.logger.info('Player %d set class to %s', (g.player.id,
         class_id if class_id else 'Random'))
     return True
Example #9
0
 def on_set_lobby_name(self, name):
     assert g.player
     assert self.lobby_id
     lobby = Lobby.query.get(self.lobby_id)
     assert lobby.owner == g.player
     if name is None or len(name) == 0:
         return False, 'name_none'
     lobby.name = name
     db.session.commit()
     self.broadcast_event('/lobby/', 'update',
             make_lobby_item_dict(lobby))
     self.broadcast_event('/lobby/%d', 'update',
             make_lobby_dict(lobby))
Example #10
0
 def on_set_lobby_name(self, name):
     assert g.player
     assert self.lobby_id
     lobby = Lobby.query.get(self.lobby_id)
     assert lobby.owner == g.player
     if name is None or len(name) == 0:
         return False, 'name_none'
     lobby.name = name
     db.session.commit()
     self.broadcast_event('/lobby/', 'update',
             make_lobby_item_dict(lobby))
     self.broadcast_event('/lobby/%d', 'update',
             make_lobby_dict(lobby))
     current_app.logger.info('Player: %d set Lobby: %d\'s name to `%s`' %
             (g.player.id, self.lobby_id, name))
     return True
Example #11
0
 def on_set_team_name(self, team_id, name):
     assert g.player
     assert self.lobby_id
     lobby = Lobby.query.get(self.lobby_id)
     assert lobby.owner == g.player
     if team_id is None:
         return False, 'team_is_spectator'
     if not team_id < len(lobby.teams):
         return False, 'team_dne'
     if name is None or len(name) == 0:
         return False, 'name_none'
     team = lobby.teams[team_id]
     team.name = name
     db.session.commit()
     self.broadcast_event('/lobby/%d', 'update',
             make_lobby_dict(lobby))
     return True
Example #12
0
 def on_kick(self, player_id):
     """Kick a player from the lobby"""
     assert g.player
     assert self.lobby_id
     lobby = Lobby.query.get(self.lobby_id)
     assert lobby.owner == g.player
     player = Player.query.get(player_id)
     if player is None:
         return False, 'player_dne'
     if not lobby.has_player(player):
         return False, 'player_dne_lobby'
     lobby.leave(player)
     db.session.commit()
     self.broadcast_event('/lobby/', 'update',
             make_lobby_item_dict(lobby))
     self.broadcast_event('/lobby/%d', 'update',
             make_lobby_dict(lobby))
     return True
Example #13
0
 def on_toggle_ready(self):
     """Toggle ready in lobby"""
     assert self.lobby_id
     assert g.player
     lobby = Lobby.query.get(self.lobby_id)
     lobby.toggle_ready(g.player)
     db.session.commit()
     # Broadcast redis update
     self.broadcast_event('/lobby/%d', 'update', make_lobby_dict(lobby))
     # Update ACL
     if lobby.is_ready_player(g.player):
         self.del_acl_method('on_set_class')
         self.del_acl_method('on_set_team')
     else:
         self.del_acl_method('on_set_class')
         self.del_acl_method('on_set_team')
     current_app.logger.info('Player %d toggled ready to %s', (g.player.id,
         lobby.is_ready_player(g.player)))
     return True
Example #14
0
 def on_toggle_ready(self):
     """Toggle ready in lobby"""
     assert self.lobby_id
     assert g.player
     lobby = Lobby.query.get(self.lobby_id)
     lobby.toggle_ready(g.player)
     db.session.commit()
     # Broadcast redis update
     self.broadcast_event('/lobby/%d', 'update', make_lobby_dict(lobby))
     # Update ACL
     if lobby.is_ready_player(g.player):
         self.del_acl_method('on_set_class')
         self.del_acl_method('on_set_team')
     else:
         self.del_acl_method('on_set_class')
         self.del_acl_method('on_set_team')
     current_app.logger.info('Player: %d toggled ready to %s', (g.player.id,
         lobby.is_ready_player(g.player)))
     return True
Example #15
0
 def on_set_team_name(self, team_id, name):
     assert g.player
     assert self.lobby_id
     lobby = Lobby.query.get(self.lobby_id)
     assert lobby.owner == g.player
     if team_id is None:
         return False, 'team_is_spectator'
     if not team_id < len(lobby.teams):
         return False, 'team_dne'
     if name is None or len(name) == 0:
         return False, 'name_none'
     team = lobby.teams[team_id]
     team.name = name
     db.session.commit()
     self.broadcast_event('/lobby/%d', 'update',
             make_lobby_dict(lobby))
     current_app.logger.info('Player: %d set Team: %d\'s name to `%s` on Lobby: %d' %
             (g.player.id, team_id, name, self.lobby_id))
     return True
Example #16
0
 def on_set_team(self, team_id):
     """Set team in lobby"""
     assert self.lobby_id
     assert g.player
     lobby = Lobby.query.get(self.lobby_id)
     lobby.set_team(g.player, team_id)
     db.session.commit()
     # Broadcast redis update
     self.broadcast_event('/lobby/', 'update', make_lobby_item_dict(lobby))
     self.broadcast_event('/lobby/%d', 'update', make_lobby_dict(lobby))
     # Update ACL
     if team_id is not None:
         self.add_acl_method('on_set_class')
         self.add_acl_method('on_toggle_ready')
     else:
         self.del_acl_method('on_set_class')
         self.del_acl_method('on_toggle_ready')
     current_app.logger.info('Player %d set team to %s', (g.player.id,
         team_id if team_id else 'Spectator'))
     return True
Example #17
0
 def on_kick(self, player_id):
     """Kick a player from the lobby"""
     assert g.player
     assert self.lobby_id
     lobby = Lobby.query.get(self.lobby_id)
     assert lobby.owner == g.player
     player = Player.query.get(player_id)
     if player is None:
         return False, 'player_dne'
     if not player in lobby:
         return False, 'player_dne_lobby'
     lobby.leave(player)
     db.session.commit()
     self.broadcast_event('/lobby/', 'update',
             make_lobby_item_dict(lobby))
     self.broadcast_event('/lobby/%d', 'update',
             make_lobby_dict(lobby))
     current_app.logger.info('Player: %d kicked Player: %d from Lobby: %d' %
             (g.player.id, player_id, self.lobby_id))
     return True
Example #18
0
 def on_set_team(self, team_id):
     """Set team in lobby"""
     assert self.lobby_id
     assert g.player
     lobby = Lobby.query.get(self.lobby_id)
     lobby.set_team(g.player, team_id)
     db.session.commit()
     # Broadcast redis update
     self.broadcast_event('/lobby/', 'update', make_lobby_item_dict(lobby))
     self.broadcast_event('/lobby/%d', 'update', make_lobby_dict(lobby))
     # Update ACL
     if team_id is not None:
         self.add_acl_method('on_set_class')
         self.add_acl_method('on_toggle_ready')
     else:
         self.del_acl_method('on_set_class')
         self.del_acl_method('on_toggle_ready')
     current_app.logger.info('Player: %d set team to %s', (g.player.id,
         team_id if team_id else 'Spectator'))
     return True
Example #19
0
 def disconnect(self, *args, **kwargs):
     """Disconnect handling"""
     # If auth'd and in a lobby, leave the lobby
     if g.player and self.lobby_id:
         lobby = Lobby.query.get(self.lobby_id)
         # If owner, this means delete, otherwise just leave
         if lobby.owner is g.player:
             db.session.remove(lobby)
             db.session.commit()
             self.broadcast_event('/lobby/', 'delete', lobby_id)
             self.broadcast_event('/lobby/%d' % lobby_id, 'delete')
         else:
             lobby.leave(g.player)
             db.session.commit()
             self.broadcast_event('/lobby/', 'update',
                     make_lobby_item_dict(lobby))
             self.broadcast_event('/lobby/%d', 'update',
                     make_lobby_dict(lobby))
     current_app.logger.info('Player: %s disconnected from LobbyNamespace' %
             g.player.id if g.player else 'Anonymous')
     # Do real disconnect logic
     super(LobbyNamespace, self).disconnect(*args, **kwargs)
Example #20
0
 def disconnect(self, *args, **kwargs):
     """Disconnect handling"""
     # If auth'd and in a lobby, leave the lobby
     if g.player and self.lobby_id:
         lobby = Lobby.query.get(self.lobby_id)
         # If owner, this means delete, otherwise just leave
         if lobby.owner is g.player:
             db.session.remove(lobby)
             db.session.commit()
             self.broadcast_event('/lobby/', 'delete', lobby_id)
             self.broadcast_event('/lobby/%d' % lobby_id, 'delete')
         else:
             lobby.leave(g.player)
             db.session.commit()
             self.broadcast_event('/lobby/', 'update',
                     make_lobby_item_dict(lobby))
             self.broadcast_event('/lobby/%d', 'update',
                     make_lobby_dict(lobby))
     current_app.logger.info('Player: %s disconnected from LobbyNamespace' %
             g.player.id if g.player else 'Anonymous')
     # Do real disconnect logic
     super(LobbyNamespace, self).disconnect(*args, **kwargs)