diff --git a/src/de/steamwar/bungeecore/commands/TutorialCommand.java b/src/de/steamwar/bungeecore/commands/TutorialCommand.java index 340a0fdd..c4d6ee3c 100644 --- a/src/de/steamwar/bungeecore/commands/TutorialCommand.java +++ b/src/de/steamwar/bungeecore/commands/TutorialCommand.java @@ -49,7 +49,7 @@ public class TutorialCommand extends BasicCommand { ProxiedPlayer player = (ProxiedPlayer) sender; if(args.length != 0) { - switch(args[0]) { + switch(args[0].toLowerCase()) { case "rate": if(args.length < 2) { BungeeCore.get().getLogger().log(Level.SEVERE, "rate executed with missing argument"); @@ -82,23 +82,55 @@ public class TutorialCommand extends BasicCommand { String name = Arrays.stream(args).skip(2).collect(Collectors.joining(" ")); create(player, name, material); break; + case "own": + openInventory(player, false, true); + break; + + case "unreleased": + if (SteamwarUser.get(player.getUniqueId()).getUserGroup().isTeamGroup()) { + openInventory(player, false, false); + break; + } default: Message.send("TUTORIAL_CREATE_HELP", player); + Message.send("TUTORIAL_OWN_HELP", player); } return; } - new SWStreamInv<>(player, Message.parse("TUTORIAL_TITLE", player), (click, tutorial) -> new ServerStarter().tutorial(player, tutorial).start(), page -> Tutorial.getPage(page, 45).stream().map(tutorial -> new SWListInv.SWListEntry<>(getTutorialItem(player, tutorial), tutorial)).collect(Collectors.toList())).open(); + openInventory(player, true, false); } - private SWItem getTutorialItem(ProxiedPlayer player, Tutorial tutorial) { + private void openInventory(ProxiedPlayer player, boolean released, boolean own) { + SteamwarUser user = SteamwarUser.get(player.getUniqueId()); + + new SWStreamInv<>( + player, + Message.parse("TUTORIAL_TITLE", player), + (click, tutorial) -> { + if(!released && click.isShiftClick() && user.getUserGroup().isTeamGroup() && user != tutorial.creator()) { + tutorial.release(); + return; + } + + new ServerStarter().tutorial(player, tutorial).start(); + }, + page -> (own ? Tutorial.getOwn(user, page, 45) : Tutorial.getPage(page, 45, released)).stream().map(tutorial -> new SWListInv.SWListEntry<>(getTutorialItem(player, tutorial, own), tutorial)).collect(Collectors.toList()) + ).open(); + } + + private SWItem getTutorialItem(ProxiedPlayer player, Tutorial tutorial, boolean highlightReleased) { SWItem item = new SWItem(tutorial.item(), Message.parse("TUTORIAL_NAME", player, tutorial.name())); + item.setHideAttributes(true); List lore = new ArrayList<>(); lore.add(Message.parse("TUTORIAL_BY", player, tutorial.creator().getUserName())); lore.add(Message.parse("TUTORIAL_STARS", player, tutorial.stars())); item.setLore(lore); + if (highlightReleased && tutorial.released()) + item.setEnchanted(true); + return item; } diff --git a/src/de/steamwar/bungeecore/sql/Tutorial.java b/src/de/steamwar/bungeecore/sql/Tutorial.java index 92272825..4bbe7c43 100644 --- a/src/de/steamwar/bungeecore/sql/Tutorial.java +++ b/src/de/steamwar/bungeecore/sql/Tutorial.java @@ -27,24 +27,35 @@ import java.util.stream.Collectors; public class Tutorial { - private static final Statement by_popularity = new Statement("SELECT t.*, AVG(r.Stars) AS Stars FROM Tutorial t LEFT OUTER JOIN TutorialRating r ON t.TutorialID = r.TutorialID GROUP BY t.TutorialID ORDER BY SUM(r.Stars) DESC LIMIT ?, ?"); + private static final Statement by_popularity = new Statement("SELECT t.*, AVG(r.Stars) AS Stars FROM Tutorial t LEFT OUTER JOIN TutorialRating r ON t.TutorialID = r.TutorialID WHERE t.Released = ? GROUP BY t.TutorialID ORDER BY SUM(r.Stars) DESC LIMIT ?, ?"); + private static final Statement own = new Statement("SELECT t.*, AVG(r.Stars) AS Stars FROM Tutorial t LEFT OUTER JOIN TutorialRating r ON t.TutorialID = r.TutorialID WHERE t.Creator = ? GROUP BY t.TutorialID ORDER BY t.TutorialID ASC LIMIT ?, ?"); private static final Statement by_creator_name = new Statement("SELECT t.*, AVG(r.Stars) AS Stars FROM Tutorial t LEFT OUTER JOIN TutorialRating r ON t.TutorialID = r.TutorialID WHERE t.Creator = ? AND t.Name = ? GROUP BY t.TutorialID"); private static final Statement by_id = new Statement("SELECT t.*, AVG(r.Stars) AS Stars FROM Tutorial t LEFT OUTER JOIN TutorialRating r ON t.TutorialID = r.TutorialID WHERE t.TutorialID = ? GROUP BY t.TutorialID"); private static final Statement rate = new Statement("INSERT INTO TutorialRating (TutorialID, UserID, Stars) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE Stars = VALUES(Stars)"); - private static final Statement create = new Statement("INSERT INTO Tutorial (Creator, Name, Item) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE Item = VALUES(Item)"); + private static final Statement create = new Statement("INSERT INTO Tutorial (Creator, Name, Item) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE Item = VALUES(Item), Released = 0"); + private static final Statement release = new Statement("UPDATE Tutorial SET Released = 1 WHERE TutorialID = ?"); - public static List getPage(int page, int elementsPerPage) { + public static List getPage(int page, int elementsPerPage, boolean released) { List tutorials = by_popularity.select(rs -> { List t = new ArrayList<>(); while(rs.next()) t.add(new Tutorial(rs)); return t; - }, page * elementsPerPage, elementsPerPage); + }, released, page * elementsPerPage, elementsPerPage); SteamwarUser.batchCache(tutorials.stream().map(tutorial -> tutorial.creator).collect(Collectors.toSet())); return tutorials; } + public static List getOwn(SteamwarUser user, int page, int elementsPerPage) { + return own.select(rs -> { + List t = new ArrayList<>(); + while(rs.next()) + t.add(new Tutorial(rs)); + return t; + }, user.getId(), page * elementsPerPage, elementsPerPage); + } + public static Tutorial create(SteamwarUser creator, String name, String item) { create.update(creator.getId(), name, item); return by_creator_name.select(rs -> { @@ -66,12 +77,14 @@ public class Tutorial { private final String name; private final String item; private final double stars; + private final boolean released; public Tutorial(ResultSet rs) throws SQLException { this.id = rs.getInt("TutorialID"); this.creator = rs.getInt("Creator"); this.name = rs.getString("Name"); this.item = rs.getString("Item"); + this.released = rs.getBoolean("Released"); this.stars = rs.getDouble("Stars"); } @@ -95,6 +108,14 @@ public class Tutorial { return item; } + public boolean released() { + return released; + } + + public void release() { + release.update(id); + } + public void rate(SteamwarUser user, int rating) { rate.update(id, user.getId(), rating); } diff --git a/src/de/steamwar/messages/BungeeCore.properties b/src/de/steamwar/messages/BungeeCore.properties index ff51762a..4d66ebb2 100644 --- a/src/de/steamwar/messages/BungeeCore.properties +++ b/src/de/steamwar/messages/BungeeCore.properties @@ -343,6 +343,7 @@ TUTORIAL_RATE=§e{0} §7Stern(e) TUTORIAL_CREATE_HELP=§8/§7tutorial create §8[§eMaterial§8] §8[§eName§8] TUTORIAL_CREATE_MISSING=§cEin Tutorial kann nur von einem Tutorialserver aus erstellt werden! TUTORIAL_CREATED=§7Das Tutorial wurde erstellt§8. +TUTORIAL_OWN_HELP=§8/§7tutorial own §8- §7Liste der eigenen Tutorials #ServerTeamchatCommand STC_USAGE=§8/§7stc §8[§eNachricht an das Team§8]