Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
259 changes: 249 additions & 10 deletions src/main/java/net/earthmc/emcapi/manager/GUIManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.text.format.TextDecoration;
import net.kyori.adventure.text.event.ClickEvent;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
Expand Down Expand Up @@ -226,20 +227,258 @@ public MenuInventory createAuthMenu(Player player) {

public MenuInventory createHelpMenu(Player player) {
MenuInventory.Builder menu = MenuInventory.builder()
.title(Component.text("API Guide", NamedTextColor.GRAY, TextDecoration.BOLD))
.title(Component.text("API Guide", NamedTextColor.DARK_AQUA, TextDecoration.BOLD))
.rows(3);

MenuItem temp = MenuItem.builder(Material.BEDROCK)
.name(Component.text("Not ready", NamedTextColor.GRAY, TextDecoration.BOLD))
.lore(Component.text("This feature is still in development.", NamedTextColor.GRAY))

MenuItem generalHelp = MenuItem.builder(Material.BOOK)
.name(Component.text("General Info & Privacy", NamedTextColor.GOLD, TextDecoration.BOLD))
.lore(
Component.text("Learn what the API is and how your data is handled.", NamedTextColor.GRAY)
)
.slot(slot(1, 2))
.action(ClickAction.openSilent(() -> createGeneralInfoMenu(player)))
.build();

MenuItem endpointsHelp = MenuItem.builder(Material.ENDER_EYE)
.name(Component.text("Endpoints", NamedTextColor.AQUA, TextDecoration.BOLD))
.lore(
Component.text("Discover available API endpoints and features.", NamedTextColor.GRAY)
)
.slot(slot(1, 4))
.withGlint()
.action(ClickAction.openSilent(() -> createEndpointsMenu(player)))
.build();

menu.addItem(temp).addItem(createMainMenuButton(player));

MenuItem sseHelp = MenuItem.builder(Material.REPEATER)
.name(Component.text("SSE Events", NamedTextColor.RED, TextDecoration.BOLD))
.lore(
Component.text("Learn about real-time Server-Sent Events.", NamedTextColor.GRAY)
)
.slot(slot(1, 6))
.action(ClickAction.openSilent(() -> createSseEventsMenu(player)))
.build();

menu.addItem(generalHelp)
.addItem(endpointsHelp)
.addItem(sseHelp)
.addItem(createMainMenuButton(player));

return menu.build();
}


public MenuInventory createGeneralInfoMenu(Player player) {
MenuInventory.Builder menu = MenuInventory.builder()
.title(Component.text("General & Privacy", NamedTextColor.DARK_AQUA, TextDecoration.BOLD))
.rows(3);

MenuItem whatIsApi = MenuItem.builder(Material.KNOWLEDGE_BOOK)
.name(Component.text("What is an API?", NamedTextColor.GOLD, TextDecoration.BOLD))
.lore(
Component.text("An API (Application Programming Interface) allows external tools to read data.", NamedTextColor.GRAY)
)
.slot(slot(1, 2))
.build();

MenuItem useCases = MenuItem.builder(Material.ARMOR_STAND)
.name(Component.text("Use Cases", NamedTextColor.YELLOW, TextDecoration.BOLD))
.lore(
Component.text("The API can be used for Discord bots, maps, and more.", NamedTextColor.GRAY)
)
.slot(slot(1, 4))
.build();

MenuItem privacy = MenuItem.builder(Material.SHIELD)
.name(Component.text("Privacy", NamedTextColor.GREEN, TextDecoration.BOLD))
.lore(
Component.text("Learn how your data is handled and what information may be exposed.", NamedTextColor.GRAY),
Component.text("", NamedTextColor.GRAY),
Component.text("Click to read the Privacy Policy!", NamedTextColor.YELLOW)
)
.slot(slot(1, 6))
.action(click -> {
player.closeInventory();
player.sendMessage(
Component.text("Privacy Policy: ", NamedTextColor.GRAY)
.append(
Component.text(
"https://earthmc.net/privacy",
NamedTextColor.AQUA,
TextDecoration.UNDERLINED
).clickEvent(ClickEvent.openUrl("https://earthmc.net/privacy"))
)
);
})
.build();

menu.addItem(whatIsApi)
.addItem(useCases)
.addItem(privacy)
.addItem(createReturnToHelpMenuButton(player));

return menu.build();
}

public MenuInventory createEndpointsMenu(Player player) {
MenuInventory.Builder menu = MenuInventory.builder()
.title(Component.text("API Endpoints", NamedTextColor.DARK_AQUA, TextDecoration.BOLD))
.rows(3);

MenuItem players = MenuItem.builder(Material.PLAYER_HEAD)
.name(Component.text("Players Endpoint", NamedTextColor.AQUA, TextDecoration.BOLD))
.lore(
Component.text("Provides information about residents, similar to /res.", NamedTextColor.GRAY),
Component.text("", NamedTextColor.GRAY),
Component.text("Click to open documentation!", NamedTextColor.YELLOW)
)
.slot(slot(1, 1))
.action(click -> {
player.closeInventory();
player.sendMessage(
Component.text("Players API Docs: ", NamedTextColor.GRAY)
.append(
Component.text(
"https://earthmc.net/docs/api#players",
NamedTextColor.AQUA,
TextDecoration.UNDERLINED
).clickEvent(ClickEvent.openUrl("https://earthmc.net/docs/api#players"))
)
);
})
.build();

MenuItem townsNations = MenuItem.builder(Material.FILLED_MAP)
.name(Component.text("Towns & Nations", NamedTextColor.GREEN, TextDecoration.BOLD))
.lore(
Component.text("Provides detailed information about towns and nations.", NamedTextColor.GRAY),
Component.text("", NamedTextColor.GRAY),
Component.text("Click to open documentation!", NamedTextColor.YELLOW)
)
.slot(slot(1, 3))
.action(click -> {
player.closeInventory();
player.sendMessage(
Component.text("Towns & Nations Docs: ", NamedTextColor.GRAY)
.append(
Component.text(
"https://earthmc.net/docs/api",
NamedTextColor.AQUA,
TextDecoration.UNDERLINED
).clickEvent(ClickEvent.openUrl("https://earthmc.net/docs/api"))
)
);
})
.build();

MenuItem shops = MenuItem.builder(Material.CHEST)
.name(Component.text("Shop Endpoint", NamedTextColor.GOLD, TextDecoration.BOLD))
.lore(
Component.text("Provides information about player-owned QuickShops.", NamedTextColor.GRAY),
Component.text("", NamedTextColor.GRAY),
Component.text("Click to open documentation!", NamedTextColor.YELLOW)
)
.slot(slot(1, 5))
.action(click -> {
player.closeInventory();
player.sendMessage(
Component.text("Shop API Docs: ", NamedTextColor.GRAY)
.append(
Component.text(
"https://earthmc.net/docs/api#quickshops",
NamedTextColor.AQUA,
TextDecoration.UNDERLINED
).clickEvent(ClickEvent.openUrl("https://earthmc.net/docs/api#quickshops"))
)
);
})
.build();

MenuItem other = MenuItem.builder(Material.WRITTEN_BOOK)
.name(Component.text("Other Endpoints", NamedTextColor.LIGHT_PURPLE, TextDecoration.BOLD))
.lore(
Component.text("Explore additional endpoints such as Location and mcMMO.", NamedTextColor.GRAY),
Component.text("", NamedTextColor.GRAY),
Component.text("Click to open documentation!", NamedTextColor.YELLOW)
)
.slot(slot(1, 7))
.action(click -> {
player.closeInventory();
player.sendMessage(
Component.text("Full API Documentation: ", NamedTextColor.GRAY)
.append(
Component.text(
"https://earthmc.net/docs/api",
NamedTextColor.AQUA,
TextDecoration.UNDERLINED
).clickEvent(ClickEvent.openUrl("https://earthmc.net/docs/api"))
)
);
})
.build();

menu.addItem(players)
.addItem(townsNations)
.addItem(shops)
.addItem(other)
.addItem(createReturnToHelpMenuButton(player));

return menu.build();
}

public MenuInventory createSseEventsMenu(Player player) {
MenuInventory.Builder menu = MenuInventory.builder()
.title(Component.text("SSE Events", NamedTextColor.DARK_AQUA, TextDecoration.BOLD))
.rows(3);

MenuItem aboutSse = MenuItem.builder(Material.COMPARATOR)
.name(Component.text("What are SSE Events?", NamedTextColor.GOLD, TextDecoration.BOLD))
.lore(
Component.text("Server-Sent Events (SSE) allow the server to send real-time updates.", NamedTextColor.GRAY),
Component.text("", NamedTextColor.GRAY),
Component.text("Useful for receiving events without repeatedly polling the API.", NamedTextColor.GRAY)
)
.slot(slot(1, 3))
.build();

MenuItem sseDocs = MenuItem.builder(Material.PAPER)
.name(Component.text("SSE Documentation", NamedTextColor.AQUA, TextDecoration.BOLD))
.lore(
Component.text("Learn how to connect to SSE and listen for specific events.", NamedTextColor.GRAY),
Component.text("", NamedTextColor.GRAY),
Component.text("Click to open documentation!", NamedTextColor.YELLOW)
)
.slot(slot(1, 5))
.action(click -> {
player.closeInventory();
player.sendMessage(
Component.text("SSE API Docs: ", NamedTextColor.GRAY)
.append(
Component.text(
"https://earthmc.net/docs/api#server-sent-events-sse",
NamedTextColor.AQUA,
TextDecoration.UNDERLINED
).clickEvent(ClickEvent.openUrl("https://earthmc.net/docs/api#server-sent-events-sse"))
)
);
})
.build();

menu.addItem(aboutSse)
.addItem(sseDocs)
.addItem(createReturnToHelpMenuButton(player));

return menu.build();
}

private MenuItem createReturnToHelpMenuButton(Player player) {
return MenuItem.builder(Material.ARROW)
.name(Component.text("Back to API Guide", NamedTextColor.RED, TextDecoration.BOLD))
.lore(
Component.text("Return to the API Guide menu.", NamedTextColor.GRAY)
)
.slot(slot(2, 4))
.action(ClickAction.openSilent(() -> createHelpMenu(player)))
.build();
}

private MenuItem createMainMenuButton(Player player) {
return MenuItem.builder(Material.BARRIER)
.name(Component.text("Main Menu", NamedTextColor.GREEN, TextDecoration.BOLD))
Expand All @@ -248,7 +487,7 @@ private MenuItem createMainMenuButton(Player player) {
.slot(SlotAnchor.bottomRight())
.build();
}

private MenuItem createBackButton(Supplier<MenuInventory> supplier) {
return MenuItem.builder(Material.BARRIER)
.name(Component.text("Back", NamedTextColor.RED, TextDecoration.BOLD))
Expand Down