コード例 #1
0
 private List <DBHelpers.Models.MFCModels.Office> SetSchedules(List <DBHelpers.Models.MFCModels.Office> offices)
 {
     foreach (var item in offices)
     {
         item.IsOpen = Analiser.OfficeIsOpen(item.Schedule);
     }
     return(offices);
 }
コード例 #2
0
        public async Task <BotUserRequest> Main(object usefulData)
        {
            string query = "";

            if (botUser.InputDataType == InputDataType.Text)
            {
                //добавлена возможность задать вопрос пользователю. isQuestion - кэшированный флаг. Говорит о том, что текущее сообщение это вопрос от пользователя
                #region Question
                query = usefulData.ToString();
                var isQuestion = cacheHelper.Get($"QUESTION{botUser.BotUserVKID}"); //isQuestion - кэшированный флаг. Говорит о том, что текущее сообщение это вопрос от пользователя
                if (isQuestion != null && query != "назад" && query != "вопрос")
                {
                    cacheHelper.Remove($"QUESTION{botUser.BotUserVKID}");
                    // пересылаем оператору, ID которого указано в конфиг файле
                    thisRequest.IsSendingError = await VK.SendMessage(ulong.Parse(ConfigurationManager.AppSettings["OperatorVKID"]), $"Вопрос:\r\n{query}\U00002753\r\n\r\nКто задал -> https://vk.com/id{botUser.BotUserVKID} \U00002709");

                    if (thisRequest.IsSendingError == 0)
                    {// все ок
                        await sendHelper.SendText(textHelper.GetMessage("%questionsuccss%"));

                        return(thisRequest);
                    }
                    else
                    {// произошла ошибка при отправке сообщения оператору
                        await sendHelper.SendText(textHelper.GetMessage("%questionfail%"));

                        return(thisRequest);
                    }
                }
                #endregion
                if (await AnaliseCommands(query) == 1)
                {
                    return(thisRequest);
                }
            }

            var    office       = new DBHelpers.Models.MFCModels.Office();
            var    searchHelper = new SearchHelper(mfcDataOfBot);
            object alreadyFinded;
            switch (botUser.NowIs)
            {
            case MFCBotWhatIsHappeningNow.SettingOffice:
                #region SetOffice
                // включение/отключение расписаний филиалов
                if (ConfigurationManager.AppSettings["Schedules"] == "Enable")
                {
                    mfcDataOfBot.Offices = SetSchedules(mfcDataOfBot.Offices);
                }
                List <FuzzySearchResult> result = null;
                switch (botUser.InputDataType)
                {
                case InputDataType.Image:
                    //хз ваще
                    break;

                case InputDataType.GeoLocation:
                    result             = searchHelper.SearchOfficeByGeocode((DbGeography)usefulData);
                    thisRequest.Answer = GetAnswer(result);
                    break;

                case InputDataType.Text:
                    alreadyFinded = cacheHelper.Get($"SETOFFICES{botUser.BotUserVKID}");
                    if (alreadyFinded == null)
                    {
                        result             = searchHelper.SearchOfficeByName(query);
                        thisRequest.Answer = GetAnswer(result);
                    }
                    else
                    {
                        result             = searchHelper.SearchOfficeByName(query, (string)alreadyFinded);
                        thisRequest.Answer = GetAnswer(result);
                    }
                    break;
                }

                if (result.Count == 1 && ConfigurationManager.AppSettings["IsTestMode"] != "off")
                {
                    result = DoDummy();
                }

                thisRequest.Answer = GetAnswer(result);
                await AnaliseSearchOfficeResult(result);

                #endregion
                break;

            case MFCBotWhatIsHappeningNow.SettingOpportunity:     //новый флаг! нужен для идентификации выбора (проверить статус/записаться на услугу)
                #region SetOpp
                int numFromList;
                if (int.TryParse(query, out numFromList) && (numFromList == 1 || numFromList == 2))
                {
                    if (numFromList == 1)   // выбрана проверка статуса
                    {
                        botUser.NowIs = MFCBotWhatIsHappeningNow.GetingTicketInformation;
                        office        = mfcDataOfBot.Offices.FirstOrDefault(x => x.AisMFCID == botUser.OfficeID);
                        await sendHelper.SendText(textHelper.GetMessage("%gtinfstart%",
                                                                        new string[] { "%officename%", "%adress%", "%business%" },
                                                                        new string[] { office.DisplayName, office.DisplayAddress, GetBusynessOffice(office.AisMFCID) }));
                    }
                    if (numFromList == 2)    // выбрана запись на услугу
                    {
                        botUser.NowIs = MFCBotWhatIsHappeningNow.SettingService;
                        office        = mfcDataOfBot.Offices.FirstOrDefault(x => x.AisMFCID == botUser.OfficeID);
                        await SelectSendSetTenPopularServices(office.DisplayName, office.AisMFCID, office.DisplayAddress);
                    }
                }
                else
                {    // что-то другое
                    await sendHelper.SendText(textHelper.GetMessage("%slctopfail%"));
                }
                #endregion
                break;

            case MFCBotWhatIsHappeningNow.SettingService:
                #region SetService
                alreadyFinded = cacheHelper.Get($"SETSERVICE{botUser.BotUserVKID}");
                if (alreadyFinded == null)
                {
                    alreadyFinded = cacheHelper.Get($"SETSERVICES{botUser.BotUserVKID}");
                    if (alreadyFinded == null)
                    {
                        office = mfcDataOfBot.Offices.FirstOrDefault(x => x.AisMFCID == botUser.OfficeID);
                        await SelectSendSetTenPopularServices(office.DisplayName, office.AisMFCID, office.DisplayAddress);

                        return(thisRequest);
                    }
                    //если есть информация о множестве услуг, значит ведем поиск по ним
                    if (int.TryParse(query, out numFromList))
                    {
                        //теперь поиск ведется по секциям, а не сервисам
                        result             = searchHelper.SearchSectionByName(query, (string)alreadyFinded);
                        thisRequest.Answer = GetAnswer(result);
                        if (result.Count == 0)
                        {
                            await sendHelper.SendText(textHelper.GetMessage("%slctsrvicefail%"));

                            return(thisRequest);
                        }
                    }
                    else
                    {
                        if (alreadyFinded.ToString().Last() == '¡' || alreadyFinded.ToString().Last() == '!')    //в данном случае, это флаг, который говорит, что кэшированные данные относятся к списку 10-ти самых популярных услуг
                        {
                            //теперь поиск ведется по секциям, а не сервисам
                            result             = searchHelper.SearchSectionByName(query);
                            thisRequest.Answer = GetAnswer(result);
                        }
                        else
                        {
                            await sendHelper.SendText(textHelper.GetMessage("%slctsrvicesucs%"));

                            return(thisRequest);
                        }
                    }

                    await AnaliseSearchServiceResult(result);
                }
                else    // если есть информация об услуге, значит ждем подтвержденеия
                {
                    if (!string.IsNullOrWhiteSpace(query) && query == "да")
                    {
                        var service = mfcDataOfBot.Sections.FirstOrDefault(x => x.SectionID == (int)alreadyFinded);
                        office = mfcDataOfBot.Offices.FirstOrDefault(x => x.AisMFCID == botUser.OfficeID);
                        var message = textHelper.GetMessage("%talon%");
                        var talon   = mfcservice.Enqueue(service.SectionID, botUser.OfficeID);

                        if (talon == null || talon?.ID == 0)     //аис не выдал талон => не поставил пользователя в очередь
                        {
                            await sendHelper.SendText(textHelper.GetMessage("%talonerr%"));
                        }
                        else
                        {
                            message = Analiser.AnaliseTalon(talon, message, service.Name, office);

                            botUser.TalonID   = talon.ID;
                            botUser.ServiceID = service.SectionID;
                            botUser.NowIs     = MFCBotWhatIsHappeningNow.QueueWaiting;

                            await sendHelper.SendText(message);
                        }
                        cacheHelper.Clear(botUser.BotUserVKID);
                    }
                    else
                    {
                        office = mfcDataOfBot.Offices.FirstOrDefault(x => x.AisMFCID == botUser.OfficeID);
                        await SelectSendSetTenPopularServices(office.DisplayName, office.AisMFCID, office.DisplayAddress);
                    }
                    cacheHelper.Remove($"SETSERVICE{botUser.BotUserVKID}");
                }
                #endregion
                break;

            case MFCBotWhatIsHappeningNow.GetingTicketInformation:
                #region GetTicketInfo
                office = mfcDataOfBot.Offices.FirstOrDefault(x => x.AisMFCID == botUser.OfficeID);
                if (int.TryParse(query, out numFromList))
                {
                    //проверяем введенный номер
                    await sendHelper.SendText(Analiser.GetAnalysedAnswer(botUser, office, numFromList, textHelper, mfcDataOfBot.WindowsOffices));
                }
                else
                {
                    await sendHelper.SendText(textHelper.GetMessage("%gtinfstart%",      //начальное сообщение
                                                                    new string[] { "%officename%", "%adress%", "%business%" },
                                                                    new string[] { office.DisplayName, office.DisplayAddress, GetBusynessOffice(office.AisMFCID) }));
                }
                #endregion
                break;

            case MFCBotWhatIsHappeningNow.QueueWaiting:
                #region QueueWait
                //var rnd = new Random();
                //var joke = mfcDataOfBot.Jokes[rnd.Next(mfcDataOfBot.Jokes.Count)];
                //await sendHelper.BotSendText(joke.Text);
                //thisRequest.Answer = "joke";
                await sendHelper.SendText(textHelper.GetMessage("%waitinghelp%", "%number%", BotTextHelper.GetEmojiNumber((int)botUser.TalonID)));

                #endregion
                break;
            }
            return(thisRequest);
        }
コード例 #3
0
        public async Task <int> AnaliseCommands(string query)
        {
            switch (query)
            {
            case "milk":
                switch (botUser.NowIs)
                {
                case MFCBotWhatIsHappeningNow.GetingTicketInformation:
                    var office = mfcDataOfBot.Offices.FirstOrDefault(x => x.AisMFCID == botUser.OfficeID);

                    botUser.NowIs     = MFCBotWhatIsHappeningNow.SettingService;
                    botUser.TalonID   = 0;
                    botUser.ServiceID = 0;
                    await SelectSendSetTenPopularServices(office.DisplayName, office.AisMFCID, office.DisplayAddress);

                    return(1);

                default:
                    return(0);
                }

            case "привет":
            case "здарова":
            case "привяу":
            case "здравствуй":
            case "здравствуйте":
            case "добрый день":
            case "добрый вечер":
            case "доброе утро":
            case "hi":
            case "hello":
            case "hey":
                await sendHelper.SendText(textHelper.GetMessage("%hello%"));

                goto case "help";

            case "спасибо":
            case "благодарю":
            case "thanks":
                await sendHelper.SendText(textHelper.GetMessage("%thanks%"));

                return(1);

            case "прости":
            case "простите":
            case "сорян":
            case "извините":
            case "sorry":
                await sendHelper.SendText(textHelper.GetMessage("%sorry%"));

                return(1);

            case "пока":
            case "до свидания":
            case "досвидули":
            case "goodbye":
            case "bye":
            case "bye bye":
                await sendHelper.SendText(textHelper.GetMessage("%bye%"));

                return(1);

            case "вопрос":     //добавлена команда "вопрос"
                await sendHelper.SendText(textHelper.GetMessage("%question%"));

                cacheHelper.Set($"QUESTION{botUser.BotUserVKID}", 1, 35);
                return(1);

            case "отмена":
            case "start":
                botUser.OfficeID     = 0;
                botUser.TalonID      = 0;
                botUser.ServiceID    = 0;
                botUser.NowIs        = MFCBotWhatIsHappeningNow.SettingOffice;
                botUser.ModifiedDate = DateTime.Now;
                cacheHelper.Clear(botUser.BotUserVKID);

                await sendHelper.SendText(textHelper.GetMessage("%setofficehelp%"));

                return(1);

            case "помощь":
            case "help":
                cacheHelper.Clear(botUser.BotUserVKID);
                switch (botUser.NowIs)
                {
                case MFCBotWhatIsHappeningNow.SettingOffice:
                    await sendHelper.SendText(textHelper.GetMessage("%setofficerealhelp%"));

                    return(1);

                case MFCBotWhatIsHappeningNow.SettingService:
                    SetTenPopularServices(false);
                    await sendHelper.SendText(textHelper.GetMessage("%setservicehelp%"));

                    return(1);

                case MFCBotWhatIsHappeningNow.SettingOpportunity:
                    await sendHelper.SendText(textHelper.GetMessage("%slctophelp%"));

                    return(1);

                case MFCBotWhatIsHappeningNow.GetingTicketInformation:
                    await sendHelper.SendText(textHelper.GetMessage("%gtinfhelp%"));

                    return(1);

                default:
                    return(0);
                }

            case "назад":
            case "back":
                switch (botUser.NowIs)
                {
                case MFCBotWhatIsHappeningNow.SettingOffice:
                    cacheHelper.Clear(botUser.BotUserVKID);
                    await sendHelper.SendText(textHelper.GetMessage("%setofficehelp%"));

                    return(1);

                case MFCBotWhatIsHappeningNow.SettingService:
                    var data = cacheHelper.Get($"SETSERVICES{botUser.BotUserVKID}");

                    if (data == null || data.ToString().Last() == '¡')         //если кэш пуст, либо в кэше хранятся данные, которые относятся к 10ки популярных услуг
                    {
                        cacheHelper.Clear(botUser.BotUserVKID);
                        if (context.AISMFCServiceStatus.FirstOrDefault(x => x.ServiceName == "enqueue").Status == "ok")
                        {
                            botUser.NowIs = MFCBotWhatIsHappeningNow.SettingOpportunity;
                            var office = mfcDataOfBot.Offices.FirstOrDefault(x => x.AisMFCID == botUser.OfficeID);
                            await sendHelper.SendText(textHelper.GetMessage("%slctopstart%",
                                                                            new string[] { "%officename%", "%adress%", "%business%" },
                                                                            new string[] { office.DisplayName, office.DisplayAddress, GetBusynessOffice(office.AisMFCID) }));
                        }
                        else
                        {
                            goto case MFCBotWhatIsHappeningNow.SettingOpportunity;
                        }
                    }
                    else
                    {        //возвращаем к началу этапа SettingService
                        var office = mfcDataOfBot.Offices.FirstOrDefault(x => x.AisMFCID == botUser.OfficeID);
                        await SelectSendSetTenPopularServices(office.DisplayName, office.AisMFCID, office.DisplayAddress);
                    }
                    return(1);

                case MFCBotWhatIsHappeningNow.SettingOpportunity:
                    cacheHelper.Clear(botUser.BotUserVKID);
                    botUser.NowIs     = MFCBotWhatIsHappeningNow.SettingOffice;
                    botUser.OfficeID  = 0;
                    botUser.ServiceID = 0;
                    botUser.TalonID   = 0;
                    await sendHelper.SendText(textHelper.GetMessage("%setofficehelp%"));

                    return(1);

                case MFCBotWhatIsHappeningNow.GetingTicketInformation:
                    cacheHelper.Clear(botUser.BotUserVKID);
                    var usersOffice = mfcDataOfBot.Offices.FirstOrDefault(x => x.AisMFCID == botUser.OfficeID);
                    if ((usersOffice.AisMFCID != 21 && usersOffice.AisMFCID != 49 || usersOffice.DisplayName == "Ярмарка") && context.AISMFCServiceStatus.FirstOrDefault(x => x.ServiceName == "enqueue").Status == "ok")
                    {        //если были в филиале, где разрешена запись
                        botUser.NowIs = MFCBotWhatIsHappeningNow.SettingOpportunity;
                        await sendHelper.SendText(textHelper.GetMessage("%slctopstart%",
                                                                        new string[] { "%officename%", "%adress%", "%business%" },
                                                                        new string[] { usersOffice.DisplayName, usersOffice.DisplayAddress, GetBusynessOffice(usersOffice.AisMFCID) }));
                    }
                    else
                    {
                        botUser.NowIs     = MFCBotWhatIsHappeningNow.SettingOffice;
                        botUser.OfficeID  = 0;
                        botUser.ServiceID = 0;
                        botUser.TalonID   = 0;
                        await sendHelper.SendText(textHelper.GetMessage("%setofficehelp%"));
                    }
                    return(1);

                default:
                    return(0);
                }

            case "update":
                mfcDataOfBot = cacheHelper.Update("MFCDATAOFBOT", context);
                if (mfcDataOfBot != null)
                {
                    await sendHelper.SendText(textHelper.GetMessage("%updatecachesuccess%"));
                }
                else
                {
                    await sendHelper.SendText(textHelper.GetMessage("%updatecachefail%"));
                }
                return(1);

            case "getinfo":
            case "статус":
                switch (botUser.NowIs)
                {
                case MFCBotWhatIsHappeningNow.QueueWaiting:
                    Logging.Logger.Debug("qwaiting  status");
                    var office  = mfcDataOfBot.Offices.FirstOrDefault(x => x.AisMFCID == botUser.OfficeID);
                    var message = Analiser.GetAnalysedAnswer(botUser, office, (int)botUser.TalonID, textHelper, mfcDataOfBot.WindowsOffices);
                    await sendHelper.SendText(message);

                    return(1);

                default:
                    return(0);
                }

            case "finish":
                botUser.NowIs        = MFCBotWhatIsHappeningNow.SettingOffice;
                botUser.ModifiedDate = DateTime.Now;
                botUser.TalonID      = 0;
                botUser.ServiceID    = 0;
                botUser.OfficeID     = 0;
                cacheHelper.Clear(botUser.BotUserVKID);

                await sendHelper.SendText(textHelper.GetMessage("%finish%", "%window%", "номер окна"));

                return(1);
            }
            return(0);
        }