ОБСУЖДЕНИЕ

C# Antipublic (AP) by Guron

7 ответов 7,1 тыс.
AI-выжимка обсуждения скоро

Краткие тезисы обсуждения со ссылками на ключевые ответы появятся здесь.

Автор темы
Доброго времени суток форумчане CodeBy.net. Сегодня мы напишем локальный антипаблик почт\url да чего угодно.
Работать мы будем с mysql добавлять\проверять есть ли почта в АП.
vXM65Ae.png


Для начала создадим в mysql базу и таблицы.
[MySQL] Antipublic byGuron CREATE DATABASE IF NOT EXISTS AntiMail DEFAULT CHARACTER SET - Pastebin.com (на пастебине ибо на форуме нельзя создать тему с таким кодом)
Дальше по коду все просто
Код:
using System;
using System.IO;
using System.Text;
using System.Windows.Forms;
using MySql.Data.MySqlClient; //библа для работы с mysql сервером

namespace AntiPublic
{
    internal class Program
    {
        private static string FNAME = string.Empty;

        [STAThread]
        private static void Main()
        {
            Console.Title = "AntiPublic (mp) byGuron";
            LoadBase(); //загрузка базы
            Sqlconn(); //функция проверки
        }

        private static void LoadBase()
        {
            var ofd = new OpenFileDialog {Filter = "All text|*.txt;*.csv;*.dic;*.log|All files|*.*" };

            if (ofd.ShowDialog() != DialogResult.OK) Environment.Exit(0); //если база не загружена пишем это и выходим с проги.
            FNAME = ofd.FileName;
        }

        private static void Sqlconn()
        {
            const string config = "server=localhost;user=root;password=123456;persistsecurityinfo=True;"; //данные для подключения к БД

            using (var con = new MySqlConnection(config))
            {
                con.Open(); // Открываем плдключение 1 раз

                var startDate = DateTime.Now;
                Console.WriteLine("Arbaiten...");

                using (var sw1 = new StreamWriter("Gur_ap_private.txt", true, Encoding.UTF8))
                using (var sw2 = new StreamWriter("Gur_ap_public.txt", true, Encoding.UTF8))
                using (var sw3 = new StreamWriter("Gur_ap_error.txt", true, Encoding.UTF8))
                //{
                    foreach (var str in File.ReadLines(FNAME)) //перечисляем строки
                    {
                        if (string.IsNullOrEmpty(str)) continue; //если стога пуста то проверяем следующую

                        var ch = str[0].ToString(); //це що бы разбивать бД на несколько таблиц. (потому как искать в 1 ляме проще чем в допустим 30лямах )
                        switch (ch)
                        {
                            case "1":
                            case "2":
                            case "3":
                            case "4":
                            case "5":
                            case "6":
                            case "7":
                            case "8":
                            case "9":
                            case "0":
                            case ".":
                            case "_":
                            case "-":
                                ch = "UnderDashDot09";
                                break;
                        }

                        var acc = str.Split(':', ';'); // оиделяем email от пароля
                        if (acc.Length != 2) // если это не email:pass то пшем в error
                        {
                            sw3.WriteLine(str);
                            continue;
                        }

                        var sql = $"INSERT INTO AntiMail.{ch} (mail, pass) VALUES ('{acc[0].ToLower()}', '{acc[1]}')"; //делаем запрос в БД
                        var comm = new MySqlCommand(sql, con);

                        try
                        {
                            comm.ExecuteNonQuery();
                            sw1.WriteLine(str);
                        }
                        catch (Exception e)
                        {
                            if (e.Message.Contains("Duplicate entry"))
                                sw2.WriteLine(str); //если строка присутствует то пишем в public
                            else
                                sw3.WriteLine(str); //иначе в private
                        }
                    }
                }

                Console.WriteLine(DateTime.Now - startDate);
                con.Close(); //по окончпании чека закрываем подключение
                Console.WriteLine("Готово!");
                Console.Read();
            }
        }
    }
}
Результат работы: 100к прочекало за 15сек.
gGMEhJh.png

Запускаем Start.bat ибо устанавливаем свой denver, xampp)
 
госоподи, пойди убейся об стену с таким кодом, пожалуйста
 
госоподи, пойди убейся об стену с таким кодом, пожалуйста
Бро,вот ты и опять в статусе,не жести пожалуйста.
Объясни человеку что не так с кодом.
А то после такой критики,лукаса страшно ставить новорегу))
 
Последнее редактирование:
  • Нравится
Реакции: centr
1
Бро,вот ты и опять в статусе,не жести пожалуйста.
Объясни человеку что не так с кодом.
А то после такой критики,лукаса страшно ставить новорегу))
Я напишу развёрнутый ответ, чуть позже
 
Бро,вот ты и опять в статусе,не жести пожалуйста.
Объясни человеку что не так с кодом.
А то после такой критики,лукаса страшно ставить новорегу))
Проблема в том, что некоторые начинающие кодеры быстро перепрыгивают с "Hello World!" на средние проекты. Крайне не рекомендую так делать, ибо до баз данных, в шарпе необходимо практиковаться с более простыми задачами, чтобы написать качественный код.
 
mrOkey
Я напишу развёрнутый ответ, чуть позже

Где ответ?
 
mrOkey
Я напишу развёрнутый ответ, чуть позже

Где ответ?
уфф, ну ок. Бесплатное ревью, раз уж пообещал, и то тоько из-за @Vertigo .

Честно сказать тут даже ревьюить нечего.
Начнём с бд.
1) Разбивать базу на 26 таблиц, из-за аргумента - так быстрее - бред.
- Это нарушение нормальной формы.
- Это идиотизм так как скорость поиска завист от плана запроса и инедексов. Данные в бд хранятся не как в файле. Советую погуглить этот момент, особенно обратить внимание на страници и на то как хранятся индексы.
- Но даже если оставить как есть, хотя не один здравомыслящий человек так не делает, то нет защиты от дублирования записей в разных таблицах. В конетексте одной - да есть. Но что если я добавлю запись Х в таблицу а,b,c и d. Это бред.

Код
мне очень сложно писать это без мата.
- автор не вкурсе за ООП и не умеет в него. Совсем.
- автор использует ооп язык для скриптовой задачи.
- автор не понимает что такое программирование.
Теперь подробнее:

Во-первых, весёлый оффтопик:
Код:
 Console.Title = "AntiPublic (mp) byGuron";
Пихать авторство везде где только можно, тем более в такой говнокод - заранее портить себе репутацию в комьюнити.

теперь более серьёзные вещи.
Код:
private static string FNAME = string.Empty;
- не соблюдён С# конвеншен по наименованию. Приватные поля именнуюся через венскую нотацию. Или просто с мальнкой буквы в стиле lowerCamelCase
- переменная инвалид - у неё ампутирована первая часть. Автор букв пожалел на неё.
- из наименовании переменной не ясна её семантика. Зачем она тут. Что это за наименование файла. Какого файла. Зачем он тут?

Код:
private static void Main()
        {
            Console.Title = "AntiPublic (mp) byGuron";
            LoadBase(); //загрузка базы
            Sqlconn(); //функция проверки
        }
Какого чёрта метод Main вдруг стал приватным? Автор явно не понимает зачем это сделал. Какой смысл **** в этом? (Вопрос риторический, так как смысл делать приватным метод Main 0, zero, нуль )

Код:
 LoadBase(); //загрузка базы
И название метода, и комментарий - говорят как бы о загрузки бд. Думаете там загружается база данных? А вот *** там открывается диалоговое окно чтоб юзер мог файл загрузить. Диалоговое окно **** в консольном приложении! Это говорит как минимум о том что автор не умеет из аругментов путь читать.

Код:
Sqlconn(); //функция проверки
Какого чёрта функция проверки называется Sqlconn. Причём опять же, автор неимеет не малейшего понятия как должны выглядеть наименования. Автор называет методы как ему душа велит, а не в зависимости от того что они делают.

Код:
        private static void LoadBase()
        {
            var ofd = new OpenFileDialog {Filter = "All text|*.txt;*.csv;*.dic;*.log|All files|*.*" };

            if (ofd.ShowDialog() != DialogResult.OK) Environment.Exit(0); //если база не загружена пишем это и выходим с проги.
            FNAME = ofd.FileName;
        }
что нужно знать об этом методе? Автор дал возможность грузить любой файл в программу. Зачем? Потому что автор не имеет ни мальейшего понятия, что он делает.
Код:
//если база не загружена пишем это и выходим с проги.
В данной строке не выводится сообщение о том что база не загружена. Выводится стандартное сообщение о выходе.
ofd - автору опять жалко букв. Почему?
условие в одну строку? строк видать тоже жалко.
И наконец мы узнаём что оказывается в, FNAME записывается наименование входящего файла.
- почему бы переменной не дать подходящее название?
- почему бы методу просто не вернуть наименование входящего файла?
- зачем этот сайд эффект?
- ещё очень много вопросов, которые я не задам, потому что мне теперь тоже становится жалко символов.
Ответ один - автор не имеет ни мальейшего понятия, о том, что он делает.

Код:
private static void Sqlconn()
        {
            const string config = "server=localhost;user=root;password=123456;persistsecurityinfo=True;"; //данные для подключения к БД
Что мы понимаем на этой строке?
- автор не знает термина connection string.
- автор запрещает менять бд без перекомпиляции исходников
- автор хранит пароли в открытом виде в коде
всё выше сказанное говорит о том, что автор не имеет ни мальейшего понятия, о том, что он делает.

обратите внимание на эту конструкцию:
Код:
var ch = str[0].ToString(); //це що бы разбивать бД на несколько таблиц. (потому как искать в 1 ляме проще чем в допустим 30лямах )
                        switch (ch)
                        {
                            case "1":
                            case "2":
                            case "3":
                            case "4":
                            case "5":
                            case "6":
                            case "7":
                            case "8":
                            case "9":
                            case "0":
                            case ".":
                            case "_":
                            case "-":
                                ch = "UnderDashDot09";
                                break;
                        }
она не имеет никакого смысла вообщ
это просто присвоение переменной ch строки UnderDashDot09.
прилюбом этом кейсе у сh одно и тоже значение. И да вся это херь заменяется 2 строками кода.


Код:
 var acc = str.Split(':', ';');
у оператора сплит нет перегрузки для двух чар аргументов к слову. String.Split Method (System)

Код:
var sql = $"INSERT INTO AntiMail.{ch} (mail, pass) VALUES ('{acc[0].ToLower()}', '{acc[1]}')"; //делаем запрос в БД
                        var comm = new MySqlCommand(sql, con);

                        try
                        {
                            comm.ExecuteNonQuery();
                            sw1.WriteLine(str);
                        }
                        catch (Exception e)
                        {
                            if (e.Message.Contains("Duplicate entry"))
                                sw2.WriteLine(str); //если строка присутствует то пишем в public
                            else
                                sw3.WriteLine(str); //иначе в private
                        }
я не знаю что такое чекер АП, но вот что делает код
берёт строку из файла
смотрит пара ли это login:pass (login;pass)
добавляет в бд
Если случился эксепшен дубликат найден! Любой эксепешен который содержит в себе дубликат!

Короче, я устал писать. Автор сделал извращённую команду uniq с 26ую таблицами и полным говнокодом.
Я щас разобрал только то, что явно броасается в галза, так как мне жалко *** символов для этого говнотопика.
 
Последнее редактирование:
  • Нравится
Реакции: CHEATER, pp11, Сергей Попов и ещё 1 человек
4
Бесплатное ревью
Спасибо за критику.
-Профиль ТС - фейк.
зачем было тут регаться с подобным ником еще и авой вобще не понимаюи, разве, что кинуть кого-то
код был выложен на другом борде и сюда скинут явно , что бы как вы выразились подпортить мою репутацию.
-Я никогда не говорил, что я кодер и двигаться в данном направлении дальше не собираюсь. (мне это не интересно)
-Выложил код почему? потому, что люди хотят себе антипаблики почт, дорок, url и прочей чепухни, так вот теперь будет с чего начать их штамповать для себя.

Спасибо за внимание.