Skip to content

Commit 2b90a6d

Browse files
authored
Release v1.0.2-RELEASE
1 parent 8fd0692 commit 2b90a6d

18 files changed

+631
-0
lines changed

README.md

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# ItemManager [v1.0.2-RELEASE]
2+
![Java](https://img.shields.io/badge/java-%23ED8B00.svg?style=for-the-badge&logo=java&logoColor=white)
3+
![GitHub](https://img.shields.io/github/languages/code-size/HyperSkys/ItemManager?color=cyan&label=Size&labelColor=000000&logo=GitHub&style=for-the-badge)
4+
![GitHub](https://img.shields.io/github/license/HyperSkys/ItemManager?color=violet&logo=GitHub&labelColor=000000&style=for-the-badge)
5+
![Discord](https://img.shields.io/discord/898154272636678196?color=5865F2&label=Discord&logo=Discord&labelColor=23272a&style=for-the-badge)
6+
7+
**Item Manager** is just a project I made because I was bored. All it does is detect if you scan an Item and shows the price of the item, name of the item, and more.
8+
9+
### Download
10+
11+
You can download this program by clicking the green CODE button and clicking Download Zip after that open it in your Java IDE and run it!
12+
13+
14+
### Discord
15+
16+
You can join my discord using this invite https://discord.gg/Y59DddqZZR please join the server if you have any issues or suggestions that you would like to make do not make random issues when you could just use the discord.
17+
18+
19+
### Java Support
20+
21+
This project was made in Java 8, so I don't know why I have to say this you cannot use it in any other Java version other than Java 8.
22+
23+
### Credits
24+
25+
Thanks to [BadBird5907](https://github.com/Badbird-5907) for allowing me to use his EventBus it was really helpful for this project as I am very dumb and also very lazy, so yeah thanks to him.
26+
27+
28+
## License
29+
This project is licensed under [Eclipse Public License](https://github.com/HyperSkys/ItemManager/blob/main/LICENSE)

pom.xml

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
7+
<groupId>dev.hyperskys</groupId>
8+
<artifactId>ItemManager</artifactId>
9+
<version>v1.0.2-RELEASE</version>
10+
11+
<properties>
12+
<maven.compiler.source>8</maven.compiler.source>
13+
<maven.compiler.target>8</maven.compiler.target>
14+
</properties>
15+
16+
<dependencies>
17+
<dependency>
18+
<groupId>org.projectlombok</groupId>
19+
<artifactId>lombok</artifactId>
20+
<version>1.18.22</version>
21+
</dependency>
22+
</dependencies>
23+
24+
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package dev.hyperskys.itemmanager;
2+
3+
import dev.hyperskys.itemmanager.eventbus.EventBus;
4+
import dev.hyperskys.itemmanager.events.ItemScanEvent;
5+
import dev.hyperskys.itemmanager.listeners.ItemScanListener;
6+
import dev.hyperskys.itemmanager.utils.CheckoutManager;
7+
8+
public class ItemManager {
9+
10+
public static double totalCost;
11+
12+
public static void main(String[] args) {
13+
EventBus eventBus = new EventBus();
14+
eventBus.register(new ItemScanEvent());
15+
16+
System.out.println("Items Scanned: ");
17+
ItemScanListener milkChocolate = new ItemScanListener(144720); // Milk Chocolate
18+
ItemScanListener almondChocolate = new ItemScanListener(144721);
19+
ItemScanListener crunchChocolate = new ItemScanListener(144722);
20+
21+
eventBus.post(milkChocolate);
22+
eventBus.post(almondChocolate);
23+
eventBus.post(crunchChocolate);
24+
25+
System.out.println("Total Cost: $"+totalCost);
26+
CheckoutManager.finialCheckout(totalCost);
27+
}
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,221 @@
1+
package dev.hyperskys.itemmanager.eventbus;
2+
3+
import dev.hyperskys.itemmanager.eventbus.annotation.EventHandler;
4+
import dev.hyperskys.itemmanager.eventbus.event.Cancellable;
5+
import dev.hyperskys.itemmanager.eventbus.event.Event;
6+
import dev.hyperskys.itemmanager.eventbus.internal.EventInfo;
7+
import dev.hyperskys.itemmanager.eventbus.internal.IEventBus;
8+
import lombok.Getter;
9+
10+
import java.lang.reflect.InvocationTargetException;
11+
import java.lang.reflect.Method;
12+
import java.lang.reflect.Modifier;
13+
import java.util.*;
14+
import java.util.concurrent.ConcurrentHashMap;
15+
import java.util.concurrent.CopyOnWriteArrayList;
16+
17+
public class EventBus implements IEventBus {
18+
@Getter
19+
private Map<Class<? extends Event>, List<EventInfo>> listeners;
20+
21+
@Getter
22+
private Logger logger;
23+
24+
@Getter
25+
private EventBusSettings settings;
26+
27+
public EventBus(EventBusSettings settings) {
28+
this.settings = settings;
29+
if (settings.isUseConcurrentHashMap()) { //we have this setting so users can get ultimate performance
30+
listeners = new ConcurrentHashMap<>();
31+
} else listeners = new HashMap<>();
32+
logger = settings.getLogger();
33+
}
34+
35+
public EventBus() {
36+
this(new EventBusSettings());
37+
}
38+
39+
@Override
40+
public void register(Class<?> event) {
41+
debug("Registering event class " + event.getSimpleName());
42+
for (Method method : event.getDeclaredMethods()) {
43+
debug("Found method " + method.getName());
44+
if (Modifier.isStatic(method.getModifiers())) { //static methods
45+
debug("Method is static");
46+
if (method.isAnnotationPresent(EventHandler.class)) {
47+
debug("Method is annotated with EventHandler");
48+
register(method.getAnnotation(EventHandler.class), method);
49+
}
50+
} else debug("Method is not static, ignoring");
51+
}
52+
}
53+
54+
@Override
55+
public void register(Object listener) {
56+
debug("Registering listener " + listener.getClass().getSimpleName());
57+
for (Method method : listener.getClass().getDeclaredMethods()) {
58+
debug("Found method " + method.getName());
59+
if (method.isAnnotationPresent(EventHandler.class)) {
60+
debug("Method is annotated with EventHandler");
61+
register(method.getAnnotation(EventHandler.class), method, listener);
62+
}
63+
}
64+
}
65+
66+
@Override
67+
public void unregister(Object listener) {
68+
if (listener == null)
69+
throw new IllegalArgumentException("Listener cannot be null");
70+
debug("Unregistering listener " + listener.getClass().getSimpleName());
71+
Class<?> clazz = listener.getClass();
72+
unregister(clazz);
73+
}
74+
75+
@Override
76+
public void unregister(Class<?> event) {
77+
debug("Unregistering listener class " + event.getSimpleName());
78+
listeners.forEach((clazz, eventInfos) -> eventInfos.removeIf(eventInfo -> eventInfo.getMethod().getDeclaringClass() == event));
79+
}
80+
81+
@Override
82+
public void register(EventHandler handler, Method method, Object instance) {
83+
debug("Registering method " + method.getName() + " in class " + method.getDeclaringClass().getSimpleName() + " static: " + (instance == null));
84+
debug("Parameter types: " + Arrays.asList(method.getParameterTypes()).toString());
85+
if (method.getParameterTypes().length != 1) {
86+
throw new IllegalArgumentException("Method " + method.getName() + " must have one parameter");
87+
}
88+
//check if parameter implements Event
89+
if (!Event.class.isAssignableFrom(method.getParameterTypes()[0])) {
90+
throw new IllegalArgumentException("Method " + method.getName() + " must have one parameter that implements Event");
91+
}
92+
Class<? extends Event> type = (Class<? extends Event>) method.getParameterTypes()[0];
93+
List<EventInfo> eventInfos = listeners.get(method.getParameterTypes()[0]);
94+
if (eventInfos == null || eventInfos.isEmpty()) {
95+
debug("eventInfos is null or empty");
96+
if (eventInfos == null)
97+
eventInfos = settings.useConcurrentArrayList ? new CopyOnWriteArrayList<>() : new ArrayList<>();
98+
} else {
99+
for (EventInfo eventInfo : eventInfos) { //TODO: Still slightly buggy, but shouldn't be a problem unless you're intentionally registering the same class as a class and instance, and the class has both static and instance event handlers
100+
//check if method is already registered
101+
if (eventInfo.getMethod().equals(method)) {
102+
debug("Method " + method.getName() + " is already registered");
103+
return;
104+
}
105+
if (instance != null && Modifier.isStatic(eventInfo.getMethod().getModifiers())) {
106+
//check if parent class is the same
107+
if (eventInfo.getMethod().getDeclaringClass().equals(method.getDeclaringClass())) {
108+
debug("Method " + method.getName() + " is already registered, ignoring");
109+
return;
110+
}
111+
}
112+
}
113+
}
114+
EventInfo info = new EventInfo(method, type, handler.priority(), handler, instance);
115+
debug("Adding event info " + info.toString());
116+
eventInfos.add(info);
117+
sort(eventInfos);
118+
listeners.put(type, eventInfos);
119+
}
120+
121+
@Override
122+
public void call(Event event) {
123+
debug("Calling event " + event.getClass().getSimpleName());
124+
/*
125+
listeners.forEach((type, eventInfos) -> {
126+
if (event.getClass().isAssignableFrom(type)) {
127+
eventInfos.forEach(eventInfo -> {
128+
129+
});
130+
}
131+
});
132+
*/
133+
List<EventInfo> eventInfos = listeners.get(event.getClass());
134+
if (eventInfos == null || eventInfos.isEmpty()) {
135+
debug("No listeners for event " + event.getClass().getSimpleName());
136+
return;
137+
}
138+
for (EventInfo eventInfo : listeners.get(event.getClass())) {
139+
try {
140+
boolean cancellable = event instanceof Cancellable;
141+
if (cancellable && ((Cancellable) event).isCancelled()) {
142+
if (eventInfo.getListenerAnnotation().ignoreCancelled()) {
143+
return;
144+
}
145+
}
146+
eventInfo.getMethod().setAccessible(true);
147+
eventInfo.getMethod().invoke(eventInfo.getInstance(), event);
148+
} catch (InvocationTargetException | IllegalAccessException e) {
149+
logger.error("Error passing event to method " + eventInfo.getMethod().getName() + " in class " + eventInfo.getInstance().getClass().getName());
150+
e.printStackTrace();
151+
}
152+
}
153+
}
154+
155+
private void sort(List<EventInfo> eventInfos) {
156+
//sort by priority, smallest to largest
157+
eventInfos.sort((o1, o2) -> {
158+
if (o1.getPriority() == o2.getPriority()) {
159+
return 0;
160+
}
161+
return o1.getPriority() < o2.getPriority() ? -1 : 1;
162+
});
163+
Collections.reverse(eventInfos);
164+
}
165+
166+
private void debug(String message) {
167+
if (settings.isDebugMessages()) {
168+
logger.debug(message);
169+
}
170+
}
171+
172+
@Getter
173+
public static class EventBusSettings {
174+
private boolean useConcurrentHashMap = true,useConcurrentArrayList = true, debugMessages = false;
175+
private Logger logger = new DefaultLogger();
176+
177+
public EventBusSettings setUseConcurrentHashMap(boolean useConcurrentHashMap) {
178+
this.useConcurrentHashMap = useConcurrentHashMap;
179+
return this;
180+
}
181+
public EventBusSettings setUseConcurrentArrayList(boolean use) {
182+
this.useConcurrentArrayList = use;
183+
return this;
184+
}
185+
186+
public EventBusSettings setLogger(Logger logger) {
187+
this.logger = logger;
188+
return this;
189+
}
190+
191+
public EventBusSettings setDebugMessages(boolean debugMessages) {
192+
this.debugMessages = debugMessages;
193+
return this;
194+
}
195+
}
196+
197+
public interface Logger {
198+
void log(String message);
199+
200+
void debug(String message);
201+
202+
void error(String message);
203+
}
204+
205+
public static class DefaultLogger implements Logger {
206+
@Override
207+
public void debug(String message) {
208+
log("[Debug] " + message);
209+
}
210+
211+
@Override
212+
public void log(String message) {
213+
System.out.println("[Lightning] " + message);
214+
}
215+
216+
@Override
217+
public void error(String message) {
218+
System.err.println("[Lightning] " + message);
219+
}
220+
}
221+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package dev.hyperskys.itemmanager.eventbus;
2+
3+
public class Lightning {
4+
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package dev.hyperskys.itemmanager.eventbus.annotation;
2+
3+
import dev.hyperskys.itemmanager.eventbus.event.EventPriority;
4+
import java.lang.annotation.ElementType;
5+
import java.lang.annotation.Retention;
6+
import java.lang.annotation.RetentionPolicy;
7+
import java.lang.annotation.Target;
8+
9+
@Target(ElementType.METHOD)
10+
@Retention(RetentionPolicy.RUNTIME)
11+
public @interface EventHandler {
12+
int priority() default EventPriority.NORMAL;
13+
14+
/**
15+
* if true, don't call the event handler if the event is cancelled
16+
* @return
17+
*/
18+
boolean ignoreCancelled() default false;
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package dev.hyperskys.itemmanager.eventbus.event;
2+
3+
public interface Cancellable {
4+
boolean isCancelled();
5+
6+
void setCancelled(boolean cancelled);
7+
8+
class DefaultCancellable implements Cancellable {
9+
private boolean cancelled = false;
10+
11+
@Override
12+
public boolean isCancelled() {
13+
return cancelled;
14+
}
15+
16+
@Override
17+
public void setCancelled(boolean cancelled) {
18+
this.cancelled = cancelled;
19+
}
20+
}
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package dev.hyperskys.itemmanager.eventbus.event;
2+
3+
public interface Event {
4+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package dev.hyperskys.itemmanager.eventbus.event;
2+
3+
public class EventPriority {
4+
public static final int
5+
HIGHEST = 200,
6+
HIGH = 100,
7+
NORMAL = 0,
8+
LOW = -100,
9+
LOWEST = -200;
10+
}

0 commit comments

Comments
 (0)