public async Task SendMessage(string group, string message) { if (string.IsNullOrWhiteSpace(message)) { return; } // todo there is a corner case with only 1 player where the end will not end by answering the right answer // the reason is that the round is over but the detection logic does not catch that try { // get username GroupDetails.TryGetUsername(group, Context.ConnectionId, out string username); // check if we are in a round, and if so then check if this is a valid guess GroupDetails.TryGetInRound(group, out bool inround, out bool atendofround, out RoundDetails round); if (inround && round != null) { // check if this guess is currect if (message.IndexOf(round.Word, StringComparison.OrdinalIgnoreCase) >= 0) { // cannot guess for your own question or if you have already gotten it right if (!atendofround) { if (GroupDetails.TryGetHasAnswered(group, Context.ConnectionId, out bool answered) && !answered) { // give credit GroupDetails.AddToScore(group, Context.ConnectionId, (float)(round.End - DateTime.UtcNow).TotalSeconds); // mark that you answered GroupDetails.SetHasAnswered(group, Context.ConnectionId); } // check again GroupDetails.TryGetInRound(group, out inround, out atendofround, out round); } // remove the correct word from the phrase message = message.Replace(round.Word, "correct :)", StringComparison.OrdinalIgnoreCase); } } // send the message to everyone in this group await Clients.Group(group).SendAsync("ReceiveMessage", $"{username}: {message}"); // finish early if done if (atendofround) { await SendRoundComplete(group); } } catch (Exception e) { await Clients.Group(group).SendAsync("ReceiveMessage", $"failed to send message: {e.Message}"); } }
public override async Task OnDisconnectedAsync(Exception exception) { try { // get the group and username associated with this connectionid GroupDetails.TryGetUsername(Context.ConnectionId, out string group, out string username); try { // what if the owner drops? if (!string.IsNullOrWhiteSpace(group) && GroupDetails.TryGetOwner(group, out string ownerconnectionid)) { if (string.Equals(Context.ConnectionId, ownerconnectionid, StringComparison.OrdinalIgnoreCase)) { // ugh - we cannot proceed await SendMessage(group, "I left the game and no more rounds can be played (sorry)"); } else { // notify that you left await SendMessage(group, $"I left the game"); } } // clean up GroupDetails.Purge(Context.ConnectionId); // broadcast the updated group if (!string.IsNullOrWhiteSpace(group)) { await Clients.Group(group).SendAsync("ReceiveJoin", GetSortedUsers(GroupDetails.GetUsers(group))); } await base.OnDisconnectedAsync(exception); } catch (Exception e) { await Clients.Group(group).SendAsync("ReceiveMessage", $"failed to disconnect: {e.Message}"); } } catch (Exception e) { await Clients.All.SendAsync("ReceiveMessage", $"Catastrophic failure: {e.Message}"); } }