import json import requests from dotenv import dotenv_values from datetime import datetime config = dotenv_values(".env") WEBHOOK_URL = config["url"] HOSTNAME = config["hostname"] STATUS_FILE = "previous_status.json" # could get it from the .env, but it's not secret information so :shrug: with open(STATUS_FILE, "r") as file: previous_status = json.load(file) try: response = requests.get( f"https://api.mcsrvstat.us/3/{HOSTNAME}", timeout=10 ) response.raise_for_status() server_status = response.json() except requests.RequestException as e: print(f"Failed to get server status: {e}") exit(1) previous_players_data = previous_status.get("players", {}) current_players_data = server_status.get("players", {}) previous_online = previous_players_data.get("online", 0) current_online = current_players_data.get("online", 0) previous_max = previous_players_data.get("max", 0) current_max = current_players_data.get("max", 0) previous_player_list = { player["name"] for player in previous_players_data.get("list", []) } current_player_list = { player["name"] for player in current_players_data.get("list", []) } if ( previous_online == current_online and previous_player_list == current_player_list ): print("nothing changed.") exit() if current_online > previous_online: pc_diff_sign = "+" elif current_online < previous_online: pc_diff_sign = "-" else: pc_diff_sign = " " if previous_online != current_online: pc_diff_previously = f"(previously {previous_online})" else: pc_diff_previously = "" playercount_diff_formatted = ( f"{pc_diff_sign} {current_online}/{current_max} " f"{pc_diff_previously}" ) joined_players = current_player_list - previous_player_list left_players = previous_player_list - current_player_list player_diff = [] for player in sorted(current_player_list): if player in joined_players: player_diff.append(f"+ {player}") else: player_diff.append(f" {player}") for player in sorted(left_players): player_diff.append(f"- {player}") player_diff_formatted = "\n".join(player_diff) or " no one is here." payload = { "content": f""" # status changed on {HOSTNAME} ```diff {playercount_diff_formatted} ``` ```diff {player_diff_formatted} ``` -# *at {datetime.now()}* """ } try: response = requests.post( WEBHOOK_URL, json=payload, timeout=10 ) response.raise_for_status() except requests.RequestException as e: print(f"failed to send webhook: {e}") exit(1) print("success") with open(STATUS_FILE, "w") as file: json.dump(server_status, file, indent=2)