Untitled
unknown
plain_text
3 years ago
5.3 kB
10
Indexable
public static ConcurrentBag<GatoNinjaCard> updateCardsQueue = new();
internal static async Task InitCardQueueUpdaterAsync()
{
Logger.doLog($"[{assets.pluginName}] Varredura de cartões está inicializada!", Logger.ExceptionLevel.Info);
while (true)
{
try
{
using (var db = DbConnection.db.CloneEx())
{
db.Open();
if (updateCardsQueue.Count > 0)
{
var watch = new Stopwatch();
var queue = updateCardsQueue;
var transaction = db.BeginTransaction();
var taskArr = new Task[1];
var total = 0L;
var lastCount = 0L;
var lastElapsed = 0L;
watch.Start();
Logger.doLog($"[{assets.pluginName}] Efetuando varredura de cartões e atualizando ao banco de dados...", Logger.ExceptionLevel.Info);
for (int i = 0; i < taskArr.Length; i++)
{
var task = Task.Run(
() =>
{
using (var cmd = new MySqlCommand("", (MySqlConnection)db, (MySqlTransaction)transaction))
{
while (queue.TryTake(out var card))
{
var cut = card.CardUserToken is null ? null : $"{card.CardUserToken!.UserToken}|{card.CardUserToken!.CardNumber}";
var ret = CmdCommand(cmd, $"INSERT INTO GatoNinjaCards (CardUserToken, NumeroCartao, MesVencimento, AnoVencimento, CVV, Details, LastCheckedAt, ExportedToStore, AllowNonVipRetest, StatusCheckerCC) VALUES (\"{cut}\", \"{card.NumeroCartao}\", \"{card.MesVencimento}\", \"{card.AnoVencimento}\", \"{card.CVV}\", \"{card.Details}\", \"{card.LastCheckedAt}\", \"{Convert.ToInt32(card.ExportedToStore)}\", \"{Convert.ToInt32(card.AllowNonVipRetest)}\", \"{(int)card.StatusCheckerCC}\") ON DUPLICATE KEY UPDATE MesVencimento = \"{card.MesVencimento}\", AnoVencimento = \"{card.AnoVencimento}\", CVV = \"{card.CVV}\", Details = \"{card.Details}\", LastCheckedAt = \"{card.LastCheckedAt}\", ExportedToStore = \"{Convert.ToInt32(card.ExportedToStore)}\", AllowNonVipRetest = \"{Convert.ToInt32(card.AllowNonVipRetest)}\", StatusCheckerCC = \"{(int)card.StatusCheckerCC}\";");
doLog($"[{assets.pluginName}] O cartão \"{cut}\" foi atualizado no banco de dados.", ExceptionLevel.Debug);
Interlocked.Increment(ref total);
}
}
});
taskArr[i] = task;
}
Task.Run(() =>
{
bool tasksFinished = false;
while (true)
{
tasksFinished = Task.WaitAll(taskArr, 200);
var elapsedDiff = watch.ElapsedMilliseconds - lastElapsed;
if (elapsedDiff >= 5000 || tasksFinished)
{
transaction.Commit();
transaction = db.BeginTransaction();
var totalSafe = Interlocked.Read(ref total);
var countDiff = totalSafe - lastCount;
lastElapsed += elapsedDiff;
lastCount += countDiff;
}
if (tasksFinished) { break; }
}
}).Wait();
//transaction.Commit();
//transaction.Dispose();
watch.Stop();
}
}
}
catch (Exception ex)
{
Logger.ThrowException($"[{assets.pluginName}] Ocorreu um erro ao atualizar a query de cartões no banco de dados => {ex.Message}", ex.ToString(), ExceptionLevel.Critical);
}
finally
{
await Task.Delay(10000);
Logger.doLog($"[{assets.pluginName}] Varredura de cartões finalizada, banco de dados atualizado...", Logger.ExceptionLevel.Info);
}
}
}
private static int CmdCommand(MySqlCommand com, string query)
{
com.CommandText = query;
return com.ExecuteNonQuery();
}Editor is loading...