Advertisement
Guest User

Untitled

a guest
Apr 8th, 2020
232
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 14.54 KB | None | 0 0
  1. using Newtonsoft.Json;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Net;
  7. using System.Net.Mail;
  8. using System.Text;
  9. using System.Threading;
  10. using System.Threading.Tasks;
  11.  
  12. namespace EuroMillionsAI
  13. {
  14.     class Smtp
  15.     {
  16.         public string Client { get; set; }
  17.         public string Email { get; set; }
  18.         public string Password { get; set; }
  19.     }
  20.  
  21.     class User
  22.     {
  23.         public string Name { get; set; }
  24.         public string Email { get; set; }
  25.     }
  26.  
  27.     class Draw
  28.     {
  29.         public DateTime Date { get; set; }
  30.         public string Numbers { get; set; }
  31.         public string Stars { get; set; }
  32.     }
  33.  
  34.     class DrawnsLists
  35.     {
  36.         public List<Draw> Drawns { get; set; }
  37.     }
  38.  
  39.     class DrawnsStats
  40.     {
  41.         public double Average { get; set; }
  42.         public double StandardDeviation { get; set; }
  43.         public double LowerBracket { get; set; }
  44.         public double UpperBracket { get; set; }
  45.     }
  46.  
  47.     class ImprovedDraw
  48.     {
  49.         public int[] Numbers { get; set; }
  50.         public int[] Stars { get; set; }
  51.     }
  52.  
  53.     static class Program
  54.     {
  55.         static void Main(string[] args)
  56.         {
  57.             DateTime scriptStartTime = DateTime.Now;
  58.  
  59.             int usersEmailedOK = 0;
  60.             int usersEmailedNOK = 0;
  61.  
  62.             LogExecution("############################################################");
  63.             LogExecution("Script started at " + scriptStartTime);
  64.  
  65.             Smtp smtpServer = GetSMTPConfig();
  66.             List<User> users = GetUsersFromJson();
  67.  
  68.             if (users.Count > 0)
  69.             {
  70.                 var drawnsJson = GetDrawnsFromJsonAPI();
  71.  
  72.                 if (drawnsJson != null)
  73.                 {
  74.                     DrawnsLists drawnsAll = JsonConvert.DeserializeObject<DrawnsLists>(drawnsJson);
  75.  
  76.                     List<Draw> drawnsNewRules = drawnsAll.Drawns.Where(x => x.Date >= new DateTime(2016, 9, 27, 0, 0, 0)).ToList();
  77.  
  78.                     List<int> drawnsNumbersSum = new List<int>();
  79.                     List<int> drawnsStarsSum = new List<int>();
  80.  
  81.                     int[] numbersCount = new int[50];
  82.                     int[] starsCount = new int[12];
  83.  
  84.                     foreach (var draw in drawnsNewRules)
  85.                     {
  86.                         List<int> drawNumbers = draw.Numbers.Split(' ').Select(int.Parse).ToList();
  87.                         foreach (var number in drawNumbers)
  88.                         {
  89.                             numbersCount[number - 1] += 1;
  90.                         }
  91.  
  92.                         drawnsNumbersSum.Add(drawNumbers.Sum());
  93.  
  94.                         List<int> drawStars = draw.Stars.Split(' ').Select(int.Parse).ToList();
  95.                         foreach (var star in drawStars)
  96.                         {
  97.                             starsCount[star - 1] += 1;
  98.                         }
  99.  
  100.                         drawnsStarsSum.Add(drawStars.Sum());
  101.                     }
  102.  
  103.                     double avgSumNumbers = drawnsNumbersSum.Average();
  104.                     double sdevSumNumbers = StandardDeviation(drawnsNumbersSum);
  105.  
  106.                     double avgSumStars = drawnsStarsSum.Average();
  107.                     double sdevSumStars = StandardDeviation(drawnsStarsSum);
  108.  
  109.                     DrawnsStats drawnsNumbersStats = new DrawnsStats()
  110.                     {
  111.                         Average = avgSumNumbers,
  112.                         StandardDeviation = sdevSumNumbers,
  113.                         LowerBracket = avgSumNumbers - sdevSumNumbers,
  114.                         UpperBracket = avgSumNumbers + sdevSumNumbers
  115.                     };
  116.  
  117.                     DrawnsStats drawnsStarsStats = new DrawnsStats()
  118.                     {
  119.                         Average = avgSumStars,
  120.                         StandardDeviation = sdevSumStars,
  121.                         LowerBracket = avgSumStars - sdevSumStars,
  122.                         UpperBracket = avgSumStars + sdevSumStars
  123.                     };
  124.  
  125.                     LogExecution(
  126.                         "Numbers stats: AVG = " + avgSumNumbers.ToString("N2") + "; " +
  127.                         "SDEV = " + sdevSumNumbers.ToString("N2") + "; " +
  128.                         "[" + drawnsNumbersStats.LowerBracket.ToString("N2") + ", " + drawnsNumbersStats.UpperBracket.ToString("N2") + "]");
  129.  
  130.                     LogExecution(
  131.                         "Stars stats: AVG = " + avgSumStars.ToString("N2") + "; " +
  132.                         "SDEV = " + sdevSumStars.ToString("N2") + "; " +
  133.                         "[" + drawnsStarsStats.LowerBracket.ToString("N2") + ", " + drawnsStarsStats.UpperBracket.ToString("N2") + "]");
  134.  
  135.                     foreach (var user in users)
  136.                     {
  137.                         DateTime userScriptStartTime = DateTime.Now;
  138.  
  139.                         LogExecution("User loop start");
  140.  
  141.                         List<ImprovedDraw> improvedDrawns = GetImprovedDrawns(5, drawnsNumbersStats, drawnsStarsStats);
  142.  
  143.                         string emailLuckyDraws = string.Empty;
  144.                         for (int i = 0; i < 5; i++)
  145.                         {
  146.                             string luckyDraw = string.Join(" ", improvedDrawns[i].Numbers) + "  *  " + string.Join(" ", improvedDrawns[i].Stars);
  147.  
  148.                             emailLuckyDraws += luckyDraw + "<br/>";
  149.  
  150.                             LogCombinations(luckyDraw);
  151.                         }
  152.  
  153.                         try
  154.                         {
  155.                             DateTime userScriptStopTime = DateTime.Now;
  156.                             TimeSpan execTime = userScriptStopTime - userScriptStartTime;
  157.  
  158.                             SendEmail(
  159.                                 smtpServer.Client,
  160.                                 smtpServer.Email,
  161.                                 smtpServer.Password,
  162.                                 user.Email,
  163.                                 "Euromillions improved combinations",
  164.                                 "Hey " + user.Name + "!<br/><br/>" +
  165.                                 "Your improved random combinations were generated in " + execTime.TotalSeconds.ToString("N2") + " seconds<br/><br/>" +
  166.                                 "Combinations:<br/>" + emailLuckyDraws + "<br/><br/>" +
  167.                                 "Good luck!"
  168.                             );
  169.  
  170.                             LogExecution("Email sent successfully");
  171.  
  172.                             usersEmailedOK++;
  173.                         }
  174.                         catch (Exception ex)
  175.                         {
  176.                             LogExecution("Error sending email");
  177.                             LogExecution("Email: " + user.Email);
  178.                             LogExecution("Error:");
  179.                             LogExecution(ex.ToString());
  180.  
  181.                             usersEmailedNOK++;
  182.                         }
  183.  
  184.                         LogExecution("User loop end");
  185.                     }
  186.                 }
  187.                 else
  188.                 {
  189.                     LogExecution("No data obtained from specified url");
  190.                 }
  191.             }
  192.             else
  193.             {
  194.                 LogExecution("Users list is empty");
  195.             }
  196.  
  197.             DateTime scriptStopTime = DateTime.Now;
  198.             TimeSpan scriptExecTime = scriptStopTime - scriptStartTime;
  199.             LogExecution("Script ended at " + scriptStopTime);
  200.             LogExecution("Total execution time: " + scriptExecTime.TotalSeconds.ToString("N2") + " seconds");
  201.  
  202.             List<User> admins = GetAdminsFromJson();
  203.             foreach (var admin in admins)
  204.             {
  205.                 SendEmail(
  206.                     smtpServer.Client,
  207.                     smtpServer.Email,
  208.                     smtpServer.Password,
  209.                     admin.Email,
  210.                     "Euromillions execution log",
  211.                     "Euromillions execution log" +
  212.                     "<br/><br/>" +
  213.                     "Script started at " + scriptStartTime + "<br/>" +
  214.                     "Ended at " + scriptStopTime + "<br/>" +
  215.                     "Total execution time: " + scriptExecTime + "<br/><br/>" +
  216.                     users.Count + " total users" + "<br/>" +
  217.                     usersEmailedOK + " users emailed successfully" + "<br/>" +
  218.                     usersEmailedNOK + " users not emailed" + "<br/><br/>" +
  219.                     "END"
  220.                 );
  221.             }
  222.         }
  223.  
  224.         private static Smtp GetSMTPConfig()
  225.         {
  226.             Smtp smtp = new Smtp();
  227.             using (StreamReader r = new StreamReader("smtp.json"))
  228.             {
  229.                 string smtpJson = r.ReadToEnd();
  230.                 smtp = JsonConvert.DeserializeObject<Smtp>(smtpJson);
  231.             }
  232.  
  233.             return smtp;
  234.         }
  235.  
  236.         private static List<User> GetAdminsFromJson()
  237.         {
  238.             List<User> admins = new List<User>();
  239.             using (StreamReader r = new StreamReader("admins.json"))
  240.             {
  241.                 string adminsJson = r.ReadToEnd();
  242.                 admins = JsonConvert.DeserializeObject<List<User>>(adminsJson);
  243.             }
  244.  
  245.             return admins;
  246.         }
  247.  
  248.         private static List<User> GetUsersFromJson()
  249.         {
  250.             List<User> subscribers = new List<User>();
  251.             using (StreamReader r = new StreamReader("subscribers.json"))
  252.             {
  253.                 string subscribersJson = r.ReadToEnd();
  254.                 subscribers = JsonConvert.DeserializeObject<List<User>>(subscribersJson);
  255.             }
  256.  
  257.             return subscribers;
  258.         }
  259.  
  260.         private static string GetDrawnsFromJsonAPI()
  261.         {
  262.             string urlAPI = @"https://nunofcguerreiro.com/api-euromillions-json?result=all";
  263.  
  264.             var json = string.Empty;
  265.  
  266.             using (WebClient wc = new WebClient())
  267.             {
  268.                 json = wc.DownloadString(urlAPI);
  269.             }
  270.  
  271.             return json;
  272.         }
  273.  
  274.         private static DrawnsStats CalculateDrawnsStats(List<Draw> drawnsList)
  275.         {
  276.             DrawnsStats drawnsStats = new DrawnsStats();
  277.  
  278.             return drawnsStats;
  279.         }
  280.  
  281.         private static int[] PopulateArrayConsecutively(int length)
  282.         {
  283.             int[] resArr = new int[length];
  284.             for (int i = 0; i < length; i++)
  285.             {
  286.                 resArr[i] = i + 1;
  287.             }
  288.  
  289.             return resArr;
  290.         }
  291.  
  292.         private static List<int> GetDrawnsSum(List<Draw> drawns)
  293.         {
  294.             List<int> drawnsSum = new List<int>();
  295.  
  296.             foreach (Draw draw in drawns)
  297.             {
  298.                 List<int> drawNumbers = draw.Numbers.Split(' ').Select(int.Parse).ToList();
  299.                 drawnsSum.Add(drawNumbers.Sum());
  300.             }
  301.  
  302.             return drawnsSum;
  303.         }
  304.  
  305.         private static double StandardDeviation(this IEnumerable<int> values)
  306.         {
  307.             double avg = values.Average();
  308.  
  309.             return Math.Sqrt(values.Average(v => Math.Pow(v - avg, 2)));
  310.         }
  311.  
  312.         private static int[] FisherYatesShuffle(int[] data)
  313.         {
  314.             int[] retVal = new int[data.Length];
  315.             int[] ind = new int[data.Length];
  316.             int index;
  317.             Random rand = new Random();
  318.  
  319.             for (int i = 0; i < data.Length; ++i)
  320.             {
  321.                 ind[i] = 0;
  322.             }
  323.  
  324.             for (int i = 0; i < data.Length; ++i)
  325.             {
  326.                 do
  327.                 {
  328.                     index = rand.Next(data.Length);
  329.                 } while (ind[index] != 0);
  330.  
  331.                 ind[index] = 1;
  332.                 retVal[i] = data[index];
  333.             }
  334.  
  335.             return retVal;
  336.         }
  337.  
  338.         private static int[] GetRandomNumbersSorted(int[] data, int numbers)
  339.         {
  340.             int[] retArr = FisherYatesShuffle(data).Take(numbers).OrderBy(x => x).ToArray();
  341.  
  342.             return retArr;
  343.         }
  344.  
  345.         private static int[] GetImprovedNumbers(int length, int numbers, double lowerBracket, double upperBracket)
  346.         {
  347.             int[] improvedNumbers = new int[numbers];
  348.  
  349.             while (true)
  350.             {
  351.                 improvedNumbers = GetRandomNumbersSorted(PopulateArrayConsecutively(length), numbers);
  352.                 if (improvedNumbers.Sum() >= lowerBracket && improvedNumbers.Sum() <= upperBracket)
  353.                 {
  354.                     break;
  355.                 }
  356.             }
  357.  
  358.             return improvedNumbers;
  359.         }
  360.  
  361.         private static List<ImprovedDraw> GetImprovedDrawns(int loops, DrawnsStats drawnsNumbersStats, DrawnsStats drawnsStarsStats)
  362.         {
  363.             List<ImprovedDraw> improvedDraws = new List<ImprovedDraw>();
  364.  
  365.             for (int i = 0; i < loops; i++)
  366.             {
  367.                 ImprovedDraw draw = new ImprovedDraw
  368.                 {
  369.                     Numbers = GetImprovedNumbers(50, 5, drawnsNumbersStats.LowerBracket, drawnsNumbersStats.UpperBracket),
  370.                     Stars = GetImprovedNumbers(12, 2, drawnsStarsStats.LowerBracket, drawnsStarsStats.UpperBracket)
  371.                 };
  372.  
  373.                 improvedDraws.Add(draw);
  374.  
  375.                 Thread.Sleep(100);
  376.             }
  377.  
  378.             return improvedDraws;
  379.         }
  380.  
  381.         private static void SendEmail(string smtpClient, string smtpEmailAddress, string smtpEmailPassword, string userAddress, string mailTitle, string mailText)
  382.         {
  383.             MailMessage mail = new MailMessage();
  384.             SmtpClient smtpServer = new SmtpClient(smtpClient);
  385.  
  386.             mail.From = new MailAddress(smtpEmailAddress);
  387.             mail.To.Add(userAddress);
  388.             mail.Subject = mailTitle + " " + DateTime.Now.ToString("dd/MM/yyyy");
  389.             mail.IsBodyHtml = true;
  390.             mail.Body = mailText;
  391.  
  392.             smtpServer.Port = 587;
  393.             smtpServer.Credentials = new System.Net.NetworkCredential(smtpEmailAddress, smtpEmailPassword);
  394.             smtpServer.EnableSsl = true;
  395.  
  396.             smtpServer.Send(mail);
  397.         }
  398.  
  399.         private static void LogExecution(string log)
  400.         {
  401.             File.AppendAllText("Log_" + DateTime.Now.ToString("yyyyMMdd") + ".txt", string.Format("{0}{1}", "[" + DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss") + "]" + " " + log, Environment.NewLine));
  402.         }
  403.  
  404.         private static void LogCombinations(string combinations)
  405.         {
  406.             File.AppendAllText("Combinations_" + DateTime.Now.ToString("yyyyMMdd") + ".txt", string.Format("{0}{1}", "[" + DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss") + "]" + " " + combinations, Environment.NewLine));
  407.         }
  408.     }
  409. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement