Bladeren bron

Using PointSources in game_api

Kirk Trombley 5 jaren geleden
bovenliggende
commit
fd3d111111
2 gewijzigde bestanden met toevoegingen van 33 en 22 verwijderingen
  1. 30 22
      server/game_api.py
  2. 3 0
      server/lib.py

+ 30 - 22
server/game_api.py

@@ -1,3 +1,5 @@
+import threading
+
 from flask import Blueprint, abort, request, jsonify
 
 import db
@@ -5,8 +7,30 @@ import lib
 
 game = Blueprint("game", __name__)
 
-rsv_gen = lib.random_street_view_generator(only_america=False)
-rsv_gen_usa = lib.random_street_view_generator(only_america=True)
+stock_target = 5
+# (gen_method, only_america): lib.PointSource
+sources = {
+    ("MAPCRUNCH", False): lib.MapCrunchPointSource(stock_target=stock_target, max_retries=1000, only_america=False),
+    ("MAPCRUNCH", True): lib.MapCrunchPointSource(stock_target=stock_target, max_retries=1000, only_america=True),
+    ("RANDOMSTREETVIEW", False): lib.RSVPointSource(stock_target=stock_target, only_america=False),
+    ("RANDOMSTREETVIEW", True): lib.RSVPointSource(stock_target=stock_target, only_america=True),
+    ("URBAN", False): lib.UrbanPointSource(
+        stock_target=stock_target,
+        max_retries=100,
+        retries_per_point=30,
+        max_dist_km=25,
+        usa_chance=0.1
+    ),
+    ("URBAN", True): lib.UrbanPointSource(
+        stock_target=stock_target,
+        max_retries=100,
+        retries_per_point=30,
+        max_dist_km=25,
+        usa_chance=1.0
+    )
+}
+for src in sources.values():
+    threading.Thread(target=src.restock).start()
 
 
 def require_game(game_id):
@@ -52,27 +76,11 @@ def create_game():
     if not isinstance(gen_method, str):
         abort(400)
 
-    coords = []
-    
-    if gen_method == "MAPCRUNCH":
-        for _ in range(rounds):
-            maybe_coord = lib.generate_coord(only_america=only_america)
-            while maybe_coord is None:
-                maybe_coord = lib.generate_coord(only_america=only_america)
-            coords.append(maybe_coord)
-    elif gen_method == "RANDOMSTREETVIEW":
-        gen = rsv_gen_usa if only_america else rsv_gen
-        for _ in range(rounds):
-            coords.append(next(gen))
-    elif gen_method == "URBAN":
-        for _ in range(rounds):
-            maybe_coord = lib.urban_coord(only_america=only_america)
-            while maybe_coord is None:
-                maybe_coord = lib.urban_coord(only_america=only_america)
-            coords.append(maybe_coord)
-    else:
+    src = sources.get((gen_method, only_america), None)
+    if src is None:
         abort(400)
-
+    
+    coords = src.get_points(n=rounds)
     new_game = db.Game.create(timer, rounds, only_america, gen_method, coords)
 
     return jsonify({"gameId": new_game.game_id})

+ 3 - 0
server/lib.py

@@ -3,6 +3,7 @@ import math
 import random
 import threading
 import collections
+import time
 
 import requests
 import haversine
@@ -182,6 +183,7 @@ class MapCrunchPointSource(PointSource):
             )
             if pt is not None:
                 points.append(pt)
+        return points
 
 
 class RSVPointSource(PointSource):
@@ -215,6 +217,7 @@ class UrbanPointSource(PointSource):
             )
             if pt is not None:
                 points.append(pt)
+        return points
 
 
 mean_earth_radius_km = (6378 + 6357) / 2