public MainViewModel() { var dbContext = new NureBotDbContext(false); var unityContainer = new UnityContainer(); dbContext.Database.Initialize(true); ContainerBoostraper.RegisterTypes(unityContainer, dbContext, "356520093:AAGKBe8YFpR5_5WIkGfoeRbdTMuOKE2O9GQ"); Bot = unityContainer.Resolve <TelegramBotClient>(); UService = unityContainer.Resolve <IUserService>(); RecognitionSystem = unityContainer.Resolve <OscovaBot>(); Bot.OnMessage += Bot_OnMessageAsync;; Bot.OnReceiveError += Bot_OnReceiveError;; RecognitionSystem.Dialogs.Add(new CistDialog()); RecognitionSystem.Dialogs.Add(new WeatherDialog()); RecognitionSystem.MainUser.Context.SharedData.Add(Bot); RecognitionSystem.MainUser.Context.SharedData.Add(UService); RecognitionSystem.Language.Stemmer = new RussianStemmer(); RecognitionSystem.Language.StopWords = StopWordsGenerator.GenerateRussianStopWords(); RecognitionSystem.Trainer.StartTraining(); RecognitionSystem.Recognizers.Clear(); RecognitionSystem.Recognizers.Add(new RuDateRecognizer()); RecognitionSystem.Language.Culture.DateTimeFormat = CultureInfo.GetCultureInfo("ru-RU").DateTimeFormat; RecognitionSystem.Recognizers.Add(new GroupRecognizer()); RecognitionSystem.CreateRecognizer("teacherName", new Regex(@"[А-Яа-я]+ [А-Яа-я]\.? [А-Яа-я]\.?")); RecognitionSystem.MainUser.ResponseReceived += async(sender, arg) => { var msg = JsonConvert.DeserializeObject <MessageTransfer>(arg.Response.Text); await Bot.SendTextMessageAsync(msg.ChatId, msg.Message, replyMarkup : msg.ReplyMarkup); SuccessMessage($"Reply sent:{msg.ChatId}"); }; }
static void Main(string[] args) { var baseConfig = new Configuration(); baseConfig.nAreaForStrokeMap = 15; baseConfig.minRadiusArea = 0.03; baseConfig.toleranceFactorArea = 1.3; var paramVar1 = new DoubleParamVariation("nAreaForStrokeMap", 10, 2, 20); var paramVar2 = new DoubleParamVariation("minRadiusArea", 0.01, 0.02, 0.19); var paramVar3 = new DoubleParamVariation("toleranceFactorArea", 1.1, 0.1, 2.1); var configSet = baseConfig.getParameterVariations(paramVar1, paramVar2, paramVar3); Stream TestFileStream; BinaryFormatter serializer = new BinaryFormatter(); Dictionary <string, GestureTrace[]> circleGestures, squareGestures, ownFormGestures; if (File.Exists("Circle_1Finger.gestures")) { TestFileStream = File.OpenRead("Circle_1Finger.gestures"); circleGestures = (Dictionary <string, GestureTrace[]>)serializer.Deserialize(TestFileStream); TestFileStream.Close(); } else { circleGestures = getGestureTraces("Circle_1Finger"); TestFileStream = File.Create("Circle_1Finger.gestures"); serializer.Serialize(TestFileStream, circleGestures); TestFileStream.Close(); } if (File.Exists("Square_1Finger.gestures")) { TestFileStream = File.OpenRead("Square_1Finger.gestures"); squareGestures = (Dictionary <string, GestureTrace[]>)serializer.Deserialize(TestFileStream); TestFileStream.Close(); } else { squareGestures = getGestureTraces("Square_1Finger"); TestFileStream = File.Create("Square_1Finger.gestures"); serializer.Serialize(TestFileStream, squareGestures); TestFileStream.Close(); } if (File.Exists("OwnForm_1Finger.gestures")) { TestFileStream = File.OpenRead("OwnForm_1Finger.gestures"); ownFormGestures = (Dictionary <string, GestureTrace[]>)serializer.Deserialize(TestFileStream); TestFileStream.Close(); } else { ownFormGestures = getGestureTraces("OwnForm_1Finger"); TestFileStream = File.Create("OwnForm_1Finger.gestures"); serializer.Serialize(TestFileStream, ownFormGestures); TestFileStream.Close(); } var gesturesToTest = ownFormGestures; var nSubsets = 4; var results = new Dictionary <Configuration, IEnumerable <CrossValidator.RecognitionResultRow> >(1000); foreach (var config in configSet) { var recSystem = new RecognitionSystem(config); var rows = CrossValidator.validateRecognition(recSystem, gesturesToTest, nSubsets); results[config] = rows; } CrossValidator.saveResultsToFile(@"F:\Dropbox\LfS\Code\GestureRecognitionTests\GestureRecognition_OwnForm.csv", results); //do evaluation //Console.WriteLine(model.evaluate(squareTraces.First().Value.First())); //var crossValidator = new CrossValidator(); //////saveSymbolTracesToDatabase(); //var resCircle = crossValidator.validate(circleTraces, "Circle_1Finger", nSubsets); //var resSquare = crossValidator.validate(squareTraces, "Square_1Finger", nSubsets); //var resOwnForm = crossValidator.validate(ownFormTraces, "OwnForm_1Finger", nSubsets); //var resAll = resCircle.Concat(resSquare).Concat(resOwnForm); //saveResultsToFile(@"F:\Dropbox\LfS\Code\GestureRecognitionTests\crossValidation_Extrema.csv", resAll);//resAll); ////DBtoExcel(@"D:\Dropbox\LfS\Data\Multitouch_Userstudy\Traces.csv"); }
static void Main(string[] args) { var baseConfig = new Configuration(); baseConfig.nAreaForStrokeMap = 15; baseConfig.minRadiusArea = 0.03; baseConfig.toleranceFactorArea = 1.3; //var paramVar1 = new ParameterVariation("nAreaForStrokeMap", 10, 2, 20); var paramVar2 = new DoubleParamVariation("minRadiusArea", 0.005, 0.025, 0.18); var paramVar3 = new DoubleParamVariation("toleranceFactorArea", 1.05, 0.05, 1.5); var paramVar4 = new DoubleParamVariation("areaPointDistance", 0.05, 0.05, 0.2); var configSet = Configuration.getParameterVariations(param1, param2, param3, param4, param5, param6, param7, param8, param9, param10); Stream TestFileStream; BinaryFormatter serializer = new BinaryFormatter(); Dictionary <string, GestureTrace[]> timGestures; if (File.Exists("Tim.gestures")) { TestFileStream = File.OpenRead("Tim.gestures"); timGestures = (Dictionary <string, GestureTrace[]>)serializer.Deserialize(TestFileStream); TestFileStream.Close(); } else { string user = "******"; //string[] gestures = new string[] { "Triangle_Slow", "Triangle_Normal", "Triangle_Fast", "Circle_Slow", "Circle_Normal", "Circle_Fast", "D_Slow", "D_Normal", "D_Fast", "Circle_FastLeftSlowRight", "Circle_SlowLeftFastRight" }; //string[] gestures = new string[] { "Triangle_Slow", "Triangle_Fast", "Circle_Slow", "Circle_Fast", "D_Slow", "D_Fast", "Circle_1Stop_Bottom", "Circle_2Stop_LeftRight" }; string[] gestures = new string[] { "Triangle_Slow", "Triangle_Fast", "Circle_Slow", "Circle_Fast", "D_Slow", "D_Fast" }; timGestures = gestures.Select(g => new { GestureName = g, Traces = getGestureTraces(user, g) }).ToDictionary(e => e.GestureName, e => e.Traces); TestFileStream = File.Create("Tim.gestures"); serializer.Serialize(TestFileStream, timGestures); TestFileStream.Close(); } var gesturesToTest = timGestures; var nSubsets = 5; var results = new Dictionary <Configuration, IEnumerable <CrossValidator.RecognitionResultRow> >(1000); Stopwatch sw = new Stopwatch(); sw.Start(); foreach (var config in configSet) { var recSystem = new RecognitionSystem(config); var rows = CrossValidator.validateRecognition(recSystem, gesturesToTest, nSubsets); results[config] = rows; } var neededTime = sw.ElapsedMilliseconds; Console.WriteLine(neededTime); CrossValidator.saveResultsToFile(@"D:\Dropbox\LfS\Code\GestureRecognitionTests\GestureRecognition_TimGestures_2Subsets_Test.csv", results); //do evaluation //Console.WriteLine(model.evaluate(squareTraces.First().Value.First())); //var crossValidator = new CrossValidator(); //////saveSymbolTracesToDatabase(); //var resCircle = crossValidator.validate(circleTraces, "Circle_1Finger", nSubsets); //var resSquare = crossValidator.validate(squareTraces, "Square_1Finger", nSubsets); //var resOwnForm = crossValidator.validate(ownFormTraces, "OwnForm_1Finger", nSubsets); //var resAll = resCircle.Concat(resSquare).Concat(resOwnForm); //saveResultsToFile(@"F:\Dropbox\LfS\Code\GestureRecognitionTests\crossValidation_Extrema.csv", resAll);//resAll); ////DBtoExcel(@"D:\Dropbox\LfS\Data\Multitouch_Userstudy\Traces.csv"); }
private async void Bot_OnMessageAsync(object sender, Telegram.Bot.Args.MessageEventArgs e) { var message = e.Message; if (message == null) { return; } NormalMessage($"New message from:{message.Chat.Id}\nText:{message.Text}"); if (message.Type == MessageType.LocationMessage) { var msg = CistApi.GetTravelTime($"{message.Location.Latitude.ToString().Replace(",", ".")},{message.Location.Longitude.ToString().Replace(",", ".")}"); await Bot.SendTextMessageAsync(message.Chat.Id, msg, replyMarkup : new ReplyKeyboardHide()); return; } if (message.Type != MessageType.TextMessage) { return; } User user = CheckRegistration(message); user = await CheckUserRoleAsync(user, message); if (user.Role == Role.NotSet) { return; } if (user.Role == Role.Student) { var student = user as Student; if (student == null) { return; } switch (student.GroupId) { case 0: await Bot.SendTextMessageAsync(message.Chat.Id, "Будь добр, напиши из какой ты группы?"); UService.ChangeGroup(user.Id, -1); return; case -1: try { int id = CistApi.GetGroupIdFromName(message.Text); UService.ChangeGroup(user.Id, id); await Bot.SendTextMessageAsync(message.Chat.Id, "Отлично, я запомнил это!"); } catch (Exception) { await Bot.SendTextMessageAsync(message.Chat.Id, "Что-то у меня не получается найти такую группу, попробуй ещё раз!"); return; } return; default: break; } } else if (user.Role == Role.Teacher) { var teacher = user as Teacher; if (teacher == null) { return; } switch (teacher.TeacherId) { case 0: await Bot.SendTextMessageAsync(message.Chat.Id, "Пожалуйста, напишите ваше ФИО"); UService.ChangeTeacherId(teacher.Id, -1); return; case -1: try { int id = CistApi.GetTeacherIdFromName(message.Text); UService.ChangeTeacherId(user.Id, id); await Bot.SendTextMessageAsync(message.Chat.Id, "Отлично, я запомнил это!"); return; } catch (Exception) { await Bot.SendTextMessageAsync(message.Chat.Id, "Что-то у меня не получается найти вас, попробуйте еще раз!"); } return; default: break; } } var textMessage = message.Text; switch (message.Text) { case "/timetable": textMessage = "Покажи мне моё расписание"; break; case "/weather": textMessage = "Погода"; break; case "/news": textMessage = "Новости"; break; case "/locate": var keyboard = new ReplyKeyboardMarkup(new[] { new KeyboardButton($"{Emoji.Round_Pushpin} Моё местоположение") { RequestLocation = true } } ); await Bot.SendTextMessageAsync(message.Chat.Id, "Отправьте пожалуйста своё местоположение!", replyMarkup : keyboard); return; case "/help": StringBuilder sb = new StringBuilder(); sb.AppendLine("Для общения с ботом можно использовать как быстрые команды:"); sb.Append( $"{Emoji.White_Check_Mark} /timetable - Расписание на сегодня\n{Emoji.White_Check_Mark} /weather - Погода\n{Emoji.White_Check_Mark} /news - Новости\n{Emoji.White_Check_Mark} /locate - Маршрут до университета\n{Emoji.White_Check_Mark} /help - Помощь\n{Emoji.White_Check_Mark} /restart - Перезагрузка отношений\n"); sb.AppendLine("Так и всевозможные фразы:"); sb.AppendLine($"{Emoji.Arrow_Right} Покажи мне моё расписание"); sb.AppendLine($"{Emoji.Arrow_Right} Покажи мне моё расписание на [дату]"); sb.AppendLine($"{Emoji.Arrow_Right} Расписание [название группы | ФИО преподователя]"); sb.AppendLine($"{Emoji.Arrow_Right} Новости"); sb.AppendLine("И много много других фраз!"); await Bot.SendTextMessageAsync(message.Chat.Id, sb.ToString()); return; case "/restart": UService.RemoveUser(user.Id); await Bot.SendTextMessageAsync(message.Chat.Id, "Хорошо, как скажешь!"); return; default: break; } RecognitionSystem.MainUser.Context.SharedData.Add(user); var evaluateRequest = RecognitionSystem.Evaluate(textMessage); try { NormalMessage($"Invoke request handler:{evaluateRequest.Intents.First().Name} +{(int)evaluateRequest.Intents.First().Score * 100}%\nMessage:{textMessage} User:{message.Chat.Id}"); evaluateRequest.Invoke(); } catch (Exception) { WarningMessage("Reply not sent:" + message.Chat.Id); await Bot.SendTextMessageAsync(message.Chat.Id, $"Извини, не получилось выполнить твой запроc{Emoji.Disappointed}\n" + $"Какие-то проблемы на сервере\n" + $"Попробуй по позже!"); } }