diff --git a/Dockerfile b/Dockerfile index 09b00f9..b518630 100644 --- a/Dockerfile +++ b/Dockerfile @@ -45,6 +45,7 @@ COPY src/logic/queue_handler.py /app/src/logic/queue_handler.py COPY src/logic/setup_handlers.py /app/src/logic/setup_handlers.py COPY src/logic/time_handler.py /app/src/logic/time_handler.py COPY src/logic/webhook_handler.py /app/src/logic/webhook_handler.py +COPY src/logic/presence_handler.py /app/src/logic/presence_handler.py EXPOSE 8080 diff --git a/src/endpoints/logging.py b/src/endpoints/logging.py index defe13a..d3c64dc 100644 --- a/src/endpoints/logging.py +++ b/src/endpoints/logging.py @@ -92,7 +92,7 @@ def me_rich_presence(): user_id = session_manager.get_user_id(session_cookie) try: - logger.graylog_logger(level="info", handler="logging_meRichPresence", message=f"User: {user_id} - {request.get_json()}") + rich_presence_handler.update_presence(user_id, request.get_json()["userType"], request.get_json()["gameState"]) return "", 204 except TimeoutError: return jsonify({"status": "error"}) diff --git a/src/endpoints/web.py b/src/endpoints/web.py index a369a10..8bf7304 100644 --- a/src/endpoints/web.py +++ b/src/endpoints/web.py @@ -460,6 +460,9 @@ def debug_matchmaking(): len_queued_runners = matchmaking_queue.get_len_of_queued_runners() len_queued_hunters = matchmaking_queue.get_len_of_queued_hunters() len_open_lobbies = matchmaking_queue.get_len_of_open_lobbies() + len_rich_presence = rich_presence_handler.get_presence_length() + current_players_locker_room = rich_presence_handler.get_locker_room_presence() + current_players_arena = rich_presence_handler.get_arena_presence() lobby_data = matchmaking_queue.get_lobby_data() if dev_env == "true": @@ -469,14 +472,20 @@ def debug_matchmaking(): len_queued_runners=len_queued_runners, len_queued_hunters=len_queued_hunters, len_open_lobbies=len_open_lobbies, - lobby_data=lobby_data) + lobby_data=lobby_data, + len_rich_presence=len_rich_presence, + current_players_locker_room=current_players_locker_room, + current_players_arena=current_players_arena) return render_template('debug/anon_matchmaking.html', len_queue=len_queue, len_killed_lobbies=len_killed_lobbies, len_queued_runners=len_queued_runners, len_queued_hunters=len_queued_hunters, len_open_lobbies=len_open_lobbies, - lobby_data=lobby_data) + lobby_data=lobby_data, + len_rich_presence=len_rich_presence, + current_players_locker_room=current_players_locker_room, + current_players_arena=current_players_arena) @app.route("/api/debug/MatchMaking", methods=["GET"]) @@ -487,6 +496,7 @@ def api_debug_matchmaking(): len_queued_runners = matchmaking_queue.get_len_of_queued_runners() len_queued_hunters = matchmaking_queue.get_len_of_queued_hunters() len_open_lobbies = matchmaking_queue.get_len_of_open_lobbies() + len_rich_presence = rich_presence_handler.get_presence_length() lobby_data = matchmaking_queue.get_lobby_data() lobby_return_data = [] @@ -506,7 +516,8 @@ def api_debug_matchmaking(): "len_queued_runners": len_queued_runners, "len_queued_hunters": len_queued_hunters, "len_open_lobbies": len_open_lobbies, - "lobby_data": lobby_return_data + "lobby_data": lobby_return_data, + "len_rich_presence": len_rich_presence }) diff --git a/src/flask_definitions.py b/src/flask_definitions.py index dc7917a..a06c2c5 100644 --- a/src/flask_definitions.py +++ b/src/flask_definitions.py @@ -12,6 +12,7 @@ from logic.hash_handler import hash_handler from logic.challenge_handler_new import new_challenge_handler, get_challenge_ids_from_inventory from logic.level_handler import update_user_xp from logic.webhook_handler import webhook_handler +from logic.presence_handler import rich_presence_handler import json import os diff --git a/src/logic/presence_handler.py b/src/logic/presence_handler.py new file mode 100644 index 0000000..e3eed15 --- /dev/null +++ b/src/logic/presence_handler.py @@ -0,0 +1,48 @@ +from datetime import datetime + + +class Presence: + def __init__(self): + self.user_id = None + self.userType = None + self.gameState = None + self.last_updated = None + + +class RichPresenceHandler: + + def __init__(self): + self.presence = {} + + def update_presence(self, user_id, user_type, game_state): + if user_id not in self.presence: + self.presence[user_id] = Presence() + self.presence[user_id].user_id = user_id + self.presence[user_id].userType = user_type + self.presence[user_id].gameState = game_state + self.presence[user_id].last_updated = datetime.now() + + def cleanup_presence(self): + for user_id in list(self.presence.keys()): + # if user has not checked in the last 2 min remove + if (datetime.now() - self.presence[user_id].last_updated).seconds > 120: + del self.presence[user_id] + + def get_presence_length(self): + self.cleanup_presence() + return len(self.presence) + + def get_presence(self): + self.cleanup_presence() + return self.presence + + def get_arena_presence(self): + self.cleanup_presence() + return len({k: v for k, v in self.presence.items() if v.gameState == "Arena"}) + + def get_locker_room_presence(self): + self.cleanup_presence() + return len({k: v for k, v in self.presence.items() if v.gameState == "LockerRoom"}) + + +rich_presence_handler = RichPresenceHandler() diff --git a/src/templates/debug/anon_matchmaking.html b/src/templates/debug/anon_matchmaking.html index 816b2e0..622f646 100644 --- a/src/templates/debug/anon_matchmaking.html +++ b/src/templates/debug/anon_matchmaking.html @@ -57,6 +57,10 @@

Matchmaking Debug Information

+

Currently online players: {{ len_rich_presence }}

+

Current players in LockerRoom: {{ current_players_locker_room }}

+

Current players in Arena: {{ current_players_arena }}

+

Length of Queue: {{ len_queue }}

Killed Lobbies: {{ len_killed_lobbies }}

Queued Runners: {{ len_queued_runners }}

diff --git a/src/templates/debug/matchmaking.html b/src/templates/debug/matchmaking.html index 0d7b1de..681e175 100644 --- a/src/templates/debug/matchmaking.html +++ b/src/templates/debug/matchmaking.html @@ -57,6 +57,9 @@

Matchmaking Debug Information

+

Currently online players: {{ len_rich_presence }}

+

Current players in LockerRoom: {{ current_players_locker_room }}

+

Current players in Arena: {{ current_players_arena }}

Length of Queue: {{ len_queue }}

Killed Lobbies: {{ len_killed_lobbies }}

Queued Runners: {{ len_queued_runners }}