13
0

NodeMember: SchematicSystem #137

Zusammengeführt
Chaoscaot hat 4 Commits von nodemember nach master 2023-01-17 18:14:10 +01:00 zusammengeführt
4 geänderte Dateien mit 162 neuen und 137 gelöschten Zeilen
Nur Änderungen aus Commit 6dde2cf3fc werden angezeigt - Alle Commits anzeigen

Datei anzeigen

@ -1,24 +1,25 @@
/* /*
This file is a part of the SteamWar software. This file is a part of the SteamWar software.
Copyright (C) 2020 SteamWar.de-Serverteam Copyright (C) 2023 SteamWar.de-Serverteam
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.schematicsystem; package de.steamwar.schematicsystem;
import de.steamwar.sql.EffectiveSchematicNode;
import de.steamwar.sql.SchematicNode; import de.steamwar.sql.SchematicNode;
import de.steamwar.sql.SteamwarUser; import de.steamwar.sql.SteamwarUser;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
@ -32,8 +33,8 @@ public class SafeSchematicNode {
return Result.NOT_OWNER; return Result.NOT_OWNER;
} }
if(newParent == null) { if(newParent == null) {
if(SchematicNode.getSchematicsAccessibleByUser(user.getId(), 0) if(EffectiveSchematicNode.list(user, 0)
.stream().map(SchematicNode::getName).anyMatch(s -> s.equalsIgnoreCase(node.getName()))) { .stream().map(EffectiveSchematicNode::getNodeName).anyMatch(s -> s.equalsIgnoreCase(node.getName()))) {
return Result.ALREADY_IN_DIRECTORY; return Result.ALREADY_IN_DIRECTORY;
} }
@ -43,8 +44,8 @@ public class SafeSchematicNode {
return Result.NOT_A_DIR; return Result.NOT_A_DIR;
} }
if(SchematicNode.getSchematicsAccessibleByUser(user.getId(), newParent.getId()) if(EffectiveSchematicNode.list(user, newParent.getId())
.stream().map(SchematicNode::getName).anyMatch(s -> s.equalsIgnoreCase(node.getName()))) { .stream().map(EffectiveSchematicNode::getNodeName).anyMatch(s -> s.equalsIgnoreCase(node.getName()))) {
return Result.ALREADY_IN_DIRECTORY; return Result.ALREADY_IN_DIRECTORY;
} }
@ -62,7 +63,7 @@ public class SafeSchematicNode {
return Result.INVALID_NAME; return Result.INVALID_NAME;
} }
if(SchematicNode.getSchematicsAccessibleByUser(user.getId(), node.getParent()).stream().map(SchematicNode::getName).anyMatch(s -> s.equalsIgnoreCase(name))) { if(EffectiveSchematicNode.list(user, node.getParent()).stream().map(EffectiveSchematicNode::getNodeName).anyMatch(s -> s.equalsIgnoreCase(name))) {
return Result.ALREADY_IN_DIRECTORY; return Result.ALREADY_IN_DIRECTORY;
} }

Datei anzeigen

@ -1,21 +1,21 @@
/* /*
This file is a part of the SteamWar software. This file is a part of the SteamWar software.
Copyright (C) 2020 SteamWar.de-Serverteam
This program is free software: you can redistribute it and/or modify Copyright (C) 2023 SteamWar.de-Serverteam
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful, This program is free software: you can redistribute it and/or modify
but WITHOUT ANY WARRANTY; without even the implied warranty of it under the terms of the GNU Affero General Public License as published by
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the the Free Software Foundation, either version 3 of the License, or
GNU Affero General Public License for more details. (at your option) any later version.
You should have received a copy of the GNU Affero General Public License This program is distributed in the hope that it will be useful,
along with this program. If not, see <https://www.gnu.org/licenses/>. but WITHOUT ANY WARRANTY; without even the implied warranty of
*/ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package de.steamwar.schematicsystem.commands; package de.steamwar.schematicsystem.commands;
@ -50,7 +50,7 @@ public class GUI {
} }
@Override @Override
public void onListRender(SchematicSelector selector, SWListInv<SchematicNode> inv, SchematicNode parent) { public void onListRender(SchematicSelector selector, SWListInv<EffectiveSchematicNode> inv, EffectiveSchematicNode parent) {
inv.setCallback(-999, (ClickType click) -> { inv.setCallback(-999, (ClickType click) -> {
if(parent == null) { if(parent == null) {
player.closeInventory(); player.closeInventory();
@ -62,7 +62,7 @@ public class GUI {
inv.setItem(49, Material.AIR, "", clickType -> {}); inv.setItem(49, Material.AIR, "", clickType -> {});
} else { } else {
inv.setItem(49, Material.ANVIL, SchematicSystem.MESSAGE.parse("GUI_FOLDER_PROPERTIES", player), clickType -> { inv.setItem(49, Material.ANVIL, SchematicSystem.MESSAGE.parse("GUI_FOLDER_PROPERTIES", player), clickType -> {
info(selector.getPlayer(), parent, selector); info(selector.getPlayer(), parent.toSchematicNode(), selector);
}); });
} }
} }
@ -72,7 +72,7 @@ public class GUI {
return AnvilInvCloseAction.REOPEN; return AnvilInvCloseAction.REOPEN;
} }
}, node -> {}); }, node -> {});
selector.setCallback(node -> info(player, node, selector)); selector.setCallback(node -> info(player, node.toSchematicNode(), selector));
selector.setSingleDirOpen(false); selector.setSingleDirOpen(false);
selector.open(); selector.open();
} }
@ -154,17 +154,6 @@ public class GUI {
}); });
skull.setName(SchematicSystem.MESSAGE.parse("GUI_INFO_MEMBER", player)); skull.setName(SchematicSystem.MESSAGE.parse("GUI_INFO_MEMBER", player));
inv.setItem(8, skull); inv.setItem(8, skull);
inv.setItem(15, Material.ARROW, SchematicSystem.MESSAGE.parse("GUI_INFO_MOVE", player), clickType -> {
SchematicSelector selector = new SchematicSelector(player, SchematicSelector.selectDirectory(), npar -> {
SafeSchematicNode.Result result = SafeSchematicNode.setParent(user, node, npar);
if(result.isSuccessful()) {
info(player, SchematicNode.getSchematicNode(node.getId()), back);
} else {
result.sendError(player);
}
});
selector.open();
});
inv.setItem(16, Material.NAME_TAG, SchematicSystem.MESSAGE.parse("GUI_INFO_RENAME", player), clickType -> { inv.setItem(16, Material.NAME_TAG, SchematicSystem.MESSAGE.parse("GUI_INFO_RENAME", player), clickType -> {
SWAnvilInv anvilInv = new SWAnvilInv(player, SchematicSystem.MESSAGE.parse("GUI_INFO_RENAME_TITLE", player, node.getName()), node.getName()); SWAnvilInv anvilInv = new SWAnvilInv(player, SchematicSystem.MESSAGE.parse("GUI_INFO_RENAME_TITLE", player, node.getName()), node.getName());
anvilInv.setItem(mat, Collections.singletonList(Core.MESSAGE.parse("SCHEM_SELECTOR_CLICK_BACK", player)), false); anvilInv.setItem(mat, Collections.singletonList(Core.MESSAGE.parse("SCHEM_SELECTOR_CLICK_BACK", player)), false);
@ -199,6 +188,28 @@ public class GUI {
} }
} }
if(node.getOwner() == user.getId() || NodeMember.getNodeMember(node.getId(), user.getId()) != null) {
inv.setItem(15, Material.ARROW, SchematicSystem.MESSAGE.parse("GUI_INFO_MOVE", player), clickType -> {
SchematicSelector selector = new SchematicSelector(player, SchematicSelector.selectDirectory(), npar -> {
if(npar != null && EffectiveSchematicNode.parentsOfNode(user, npar.getNodeId()).stream().anyMatch(n -> n.getNodeId() == node.getId())) {
SchematicSystem.MESSAGE.send("COMMAND_MOVE_RECURSIVE", player);
return;
}
if(node.getOwner() == user.getId()) {
SafeSchematicNode.Result result = SafeSchematicNode.setParent(user, node, Optional.ofNullable(npar).map(EffectiveSchematicNode::toSchematicNode).orElse(null));
if(result.isSuccessful()) {
info(player, SchematicNode.getSchematicNode(node.getId()), back);
} else {
result.sendError(player);
}
} else {
NodeMember.getNodeMember(node.getId(), user.getId()).setParentId(Optional.ofNullable(npar).map(EffectiveSchematicNode::getNodeId).orElse(null));
}
});
selector.open();
});
}
inv.setCallback(-999, click -> back.reOpen()); inv.setCallback(-999, click -> back.reOpen());
inv.open(); inv.open();
} }

Datei anzeigen

@ -1,21 +1,21 @@
/* /*
This file is a part of the SteamWar software. This file is a part of the SteamWar software.
Copyright (C) 2020 SteamWar.de-Serverteam Copyright (C) 2023 SteamWar.de-Serverteam
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.schematicsystem.commands; package de.steamwar.schematicsystem.commands;
@ -99,7 +99,7 @@ public class SchematicCommand extends SWCommand {
@Register("list") @Register("list")
@Register({"list", "/"}) @Register({"list", "/"})
public void schemList(Player player, @OptionalValue(value = "1", onlyUINIG = true) int page) { public void schemList(Player player, @OptionalValue(value = "1", onlyUINIG = true) int page) {
createCachedSchemList(player, SchematicNode.getSchematicsAccessibleByUser(getUser(player).getId(), 0), Math.max(page - 1, 0), null, SchematicListBehavior.DEFAULT); createCachedSchemList(player, EffectiveSchematicNode.list(getUser(player), 0), Math.max(page - 1, 0), null, SchematicListBehavior.DEFAULT);
} }
@Register({"list", "public"}) @Register({"list", "public"})
@ -110,13 +110,13 @@ public class SchematicCommand extends SWCommand {
@Register({"list", "public"}) @Register({"list", "public"})
@Register({"list", "public", "/"}) @Register({"list", "public", "/"})
public void schemListPublic(Player player, @OptionalValue(value = "1", onlyUINIG = true) int page) { public void schemListPublic(Player player, @OptionalValue(value = "1", onlyUINIG = true) int page) {
createCachedSchemList(player, SchematicNode.getSchematicsAccessibleByUser(0, 0), Math.max(page - 1, 0), null, SchematicListBehavior.builder().setPublics(true).setPageCommandGen(integer -> "/schem list public " + integer).build()); createCachedSchemList(player, EffectiveSchematicNode.list(SteamwarUser.get(0), 0), Math.max(page - 1, 0), null, SchematicListBehavior.builder().setPublics(true).setPageCommandGen(integer -> "/schem list public " + integer).build());
} }
@Register("list") @Register("list")
public void schemList(Player player, @Validator("isDirValidator") @Mapper("dirMapper") SchematicNode node, @OptionalValue("1") int page) { public void schemList(Player player, @Validator("isDirValidator") @Mapper("dirMapper") SchematicNode node, @OptionalValue("1") int page) {
SteamwarUser user = getUser(player); SteamwarUser user = getUser(player);
createCachedSchemList(player, SchematicNode.getSchematicNodeInNode(node), Math.max(page - 1, 0), node, SchematicListBehavior.builder().setPublics(node.getOwner() == 0).setPageCommandGen(value -> "/schem list " + (node.getOwner()==0?"public ":"") + node.generateBreadcrumbs(user) + " " + value).build()); createCachedSchemList(player, EffectiveSchematicNode.list(user, node.getId()), Math.max(page - 1, 0), EffectiveSchematicNode.byIdAndUser(user, node.getId()).orElse(null), SchematicListBehavior.builder().setPublics(node.getOwner() == 0).setPageCommandGen(value -> "/schem list " + (node.getOwner()==0?"public ":"") + node.generateBreadcrumbs(user) + " " + value).build());
} }
@Register({"info", "public"}) @Register({"info", "public"})
@ -148,11 +148,11 @@ public class SchematicCommand extends SWCommand {
SteamwarUser user = SteamwarUser.get(player.getUniqueId()); SteamwarUser user = SteamwarUser.get(player.getUniqueId());
if(schematicNode == null || schematicNode.isDir()) { if(schematicNode == null || schematicNode.isDir()) {
SWAnvilInv anvilInv = new SWAnvilInv(player, SchematicSystem.MESSAGE.parse("COMMAND_ENTER_NAME", player)); SWAnvilInv anvilInv = new SWAnvilInv(player, SchematicSystem.MESSAGE.parse("COMMAND_ENTER_NAME", player));
anvilInv.setCallback(s -> saveSchem(player, schematicNode==null?s:(schematicNode.generateBreadcrumbs(user) + s))); anvilInv.setCallback(s -> saveSchem(player, schematicNode==null?s:(schematicNode.generateBreadcrumbs() + s)));
anvilInv.setItem(Material.CAULDRON); anvilInv.setItem(Material.CAULDRON);
anvilInv.open(); anvilInv.open();
} else { } else {
saveSchem(player, schematicNode.generateBreadcrumbs(user)); saveSchem(player, schematicNode.generateBreadcrumbs());
} }
}); });
selector.setSingleDirOpen(false); selector.setSingleDirOpen(false);
@ -289,7 +289,7 @@ public class SchematicCommand extends SWCommand {
public void schemSearch(Player player, @OptionalValue("1") int page, @Mapper("searchMapper") String... query) { public void schemSearch(Player player, @OptionalValue("1") int page, @Mapper("searchMapper") String... query) {
SteamwarUser user = getUser(player); SteamwarUser user = getUser(player);
int userId = user.getId(); int userId = user.getId();
List<Predicate<SchematicNode>> predicates = new ArrayList<>(); List<Predicate<EffectiveSchematicNode>> predicates = new ArrayList<>();
List<String> nameList = new ArrayList<>(); List<String> nameList = new ArrayList<>();
int i = 0; int i = 0;
while (i < query.length) { while (i < query.length) {
@ -303,10 +303,10 @@ public class SchematicCommand extends SWCommand {
int finalI = i; int finalI = i;
switch (current) { switch (current) {
case "-type": case "-type":
predicates.add(node -> node.getSchemtype().name().equalsIgnoreCase(query[finalI + 1])); predicates.add(node -> node.getNodeType().name().equalsIgnoreCase(query[finalI + 1]));
break; break;
case "-item": case "-item":
predicates.add(node -> node.getItem().equalsIgnoreCase(query[finalI + 1])); predicates.add(node -> node.getNodeItem().equalsIgnoreCase(query[finalI + 1]));
break; break;
case "-owner": case "-owner":
SteamwarUser steamwarUser = SteamwarUser.get(query[finalI + 1]); SteamwarUser steamwarUser = SteamwarUser.get(query[finalI + 1]);
@ -314,13 +314,13 @@ public class SchematicCommand extends SWCommand {
SchematicSystem.MESSAGE.send("COMMAND_SEARCH_NOT_A_PLAYER", player, query[finalI + 1]); SchematicSystem.MESSAGE.send("COMMAND_SEARCH_NOT_A_PLAYER", player, query[finalI + 1]);
return; return;
} }
predicates.add(node -> node.getOwner() == steamwarUser.getId()); predicates.add(node -> node.getNodeOwner() == steamwarUser.getId());
break; break;
case "-exclude": case "-exclude":
predicates.add(node -> !node.getName().contains(query[finalI + 1])); predicates.add(node -> !node.getNodeName().contains(query[finalI + 1]));
break; break;
case "-excludeType": case "-excludeType":
predicates.add(node -> !node.getSchemtype().name().equalsIgnoreCase(query[finalI + 1])); predicates.add(node -> !node.getNodeType().name().equalsIgnoreCase(query[finalI + 1]));
break; break;
case "-excludeOwner": case "-excludeOwner":
SteamwarUser steamwarUser1 = SteamwarUser.get(query[finalI + 1]); SteamwarUser steamwarUser1 = SteamwarUser.get(query[finalI + 1]);
@ -328,26 +328,26 @@ public class SchematicCommand extends SWCommand {
SchematicSystem.MESSAGE.send("COMMAND_SEARCH_NOT_A_PLAYER", player, query[finalI + 1]); SchematicSystem.MESSAGE.send("COMMAND_SEARCH_NOT_A_PLAYER", player, query[finalI + 1]);
return; return;
} }
predicates.add(node -> node.getOwner() != steamwarUser1.getId()); predicates.add(node -> node.getNodeOwner() != steamwarUser1.getId());
break; break;
} }
i++; i++;
} }
} else { } else {
predicates.add(node -> node.getName().contains(current)); predicates.add(node -> node.getNodeName().contains(current));
nameList.add(current); nameList.add(current);
} }
i++; i++;
} }
List<SchematicNode> nodes = SchematicNode.filterSchems(userId, node -> { List<EffectiveSchematicNode> nodes = EffectiveSchematicNode.getAll(user).stream().filter(node -> {
for (Predicate<SchematicNode> predicate : predicates) { for (Predicate<EffectiveSchematicNode> predicate : predicates) {
if (!predicate.test(node)) { if (!predicate.test(node)) {
return false; return false;
} }
} }
return true; return true;
}); }).collect(Collectors.toList());
createCachedSchemList(player, nodes, Math.max(page - 1, 0), null, SchematicListBehavior.builder().setPublics(userId == 0).setShowPath(false).setRenderHook(s -> { createCachedSchemList(player, nodes, Math.max(page - 1, 0), null, SchematicListBehavior.builder().setPublics(userId == 0).setShowPath(false).setRenderHook(s -> {
for (String ss : nameList) { for (String ss : nameList) {
s = s.replace(ss, "§e§l" + ss + "§7"); s = s.replace(ss, "§e§l" + ss + "§7");
@ -427,29 +427,46 @@ public class SchematicCommand extends SWCommand {
} }
@Register("move") @Register("move")
public void moveToNull(Player player, @Validator("isOwnerValidator") SchematicNode node) { public void moveToNull(Player player, @ErrorMessage("COMMAND_INVALID_NODE") SchematicNode node) {
move(player, node, "/"); move(player, node, "/");
} }
@Register("move") @Register("move")
public void move(Player player, @Validator("isOwnerValidator") SchematicNode node, @Mapper("dirStringMapper") String name) { public void move(Player player, @ErrorMessage("COMMAND_INVALID_NODE") SchematicNode node, @Mapper("dirStringMapper") String name) {
SteamwarUser user = getUser(player); SteamwarUser user = getUser(player);
if (name.equals("/")) { if (name.equals("/")) {
node.setParent(null); if(node.getOwner() == user.getId()) {
node.setParent(null);
} else if(NodeMember.getNodeMember(node.getId(), user.getId()) != null) {
NodeMember member = NodeMember.getNodeMember(node.getId(), user.getId());
member.setParentId(null);
} else {
SchematicSystem.MESSAGE.send("COMMAND_NOT_OWN", player);
return;
}
} else { } else {
if (name.startsWith("/")) name = name.substring(1); if (name.startsWith("/")) name = name.substring(1);
if (name.endsWith("/")) name = name.substring(0, name.length() - 1); if (name.endsWith("/")) name = name.substring(0, name.length() - 1);
String[] layers = name.split("/"); String[] layers = name.split("/");
if (invalidSchemName(player, layers)) return; if (invalidSchemName(player, layers)) return;
SchematicNode newNode = mkdirs(layers, user, 0); SchematicNode newNode = mkdirs(layers, user, 0);
if(SchematicNode.getAllParentsOfNode(newNode).contains(node)) { if(EffectiveSchematicNode.parentsOfNode(user, newNode.getId()).stream().anyMatch(n -> n.getNodeId() == node.getId())) {
SchematicSystem.MESSAGE.send("COMMAND_MOVE_RECURSIVE", player); SchematicSystem.MESSAGE.send("COMMAND_MOVE_RECURSIVE", player);
return; return;
} }
SafeSchematicNode.Result result = SafeSchematicNode.setParent(user, node, newNode);
if(!result.isSuccessful()) { if(node.getOwner() == user.getId()) {
result.sendError(player); SafeSchematicNode.Result result = SafeSchematicNode.setParent(user, node, newNode);
if(!result.isSuccessful()) {
result.sendError(player);
return;
}
} else if(NodeMember.getNodeMember(node.getId(), user.getId()) != null) {
NodeMember member = NodeMember.getNodeMember(node.getId(), user.getId());
member.setParentId(newNode.getId());
} else {
SchematicSystem.MESSAGE.send("COMMAND_NOT_OWN", player);
return; return;
} }
} }
@ -651,12 +668,12 @@ public class SchematicCommand extends SWCommand {
return new TypeMapper<SchematicNode>() { return new TypeMapper<SchematicNode>() {
@Override @Override
public List<String> tabCompletes(CommandSender commandSender, String[] strings, String s) { public List<String> tabCompletes(CommandSender commandSender, String[] strings, String s) {
return SchematicNode.getNodeTabcomplete(SteamwarUser.get(0), s); return EffectiveSchematicNode.getNodeTabcomplete(SteamwarUser.get(0), s);
} }
@Override @Override
public SchematicNode map(CommandSender commandSender, String[] previousArguments, String s) { public SchematicNode map(CommandSender commandSender, String[] previousArguments, String s) {
return SchematicNode.getNodeFromPath(SteamwarUser.get(0), s); return EffectiveSchematicNode.getNodeFromPath(SteamwarUser.get(0), s).map(EffectiveSchematicNode::toSchematicNode).orElse(null);
} }
}; };
} }
@ -673,13 +690,11 @@ public class SchematicCommand extends SWCommand {
@Override @Override
public List<String> tabCompletes(CommandSender commandSender, String[] strings, String s) { public List<String> tabCompletes(CommandSender commandSender, String[] strings, String s) {
List<String> list = new ArrayList<>(); return EffectiveSchematicNode.getNodeFromPath(getUser((Player) commandSender), strings[strings.length - 1])
SchematicNode node = SchematicNode.getNodeFromPath(getUser((Player) commandSender), strings[strings.length - 1]); .map(EffectiveSchematicNode::toSchematicNode)
if (node == null) { .map(SchematicNode::getMembers)
return list; .map(nodeMembers -> nodeMembers.stream().map(NodeMember::getMember).map(SteamwarUser::get).map(SteamwarUser::getUserName).collect(Collectors.toList()))
} .orElse(Collections.emptyList());
node.getMembers().forEach(nodeMember -> list.add(SteamwarUser.get(nodeMember.getMember()).getUserName()));
return list;
} }
}; };
} }
@ -689,14 +704,14 @@ public class SchematicCommand extends SWCommand {
return new TypeMapper<SchematicNode>() { return new TypeMapper<SchematicNode>() {
@Override @Override
public List<String> tabCompletes(CommandSender commandSender, String[] strings, String s) { public List<String> tabCompletes(CommandSender commandSender, String[] strings, String s) {
List<String> list = SchematicNode.getNodeTabcomplete(getUser((Player) commandSender), s); List<String> list = EffectiveSchematicNode.getNodeTabcomplete(getUser((Player) commandSender), s);
list.removeIf(s1 -> !s1.endsWith("/")); list.removeIf(s1 -> !s1.endsWith("/"));
return list; return list;
} }
@Override @Override
public SchematicNode map(CommandSender commandSender, String[] previousArguments, String s) { public SchematicNode map(CommandSender commandSender, String[] previousArguments, String s) {
return SchematicNode.getNodeFromPath(getUser((Player) commandSender), s); return EffectiveSchematicNode.getNodeFromPath(getUser((Player) commandSender), s).map(EffectiveSchematicNode::toSchematicNode).orElse(null);
} }
}; };
} }
@ -723,7 +738,7 @@ public class SchematicCommand extends SWCommand {
return new TypeMapper<String>() { return new TypeMapper<String>() {
@Override @Override
public List<String> tabCompletes(CommandSender commandSender, String[] strings, String s) { public List<String> tabCompletes(CommandSender commandSender, String[] strings, String s) {
List<String> list = SchematicNode.getNodeTabcomplete(getUser((Player) commandSender), s); List<String> list = EffectiveSchematicNode.getNodeTabcomplete(getUser((Player) commandSender), s);
list.removeIf(s1 -> !s1.endsWith("/")); list.removeIf(s1 -> !s1.endsWith("/"));
return list; return list;
} }
@ -755,12 +770,12 @@ public class SchematicCommand extends SWCommand {
return new TypeMapper<SchematicNode>() { return new TypeMapper<SchematicNode>() {
@Override @Override
public List<String> tabCompletes(CommandSender commandSender, String[] strings, String s) { public List<String> tabCompletes(CommandSender commandSender, String[] strings, String s) {
return SchematicNode.getNodeTabcomplete(getUser((Player) commandSender), s); return EffectiveSchematicNode.getNodeTabcomplete(getUser((Player) commandSender), s);
} }
@Override @Override
public SchematicNode map(CommandSender commandSender, String[] previousArguments, String s) { public SchematicNode map(CommandSender commandSender, String[] previousArguments, String s) {
return SchematicNode.getNodeFromPath(getUser((Player) commandSender), s); return EffectiveSchematicNode.getNodeFromPath(getUser((Player) commandSender), s).map(EffectiveSchematicNode::toSchematicNode).orElse(null);
} }
}; };
} }

Datei anzeigen

@ -1,21 +1,21 @@
/* /*
This file is a part of the SteamWar software. This file is a part of the SteamWar software.
Copyright (C) 2020 SteamWar.de-Serverteam Copyright (C) 2023 SteamWar.de-Serverteam
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.schematicsystem.commands; package de.steamwar.schematicsystem.commands;
@ -90,7 +90,7 @@ public class SchematicCommandUtils {
return false; return false;
} }
public static void createCachedSchemList(Player player, List<SchematicNode> nodes, int chunk, SchematicNode parent, SchematicListBehavior behavior) { public static void createCachedSchemList(Player player, List<EffectiveSchematicNode> nodes, int chunk, EffectiveSchematicNode parent, SchematicListBehavior behavior) {
CachedSchematicList cachedSchematicList = new CachedSchematicList(nodes, chunk, (int) Math.ceil(nodes.size() / (double) CHUNK_SIZE), parent, behavior.withPageCommandGen((page) -> "/schematic page " + (page - 1))); CachedSchematicList cachedSchematicList = new CachedSchematicList(nodes, chunk, (int) Math.ceil(nodes.size() / (double) CHUNK_SIZE), parent, behavior.withPageCommandGen((page) -> "/schematic page " + (page - 1)));
CACHED_LISTS.put(player, cachedSchematicList); CACHED_LISTS.put(player, cachedSchematicList);
renderSchemlist(player, cachedSchematicList.nodes, chunk, parent, cachedSchematicList.behavior); renderSchemlist(player, cachedSchematicList.nodes, chunk, parent, cachedSchematicList.behavior);
@ -104,62 +104,62 @@ public class SchematicCommandUtils {
} }
public static void renderSchemlist(Player player, public static void renderSchemlist(Player player,
List<SchematicNode> nodes, List<EffectiveSchematicNode> nodes,
int chunk, int chunk,
SchematicNode parent, EffectiveSchematicNode parent,
SchematicListBehavior behavior) { SchematicListBehavior behavior) {
SteamwarUser user = getUser(player); SteamwarUser user = getUser(player);
int pageCount = (int) Math.ceil(nodes.size() / (double) CHUNK_SIZE); int pageCount = (int) Math.ceil(nodes.size() / (double) CHUNK_SIZE);
SchematicSystem.MESSAGE.sendPrefixless("UTIL_LIST_HEAD", player, nodes.size()); SchematicSystem.MESSAGE.sendPrefixless("UTIL_LIST_HEAD", player, nodes.size());
String breadcrumbs = parent == null ? "" : parent.generateBreadcrumbs(user); String breadcrumbs = parent == null ? "" : parent.generateBreadcrumbs();
SchematicSystem.MESSAGE.sendPrefixless("UTIL_LIST_PATH", player, (breadcrumbs.isEmpty() ? "/" : breadcrumbs)); SchematicSystem.MESSAGE.sendPrefixless("UTIL_LIST_PATH", player, (breadcrumbs.isEmpty() ? "/" : breadcrumbs));
if (!breadcrumbs.isEmpty()) { if (!breadcrumbs.isEmpty()) {
String str = breadcrumbs.substring(0, Math.max(0, breadcrumbs.substring(0, breadcrumbs.length() - 1).lastIndexOf("/"))); String str = breadcrumbs.substring(0, Math.max(0, breadcrumbs.substring(0, breadcrumbs.length() - 1).lastIndexOf("/")));
SchematicSystem.MESSAGE.sendPrefixless("UTIL_LIST_BACK", player, SchematicSystem.MESSAGE.parse("UTIL_LIST_BACK_HOVER", player, str), new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/schem list " + (behavior.isPublics() ? "public" : "") + " " + str)); SchematicSystem.MESSAGE.sendPrefixless("UTIL_LIST_BACK", player, SchematicSystem.MESSAGE.parse("UTIL_LIST_BACK_HOVER", player, str), new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/schem list " + (behavior.isPublics() ? "public" : "") + " " + str));
} }
for (int i = chunk * CHUNK_SIZE; i < nodes.size() && i < (chunk + 1) * CHUNK_SIZE; i++) { for (int i = chunk * CHUNK_SIZE; i < nodes.size() && i < (chunk + 1) * CHUNK_SIZE; i++) {
SchematicNode node = nodes.get(i); EffectiveSchematicNode node = nodes.get(i);
StringBuilder nodeString = new StringBuilder(); StringBuilder nodeString = new StringBuilder();
if (node.isDir()) { if (node.isDir()) {
nodeString.append(SchematicSystem.MESSAGE.parse("UTIL_LIST_DIR", player)).append(" "); nodeString.append(SchematicSystem.MESSAGE.parse("UTIL_LIST_DIR", player)).append(" ");
} else { } else {
SchematicType type = node.getSchemtype(); SchematicType type = node.getNodeType();
if (type != SchematicType.Normal) { if (type != SchematicType.Normal) {
nodeString.append(SchematicSystem.MESSAGE.parse("UTIL_LIST_TYPE", player, type.getKuerzel())).append(" "); nodeString.append(SchematicSystem.MESSAGE.parse("UTIL_LIST_TYPE", player, type.getKuerzel())).append(" ");
} }
} }
nodeString.append(SchematicSystem.MESSAGE.parse("UTIL_LIST_BASE", player)); nodeString.append(SchematicSystem.MESSAGE.parse("UTIL_LIST_BASE", player));
nodeString.append(behavior.getRenderHook().apply(node.getName())); nodeString.append(behavior.getRenderHook().apply(node.getNodeName()));
if (node.isDir()) { if (node.isDir()) {
nodeString.append("/"); nodeString.append("/");
} }
if (node.getOwner() != user.getId()) { if (node.getNodeOwner() != user.getId()) {
nodeString.append(" ").append(SchematicSystem.MESSAGE.parse("UTIL_LIST_FROM", player, SteamwarUser.get(node.getOwner()).getUserName())); nodeString.append(" ").append(SchematicSystem.MESSAGE.parse("UTIL_LIST_FROM", player, SteamwarUser.get(node.getNodeOwner()).getUserName()));
} }
TextComponent schematics = new TextComponent(nodeString.toString()); TextComponent schematics = new TextComponent(nodeString.toString());
if (node.isDir()) { if (node.isDir()) {
schematics.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(SchematicSystem.MESSAGE.parse("UTIL_LIST_OPEN_DIR", player)).create())); schematics.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(SchematicSystem.MESSAGE.parse("UTIL_LIST_OPEN_DIR", player)).create()));
schematics.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/schem list " + (behavior.isPublics() ? "public " : "") + breadcrumbs + node.getName() + "/")); schematics.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/schem list " + (behavior.isPublics() ? "public " : "") + breadcrumbs + node.getNodeName() + "/"));
} else { } else {
schematics.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(SchematicSystem.MESSAGE.parse("UTIL_LIST_OPEN_SCHEM", player)).create())); schematics.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(SchematicSystem.MESSAGE.parse("UTIL_LIST_OPEN_SCHEM", player)).create()));
schematics.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/schem info " + (behavior.isPublics() ? "public " : "") + breadcrumbs + node.getName())); schematics.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/schem info " + (behavior.isPublics() ? "public " : "") + breadcrumbs + node.getNodeName()));
} }
player.spigot().sendMessage(schematics); player.spigot().sendMessage(schematics);
} }
if (parent != null && parent.getOwner() != user.getId() && NodeMember.getNodeMember(parent.getId(), user.getId()) != null) { if (parent != null && parent.getNodeOwner() != user.getId() && NodeMember.getNodeMember(parent.getNodeId(), user.getId()) != null) {
TextComponent deadd = SchematicSystem.MESSAGE.parseToComponent("UTIL_LIST_REMOVE", false, player); TextComponent deadd = SchematicSystem.MESSAGE.parseToComponent("UTIL_LIST_REMOVE", false, player);
deadd.setColor(ChatColor.RED); deadd.setColor(ChatColor.RED);
deadd.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new TextComponent[] {SchematicSystem.MESSAGE.parseToComponent("UTIL_LIST_REMOVE_HOVER", false, player)})); deadd.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new TextComponent[] {SchematicSystem.MESSAGE.parseToComponent("UTIL_LIST_REMOVE_HOVER", false, player)}));
deadd.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/schem delete " + parent.generateBreadcrumbs(user))); deadd.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/schem delete " + parent.generateBreadcrumbs()));
player.spigot().sendMessage(deadd); player.spigot().sendMessage(deadd);
} }
@ -315,25 +315,23 @@ public class SchematicCommandUtils {
} }
public static SchematicNode mkdirs(String[] layers, SteamwarUser user, int minus) { public static SchematicNode mkdirs(String[] layers, SteamwarUser user, int minus) {
SchematicNode currentNode = null; Optional<EffectiveSchematicNode> currentNode = Optional.empty();
for (int i = 0; i < layers.length - minus; i++) { for (int i = 0; i < layers.length - minus; i++) {
int finalI = i; int finalI = i;
List<SchematicNode> nodes; List<EffectiveSchematicNode> nodes = EffectiveSchematicNode.list(user, currentNode.map(EffectiveSchematicNode::getNodeId).orElse(0)).stream()
if (currentNode == null) { .filter(effectiveSchematicNode -> effectiveSchematicNode.getNodeName().equalsIgnoreCase(layers[finalI]))
nodes = SchematicNode.getSchematicsAccessibleByUser(user.getId(), 0).stream().filter(node -> node.getName().equals(layers[finalI])).collect(Collectors.toList()); .collect(Collectors.toList());
} else {
nodes = SchematicNode.getSchematicNodeInNode(currentNode).stream().filter(node -> node.getName().equals(layers[finalI])).collect(Collectors.toList());
}
if (nodes.isEmpty()) { if (nodes.isEmpty()) {
currentNode = SchematicNode.createSchematicDirectory(user.getId(), layers[i], currentNode == null ? 0 : currentNode.getId()); currentNode = EffectiveSchematicNode.byIdAndUser(user, SchematicNode.createSchematicDirectory(user.getId(), layers[i], currentNode.map(EffectiveSchematicNode::getNodeId).orElse(0)).getId());
} else { } else {
if (!nodes.get(0).isDir()) { if(nodes.stream().anyMatch(EffectiveSchematicNode::isDir)) {
nodes.set(0, SchematicNode.createSchematicDirectory(user.getId(), layers[i] + "-dir-" + System.currentTimeMillis() % 100, currentNode == null ? 0 : currentNode.getId())); currentNode = nodes.stream().filter(EffectiveSchematicNode::isDir).findFirst();
} else {
currentNode = EffectiveSchematicNode.byIdAndUser(user, SchematicNode.createSchematicDirectory(user.getId(), layers[i] + "-dir-" + System.currentTimeMillis() % 100, currentNode.map(EffectiveSchematicNode::getNodeId).orElse(0)).getId());
} }
currentNode = nodes.get(0);
} }
} }
return currentNode; return currentNode.map(EffectiveSchematicNode::toSchematicNode).orElseThrow(() -> new IllegalStateException("Could not create schematic directory"));
} }
public static SteamwarUser getUser(Player player) { public static SteamwarUser getUser(Player player) {
@ -497,10 +495,10 @@ public class SchematicCommandUtils {
@AllArgsConstructor @AllArgsConstructor
@With @With
static class CachedSchematicList { static class CachedSchematicList {
private List<SchematicNode> nodes; private List<EffectiveSchematicNode> nodes;
private int page; private int page;
private int maxPage; private int maxPage;
private SchematicNode parent; private EffectiveSchematicNode parent;
private SchematicListBehavior behavior; private SchematicListBehavior behavior;
} }
} }