diff --git a/common/src/main/java/org/geysermc/floodgate/news/NewsType.java b/common/src/main/java/org/geysermc/floodgate/news/NewsType.java index c2848535e..8976cc6b6 100644 --- a/common/src/main/java/org/geysermc/floodgate/news/NewsType.java +++ b/common/src/main/java/org/geysermc/floodgate/news/NewsType.java @@ -26,15 +26,15 @@ package org.geysermc.floodgate.news; import com.google.gson.JsonObject; -import org.geysermc.floodgate.news.data.BuildSpecificData; -import org.geysermc.floodgate.news.data.CheckAfterData; -import org.geysermc.floodgate.news.data.ItemData; +import org.geysermc.floodgate.news.data.*; import java.util.function.Function; public enum NewsType { BUILD_SPECIFIC(BuildSpecificData::read), - CHECK_AFTER(CheckAfterData::read); + CHECK_AFTER(CheckAfterData::read), + ANNOUNCEMENT(AnnouncementData::read), + CONFIG_SPECIFIC(ConfigSpecificData::read); private static final NewsType[] VALUES = values(); diff --git a/common/src/main/java/org/geysermc/floodgate/news/data/AnnouncementData.java b/common/src/main/java/org/geysermc/floodgate/news/data/AnnouncementData.java new file mode 100644 index 000000000..5cc574a57 --- /dev/null +++ b/common/src/main/java/org/geysermc/floodgate/news/data/AnnouncementData.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2019-2021 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.floodgate.news.data; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; + +import java.util.HashSet; +import java.util.Set; + +public final class AnnouncementData implements ItemData { + private final Set including = new HashSet<>(); + private final Set excluding = new HashSet<>(); + + private AnnouncementData() {} + + public static AnnouncementData read(JsonObject data) { + AnnouncementData announcementData = new AnnouncementData(); + + if (data.has("including")) { + JsonArray including = data.getAsJsonArray("including"); + for (JsonElement element : including) { + announcementData.including.add(element.getAsString()); + } + } + + if (data.has("excluding")) { + JsonArray including = data.getAsJsonArray("excluding"); + for (JsonElement element : including) { + announcementData.excluding.add(element.getAsString()); + } + } + return announcementData; + } + + public boolean isAffected(String project) { + return !excluding.contains(project) && (including.isEmpty() || including.contains(project)); + } +} diff --git a/common/src/main/java/org/geysermc/floodgate/news/data/BuildSpecificData.java b/common/src/main/java/org/geysermc/floodgate/news/data/BuildSpecificData.java index d415f4200..f13d5fd7b 100644 --- a/common/src/main/java/org/geysermc/floodgate/news/data/BuildSpecificData.java +++ b/common/src/main/java/org/geysermc/floodgate/news/data/BuildSpecificData.java @@ -34,6 +34,8 @@ public final class BuildSpecificData implements ItemData { private int affectedGreaterThan; private int affectedLessThan; + private BuildSpecificData() {} + public static BuildSpecificData read(JsonObject data) { BuildSpecificData updateData = new BuildSpecificData(); updateData.branch = data.get("branch").getAsString(); diff --git a/common/src/main/java/org/geysermc/floodgate/news/data/CheckAfterData.java b/common/src/main/java/org/geysermc/floodgate/news/data/CheckAfterData.java index 92d01689b..2545a97da 100644 --- a/common/src/main/java/org/geysermc/floodgate/news/data/CheckAfterData.java +++ b/common/src/main/java/org/geysermc/floodgate/news/data/CheckAfterData.java @@ -27,9 +27,11 @@ package org.geysermc.floodgate.news.data; import com.google.gson.JsonObject; -public class CheckAfterData implements ItemData { +public final class CheckAfterData implements ItemData { private long checkAfter; + private CheckAfterData() {} + public static CheckAfterData read(JsonObject data) { CheckAfterData checkAfterData = new CheckAfterData(); checkAfterData.checkAfter = data.get("check_after").getAsLong(); diff --git a/common/src/main/java/org/geysermc/floodgate/news/data/ConfigSpecificData.java b/common/src/main/java/org/geysermc/floodgate/news/data/ConfigSpecificData.java new file mode 100644 index 000000000..8d05c93db --- /dev/null +++ b/common/src/main/java/org/geysermc/floodgate/news/data/ConfigSpecificData.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2019-2021 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.floodgate.news.data; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; + +import java.util.HashMap; +import java.util.Map; +import java.util.regex.Pattern; + +public final class ConfigSpecificData implements ItemData { + private final Map affectedKeys = new HashMap<>(); + + private ConfigSpecificData() {} + + public static ConfigSpecificData read(JsonObject data) { + ConfigSpecificData configSpecificData = new ConfigSpecificData(); + + JsonArray entries = data.getAsJsonArray("entries"); + for (JsonElement element : entries) { + JsonObject entry = element.getAsJsonObject(); + String key = entry.get("key").getAsString(); + String pattern = entry.get("pattern").getAsString(); + configSpecificData.affectedKeys.put(key, Pattern.compile(pattern)); + } + return configSpecificData; + } + + public boolean isAffected(Map config) { + for (Map.Entry entry : affectedKeys.entrySet()) { + if (config.containsKey(entry.getKey())) { + String value = config.get(entry.getKey()); + if (entry.getValue().matcher(value).matches()) { + return true; + } + } + } + return false; + } +} diff --git a/connector/src/main/java/org/geysermc/connector/utils/NewsHandler.java b/connector/src/main/java/org/geysermc/connector/utils/NewsHandler.java index c70255f52..6c5168dd2 100644 --- a/connector/src/main/java/org/geysermc/connector/utils/NewsHandler.java +++ b/connector/src/main/java/org/geysermc/connector/utils/NewsHandler.java @@ -35,6 +35,7 @@ import org.geysermc.connector.common.ChatColor; import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.floodgate.news.NewsItem; import org.geysermc.floodgate.news.NewsItemAction; +import org.geysermc.floodgate.news.data.AnnouncementData; import org.geysermc.floodgate.news.data.BuildSpecificData; import org.geysermc.floodgate.news.data.CheckAfterData; @@ -148,6 +149,11 @@ public class NewsHandler { } switch (item.getType()) { + case ANNOUNCEMENT: + if (!item.getDataAs(AnnouncementData.class).isAffected(Constants.NEWS_PROJECT_NAME)) { + return; + } + break; case BUILD_SPECIFIC: if (!item.getDataAs(BuildSpecificData.class).isAffected(branch, build)) { return; @@ -158,6 +164,9 @@ public class NewsHandler { long delayMs = System.currentTimeMillis() - checkAfter; schedule(delayMs > 0 ? delayMs : 0); break; + case CONFIG_SPECIFIC: + //todo implement + break; } activeNewsItems.put(item.getId(), item);