public async Task Execute(IJobExecutionContext context) { if (!_bot.IsConnected) { return; } decimal minimumStake = TracToken.MinimumStake; await using (MySqlConnection connection = new MySqlConnection(OTHubSettings.Instance.MariaDB.ConnectionString)) { LowAvailableTokenUsers[] users = (await connection.QueryAsync <LowAvailableTokenUsers>( @"SELECT ts.UserID, ts.LowAvailableTokensAmount, u.TelegramUserID FROM telegramsettings ts JOIN Users u on u.ID = ts.UserID WHERE ts.LowAvailableTokensEnabled = 1 AND ts.NotificationsEnabled = 1 AND ts.HasReceivedMessageFromUser = 1 AND u.TelegramUserID is not null")).ToArray(); foreach (LowAvailableTokenUsers user in users) { try { LowAvailableTokenNode[] nodes = (await connection.QueryAsync <LowAvailableTokenNode>( @"SELECT i.NodeID, i.Identity, i.Stake, i.StakeReserved, i.BlockchainID, b.DisplayName AS BlockchainName, mn.DisplayName NodeName FROM otidentity i JOIN blockchains b ON b.ID = i.BlockchainID JOIN mynodes mn ON mn.NodeID = i.NodeId WHERE mn.UserID = @userID AND i.LastActivityTimestamp > DATE_Add(NOW(), INTERVAL -30 DAY) AND i.Stake > @minimumStake", new { userID = user.UserID, minimumStake = minimumStake })).ToArray(); foreach (LowAvailableTokenNode lowAvailableTokenNode in nodes) { decimal available = lowAvailableTokenNode.Stake - minimumStake - lowAvailableTokenNode.StakeReserved; if (available < 0) { available = 0; } if (available < user.LowAvailableTokensAmount) { try { await Task.Delay(200); await _bot.LowAvailableTokensOnNode(user, lowAvailableTokenNode, available); } catch (Exception e) { } } } } catch { } } } }