syntaxwebsite/app/util/placeinfo.py

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