aboutsummaryrefslogtreecommitdiff
path: root/Sites
diff options
context:
space:
mode:
Diffstat (limited to 'Sites')
-rw-r--r--Sites/PagerMon.cs103
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