|
1 | 1 | using System.Collections.Concurrent; |
2 | 2 |
|
3 | | -public class WebhookService : IWebhookService |
| 3 | +namespace RandomAPI.Services.Webhooks |
4 | 4 | { |
5 | | - private readonly ConcurrentDictionary<string, byte> _webhookUrls = new(); |
6 | | - private readonly HttpClient _client = new(); |
7 | | - private readonly ILogger<IWebhookService> _logger; |
8 | | - |
9 | | - public WebhookService(ILogger<IWebhookService> logger) |
| 5 | + public class WebhookService : IWebhookService |
10 | 6 | { |
11 | | - _logger = logger; |
12 | | - } |
13 | | - |
14 | | - public IEnumerable<string> GetListeners() => _webhookUrls.Keys; |
| 7 | + private readonly ConcurrentDictionary<string, byte> _webhookUrls = new(); |
| 8 | + private readonly HttpClient _client = new(); |
| 9 | + private readonly ILogger<IWebhookService> _logger; |
15 | 10 |
|
16 | | - public bool AddListener(string url) |
17 | | - => _webhookUrls.TryAdd(url, 0); |
| 11 | + public WebhookService(ILogger<IWebhookService> logger) |
| 12 | + { |
| 13 | + _logger = logger; |
| 14 | + } |
18 | 15 |
|
19 | | - public bool RemoveListener(string url) |
20 | | - => _webhookUrls.TryRemove(url, out _); |
| 16 | + public IEnumerable<string> GetListeners() => _webhookUrls.Keys; |
21 | 17 |
|
22 | | - public async Task BroadcastAsync<T>(T payload) |
23 | | - { |
24 | | - // Snapshot-safe enumeration |
25 | | - var tasks = _webhookUrls.Keys.Select(async url => |
| 18 | + public bool AddListener(string url) => _webhookUrls.TryAdd(url, 0); |
| 19 | + |
| 20 | + public bool RemoveListener(string url) => _webhookUrls.TryRemove(url, out _); |
| 21 | + |
| 22 | + public async Task BroadcastAsync<T>(T payload) where T : class |
26 | 23 | { |
27 | | - try |
28 | | - { |
29 | | - await _client.PostAsJsonAsync(url, payload); |
30 | | - } |
31 | | - catch (Exception ex) |
| 24 | + // Snapshot-safe enumeration |
| 25 | + var tasks = _webhookUrls.Keys.Select(async url => |
32 | 26 | { |
| 27 | + try |
33 | 28 | { |
34 | | - _logger.LogWarning(ex, "WebhookPayload failed to Post"); |
| 29 | + await _client.PostAsJsonAsync(url, payload); |
35 | 30 | } |
36 | | - } |
37 | | - }); |
38 | | - await Task.WhenAll(tasks); |
| 31 | + catch (Exception ex) |
| 32 | + { |
| 33 | + { |
| 34 | + _logger.LogWarning(ex, "WebhookPayload failed to Post"); |
| 35 | + } |
| 36 | + } |
| 37 | + }); |
| 38 | + await Task.WhenAll(tasks); |
| 39 | + } |
39 | 40 | } |
40 | 41 | } |
41 | | - |
42 | | -public interface IWebhookPayload |
43 | | -{ |
44 | | - DateTime Timestamp { get; set; } |
45 | | - string Message { get; set; } |
46 | | - |
47 | | -} |
48 | | - |
49 | | -public class WebhookPayload : IWebhookPayload |
50 | | -{ |
51 | | - public string Message { get; set; } = ""; |
52 | | - public DateTime Timestamp { get; set; } = DateTime.UtcNow; |
53 | | -} |
0 commit comments