thunderstorm
a blowing update whatever that means
This commit is contained in:
parent
b7e72d416a
commit
70a1da8c8c
6 changed files with 244 additions and 0 deletions
5
pom.xml
5
pom.xml
|
@ -30,6 +30,11 @@
|
|||
<version>4.13.2</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.java-websocket</groupId>
|
||||
<artifactId>Java-WebSocket</artifactId>
|
||||
<version>1.5.6</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
|
|
36
src/main/java/eu/m724/wtapi/thunder/ThunderProvider.java
Normal file
36
src/main/java/eu/m724/wtapi/thunder/ThunderProvider.java
Normal file
|
@ -0,0 +1,36 @@
|
|||
package eu.m724.wtapi.thunder;
|
||||
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import eu.m724.wtapi.object.Coordinates;
|
||||
import eu.m724.wtapi.provider.exception.ProviderException;
|
||||
|
||||
public abstract class ThunderProvider {
|
||||
|
||||
public abstract void init() throws ProviderException;
|
||||
|
||||
/**
|
||||
* connects to remote server and starts processing data
|
||||
* @throws ProviderException
|
||||
*/
|
||||
public abstract void start() throws ProviderException;
|
||||
|
||||
/**
|
||||
* disconnects from remote server
|
||||
*/
|
||||
public abstract void stop();
|
||||
|
||||
/**
|
||||
* check for new data and call callback and stuff
|
||||
*/
|
||||
public abstract void tick();
|
||||
|
||||
public abstract void registerStrikeHandler(Consumer<Coordinates> runnable);
|
||||
|
||||
/**
|
||||
* delay between irl strike and receiving of data
|
||||
* @return delay in ms
|
||||
*/
|
||||
public abstract int getDelay();
|
||||
}
|
|
@ -0,0 +1,71 @@
|
|||
package eu.m724.wtapi.thunder.impl.lightningmaps;
|
||||
|
||||
import java.net.URI;
|
||||
|
||||
import org.java_websocket.client.WebSocketClient;
|
||||
import org.java_websocket.handshake.ServerHandshake;
|
||||
|
||||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
import com.google.gson.JsonSyntaxException;
|
||||
|
||||
import eu.m724.wtapi.object.Coordinates;
|
||||
|
||||
class LMWebsocketClient extends WebSocketClient {
|
||||
LightningMapsProvider lightningMapsProvider;
|
||||
|
||||
private static URI[] uris = new URI[] {
|
||||
URI.create("wss://live.lightningmaps.org/"),
|
||||
URI.create("wss://live2.lightningmaps.org/")
|
||||
};
|
||||
private int currentUri = 0;
|
||||
|
||||
public LMWebsocketClient(LightningMapsProvider lightningMapsProvider) {
|
||||
super(uris[0]);
|
||||
this.lightningMapsProvider = lightningMapsProvider;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onOpen(ServerHandshake handshakedata) {
|
||||
this.send("{\"v\":24,\"i\":{},\"s\":false,\"x\":0,\"w\":4,\"tx\":0,\"tw\":3,\"a\":4,\"z\":2,\"b\":true,\"h\":\"#m=oss;t=3;s=0;o=0;b=;ts=0;z=2;y=45.4601;x=17.5814;d=2;dl=2;dc=0;\",\"l\":5,\"t\":5,\"from_lightningmaps_org\":true,\"p\":[87,309,-72.5,-273.9],\"r\":\"re\"}");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMessage(String message) {
|
||||
try {
|
||||
JsonObject json =
|
||||
JsonParser.parseString(message)
|
||||
.getAsJsonObject();
|
||||
|
||||
if (!json.has("strokes")) return;
|
||||
|
||||
json.getAsJsonArray("strokes").forEach(ele -> {
|
||||
long time = ele.getAsJsonObject().getAsJsonPrimitive("time").getAsLong();
|
||||
double lat = ele.getAsJsonObject().getAsJsonPrimitive("lat").getAsDouble();
|
||||
double lon = ele.getAsJsonObject().getAsJsonPrimitive("lon").getAsDouble();
|
||||
|
||||
Coordinates coordinates = new Coordinates(lat, lon);
|
||||
lightningMapsProvider.submitStrike(coordinates, time);
|
||||
});
|
||||
} catch (JsonSyntaxException e) {
|
||||
// ignore invalid json
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClose(int code, String reason, boolean remote) {
|
||||
System.out.printf("%s Closed: %d %s\n", this.uri, code, reason);
|
||||
this.uri = uris[++currentUri % 2];
|
||||
lightningMapsProvider.reconnect();
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(Exception ex) {
|
||||
this.uri = uris[++currentUri % 2];
|
||||
lightningMapsProvider.reconnect();
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,85 @@
|
|||
package eu.m724.wtapi.thunder.impl.lightningmaps;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.Queue;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.concurrent.DelayQueue;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import eu.m724.wtapi.object.Coordinates;
|
||||
import eu.m724.wtapi.object.Weather;
|
||||
import eu.m724.wtapi.provider.exception.ProviderException;
|
||||
import eu.m724.wtapi.thunder.ThunderProvider;
|
||||
|
||||
public class LightningMapsProvider extends ThunderProvider {
|
||||
LMWebsocketClient websocketClient = new LMWebsocketClient(this);
|
||||
ArrayList<Consumer<Coordinates>> strikeHandlers = new ArrayList<>();
|
||||
CopyOnWriteArrayList<TimedStrike> strikes = new CopyOnWriteArrayList<>(); // TODO optimize?
|
||||
|
||||
private long reconnectPending;
|
||||
private final int delay = 10000;
|
||||
|
||||
@Override
|
||||
public void init() throws ProviderException {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void start() throws ProviderException {
|
||||
try {
|
||||
websocketClient.connectBlocking();
|
||||
} catch (InterruptedException e) {
|
||||
throw new ProviderException("unexpected interruptedexception");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void stop() {
|
||||
try {
|
||||
websocketClient.closeBlocking();
|
||||
} catch (InterruptedException e) {
|
||||
websocketClient.close();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerStrikeHandler(Consumer<Coordinates> runnable) {
|
||||
strikeHandlers.add(runnable);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getDelay() {
|
||||
return this.delay;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
long now = System.currentTimeMillis();
|
||||
|
||||
if (reconnectPending > 0) {
|
||||
if (now > reconnectPending) {
|
||||
websocketClient.reconnect();
|
||||
reconnectPending = 0;
|
||||
}
|
||||
}
|
||||
|
||||
for (TimedStrike strike : strikes) {
|
||||
if (strike.timestamp > now)
|
||||
break;
|
||||
strikeHandlers.forEach(con -> con.accept(strike.coordinates));
|
||||
strikes.remove(0);
|
||||
}
|
||||
}
|
||||
|
||||
void reconnect() {
|
||||
System.out.println("reconnecting in 5 seconds");
|
||||
reconnectPending = System.currentTimeMillis() + 3000;
|
||||
}
|
||||
|
||||
void submitStrike(Coordinates coordinates, long timestamp) {
|
||||
strikes.add(new TimedStrike(timestamp, coordinates));
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
package eu.m724.wtapi.thunder.impl.lightningmaps;
|
||||
|
||||
import eu.m724.wtapi.object.Coordinates;
|
||||
|
||||
public class TimedStrike {
|
||||
public long timestamp;
|
||||
public Coordinates coordinates;
|
||||
|
||||
public TimedStrike(long timestamp, Coordinates coordinates) {
|
||||
this.timestamp = timestamp;
|
||||
this.coordinates = coordinates;
|
||||
}
|
||||
}
|
34
src/test/java/eu/m724/wtapi/TestLM.java
Normal file
34
src/test/java/eu/m724/wtapi/TestLM.java
Normal file
|
@ -0,0 +1,34 @@
|
|||
package eu.m724.wtapi;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import eu.m724.wtapi.object.Coordinates;
|
||||
import eu.m724.wtapi.thunder.ThunderProvider;
|
||||
import eu.m724.wtapi.thunder.impl.lightningmaps.LightningMapsProvider;
|
||||
|
||||
public class TestLM {
|
||||
@Test
|
||||
public void lightningMapsTest() throws InterruptedException {
|
||||
ArrayList<Coordinates> coordinatesList = new ArrayList<>();
|
||||
|
||||
ThunderProvider provider = new LightningMapsProvider();
|
||||
|
||||
provider.registerStrikeHandler(coordinates ->
|
||||
coordinatesList.add(coordinates));
|
||||
|
||||
provider.init();
|
||||
|
||||
provider.start();
|
||||
|
||||
for (int i=0; i < 100; i++) {
|
||||
provider.tick();
|
||||
Thread.sleep(100);
|
||||
}
|
||||
|
||||
System.out.printf("Strikes in the last 10s: %d\n", coordinatesList.size());
|
||||
System.out.printf("%f %f", coordinatesList.get(0).latitude, coordinatesList.get(0).longitude);
|
||||
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue