public async Task TipBotReactionCommand(SlackReaction reaction, SlackUser slackUser, SlackUser recipientSlackUser, SlackChannelSession channel) { var transferable = transferables.GetTransferableByReactionId(reaction.Reaction); if (transferable == null) { return; } if (!(await walletRepository.GetUserReactionTipSetting(slackUser.Id))) { return; } logger.LogTrace($"Recieved tip reaction command: reaction: {reaction.Reaction}, User: {slackUser.Id} ({slackUser.Name}), " + $"Recipient: {recipientSlackUser.Id} ({recipientSlackUser.Name}), Channel: {channel.Id} ({channel.Name})"); var recipient = $"<@{recipientSlackUser.Id}>"; var slackUserIds = new List <string> { recipientSlackUser.Id }; var tipReaction = transferable.Reactions.Single(r => r.ReactionId == reaction.Reaction); var amountToTip = tipReaction.Amount; var unit = transferable.Name; var comment = tipReaction.Comment; var account = await walletRepository.GetAccount(slackUser.Id); await Tip(slackUser, channel, recipient, slackUserIds, amountToTip, unit, comment, transferable, account); }
private async Task Tip(SlackUser slackUser, SlackChannelSession channelSession, string recipient, List <string> slackUserIds, decimal amountToTip, string unit, string comment, NxtTransferable transferable, NxtAccount account) { var isRecipientSlackUser = slackUserIds.Any(); var recipientCount = isRecipientSlackUser ? slackUserIds.Count : 1; if (slackUserIds.Contains(SlackConnector.SelfId)) { await SlackConnector.SendMessage(channelSession.Id, MessageConstants.CantTipBotChannel); return; } if (slackUserIds.Contains(slackUser.Id)) { await SlackConnector.SendMessage(channelSession.Id, MessageConstants.CantTipYourselfChannel); return; } if (!isRecipientSlackUser && !nxtConnector.IsValidAddressRs(recipient)) { await SlackConnector.SendMessage(channelSession.Id, MessageConstants.InvalidAddress); return; } if (account == null) { await SlackConnector.SendMessage(channelSession.Id, MessageConstants.NoAccountChannel); return; } if (!string.IsNullOrEmpty(comment) && comment.Length > 512) { await SlackConnector.SendMessage(channelSession.Id, MessageConstants.CommentTooLongChannel); return; } if (!(await VerifyParameters(transferable, unit, account, channelSession.Id, amountToTip, recipientCount))) { return; } if (isRecipientSlackUser) { foreach (var slackUserId in slackUserIds) { var recipientAccount = await walletRepository.GetAccount(slackUserId); var recipientPublicKey = ""; if (recipientAccount == null) { recipientAccount = await SendTipRecievedInstantMessage(slackUser, slackUserId); recipientPublicKey = recipientAccount.NxtPublicKey; } try { var recipientUserName = SlackConnector.GetUser(slackUserId).Name; var txMessage = MessageConstants.NxtTipTransactionMessage(slackUser.Name, recipientUserName, comment); var txId = await nxtConnector.Transfer(account, recipientAccount.NxtAccountRs, transferable, amountToTip, txMessage, recipientPublicKey); if (recipientCount == 1) { var reply = MessageConstants.TipSentChannel(slackUser.Id, slackUserId, amountToTip, transferable.Name, txId, comment); await SlackConnector.SendMessage(channelSession.Id, reply, false); } else { var imId = await SlackConnector.GetInstantMessageId(slackUserId); var reply = MessageConstants.TipSentDirectMessage(slackUser.Id, amountToTip, transferable.Name, txId); await SlackConnector.SendMessage(imId, reply); } await SendTransferableRecipientMessage(slackUser, slackUserId, transferable, recipientAccount, amountToTip); await SendTransferableSenderMessage(slackUser, slackUserId, transferable, recipientAccount); } catch (NxtException e) { logger.LogError(0, e, e.Message); throw; } } if (recipientCount > 1) { var reply = MessageConstants.MultitipSentChannel(slackUser.Id, recipient, amountToTip, transferable.Name, comment); await SlackConnector.SendMessage(channelSession.Id, reply); } } else { try { var txMessage = MessageConstants.NxtTipTransactionMessage(slackUser.Name, "", comment); var txId = await nxtConnector.Transfer(account, recipient, transferable, amountToTip, txMessage, ""); var reply = MessageConstants.TipToAddressRsSentChannel(slackUser.Id, recipient, amountToTip, transferable.Name, txId, comment); await SlackConnector.SendMessage(channelSession.Id, reply, false); } catch (NxtException e) { logger.LogError(0, e, e.Message); throw; } } }
public async Task TipBotChannelCommand(SlackMessage message, SlackUser slackUser, SlackChannelSession channelSession) { var messageText = message?.Text.Trim(); Match match = null; if ((match = IsTipCommand(messageText)).Success) { logger.LogTrace($"Recieved tip command: {messageText} in channel {channelSession.Name}"); var recipient = match.Groups[2].Value; var slackUserIds = GetSlackUserIds(recipient); var amountToTip = decimal.Parse(match.Groups["amount"].Value, CultureInfo.InvariantCulture); var unit = string.IsNullOrEmpty(match.Groups["unit"].Value) ? Nxt.Singleton.Name : match.Groups["unit"].Value; var comment = string.IsNullOrEmpty(match.Groups["comment"].Value) ? string.Empty : match.Groups["comment"].Value; var transferable = transferables.GetTransferable(unit); var account = await walletRepository.GetAccount(slackUser.Id); await Tip(slackUser, channelSession, recipient, slackUserIds, amountToTip, unit, comment, transferable, account); } else { await SlackConnector.SendMessage(channelSession.Id, MessageConstants.UnknownChannelCommandReply); } }