diff options
| author | Jake Mannens <jake@asger.xyz> | 2024-09-20 16:21:09 +1000 |
|---|---|---|
| committer | Jake Mannens <jake@asger.xyz> | 2024-10-29 11:42:48 +1100 |
| commit | 0e21907c76dbefed11f382bcf949143f0716567f (patch) | |
| tree | 3b470c01fb441517bc794daa179e6b2159fc8b46 /Sites | |
| parent | 0ae271bebd4a43b14bd4c215c539e16adbe073fb (diff) | |
v0.3v0.3
Diffstat (limited to 'Sites')
| -rw-r--r-- | Sites/PagerMon.cs | 103 |
1 files changed, 92 insertions, 11 deletions
diff --git a/Sites/PagerMon.cs b/Sites/PagerMon.cs index d27d3fe..4d19354 100644 --- a/Sites/PagerMon.cs +++ b/Sites/PagerMon.cs @@ -1,36 +1,117 @@ -namespace PagerParser.Sites; +using SocketIOClient; +using System; +using System.Text.Json; + +namespace PagerParser.PagerProviders; // Interface class for fetching pager messages from PagerMon // sites such as Jobyyy over HTTP. -public class PagerMon { - public record PagerMonMessage { +[PagerProvider] +public class PagerMon : IPagerProvider { + private record PagerMonMessage { public long Timestamp { get; set; } public string Message { get; set; } + + public PagerMessage PagerMessage => new PagerMessage() { + Timestamp = DateTimeOffset.FromUnixTimeSeconds(Timestamp).UtcDateTime, + Message = Message + }; } - public record PagerMonQueryResponse { + private record PagerMonQueryResponse { public PagerMonMessage[] Messages { get; set; } } - private const string QueryUrl = - "https://jobyyy.net/api/messageSearch?alias=6&limit=100"; + public event EventHandler OnConnect; + public event PagerMessageHandler OnPagerMessage; + + private const string QueryBaseUrl = + "https://jobyyy.net/api/messages"; private HttpClient httpClient = new(); + private SocketIO socketIOClient; + + public PagerMon() { + socketIOClient = new SocketIO("https://jobyyy.net/", new SocketIOOptions() { + Transport = SocketIOClient.Transport.TransportProtocol.WebSocket, + AutoUpgrade = false, + EIO = EngineIO.V3 + }); + + socketIOClient.OnConnected += (sender, e) => + OnConnect?.Invoke(this, e); + + socketIOClient.On("messagePost", PagerMessageReceived); + } + + public void Connect() => + socketIOClient.ConnectAsync().GetAwaiter().GetResult(); + + public void Disconnect() => + socketIOClient.DisconnectAsync().GetAwaiter().GetResult(); + public PagerMessage[] Fetch() { List<PagerMessage> messages = new(); var result = httpClient - .GetFromJsonAsync<PagerMonQueryResponse>(QueryUrl) + .GetFromJsonAsync<PagerMonQueryResponse>($"{QueryBaseUrl}?limit=120") .GetAwaiter() .GetResult(); if(result is null) return Array.Empty<PagerMessage>(); - return result.Messages.Select(m => new PagerMessage() { - Timestamp = DateTimeOffset.FromUnixTimeSeconds(m.Timestamp).UtcDateTime, - Message = m.Message - }).ToArray(); + return result.Messages + .Select(m => m.PagerMessage) + .ToArray(); + } + + public async Task<PagerMessage[]> FetchAsync(CancellationToken ct, DateTime until) { + List<PagerMessage> pagerMessages = new(); + + int page = 1; + + while(!ct.IsCancellationRequested) { + PagerMonQueryResponse? result; + try { + result = await httpClient + .GetFromJsonAsync<PagerMonQueryResponse>($"{QueryBaseUrl}?limit=120&page={page}"); + } catch { + break; + } + + if(result is null || result.Messages.Count() == 0) + break; + + var messages = result.Messages + .Select(m => m.PagerMessage) + .OrderBy(m => m.Timestamp) + .ToArray(); + + pagerMessages.AddRange(messages); + + if(messages[0].Timestamp <= until) + break; + + page++; + } + + return pagerMessages.ToArray(); + } + + private void PagerMessageReceived(SocketIOResponse resp) { + var message = JsonSerializer.Deserialize<PagerMonMessage>( + resp.GetValue(), + new JsonSerializerOptions() { + PropertyNameCaseInsensitive = true + }); + + if(message is null) + return; + + OnPagerMessage?.Invoke(this, new() { + Message = message.PagerMessage + }); } }
\ No newline at end of file |
