示例#1
0
        private static string PrintBiomarks(users dbUser, HealthBotContext ctx, int t)
        {
            //var table = from questions_answers in ctx.questions_answers
            //            join biomarks in ctx.biomarks on questions_answers.id_question equals biomarks.id
            //            where (questions_answers.id_user == dbUser.id && ((DateTime.Now - questions_answers.date_time).TotalHours / 24) <= t)
            //            select new
            //            {
            //                name = biomarks.name,
            //                value = questions_answers.value
            //            };
            var time = DateTime.Now.Subtract(new TimeSpan(t, 0, 0, 0));
            var bs   = ctx.questions_answers
                       .Where(qa => qa.id_user == dbUser.id && qa.date_time >= time)
                       .Join(ctx.biomarks, z => z.id_question, b => b.id, (z, b) => new
            {
                name  = b.name,
                value = z.value
            })
                       .OrderBy(z => z.name)
                       .ToList();
            string message = "";

            foreach (var b in bs)
            {
                message += b.name + ": " + b.value + "\n";
            }
            if (message != "")
            {
                return(message.Substring(0, message.Length - 1));
            }
            return(message);
        }
示例#2
0
        public async Task <StatusCodeResult> Post()
        {
            string body;

            using (var reader = new StreamReader(Request.Body))
                body = await reader.ReadToEndAsync();
            dynamic data = Newtonsoft.Json.Linq.JObject.Parse(body)["data"];

            using (var ctx = new HealthBotContext())
            {
                var user = ctx.users.Find(6);
                if (user.chatting == "telegram")
                {
                    await Bots.telegramBot.SendTextMessageAsync(
                        chatId : user.telegram_chat_id,
                        text : data.ToString().Replace("@**Bot**", "")
                        );
                }
                else
                {
                    await Bots.viberBot.SendTextMessageAsync(new TextMessage()
                    {
                        Text     = "заглушка",
                        Receiver = user.loginViber
                    });
                }
            }
            return(Ok());
        }
示例#3
0
        public static string FindActivityEntityInTable(string[] words, HealthBotContext ctx)
        {
            knowledge_base row;

            if (words.Length > 1)
            {
                foreach (var first in words)
                {
                    foreach (var second in words)
                    {
                        row = ctx.knowledge_base.Where(t => t.activity == first && t.entity == second).FirstOrDefault();
                        if (row != null)
                        {
                            return(row.output);
                        }
                    }
                }
            }
            else
            {
                foreach (var first in words)    //такое себе, но а вдруг 0 элементов
                {
                    row = ctx.knowledge_base.Where(t => t.entity == first).FirstOrDefault();
                    if (row != null)
                    {
                        return(row.output);
                    }
                }
            }

            return(null);
        }
示例#4
0
        //icq
        public static DialogueFrame GetDialogueFrame(ICQ.Bot.Types.Message e, HealthBotContext ctx, users dbUser)
        {
            string txt;

            txt = e.Text.ToLower();
            return(AnylizeMessage(txt, ctx, dbUser));
        }
示例#5
0
        public StatusCodeResult Post([FromBody] string request)
        {
            //dynamic foo = JObject.Parse(request);
            //if (foo.Update == UpdateType.Appointment)
            //    var a = foo.message as UpdateAppointment;
            //var update = JsonConvert.DeserializeObject<MisUpdateMinimal>(request);

            var update = JsonConvert.DeserializeObject <MisUpdateMinimal>(request);

            if (update.Update == UpdateType.Appointment)
            {
                var _update = JsonConvert.DeserializeObject <MisUpdate <UpdateAppointment> >(request);
                using (var ctx = new HealthBotContext())
                {
                    try
                    {
                        var dbUser = FindUser(_update.UpdateMessage, ctx);
                        ctx.notifications.Add(new notifications()
                        {
                            id_user = dbUser.id,
                            message = CreateNotificationText(_update.UpdateMessage),
                            on_time = _update.UpdateMessage.DateTime
                        });
                        ctx.SaveChanges();
                        Bots.telegramBot.SendTextMessageAsync(dbUser.telegram_chat_id, "Вы записаны на прием к "
                                                              + _update.UpdateMessage.Doctor);
                    }
                    catch (ArgumentNullException)
                    {
                        return(new StatusCodeResult(404));
                    }
                }
            }
            else
            {
                using (var ctx = new HealthBotContext())
                {
                    var _update = JsonConvert.DeserializeObject <MisUpdate <UpdateConclusion> >(request);

                    try
                    {
                        var dbUser = FindUser(_update.UpdateMessage, ctx);
                        ctx.notifications.Add(new notifications()
                        {
                            id_user = dbUser.id,
                            message = "Принимайте лекарства",
                            on_time = GetTime(_update.UpdateMessage.DateTime)
                        });
                        ctx.SaveChanges();
                    }
                    catch (ArgumentNullException)
                    {
                        return(new StatusCodeResult(404));
                    }
                }
            }
            return(Ok());
        }
示例#6
0
        //telegram
        public static DialogueFrame GetDialogueFrame(Update e, HealthBotContext ctx, users dbUser)
        {
            string txt;

            if (e.Message.Text == null)
            {
                txt = e.Message.Caption.ToLower();                          //лучше смотреть тип сообщения
            }
            else
            {
                txt = e.Message.Text.ToLower();
            }
            return(AnylizeMessage(txt, ctx, dbUser));
        }
示例#7
0
        //viber
        public static DialogueFrame GetDialogueFrame(CallbackData e, HealthBotContext ctx, users dbUser)
        {
            string txt;

            if (e.Message.Type == MessageType.Text)
            {
                txt = ((TextMessage)e.Message).Text;
            }
            else if (e.Message.Type == MessageType.Picture)
            {
                return(new DialogueFrame(EnumActivity.LoadFile));//txt = ((PictureMessage)e.Message).Text;
            }
            else
            {
                return(new DialogueFrame(EnumActivity.Unknown));
            }

            return(AnylizeMessage(txt, ctx, dbUser));
        }
示例#8
0
        private static int?FindNextQuestion(HealthBotContext ctx, users dbUser, int startIndex = -1)
        {
            var qs = GetUsersBiomarks(dbUser, ctx).Select(t => t.id);
            var q  = ctx.biomarks
                     .OrderBy(t => t.id)
                     .Where(t => t.id > startIndex && qs.Contains(t.id))
                     .FirstOrDefault();

            if (q != null)
            {
                dbUser.is_last_question_system = false;
                return(q.id);
            }
            else
            {
                dbUser.is_last_question_system = null;
                return(null);
            }
        }
示例#9
0
 private users FindUser(UpdateBase message, HealthBotContext ctx)
 {
     if (message.ViberName == null)
     {
         message.ViberName = "";
     }
     if (message.TelegramName == null)
     {
         message.TelegramName = "";
     }
     if (message.ViberName.Length != 0 || message.TelegramName.Length != 0)
     {
         return(ctx.users.FirstOrDefault(t => t.loginViber == message.ViberName ||
                                         t.loginTelegram == message.TelegramName));
     }
     else
     {
         return(ctx.users.FirstOrDefault(t => t.phone_number == message.Phone));
     }
 }
示例#10
0
        private static async void ProcessMessage(User tlgrmUser, Message message)
        {
            DialogueFrame df;

            using (var ctx = new HealthBotContext())
            {
                var dbUser = ctx.users.Where(t => t.loginTelegram == tlgrmUser.Username).FirstOrDefault();

                if (dbUser == null) //если пользователя нет
                {
                    dbUser = new users()
                    {
                        loginTelegram    = tlgrmUser.Username,
                        fio              = tlgrmUser.FirstName + " " + tlgrmUser.LastName,
                        telegram_chat_id = message.Chat.Id
                    };
                    ctx.users.Add(dbUser);
                }

                //обработка сообщения (Dialogue state tracker)
                df = DialogueFrame.GetDialogueFrame(message, ctx, dbUser);

                //внутренняя работа в рамках платформы
                if (df.Activity == DialogueFrame.EnumActivity.DoNothing)
                {
                    return;
                }
                switch (df.Activity)
                {
                case DialogueFrame.EnumActivity.Answer:
                    await ctx.questions_answers.AddAsync(new questions_answers
                    {
                        id_user     = dbUser.id,
                        id_question = dbUser.id_last_question.Value,
                        value       = df.Entity,
                        date_time   = DateTime.Now
                    });

                    break;

                case DialogueFrame.EnumActivity.SystemAnswer:
                    break;

                case DialogueFrame.EnumActivity.LoadFile:
                    var path = Path.GetFullPath(@"..\..\");
                    var name = message.Photo[message.Photo.Length - 1].FileId;
                    DownloadFile(name, path + name);
                    ctx.files.Add(new files
                    {
                        content_hash = name,
                        directory    = "test",
                        id_user      = dbUser.id,
                        file_name    = name,
                        file_format  = "jpg",
                        id_source    = 1
                    });
                    break;

                case DialogueFrame.EnumActivity.ReadMyBiomarkers:
                    dbUser.id_last_question        = null;
                    dbUser.is_last_question_system = false;
                    break;

                case DialogueFrame.EnumActivity.ConversationStart: break;

                case DialogueFrame.EnumActivity.Unknown: break;
                }

                //обработка следующего сообщения (Dialogue state manager)
                await DialogueFrame.SendNextMessage(df, ctx, dbUser, message.Chat, Shared.telegramBot);

                await ctx.SaveChangesAsync();
            }
        }
示例#11
0
        public async Task <StatusCodeResult> Post()
        {
            DialogueFrame df;

            if (callbackData.Event != EventType.Message)
            {
                return(Ok());
            }

            using (var ctx = new HealthBotContext())
            {
                var viberUser = callbackData.Sender;
                var dbUser    = ctx.users.Where(t => t.loginViber == viberUser.Id).FirstOrDefault(); //изменить БД
                if (AppInfo.isDebugging)
                {
                    Console.WriteLine("В БД ЗАШЛО");
                }

                if (dbUser == null) //если пользователя нет
                {
                    if (AppInfo.isDebugging)
                    {
                        Console.WriteLine("ДОБАВЛЯЮ ПОЛЬЗОВАТЕЛЯ В БД");
                    }
                    dbUser = new users()
                    {
                        loginViber = viberUser.Id,
                        fio        = viberUser.Name
                    };
                    ctx.users.Add(dbUser);
                }
                //обработка сообщения (Dialogue state tracker)
                df = DialogueFrame.GetDialogueFrame(callbackData, ctx, dbUser);
                if (AppInfo.isDebugging)
                {
                    Console.WriteLine("СООБЩЕНИЕ ПОНЯТНО");
                }

                if (df.Activity == DialogueFrame.EnumActivity.DoNothing)
                {
                    return(Ok());
                }
                switch (df.Activity)
                {
                case DialogueFrame.EnumActivity.Answer:
                    await ctx.questions_answers.AddAsync(new questions_answers
                    {
                        id_user     = dbUser.id,
                        id_question = dbUser.id_last_question.Value,
                        value       = df.Entity,
                        date_time   = DateTime.Now
                    });

                    break;

                case DialogueFrame.EnumActivity.SystemAnswer:
                    break;

                case DialogueFrame.EnumActivity.LoadFile:
                    if (AppInfo.isDebugging)
                    {
                        Console.WriteLine("EnumActivity.LoadFile");
                    }
                    {
                        var path = Path.GetFullPath(@"..\");
                        if (AppInfo.isDebugging)
                        {
                            Console.WriteLine("ПУТЬ: " + path);
                        }
                        var uri  = ((PictureMessage)callbackData.Message).Media;
                        var name = uri.Substring(uri.LastIndexOf('/') + 1, uri.LastIndexOf('.') - uri.LastIndexOf('/') - 1);
                        if (AppInfo.isDebugging)
                        {
                            Console.WriteLine("ИМЯ: " + name);
                        }

                        using (var client = new WebClient())
                        {
                            client.DownloadFile(uri, path + name);
                        }

                        ctx.files.Add(new files
                        {
                            content_hash = name,
                            directory    = "test",
                            id_user      = dbUser.id,
                            file_name    = name,
                            file_format  = "jpg",
                            id_source    = 2
                        });
                        await ctx.SaveChangesAsync();

                        await Bots.viberBot.SendTextMessageAsync(new TextMessage()
                        {
                            Text   = "Изображение сохранено",
                            Sender = new UserBase()
                            {
                                Avatar = "https://dl-media.viber.com/1/share/2/long/vibes/icon/image/0x0/3eb4/af60406bde950b540663e6cad3f92ed79970d0ca6a6291491da8b00c3f643eb4.jpg",
                                Name   = "HealhBot"
                            },
                            Receiver      = callbackData.Sender.Id,
                            MinApiVersion = callbackData.Message.MinApiVersion,
                            TrackingData  = callbackData.Message.TrackingData
                        });

                        break;
                    }
                    break;

                case DialogueFrame.EnumActivity.ReadMyBiomarkers:
                    dbUser.id_last_question        = null;
                    dbUser.is_last_question_system = false;
                    break;

                case DialogueFrame.EnumActivity.ConversationStart: break;

                case DialogueFrame.EnumActivity.Unknown: break;
                }

                //обработка следующего сообщения (Dialogue state manager)
                DialogueFrame.SendNextMessage(df, ctx, dbUser, callbackData, Bots.viberBot);
                await ctx.SaveChangesAsync();
            }
            return(Ok());
        }
示例#12
0
        public static async Task SendNextMessage(DialogueFrame df, HealthBotContext ctx, users dbUser, IICQBotClient client)
        {
            string message = "";

            ICQ.Bot.Types.ReplyMarkups.InlineKeyboardMarkup keyboard;
            string[] buttons = null;

            if (df.Activity == EnumActivity.Unknown)
            {
                if (df.Tag != null)
                {
                    await client.SendTextMessageAsync(
                        chatId : dbUser.icq_chat_id,
                        text : df.Entity,
                        replyMarkup : null
                        );
                }
                else
                {
                    return;
                }
            }
            else
            {
                message = await GetNextMessage(df, dbUser, ctx, buttons);

                if (df.Activity == EnumActivity.CallHuman)
                {
                    dbUser.id_last_question        = null;
                    dbUser.is_last_question_system = null;
                    dbUser.chatting = "icq";
                }
                if (dbUser.is_last_question_system.HasValue)
                {
                    //если нужно прислать картинку
                    //if (dbUser.is_last_question_system.Value && dbUser.id_last_question == (int)SystemMessages.SendBiomark_plot)
                    //{
                    //    using (Stream stream = System.IO.File.OpenRead(dbUser.token + ".png"))
                    //    {
                    //        await client.SendFileAsync(
                    //            chatId: dbUser.icq_chat_id,
                    //            document: new ICQ.Bot.Types.InputFiles.InputOnlineFile(stream),
                    //            caption: "Ваш график"
                    //            );
                    //    }
                    //    dbUser.id_last_question = null;
                    //    dbUser.is_last_question_system = null;
                    //}
                }
                if (message != "")
                {
                    if (buttons != null)
                    {
                        keyboard = new ICQ.Bot.Types.ReplyMarkups.InlineKeyboardMarkup(
                            buttons.Select(t => new ICQ.Bot.Types.ReplyMarkups.InlineKeyboardButton()
                        {
                            Text = t
                        })
                            );

                        await client.SendTextMessageAsync(
                            chatId : dbUser.icq_chat_id,
                            text : message,
                            replyMarkup : keyboard
                            );
                    }
                    else
                    {
                        await client.SendTextMessageAsync(
                            chatId : dbUser.icq_chat_id,
                            text : message,
                            replyMarkup : null
                            );
                    }
                }
                else
                {
                    dbUser.id_last_question = null;
                }
            }
        }
示例#13
0
        public static async void SendNextMessage(DialogueFrame df, HealthBotContext ctx, users dbUser,
                                                 CallbackData callbackData, IViberBotClient client)
        {
            string   message = "";
            Keyboard keyboard;

            string[] buttons = null;

            if (df.Activity == EnumActivity.Unknown)
            {
                if (df.Entity != "")
                {
                    message = df.Entity;
                }
                else
                {
                    return;
                }
            }
            else
            {
                message = await GetNextMessage(df, dbUser, ctx, buttons);

                if (df.Activity == EnumActivity.CallHuman)
                {
                    dbUser.id_last_question        = null;
                    dbUser.is_last_question_system = null;
                    dbUser.chatting = "viber";
                }
                if (dbUser.is_last_question_system.HasValue)
                {
                    //если нужно прислать картинку
                    if (dbUser.is_last_question_system.Value == true && dbUser.id_last_question == (int)SystemMessages.SendBiomark_plot)
                    {
                        using (Stream stream = System.IO.File.OpenRead(dbUser.token + ".png"))
                        {
                            await client.SendPictureMessageAsync(
                                new PictureMessage()
                            {
                                Text          = "Ваш график",
                                Receiver      = callbackData.Sender.Id,
                                MinApiVersion = callbackData.Message.MinApiVersion,
                                TrackingData  = callbackData.Message.TrackingData,
                                Media         = "https://upload.wikimedia.org/wikipedia/commons/5/57/Viber-logo.png" //viber is lame
                            }
                                );
                        }
                        dbUser.id_last_question        = null;
                        dbUser.is_last_question_system = null;
                    }
                }
                if (message != "")
                {
                    dbUser.id_last_question = (int?)df.Tag;
                    if (buttons != null)
                    {
                        keyboard = new Keyboard()
                        {
                            BackgroundColor = "#32C832",
                            Buttons         = buttons.Select(t => new Viber.Bot.KeyboardButton()
                            {
                                Text = t
                            }).ToList()
                        };
                        await client.SendKeyboardMessageAsync(new KeyboardMessage
                        {
                            Text          = message,
                            Keyboard      = keyboard,
                            Receiver      = callbackData.Sender.Id,
                            MinApiVersion = callbackData.Message.MinApiVersion,
                            TrackingData  = callbackData.Message.TrackingData
                        });
                    }
                    else
                    {
                        await client.SendTextMessageAsync(new TextMessage()
                        {
                            Text          = message,
                            Receiver      = callbackData.Sender.Id,
                            MinApiVersion = callbackData.Message.MinApiVersion,
                            TrackingData  = callbackData.Message.TrackingData
                        });
                    }
                }
                else
                {
                    dbUser.id_last_question = null;
                }
            }
        }
示例#14
0
        public static async Task SendNextMessage(DialogueFrame df, HealthBotContext ctx,
                                                 users dbUser, Chat chat, ITelegramBotClient client)
        {
            string message = "";
            ReplyKeyboardMarkup keyboard;

            string[] buttons = null;

            if (df.Activity == EnumActivity.Unknown)
            {
                if (df.Entity != "")
                {
                    message = df.Entity;
                }
                else
                {
                    return;
                }
            }
            else
            {
                message = await GetNextMessage(df, dbUser, ctx, buttons);

                if (df.Activity == EnumActivity.CallHuman)
                {
                    dbUser.id_last_question        = null;
                    dbUser.is_last_question_system = null;
                    dbUser.chatting = "telegram";
                }
                if (dbUser.is_last_question_system.HasValue)
                {
                    //если нужно прислать картинку
                    if (dbUser.is_last_question_system.Value == true && dbUser.id_last_question == (int)SystemMessages.SendBiomark_plot)
                    {
                        using (Stream stream = System.IO.File.OpenRead(dbUser.token + ".png"))
                        {
                            await client.SendPhotoAsync(
                                chatId : chat,
                                photo : stream,
                                caption : "Ваш график"
                                );
                        }
                        dbUser.id_last_question        = null;
                        dbUser.is_last_question_system = null;
                    }
                }
                if (message != "")
                {
                    if (buttons != null)
                    {
                        keyboard = new ReplyKeyboardMarkup
                        {
                            Keyboard = new[] {
                                buttons.Select(t => new Telegram.Bot.Types.ReplyMarkups.KeyboardButton(t))
                            },
                            ResizeKeyboard = true
                        };
                        await client.SendTextMessageAsync(
                            chatId : chat,
                            text : message,
                            replyMarkup : keyboard
                            );
                    }
                    else
                    {
                        await client.SendTextMessageAsync(
                            chatId : chat,
                            text : message,
                            replyMarkup : new ReplyKeyboardRemove()
                            );
                    }
                }
                else
                {
                    dbUser.id_last_question = null;
                }
            }
        }
示例#15
0
 private static biomarks[] GetUsersBiomarks(users dbUser, HealthBotContext ctx)
 {
     return(ctx.biomarks.Where(t => ctx.users_biomarks.Where(q => q.id_user == dbUser.id).Select(z => z.id_biomark).Contains(t.id)).ToArray());
 }
示例#16
0
        public static async Task <string> GetNextMessage(DialogueFrame df, users dbUser, HealthBotContext ctx, string[] buttons)
        {
            string message = "";

            if (df.Activity == EnumActivity.CallHuman)
            {
                await SendToZulip(dbUser, ctx, "С Вами общается " + dbUser.fio, true);

                message = "Ожидание оператора. Для отмены напишите \"Отмена\". (прим. автора: операторов нет, поэтому скорее всего ждать придется очень долго)";
                dbUser.id_last_question        = null;
                dbUser.is_last_question_system = null;
            }
            else if (df.Activity == EnumActivity.Chatting)
            {
                if (df.Entity.ToLower() == "отмена")
                {
                    dbUser.chatting = "";
                    message         = "Диалог закончен. Спасибо";
                }
                await SendToZulip(dbUser, ctx, df.Entity, false);
            }
            else if (df.Activity == EnumActivity.AddBiomarks)
            {
                message = ctx.system_messages.Find((int)SystemMessages.PleaseListBiomarks).message;
                dbUser.id_last_question        = (int)SystemMessages.PleaseListBiomarks;
                dbUser.is_last_question_system = true;
            }
            else if (df.Activity == EnumActivity.PrintBiomarks)
            {
                message = ctx.system_messages.Find((int)SystemMessages.WhatPeriod).message;
                dbUser.id_last_question        = (int)SystemMessages.WhatPeriod;
                dbUser.context                 = ((int)EnumActivity.PrintBiomarks).ToString();
                dbUser.is_last_question_system = true;
            }
            else if (df.Activity == EnumActivity.Answer || df.Activity == EnumActivity.ReadMyBiomarkers)
            {
                if (df.Tag != null)
                {
                    message = ctx.questions.Where(t => t.id_biomark == (int?)df.Tag).FirstOrDefault().question;
                    dbUser.id_last_question = (int?)df.Tag;
                }
                else
                {
                    return(message);
                }
            }
            else if (df.Activity == EnumActivity.SystemAnswer)
            {
                switch (dbUser.id_last_question)
                {
                case (int)SystemMessages.SendBiomark_plot:
                    message = App_GetPlot(dbUser.token, DateTime.MinValue, DateTime.Now, dbUser.context);
                    if (message.Length == 0 || message == "К сожалению, приложение \"Здоровье\" не отвечает. попробуйте позже.")
                    {
                        dbUser.id_last_question        = null;
                        dbUser.is_last_question_system = null;
                    }
                    break;

                case (int)SystemMessages.SendToken:
                    message                        = ctx.system_messages.Find((int)SystemMessages.ThanksForToken).message;
                    dbUser.token                   = df.Entity;
                    dbUser.id_last_question        = null;
                    dbUser.is_last_question_system = null;
                    break;

                case (int)SystemMessages.YouveEnteredToken:
                    message = ctx.system_messages.Find((int)SystemMessages.SendToken).message;
                    dbUser.id_last_question = (int)SystemMessages.SendToken;
                    break;

                case (int)SystemMessages.SendBiomark_record:
                    dbUser.context                 = df.Entity;
                    message                        = ctx.system_messages.Find((int)SystemMessages.SendBiomarkValue_record).message;
                    dbUser.id_last_question        = (int)SystemMessages.SendBiomarkValue_record;
                    dbUser.is_last_question_system = true;
                    break;

                case (int)SystemMessages.SendBiomarkValue_record:
                    double value;
                    if (double.TryParse(df.Entity.Replace(',', '.'), out value))
                    {
                        message = App_AddRecord(dbUser.token, dbUser.context, DateTime.Now, value.ToString());
                        dbUser.id_last_question        = null;
                        dbUser.is_last_question_system = null;
                    }
                    else
                    {
                        message = ctx.system_messages.Find((int)SystemMessages.PleaseEnterNumber).message;
                        dbUser.id_last_question        = (int)SystemMessages.SendBiomarkValue_record;
                        dbUser.is_last_question_system = true;
                    }
                    break;

                case (int)SystemMessages.PleaseListBiomarks:
                    try
                    {
                        var      biomarks = df.Entity.Split(", ");
                        biomarks dbB      = null;
                        foreach (var b in biomarks)
                        {
                            dbB = ctx.biomarks.Where(t => t.name == b).FirstOrDefault();
                            if (dbB != null && !ctx.users_biomarks.Where(t => t.id_user == dbUser.id).Select(t => t.id_biomark).Contains(dbB.id))
                            {
                                ctx.users_biomarks.Add(new users_biomarks()
                                {
                                    id_user = dbUser.id, id_biomark = dbB.id
                                });
                            }
                        }
                        message = ctx.system_messages.Find((int)SystemMessages.Success).message;
                        dbUser.id_last_question        = null;
                        dbUser.is_last_question_system = null;
                    }
                    catch (Exception e)
                    {
                        message = e.Message;
                        dbUser.id_last_question        = null;
                        dbUser.is_last_question_system = null;
                    }
                    break;

                case (int)SystemMessages.WhatPeriod:
                {
                    if (dbUser.context == ((int)EnumActivity.PrintBiomarks).ToString())
                    {
                        switch (df.Entity)
                        {
                        case "сутки":
                            message = PrintBiomarks(dbUser, ctx, 1);
                            dbUser.id_last_question        = null;
                            dbUser.is_last_question_system = null;
                            break;

                        case "неделя":
                            message = PrintBiomarks(dbUser, ctx, 7);
                            dbUser.id_last_question        = null;
                            dbUser.is_last_question_system = null;
                            break;

                        case "месяц":
                            message = PrintBiomarks(dbUser, ctx, 30);
                            dbUser.id_last_question        = null;
                            dbUser.is_last_question_system = null;
                            break;

                        default:
                            message = "Ошибка при вводе перида";
                            dbUser.id_last_question        = null;
                            dbUser.is_last_question_system = null;
                            break;
                        }
                    }
                    if (message == "")
                    {
                        message = "Нет показателей для вывода. Для записи показателей напшите \"Запиши мои показатели\"";
                    }
                    dbUser.context = "";
                    break;
                }
                }
            }
            else if (df.Activity == EnumActivity.LoadFile)
            {
                message = ctx.system_messages.Find((int)SystemMessages.ImageSaved).message;
            }
            else if (df.Activity == EnumActivity.ConversationStart)
            {
                buttons = new[] { "Да", "Нет" };
                message = ctx.system_messages.Find((int)SystemMessages.WantToStart).message;
                dbUser.id_last_question        = (int)SystemMessages.WantToStart;
                dbUser.is_last_question_system = true;
            }
            else if (df.Activity == EnumActivity.ConversationStartAnswer)
            {
                message = ctx.system_messages.Find((int)SystemMessages.Hello).message;
            }
            else if (df.Activity == EnumActivity.SendToApp)
            {
                message = ctx.system_messages.Find((int)SystemMessages.SendBiomark_record).message;
                dbUser.id_last_question        = (int)SystemMessages.SendBiomark_record;
                dbUser.is_last_question_system = true;
            }
            else if (df.Activity == EnumActivity.GetPlot)
            {
                message = ctx.system_messages.Find((int)SystemMessages.SendBiomark_plot).message;
                dbUser.id_last_question        = (int)SystemMessages.SendBiomark_plot;
                dbUser.is_last_question_system = true;
            }
            else if (df.Activity == EnumActivity.ConnectToMobileApp)
            {
                if (dbUser.token == null || dbUser.token.Length == 0)
                {
                    message = ctx.system_messages.Find((int)SystemMessages.SendToken).message;
                    dbUser.id_last_question        = (int)SystemMessages.SendToken;
                    dbUser.is_last_question_system = true;
                }
                else
                {
                    message = ctx.system_messages.Find((int)SystemMessages.YouveEnteredToken).message;
                    dbUser.id_last_question        = (int)SystemMessages.YouveEnteredToken;
                    dbUser.is_last_question_system = true;
                }
            }
            else if (df.Activity == EnumActivity.SecretMessage)
            {
                message = ctx.system_messages.Find((int)SystemMessages.SecretMessage).message;
                //message = App_AddRecord(dbUser.token, "шаги", DateTime.Now, "10.5");
                //message = App_GetPlot(dbUser.token, DateTime.MinValue, DateTime.Now, "шаги");
            }
            else if (df.Activity == EnumActivity.Unknown)
            {
                message = df.Entity;
            }

            return(message);
        }
示例#17
0
        private static DialogueFrame AnylizeMessage(string message, HealthBotContext ctx, users dbUser)
        {
            EnumActivity ea  = EnumActivity.DoNothing;
            string       ent = "";
            object       tag = null;

            if (dbUser.chatting != null && dbUser.chatting != "")
            {
                ea  = EnumActivity.Chatting;
                ent = message;
            }
            else
            {
                var txt = FindActivityEntityInTable(message.Replace(",", "").Replace(".", "").Replace(":", "").Split(' '), ctx);
                if (txt == null)
                {
                    txt = message;
                }

                if (txt == "запиши мои показания")
                {
                    ea  = EnumActivity.ReadMyBiomarkers;
                    tag = FindNextQuestion(ctx, dbUser);
                    if (tag == null)
                    {
                        ent = ctx.system_messages.Find((int)SystemMessages.YouDontHaveBiomarksToTrack).message;
                    }
                }
                else if (txt == "загрузи файл")
                {
                    ea = EnumActivity.LoadFile;
                    //доп контекст не нужен?
                }
                else if (txt == "добавь показатели")
                {
                    ea = EnumActivity.AddBiomarks;
                }
                else if (txt == "/start")
                {
                    ea = EnumActivity.ConversationStart;
                }
                else if (txt == "покажи мне график приложения")
                {
                    ea = EnumActivity.GetPlot;
                }
                else if (txt == "введи показатель в приложение")
                {
                    ea = EnumActivity.SendToApp;
                }
                else if (txt == "синхронизируй с приложением")
                {
                    ea = EnumActivity.ConnectToMobileApp;
                }
                else if (txt == "позови человека")
                {
                    ea = EnumActivity.CallHuman;
                }
                else if (txt == "выведи показания")
                {
                    ea = EnumActivity.PrintBiomarks;
                }
                else if (txt == "секретное сообщение")
                {
                    ea = EnumActivity.SecretMessage;
                }
                else if (dbUser.id_last_question != null && dbUser.is_last_question_system.HasValue)
                {
                    //ответ на запись показаний
                    if (!dbUser.is_last_question_system.Value)
                    {
                        var question = ctx.biomarks.Where(t => t.id == dbUser.id_last_question).FirstOrDefault();
                        if (question != null)
                        {
                            ent = ParseAnswer(txt, question.format, question.splitter);
                        }
                        if (ent != "")
                        {
                            ea  = EnumActivity.Answer;
                            tag = FindNextQuestion(ctx, dbUser, dbUser.id_last_question.Value);
                        }
                        else
                        {
                            ea  = EnumActivity.Unknown;
                            ent = ctx.system_messages.Find((int)SystemMessages.ErrorInputBiomark).message;
                            tag = true;
                        }
                    }
                    else
                    {
                        //системное сообщение
                        bool makeNull = false;
                        switch (dbUser.id_last_question)
                        {
                        case (int)SystemMessages.WantToStart:
                            if (txt == "да")
                            {
                                ea = EnumActivity.DoNothing;
                            }
                            else
                            {
                                ea  = EnumActivity.Unknown;
                                ent = "Неправильный ответ";
                            }
                            makeNull = true;
                            break;

                        case (int)SystemMessages.SendBiomark_plot:
                            ea  = EnumActivity.SystemAnswer;
                            ent = txt;
                            break;

                        case (int)SystemMessages.SendBiomark_record:
                            ea  = EnumActivity.SystemAnswer;
                            ent = txt;
                            break;

                        case (int)SystemMessages.SendBiomarkValue_record:
                            ea  = EnumActivity.SystemAnswer;
                            ent = txt;
                            break;

                        case (int)SystemMessages.SendToken:
                            ea  = EnumActivity.SystemAnswer;
                            ent = txt;
                            break;

                        case (int)SystemMessages.YouveEnteredToken:
                            if (txt == "да")
                            {
                                ea  = EnumActivity.SystemAnswer;
                                ent = txt;
                            }
                            else if (txt == "нет")
                            {
                                ea = EnumActivity.DoNothing;
                            }
                            else
                            {
                                ea  = EnumActivity.Unknown;
                                ent = "Ошибка при вводе. Повторите снова";
                            }
                            break;

                        case (int)SystemMessages.PleaseListBiomarks:
                            ea  = EnumActivity.SystemAnswer;
                            ent = txt;
                            break;

                        case (int)SystemMessages.WhatPeriod:
                            ea  = EnumActivity.SystemAnswer;
                            ent = txt;
                            break;
                        }
                        if (ea == EnumActivity.DoNothing || ea == EnumActivity.Unknown)
                        {
                            dbUser.is_last_question_system = null;
                            dbUser.id_last_question        = null;
                        }
                    }
                }
                else
                {
                    ea = EnumActivity.Unknown;
                }
            }

            return(new DialogueFrame(ea, ent, tag));
        }
示例#18
0
 private static async Task SendToZulip(users dbUSer, HealthBotContext ctx, string txt, bool createUser)
 {
     await Controllers.ZulipController.Send(txt, dbUSer.id, createUser);
 }
示例#19
0
        public async Task <StatusCodeResult> Post()
        {
            DialogueFrame df;
            string        body;

            using (var reader = new StreamReader(Request.Body))
                body = await reader.ReadToEndAsync();

            var update = JsonConvert.DeserializeObject <Update>(body);

            if (update.Type != Telegram.Bot.Types.Enums.UpdateType.Message)
            {
                return(Ok());
            }

            Console.WriteLine(update);

            using (var ctx = new HealthBotContext())
            {
                var tlgrmUser = update.Message.From;
                var dbUser    = ctx.users.Where(t => t.loginTelegram == tlgrmUser.Username).FirstOrDefault();

                if (dbUser == null) //если пользователя нет
                {
                    dbUser = new users()
                    {
                        loginTelegram    = tlgrmUser.Username,
                        fio              = tlgrmUser.FirstName + " " + tlgrmUser.LastName,
                        telegram_chat_id = update.Message.Chat.Id
                    };
                    ctx.users.Add(dbUser);
                }

                //обработка сообщения (Dialogue state tracker)
                df = DialogueFrame.GetDialogueFrame(update, ctx, dbUser);

                //внутренняя работа в рамках платформы
                if (df.Activity == DialogueFrame.EnumActivity.DoNothing)
                {
                    return(Ok());
                }
                switch (df.Activity)
                {
                case DialogueFrame.EnumActivity.Answer:
                    await ctx.questions_answers.AddAsync(new questions_answers
                    {
                        id_user     = dbUser.id,
                        id_question = dbUser.id_last_question.Value,
                        value       = df.Entity,
                        date_time   = DateTime.Now
                    });

                    break;

                case DialogueFrame.EnumActivity.SystemAnswer:
                    break;

                case DialogueFrame.EnumActivity.LoadFile:
                    var path = Path.GetFullPath(@"..\..\");
                    var name = update.Message.Photo[update.Message.Photo.Length - 1].FileId;
                    DownloadFile(name, path + name);
                    ctx.files.Add(new files
                    {
                        content_hash = name,
                        directory    = "test",
                        id_user      = dbUser.id,
                        file_name    = name,
                        file_format  = "jpg",
                        id_source    = 1
                    });
                    break;

                case DialogueFrame.EnumActivity.ReadMyBiomarkers:
                    dbUser.id_last_question        = null;
                    dbUser.is_last_question_system = false;
                    break;

                case DialogueFrame.EnumActivity.ConversationStart: break;

                case DialogueFrame.EnumActivity.Unknown: break;
                }

                //обработка следующего сообщения (Dialogue state manager)
                await DialogueFrame.SendNextMessage(df, ctx, dbUser, update.Message.Chat, Bots.telegramBot);

                await ctx.SaveChangesAsync();
            }

            return(Ok());
        }