Skip to content

Commit

Permalink
Add prompts (#5248)
Browse files Browse the repository at this point in the history
* Add prompts

* Add missing permission test
  • Loading branch information
Warriorrrr authored Sep 1, 2021
1 parent af6310f commit 3593f45
Show file tree
Hide file tree
Showing 5 changed files with 159 additions and 2 deletions.
8 changes: 6 additions & 2 deletions resources/lang/en-US.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name: Towny
version: 0.119
version: 0.120
language: english
author: ElgarL
website: 'http://townyadvanced.github.io/'
Expand Down Expand Up @@ -1497,4 +1497,8 @@ status_title_nopvp: '&a(No PVP)'

#Added in 0.119
msg_err_resident_cannot_be_jailed_because_they_are_outlawed_there: 'You cannot jail your resident because they are in a location where they are outlawed.'
msg_err_resident_cannot_be_jailed_because_they_are_enemied_there: 'You cannot jail your resident because they are in a location where they are considered an enemy.'
msg_err_resident_cannot_be_jailed_because_they_are_enemied_there: 'You cannot jail your resident because they are in a location where they are considered an enemy.'

#Added in 0.120
msg_resident_prompt: 'Enter the name of the player in chat, or q to exit. This will automatically time out in 30 seconds.'
msg_prompt_cancel: 'Prompt cancelled or timed out.'
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package com.palmergames.bukkit.towny.conversation;

import com.palmergames.bukkit.towny.Towny;
import com.palmergames.bukkit.towny.TownyAPI;
import com.palmergames.bukkit.towny.TownyMessaging;
import com.palmergames.bukkit.towny.object.Resident;
import com.palmergames.bukkit.towny.object.Translatable;
import org.bukkit.conversations.ConversationContext;
import org.bukkit.conversations.ConversationFactory;
import org.bukkit.conversations.Prompt;
import org.bukkit.conversations.StringPrompt;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

/**
* A conversation that is used for getting resident input via chat.
*/
public class ResidentConversation extends TownyConversation {
public ResidentConversation(Player player) {
new ConversationFactory(Towny.getPlugin())
.withPrefix(this)
.addConversationAbandonedListener(this)
.withFirstPrompt(new ResidentPrompt())
.withEscapeSequence("q")
.withTimeout(30)
.withLocalEcho(false)
.withModality(false)
.buildConversation(player)
.begin();
}

private class ResidentPrompt extends StringPrompt {
public ResidentPrompt() {
super();
}

@NotNull
@Override
public String getPromptText(@NotNull ConversationContext context) {
return Translatable.of("msg_resident_prompt").forLocale(getPlayer(context));
}

@Nullable
@Override
public Prompt acceptInput(@NotNull ConversationContext context, @Nullable String string) {
if (string != null) {
Resident resident = TownyAPI.getInstance().getResident(string);

if (resident == null)
TownyMessaging.sendErrorMsg(getPlayer(context), Translatable.of("msg_err_not_registered_1", string));
else if (consumer != null)
consumer.accept(resident);
}

return Prompt.END_OF_CONVERSATION;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.palmergames.bukkit.towny.conversation;

import com.palmergames.bukkit.towny.TownyMessaging;
import com.palmergames.bukkit.towny.object.Translatable;
import org.bukkit.conversations.ConversationAbandonedEvent;
import org.bukkit.conversations.ConversationAbandonedListener;
import org.bukkit.conversations.ConversationContext;
import org.bukkit.conversations.ConversationPrefix;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;

import java.util.function.Consumer;

public class TownyConversation implements ConversationPrefix, ConversationAbandonedListener {

public Consumer<Object> consumer;

@NotNull
@Override
public String getPrefix(@NotNull ConversationContext context) {
return Translatable.of("default_towny_prefix").forLocale(getPlayer(context));
}

public Player getPlayer(@NotNull ConversationContext context) {
return (Player) context.getForWhom();
}

public void runOnResponse(Consumer<Object> consumer) {
this.consumer = consumer;
}

@Override
public void conversationAbandoned(@NotNull ConversationAbandonedEvent event) {
if (!event.gracefulExit())
TownyMessaging.sendMsg(getPlayer(event.getContext()), Translatable.of("msg_prompt_cancel"));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,9 @@ public void onClick(InventoryClickEvent event) {
Towny.getAdventure().player(player).playSound(clickSound);
} else if (event.getCurrentItem().getType() == Material.WRITTEN_BOOK) {
player.openBook(PermissionGUIUtil.createTutorialBook());
} else if (event.getCurrentItem().getType() == Material.NAME_TAG) {
PermissionGUIUtil.handleConversation(player);
event.getWhoClicked().closeInventory();
} else {
int currentPage = resident.getGUIPageNum();

Expand Down
54 changes: 54 additions & 0 deletions src/com/palmergames/bukkit/towny/utils/PermissionGUIUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,27 @@

import com.palmergames.bukkit.towny.TownyAPI;
import com.palmergames.bukkit.towny.TownyFormatter;
import com.palmergames.bukkit.towny.TownyMessaging;
import com.palmergames.bukkit.towny.TownyUniverse;
import com.palmergames.bukkit.towny.command.PlotCommand;
import com.palmergames.bukkit.towny.conversation.ResidentConversation;
import com.palmergames.bukkit.towny.exceptions.TownyException;
import com.palmergames.bukkit.towny.object.PermissionData;
import com.palmergames.bukkit.towny.object.PlotGroup;
import com.palmergames.bukkit.towny.object.Translatable;
import com.palmergames.bukkit.towny.object.WorldCoord;
import com.palmergames.bukkit.towny.object.gui.EditGUI;
import com.palmergames.bukkit.towny.object.gui.PermissionGUI;
import com.palmergames.bukkit.towny.object.Resident;
import com.palmergames.bukkit.towny.object.TownBlock;
import com.palmergames.bukkit.towny.object.TownyPermission.ActionType;
import com.palmergames.bukkit.towny.permissions.PermissionNodes;
import com.palmergames.bukkit.util.BukkitTools;
import com.palmergames.bukkit.util.Colors;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.BookMeta;
Expand Down Expand Up @@ -97,6 +104,15 @@ public static void openPermissionGUI(@NotNull Resident resident, @NotNull TownBl
page.addItem(skull);
}

if (canEdit) {
ItemStack addButton = new ItemStack(Material.NAME_TAG);
ItemMeta addButtonMeta = addButton.getItemMeta();
addButtonMeta.setDisplayName(Colors.Gold + "Add Player");
addButton.setItemMeta(addButtonMeta);

page.setItem(46, addButton);
}

page.setItem(52, createTutorialBook());

pages.add(page);
Expand Down Expand Up @@ -170,4 +186,42 @@ public static ItemStack createTutorialBook() {
book.setItemMeta(meta);
return book;
}

public static void handleConversation(Player player) {
TownBlock startingTownBlock = WorldCoord.parseWorldCoord(player).getTownBlockOrNull();
if (startingTownBlock == null) {
TownyMessaging.sendErrorMsg(player, Translatable.of("msg_not_claimed_1"));
return;
}

new ResidentConversation(player).runOnResponse((res) -> {
if (!TownyUniverse.getInstance().getPermissionSource().testPermission(player, PermissionNodes.TOWNY_COMMAND_PLOT_PERM_ADD.getNode())) {
TownyMessaging.sendErrorMsg(player, Translatable.of("msg_err_command_disable"));
return;
}

Resident resident = (Resident) res;
if (startingTownBlock.hasPlotObjectGroup()) {
PlotGroup group = startingTownBlock.getPlotObjectGroup();

if (group.getPermissionOverrides().containsKey(resident)) {
TownyMessaging.sendErrorMsg(player, Translatable.of("msg_overrides_already_set", resident.getName(), Translatable.of("plotgroup_sing")));
return;
}

group.putPermissionOverride(resident, new PermissionData(PermissionGUIUtil.getDefaultTypes(), player.getName()));
} else {
if (startingTownBlock.getPermissionOverrides().containsKey(resident)) {
TownyMessaging.sendErrorMsg(player, Translatable.of("msg_overrides_already_set", resident.getName(), Translatable.of("townblock")));
return;
}

startingTownBlock.getPermissionOverrides().put(resident, new PermissionData(PermissionGUIUtil.getDefaultTypes(), player.getName()));
startingTownBlock.save();
}

TownyMessaging.sendMsg(player, Translatable.of("msg_overrides_added", resident.getName()));
PermissionGUIUtil.openPermissionGUI(TownyAPI.getInstance().getResident(player), startingTownBlock);
});
}
}

0 comments on commit 3593f45

Please sign in to comment.