forked from GeyserMC/Geyser
-
Notifications
You must be signed in to change notification settings - Fork 5
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
14 changed files
with
735 additions
and
20 deletions.
There are no files selected for viewing
139 changes: 139 additions & 0 deletions
139
common/src/main/java/org/geysermc/floodgate/news/NewsItem.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,139 @@ | ||
/* | ||
* 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; | ||
|
||
import com.google.gson.JsonElement; | ||
import com.google.gson.JsonObject; | ||
import org.geysermc.floodgate.news.data.ItemData; | ||
|
||
import java.util.Collections; | ||
import java.util.HashSet; | ||
import java.util.Set; | ||
|
||
public final class NewsItem { | ||
private final int id; | ||
private final String project; | ||
private final boolean active; | ||
private final NewsType type; | ||
private final ItemData data; | ||
private final boolean priority; | ||
private final String message; | ||
private final Set<NewsItemAction> actions; | ||
private final String url; | ||
|
||
private NewsItem(int id, String project, boolean active, NewsType type, ItemData data, | ||
boolean priority, String message, Set<NewsItemAction> actions, String url) { | ||
this.id = id; | ||
this.project = project; | ||
this.active = active; | ||
this.type = type; | ||
this.data = data; | ||
this.priority = priority; | ||
this.message = message; | ||
this.actions = Collections.unmodifiableSet(actions); | ||
this.url = url; | ||
} | ||
|
||
public static NewsItem readItem(JsonObject newsItem) { | ||
NewsType newsType = NewsType.getByName(newsItem.get("type").getAsString()); | ||
if (newsType == null) { | ||
return null; | ||
} | ||
|
||
JsonObject messageObject = newsItem.getAsJsonObject("message"); | ||
NewsItemMessage itemMessage = NewsItemMessage.getById(messageObject.get("id").getAsInt()); | ||
|
||
String message = "Received an unknown news message type. Please update"; | ||
if (itemMessage != null) { | ||
message = itemMessage.getFormattedMessage(messageObject.getAsJsonArray("args")); | ||
} | ||
|
||
Set<NewsItemAction> actions = new HashSet<>(); | ||
for (JsonElement actionElement : newsItem.getAsJsonArray("actions")) { | ||
NewsItemAction action = NewsItemAction.getByName(actionElement.getAsString()); | ||
if (action != null) { | ||
actions.add(action); | ||
} | ||
} | ||
|
||
return new NewsItem( | ||
newsItem.get("id").getAsInt(), | ||
newsItem.get("project").getAsString(), | ||
newsItem.get("active").getAsBoolean(), | ||
newsType, | ||
newsType.read(newsItem.getAsJsonObject("data")), | ||
newsItem.get("priority").getAsBoolean(), | ||
message, | ||
actions, | ||
newsItem.get("url").getAsString() | ||
); | ||
} | ||
|
||
public int getId() { | ||
return id; | ||
} | ||
|
||
public String getProject() { | ||
return project; | ||
} | ||
|
||
public boolean isActive() { | ||
return active; | ||
} | ||
|
||
public NewsType getType() { | ||
return type; | ||
} | ||
|
||
public ItemData getData() { | ||
return data; | ||
} | ||
|
||
@SuppressWarnings("unchecked") | ||
public <T extends ItemData> T getDataAs(Class<T> type) { | ||
return (T) data; | ||
} | ||
|
||
public boolean isPriority() { | ||
return priority; | ||
} | ||
|
||
public String getRawMessage() { | ||
return message; | ||
} | ||
|
||
public String getMessage() { | ||
return message + " See " + getUrl() + " for more information."; | ||
} | ||
|
||
public Set<NewsItemAction> getActions() { | ||
return actions; | ||
} | ||
|
||
public String getUrl() { | ||
return url; | ||
} | ||
} |
44 changes: 44 additions & 0 deletions
44
common/src/main/java/org/geysermc/floodgate/news/NewsItemAction.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
/* | ||
* 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; | ||
|
||
public enum NewsItemAction { | ||
ON_SERVER_STARTED, | ||
ON_OPERATOR_JOIN, | ||
BROADCAST_TO_CONSOLE, | ||
BROADCAST_TO_OPERATORS; | ||
|
||
private static final NewsItemAction[] VALUES = values(); | ||
|
||
public static NewsItemAction getByName(String actionName) { | ||
for (NewsItemAction type : VALUES) { | ||
if (type.name().equalsIgnoreCase(actionName)) { | ||
return type; | ||
} | ||
} | ||
return null; | ||
} | ||
} |
89 changes: 89 additions & 0 deletions
89
common/src/main/java/org/geysermc/floodgate/news/NewsItemMessage.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
/* | ||
* 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; | ||
|
||
import com.google.gson.JsonArray; | ||
|
||
// {} is used for things that have to be filled in by the server, | ||
// {@} is for things that have to be filled in by us | ||
public enum NewsItemMessage { | ||
UPDATE_AVAILABLE("There is an update available for {}. The newest version is: {}"), | ||
UPDATE_RECOMMENDED(UPDATE_AVAILABLE + ". Your version is quite old, updating is recommend."), | ||
UPDATE_HIGHLY_RECOMMENDED(UPDATE_AVAILABLE + ". We highly recommend updating because some important changes have been made."), | ||
UPDATE_ANCIENT_VERSION(UPDATE_AVAILABLE + ". You are running an ancient version, updating is recommended."), | ||
|
||
DOWNTIME_GENERIC("The {} is temporarily going down for maintenance soon."), | ||
DOWNTIME_WITH_START("The {} is temporarily going down for maintenance on {}."), | ||
DOWNTIME_TIMEFRAME(DOWNTIME_WITH_START + " The maintenance is expected to last till {}."); | ||
|
||
private static final NewsItemMessage[] VALUES = values(); | ||
|
||
private final String messageFormat; | ||
private final String[] messageSplitted; | ||
|
||
NewsItemMessage(String messageFormat) { | ||
this.messageFormat = messageFormat; | ||
this.messageSplitted = messageFormat.split(" "); | ||
} | ||
|
||
public static NewsItemMessage getById(int id) { | ||
return VALUES.length > id ? VALUES[id] : null; | ||
} | ||
|
||
public String getMessageFormat() { | ||
return messageFormat; | ||
} | ||
|
||
public String getFormattedMessage(JsonArray serverArguments) { | ||
int serverArgumentsIndex = 0; | ||
|
||
StringBuilder message = new StringBuilder(); | ||
for (String split : messageSplitted) { | ||
if (message.length() > 0) { | ||
message.append(' '); | ||
} | ||
|
||
String result = split; | ||
|
||
if (serverArgumentsIndex < serverArguments.size()) { | ||
String argument = serverArguments.get(serverArgumentsIndex).getAsString(); | ||
result = result.replace("{}", argument); | ||
if (!result.equals(split)) { | ||
serverArgumentsIndex++; | ||
} | ||
} | ||
|
||
message.append(result); | ||
} | ||
return message.toString(); | ||
} | ||
|
||
|
||
@Override | ||
public String toString() { | ||
return getMessageFormat(); | ||
} | ||
} |
59 changes: 59 additions & 0 deletions
59
common/src/main/java/org/geysermc/floodgate/news/NewsType.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
/* | ||
* 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; | ||
|
||
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 java.util.function.Function; | ||
|
||
public enum NewsType { | ||
BUILD_SPECIFIC(BuildSpecificData::read), | ||
CHECK_AFTER(CheckAfterData::read); | ||
|
||
private static final NewsType[] VALUES = values(); | ||
|
||
private final Function<JsonObject, ? extends ItemData> readFunction; | ||
|
||
NewsType(Function<JsonObject, ? extends ItemData> readFunction) { | ||
this.readFunction = readFunction; | ||
} | ||
|
||
public static NewsType getByName(String newsType) { | ||
for (NewsType type : VALUES) { | ||
if (type.name().equalsIgnoreCase(newsType)) { | ||
return type; | ||
} | ||
} | ||
return null; | ||
} | ||
|
||
public ItemData read(JsonObject data) { | ||
return readFunction.apply(data); | ||
} | ||
} |
60 changes: 60 additions & 0 deletions
60
common/src/main/java/org/geysermc/floodgate/news/data/BuildSpecificData.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
/* | ||
* 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.JsonObject; | ||
|
||
public final class BuildSpecificData implements ItemData { | ||
private String branch; | ||
|
||
private boolean allAffected; | ||
private int affectedGreaterThan; | ||
private int affectedLessThan; | ||
|
||
public static BuildSpecificData read(JsonObject data) { | ||
BuildSpecificData updateData = new BuildSpecificData(); | ||
updateData.branch = data.get("branch").getAsString(); | ||
|
||
JsonObject affectedBuilds = data.getAsJsonObject("affected_builds"); | ||
if (affectedBuilds.has("all")) { | ||
updateData.allAffected = affectedBuilds.get("all").getAsBoolean(); | ||
} | ||
if (!updateData.allAffected) { | ||
updateData.affectedGreaterThan = affectedBuilds.get("gt").getAsInt(); | ||
updateData.affectedLessThan = affectedBuilds.get("lt").getAsInt(); | ||
} | ||
return updateData; | ||
} | ||
|
||
public boolean isAffected(String branch, int buildId) { | ||
return this.branch.equals(branch) && | ||
(allAffected || buildId > affectedGreaterThan && buildId < affectedLessThan); | ||
} | ||
|
||
public String getBranch() { | ||
return branch; | ||
} | ||
} |
Oops, something went wrong.