code: def _parse_action(self, action, current_time):
          
          if action.action_type == 'research':
              name = mgz.const.TECHNOLOGIES[action.data.technology_type]
              self._research[action.data.player_id].append({
                  'technology': name,
                  'timestamp': _timestamp_to_time(action.timestamp)
              })
          elif action.action_type == 'build':
              self._build[action.data.player_id].append({
                  'building': mgz.const.UNITS[action.data.building_type],
                  'timestamp': _timestamp_to_time(current_time),
                  'coordinates': {'x': action.data.x, 'y': action.data.y}
              })
          elif action.action_type == 'queue':
              for _ in range(0, int(action.data.number)):
                  self._queue.append({
                      'unit': mgz.const.UNITS[action.data.unit_type],
                      'timestamp': _timestamp_to_time(current_time)
                  })
docs: Parse a player action.
  
          TODO: handle cancels