Skip to content

Commit

Permalink
feat: Add GIStateUpdateWSMessage for guild map data relay
Browse files Browse the repository at this point in the history
fix: NPE in guild map data relay
  • Loading branch information
Lotnest committed Mar 5, 2025
1 parent 3f645cd commit 40d0181
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 43 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/*
* Copyright © sequoia-mod 2025.
* This file is released under LGPLv3. See LICENSE for full license details.
*/
package dev.lotnest.sequoia.core.ws.message.ws;

import static dev.lotnest.sequoia.core.ws.WSConstants.GSON;

import blue.endless.jankson.annotation.SerializedName;
import dev.lotnest.sequoia.core.ws.message.IStateOpCode;
import dev.lotnest.sequoia.core.ws.message.WSMessage;
import dev.lotnest.sequoia.core.ws.type.WSMessageType;

public class GIStateUpdateWSMessage extends WSMessage {
public GIStateUpdateWSMessage(Data data) {
super(WSMessageType.G_I_STATE_UPDATE.getValue(), GSON.toJsonTree(data));
}

public record Data(@SerializedName("state_data") IStateOpCode iStateOpCode) {}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ public enum WSMessageType {
G_CHAT_MESSAGE,
G_CLIENT_COMMAND,
G_RAID_SUBMISSION,
GI_STATE_UPDATE,
G_I_STATE_UPDATE,
NOT_IMPLEMENTED_1,
G_IDENTIFY,
NOT_IMPLEMENTED_2,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,6 @@ public void onChatMessageReceived(ChatMessageReceivedEvent event) {
GChatMessageWSMessage gChatMessageWSMessage = new GChatMessageWSMessage(new GChatMessageWSMessage.Data(
username, nickname, message, TimeUtils.wsTimestamp(), McUtils.playerName()));
SequoiaMod.getWebSocketFeature().sendMessage(gChatMessageWSMessage);
SequoiaMod.debug("Sending guild chat message to Discord: " + gChatMessageWSMessage);
}
} catch (Exception exception) {
SequoiaMod.error("Failed to send guild chat message to Discord", exception);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,11 @@
import dev.lotnest.sequoia.SequoiaMod;
import dev.lotnest.sequoia.core.consumers.features.Feature;
import dev.lotnest.sequoia.core.events.GuildRaidCompletedEvent;
import dev.lotnest.sequoia.core.ws.message.WSMessage;
import dev.lotnest.sequoia.core.ws.message.ws.GuildRaidWSMessage;
import net.minecraft.ChatFormatting;
import net.minecraft.network.chat.Component;
import net.neoforged.bus.api.EventPriority;
import net.neoforged.bus.api.SubscribeEvent;
import org.apache.commons.lang3.StringUtils;

public class GuildRaidTrackerFeature extends Feature {
@SubscribeEvent(priority = EventPriority.HIGHEST)
Expand Down Expand Up @@ -46,11 +44,8 @@ private void sendGuildRaidCompletionReport(GuildRaid guildRaid) {
}

try {
WSMessage guildRaidWSMessage = new GuildRaidWSMessage(guildRaid);
String payload = SequoiaMod.getWebSocketFeature().sendMessage(guildRaidWSMessage);
if (StringUtils.isNotBlank(payload)) {
SequoiaMod.debug("Sending Guild Raid completion: " + payload);
}
GuildRaidWSMessage guildRaidWSMessage = new GuildRaidWSMessage(guildRaid);
SequoiaMod.getWebSocketFeature().sendMessage(guildRaidWSMessage);
} catch (Exception exception) {
SequoiaMod.error("Failed to send Guild Raid completion report", exception);
McUtils.sendMessageToClient(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,10 @@
import dev.lotnest.sequoia.SequoiaMod;
import dev.lotnest.sequoia.core.consumers.features.Feature;
import dev.lotnest.sequoia.core.ws.message.istateopcodes.GuildMapDataIStateOpCode;
import dev.lotnest.sequoia.core.ws.message.ws.GIStateUpdateWSMessage;
import java.time.OffsetDateTime;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
Expand All @@ -23,29 +25,35 @@ public GuildMapDataRelayerFeature() {
.scheduleAtFixedRate(this::relayGuildMapData, 0, 10, TimeUnit.MINUTES);
}

private void relayGuildMapData() {
if (!isEnabled()) {
return;
}
public void relayGuildMapData() {
try {
SequoiaMod.debug("Checking if guild map data relay is possible");

if (!Models.Character.hasCharacter()) {
return;
}
if (!isEnabled()) return;
if (!Models.Character.hasCharacter()) return;

doRelayGuildMapData();
doRelayGuildMapData();
} catch (Exception exception) {
SequoiaMod.error("Failed to relay guild map data", exception);
}
}

private void doRelayGuildMapData() {
SequoiaMod.debug("Gathering guild map data for relay");

Map<String, GuildMapDataIStateOpCode.Data.TerritoryData> territoryDataMap =
Models.Territory.getTerritoryPoisFromAdvancement().stream()
.filter(Objects::nonNull)
.map(this::mapToFriendlyTerritoryNameTerritoryDataPair)
.collect(Collectors.toMap(Pair::getKey, Pair::getValue));

GuildMapDataIStateOpCode.Data guildMapDataIStateOpCodeData =
new GuildMapDataIStateOpCode.Data(territoryDataMap, OffsetDateTime.now());
GuildMapDataIStateOpCode guildMapDataIStateOpCode = new GuildMapDataIStateOpCode(guildMapDataIStateOpCodeData);
GIStateUpdateWSMessage giStateUpdateWSMessage =
new GIStateUpdateWSMessage(new GIStateUpdateWSMessage.Data(guildMapDataIStateOpCode));

SequoiaMod.getWebSocketFeature().sendMessage(guildMapDataIStateOpCode);
SequoiaMod.getWebSocketFeature().sendMessage(giStateUpdateWSMessage);
}

private Pair<String, GuildMapDataIStateOpCode.Data.TerritoryData> mapToFriendlyTerritoryNameTerritoryDataPair(
Expand All @@ -58,33 +66,29 @@ private Pair<String, GuildMapDataIStateOpCode.Data.TerritoryData> mapToFriendlyT
(byte) territoryPoi.getTerritoryInfo().getTreasury().getLevel(),
new GuildMapDataIStateOpCode.Data.TerritoryData.Stored(
territoryPoi.getTerritoryInfo().getGuildName(),
territoryPoi
.getTerritoryInfo()
.getStorage(GuildResource.EMERALDS)
.current(),
territoryPoi
.getTerritoryInfo()
.getStorage(GuildResource.ORE)
.current(),
territoryPoi
.getTerritoryInfo()
.getStorage(GuildResource.WOOD)
.current(),
territoryPoi
.getTerritoryInfo()
.getStorage(GuildResource.CROPS)
.current(),
territoryPoi
.getTerritoryInfo()
.getStorage(GuildResource.FISH)
.current()),
getStorageSafe(territoryPoi, GuildResource.EMERALDS),
getStorageSafe(territoryPoi, GuildResource.ORE),
getStorageSafe(territoryPoi, GuildResource.WOOD),
getStorageSafe(territoryPoi, GuildResource.CROPS),
getStorageSafe(territoryPoi, GuildResource.FISH)),
new GuildMapDataIStateOpCode.Data.TerritoryData.Generation(
territoryPoi.getTerritoryInfo().getGuildName(),
territoryPoi.getTerritoryInfo().getGeneration(GuildResource.EMERALDS),
territoryPoi.getTerritoryInfo().getGeneration(GuildResource.ORE),
territoryPoi.getTerritoryInfo().getGeneration(GuildResource.WOOD),
territoryPoi.getTerritoryInfo().getGeneration(GuildResource.CROPS),
territoryPoi.getTerritoryInfo().getGeneration(GuildResource.FISH))));
getGenerationSafe(territoryPoi, GuildResource.EMERALDS),
getGenerationSafe(territoryPoi, GuildResource.ORE),
getGenerationSafe(territoryPoi, GuildResource.WOOD),
getGenerationSafe(territoryPoi, GuildResource.CROPS),
getGenerationSafe(territoryPoi, GuildResource.FISH))));
}

private int getStorageSafe(TerritoryPoi territoryPoi, GuildResource resource) {
return territoryPoi.getTerritoryInfo().getStorage(resource) != null
? territoryPoi.getTerritoryInfo().getStorage(resource).current()
: 0;
}

private int getGenerationSafe(TerritoryPoi territoryPoi, GuildResource resource) {
Integer generation = territoryPoi.getTerritoryInfo().getGeneration(resource);
return generation != null ? generation : 0;
}

@Override
Expand Down

0 comments on commit 40d0181

Please sign in to comment.