This commit is contained in:
sirjonasxx 2021-08-20 01:23:09 +02:00
parent c001c19b24
commit 0258dfaccc
9 changed files with 228 additions and 91 deletions

View File

@ -6,6 +6,7 @@ import gearth.services.internal_extensions.extensionstore.application.GExtension
import gearth.services.internal_extensions.extensionstore.application.entities.queriedoverviews.ByDateOverview; import gearth.services.internal_extensions.extensionstore.application.entities.queriedoverviews.ByDateOverview;
import gearth.services.internal_extensions.extensionstore.repository.StoreFetch; import gearth.services.internal_extensions.extensionstore.repository.StoreFetch;
import gearth.services.internal_extensions.extensionstore.repository.StoreRepository; import gearth.services.internal_extensions.extensionstore.repository.StoreRepository;
import javafx.application.HostServices;
@ExtensionInfo( @ExtensionInfo(
Title = "G-ExtensionStore", Title = "G-ExtensionStore",
@ -56,4 +57,9 @@ public class GExtensionStore extends ExtensionForm {
protected boolean canLeave() { protected boolean canLeave() {
return false; return false;
} }
@Override
public HostServices getHostServices() {
return super.getHostServices();
}
} }

View File

@ -22,7 +22,7 @@ public class GExtensionStoreLauncher extends InternalExtensionFormLauncher<GExte
stage.setMinWidth(420); stage.setMinWidth(420);
stage.setMinHeight(500); stage.setMinHeight(500);
stage.setWidth(550); stage.setWidth(530);
stage.setHeight(530); stage.setHeight(530);
stage.setScene(new Scene(root)); stage.setScene(new Scene(root));

View File

@ -122,9 +122,9 @@ public class GExtensionStoreController implements Initializable {
setOverview(true); setOverview(true);
} }
// private void reloadOverview(HOverview overview) { public void reloadOverview() {
// setOverview(true); setOverview(false);
// } }
private void popOverview() { private void popOverview() {
if (currentOverviews.size() > 1) { if (currentOverviews.size() > 1) {

View File

@ -1,19 +1,192 @@
package gearth.services.internal_extensions.extensionstore.application.entities.extensiondetails; package gearth.services.internal_extensions.extensionstore.application.entities.extensiondetails;
import gearth.services.internal_extensions.extensionstore.GExtensionStore; import gearth.services.internal_extensions.extensionstore.GExtensionStore;
import gearth.services.internal_extensions.extensionstore.application.GExtensionStoreController;
import gearth.services.internal_extensions.extensionstore.application.WebUtils;
import gearth.services.internal_extensions.extensionstore.application.entities.ContentItem; import gearth.services.internal_extensions.extensionstore.application.entities.ContentItem;
import gearth.services.internal_extensions.extensionstore.application.entities.HOverview;
import gearth.services.internal_extensions.extensionstore.repository.models.ExtCategory;
import gearth.services.internal_extensions.extensionstore.repository.models.StoreExtension; import gearth.services.internal_extensions.extensionstore.repository.models.StoreExtension;
import netscape.javascript.JSObject;
import org.apache.commons.io.IOUtils;
import org.json.JSONObject;
import java.io.IOException;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.stream.Collectors;
public class StoreExtensionDetailsItem implements ContentItem { public class StoreExtensionDetailsItem implements ContentItem {
private final StoreExtension storeExtension; private final static String HABBO_API_URL = "https://www.habbo{hotel}/api/public/users?name={user}";
private static final String OUTFIT_URL = "https://www.habbo.com/habbo-imaging/avatarimage?&figure={figureString}&direction=2&head_direction=2";
private static final Map<String, String> userToFigure = new HashMap<>();
public StoreExtensionDetailsItem(StoreExtension storeExtension) { private final HOverview parent;
private final StoreExtension storeExtension;
private GExtensionStore gExtensionStore = null;
private String avatarImageUrl = "";
private String id;
public StoreExtensionDetailsItem(StoreExtension storeExtension, HOverview parent) {
this.storeExtension = storeExtension; this.storeExtension = storeExtension;
this.parent = parent;
}
private void fetchLooks() {
StoreExtension.Author mainAuthor = storeExtension.getAuthors().get(0);
if (mainAuthor.getUsername() != null && mainAuthor.getHotel() != null) {
String key = mainAuthor.getName() + "\t" + mainAuthor.getHotel();
synchronized (userToFigure) {
if (userToFigure.containsKey(key)) {
avatarImageUrl = userToFigure.get(key);
}
else {
new Thread(() -> {
try {
JSONObject habboData = new JSONObject(IOUtils.toString(
new URL(HABBO_API_URL.replace("{hotel}", mainAuthor.getHotel()).replace("{user}",
mainAuthor.getUsername())).openStream(), StandardCharsets.UTF_8));
if (habboData.has("figureString")) {
avatarImageUrl = OUTFIT_URL.replace("{figureString}", habboData.getString("figureString"));
synchronized (userToFigure) {
userToFigure.put(key, avatarImageUrl);
}
if (gExtensionStore != null && gExtensionStore.getController().getCurrentOverview() == parent) {
gExtensionStore.getController().reloadOverview();
}
}
} catch (IOException ignore) {
}
}).start();
}
}
}
}
private String getContents() {
StringBuilder contentBuilder = new StringBuilder();
String descriptionQuoted = Arrays.stream(storeExtension.getDescription().split("\r\n|\r|\n"))
.map(s -> "> " + s + "\n").collect(Collectors.joining());
if (storeExtension.getReadme() != null) {
descriptionQuoted = descriptionQuoted + "> \n> --url:README-" + storeExtension.getReadme() + "\n";
}
contentBuilder
.append(String.format("*%s*", storeExtension.getTitle())).append(" - v").append(storeExtension.getVersion()).append("\n\n")
.append("*Description*\n").append(descriptionQuoted).append("\n \n")
.append("*Author(s):* ").append(storeExtension.getAuthors().stream().map(StoreExtension.Author::getName).collect(Collectors.joining(", "))).append("\n\n")
.append("*Categories:* ").append(storeExtension.getCategories().stream().map(ExtCategory::getName).collect(Collectors.joining(", "))).append("\n\n");
contentBuilder.append("*Technical information*").append("\n")
.append("> Language: ").append(storeExtension.getLanguage()).append("\n")
.append("> Source: --url:Click Here-").append(storeExtension.getSource()).append("\n")
.append("> Framework: ").append(storeExtension.getFramework().getFramework().getName()).append(" - v").append(storeExtension.getFramework().getVersion()).append("\n")
.append("> Systems: ").append(String.join(", ", storeExtension.getCompatibility().getSystems())).append("\n \n");
if (storeExtension.getFramework().getFramework().isInstallationRequired()) {
contentBuilder.append("Warning: the framework requires --url:additional installations-")
.append(storeExtension.getFramework().getFramework().getInstallationInstructions()).append(" !\n");
}
if (!storeExtension.isStable()) {
contentBuilder.append("Warning: this extension has been marked unstable!\n");
}
contentBuilder.append("\n*Screenshot: *").append("\n")
.append("--img:").append(gExtensionStore.getRepository().getResourceUrl(String.format("store/extensions/%s/screenshot.png", storeExtension.getTitle())));
return contentBuilder.toString();
}
public void openUrl(String url) {
gExtensionStore.getHostServices().showDocument(url);
}
private String contentsInHtml() {
String comment = WebUtils.escapeMessage(getContents());
List<String> lines = new ArrayList<>(Arrays.asList(comment.split("<br>")));
boolean isquoting = false;
boolean justEndedQuoting = false;
for (int i = 0; i < lines.size(); i++) {
String line = lines.get(i);
if (!isquoting && line.startsWith("&gt;")) {
isquoting = true;
line = "<div class=\"cbc_quote\">" + line.substring(line.startsWith("&gt; ") ? 5 : 4);
}
else if (isquoting && line.startsWith("&gt;")) {
line = line.substring(line.startsWith("&gt; ") ? 5 : 4);
}
else if (isquoting && !line.startsWith("&gt;")) {
justEndedQuoting = true;
isquoting = false;
String prev = lines.get(i - 1);
lines.set(i-1, prev.substring(0, prev.length() - 4) + "</div>");
}
if (justEndedQuoting && line.length() == 0) continue;
justEndedQuoting = false;
line = line.replaceAll("\\*([^*]*)\\*", "<b>$1</b>")
.replaceAll("_([^_<>]*)_", "<i>$1</i>")
.replaceAll("(^| |>)@([^ <>]*)($| |<)", "$1<u>$2</u>$3")
.replaceAll("--img:([^ ]*)", "<img src=\"$1\" alt=\"extension screenshot\">")
.replaceAll("--url:([^-]*)-(https?:[^ ]*)",
String.format("<a href=\"#\" onClick=\"%s.openUrl(&quot;$2&quot;)\">$1</a>", id));
// .replaceAll("([^\";])(https?:[^ ]*)",
// String.format("$1<a href=\"#\" onClick=\"%s.openUrl(&quot;$1&quot;)\">$2</a>", id));
lines.set(i, line + (i == lines.size() - 1 ? "" : "<br>"));
}
return String.join("", lines);
} }
@Override @Override
public void addHtml(int i, GExtensionStore gExtensionStore) { public void addHtml(int i, GExtensionStore gExtensionStore) {
this.gExtensionStore = gExtensionStore;
StoreExtension.Author mainAuthor = storeExtension.getAuthors().get(0);
fetchLooks();
id = "extdetail" + i + "_" + System.currentTimeMillis();
StringBuilder htmlBuilder = new StringBuilder()
.append("<div id=\"").append(id).append("\" class=\"comment_item content_item\">")
.append("<div class=\"comment_header\">")
.append("<div class=\"ch_timeago\">").append(WebUtils.elapsedSince(storeExtension.getUpdateDate())).append(" ago</div>")
.append("</div>")
.append("<div class=\"comment_body comment_open\">")
.append("<div class=\"cb_author\">")
.append("<div class=\"cba_name\">").append(WebUtils.escapeMessage(mainAuthor.getName())).append("</div>")
.append("<div class=\"cba_text\">").append(mainAuthor.getReputation()).append(" reputation</div>")
.append("<div class=\"cba_text\">").append(mainAuthor.getExtensionsCount()).append(" releases</div>")
.append("<div class=\"cba_look\"><img src=\"").append(avatarImageUrl).append("\" alt=\"\"></div>") // todo look
.append("</div>")
.append("<div class=\"cb_content\">").append(contentsInHtml()).append("</div>")
.append("</div>")
.append("</div>")
.append("<div class=\"comment_itemcontent_item\"></div>");
String forum = htmlBuilder.toString();
GExtensionStoreController c = gExtensionStore.getController();
c.getWebView().getEngine().executeScript("document.getElementById('" + c.getContentItemsContainer() + "').innerHTML += '" + forum + "';");
JSObject window = (JSObject) c.getWebView().getEngine().executeScript("window");
window.setMember(id, this);
} }
} }

View File

@ -59,8 +59,8 @@ public class StoreExtensionDetailsOverview extends HOverview {
@Override @Override
public String buttonText() { public String buttonText() {
int mode = mode(); int mode = mode();
return mode == 2 ? "Update" : "Install"; // return mode == 2 ? "Update" : "Install";
// return mode == 0 ? "Install" : (mode == 1 ? "Remove" : "Update"); return mode == 0 ? "Install" : (mode == 1 ? "Installed" : "Update");
} }
@Override @Override
@ -70,7 +70,7 @@ public class StoreExtensionDetailsOverview extends HOverview {
@Override @Override
public List<? extends ContentItem> getContentItems() { public List<? extends ContentItem> getContentItems() {
return Collections.singletonList(new StoreExtensionDetailsItem(extension)); return Collections.singletonList(new StoreExtensionDetailsItem(extension, this));
} }
@Override @Override

View File

@ -1,51 +0,0 @@
.thread_item {
-webkit-user-select: none;
min-height: 41px;
display: flex;
overflow: hidden;
white-space: nowrap;
}
.thread_item > div {
border-style: solid;
border-color: #bab8b4;
border-width: 0 0 0 1px;
}
.thread_settings {
flex: 0 1 auto;
display: flex;
flex-flow: column;
width: 20px;
min-width: 20px;
}
.thread_info {
flex: 1 1 auto;
min-width: 0;
padding-left: 3px;
padding-top: 2px;
}
.thread_msgs {
flex: 0 1 auto;
width: 140px;
min-width: 140px;
padding-left: 4px;
padding-top: 2px;
}
.thread_delete_report {
flex: 0 1 auto;
width: 50px;
min-width: 50px;
display: flex;
}

View File

@ -33,16 +33,16 @@
font-size: 13px; font-size: 13px;
margin: 7px 0 0 3px; margin: 7px 0 0 3px;
} }
.ch_index { /*.ch_index {*/
flex: 0 0 auto; /* flex: 0 0 auto;*/
color: white; /* color: white;*/
font-size: 13px; /* font-size: 13px;*/
margin: 7px 4px 0 0; /* margin: 7px 4px 0 0;*/
} /*}*/
.ch_buttons { /*.ch_buttons {*/
flex: 0 0 auto; /* flex: 0 0 auto;*/
display: flex; /* display: flex;*/
} /*}*/
@ -66,6 +66,13 @@
min-width: 0; min-width: 0;
} }
.cb_content img {
max-width: 450px;
border-width: 1px;
border-color: black;
border-style: solid;
}
.cbc_quote { .cbc_quote {
background-color: #cccccc; background-color: #cccccc;
margin: 3px 10px 3px 16px; margin: 3px 10px 3px 16px;
@ -87,16 +94,18 @@
margin: 8px 0 0 5px; margin: 8px 0 0 5px;
} }
.cba_messages { .cba_text {
flex: 0 0 auto; flex: 0 0 auto;
min-height: 15px; min-height: 15px;
font-size: 13px; font-size: 13px;
margin: 2px 0 0 5px; margin: 2px 0 0 5px;
color: #444;
} }
.cba_look { .cba_look {
margin: -17px 0 0 -7px; margin: -15px 0 0 -7px;
height: 0; height: 0;
} }
@ -109,23 +118,23 @@
background-color: #ffffff; background-color: #ffffff;
} }
.comment_unread > .cb_author { /*.comment_unread > .cb_author {*/
background-color: #c8eff8; /* background-color: #c8eff8;*/
} /*}*/
.comment_unread > .cb_content { /*.comment_unread > .cb_content {*/
background-color: #fef4da; /* background-color: #fef4da;*/
} /*}*/
.comment_hidden > .cb_author { /*.comment_hidden > .cb_author {*/
background-color: #d7d7cf; /* background-color: #d7d7cf;*/
} /*}*/
.comment_hidden > .cb_content { /*.comment_hidden > .cb_content {*/
background-color: #e9e9e0; /* background-color: #e9e9e0;*/
} /*}*/
.comment_staffhidden > .cb_author { /*.comment_staffhidden > .cb_author {*/
background-color: #fedfd3; /* background-color: #fedfd3;*/
} /*}*/
.comment_staffhidden > .cb_content { /*.comment_staffhidden > .cb_content {*/
background-color: #fdc6bb; /* background-color: #fdc6bb;*/
} /*}*/

View File

@ -11,6 +11,7 @@
min-height: 0; min-height: 0;
overflow-y: auto; overflow-y: auto;
overflow-x: hidden;
display: flex; display: flex;
flex-flow: column; flex-flow: column;

View File

@ -9,7 +9,6 @@
<link rel="stylesheet" href="css/buttons.css"> <link rel="stylesheet" href="css/buttons.css">
<link rel="stylesheet" href="css/content.css"> <link rel="stylesheet" href="css/content.css">
<link rel="stylesheet" href="css/category_overview.css">
<link rel="stylesheet" href="css/extension_overview.css"> <link rel="stylesheet" href="css/extension_overview.css">
<link rel="stylesheet" href="css/comments_overview.css"> <link rel="stylesheet" href="css/comments_overview.css">