74 lines
3.0 KiB
Python
74 lines
3.0 KiB
Python
from app.extensions import redis_controller, db
|
|
from app.models.place import Place
|
|
from app.models.placeservers import PlaceServer
|
|
from app.models.placeserver_players import PlaceServerPlayer
|
|
from app.models.universe import Universe
|
|
|
|
from sqlalchemy import func
|
|
|
|
def ClearPlayingCountCache( PlaceObj : Place ):
|
|
"""
|
|
Clears the cache for the amount of players playing a place
|
|
|
|
:param PlaceObj: The place to clear the cache for
|
|
|
|
:returns: None
|
|
"""
|
|
redis_controller.delete(f"place:{str(PlaceObj.placeid)}:playercount:placeinfo")
|
|
redis_controller.delete(f"universe:{str(PlaceObj.parent_universe_id)}:playercount:placeinfo")
|
|
|
|
def ClearUniversePlayingCountCache( UniverseObj : Universe ):
|
|
"""
|
|
Clears the cache for the amount of players playing in a universe
|
|
|
|
:param UniverseObj: The universe to clear the cache for
|
|
|
|
:returns: None
|
|
"""
|
|
redis_controller.delete(f"universe:{str(UniverseObj.id)}:playercount:placeinfo")
|
|
|
|
def GetPlayingCount( PlaceObj : Place, IgnoreCache = False ) -> int:
|
|
"""
|
|
Returns the amount of players playing a place
|
|
|
|
:param PlaceObj: The place to get the amount of players playing
|
|
:param IgnoreCache: Whether to ignore the cache or not
|
|
|
|
:returns: int (The amount of players playing a place)
|
|
"""
|
|
if not IgnoreCache:
|
|
PlayingCount = redis_controller.get(f"place:{str(PlaceObj.placeid)}:playercount:placeinfo")
|
|
if PlayingCount is not None:
|
|
return int(PlayingCount)
|
|
|
|
PlayingCount = 0
|
|
# Check if there even is a place server
|
|
PlaceServerObj : PlaceServer = PlaceServer.query.filter_by(serverPlaceId=PlaceObj.placeid).first()
|
|
if PlaceServerObj is not None:
|
|
# Get all place servers with the same placeid
|
|
PlaceServerObjs = PlaceServer.query.filter_by(serverPlaceId=PlaceObj.placeid).all()
|
|
for PlaceServerObj in PlaceServerObjs:
|
|
PlayingCount += PlaceServerObj.playerCount
|
|
|
|
redis_controller.set(f"place:{str(PlaceObj.placeid)}:playercount:placeinfo", PlayingCount, ex=60)
|
|
return PlayingCount
|
|
|
|
def GetUniversePlayingCount( UniverseObj : Universe, IgnoreCache : bool = False ) -> int:
|
|
"""
|
|
Returns the amount of players playing in a universe
|
|
|
|
:param UniverseObj: The universe to get the amount of players playing
|
|
:param IgnoreCache: Whether to ignore the cache or not
|
|
|
|
:returns: int (The amount of players playing in a universe)
|
|
"""
|
|
|
|
if not IgnoreCache:
|
|
PlayingCount = redis_controller.get(f"universe:{str(UniverseObj.id)}:playercount:placeinfo")
|
|
if PlayingCount is not None:
|
|
return int(PlayingCount)
|
|
|
|
PlayingCount = PlaceServer.query.join(Place, PlaceServer.serverPlaceId == Place.placeid ).filter(Place.parent_universe_id == UniverseObj.id).all()
|
|
PlayingCount = sum([PlaceServerObj.playerCount for PlaceServerObj in PlayingCount])
|
|
redis_controller.set(f"universe:{str(UniverseObj.id)}:playercount:placeinfo", PlayingCount, ex=60)
|
|
return PlayingCount |