public static async Task <bool> Announce(HostedGameData announce)
        {
            var payload = announce.ToJson();

            var isDupeRequest       = (_lastPayloadSent != null && _lastPayloadSent == payload);
            var enoughTimeHasPassed = (_lastSentAt == null ||
                                       (DateTime.Now - _lastSentAt.Value).TotalMinutes >= ANNOUNCE_INTERVAL_MINS);

            if (isDupeRequest && !enoughTimeHasPassed)
            {
                // An identical payload was already sent out!
                // Do not send a dupe unless enough time has passed
                return(true);
            }

            Plugin.Log?.Info($"Sending host announcement [{announce.Describe()}] for code {announce.ServerCode}");

            _lastPayloadSent = payload;
            _lastSentAt      = DateTime.Now;

            var responseOk = await PerformWebRequest("POST", "/announce", payload) != null;

            if (!responseOk)
            {
                // Request failed, allow immediate retry
                _lastPayloadSent = null;
                _lastSentAt      = null;
            }

            return(responseOk);
        }