Browse Source

Добавил таймер обращающийся к API каждые 4 минуты #EBT-10

GandonKur 4 years ago
parent
commit
7074da25de

+ 1 - 1
EthermineBotTelegram/App.config

@@ -9,7 +9,7 @@
     </startup>
     <appSettings>
         <add key="poolApiUrl" value="https://api.ethermine.org" />
-        <add key="dbIp" value="192.168.2.2" />
+        <add key="dbIp" value="192.168.1.119" />
     </appSettings>
     <entityFramework>
         <providers>

+ 15 - 0
EthermineBotTelegram/DataUpdater.cs

@@ -0,0 +1,15 @@
+using System;
+using Quartz;
+using System.Threading.Tasks;
+
+namespace EthermineBotTelegram
+{
+    public class DataUpdater : IJob
+    {
+        public async Task Execute(IJobExecutionContext context)
+        {
+            await Console.Out.WriteLineAsync("Updating data! Current time: " + DateTime.Now.ToString("f"));
+            await Program.UpdateData();
+        }
+    }
+}

+ 12 - 7
EthermineBotTelegram/EFDatabase.cs

@@ -31,31 +31,36 @@ namespace EFDatabase
 
     public class miners
     {
-        [Key]
+        [Key, Column(Order = 0)]
         [DatabaseGenerated(DatabaseGeneratedOption.None)]
         public string wallet { get; set; }
+        [Key, Column(Order = 1)]
+        [DatabaseGenerated(DatabaseGeneratedOption.None)]
         public long time { get; set; }
         public long reported_hashrate { get; set; }
-        public long current_hashrate { get; set; }
+        public double current_hashrate { get; set; }
         public int valid_shares { get; set; }
         public int stale_shares { get; set; }
-        public int incorrect_shares { get; set; }
+        public int invalid_shares { get; set; }
         public int workers { get; set; }
         public long unpaid { get; set; }
     }
 
     public class workers
     {
-        [Key]
-        [DatabaseGenerated(DatabaseGeneratedOption.None)]
+        
         public string wallet { get; set; }
+        [Key, Column(Order = 0)]
+        [DatabaseGenerated(DatabaseGeneratedOption.None)]
         public long time { get; set; }
+        [Key, Column(Order = 1)]
+        [DatabaseGenerated(DatabaseGeneratedOption.None)]
         public string worker { get; set; }
         public long reported_hashrate { get; set; }
-        public long current_hashrate { get; set; }
+        public double current_hashrate { get; set; }
         public int valid_shares { get; set; }
         public int stale_shares { get; set; }
-        public int incorrect_shares { get; set; }
+        public int invalid_shares { get; set; }
         public long worker_unpaid { get; set; }
     }
 }

+ 40 - 4
EthermineBotTelegram/EthermineBotTelegram.csproj

@@ -62,6 +62,26 @@
       <HintPath>..\packages\K4os.Hash.xxHash.1.0.6\lib\net46\K4os.Hash.xxHash.dll</HintPath>
       <Private>True</Private>
     </Reference>
+    <Reference Include="Microsoft.Extensions.Configuration.Abstractions, Version=2.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60">
+      <HintPath>..\packages\Microsoft.Extensions.Configuration.Abstractions.2.1.1\lib\netstandard2.0\Microsoft.Extensions.Configuration.Abstractions.dll</HintPath>
+      <Private>True</Private>
+    </Reference>
+    <Reference Include="Microsoft.Extensions.DependencyInjection.Abstractions, Version=2.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60">
+      <HintPath>..\packages\Microsoft.Extensions.DependencyInjection.Abstractions.2.1.1\lib\netstandard2.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll</HintPath>
+      <Private>True</Private>
+    </Reference>
+    <Reference Include="Microsoft.Extensions.Logging.Abstractions, Version=2.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60">
+      <HintPath>..\packages\Microsoft.Extensions.Logging.Abstractions.2.1.1\lib\netstandard2.0\Microsoft.Extensions.Logging.Abstractions.dll</HintPath>
+      <Private>True</Private>
+    </Reference>
+    <Reference Include="Microsoft.Extensions.Options, Version=2.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60">
+      <HintPath>..\packages\Microsoft.Extensions.Options.2.1.1\lib\netstandard2.0\Microsoft.Extensions.Options.dll</HintPath>
+      <Private>True</Private>
+    </Reference>
+    <Reference Include="Microsoft.Extensions.Primitives, Version=2.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60">
+      <HintPath>..\packages\Microsoft.Extensions.Primitives.2.1.1\lib\netstandard2.0\Microsoft.Extensions.Primitives.dll</HintPath>
+      <Private>True</Private>
+    </Reference>
     <Reference Include="mscorlib" />
     <Reference Include="MySql.Data, Version=8.0.24.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d">
       <HintPath>..\packages\MySql.Data.8.0.24\lib\net452\MySql.Data.dll</HintPath>
@@ -75,6 +95,14 @@
       <HintPath>..\packages\Newtonsoft.Json.11.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
       <Private>True</Private>
     </Reference>
+    <Reference Include="Quartz, Version=3.3.2.0, Culture=neutral, PublicKeyToken=f6b8c98a402cc8a4">
+      <HintPath>..\packages\Quartz.3.3.2\lib\net472\Quartz.dll</HintPath>
+      <Private>True</Private>
+    </Reference>
+    <Reference Include="Quartz.Extensions.DependencyInjection, Version=3.3.2.0, Culture=neutral, PublicKeyToken=f6b8c98a402cc8a4">
+      <HintPath>..\packages\Quartz.Extensions.DependencyInjection.3.3.2\lib\netstandard2.0\Quartz.Extensions.DependencyInjection.dll</HintPath>
+      <Private>True</Private>
+    </Reference>
     <Reference Include="System" />
     <Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51">
       <HintPath>..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll</HintPath>
@@ -85,20 +113,25 @@
     <Reference Include="System.Configuration" />
     <Reference Include="System.Configuration.Install" />
     <Reference Include="System.Core" />
+    <Reference Include="System.Diagnostics.DiagnosticSource, Version=4.0.5.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51">
+      <HintPath>..\packages\System.Diagnostics.DiagnosticSource.4.7.1\lib\net46\System.Diagnostics.DiagnosticSource.dll</HintPath>
+      <Private>True</Private>
+    </Reference>
     <Reference Include="System.Management" />
     <Reference Include="System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51">
-      <HintPath>..\packages\System.Memory.4.5.3\lib\netstandard2.0\System.Memory.dll</HintPath>
+      <HintPath>..\packages\System.Memory.4.5.4\lib\net461\System.Memory.dll</HintPath>
       <Private>True</Private>
     </Reference>
     <Reference Include="System.Numerics" />
-    <Reference Include="System.Numerics.Vectors, Version=4.1.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-      <HintPath>..\packages\System.Numerics.Vectors.4.4.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
+    <Reference Include="System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+      <HintPath>..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
       <Private>True</Private>
     </Reference>
     <Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-      <HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.4.5.2\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
+      <HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.4.5.3\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
       <Private>True</Private>
     </Reference>
+    <Reference Include="System.Runtime.Remoting" />
     <Reference Include="System.Security" />
     <Reference Include="System.Transactions" />
     <Reference Include="System.Xml.Linq" />
@@ -122,8 +155,11 @@
   </ItemGroup>
   <ItemGroup>
     <Compile Include="AppSettings.cs" />
+    <Compile Include="DataUpdater.cs" />
     <Compile Include="EFDatabase.cs" />
     <Compile Include="JsonCurrentStats.cs" />
+    <Compile Include="JsonDownloader.cs" />
+    <Compile Include="JsonWorker.cs" />
     <Compile Include="Program.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
   </ItemGroup>

+ 3 - 3
EthermineBotTelegram/JsonCurrentStats.cs

@@ -1,6 +1,6 @@
 namespace EthermineBotTelegram
 {
-    public class Root
+    public class Data
     {
         public int time { get; set; }
         public int lastSeen { get; set; }
@@ -18,9 +18,9 @@
         public double btcPerMin { get; set; }
     }
 
-    public class JsonCurrnentStats
+    public class JsonCurrentStats
     {
         public string status { get; set; }
-        public Root data { get; set; }
+        public Data data { get; set; }
     }
 }

+ 26 - 0
EthermineBotTelegram/JsonDownloader.cs

@@ -0,0 +1,26 @@
+using System;
+using System.Collections.Generic;
+using System.Net;
+using Newtonsoft.Json;
+
+namespace EthermineBotTelegram
+{
+     public class JsonDownloader
+    {
+        public static T _download_serialized_json_data<T>(string url) where T : new() {
+            using (var w = new WebClient()) {
+                var jsonData = string.Empty;
+                // attempt to download JSON data as a string
+                try
+                {
+                    jsonData = w.DownloadString(url);
+                    jsonData = jsonData.Replace("null", "0");
+
+                }
+                catch (Exception) { }
+                // if string with JSON data is not empty, deserialize it to class and return its instance 
+                return !string.IsNullOrEmpty(jsonData) ? JsonConvert.DeserializeObject<T>(jsonData) : new T();
+            }
+        }
+    }
+}

+ 27 - 0
EthermineBotTelegram/JsonWorker.cs

@@ -0,0 +1,27 @@
+using System.Collections.Generic;
+
+namespace JsonWorkerData
+{
+    public class Data
+    {
+        public string worker { get; set; }
+        public long time { get; set; }
+        public long lastSeen { get; set; }
+        public long reportedHashrate { get; set; }
+        public double currentHashrate { get; set; }
+        public int validShares { get; set; }
+        public int invalidShares { get; set; }
+        public int staleShares { get; set; }
+        public double averageHashrate { get; set; }
+    }
+}
+
+namespace  EthermineBotTelegram
+{
+    public class JsonWorker
+    {
+        public string status { get; set; }
+        public List<JsonWorkerData.Data> data { get; set; }
+    }
+ 
+}

+ 128 - 22
EthermineBotTelegram/Program.cs

@@ -13,6 +13,8 @@ using Newtonsoft.Json;
 using System.Net;
 using EFDatabase;
 using MySql.Data.MySqlClient;
+using Quartz;
+using Quartz.Impl;
 
 namespace EthermineBotTelegram
 {
@@ -20,10 +22,14 @@ namespace EthermineBotTelegram
     {
         static ITelegramBotClient botClient;
         static EFDatabase.botdb Botdb;
-        static void Main(string[] args)
+        
+        static async Task Main(string[] args)
         {
             botClient = new TelegramBotClient("1785154817:AAGhXD9yQVn9HPdWTcmGJUBeZ8nA50SzHbY");
             var me = botClient.GetMeAsync().Result;
+            
+            
+            
             Console.WriteLine(
                 $"Hello, World! I am user {me.Id} and my name is {me.FirstName}."
             );
@@ -39,23 +45,52 @@ namespace EthermineBotTelegram
             {
                 Botdb.Database.Connection.Open();
                 Botdb.Database.Connection.Close();
+                
+                
+                //InitUpdater("server=" + AppSettings.dbIp +  ";port=3306;database=botdb;uid=" + user + "; pwd=" + pass);
+            
+                // Grab the Scheduler instance from the Factory
+                StdSchedulerFactory factory = new StdSchedulerFactory();
+                IScheduler scheduler = await factory.GetScheduler();
+
+                // and start it off
+                await scheduler.Start();
+
+                // define the job and tie it to our HelloJob class
+                IJobDetail job = JobBuilder.Create<DataUpdater>()
+                    .WithIdentity("job1", "group1")
+                    .UsingJobData("connectionString", "server=" + AppSettings.dbIp +  ";port=3306;database=botdb;uid=" + user + "; pwd=" + pass)
+                    .Build();
+                // Trigger the job to run now, and then repeat every 10 seconds
+                ITrigger trigger = TriggerBuilder.Create()
+                    .WithIdentity("trigger1", "group1")
+                    .StartNow()
+                    .WithSimpleSchedule(x => x
+                        .WithIntervalInSeconds(240)
+                        .RepeatForever())
+                    .Build();
+                // Tell quartz to schedule the job using our trigger
+                await scheduler.ScheduleJob(job, trigger);
+                
+                
+                Console.WriteLine(("Scheduler started!"));
+                
+                botClient.OnMessage += BotOnMessage;
+                botClient.StartReceiving();
+
+                Console.WriteLine("Press any key to exit");
+                Console.ReadKey();
+
+                await scheduler.Shutdown();
+                botClient.StopReceiving();
             }
-            catch(MySqlException)
+            catch (MySqlException)
             {
                 Console.WriteLine("Don't connected! Check auth data and restart!");
             }
-            
-            //ask for username and password for db
-
-            botClient.OnMessage += BotOnMessage;
-            botClient.StartReceiving();
-
-            Console.WriteLine("Press any key to exit");
-            Console.ReadKey();
 
-            botClient.StopReceiving();
         }
-        
+
         static async void BotOnMessage(object sender, MessageEventArgs e) {
             if (e.Message.Text != null)
             {
@@ -109,7 +144,7 @@ namespace EthermineBotTelegram
             try
             {
                 var url = AppSettings.poolApiUrl + "/miner/" + e.Message.Text.Split(' ')[1] + "/currentStats";
-                var currnentStats = _download_serialized_json_data<JsonCurrnentStats>(url);
+                var currnentStats = JsonDownloader._download_serialized_json_data<JsonCurrentStats>(url);
                 await botClient.SendTextMessageAsync(
                     chatId: e.Message.Chat,
                     text: "Updated: " + DateTimeOffset.FromUnixTimeSeconds(currnentStats.data.time).LocalDateTime.ToString("f") + "\n"
@@ -189,17 +224,88 @@ namespace EthermineBotTelegram
                     text:   "Already deleted");
             }
         }
-        private static T _download_serialized_json_data<T>(string url) where T : new() {
-            using (var w = new WebClient()) {
-                var jsonData = string.Empty;
-                // attempt to download JSON data as a string
-                try
+
+        public async static Task UpdateData()
+        {
+            var usersList = Botdb.users.Where(u=>u.wallet != null).ToList();
+            foreach (users u in usersList)
+            {
+                var url = AppSettings.poolApiUrl + "/miner/" + u.wallet + "/currentStats";
+                var currnentStats = JsonDownloader._download_serialized_json_data<JsonCurrentStats>(url);
+                
+                if (currnentStats.status == "OK")
+                {
+                    await Console.Out.WriteLineAsync($"Create new record for {u.wallet}");
+                    miners newMinerRecord = new miners();
+                    newMinerRecord.wallet = u.wallet;
+                    newMinerRecord.time = currnentStats.data.time;
+                    newMinerRecord.reported_hashrate = currnentStats.data.reportedHashrate;
+                    newMinerRecord.current_hashrate = currnentStats.data.currentHashrate;
+                    newMinerRecord.valid_shares = currnentStats.data.validShares;
+                    newMinerRecord.stale_shares = currnentStats.data.staleShares;
+                    newMinerRecord.invalid_shares = currnentStats.data.invalidShares;
+                    newMinerRecord.workers = currnentStats.data.activeWorkers;
+                    newMinerRecord.unpaid = currnentStats.data.unpaid;
+                    await Console.Out.WriteLineAsync($"New record creating complete {newMinerRecord.wallet}");
+                    long lastTime = 0;
+                    if (Botdb.miners.Where(m => m.wallet == newMinerRecord.wallet).FirstOrDefault() != null) 
+                        lastTime = Botdb.miners.Where(m => m.wallet == newMinerRecord.wallet).Max(m => m.time);
+                    var lastMinerRecord = Botdb.miners.Where(m => m.wallet == newMinerRecord.wallet && m.time == lastTime).FirstOrDefault();
+                    if (lastMinerRecord == null || lastMinerRecord.time !=
+                        newMinerRecord.time)
+                    {
+                        Botdb.miners.Add(newMinerRecord);
+                        await Botdb.SaveChangesAsync();
+                        await Console.Out.WriteLineAsync($"Added new row for {newMinerRecord.wallet}");
+                        url = AppSettings.poolApiUrl + "/miner/" + u.wallet + "/workers";
+                        var currentWorker = JsonDownloader._download_serialized_json_data<JsonWorker>(url);
+                        
+                        if (currentWorker.status == "OK")
+                        {
+                            for (int i = 0; i < currentWorker.data.Count(); i++)
+                            {
+                                await Console.Out.WriteLineAsync($"Create new record for {currentWorker.data[i].worker}");
+                                workers newWorkerRecord = new workers();
+                                newWorkerRecord.wallet = newMinerRecord.wallet;
+                                newWorkerRecord.time = currentWorker.data[i].time;
+                                newWorkerRecord.worker = currentWorker.data[i].worker;
+                                newWorkerRecord.reported_hashrate = currentWorker.data[i].reportedHashrate;
+                                newWorkerRecord.current_hashrate = currentWorker.data[i].currentHashrate;
+                                newWorkerRecord.valid_shares = currentWorker.data[i].validShares;
+                                newWorkerRecord.stale_shares = currentWorker.data[i].staleShares;
+                                newWorkerRecord.invalid_shares = currentWorker.data[i].invalidShares;
+                                //add func to calc worker_unpaid here
+                                newWorkerRecord.worker_unpaid = 0;
+                                
+                                lastTime = 0;
+                                if (Botdb.workers.Where(m => m.wallet == newMinerRecord.wallet).FirstOrDefault() != null) 
+                                    lastTime = Botdb.workers.Where(m => m.wallet == newMinerRecord.wallet).Max(m => m.time);
+                                var lastWokerRecord = Botdb.workers.Where(m => m.wallet == newWorkerRecord.worker && m.time == lastTime).FirstOrDefault();
+                                if (lastWokerRecord == null || lastWokerRecord.time !=
+                                    newMinerRecord.time)
+                                {
+                                    await Console.Out.WriteLineAsync(
+                                        $"Create new record for {currentWorker.data[i].worker} finished");
+                                    Botdb.workers.Add(newWorkerRecord);
+                                    await Botdb.SaveChangesAsync();
+                                    await Console.Out.WriteLineAsync($"Added new row for {currentWorker.data[i].worker}");
+                                }
+                                else
+                                {
+                                    await Console.Out.WriteLineAsync($"Row with miner: {newWorkerRecord.worker} and time: {newWorkerRecord.time} already exists!");
+                                }
+                            }
+                        }
+                    }
+                    else
+                    {
+                        await Console.Out.WriteLineAsync($"Row with wallet: {newMinerRecord.wallet} and time: {newMinerRecord.time} already exists!");
+                    }
+                }
+                else
                 {
-                    jsonData = w.DownloadString(url);
+                    await Console.Out.WriteLineAsync($"Error response from pool for {u.wallet}!");
                 }
-                catch (Exception) { }
-                // if string with JSON data is not empty, deserialize it to class and return its instance 
-                return !string.IsNullOrEmpty(jsonData) ? JsonConvert.DeserializeObject<T>(jsonData) : new T();
             }
         }
     }

+ 11 - 3
EthermineBotTelegram/packages.config

@@ -6,13 +6,21 @@
   <package id="K4os.Compression.LZ4" version="1.1.11" targetFramework="net472" />
   <package id="K4os.Compression.LZ4.Streams" version="1.1.11" targetFramework="net472" />
   <package id="K4os.Hash.xxHash" version="1.0.6" targetFramework="net472" />
+  <package id="Microsoft.Extensions.Configuration.Abstractions" version="2.1.1" targetFramework="net472" />
+  <package id="Microsoft.Extensions.DependencyInjection.Abstractions" version="2.1.1" targetFramework="net472" />
+  <package id="Microsoft.Extensions.Options" version="2.1.1" targetFramework="net472" />
+  <package id="Microsoft.Extensions.Primitives" version="2.1.1" targetFramework="net472" />
+  <package id="Quartz" version="3.3.2" targetFramework="net472" />
+  <package id="Quartz.Extensions.DependencyInjection" version="3.3.2" targetFramework="net472" />
+  <package id="System.Diagnostics.DiagnosticSource" version="4.7.1" targetFramework="net472" />
+  <package id="System.Memory" version="4.5.4" targetFramework="net472" />
+  <package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net472" />
+  <package id="System.Runtime.CompilerServices.Unsafe" version="4.5.3" targetFramework="net472" />
+  <package id="Microsoft.Extensions.Logging.Abstractions" version="2.1.1" targetFramework="net472" />
   <package id="MySql.Data" version="8.0.24" targetFramework="net472" />
   <package id="MySql.Data.EntityFramework" version="8.0.24" targetFramework="net472" />
   <package id="Newtonsoft.Json" version="11.0.2" targetFramework="net472" />
   <package id="System.Buffers" version="4.5.1" targetFramework="net472" />
-  <package id="System.Memory" version="4.5.3" targetFramework="net472" />
   <package id="System.Net.Requests" version="4.3.0" targetFramework="net472" />
-  <package id="System.Numerics.Vectors" version="4.4.0" targetFramework="net472" />
-  <package id="System.Runtime.CompilerServices.Unsafe" version="4.5.2" targetFramework="net472" />
   <package id="Telegram.Bot" version="15.7.1" targetFramework="net472" />
 </packages>