示例#1
0
文件: api.py 项目: ffuuugor/moscowMrX
    def make_newgame(self, players, mrx_pos, code="code"):
        if type(players) != list or len(players) < 2:
            return {"status": "fail", "msg": "Not enough players"}

        mrx_username = players[int(mrx_pos)]

        try:
            game = Game(status="mrx_active", code=code, start=datetime.now(), duration=timedelta(hours=2, minutes=30))
            cherrypy.request.db.add(game)

            #create roles
            for player in players:
                users = cherrypy.request.db.query(User).filter(User.username == player).all()

                if len(users) > 1:
                    raise cherrypy.HTTPError(500, "more than one user with given username")
                elif len(users) == 0:
                    # cherrypy.request.db.rollback()
                    return {"status":"fail", "msg":"No user found %s" % player}
                else:
                    user = users[0]

                active_games = cherrypy.request.db.query(Game).join(Game.roles).filter(
                    Game.status == "active").filter(Role.user_id == user.id).all()

                if len(active_games) > 0:
                    # cherrypy.request.db.rollback()
                    return {"status":"fail", "msg":"User %s already has active game" % player}

                if player == mrx_username:
                    role_name = "mrx"
                else:
                    role_name = "detective"

                role = Role(user_id=user.id, game=game, role=role_name)
                cherrypy.request.db.add(role)

            #create tasks
            photo_points = cherrypy.request.db.query(Point).all()
            for point in photo_points:
                mrx_task = Task(game=game, status="pending")
                det_task = Task(game=game, status="unavailable")

                real_center = LatLon(Latitude(point.lat), Longitude(point.lng))
                offset = GeoVector(initial_heading=random.randint(0,360),
                                   distance=random.randint(0,point.radius)/1000.0)

                print offset

                task_center = real_center + offset

                crime = Crime(
                    game_id=game.id,
                    point_id=point.id,
                    center_lat=task_center.lat.decimal_degree,
                    center_lng=task_center.lon.decimal_degree,
                    radius=point.radius,
                    status="not_commited",
                    mrx_task=mrx_task,
                    det_task=det_task
                )

                mrx_task.crime = crime
                det_task.crime = crime

                cherrypy.request.db.add(mrx_task)
                cherrypy.request.db.add(det_task)
                cherrypy.request.db.add(crime)

            cherrypy.request.db.commit()
            return {"status": "success"}
        except Exception:
            cherrypy.request.db.rollback()
            raise