Beispiel #1
0
 /// <summary>
 /// Отслеживание ботом всех событий сообщества
 /// </summary>
 public void Listen()
 {
     while (true)
     {
         var conversations = GetConversations();
         foreach (var message in conversations.Items.Select(c => c.LastMessage))
         {
             var userId    = message.FromId.Value;
             var timeDelta = DateTime.UtcNow - message.Date;
             // Бот реагирует только на сообщения полученные в течение последних 10 минут
             // Иначе, он просто помечает их как прочитанные и отвеченные
             if (timeDelta < TimeSpan.FromMinutes(15))
             {
                 if (!AllUserSessions.ContainsKey(userId))
                 {
                     AllUserSessions.Add(userId, new UserSession(userId, this));
                 }
                 MessageResponse(AllUserSessions[userId], message);
             }
             else
             {
                 VK.Messages.MarkAsAnsweredConversation(userId, true, MyGroupId);
                 VK.Messages.MarkAsRead(userId.ToString(), message.Id, (long)MyGroupId);
             }
         }
     }
 }
Beispiel #2
0
        /// <summary>
        /// Отправить администратору сообщение о поступлении нового заказа
        /// </summary>
        /// <param name="adminId">Id администратору, которому нужно отправить сообщение</param>
        /// <param name="customerId">Id пользователя, который сделал заказ</param>
        /// <param name="message">Сообщение</param>
        /// <param name="keyboard">Клавиатура бота</param>
        public void WriteToAdminWithDeliveryInfo(long adminId, long customerId,
                                                 string message, MessageKeyboard keyboard = null)
        {
            if (keyboard == null)
            {
                keyboard = MessageKeyboardSchemes.SetEmptyKeyboard;
            }
            var messageSendParams = new MessagesSendParams
            {
                UserId    = adminId,
                Message   = message,
                RandomId  = new Random().Next(999999),
                Keyboard  = keyboard,
                Lat       = AllUserSessions[customerId].OrderData.DeliveryAddress.Coordinates.Latitude,
                Longitude = AllUserSessions[customerId].OrderData.DeliveryAddress.Coordinates.Longitude
            };

            vk.Messages.Send(messageSendParams);
            if (!AllUserSessions.ContainsKey(adminId))
            {
                AllUserSessions.Add(adminId, new UserSession(adminId, this));
            }
            AllUserSessions[adminId].PrevKeyboard   = keyboard;
            AllUserSessions[adminId].LastBotMessage = messageSendParams;
        }
Beispiel #3
0
        /// <summary>
        /// Ответ на начало оформления нового заказа
        /// </summary>
        /// <param name="message">Сообщение пользователя с товаром для начала заказа</param>
        private void NewOrderResponse(Message message)
        {
            message.Text = "оформить";
            var userId = message.FromId.Value;

            if (!AllUserSessions.ContainsKey(userId))
            {
                AllUserSessions.Add(userId, new UserSession(userId, this));
            }
            AllUserSessions[message.FromId.Value].ProductsAsAttachments.AddRange(message.Attachments.Where(at => at.Type.Name == "Market"));//
            MessageResponse(message);
        }
Beispiel #4
0
 /// <summary>
 /// Обычный ответ бота на сообщение пользователя
 /// </summary>
 /// <param name="message">Сообщение пользователя</param>
 private void RegularResponse(Message message)
 {
     if (message.Attachments.Count > 0 && message.Attachments[0].Type.Name == "Market" &&
         (!AllUserSessions.ContainsKey(message.FromId.Value) ||
          AllUserSessions[message.FromId.Value].OrderData.OrderStage == OrderStage.NoOrder)) //проверить на повторное начинание заказа
     {
         NewOrderResponse(message);
     }
     else
     {
         MessageResponse(message);
     }
 }
Beispiel #5
0
        /// <summary>
        /// Отслеживание ботом всех событий сообщества
        /// </summary>
        public Task Listen()
        {
            var task = Task.Run(() =>
            {
                try
                {
                    while (true)
                    {
                        var poll = GetLongPollHistory();
                        if (poll?.Updates == null)
                        {
                            continue;                        // Проверка на новые события
                        }
                        foreach (var update in poll.Updates)
                        {
                            if (update.Type == GroupUpdateType.MessageNew)
                            {
                                var userId = update.Message.FromId.Value;
                                if (update.Message.Text != "")
                                {
                                    Logger.Info($"id{update.Message.FromId.Value}: {update.Message.Text}");
                                }
                                if (AllUserSessions.ContainsKey(userId) && AllUserSessions[userId].OrderData.OrderStage != OrderStage.NoOrder)
                                {
                                    CollectOrderData(update.Message);
                                }
                                else
                                {
                                    RegularResponse(update.Message);
                                }
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    Logger.Error(ex);
                    PermanentValues.BotStatus = BotStatus.ReadyForRestart;
                    Logger.Info("Бот остановлен");
                }
            });

            return(task);
        }
Beispiel #6
0
        /// <summary>
        /// Ответ бота на сообщение пользователя
        /// </summary>
        /// <param name="message">Сообщение пользователя</param>
        private void MessageResponse(Message message)
        {
            var command = message.Text.ToLower();
            var userId  = message.FromId.Value;

            if (!AllUserSessions.ContainsKey(userId))
            {
                AllUserSessions.Add(userId, new UserSession(userId, this));
            }
            if ((command == "таблица" || command == "принять" || command == "отклонить") &&
                !AdminIds.Contains(userId))
            {
                command = "unknown";
            }
            if (!CommandsPhrases.Commands.ContainsKey(command))
            {
                command = "unknown";
            }
            CommandsPhrases.CommandsActions[CommandsPhrases.Commands[command]].Invoke(this, message);
        }
Beispiel #7
0
        /// <summary>
        /// Написать пользователю сообщение
        /// </summary>
        /// <param name="userId">Id получателя</param>
        /// <param name="message">Сообщение</param>
        /// <param name="keyboard">Клавиатура бота (null - сообщение без клавиатуры)</param>
        public void WriteToSelectedUser(long userId, string message, MessageKeyboard keyboard = null)
        {
            if (keyboard == null)
            {
                keyboard = MessageKeyboardSchemes.SetEmptyKeyboard;
            }
            var messageSendParams = new MessagesSendParams
            {
                UserId   = userId,
                Message  = message,
                RandomId = new Random().Next(999999),
                Keyboard = keyboard
            };

            vk.Messages.Send(messageSendParams);
            if (!AllUserSessions.ContainsKey(userId))
            {
                AllUserSessions.Add(userId, new UserSession(userId, this));
            }
            AllUserSessions[userId].PrevKeyboard   = keyboard;
            AllUserSessions[userId].LastBotMessage = messageSendParams;
        }