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
     });
 }
Exemplo n.º 4
0
        public async Task <ResourceResponse> SendMessageAsync(ConversationReference recipient, CommandSendMessageProperties sendMessageProperties, string message = "")
        {
            IMessageActivity messageActivity = CreateMessageActivity(recipient, sendMessageProperties, message);

            return(await SendMessageAsync(messageActivity));
        }
Exemplo n.º 5
0
        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);
            }
        }