Создать проверку нахождения переменной в списке.

Nikolai132132

Client
Регистрация
23.10.2017
Сообщения
134
Благодарностей
2
Баллы
18
Всем привет! Столкнулся со следующей проблемой: я спамлю в ЛС на довольно большом сайте. В начале проекта подгружается рандомный аккаунт, который спамит. В списке, привязанном к txt файлу находятся постоянно обновляемые юзеры (раз в минут 10 список удаляется и в него закидываются новые, "актуальные" юзеры). Каждый раз, как проект отошлет письмо (с момента взятия юзера до окончания проекта - примерно 20-25 сек), он добавляет юзера в "Базу для сравнения", чтобы потом, сравнивая с этой базой, можно было понять, отсылал ли я ему уже или нет. В PM это выглядит так:
44154

Если кол-во юзеров меньше 17, то я беру случайного и смотрю, есть ли совпадения переменной с логином юзера в "Базе для сравнения". Если есть, то удаляем его и берем нового, если нет, то отсылаем ему сообщение. Код в кубике "Проверяем, есть ли он в базе":

// берем из переменной текст, который надо искать
var textContains = project.Variables["SMS"].Value;
// получаем список, в котором будем искать
var sourceList = project.Lists["БАЗА ДЛЯ СРАВНЕНИЯ"];
// ищем в каждой строчке в списке
lock(SyncObjects.ListSyncer)
{
for(int i=0; i < sourceList.Count; i++)
{
// читаем строку из списка
var str = sourceList;
// проверяем содержание текста в строке, если есть совпадение возвращаем "yes"
if (str.Contains(textContains))
{

return "yes";
}
}
}
// если ничего не нашли возвращаем "no"
return "no";


НО: в такой системе есть ПРОБЛЕМА: когда я ставлю 3-4 потока, то у меня в "Базе для сравнения" образуются одинаковые логины (по 2-3 штуки иногда подряд), что означает что одному и тому же юзеру разные аккаунты шлют письмо, что мне очень не надо. Нужно, чтобы я слал только по одному письму каждому человеку. Я не могу понять почему это происходит, но, возможно, это из-за того, что иногда txt файл не успевает обновиться и поток не успевает увидеть юзера в "Базе для сравнения", хотя предыдущий поток уже отправил сообщение этому человеку.

Подскажите, кто знает, как можно усовершенствовать мою систему, или, я предполагаю, что есть намного легче и эффективнее способ отсылать сообщения, не повторяясь.
 

ebrwebrw

Client
Регистрация
20.08.2018
Сообщения
221
Благодарностей
164
Баллы
43
1."Список берем случайного юзера" тут берем строку сразу с удалением, а то я как понял ты удаляешь только как проверишь юзера на нахождение в базе

2. Юзер заносится в базу только спустя 20-25 секунд после проверки? Если да - заноси в базу перед действием


C#:
// берем из переменной текст, который надо искать
var textContains = project.Variables["SMS"].Value;
// получаем список, в котором будем искать
var sourceList = project.Lists["БАЗА ДЛЯ СРАВНЕНИЯ"];
// ищем в каждой строчке в списке
lock(SyncObjects.ListSyncer)
{
// проверяем содержание текста в строке, если есть совпадение возвращаем "yes"
    for(int i=0; i < sourceList.Count; i++)
    {
    var str = sourceList[i];
        //if (str.ToLower() == textContains.ToLower()) если нужно точное сравнение не зависимо от регистра,  переменные переводятся в нижний регистр
        if (str == textContains)//регистрозависимое, ббб и бБб уже разные слова
        {
        throw new Exception("Юзер уже содержится в списке");
        }
    }
//юзер не содержится в списке, добавляем
sourceList.Add(textContains);
}
Если нашел совпадение - выйдет по пунктирной
Если не нашел совпадение - добавит переменную в список и пойдёт дальше


C#:
 PS в след раз код вставляй в теги  а то [i] форум сжирает
 
Последнее редактирование:
  • Спасибо
Реакции: Astraport

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)