public async Task <string> HandleWebhook([FromBody] JObject data) { logger.LogInformation(data.ToString(Formatting.None)); VenmoWebhookRequest request = data.ToObject <VenmoWebhookRequest>() !; string message = string.Empty; if (request.Type == "payment.created") { var databaseInfo = GetUserFromDatabases(request.Data.Target.User.Id); if (databaseInfo == null) { return(""); } if (WebhookSeenBefore(databaseInfo.Value.user, request.Data.Id, request.Data.Status)) { return(""); } SaveWebhookId(databaseInfo.Value.user, request.Data.Id, request.Data.Status, databaseInfo.Value.database); SlackCore slackApi = new SlackCore(databaseInfo.Value.workspaceInfo.BotToken); message += $"{request.Data.Actor.DisplayName} ({request.Data.Actor.Username}) "; if (request.Data.Action == "pay") { message += "paid you "; } else if (request.Data.Action == "charge") { message += "charged you "; } message += $"${request.Data.Amount:F2} for {request.Data.Note}"; if (request.Data.Action == "pay") { await SendSlackMessage(databaseInfo.Value.workspaceInfo, message, databaseInfo.Value.user.UserId, httpClient); } if (request.Data.Action == "charge") { message += $" | ID: {request.Data.Id}"; string acceptCommand = $"venmo complete accept {request.Data.Id}"; List <IBlock> blocks = new List <IBlock>(); blocks.Add(new Section(TextObject.CreatePlainTextObject($"{message}\n/{acceptCommand}"), null, null, new golf1052.SlackAPI.BlockKit.BlockElements.Image(request.Data.Actor.ProfilePictureUrl, $"Venmo profile picture of {request.Data.Actor.DisplayName}"))); blocks.Add(new Actions( new Button("Accept", "acceptButton", null, acceptCommand, null, null), new Button("Reject", "rejectButton", null, $"venmo complete reject {request.Data.Id}", null, null))); var channels = await slackApi.ConversationsList(false, "im"); var userChannel = channels.FirstOrDefault(c => c.User == databaseInfo.Value.user.UserId); if (userChannel != null) { await SendSlackMessage(databaseInfo.Value.workspaceInfo, $"{message}\n/{acceptCommand}", blocks, userChannel.Id, httpClient); } } } else if (request.Type == "payment.updated") { if (request.Data.Target.Type != "user") { return(""); } // When user charges someone else and their payment is completed the user is the actor. // When user is charged by someone else and their payment is completed the user is the target. var databaseInfo = GetUserFromDatabases(request.Data.Actor.Id); if (databaseInfo == null) { return(""); } if (WebhookSeenBefore(databaseInfo.Value.user, request.Data.Id, request.Data.Status)) { return(""); } SaveWebhookId(databaseInfo.Value.user, request.Data.Id, request.Data.Status, databaseInfo.Value.database); message += $"{request.Data.Target.User.DisplayName} ({request.Data.Target.User.Username}) "; if (request.Data.Status == "settled") { message += "accepted your "; } else if (request.Data.Status == "cancelled") { message += "rejected your "; } message += $"${request.Data.Amount:F2} charge for {request.Data.Note}"; await SendSlackMessage(databaseInfo.Value.workspaceInfo, message, databaseInfo.Value.user.UserId, httpClient); } return(""); }