private static void Client_MessageReceived(object sender, MessageEventArgs <UserState> e)
        {
            var msg = e.Message.Text.ToLower();

            if (OFF)
            {
                if (msg == "вкл")
                {
                    if (e.Message.User == SkidID)
                    {
                        OFF = false;
                    }
                    e.Message.Reply("Бот включён");
                }
                return;
            }

            if (e.Message.UserState == UserState.DontReply)
            {
                if (msg == "вкл")
                {
                    client.SetUserState(e.Message.User, UserState.Default);
                    e.Message.Reply("Бот включён");
                }
                return;
            }

            if (e.Message.UserState == UserState.Training)
            {
                if (msg == "отмена")
                {
                    e.Message.Reply("Режим обучения отключён");
                    client.SetUserState(e.Message.User, UserState.Default);
                    return;
                }

                if (msg == "размер")
                {
                    long memory, patterns, answers;
                    memory   = GetObjectSize(CustomAnswers);
                    patterns = CustomAnswers.Keys.Count;
                    answers  = CustomAnswers.Sum(p => p.Value.Count);
                    e.Message.Reply($"Текущий размер базы данных:\n\nЗанятая память: {memory / 1024f}Kb\nКоличество фраз: {patterns}\nКоличество ответов: {answers}");
                }

                if (e.Message.Text.Contains("|"))
                {
                    e.Message.Reply("Использование символа вертикальной черты запрещено");
                    return;
                }

                var strings = e.Message.Text.Split(new[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries);
                if (strings.Length < 2)
                {
                    e.Message.Reply("Неверных формат входных данных для обучения.\nЗнаешь, у меня есть подозрения что один из нас тупенький. И это не я\n\nЕсли ты хочешь выйти из режима обучения, напиши ОТМЕНА");
                    return;
                }

                var pattern = strings.First().Trim();
                if (pattern.ToUpper() != pattern)
                {
                    e.Message.Reply("Шаблон должен быть в верхнем регистре");
                    return;
                }
                pattern = pattern.ToLower();

                List <string> existed = new List <string>();
                if (CustomAnswers.ContainsKey(pattern))
                {
                    foreach (var ss in strings.Skip(1).Select(s => s.Trim()).ToArray())
                    {
                        if (CustomAnswers[pattern].Select(s => s.ToLower()).Contains(ss.ToLower()))
                        {
                            existed.Add(ss);
                        }
                        else
                        {
                            CustomAnswers[pattern].Add(ss);
                        }
                    }

                    if (existed.Count > 0)
                    {
                        e.Message.Reply($"К ответам на фразу \"{pattern}\" добавлено {strings.Length - 1 - existed.Count} ответов.\nТекущее количество ответов на фразу = {CustomAnswers[pattern].Count}\n\nСледующие ответы не были добавлены, т.к. уже существуют:\n" + string.Join(", ", existed));
                    }
                    else
                    {
                        e.Message.Reply($"Спасибо, теперь я умею отвечать на фразу \"{pattern}\"\nНа данную фразу у меня уже {CustomAnswers[pattern].Count} ответов!");
                    }
                }
                else
                {
                    CustomAnswers[pattern] = strings.Skip(1).Select(s => s.Trim()).ToList();
                    e.Message.Reply($"Спасибо, теперь я умею отвечать на фразу \"{pattern}\"");
                }

                if (!AddedPhrases.ContainsKey(e.Message.User))
                {
                    AddedPhrases[e.Message.User] = strings.Length - 1 - existed.Count;
                }
                else
                {
                    AddedPhrases[e.Message.User] += strings.Length - 1 - existed.Count;
                }

                return;
            }

            if (e.Message.UserState == UserState.PriceList)
            {
                int index;
                var pricelist = client.PriceList.ToArray();
                if (!int.TryParse(msg, out index))
                {
                    var items = pricelist.Select(p => p.Name.ToLower()).ToList();
                    items.Add("весь прайс");
                    items.Add("дополнительная информация");
                    items.Add("отмена");
                    if (!items.Contains(msg))
                    {
                        client.SendMessage(e.Message.User, "Прости, я не такой умненький и не смог тебя понять.\nНапиши номер пункта или его название, чтоб получить информацию.\nЛибо напиши ОТМЕНА чтоб выйти из режима получения данных о прайсе о3о");
                        return;
                    }
                    index = items.IndexOf(msg) + 1;
                }

                index--;

                if (index < pricelist.Length)
                {
                    string answer;
                    answer = '[' + pricelist[index].Name + "]\n\nСтоимость: " + pricelist[index].Price +
                             "\nФормат: " + pricelist[index].Format +
                             "\nРазмер: " + pricelist[index].Size +
                             "\nЗа дополнительного персонажа: " + pricelist[index].AddChar +
                             "\n\nПримеры:";
                    client.SendMessage(e.Message.User, answer, pricelist[index].Examples);
                }
                else
                {
                    index -= pricelist.Length;
                    if (index == 0)
                    {
                        var answer = string.Join("\n", pricelist.Select(p => p.Name + " - " + p.Price).ToArray());
                        client.SendMessage(e.Message.User, answer);
                    }
                    if (index == 1)
                    {
                        client.SendMessage(e.Message.User, client.AdditionalInfoAboutCommissions);
                    }
                    if (index == 2)
                    {
                        client.SetUserState(e.Message.User, UserState.Default);
                        client.MarkAsRead(e.Message);
                    }
                }
                return;
            }

            if (e.Message.UserState == UserState.Default || e.Message.UserState == UserState.Hello || e.Message.UserState == UserState.NotUnderstand)
            {
                if (msg == "выкл")
                {
                    if (e.Message.User == SkidID)
                    {
                        e.Message.Reply("Бот отключен. Если хочешь чтоб бот снова отвечал пользователям, напиши ВКЛ");
                        OFF = true;
                        return;
                    }
                    client.SetUserState(e.Message.User, UserState.DontReply);
                    return;
                }

                if (Regex.IsMatch(msg, @"(\W|^)помощь(\W|$)"))
                {
                    client.SetUserState(e.Message.User, UserState.Default);
                    e.Message.Reply("ПРАЙС - прайс лист художника\n" +      // сделяль
                                                                            //"АРТ-СТАТУС - текущий арт-статус\n" +
                                    "ПРАВИЛА - правила данной группы\n" +   // сделяль
                                    "ПРИМЕРЫ - примеры артов\n" +           // сделяль
                                    "РЕФ/РЕФКИ - персонаж(и) художника\n" + // сделяль
                                    "ФА - ссылка на FurAffinity\n" +        // сделяль
                                    "ДА - ссылка на DeviantArt\n" +         // сделаль
                                    "УЧИТЬ - режим обучения бота\n" +
                                    "\nБОТ - информация о боте");           // сделяль
                    return;
                }

                if (msg == "бот")
                {
                    client.SetUserState(e.Message.User, UserState.Default);
                    e.Message.Reply("Твелв-бот\nБот разработан для группы https://vk.com/skid_gallery \nХудожник - https://vk.com/id" + SkidID + " (Skid)\nСоздатель бота - https://vk.com/id20108853 (Тш)\nЕсли хотите себе такого же бота в группу, можете написать мне :з (https://vk.com/id20108853)");
                    return;
                }

                if (msg == "учить")
                {
                    client.SetUserState(e.Message.User, UserState.Training);
                    e.Message.Reply("Добро пожаловать в режим обучения бота.\nВ данном режиме вы можете научить меня отвечать на различные сообщения.\nЧтобы добавить фразы, которыми я буду отвечать на определённое сообщение, пришлите мне сообщение в виде: ШАБЛОН *перенос строки* ОТВЕТ. Ответов можно добавлять несколько, разделяя их так же переносом строки.\nПример:\n\nЗДРАВСТВУЙ\nПриветик\nДобрый день\nХей! Как делишки?\n\nТаким образом бот будет отвечать на сообщение с текстом \"здравствуй\" одной из трёх фраз.\nБлижайшее время будет добавлена возможность вводить шаблоны в виде регулярных выражений.\nДля выхода из режима обучения пожалуйста напишите ОТМЕНА\n\nНадеюсь Вы научите меня правильно отвечать. Пожалуйста, не вставляйте различные ссылки/рекламу в ответы, или же сообщения не по теме. Злоупотребление данной функцией может привести к вашей блокировке. <3");
                    return;
                }

                if (Regex.IsMatch(msg, @"(\W|^)арт-?статус(\W|$)") || ((Regex.IsMatch(msg, @"(\W|^)открыты?(\W|$)") || Regex.IsMatch(msg, @"(\W|^)заказать(\W|$)")) &&
                                                                       Regex.IsMatch(msg, @"(\W|^)(заказы?|комм?иш\w*|реквесты?|коллаб\w*)(\W|$)")))
                {
                    client.SetUserState(e.Message.User, UserState.Default);
                    e.Message.Reply("Извините, данная функция ещё не реализована");
                    return;
                }

                if (Regex.IsMatch(msg, @"(\W|^)прайс(\W|$)"))
                {
                    client.SetUserState(e.Message.User, UserState.PriceList);
                    //e.Message.Reply("Извините, данная функция ещё не реализована");
                    //e.Message.Reply("Нахуй иди, сам блять смотри прайс\nЯ тут не на тупые вопросы отвечать пришёл\nВ обсуждения группы самостоятельно зайти можешь, не маленький");
                    if (client.PriceList.Count == 0)
                    {
                        client.UpdatePrice();
                    }
                    var prices = client.PriceList.Select((p, i) => (i + 1).ToString() + ") " + p.Name).ToArray();
                    client.SendMessage(e.Message.User, "Выберите, что вас интересует:\n" + string.Join("\n", prices) + "\n" + (prices.Length + 1) + ") Весь прайс\n" + (prices.Length + 2) + ") Дополнительная информация\n" + (prices.Length + 3) + ") Отмена");
                    return;
                }

                if (Regex.IsMatch(msg, @"(\W|^)примеры?(\W|$)"))
                {
                    client.SetUserState(e.Message.User, UserState.Default);
                    var img = client.GetRandomPictureFromAlbum(239672159);
                    client.SendMessage(e.Message.User, "", new List <PhotosPhoto>(new [] { img }));
                    return;
                }

                if (Regex.IsMatch(msg, @"(\W|^)(fa|фа)(\W|$)"))
                {
                    client.SetUserState(e.Message.User, UserState.Default);
                    client.SetUserState(e.Message.User, UserState.Default);
                    e.Message.Reply(SkidFA);
                    return;
                }

                if (Regex.IsMatch(msg, @"(\W|^)(da|да)(\W|$)"))
                {
                    client.SetUserState(e.Message.User, UserState.Default);
                    client.SetUserState(e.Message.User, UserState.Default);
                    e.Message.Reply(SkidDA);
                    return;
                }

                if (Regex.IsMatch(msg, @"(\W|^)((тебя|тебе) нарисов(ать|ую)|нарисов(ать|ую) (тебя|тебе))(\W|$)"))
                {
                    client.SetUserState(e.Message.User, UserState.Default);
                    var photos = client.GetPhotosFromAlbum(214672056);
                    client.SendMessage(e.Message.User, "Нарисовать? Меня? Конечно. Вот мой реф:", photos.Take(1));
                    return;
                }

                if (Regex.IsMatch(msg, @"(\W|^)(рефы|рефки|персы|персонажи)(\W|$)"))
                {
                    client.SetUserState(e.Message.User, UserState.Default);
                    var photos = client.GetPhotosFromAlbum(214672056);
                    client.SendMessage(e.Message.User, "", photos);
                    return;
                }

                if (Regex.IsMatch(msg, @"(\W|^)(реф.?|перс|персонаж)(\W|$)"))
                {
                    client.SetUserState(e.Message.User, UserState.Default);
                    var photos = client.GetPhotosFromAlbum(214672056);
                    client.SendMessage(e.Message.User, "", photos.Take(1));
                    return;
                }

                if (Regex.IsMatch(msg, @"(\W|^)(с?пасиб(о|ки)?|благодар(ю|ствую))(\W|$)"))
                {
                    client.SetUserState(e.Message.User, UserState.Default);
                    var r = rnd.NextDouble();
                    if (r < 0.3)
                    {
                        e.Message.Reply("Пжалста :з");
                    }
                    else if (r < 0.6)
                    {
                        e.Message.Reply("Не за что");
                    }
                    else if (r < 0.9)
                    {
                        e.Message.Reply("Обращайся~");
                    }
                    else
                    {
                        e.Message.Reply("Не стоит благодарности ^-^");
                    }
                    return;
                }

                /*if (Regex.IsMatch(msg, @"(\W|^)(пидо?р|мразь|тварь)"))
                 * {
                 *  client.SetUserState(e.Message.User, UserState.Default);
                 *  e.Message.Reply("Сам такой :р");
                 *  return;
                 * }*/

                if (Regex.IsMatch(msg, @"(\W|^)правила?(\W|$)"))
                {
                    client.SetUserState(e.Message.User, UserState.Default);
                    var rules = client.GetRules();
                    if (string.IsNullOrWhiteSpace(rules))
                    {
                        e.Message.Reply("Не удалось получить правила группы");
                    }
                    else
                    {
                        e.Message.Reply(rules);
                    }

                    return;
                }

                /*if (Regex.IsMatch(msg, @"(\W|^)привет(\W|$)"))
                 * {
                 *  client.SetUserState(e.Message.User, UserState.Default);
                 *  e.Message.Reply("Ну здравствуй, здравствуй");
                 *  return;
                 * }*/

                if (e.Message.UserState == UserState.Hello)
                {
                    if (e.Message.User == SkidID)
                    {
                        e.Message.Reply("Ну дратуй, скидка хЪ Короч ВЫКЛ - выключить бота (для всех), ПОМОЩЬ - список команд");
                        client.SetUserState(e.Message.User, UserState.Default);
                        return;
                    }
                    e.Message.Reply("Здравствуйте. В данном сообществе на сообщения отвечает бот. Если не хотите получать сообщения от бота, напишите \"ВЫКЛ\". Чтобы получить список возможностей бота, напишите \"ПОМОЩЬ\"\nЕсли у вас есть предложения о том, какие функции необходимо добавить боту, пишите пожалуйста мне сюда - https://vk.com/id20108853");
                    client.SetUserState(e.Message.User, UserState.Default);
                }
                else if (e.Message.UserState == UserState.Default || e.Message.UserState == UserState.NotUnderstand)
                {
                    if (CustomAnswers.ContainsKey(msg) || CustomAnswers.ContainsKey(msg + '?') || CustomAnswers.ContainsKey(msg.Trim(new[] { ' ', '.', '?', '!' })))
                    {
                        var answers = CustomAnswers.ContainsKey(msg) ? CustomAnswers[msg] :
                                      (CustomAnswers.ContainsKey(msg + '?') ? CustomAnswers[msg + '?'] : CustomAnswers[msg.Trim(new[] { ' ', '.', '?', '!' })]);
                        var i = rnd.Next(answers.Count);
                        e.Message.Reply(answers[i]);
                    }
                    else
                    {
                        // поменять фразу, добавить "так же вы можете просто поболтать со мной"
                        if (e.Message.UserState != UserState.NotUnderstand)
                        {
                            e.Message.Reply("Хей, погодь!\n Смотри, список моих возможностей ты можешь узнать, написав ПОМОЩЬ.Если тебе от меня больше ничего не будет нужно, просто напиши ВЫКЛ и мы прекратим нашу \"увлекательную\" беседу.");
                            client.SetUserState(e.Message.User, UserState.NotUnderstand);
                        }
                        NotAnswered.Add(e.Message.Text);
                    }
                    //e.Message.Reply("Извините, я вас не поняль. Список возможностей бота вы можете узнать, написав ПОМОЩЬ. Если же вы не хотите получать ответы от бота, просто напишите ВЫКЛ");
                }
            }
        }
Example #2
0
 public void Reply(string text)
 {
     Client.SendMessage(User, text);
 }