• VLMI - форум по обмену информацией. На форуме можете найти способы заработка, разнообразную информацию по интернет-безопасности, обмен знаниями, курсы/сливы.

    После регистрации будут доступны основные разделы.

    Контент форума создают пользователи, администрация за действия пользователей не несёт ответственности, отказ от ответственности. Так же перед использованием форума необходимо ознакомиться с правилами ресурса. Продолжая использовать ресурс вы соглашаетесь с правилами.
  • Подпишись на наш канал в Telegram для информации о актуальных зеркалах форума: https://t.me/vlmiclub

C# асинхронный загрузчик баз

athlete

Участник
Сообщения
5
Реакции
3
0 руб.
Код:
C#:
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

class Loader
{
    Regex regex = new Regex(@"(([\w_.-]+@[\w_.-]+)(?:[;:](.*))?)");

    /// <summary>
    /// Класс в который будет преобразовыватся наши базки для удобства
    /// </summary>
    public class Accaunt
    {
        public string Email, Password;
        public string Login => Email.Split('@').First();
        public string Domain => Email.Split('@').Last();
        public string DomainZone => string.Join(".", Email.Split('@').Last().Split('.').Skip(1));

        public string ToString(char spliter = ';') => $"{Email}{spliter}{Password}";
        public override string ToString() => $"{Email};{Password}";

    }

    /// <summary>
    /// Класс для хранения настроек сортировки
    /// </summary>
    public class SortParams
    {
        public enum ListType
        {
            BlackList, WhiteList
        }

        public SortParams()
        {
            DomainsWhiteList = new Dictionary<ListType, string[]>();
            DomainsWhiteList.Add(ListType.BlackList, null);
            DomainsWhiteList.Add(ListType.WhiteList, null);

        }

        //Минимальная и максимальная длина паролей
        public int MinPassLength = 0, MaxPassLength = 20;
     
        public Dictionary<ListType, string[]> DomainsWhiteList { get; protected set; }

        /// <summary>
        /// Добавление запрещенных доменов (для отсеивания)
        /// </summary>
        /// <param name="domains">Список доменов</param>
        public void BlackListAdd(string[] domains) => DomainsWhiteList[ListType.BlackList] = domains;
        /// <summary>
        /// Дабовление разрешенных доменов
        /// </summary>
        /// <param name="domains">Список доменов</param>
        public void WhiteListAdd(string[] domains) => DomainsWhiteList[ListType.WhiteList] = domains;

        //Проверка поролей на наличие спец имвалов
        public bool? PasswordSpecChars = null; //Null for any

    }

    /// <summary>
    /// Загрузчик. Возвращает отсортированную коллекцию типа Accaunt[]
    /// </summary>
    /// <param name="path">Путь к файлу</param>
    /// <param name="sortParams">Параметры сортировки (не обязательно)</param>
    /// <returns></returns>
    public Task<Accaunt[]> LoadBase(string path, SortParams sortParams  = null) => Task.Run(() =>
    {
        //Загружаем файл в память
        var tmp_file = File.ReadAllText(path);

        IEnumerable<Accaunt> accaunts;
        //Проходимсся по файлу регулярным выражением и преобразуем все найденные совпадения в экземпляры класса Accaunt
        accaunts = regex.Matches(tmp_file).Cast<Match>().Select(x => new Accaunt() { Email = x.Groups[2].Value, Password = x.Groups[3].Value.Trim() });
        //Проверяем на null параметры сортировки
        if (sortParams != null)
        {
            //Проверка пароля на соответствие заданной длине
            accaunts = accaunts.Where(
                a => a.Password.Length >= sortParams.MinPassLength &&
                a.Password.Length <= sortParams.MaxPassLength);
            //Проверка доменов по белому и черному списку
            accaunts = sortParams.DomainsWhiteList[SortParams.ListType.WhiteList] == null ? accaunts : accaunts.Where(x =>
                sortParams.DomainsWhiteList[SortParams.ListType.WhiteList].Contains(x.Domain));
            accaunts = sortParams.DomainsWhiteList[SortParams.ListType.BlackList] == null ? accaunts : accaunts.Where(x =>
                !sortParams.DomainsWhiteList[SortParams.ListType.BlackList].Contains(x.Domain));
            //Проверка налиция либо отсутствия в пароле спец симвала (если переменная проверка активна (не равна null))
            accaunts = sortParams.PasswordSpecChars == null
            ? accaunts : accaunts.Where(x => (sortParams.PasswordSpecChars ?? false) == Regex.IsMatch(x.Password, @"\W"));
        }
        return accaunts.ToArray();

    });
   
       
}


Автор: BeCoder
 
Сверху Снизу