Skip to content
This repository was archived by the owner on Jun 17, 2022. It is now read-only.

Commit d0baa53

Browse files
committed
More awesome event stuff and redemption event fix.
1 parent e9d1b4d commit d0baa53

18 files changed

+414
-51
lines changed

src/main/java/me/limeglass/streamelements/api/StreamElementsBuilder.java

+11-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ public final class StreamElementsBuilder {
88
private String token, accountID;
99
private int timeout = 20 * 1000;
1010
private Class<?>[] listeners;
11+
private String[] emitters;
1112

1213
/**
1314
* For those whom love keeping clean methods per line.
@@ -38,6 +39,15 @@ public StreamElementsBuilder registerListeners(Class<?>... listeners) {
3839
return this;
3940
}
4041

42+
/**
43+
* Register any emitters you want.
44+
* The parameter string is the class path of the emitter. Example: me.limeglass.streamelements.internal.events.emitters
45+
*/
46+
public StreamElementsBuilder registerEmitters(String... emitters) {
47+
this.emitters = emitters;
48+
return this;
49+
}
50+
4151
/**
4252
* Set the connection timeout of the client.
4353
* Recommended to set one.
@@ -97,7 +107,7 @@ public int getTimeout() {
97107
public StreamElements build() {
98108
if (token == null || accountID == null)
99109
throw new StreamElementsException("The StreamElements token or account ID was not set!");
100-
return new StreamElementsClient(token, accountID, timeout, listeners);
110+
return new StreamElementsClient(token, accountID, timeout, listeners, emitters);
101111
}
102112

103113
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package me.limeglass.streamelements.api.events;
2+
3+
import me.limeglass.streamelements.internals.dummy.Cancellable;
4+
import me.limeglass.streamelements.internals.events.ElementsEvent;
5+
import me.limeglass.streamelements.internals.events.emitters.ElementsEmitter;
6+
7+
public class EmitterRegisterEvent extends ElementsEvent implements Cancellable {
8+
9+
private final ElementsEmitter emitter;
10+
private boolean cancelled = false;
11+
12+
/**
13+
* Called when an emitter gets registered.
14+
*/
15+
public EmitterRegisterEvent(ElementsEmitter emitter) {
16+
this.emitter = emitter;
17+
}
18+
19+
/**
20+
* @return The emitter involved in the registering event.
21+
*/
22+
public ElementsEmitter getEmitter() {
23+
return emitter;
24+
}
25+
26+
/**
27+
* Cancels the event.
28+
* @param cancel If the event should be cancelled or not.
29+
*/
30+
@Override
31+
public void setCancelled(boolean cancel) {
32+
this.cancelled = cancel;
33+
}
34+
35+
/**
36+
* @return Checks if the event is cancelled or not.
37+
*/
38+
@Override
39+
public boolean isCancelled() {
40+
return cancelled;
41+
}
42+
43+
}

src/main/java/me/limeglass/streamelements/api/events/RedemptionEvent.java

+55-18
Original file line numberDiff line numberDiff line change
@@ -2,43 +2,80 @@
22

33
import java.time.Instant;
44

5-
import me.limeglass.streamelements.api.objects.User;
5+
import me.limeglass.streamelements.internals.events.emitters.types.RedemptionEmitter.EventAlert;
6+
import me.limeglass.streamelements.internals.events.emitters.types.RedemptionEmitter.Redeemer;
7+
import me.limeglass.streamelements.internals.events.emitters.types.RedemptionEmitter.RedemptionItem;
68

79
public class RedemptionEvent extends ActivityEvent {
8-
9-
private final String redemption;
10-
private final Number amount;
11-
private final User user;
10+
11+
private final String ID, redeemerType;
12+
private final RedemptionItem item;
13+
private final Redeemer redeemer;
14+
private final boolean completed;
15+
private final EventAlert alert;
16+
private final Instant updated;
1217

1318
/**
1419
* Called when someone uses a redemption.
1520
*/
16-
public RedemptionEvent(String type, Instant instant, String provider, String channel, Number amount, String redemption, User user) {
21+
public RedemptionEvent(String type, Instant instant, String provider, String channel, EventAlert alert, RedemptionItem item, Redeemer redeemer, boolean completed, String ID, String redeemerType, Instant updated) {
1722
super(type, instant, provider, channel);
18-
this.redemption = redemption;
19-
this.amount = amount;
20-
this.user = user;
23+
this.redeemerType = redeemerType;
24+
this.completed = completed;
25+
this.redeemer = redeemer;
26+
this.updated = updated;
27+
this.alert = alert;
28+
this.item = item;
29+
this.ID = ID;
2130
}
2231

2332
/**
24-
* @return The redemption item's name.
33+
* @return The redeemer type of the redemption event.
34+
*/
35+
public String getRedeemerType() {
36+
return redeemerType;
37+
}
38+
39+
/**
40+
* @return The item and all it's properties involved in the redemption event.
41+
*/
42+
public RedemptionItem getItem() {
43+
return item;
44+
}
45+
46+
/**
47+
* @return The redeemer of the redemption event.
2548
*/
26-
public String getRedemption() {
27-
return redemption;
49+
public Redeemer getRedeemer() {
50+
return redeemer;
2851
}
2952

3053
/**
31-
* @return The amount the redemption item cost.
54+
* @return Grab the alert setting for this redemption.
55+
*/
56+
public EventAlert getAlert() {
57+
return alert;
58+
}
59+
60+
/**
61+
* @return If the redemption was completed.
3262
*/
33-
public Number getAmount() {
34-
return amount;
63+
public boolean isCompleted() {
64+
return completed;
3565
}
3666

3767
/**
38-
* @return The User that initiated the redemption.
68+
* @return The last Instant that this redemption item was updated.
69+
*/
70+
public Instant getUpdated() {
71+
return updated;
72+
}
73+
74+
/**
75+
* @return The ID of the redemption transaction.
3976
*/
40-
public User getUser() {
41-
return user;
77+
public String getID() {
78+
return ID;
4279
}
4380

4481
}

src/main/java/me/limeglass/streamelements/internals/StreamElementsClient.java

+12-1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ public class StreamElementsClient implements StreamElements {
2121

2222
private final String token, account;
2323
private Class<?>[] listeners;
24+
private String[] emitters;
2425
private final int timeout;
2526
private Socket socket;
2627

@@ -30,10 +31,13 @@ public class StreamElementsClient implements StreamElements {
3031
* @param token The JWT token used from StreamElements. (Found under account)
3132
* @param accountID The account ID used from StreamElements. (Found under account)
3233
*/
33-
public StreamElementsClient(String token, String account, int timeout, Class<?>[] listeners) {
34+
public StreamElementsClient(String token, String account, int timeout, Class<?>[] listeners, String... emitters) {
3435
ElementsReaderHandler.load("me.limeglass.streamelements.internals.readers");
3536
if (listeners != null && listeners.length > 0)
3637
this.listeners = EventDispatcher.registerListeners(listeners);
38+
SocketListener.registerEmitters(this, "me.limeglass.streamelements.events.emitters.types");
39+
if (emitters != null && emitters.length > 0)
40+
this.emitters = SocketListener.registerEmitters(this, emitters);
3741
this.socket = SocketListener.registerSocket(this);
3842
this.account = account;
3943
this.timeout = timeout;
@@ -46,6 +50,13 @@ public StreamElementsClient(String token, String account, int timeout, Class<?>[
4650
public Class<?>[] getListeners() {
4751
return listeners;
4852
}
53+
54+
/**
55+
* @return The emitters to be registered.
56+
*/
57+
public String[] getEmitters() {
58+
return emitters;
59+
}
4960

5061
/**
5162
* @return the StreamElements Account ID of the client.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package me.limeglass.streamelements.internals.dummy;
2+
3+
public interface Cancellable {
4+
5+
/**
6+
* @return Checks if the event is cancelled or not.
7+
*/
8+
boolean isCancelled();
9+
10+
/**
11+
* Cancels the event.
12+
* @param cancel If the event should be cancelled or not.
13+
*/
14+
void setCancelled(boolean cancel);
15+
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package me.limeglass.streamelements.internals.dummy;
2+
3+
public class ElementsResponse {
4+
5+
}

src/main/java/me/limeglass/streamelements/internals/events/EventDispatcher.java

+14-12
Original file line numberDiff line numberDiff line change
@@ -56,18 +56,19 @@ public static Class<?> registerListener(Class<?> clazz, Object listener) {
5656
* Used internally, call this when an event happens to trigger the API events.
5757
*
5858
* @param event The ElementsEvent that just happened.
59+
* @return
5960
*/
60-
public static void dispatch(ElementsEvent event) {
61-
registered.parallelStream()
62-
.filter(check -> check.accepts(event))
63-
.forEach(handler -> {
64-
try {
65-
handler.handle(event);
66-
} catch (Throwable e) {
67-
System.out.println("Error dispatching event " + event.getClass().getSimpleName());
68-
e.printStackTrace();
69-
}
70-
});
61+
public static ElementsEvent dispatch(ElementsEvent event) {
62+
for (MethodHandler handler : registered) {
63+
if (handler.accepts(event))
64+
try {
65+
return handler.handle(event);
66+
} catch (Throwable e) {
67+
System.out.println("Error dispatching event " + event.getClass().getSimpleName());
68+
e.printStackTrace();
69+
}
70+
}
71+
return event;
7172
}
7273

7374
/**
@@ -86,13 +87,14 @@ public MethodHandler(MethodHandle handle, Class<?> listenerClass, Class<?> event
8687
this.handle = handle;
8788
}
8889

89-
public void handle(ElementsEvent event) throws Throwable {
90+
public ElementsEvent handle(ElementsEvent event) throws Throwable {
9091
Constructor<?>[] constructors = listenerClass.getConstructors();
9192
if (constructors.length > 0 && constructors[0].getParameterCount() > 0 && listener == null)
9293
throw new IllegalArgumentException("The listener instance may not be null and have a constructor at the same time.\n Use registerListener(Listener.class, new SubClassListener())");
9394
if (listener == null)
9495
listener = listenerClass.newInstance();
9596
handle.invoke(listener, event);
97+
return event;
9698
};
9799

98100
public boolean accepts(ElementsEvent event) {

src/main/java/me/limeglass/streamelements/internals/events/SocketListener.java

+42-3
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@
44
import java.net.URISyntaxException;
55
import java.util.HashSet;
66
import java.util.Set;
7-
87
import org.reflections.Reflections;
98

109
import com.google.common.collect.Sets;
1110

1211
import io.socket.client.IO;
1312
import io.socket.client.Socket;
1413
import me.limeglass.streamelements.api.StreamElements;
14+
import me.limeglass.streamelements.api.events.EmitterRegisterEvent;
1515
import me.limeglass.streamelements.internals.events.emitters.ElementsEmitter;
1616
import me.limeglass.streamelements.internals.events.emitters.EventEmitter;
1717

@@ -23,8 +23,9 @@ public class SocketListener {
2323

2424
public static Socket registerSocket(StreamElements instance) {
2525
try {
26+
emitters.clear();
2627
Reflections reflections = new Reflections("me.limeglass.streamelements.internals.events.emitters");
27-
for (Class<? extends ElementsEmitter> emitterClass : reflections.getSubTypesOf(ElementsEmitter.class)) {
28+
emitter : for (Class<? extends ElementsEmitter> emitterClass : reflections.getSubTypesOf(ElementsEmitter.class)) {
2829
ElementsEmitter emitter;
2930
try {
3031
emitter = emitterClass.getDeclaredConstructor(StreamElements.class).newInstance(instance);
@@ -33,7 +34,15 @@ public static Socket registerSocket(StreamElements instance) {
3334
continue;
3435
emitter = emitterClass.newInstance();
3536
}
36-
emitters.add(emitter);
37+
for (ElementsEmitter e : emitters) {
38+
if (e.getEventName().equals(emitter.getEventName())) {
39+
continue emitter;
40+
}
41+
}
42+
EmitterRegisterEvent event = new EmitterRegisterEvent(emitter);
43+
EventDispatcher.dispatch(event);
44+
if (!event.isCancelled())
45+
emitters.add(emitter);
3746
}
3847
IO.Options options = new IO.Options();
3948
options.forceNew = true;
@@ -55,6 +64,36 @@ public static Socket getSocket() {
5564
return socket;
5665
}
5766

67+
public static String[] registerEmitters(StreamElements instance, String... registerEmitters) {
68+
try {
69+
for (String emitterPackage : registerEmitters) {
70+
Reflections reflections = new Reflections(emitterPackage);
71+
emitter : for (Class<? extends ElementsEmitter> emitterClass : reflections.getSubTypesOf(ElementsEmitter.class)) {
72+
ElementsEmitter emitter;
73+
try {
74+
emitter = emitterClass.getDeclaredConstructor(StreamElements.class).newInstance(instance);
75+
} catch (NoSuchMethodException e) {
76+
if (ignored.contains(emitterClass))
77+
continue;
78+
emitter = emitterClass.newInstance();
79+
}
80+
for (ElementsEmitter e : emitters) {
81+
if (e.getEventName().equals(emitter.getEventName())) {
82+
continue emitter;
83+
}
84+
}
85+
EmitterRegisterEvent event = new EmitterRegisterEvent(emitter);
86+
EventDispatcher.dispatch(event);
87+
if (!event.isCancelled())
88+
emitters.add(emitter);
89+
}
90+
}
91+
} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | SecurityException e) {
92+
e.printStackTrace();
93+
}
94+
return registerEmitters;
95+
}
96+
5897
/**
5998
* Useful for adding emitters that shouldn't be read as a logical ElementsEmitter. Example being EventEmitter.
6099
* @param emitter The class that extends ElementsEmitter.

src/main/java/me/limeglass/streamelements/internals/events/emitters/EventEmitter.java

+12-4
Original file line numberDiff line numberDiff line change
@@ -35,17 +35,25 @@ public EventEmitter(String type) {
3535
}
3636
}
3737
*/
38+
39+
@Override
40+
public String getEventName() {
41+
return type;
42+
}
3843

3944
@Override
4045
public void call(Socket socket, Object... args) {
4146
JSONObject object = (JSONObject)args[0];
42-
System.out.println("Event: " + object.toString());
43-
provider = object.getString("provider");
47+
if (object.has("provider"))
48+
provider = object.getString("provider");
49+
else
50+
provider = "twitch";
4451
instant = Instant.parse(object.getString("createdAt"));
4552
channel = object.getString("channel");
46-
System.out.println("Event: " + object.toString());
47-
if (object.getString("type").equalsIgnoreCase(type))
53+
if (object.has("type") && object.getString("type").equalsIgnoreCase(type))
4854
call(socket, object.getJSONObject("data"));
55+
else if (object.has("redeemerType") && type.equalsIgnoreCase("redemption"))
56+
call(socket, object);
4957
}
5058

5159
protected abstract void call(Socket socket, JSONObject data);

0 commit comments

Comments
 (0)