protected override async Task HandleTurnAsync(ITurnContext turnContext, ChatUserContext userContext, MessageRouter messageRouter, NextDelegate next, CancellationToken cancellationToken = default(CancellationToken)) { Activity activity = turnContext.Activity; if (turnContext.TurnState.TryGetValue(typeof(CommandSendMessageProperties).FullName, out object result)) { CommandSendMessageProperties properties = (CommandSendMessageProperties)result; //Log broadcast if (properties.From.Role == ChatUserRole.Admin && properties.UserId == "*") { var allConsumerConservations = await _routingDataManager.GetConsumerConversations(); foreach (var consumerConversation in allConsumerConservations) { await _reportDataManager.CreateOrUpdateChatReport(new ChatReportLogCreationModel() { User = properties.From.Role == ChatUserRole.Admin ? new ChatUserModel() { Id = consumerConversation.User.Id } : properties.From, Message = new ChatReportLogModel() { From = properties.From, Date = activity.Timestamp.Value.DateTime, Message = activity.Text, ReportType = properties.ReportType, Id = activity.Id, IsBroadcast = true } }); } } else { //Log one message ChatReportModel chatReportModel = await _reportDataManager.CreateOrUpdateChatReport(new ChatReportLogCreationModel() { User = properties.From.Role == ChatUserRole.Admin ? new ChatUserModel() { Id = properties.UserId } : properties.From, ChannelId = activity.ChannelId, Message = new ChatReportLogModel() { From = properties.From, Date = activity.Timestamp.Value.DateTime, Message = activity.Text, ReportType = properties.ReportType, Id = activity.Id } }); turnContext.TurnState.Add(typeof(ChatReportModel).FullName, chatReportModel); } await next(cancellationToken).ConfigureAwait(false); } }
protected override async Task HandleTurnAsync(ITurnContext turnContext, ChatUserContext userContext, MessageRouter messageRouter, NextDelegate next, CancellationToken cancellationToken = default(CancellationToken)) { Activity activity = turnContext.Activity; if (turnContext.TurnState.TryGetValue(typeof(CommandSendMessageProperties).FullName, out object result)) { CommandSendMessageProperties properties = (CommandSendMessageProperties)result; ConversationReference selfConversation = activity.GetConversationReference(); //Broadcast to many users IEnumerable <ConversationReference> conversations = await GetHandoffConversation(turnContext, activity, properties, selfConversation); //Send messages if (conversations != null) { foreach (var conversation in conversations) { await messageRouter.SendMessageAsync(conversation, properties, activity.Text); } } await next(cancellationToken).ConfigureAwait(false); } }
public static Command CreateCommandSendMessage(string botId, CommandSendMessageProperties sendMessageProperties) { return(new Command() { BaseCommand = Commands.SendMessage, BotName = botId, Data = sendMessageProperties }); }
public async Task <ResourceResponse> SendMessageAsync(ConversationReference recipient, CommandSendMessageProperties sendMessageProperties, string message = "") { IMessageActivity messageActivity = CreateMessageActivity(recipient, sendMessageProperties, message); return(await SendMessageAsync(messageActivity)); }
public IMessageActivity CreateMessageActivity(ConversationReference conversation, CommandSendMessageProperties sendMessageProperties, string message) { IMessageActivity messageActivity = Activity.CreateMessageActivity(); if (conversation != null) { if (conversation.Conversation != null) { messageActivity.Conversation = conversation.Conversation; } if (conversation.User != null) { messageActivity.Recipient = conversation.User; } if (conversation.Bot != null) { messageActivity.From = conversation.Bot; } } messageActivity.ChannelData = CommandFactoryHelper.CreateCommandSendMessage(conversation.Bot.Id, sendMessageProperties); messageActivity.Text = message; return(messageActivity); }
private async Task <IEnumerable <ConversationReference> > GetHandoffConversation(ITurnContext turnContext, Activity activity, CommandSendMessageProperties properties, ConversationReference selfConversation) { //Broadcast to many users IEnumerable <ConversationReference> conversations = null; if (properties.From.Role == ChatUserRole.Consumer) { conversations = await _routingDataManager.GetAdminConversations(); //Send event to event processor... if possible if (turnContext.TurnState.TryGetValue(typeof(ChatReportModel).FullName, out object result)) { await PushMessageToEventProcessorSaga(activity.Text, activity.ChannelId, properties, (ChatReportModel)result); } } //To one user only - Admin only else if (properties.From.Role == ChatUserRole.Admin) { if (properties.UserId == "*") { conversations = await _routingDataManager.GetConversations(); } else { conversations = await _routingDataManager.GetConversationsFromUser(properties.UserId); IEnumerable <ConversationReference> conversations2 = await _routingDataManager.GetAdminConversations(); conversations = conversations2.Union(conversations); } } else { throw new Exception("Message handoff not handled"); } //Do not send to self conversations = _routingDataManager.RemoveSelfConversation(conversations, selfConversation); return(conversations); }
private async Task <bool> PushMessageToEventProcessorSaga(string message, string channelId, CommandSendMessageProperties consumerMessageProperties, ChatReportModel chatReport) { try { if (_serviceBus != null || _serviceBus.BusAccess != null) { _logger.LogDebug($"EdisonBot: Pushing message from user '{consumerMessageProperties.From.Id}'."); //Get deviceId string userId = GetDatabaseUserId(channelId, consumerMessageProperties.UserId); DeviceModel device = await _deviceRestService.GetMobileDeviceFromUserId(userId); //Get last reportType Guid?reportType = consumerMessageProperties.ReportType; if (consumerMessageProperties.ReportType == null || consumerMessageProperties.ReportType == Guid.Empty) { reportType = await GetLastReportTypeFromUser(consumerMessageProperties.UserId); } if (device != null) { IEventSagaReceived newMessage = new EventSagaReceivedEvent() { DeviceId = device.DeviceId, EventType = "message", Date = DateTime.UtcNow, Data = JsonConvert.SerializeObject(new MessageEventMetadata() { UserId = consumerMessageProperties.UserId, Username = consumerMessageProperties.From.Name, ReportType = reportType, Message = message, ChatReportId = chatReport.ReportId }) }; await _serviceBus.BusAccess.Publish(newMessage); return(true); } } return(false); } catch (Exception e) { _logger.LogError($"EdisonBot: {e.Message}"); return(false); } }