protected override async Task onMessage(string mid = null, string author_id = null, string message = null, FB_Message message_object = null, string thread_id = null, ThreadType?thread_type = null, long ts = 0, JToken metadata = null, JToken msg = null)
        {
            //authorId: người gửi
            //thread_id: thread hiện tại
            var userId = this.GetUserUid();

            if (userId != author_id)
            {
                var specialMessage = await FacebookToolHelper.CheckSpecialMessage(message, thread_id);

                switch (specialMessage)
                {
                case Facebook.DAL.Enum.EnumFeature.NoSpecialFeature:
                case Facebook.DAL.Enum.EnumFeature.StopAll:
                case Facebook.DAL.Enum.EnumFeature.RemoveStopAll:
                case Facebook.DAL.Enum.EnumFeature.Stop5Min:
                    return;

                case Facebook.DAL.Enum.EnumFeature.TroLyAo:
                    await this.send(new FB_Message
                    {
                        text = ListHelper <string> .GetRandomItemInListObject(Constant.ListConfirmAgreeUseTroLyAoMessage)
                    }, thread_id, ThreadType.USER);

                    return;

                case Facebook.DAL.Enum.EnumFeature.GirlXinh:
                    string fileNameWithExtension = DownloadHelper.DownloadImageFromUrl(DownloadHelper.RandomImageIdGirl());
                    using (FileStream stream = File.OpenRead(fileNameWithExtension))
                    {
                        await sendLocalFiles(
                            file_paths : new Dictionary <string, Stream>()
                        {
                            { fileNameWithExtension, stream }
                        },
                            message : null,
                            thread_id : author_id,
                            thread_type : ThreadType.USER);
                    }
                    return;

                case Facebook.DAL.Enum.EnumFeature.TruyenCuoi:
                    List <string> listTruyenCuoi = await FacebookToolHelper.GetListTruyenCuoi();

                    await this.send(new FB_Message
                    {
                        text = ListHelper <string> .GetRandomItemInListObject(listTruyenCuoi)
                    }, thread_id, ThreadType.USER);

                    return;

                case Facebook.DAL.Enum.EnumFeature.TinTuc:
                    List <NewfeedRss> newfeedRsses = RSSHelper.GetTinMoiNhat();
                    foreach (var newfeed in newfeedRsses)
                    {
                        await this.send(new FB_Message
                        {
                            text = $"{ newfeed.Title} \n{newfeed.Link}"
                        }, thread_id, ThreadType.USER);
                    }
                    return;

                case Facebook.DAL.Enum.EnumFeature.NoiTu:
                    await FacebookToolHelper.SetUserNoiTu(author_id);

                    await this.send(new FB_Message
                    {
                        text = $"Bắt đầu chơi nối từ tiếng việt thôi!!!"
                    }, thread_id, ThreadType.USER);

                    return;

                case Facebook.DAL.Enum.EnumFeature.StopNoiTu:
                    await FacebookToolHelper.SetUserStopNoiTu(author_id);

                    await this.send(new FB_Message
                    {
                        text = $"Đã dừng chơi nối từ tiếng việt!"
                    }, thread_id, ThreadType.USER);

                    return;

                case Facebook.DAL.Enum.EnumFeature.NoiTuTiengAnh:
                    await FacebookToolHelper.SetUserNoiTuTiengAnh(author_id);

                    await this.send(new FB_Message
                    {
                        text = $"Bắt đầu chơi nối từ tiếng Anh thôi!!!"
                    }, thread_id, ThreadType.USER);

                    return;

                case Facebook.DAL.Enum.EnumFeature.StopNoiTuTiengAnh:
                    await FacebookToolHelper.SetUserStopNoiTuTiengAnh(author_id);

                    await this.send(new FB_Message
                    {
                        text = $"Đã dừng chơi nối từ tiếng Anh!"
                    }, thread_id, ThreadType.USER);

                    return;

                default:
                    break;
                }
                ConsoleLogHelper.WriteToConsole($"Got new message from {author_id}: {message}");
                var isBlock = await FacebookToolHelper.CheckIsBlockOrNot(author_id);

                if (isBlock)
                {
                    return;
                }
                else
                {
                    //Co the send message o day
                    var agreeSimsimi = await FacebookToolHelper.CheckUserAgreeSimsimi(thread_id);

                    if (await FacebookToolHelper.CheckIsNoiTuTiengVietOrNot(thread_id))
                    {
                        var    dic         = TuDienHelper.GenerateVietNameseDictionary();
                        var    lastWord    = message.LastWord();
                        var    listNewWord = dic.Keys.Where(x => String.Equals(x.FirstWord(), lastWord, StringComparison.OrdinalIgnoreCase) && x.Contains(" ")).ToList();
                        string textSend    = listNewWord.Count == 0 ? "Chịu thua rồi, ko tìm thấy từ nào cả :((" : $"Nối từ: {ListHelper<string>.GetRandomItemInListObject(listNewWord)}";
                        await this.send(new FB_Message
                        {
                            text = textSend
                        }, thread_id, ThreadType.USER);

                        return;
                    }
                    else if (await FacebookToolHelper.CheckIsNoiTuTiengAnhOrNot(thread_id))
                    {
                        var    dic         = TuDienHelper.GenerateVietNameseDictionary();
                        var    lastWord    = message.LastWord();
                        var    listNewWord = dic.Keys.Where(x => String.Equals(x.FirstWord(), lastWord, StringComparison.OrdinalIgnoreCase) && x.Contains(" ")).ToList();
                        string textSend    = listNewWord.Count == 0 ? "Chịu thua rồi, ko tìm thấy từ nào cả :((" : $"Nối từ: {ListHelper<string>.GetRandomItemInListObject(listNewWord)}";
                        await this.send(new FB_Message
                        {
                            text = textSend
                        }, thread_id, ThreadType.USER);

                        return;
                    }
                    else if (!agreeSimsimi)
                    {
                        await this.send(new FB_Message
                        {
                            text = ListHelper <string> .GetRandomItemInListObject(Constant.ListTroLyAoMessage)
                        }, thread_id, ThreadType.USER);

                        await FacebookToolHelper.AddUser10Min(thread_id);
                    }
                    else
                    {
                        string simsimiMessage = await SimsimiHelper.SendSimsimi(message);

                        await this.send(new FB_Message
                        {
                            text = "Trợ lý ảo: " + simsimiMessage
                        }, thread_id, ThreadType.USER);

                        ConsoleLogHelper.WriteToConsole($"Send message = {simsimiMessage} to {thread_id}");
                    }
                }
            }
            else
            {
                //Tự mình gửi đi
                var specialMessage = await FacebookToolHelper.CheckSpecialMessage(message, thread_id);

                switch (specialMessage)
                {
                case EnumFeature.NoiTu:
                    await FacebookToolHelper.SetUserNoiTu(thread_id);

                    break;

                case EnumFeature.StopNoiTu:
                    await FacebookToolHelper.SetUserStopNoiTu(thread_id);

                    break;
                }
                await Task.Yield();
            }
        }