public async Task <Message> Respond(Message message) { try { _logger.LogDebug("Validating peg message"); _pegRequestValidator.ValidatePegRequest(message); } catch (PegValidationException e) { _logger.LogWarning("Peg message is invalid: {@error}", e); return(new Message { Text = e.Message }); } _logger.LogDebug("Getting user information for id {userid}, username {username}", message.Sender.UserId, message.Sender.Username); var sender = await _pockyUserRepository.AddOrUpdateUserAsync(message.Sender.UserId, message.Sender.Username); var comment = string.Join(string.Empty, message.MessageParts.Skip(3).Select(x => x.Text)).Trim(); var requireKeywords = _configRepository.GetGeneralConfig("requireValues"); var keywords = _configRepository.GetStringConfig("keyword").ToArray(); var penaltyKeywords = _configRepository.GetStringConfig("penaltyKeyword").ToArray(); var linkedKeywords = _configRepository.GetStringConfig("linkedKeyword").Select(x => new LinkedKeyword(x)); keywords = keywords.Concat(linkedKeywords.Select(x => x.LinkedWord)).ToArray(); var isPegValid = _pegHelper.IsPegValid(comment, requireKeywords, keywords, penaltyKeywords); var numPegsGiven = sender.PegsGiven?.Count(x => _pegHelper.IsPegValid(x.Comment, requireKeywords, keywords, penaltyKeywords)) ?? 0; if (!sender.HasRole(Role.Unmetered) && (isPegValid && numPegsGiven >= _configRepository.GetGeneralConfig("limit"))) { _logger.LogDebug("User {userId} has reached their peg limit", sender.UserId); return(new Message { Text = "Sorry, but you have already spent all of your pegs for this fortnight." }); } var receiverId = message.MessageParts[2].UserId; var receiver = await _chatHelper.People.GetPersonAsync(receiverId).ConfigureAwait(false); var dbReceiver = await _pockyUserRepository.AddOrUpdateUserAsync(receiver.UserId, receiver.Username); _logger.LogInformation( "Giving peg with sender {senderId}, receiver {receiverId}, validity {isPegValid}, comment {comment}", sender.UserId, receiver.UserId, isPegValid, comment); await _pegGiver.GivePeg(comment, sender, dbReceiver, isPegValid?numPegsGiven + 1 : numPegsGiven).ConfigureAwait(false); return(null); }