Removes marketaverages from discordbot and rewarderbot
This commit is contained in:
parent
3d347a936d
commit
daad6468c6
@ -3,12 +3,11 @@
|
|||||||
public class GiveRewardsCommand
|
public class GiveRewardsCommand
|
||||||
{
|
{
|
||||||
public RewardUsersCommand[] Rewards { get; set; } = Array.Empty<RewardUsersCommand>();
|
public RewardUsersCommand[] Rewards { get; set; } = Array.Empty<RewardUsersCommand>();
|
||||||
public MarketAverage[] Averages { get; set; } = Array.Empty<MarketAverage>();
|
|
||||||
public string[] EventsOverview { get; set; } = Array.Empty<string>();
|
public string[] EventsOverview { get; set; } = Array.Empty<string>();
|
||||||
|
|
||||||
public bool HasAny()
|
public bool HasAny()
|
||||||
{
|
{
|
||||||
return Rewards.Any() || Averages.Any() || EventsOverview.Any();
|
return Rewards.Any() || EventsOverview.Any();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -17,15 +16,4 @@
|
|||||||
public ulong RewardId { get; set; }
|
public ulong RewardId { get; set; }
|
||||||
public string[] UserAddresses { get; set; } = Array.Empty<string>();
|
public string[] UserAddresses { get; set; } = Array.Empty<string>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public class MarketAverage
|
|
||||||
{
|
|
||||||
public int NumberOfFinished { get; set; }
|
|
||||||
public int TimeRangeSeconds { get; set; }
|
|
||||||
public float Price { get; set; }
|
|
||||||
public float Size { get; set; }
|
|
||||||
public float Duration { get; set; }
|
|
||||||
public float Collateral { get; set; }
|
|
||||||
public float ProofProbability { get; set; }
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -24,7 +24,6 @@ namespace CodexTests.UtilityTests
|
|||||||
private readonly List<ulong> rewardsSeen = new List<ulong>();
|
private readonly List<ulong> rewardsSeen = new List<ulong>();
|
||||||
private readonly TimeSpan rewarderInterval = TimeSpan.FromMinutes(1);
|
private readonly TimeSpan rewarderInterval = TimeSpan.FromMinutes(1);
|
||||||
private readonly List<string> receivedEvents = new List<string>();
|
private readonly List<string> receivedEvents = new List<string>();
|
||||||
private readonly List<MarketAverage> receivedAverages = new List<MarketAverage>();
|
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
[DontDownloadLogs]
|
[DontDownloadLogs]
|
||||||
@ -56,8 +55,6 @@ namespace CodexTests.UtilityTests
|
|||||||
AssertEventOccurance("Transit: New -> Started", 1);
|
AssertEventOccurance("Transit: New -> Started", 1);
|
||||||
AssertEventOccurance("Transit: Started -> Finished", 1);
|
AssertEventOccurance("Transit: Started -> Finished", 1);
|
||||||
|
|
||||||
AssertMarketAverage();
|
|
||||||
|
|
||||||
foreach (var r in repo.Rewards)
|
foreach (var r in repo.Rewards)
|
||||||
{
|
{
|
||||||
var seen = rewardsSeen.Any(s => r.RoleId == s);
|
var seen = rewardsSeen.Any(s => r.RoleId == s);
|
||||||
@ -80,28 +77,9 @@ namespace CodexTests.UtilityTests
|
|||||||
$"Event '{msg}' did not occure correct number of times.");
|
$"Event '{msg}' did not occure correct number of times.");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AssertMarketAverage()
|
|
||||||
{
|
|
||||||
Assert.That(receivedAverages.Count, Is.EqualTo(1));
|
|
||||||
var a = receivedAverages.Single();
|
|
||||||
|
|
||||||
Assert.That(a.NumberOfFinished, Is.EqualTo(1));
|
|
||||||
Assert.That(a.TimeRangeSeconds, Is.EqualTo(5760));
|
|
||||||
Assert.That(a.Price, Is.EqualTo(2.0f).Within(0.1f));
|
|
||||||
Assert.That(a.Size, Is.EqualTo(GetMinFileSize().SizeInBytes).Within(1.0f));
|
|
||||||
Assert.That(a.Duration, Is.EqualTo(GetMinRequiredRequestDuration().TotalSeconds).Within(1.0f));
|
|
||||||
Assert.That(a.Collateral, Is.EqualTo(10.0f).Within(0.1f));
|
|
||||||
Assert.That(a.ProofProbability, Is.EqualTo(5.0f).Within(0.1f));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void OnCommand(string timestamp, GiveRewardsCommand call)
|
private void OnCommand(string timestamp, GiveRewardsCommand call)
|
||||||
{
|
{
|
||||||
Log($"<API call {timestamp}>");
|
Log($"<API call {timestamp}>");
|
||||||
receivedAverages.AddRange(call.Averages);
|
|
||||||
foreach (var a in call.Averages)
|
|
||||||
{
|
|
||||||
Log("\tAverage: " + JsonConvert.SerializeObject(a));
|
|
||||||
}
|
|
||||||
receivedEvents.AddRange(call.EventsOverview);
|
receivedEvents.AddRange(call.EventsOverview);
|
||||||
foreach (var e in call.EventsOverview)
|
foreach (var e in call.EventsOverview)
|
||||||
{
|
{
|
||||||
|
@ -1,58 +0,0 @@
|
|||||||
using BiblioTech.Options;
|
|
||||||
using DiscordRewards;
|
|
||||||
using System.Globalization;
|
|
||||||
using Utils;
|
|
||||||
|
|
||||||
namespace BiblioTech.Commands
|
|
||||||
{
|
|
||||||
public class MarketCommand : BaseCommand
|
|
||||||
{
|
|
||||||
public override string Name => "market";
|
|
||||||
public override string StartingMessage => RandomBusyMessage.Get();
|
|
||||||
public override string Description => "Fetch some insights about current market conditions.";
|
|
||||||
|
|
||||||
protected override async Task Invoke(CommandContext context)
|
|
||||||
{
|
|
||||||
await context.Followup(GetInsights());
|
|
||||||
}
|
|
||||||
|
|
||||||
private string[] GetInsights()
|
|
||||||
{
|
|
||||||
var result = Program.Averages.SelectMany(GetInsight).ToArray();
|
|
||||||
if (result.Length > 0)
|
|
||||||
{
|
|
||||||
result = new[]
|
|
||||||
{
|
|
||||||
"No market insights available."
|
|
||||||
};
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
private string[] GetInsight(MarketAverage avg)
|
|
||||||
{
|
|
||||||
var timeRange = TimeSpan.FromSeconds(avg.TimeRangeSeconds);
|
|
||||||
var headerLine = $"[Last {Time.FormatDuration(timeRange)}] ({avg.NumberOfFinished} Contracts finished)";
|
|
||||||
|
|
||||||
if (avg.NumberOfFinished == 0)
|
|
||||||
{
|
|
||||||
return new[] { headerLine };
|
|
||||||
}
|
|
||||||
|
|
||||||
return new[]
|
|
||||||
{
|
|
||||||
headerLine,
|
|
||||||
$"Price: {Format(avg.Price)}",
|
|
||||||
$"Size: {Format(avg.Size)}",
|
|
||||||
$"Duration: {Format(avg.Duration)}",
|
|
||||||
$"Collateral: {Format(avg.Collateral)}",
|
|
||||||
$"ProofProbability: {Format(avg.ProofProbability)}"
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
private string Format(float f)
|
|
||||||
{
|
|
||||||
return f.ToString("F3", CultureInfo.InvariantCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -18,7 +18,6 @@ namespace BiblioTech
|
|||||||
public static AdminChecker AdminChecker { get; private set; } = null!;
|
public static AdminChecker AdminChecker { get; private set; } = null!;
|
||||||
public static IDiscordRoleDriver RoleDriver { get; set; } = null!;
|
public static IDiscordRoleDriver RoleDriver { get; set; } = null!;
|
||||||
public static ILog Log { get; private set; } = null!;
|
public static ILog Log { get; private set; } = null!;
|
||||||
public static MarketAverage[] Averages { get; set; } = Array.Empty<MarketAverage>();
|
|
||||||
|
|
||||||
public static Task Main(string[] args)
|
public static Task Main(string[] args)
|
||||||
{
|
{
|
||||||
@ -91,8 +90,7 @@ namespace BiblioTech
|
|||||||
sprCommand,
|
sprCommand,
|
||||||
associateCommand,
|
associateCommand,
|
||||||
notifyCommand,
|
notifyCommand,
|
||||||
new AdminCommand(sprCommand, replacement),
|
new AdminCommand(sprCommand, replacement)
|
||||||
new MarketCommand()
|
|
||||||
);
|
);
|
||||||
|
|
||||||
await client.LoginAsync(TokenType.Bot, Config.ApplicationToken);
|
await client.LoginAsync(TokenType.Bot, Config.ApplicationToken);
|
||||||
|
@ -23,10 +23,6 @@ namespace BiblioTech.Rewards
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (cmd.Averages != null && cmd.Averages.Any())
|
|
||||||
{
|
|
||||||
Program.Averages = cmd.Averages;
|
|
||||||
}
|
|
||||||
await Program.RoleDriver.GiveRewards(cmd);
|
await Program.RoleDriver.GiveRewards(cmd);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
@ -1,74 +0,0 @@
|
|||||||
using CodexContractsPlugin.ChainMonitor;
|
|
||||||
using CodexContractsPlugin.Marketplace;
|
|
||||||
using DiscordRewards;
|
|
||||||
using System.Numerics;
|
|
||||||
|
|
||||||
namespace TestNetRewarder
|
|
||||||
{
|
|
||||||
public class MarketBuffer
|
|
||||||
{
|
|
||||||
private readonly List<RequestEvent> requestEvents = new List<RequestEvent>();
|
|
||||||
private readonly TimeSpan bufferSpan;
|
|
||||||
|
|
||||||
public MarketBuffer(TimeSpan bufferSpan)
|
|
||||||
{
|
|
||||||
this.bufferSpan = bufferSpan;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Add(RequestEvent requestEvent)
|
|
||||||
{
|
|
||||||
requestEvents.Add(requestEvent);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Update()
|
|
||||||
{
|
|
||||||
var now = DateTime.UtcNow;
|
|
||||||
requestEvents.RemoveAll(r => (now - r.Request.FinishedUtc) > bufferSpan);
|
|
||||||
}
|
|
||||||
|
|
||||||
public MarketAverage? GetAverage()
|
|
||||||
{
|
|
||||||
if (requestEvents.Count == 0) return null;
|
|
||||||
|
|
||||||
return new MarketAverage
|
|
||||||
{
|
|
||||||
NumberOfFinished = requestEvents.Count,
|
|
||||||
TimeRangeSeconds = (int)bufferSpan.TotalSeconds,
|
|
||||||
Price = Average(s => s.Request.Ask.Reward),
|
|
||||||
Duration = Average(s => s.Request.Ask.Duration),
|
|
||||||
Size = Average(s => GetTotalSize(s.Request.Ask)),
|
|
||||||
Collateral = Average(s => s.Request.Ask.Collateral),
|
|
||||||
ProofProbability = Average(s => s.Request.Ask.ProofProbability)
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
private float Average(Func<IChainStateRequest, BigInteger> getValue)
|
|
||||||
{
|
|
||||||
return Average(s =>
|
|
||||||
{
|
|
||||||
var value = getValue(s);
|
|
||||||
return (int)value;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private float Average(Func<IChainStateRequest, int> getValue)
|
|
||||||
{
|
|
||||||
var sum = 0.0f;
|
|
||||||
float count = requestEvents.Count;
|
|
||||||
foreach (var r in requestEvents)
|
|
||||||
{
|
|
||||||
sum += getValue(r.Request);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (count < 1.0f) return 0.0f;
|
|
||||||
return sum / count;
|
|
||||||
}
|
|
||||||
|
|
||||||
private int GetTotalSize(Ask ask)
|
|
||||||
{
|
|
||||||
var nSlots = Convert.ToInt32(ask.Slots);
|
|
||||||
var slotSize = (int)ask.SlotSize;
|
|
||||||
return nSlots * slotSize;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,79 +0,0 @@
|
|||||||
using CodexContractsPlugin.ChainMonitor;
|
|
||||||
using DiscordRewards;
|
|
||||||
using GethPlugin;
|
|
||||||
using Logging;
|
|
||||||
using System.Numerics;
|
|
||||||
|
|
||||||
namespace TestNetRewarder
|
|
||||||
{
|
|
||||||
public class MarketTracker : IChainStateChangeHandler
|
|
||||||
{
|
|
||||||
private readonly List<MarketBuffer> buffers = new List<MarketBuffer>();
|
|
||||||
private readonly ILog log;
|
|
||||||
|
|
||||||
public MarketTracker(Configuration config, ILog log)
|
|
||||||
{
|
|
||||||
var intervals = GetInsightCounts(config);
|
|
||||||
|
|
||||||
foreach (var i in intervals)
|
|
||||||
{
|
|
||||||
buffers.Add(new MarketBuffer(
|
|
||||||
config.Interval * i
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
this.log = log;
|
|
||||||
}
|
|
||||||
|
|
||||||
public MarketAverage[] GetAverages()
|
|
||||||
{
|
|
||||||
foreach (var b in buffers) b.Update();
|
|
||||||
|
|
||||||
return buffers.Select(b => b.GetAverage()).Where(a => a != null).Cast<MarketAverage>().ToArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void OnNewRequest(RequestEvent requestEvent)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public void OnRequestFinished(RequestEvent requestEvent)
|
|
||||||
{
|
|
||||||
foreach (var b in buffers) b.Add(requestEvent);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void OnRequestFulfilled(RequestEvent requestEvent)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public void OnRequestCancelled(RequestEvent requestEvent)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public void OnSlotFilled(RequestEvent requestEvent, EthAddress host, BigInteger slotIndex)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public void OnSlotFreed(RequestEvent requestEvent, BigInteger slotIndex)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
private int[] GetInsightCounts(Configuration config)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var tokens = config.MarketInsights.Split(';').ToArray();
|
|
||||||
return tokens.Select(t => Convert.ToInt32(t)).ToArray();
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
log.Error($"Exception when parsing MarketInsights config parameters: {ex}");
|
|
||||||
}
|
|
||||||
return Array.Empty<int>();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void OnRequestFailed(RequestEvent requestEvent)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException("being removed");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -9,7 +9,6 @@ namespace TestNetRewarder
|
|||||||
{
|
{
|
||||||
private readonly RequestBuilder builder;
|
private readonly RequestBuilder builder;
|
||||||
private readonly RewardChecker rewardChecker;
|
private readonly RewardChecker rewardChecker;
|
||||||
private readonly MarketTracker marketTracker;
|
|
||||||
private readonly EventsFormatter eventsFormatter;
|
private readonly EventsFormatter eventsFormatter;
|
||||||
private readonly ChainState chainState;
|
private readonly ChainState chainState;
|
||||||
private readonly BotClient client;
|
private readonly BotClient client;
|
||||||
@ -22,12 +21,10 @@ namespace TestNetRewarder
|
|||||||
|
|
||||||
builder = new RequestBuilder();
|
builder = new RequestBuilder();
|
||||||
rewardChecker = new RewardChecker(builder);
|
rewardChecker = new RewardChecker(builder);
|
||||||
marketTracker = new MarketTracker(config, log);
|
|
||||||
eventsFormatter = new EventsFormatter();
|
eventsFormatter = new EventsFormatter();
|
||||||
|
|
||||||
var handler = new ChainStateChangeHandlerMux(
|
var handler = new ChainStateChangeHandlerMux(
|
||||||
rewardChecker.Handler,
|
rewardChecker.Handler,
|
||||||
marketTracker,
|
|
||||||
eventsFormatter
|
eventsFormatter
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -40,10 +37,9 @@ namespace TestNetRewarder
|
|||||||
{
|
{
|
||||||
chainState.Update(timeRange.To);
|
chainState.Update(timeRange.To);
|
||||||
|
|
||||||
var averages = marketTracker.GetAverages();
|
|
||||||
var events = eventsFormatter.GetEvents();
|
var events = eventsFormatter.GetEvents();
|
||||||
|
|
||||||
var request = builder.Build(averages, events);
|
var request = builder.Build(events);
|
||||||
if (request.HasAny())
|
if (request.HasAny())
|
||||||
{
|
{
|
||||||
await client.SendRewards(request);
|
await client.SendRewards(request);
|
||||||
|
@ -19,7 +19,7 @@ namespace TestNetRewarder
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public GiveRewardsCommand Build(MarketAverage[] marketAverages, string[] lines)
|
public GiveRewardsCommand Build(string[] lines)
|
||||||
{
|
{
|
||||||
var result = new GiveRewardsCommand
|
var result = new GiveRewardsCommand
|
||||||
{
|
{
|
||||||
@ -28,7 +28,6 @@ namespace TestNetRewarder
|
|||||||
RewardId = p.Key,
|
RewardId = p.Key,
|
||||||
UserAddresses = p.Value.Select(v => v.Address).ToArray()
|
UserAddresses = p.Value.Select(v => v.Address).ToArray()
|
||||||
}).ToArray(),
|
}).ToArray(),
|
||||||
Averages = marketAverages,
|
|
||||||
EventsOverview = lines
|
EventsOverview = lines
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user