89 lines
3.0 KiB
C#
Raw Normal View History

2024-06-14 11:05:29 +02:00
using CodexContractsPlugin;
using CodexContractsPlugin.ChainMonitor;
2024-01-26 18:17:56 -05:00
using Logging;
using Utils;
namespace TestNetRewarder
{
public class Processor : ITimeSegmentHandler
2024-01-26 18:17:56 -05:00
{
private readonly RequestBuilder builder;
2024-06-27 10:07:10 +02:00
private readonly EventsFormatter eventsFormatter;
2024-06-14 11:05:29 +02:00
private readonly ChainState chainState;
private readonly Configuration config;
private readonly BotClient client;
2024-01-26 18:17:56 -05:00
private readonly ILog log;
private DateTime lastPeriodUpdateUtc;
2024-01-26 18:17:56 -05:00
public Processor(Configuration config, BotClient client, ICodexContracts contracts, ILog log)
2024-01-26 18:17:56 -05:00
{
this.config = config;
this.client = client;
2024-01-26 18:17:56 -05:00
this.log = log;
lastPeriodUpdateUtc = DateTime.UtcNow;
2024-06-14 11:05:29 +02:00
builder = new RequestBuilder();
2025-03-04 15:58:45 +01:00
eventsFormatter = new EventsFormatter(config);
chainState = new ChainState(log, contracts, eventsFormatter, config.HistoryStartUtc,
2025-03-04 15:58:45 +01:00
doProofPeriodMonitoring: config.ShowProofPeriodReports > 0);
2024-01-26 18:17:56 -05:00
}
public async Task Initialize()
{
var events = eventsFormatter.GetInitializationEvents(config);
2025-04-16 16:25:31 +02:00
var request = builder.Build(chainState, events, Array.Empty<string>());
if (request.HasAny())
{
await client.SendRewards(request);
}
}
public async Task<TimeSegmentResponse> OnNewSegment(TimeRange timeRange)
2024-01-26 18:17:56 -05:00
{
try
{
var sw = System.Diagnostics.Stopwatch.StartNew();
var numberOfChainEvents = await ProcessEvents(timeRange);
var duration = sw.Elapsed;
if (duration > TimeSpan.FromSeconds(1)) return TimeSegmentResponse.Underload;
2025-04-16 16:25:31 +02:00
if (duration > TimeSpan.FromSeconds(3)) return TimeSegmentResponse.Overload;
return TimeSegmentResponse.OK;
2024-01-26 18:17:56 -05:00
}
catch (Exception ex)
{
2024-06-21 08:56:20 +02:00
var msg = "Exception processing time segment: " + ex;
log.Error(msg);
eventsFormatter.OnError(msg);
2024-04-01 13:56:07 +02:00
throw;
2024-01-26 18:17:56 -05:00
}
}
private async Task<int> ProcessEvents(TimeRange timeRange)
{
var numberOfChainEvents = chainState.Update(timeRange.To);
ProcessPeriodUpdate();
var events = eventsFormatter.GetEvents();
var errors = eventsFormatter.GetErrors();
2025-04-16 16:25:31 +02:00
var request = builder.Build(chainState, events, errors);
if (request.HasAny())
{
await client.SendRewards(request);
}
return numberOfChainEvents;
}
private void ProcessPeriodUpdate()
{
2025-03-04 15:58:45 +01:00
if (config.ShowProofPeriodReports < 1) return;
if (DateTime.UtcNow < (lastPeriodUpdateUtc + TimeSpan.FromHours(1.0))) return;
lastPeriodUpdateUtc = DateTime.UtcNow;
eventsFormatter.ProcessPeriodReports(chainState.PeriodMonitor.GetAndClearReports());
}
2024-01-26 18:17:56 -05:00
}
}