Chat channel improved, tried a bunch of ideas
This commit is contained in:
parent
bcf8cc4e99
commit
308006d624
4 changed files with 159 additions and 56 deletions
|
@ -1,22 +1,21 @@
|
||||||
package buttondevteam.core;
|
package buttondevteam.core;
|
||||||
|
|
||||||
import java.io.File;
|
import java.util.ArrayList;
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.configuration.ConfigurationSection;
|
|
||||||
import org.bukkit.configuration.InvalidConfigurationException;
|
|
||||||
import org.bukkit.configuration.file.YamlConfiguration;
|
|
||||||
import org.bukkit.plugin.PluginDescriptionFile;
|
import org.bukkit.plugin.PluginDescriptionFile;
|
||||||
import org.bukkit.plugin.RegisteredServiceProvider;
|
import org.bukkit.plugin.RegisteredServiceProvider;
|
||||||
import org.bukkit.plugin.java.JavaPlugin;
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
import org.bukkit.scoreboard.Scoreboard;
|
||||||
|
|
||||||
|
import com.palmergames.bukkit.towny.Towny;
|
||||||
|
import com.palmergames.bukkit.towny.object.Nation;
|
||||||
|
import com.palmergames.bukkit.towny.object.Town;
|
||||||
|
import com.palmergames.bukkit.towny.object.TownyUniverse;
|
||||||
|
|
||||||
import buttondevteam.lib.TBMCCoreAPI;
|
import buttondevteam.lib.TBMCCoreAPI;
|
||||||
import buttondevteam.lib.chat.TBMCChatAPI;
|
import buttondevteam.lib.chat.TBMCChatAPI;
|
||||||
import buttondevteam.lib.player.ChromaGamerBase;
|
|
||||||
import buttondevteam.lib.player.TBMCPlayerBase;
|
import buttondevteam.lib.player.TBMCPlayerBase;
|
||||||
import net.milkbowl.vault.permission.Permission;
|
import net.milkbowl.vault.permission.Permission;
|
||||||
|
|
||||||
|
@ -27,7 +26,6 @@ public class MainPlugin extends JavaPlugin {
|
||||||
|
|
||||||
private PluginDescriptionFile pdfFile;
|
private PluginDescriptionFile pdfFile;
|
||||||
private Logger logger;
|
private Logger logger;
|
||||||
private int C = 0, keep = 0;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onEnable() {
|
public void onEnable() {
|
||||||
|
@ -43,45 +41,6 @@ public class MainPlugin extends JavaPlugin {
|
||||||
TBMCCoreAPI.RegisterEventsForExceptions(new PlayerListener(), this);
|
TBMCCoreAPI.RegisterEventsForExceptions(new PlayerListener(), this);
|
||||||
TBMCCoreAPI.RegisterUserClass(TBMCPlayerBase.class);
|
TBMCCoreAPI.RegisterUserClass(TBMCPlayerBase.class);
|
||||||
logger.info(pdfFile.getName() + " has been Enabled (V." + pdfFile.getVersion() + ").");
|
logger.info(pdfFile.getName() + " has been Enabled (V." + pdfFile.getVersion() + ").");
|
||||||
Arrays.stream(new File(ChromaGamerBase.TBMC_PLAYERS_DIR).listFiles(f -> !f.isDirectory())).map(f -> {
|
|
||||||
YamlConfiguration yc = new YamlConfiguration();
|
|
||||||
try {
|
|
||||||
yc.load(f);
|
|
||||||
} catch (IOException | InvalidConfigurationException e) {
|
|
||||||
TBMCCoreAPI.SendException("Error while converting player data!", e);
|
|
||||||
}
|
|
||||||
f.delete();
|
|
||||||
return yc;
|
|
||||||
}).forEach(yc -> {
|
|
||||||
try {
|
|
||||||
int flairtime = yc.getInt("flairtime"), fcount = yc.getInt("fcount"), fdeaths = yc.getInt("fdeaths");
|
|
||||||
String flairstate = yc.getString("flairstate");
|
|
||||||
List<String> usernames = yc.getStringList("usernames");
|
|
||||||
boolean flaircheater = yc.getBoolean("flaircheater");
|
|
||||||
final String uuid = yc.getString("uuid");
|
|
||||||
C++;
|
|
||||||
if ((fcount == 0 || fdeaths == 0)
|
|
||||||
&& (flairstate == null || "NoComment".equals(flairstate) || flairtime <= 0))
|
|
||||||
return; // Those who received no Fs yet will also get their stats reset if no flair
|
|
||||||
final File file = new File(ChromaGamerBase.TBMC_PLAYERS_DIR + "minecraft", uuid + ".yml");
|
|
||||||
YamlConfiguration targetyc = YamlConfiguration.loadConfiguration(file);
|
|
||||||
targetyc.set("PlayerName", yc.getString("playername"));
|
|
||||||
targetyc.set("minecraft_id", uuid);
|
|
||||||
ConfigurationSection bc = targetyc.createSection("ButtonChat");
|
|
||||||
bc.set("FlairTime", "NoComment".equals(flairstate) ? -3 : flairtime); // FlairTimeNone: -3
|
|
||||||
bc.set("FCount", fcount);
|
|
||||||
bc.set("FDeaths", fdeaths);
|
|
||||||
bc.set("FlairState", flairstate);
|
|
||||||
bc.set("UserNames", usernames);
|
|
||||||
bc.set("FlairCheater", flaircheater);
|
|
||||||
targetyc.save(file);
|
|
||||||
keep++;
|
|
||||||
} catch (Exception e) {
|
|
||||||
TBMCCoreAPI.SendException("Error while converting player data!", e);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
Bukkit.getScheduler().runTask(this, () -> logger.info("Converted " + keep + " player data from " + C));
|
|
||||||
//TODO: Remove once ran it at least once
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -2,26 +2,60 @@ package buttondevteam.lib.chat;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import com.palmergames.bukkit.towny.exceptions.NotRegisteredException;
|
||||||
|
import com.palmergames.bukkit.towny.object.Nation;
|
||||||
|
import com.palmergames.bukkit.towny.object.Resident;
|
||||||
|
import com.palmergames.bukkit.towny.object.Town;
|
||||||
|
|
||||||
|
import buttondevteam.core.MainPlugin;
|
||||||
|
|
||||||
public class Channel {
|
public class Channel {
|
||||||
public final String DisplayName;
|
public final String DisplayName;
|
||||||
public final Color color;
|
public final Color color;
|
||||||
public final String Command;
|
public final String ID;
|
||||||
|
/**
|
||||||
|
* Filters both the sender and the targets
|
||||||
|
*/
|
||||||
|
public final Function<CommandSender, RecipientTestResult> filteranderrormsg;
|
||||||
|
|
||||||
private static List<Channel> channels = new ArrayList<>();
|
private static List<Channel> channels = new ArrayList<>();
|
||||||
|
|
||||||
public Channel(String displayname, Color color, String command) {
|
/**
|
||||||
|
* Creates a channel.
|
||||||
|
*
|
||||||
|
* @param displayname
|
||||||
|
* The name that should appear at the start of the message
|
||||||
|
* @param color
|
||||||
|
* The default color of the messages sent in the channel
|
||||||
|
* @param command
|
||||||
|
* The command to be used for the channel <i>without /</i>. For example "mod". It's also used for scoreboard objective names.
|
||||||
|
* @param filteranderrormsg
|
||||||
|
* Checks all senders against the criteria provided here and sends the message returned if it has an index - otherwise displays the error.<br>
|
||||||
|
* May be null to send to everyone.
|
||||||
|
*/
|
||||||
|
public Channel(String displayname, Color color, String command,
|
||||||
|
Function<CommandSender, RecipientTestResult> filteranderrormsg) {
|
||||||
DisplayName = displayname;
|
DisplayName = displayname;
|
||||||
this.color = color;
|
this.color = color;
|
||||||
Command = command;
|
ID = command;
|
||||||
|
this.filteranderrormsg = filteranderrormsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
static {
|
static {
|
||||||
channels.add(GlobalChat = new Channel("§fg§f", Color.White, "g"));
|
RegisterChannel(GlobalChat = new Channel("§fg§f", Color.White, "g", null));
|
||||||
channels.add(TownChat = new Channel("§3TC§f", Color.DarkAqua, "tc"));
|
RegisterChannel(TownChat = new Channel("§3TC§f", Color.DarkAqua, "tc", s -> checkTownNationChat(s, false)));
|
||||||
channels.add(NationChat = new Channel("§6NC§f", Color.Gold, "nc"));
|
RegisterChannel(NationChat = new Channel("§6NC§f", Color.Gold, "nc", s -> checkTownNationChat(s, true)));
|
||||||
channels.add(AdminChat = new Channel("§cADMIN§f", Color.Red, "a"));
|
RegisterChannel(AdminChat = new Channel("§cADMIN§f", Color.Red, "a", s -> s.isOp() ? new RecipientTestResult(0)
|
||||||
channels.add(ModChat = new Channel("§9MOD§f", Color.Blue, "mod"));
|
: new RecipientTestResult("You need to be an admin to use this channel.")));
|
||||||
|
RegisterChannel(ModChat = new Channel("§9MOD§f", Color.Blue, "mod",
|
||||||
|
s -> s.isOp() || (s instanceof Player && MainPlugin.permission.playerInGroup((Player) s, "mod"))
|
||||||
|
? new RecipientTestResult(0) //
|
||||||
|
: new RecipientTestResult("You need to be a mod to use this channel.")));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static List<Channel> getChannels() {
|
public static List<Channel> getChannels() {
|
||||||
|
@ -33,4 +67,77 @@ public class Channel {
|
||||||
public static Channel NationChat;
|
public static Channel NationChat;
|
||||||
public static Channel AdminChat;
|
public static Channel AdminChat;
|
||||||
public static Channel ModChat;
|
public static Channel ModChat;
|
||||||
|
|
||||||
|
static void RegisterChannel(Channel channel) {
|
||||||
|
channels.add(channel);
|
||||||
|
Bukkit.getPluginManager().callEvent(new ChatChannelRegisterEvent(channel));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the error message for the message sender if they can't send it and the score
|
||||||
|
*/
|
||||||
|
private static RecipientTestResult checkTownNationChat(CommandSender sender, boolean nationchat) {
|
||||||
|
if (!(sender instanceof Player))
|
||||||
|
return new RecipientTestResult("§cYou are not a player!");
|
||||||
|
try {
|
||||||
|
Resident resident = MainPlugin.TU.getResidentMap().get(sender.getName().toLowerCase());
|
||||||
|
if (resident != null && resident.getModes().contains("spy"))
|
||||||
|
return null;
|
||||||
|
/*
|
||||||
|
* p.sendMessage(String.format("[SPY-%s] - %s: %s", channel.DisplayName, ((Player) sender).getDisplayName(), message));
|
||||||
|
*/
|
||||||
|
Town town = null;
|
||||||
|
if (resident != null && resident.hasTown())
|
||||||
|
town = resident.getTown();
|
||||||
|
if (town == null)
|
||||||
|
return new RecipientTestResult("You aren't in a town.");
|
||||||
|
Nation nation = null;
|
||||||
|
int index = -1; // TODO: Move all this to the event in ButtonChat along with the channel definitions and make scores only for the sender...
|
||||||
|
if (nationchat) {
|
||||||
|
if (town.hasNation())
|
||||||
|
nation = town.getNation();
|
||||||
|
if (nation == null)
|
||||||
|
return new RecipientTestResult("Your town isn't in a nation.");
|
||||||
|
index = MainPlugin.Nations.indexOf(nation);
|
||||||
|
if (index < 0) {
|
||||||
|
MainPlugin.Nations.add(nation);
|
||||||
|
index = MainPlugin.Nations.size() - 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
index = MainPlugin.Towns.indexOf(town);
|
||||||
|
if (index < 0) {
|
||||||
|
MainPlugin.Towns.add(town);
|
||||||
|
index = MainPlugin.Towns.size() - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new RecipientTestResult(index);
|
||||||
|
} catch (NotRegisteredException e) {
|
||||||
|
return new RecipientTestResult("You (probably) aren't knwon by Towny! (Not in a town)");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class RecipientTestResult {
|
||||||
|
public String errormessage;
|
||||||
|
public int score;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a result that indicates an <b>error</b>
|
||||||
|
*
|
||||||
|
* @param errormessage
|
||||||
|
* The error message to show the sender if they don't meet the criteria.
|
||||||
|
*/
|
||||||
|
public RecipientTestResult(String errormessage) {
|
||||||
|
this.errormessage = errormessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a result that indicates a <b>success</b>
|
||||||
|
*
|
||||||
|
* @param score
|
||||||
|
* The score that identifies the target group. For example, the index of the town or nation to send to.
|
||||||
|
*/
|
||||||
|
public RecipientTestResult(int score) {
|
||||||
|
this.score = score;
|
||||||
|
} // TODO: Set score of players, if they get one, otherwise (on error) set score to -1
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
package buttondevteam.lib.chat;
|
||||||
|
|
||||||
|
import org.bukkit.event.Event;
|
||||||
|
import org.bukkit.event.HandlerList;
|
||||||
|
|
||||||
|
public class ChatChannelRegisterEvent extends Event {
|
||||||
|
private static final HandlerList handlers = new HandlerList();
|
||||||
|
|
||||||
|
private Channel channel;
|
||||||
|
|
||||||
|
public ChatChannelRegisterEvent(Channel channel) {
|
||||||
|
this.channel = channel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Channel getChannel() {
|
||||||
|
return channel;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public HandlerList getHandlers() {
|
||||||
|
return handlers;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static HandlerList getHandlerList() {
|
||||||
|
return handlers;
|
||||||
|
}
|
||||||
|
}
|
|
@ -215,4 +215,14 @@ public class TBMCChatAPI {
|
||||||
Bukkit.getPluginManager().callEvent(event);
|
Bukkit.getPluginManager().callEvent(event);
|
||||||
return event.isCancelled();
|
return event.isCancelled();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register a chat channel. See {@link Channel#Channel(String, Color, String, java.util.function.Function)} for details.
|
||||||
|
*
|
||||||
|
* @param channel
|
||||||
|
* A new {@link Channel} to register
|
||||||
|
*/
|
||||||
|
public static void RegisterChatChannel(Channel channel) {
|
||||||
|
Channel.RegisterChannel(channel);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue