From 51d05b81045313436e954c50c65696a91b870a07 Mon Sep 17 00:00:00 2001 From: Jetsparrow Date: Sat, 27 Apr 2024 18:01:01 +0300 Subject: [PATCH] Use plan TimeoutMultiplier for ratelimit costs --- JetHerald/Contracts/IDb.cs | 8 ++++++-- JetHerald/Controllers/Api/HeartbeatController.cs | 2 +- JetHerald/Controllers/Api/ReportController.cs | 2 +- JetHerald/Services/DbContext.cs | 6 +++++- JetHerald/Services/LeakyBucket.cs | 3 ++- 5 files changed, 15 insertions(+), 6 deletions(-) diff --git a/JetHerald/Contracts/IDb.cs b/JetHerald/Contracts/IDb.cs index 181e899..cff5966 100644 --- a/JetHerald/Contracts/IDb.cs +++ b/JetHerald/Contracts/IDb.cs @@ -2,14 +2,18 @@ public class Topic { - public uint TopicId { get; set; } + public uint TopicId { get; private set; } public uint CreatorId { get; set; } public string Name { get; set; } public string Description { get; set; } public string ReadToken { get; set; } public string WriteToken { get; set; } - public NamespacedId? Sub { get; set; } + + // joined + public NamespacedId? Sub { get; private set; } + public string? Login { get; private set; } + public double TimeoutMultiplier { get; private set; } = 1; public override string ToString() => Name == Description ? Name : $"{Name}: {Description}"; diff --git a/JetHerald/Controllers/Api/HeartbeatController.cs b/JetHerald/Controllers/Api/HeartbeatController.cs index 67b5ca9..51b2da7 100644 --- a/JetHerald/Controllers/Api/HeartbeatController.cs +++ b/JetHerald/Controllers/Api/HeartbeatController.cs @@ -82,7 +82,7 @@ public class HeartbeatController : ControllerBase if (wasBeating == 0) await Herald.BroadcastMessageRaw(t.TopicId, $"!{t.Description}!:\nHeart \"{heart}\" has started beating at {DateTime.UtcNow:O}"); - Timeouts.ApplyCost(t.TopicId, Config.HeartbeatCost); + Timeouts.ApplyCost(t.TopicId, Config.HeartbeatCost * t.TimeoutMultiplier); return new OkResult(); } diff --git a/JetHerald/Controllers/Api/ReportController.cs b/JetHerald/Controllers/Api/ReportController.cs index 341c546..4a0353c 100644 --- a/JetHerald/Controllers/Api/ReportController.cs +++ b/JetHerald/Controllers/Api/ReportController.cs @@ -68,7 +68,7 @@ public class ReportController : ControllerBase await Herald.BroadcastMessageRaw(t.TopicId, $"|{t.Description}|:\n{args.Message}"); - Timeouts.ApplyCost(t.TopicId, Config.ReportCost); + Timeouts.ApplyCost(t.TopicId, Config.ReportCost * t.TimeoutMultiplier); return new OkResult(); } diff --git a/JetHerald/Services/DbContext.cs b/JetHerald/Services/DbContext.cs index 7aa8b01..4c221a1 100644 --- a/JetHerald/Services/DbContext.cs +++ b/JetHerald/Services/DbContext.cs @@ -101,7 +101,11 @@ public class DbContext : IDisposable public Task GetTopic(string name) => Tran.QuerySingleOrDefaultAsync( - "SELECT * FROM topic WHERE Name = @name", + @"SELECT t.*, u.Login, p.TimeoutMultiplier + FROM `topic` t + JOIN `user` u ON t.CreatorId = u.UserId + JOIN `plan` p ON u.PlanId = p.PlanId + WHERE t.Name = @name;", new { name }); public Task DeleteTopic(string name, uint userId) diff --git a/JetHerald/Services/LeakyBucket.cs b/JetHerald/Services/LeakyBucket.cs index ffa6b4b..99d6fec 100644 --- a/JetHerald/Services/LeakyBucket.cs +++ b/JetHerald/Services/LeakyBucket.cs @@ -21,8 +21,9 @@ public class LeakyBucket return time > debtLimit; } - public void ApplyCost(uint key, int cost) + public void ApplyCost(uint key, double cost) { + if (cost <= 0) return; expiryDates.AddOrUpdate(key, key => DateTime.UtcNow.AddSeconds(cost), (key, oldDebt) =>