Towny event broadcasting to Discord and masked links #96
27 changed files with 1046 additions and 1100 deletions
|
@ -1,25 +0,0 @@
|
|||
package buttondevteam.chat;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
|
||||
public class AnnouncerThread implements Runnable {
|
||||
private static int AnnounceMessageIndex = 0;
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
while (!PluginMain.Instance.stop) {
|
||||
try {
|
||||
Thread.sleep(PluginMain.AnnounceTime);
|
||||
} catch (InterruptedException ex) {
|
||||
Thread.currentThread().interrupt();
|
||||
}
|
||||
if (Bukkit.getOnlinePlayers().size() == 0) continue; //Don't post to Discord if nobody is on
|
||||
if (PluginMain.AnnounceMessages.size() > AnnounceMessageIndex) {
|
||||
Bukkit.broadcastMessage(PluginMain.AnnounceMessages.get(AnnounceMessageIndex));
|
||||
AnnounceMessageIndex++;
|
||||
if (AnnounceMessageIndex == PluginMain.AnnounceMessages.size())
|
||||
AnnounceMessageIndex = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,135 +1,132 @@
|
|||
package buttondevteam.chat;
|
||||
|
||||
import buttondevteam.lib.chat.Color;
|
||||
import buttondevteam.lib.player.EnumPlayerData;
|
||||
import buttondevteam.lib.player.PlayerClass;
|
||||
import buttondevteam.lib.player.PlayerData;
|
||||
import buttondevteam.lib.player.TBMCPlayerBase;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@PlayerClass(pluginname = "Button1Chat")
|
||||
public class ChatPlayer extends TBMCPlayerBase {
|
||||
public PlayerData<String> UserName() {
|
||||
return data(null);
|
||||
}
|
||||
|
||||
public List<String> UserNames() {
|
||||
return data(new ArrayList<String>()).get();
|
||||
}
|
||||
|
||||
public PlayerData<Integer> FlairTime() {
|
||||
return data(FlairTimeNone);
|
||||
}
|
||||
|
||||
public EnumPlayerData<FlairStates> FlairState() {
|
||||
return dataEnum(FlairStates.class, FlairStates.NoComment);
|
||||
}
|
||||
|
||||
public PlayerData<Integer> FCount() {
|
||||
return data(0);
|
||||
}
|
||||
|
||||
public PlayerData<Integer> FDeaths() {
|
||||
return data(0);
|
||||
}
|
||||
|
||||
public PlayerData<Boolean> FlairCheater() {
|
||||
return data(false);
|
||||
}
|
||||
|
||||
public PlayerData<ArrayList<Integer>> NameColorLocations() { // No byte[], no TIntArrayList
|
||||
return data(null);
|
||||
}
|
||||
|
||||
public Location SavedLocation;
|
||||
public boolean Working;
|
||||
// public int Tables = 10;
|
||||
public boolean SendingLink = false;
|
||||
public boolean RainbowPresserColorMode = false;
|
||||
public Color OtherColorMode = null;
|
||||
public boolean ChatOnly = false;
|
||||
public int LoginWarningCount = 0;
|
||||
|
||||
public static final int FlairTimeNonPresser = -1;
|
||||
public static final int FlairTimeCantPress = -2;
|
||||
public static final int FlairTimeNone = -3;
|
||||
|
||||
/**
|
||||
* Gets the player's flair, optionally formatting for Minecraft.
|
||||
*
|
||||
* @param noformats
|
||||
* The MC formatting codes will be only applied if false
|
||||
* @return The flair
|
||||
*/
|
||||
public String GetFormattedFlair(boolean noformats) {
|
||||
int time = FlairTime().get();
|
||||
if (time == FlairTimeCantPress)
|
||||
return noformats ? "(can't press)" : "§r(--s)§r";
|
||||
if (time == FlairTimeNonPresser)
|
||||
return noformats ? "(non-presser)" : "§7(--s)§r";
|
||||
if (time == FlairTimeNone)
|
||||
return "";
|
||||
return noformats ? String.format("(%ds)", time) : String.format("§%x(%ds)§r", GetFlairColor(), time);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the player's flair, formatted for Minecraft.
|
||||
*
|
||||
* @return The flair
|
||||
*/
|
||||
public String GetFormattedFlair() {
|
||||
return GetFormattedFlair(false);
|
||||
}
|
||||
|
||||
public void SetFlair(int time) {
|
||||
FlairTime().set(time);
|
||||
FlairUpdate();
|
||||
}
|
||||
|
||||
public void SetFlair(int time, boolean cheater) {
|
||||
FlairTime().set(time);
|
||||
FlairCheater().set(cheater);
|
||||
FlairUpdate();
|
||||
}
|
||||
|
||||
public void FlairUpdate() {
|
||||
|
||||
// Flairs from Command Block The Button - Teams
|
||||
// PluginMain.Instance.getServer().getScoreboardManager().getMainScoreboard().getTeams().add()
|
||||
Player p = Bukkit.getPlayer(uuid);
|
||||
if (p != null)
|
||||
p.setPlayerListName(String.format("%s%s", p.getDisplayName(), GetFormattedFlair()));
|
||||
}
|
||||
|
||||
public short GetFlairColor() {
|
||||
if (FlairCheater().get())
|
||||
return 0x5;
|
||||
final int flairTime = FlairTime().get();
|
||||
if (flairTime == FlairTimeNonPresser)
|
||||
return 0x7;
|
||||
else if (flairTime == FlairTimeCantPress)
|
||||
return 0xf;
|
||||
else if (flairTime <= 60 && flairTime >= 52)
|
||||
return 0x5;
|
||||
else if (flairTime <= 51 && flairTime >= 42)
|
||||
return 0x9;
|
||||
else if (flairTime <= 41 && flairTime >= 32)
|
||||
return 0xa;
|
||||
else if (flairTime <= 31 && flairTime >= 22)
|
||||
return 0xe;
|
||||
else if (flairTime <= 21 && flairTime >= 11)
|
||||
return 0x6;
|
||||
else if (flairTime <= 11 && flairTime >= 0)
|
||||
return 0xc;
|
||||
return 0x00; //Return 0 if none or too high, so names will get aqua default color, not white
|
||||
}
|
||||
|
||||
public double getF() {
|
||||
return (double) FCount().get() / (double) FDeaths().get();
|
||||
}
|
||||
}
|
||||
package buttondevteam.chat;
|
||||
|
||||
import buttondevteam.chat.components.flair.FlairStates;
|
||||
import buttondevteam.lib.chat.Color;
|
||||
import buttondevteam.lib.player.EnumPlayerData;
|
||||
import buttondevteam.lib.player.PlayerClass;
|
||||
import buttondevteam.lib.player.PlayerData;
|
||||
import buttondevteam.lib.player.TBMCPlayerBase;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@PlayerClass(pluginname = "Button1Chat")
|
||||
public class ChatPlayer extends TBMCPlayerBase {
|
||||
public PlayerData<String> UserName() {
|
||||
return data(null);
|
||||
}
|
||||
|
||||
public List<String> UserNames() {
|
||||
return data(new ArrayList<String>()).get();
|
||||
}
|
||||
|
||||
public PlayerData<Integer> FlairTime() {
|
||||
return data(FlairTimeNone);
|
||||
}
|
||||
|
||||
public EnumPlayerData<FlairStates> FlairState() {
|
||||
return dataEnum(FlairStates.class, FlairStates.NoComment);
|
||||
}
|
||||
|
||||
public PlayerData<Integer> FCount() {
|
||||
return data(0);
|
||||
}
|
||||
|
||||
public PlayerData<Integer> FDeaths() {
|
||||
return data(0);
|
||||
}
|
||||
|
||||
public PlayerData<Boolean> FlairCheater() {
|
||||
return data(false);
|
||||
}
|
||||
|
||||
public PlayerData<ArrayList<Integer>> NameColorLocations() { // No byte[], no TIntArrayList
|
||||
return data(null);
|
||||
}
|
||||
|
||||
public boolean Working;
|
||||
// public int Tables = 10;
|
||||
public boolean RainbowPresserColorMode = false;
|
||||
public Color OtherColorMode = null;
|
||||
public boolean ChatOnly = false;
|
||||
|
||||
public static final int FlairTimeNonPresser = -1;
|
||||
public static final int FlairTimeCantPress = -2;
|
||||
public static final int FlairTimeNone = -3;
|
||||
|
||||
/**
|
||||
* Gets the player's flair, optionally formatting for Minecraft.
|
||||
*
|
||||
* @param noformats
|
||||
* The MC formatting codes will be only applied if false
|
||||
* @return The flair
|
||||
*/
|
||||
public String GetFormattedFlair(boolean noformats) {
|
||||
int time = FlairTime().get();
|
||||
if (time == FlairTimeCantPress)
|
||||
return noformats ? "(can't press)" : "§r(--s)§r";
|
||||
if (time == FlairTimeNonPresser)
|
||||
return noformats ? "(non-presser)" : "§7(--s)§r";
|
||||
if (time == FlairTimeNone)
|
||||
return "";
|
||||
return noformats ? String.format("(%ds)", time) : String.format("§%x(%ds)§r", GetFlairColor(), time);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the player's flair, formatted for Minecraft.
|
||||
*
|
||||
* @return The flair
|
||||
*/
|
||||
public String GetFormattedFlair() {
|
||||
return GetFormattedFlair(false);
|
||||
}
|
||||
|
||||
public void SetFlair(int time) {
|
||||
FlairTime().set(time);
|
||||
FlairUpdate();
|
||||
}
|
||||
|
||||
public void SetFlair(int time, boolean cheater) {
|
||||
FlairTime().set(time);
|
||||
FlairCheater().set(cheater);
|
||||
FlairUpdate();
|
||||
}
|
||||
|
||||
public void FlairUpdate() {
|
||||
|
||||
// Flairs from Command Block The Button - Teams
|
||||
// PluginMain.Instance.getServer().getScoreboardManager().getMainScoreboard().getTeams().add()
|
||||
Player p = Bukkit.getPlayer(uuid);
|
||||
if (p != null)
|
||||
p.setPlayerListName(String.format("%s%s", p.getDisplayName(), GetFormattedFlair()));
|
||||
}
|
||||
|
||||
public short GetFlairColor() {
|
||||
if (FlairCheater().get())
|
||||
return 0x5;
|
||||
final int flairTime = FlairTime().get();
|
||||
if (flairTime == FlairTimeNonPresser)
|
||||
return 0x7;
|
||||
else if (flairTime == FlairTimeCantPress)
|
||||
return 0xf;
|
||||
else if (flairTime <= 60 && flairTime >= 52)
|
||||
return 0x5;
|
||||
else if (flairTime <= 51 && flairTime >= 42)
|
||||
return 0x9;
|
||||
else if (flairTime <= 41 && flairTime >= 32)
|
||||
return 0xa;
|
||||
else if (flairTime <= 31 && flairTime >= 22)
|
||||
return 0xe;
|
||||
else if (flairTime <= 21 && flairTime >= 11)
|
||||
return 0x6;
|
||||
else if (flairTime <= 11 && flairTime >= 0)
|
||||
return 0xc;
|
||||
return 0x00; //Return 0 if none or too high, so names will get aqua default color, not white
|
||||
}
|
||||
|
||||
public double getF() {
|
||||
return (double) FCount().get() / (double) FDeaths().get();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,90 +0,0 @@
|
|||
package buttondevteam.chat;
|
||||
|
||||
import java.io.BufferedInputStream;
|
||||
import java.io.BufferedOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.net.URL;
|
||||
import java.net.URLDecoder;
|
||||
import java.util.Enumeration;
|
||||
import java.util.jar.JarEntry;
|
||||
import java.util.jar.JarFile;
|
||||
|
||||
public class JarUtils {
|
||||
|
||||
public static boolean extractFromJar(final String fileName,
|
||||
final String dest) throws IOException {
|
||||
if (getRunningJar() == null) {
|
||||
return false;
|
||||
}
|
||||
final File file = new File(dest);
|
||||
if (file.isDirectory()) {
|
||||
file.mkdir();
|
||||
return false;
|
||||
}
|
||||
if (!file.exists()) {
|
||||
file.getParentFile().mkdirs();
|
||||
}
|
||||
|
||||
final JarFile jar = getRunningJar();
|
||||
final Enumeration<JarEntry> e = jar.entries();
|
||||
while (e.hasMoreElements()) {
|
||||
final JarEntry je = e.nextElement();
|
||||
if (!je.getName().contains(fileName)) {
|
||||
continue;
|
||||
}
|
||||
final InputStream in = new BufferedInputStream(
|
||||
jar.getInputStream(je));
|
||||
final OutputStream out = new BufferedOutputStream(
|
||||
new FileOutputStream(file));
|
||||
copyInputStream(in, out);
|
||||
jar.close();
|
||||
return true;
|
||||
}
|
||||
jar.close();
|
||||
return false;
|
||||
}
|
||||
|
||||
private final static void copyInputStream(final InputStream in,
|
||||
final OutputStream out) throws IOException {
|
||||
try {
|
||||
final byte[] buff = new byte[4096];
|
||||
int n;
|
||||
while ((n = in.read(buff)) > 0) {
|
||||
out.write(buff, 0, n);
|
||||
}
|
||||
} finally {
|
||||
out.flush();
|
||||
out.close();
|
||||
in.close();
|
||||
}
|
||||
}
|
||||
|
||||
public static URL getJarUrl(final File file) throws IOException {
|
||||
return new URL("jar:" + file.toURI().toURL().toExternalForm() + "!/");
|
||||
}
|
||||
|
||||
public static JarFile getRunningJar() throws IOException {
|
||||
if (!RUNNING_FROM_JAR) {
|
||||
return null; // null if not running from jar
|
||||
}
|
||||
String path = new File(JarUtils.class.getProtectionDomain()
|
||||
.getCodeSource().getLocation().getPath()).getAbsolutePath();
|
||||
path = URLDecoder.decode(path, "UTF-8");
|
||||
return new JarFile(path);
|
||||
}
|
||||
|
||||
private static boolean RUNNING_FROM_JAR = false;
|
||||
|
||||
static {
|
||||
final URL resource = JarUtils.class.getClassLoader().getResource(
|
||||
"plugin.yml");
|
||||
if (resource != null) {
|
||||
RUNNING_FROM_JAR = true;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -3,52 +3,36 @@ package buttondevteam.chat;
|
|||
import buttondevteam.chat.commands.YeehawCommand;
|
||||
import buttondevteam.chat.commands.ucmds.TownColorCommand;
|
||||
import buttondevteam.chat.components.TownColorComponent;
|
||||
import buttondevteam.chat.components.TownyComponent;
|
||||
import buttondevteam.chat.components.announce.AnnouncerComponent;
|
||||
import buttondevteam.chat.components.flair.FlairComponent;
|
||||
import buttondevteam.chat.components.towny.TownyComponent;
|
||||
import buttondevteam.chat.listener.PlayerJoinLeaveListener;
|
||||
import buttondevteam.chat.listener.PlayerListener;
|
||||
import buttondevteam.chat.listener.TownyListener;
|
||||
import buttondevteam.component.channel.Channel;
|
||||
import buttondevteam.component.channel.Channel.RecipientTestResult;
|
||||
import buttondevteam.lib.TBMCCoreAPI;
|
||||
import buttondevteam.lib.architecture.Component;
|
||||
import buttondevteam.lib.chat.Color;
|
||||
import buttondevteam.lib.chat.TBMCChatAPI;
|
||||
import buttondevteam.lib.player.TBMCPlayerBase;
|
||||
import com.earth2me.essentials.Essentials;
|
||||
import com.google.gson.JsonArray;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
import com.palmergames.bukkit.towny.Towny;
|
||||
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 com.palmergames.bukkit.towny.object.TownyUniverse;
|
||||
import lombok.val;
|
||||
import net.milkbowl.vault.chat.Chat;
|
||||
import net.milkbowl.vault.economy.Economy;
|
||||
import net.milkbowl.vault.permission.Permission;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.command.ConsoleCommandSender;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.plugin.RegisteredServiceProvider;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.bukkit.scoreboard.Scoreboard;
|
||||
import org.dynmap.towny.DTBridge;
|
||||
import org.dynmap.towny.DynmapTownyPlugin;
|
||||
import org.htmlcleaner.HtmlCleaner;
|
||||
import org.htmlcleaner.TagNode;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.net.URL;
|
||||
import java.net.URLConnection;
|
||||
import java.net.UnknownHostException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.*;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
|
@ -57,26 +41,11 @@ public class PluginMain extends JavaPlugin { // Translated to Java: 2015.07.15.
|
|||
// https://www.reddit.com/r/thebutton/comments/31c32v/i_pressed_the_button_without_really_thinking/
|
||||
public static PluginMain Instance;
|
||||
public static ConsoleCommandSender Console;
|
||||
private final static String FlairThreadURL = "https://www.reddit.com/r/Chromagamers/comments/51ys94/flair_thread_for_the_mc_server/";
|
||||
|
||||
public static Scoreboard SB;
|
||||
public static TownyUniverse TU;
|
||||
private static ArrayList<String> Towns;
|
||||
private static ArrayList<String> Nations;
|
||||
|
||||
public static Channel TownChat;
|
||||
public static Channel NationChat;
|
||||
private static Channel RPChannel;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* This variable is used as a cache for flair state checking when reading the flair thread.
|
||||
* </p>
|
||||
* <p>
|
||||
* It's used because normally it has to load all associated player files every time to read the flair state
|
||||
* </p>
|
||||
*/
|
||||
private Set<String> PlayersWithFlairs = new HashSet<>();
|
||||
|
||||
// Fired when plugin is first enabled
|
||||
@Override
|
||||
|
@ -92,18 +61,12 @@ public class PluginMain extends JavaPlugin { // Translated to Java: 2015.07.15.
|
|||
LoadFiles();
|
||||
|
||||
SB = getServer().getScoreboardManager().getMainScoreboard(); // Main can be detected with @a[score_...]
|
||||
TU = ((Towny) Bukkit.getPluginManager().getPlugin("Towny")).getTownyUniverse();
|
||||
Towns = TU.getTownsMap().values().stream().map(Town::getName).collect(Collectors.toCollection(ArrayList::new)); // Creates a snapshot of towns, new towns will be added when needed
|
||||
Nations = TU.getNationsMap().values().stream().map(Nation::getName).collect(Collectors.toCollection(ArrayList::new)); // Same here but with nations
|
||||
|
||||
TownColors.keySet().removeIf(t -> !TU.getTownsMap().containsKey(t)); // Removes town colors for deleted/renamed towns
|
||||
NationColor.keySet().removeIf(n -> !TU.getNationsMap().containsKey(n)); // Removes nation colors for deleted/renamed nations
|
||||
Component.registerComponent(this, new TownyComponent());
|
||||
TownColors.keySet().removeIf(t -> !TownyComponent.TU.getTownsMap().containsKey(t)); // Removes town colors for deleted/renamed towns
|
||||
NationColor.keySet().removeIf(n -> !TownyComponent.TU.getNationsMap().containsKey(n)); // Removes nation colors for deleted/renamed nations
|
||||
|
||||
TBMCChatAPI.RegisterChatChannel(
|
||||
TownChat = new Channel("§3TC§f", Color.DarkAqua, "tc", s -> checkTownNationChat(s, false)));
|
||||
TBMCChatAPI.RegisterChatChannel(
|
||||
NationChat = new Channel("§6NC§f", Color.Gold, "nc", s -> checkTownNationChat(s, true)));
|
||||
TBMCChatAPI.RegisterChatChannel(RPChannel = new Channel("§7RP§f", Color.Gray, "rp", null)); //Since it's null, it's recognised as global
|
||||
TBMCChatAPI.RegisterChatChannel(new Channel("§7RP§f", Color.Gray, "rp", null)); //Since it's null, it's recognised as global
|
||||
|
||||
Bukkit.getScheduler().runTask(this, () -> {
|
||||
val dtp = (DynmapTownyPlugin) Bukkit.getPluginManager().getPlugin("Dynmap-Towny");
|
||||
|
@ -116,11 +79,9 @@ public class PluginMain extends JavaPlugin { // Translated to Java: 2015.07.15.
|
|||
if (!setupEconomy() || !setupPermissions())
|
||||
TBMCCoreAPI.SendException("We're in trouble", new Exception("Failed to set up economy or permissions!"));
|
||||
|
||||
new Thread(this::FlairGetterThreadMethod).start();
|
||||
new Thread(new AnnouncerThread()).start();
|
||||
|
||||
Component.registerComponent(this, new TownyComponent());
|
||||
Component.registerComponent(this, new TownColorComponent());
|
||||
Component.registerComponent(this, new FlairComponent()); //The original purpose of this plugin
|
||||
Component.registerComponent(this, new AnnouncerComponent());
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -140,152 +101,14 @@ public class PluginMain extends JavaPlugin { // Translated to Java: 2015.07.15.
|
|||
}
|
||||
}
|
||||
|
||||
public Boolean stop = false;
|
||||
public static Essentials essentials = null;
|
||||
|
||||
// Fired when plugin is disabled
|
||||
@Override
|
||||
public void onDisable() {
|
||||
SaveFiles();
|
||||
stop = true;
|
||||
}
|
||||
|
||||
private void FlairGetterThreadMethod() {
|
||||
int errorcount = 0;
|
||||
while (!stop) {
|
||||
try {
|
||||
String body = TBMCCoreAPI.DownloadString(FlairThreadURL + ".json?limit=1000");
|
||||
JsonArray json = new JsonParser().parse(body).getAsJsonArray().get(1).getAsJsonObject().get("data")
|
||||
.getAsJsonObject().get("children").getAsJsonArray();
|
||||
for (Object obj : json) {
|
||||
JsonObject item = (JsonObject) obj;
|
||||
String author = item.get("data").getAsJsonObject().get("author").getAsString();
|
||||
String ign = item.get("data").getAsJsonObject().get("body").getAsString();
|
||||
int start = ign.indexOf("IGN:") + "IGN:".length();
|
||||
if (start == -1 + "IGN:".length())
|
||||
continue;
|
||||
int end = ign.indexOf(' ', start);
|
||||
if (end == -1 || end == start)
|
||||
end = ign.indexOf('\n', start);
|
||||
if (end == -1 || end == start)
|
||||
ign = ign.substring(start);
|
||||
else
|
||||
ign = ign.substring(start, end);
|
||||
ign = ign.trim();
|
||||
if (PlayersWithFlairs.contains(ign))
|
||||
continue;
|
||||
try (ChatPlayer mp = TBMCPlayerBase.getFromName(ign, ChatPlayer.class)) { // Loads player file
|
||||
if (mp == null)
|
||||
continue;
|
||||
/*
|
||||
* if (!JoinedBefore(mp, 2015, 6, 5)) continue;
|
||||
*/
|
||||
if (!mp.UserNames().contains(author))
|
||||
mp.UserNames().add(author);
|
||||
if (mp.FlairState().get().equals(FlairStates.NoComment)) {
|
||||
mp.FlairState().set(FlairStates.Commented);
|
||||
ConfirmUserMessage(mp);
|
||||
}
|
||||
PlayersWithFlairs.add(ign); // Don't redownload even if flair isn't accepted
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
errorcount++;
|
||||
if (errorcount >= 10) {
|
||||
errorcount = 0;
|
||||
if (!e.getMessage().contains("Server returned HTTP response code")
|
||||
&& !(e instanceof UnknownHostException))
|
||||
TBMCCoreAPI.SendException("Error while getting flairs from Reddit!", e);
|
||||
}
|
||||
}
|
||||
try {
|
||||
Thread.sleep(10000);
|
||||
} catch (InterruptedException ex) {
|
||||
Thread.currentThread().interrupt();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void DownloadFlair(ChatPlayer mp) throws IOException {
|
||||
String[] flairdata = TBMCCoreAPI
|
||||
.DownloadString("http://karmadecay.com/thebutton-data.php?users=" + mp.UserName().get())
|
||||
.replace("\"", "").split(":");
|
||||
String flair;
|
||||
if (flairdata.length > 1)
|
||||
flair = flairdata[1];
|
||||
else
|
||||
flair = "";
|
||||
String flairclass;
|
||||
if (flairdata.length > 2)
|
||||
flairclass = flairdata[2];
|
||||
else
|
||||
flairclass = "unknown";
|
||||
SetFlair(mp, flair, flairclass, mp.UserName().get());
|
||||
}
|
||||
|
||||
private void SetFlair(ChatPlayer p, String text, String flairclass, String username) {
|
||||
p.UserName().set(username);
|
||||
p.FlairState().set(FlairStates.Recognised);
|
||||
switch (flairclass) {
|
||||
case "cheater":
|
||||
p.SetFlair(Short.parseShort(text), true);
|
||||
return;
|
||||
case "unknown":
|
||||
try {
|
||||
if (CheckForJoinDate(p)) {
|
||||
if (text.equals("-1")) // If true, only non-presser/can't press; if false, any flair (but we can still detect can't press)
|
||||
p.SetFlair(ChatPlayer.FlairTimeNonPresser);
|
||||
else
|
||||
p.SetFlair(ChatPlayer.FlairTimeNone); // Flair unknown
|
||||
} else {
|
||||
p.SetFlair(ChatPlayer.FlairTimeCantPress);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
p.FlairState().set(FlairStates.Commented); // Flair unknown
|
||||
p.SetFlair(ChatPlayer.FlairTimeNone);
|
||||
TBMCCoreAPI.SendException("Error while checking join date for player " + p.PlayerName() + "!", e);
|
||||
}
|
||||
return;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
p.SetFlair(Short.parseShort(text));
|
||||
}
|
||||
|
||||
private static boolean CheckForJoinDate(ChatPlayer mp) throws Exception {
|
||||
return JoinedBefore(mp, 2015, 4, 1);
|
||||
}
|
||||
|
||||
private static boolean JoinedBefore(ChatPlayer mp, int year, int month, int day) throws Exception {
|
||||
URL url = new URL("https://www.reddit.com/u/" + mp.UserName());
|
||||
URLConnection con = url.openConnection();
|
||||
con.setRequestProperty("User-Agent", "TheButtonAutoFlair");
|
||||
InputStream in = con.getInputStream();
|
||||
HtmlCleaner cleaner = new HtmlCleaner();
|
||||
TagNode node = cleaner.clean(in);
|
||||
|
||||
node = node.getElementsByAttValue("class", "age", true, true)[0];
|
||||
node = node.getElementsByName("time", false)[0];
|
||||
String joindate = node.getAttributeByName("datetime");
|
||||
SimpleDateFormat parserSDF = new SimpleDateFormat("yyyy-MM-dd");
|
||||
joindate = joindate.split("T")[0];
|
||||
Date date = parserSDF.parse(joindate);
|
||||
return date.before(new Calendar.Builder().setTimeZone(TimeZone.getTimeZone("UTC")).setDate(year, month, day)
|
||||
.build().getTime());
|
||||
}
|
||||
|
||||
public static void ConfirmUserMessage(ChatPlayer mp) {
|
||||
Player p = Bukkit.getPlayer(mp.getUUID());
|
||||
if (mp.FlairState().get().equals(FlairStates.Commented) && p != null)
|
||||
if (mp.UserNames().size() > 1)
|
||||
p.sendMessage(
|
||||
"§9Multiple Reddit users commented your name. You can select with /u accept.§r §6Type /u accept or /u ignore§r");
|
||||
else
|
||||
p.sendMessage("§9A Reddit user commented your name. Is that you?§r §6Type /u accept or /u ignore§r");
|
||||
}
|
||||
|
||||
public static ArrayList<String> AnnounceMessages = new ArrayList<>();
|
||||
public static int AnnounceTime = 15 * 60 * 1000;
|
||||
/**
|
||||
* Names lowercased
|
||||
*/
|
||||
|
@ -305,9 +128,6 @@ public class PluginMain extends JavaPlugin { // Translated to Java: 2015.07.15.
|
|||
yc.load(file);
|
||||
PlayerListener.NotificationSound = yc.getString("notificationsound");
|
||||
PlayerListener.NotificationPitch = yc.getDouble("notificationpitch");
|
||||
AnnounceTime = yc.getInt("announcetime", 15 * 60 * 1000);
|
||||
AnnounceMessages.addAll(yc.getStringList("announcements"));
|
||||
PlayerListener.AlphaDeaths = yc.getInt("alphadeaths");
|
||||
val cs = yc.getConfigurationSection("towncolors");
|
||||
if (cs != null)
|
||||
TownColors.putAll(cs.getValues(true).entrySet().stream()
|
||||
|
@ -333,9 +153,6 @@ public class PluginMain extends JavaPlugin { // Translated to Java: 2015.07.15.
|
|||
YamlConfiguration yc = new YamlConfiguration();
|
||||
yc.set("notificationsound", PlayerListener.NotificationSound);
|
||||
yc.set("notificationpitch", PlayerListener.NotificationPitch);
|
||||
yc.set("announcetime", AnnounceTime);
|
||||
yc.set("announcements", AnnounceMessages);
|
||||
yc.set("alphadeaths", PlayerListener.AlphaDeaths);
|
||||
yc.createSection("towncolors", TownColors.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey,
|
||||
v -> Arrays.stream(v.getValue()).map(Enum::toString).toArray(String[]::new))));
|
||||
yc.set("towncolorcount", TownColorCommand.ColorCount);
|
||||
|
@ -361,16 +178,6 @@ public class PluginMain extends JavaPlugin { // Translated to Java: 2015.07.15.
|
|||
return (permission != null);
|
||||
}
|
||||
|
||||
private boolean setupChat() {
|
||||
RegisteredServiceProvider<Chat> chatProvider = getServer().getServicesManager()
|
||||
.getRegistration(net.milkbowl.vault.chat.Chat.class);
|
||||
if (chatProvider != null) {
|
||||
chat = chatProvider.getProvider();
|
||||
}
|
||||
|
||||
return (chat != null);
|
||||
}
|
||||
|
||||
private boolean setupEconomy() {
|
||||
RegisteredServiceProvider<Economy> economyProvider = getServer().getServicesManager()
|
||||
.getRegistration(net.milkbowl.vault.economy.Economy.class);
|
||||
|
@ -381,53 +188,4 @@ public class PluginMain extends JavaPlugin { // Translated to Java: 2015.07.15.
|
|||
return (economy != null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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!");
|
||||
Resident resident = PluginMain.TU.getResidentMap().get(sender.getName().toLowerCase());
|
||||
RecipientTestResult result = checkTownNationChatInternal(sender, nationchat, resident);
|
||||
if (result.errormessage != null && resident != null && resident.getModes().contains("spy")) // Only use spy if they wouldn't see it
|
||||
result = new RecipientTestResult(1000, "allspies"); // There won't be more than a thousand towns/nations probably
|
||||
return result;
|
||||
}
|
||||
|
||||
private static RecipientTestResult checkTownNationChatInternal(CommandSender sender, boolean nationchat,
|
||||
Resident resident) {
|
||||
try {
|
||||
/*
|
||||
* 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;
|
||||
if (nationchat) {
|
||||
if (town.hasNation())
|
||||
nation = town.getNation();
|
||||
if (nation == null)
|
||||
return new RecipientTestResult("Your town isn't in a nation.");
|
||||
index = getTownNationIndex(nation.getName(), true);
|
||||
} else
|
||||
index = getTownNationIndex(town.getName(), false);
|
||||
return new RecipientTestResult(index, nationchat ? nation.getName() : town.getName());
|
||||
} catch (NotRegisteredException e) {
|
||||
return new RecipientTestResult("You (probably) aren't knwon by Towny! (Not in a town)");
|
||||
}
|
||||
}
|
||||
|
||||
public static int getTownNationIndex(String name, boolean nation) {
|
||||
val list = nation ? Nations : Towns;
|
||||
int index = list.indexOf(name);
|
||||
if (index < 0) {
|
||||
list.add(name);
|
||||
index = list.size() - 1;
|
||||
}
|
||||
return index;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -39,9 +39,9 @@ public class HistoryCommand extends UCommandBase {
|
|||
sender.sendMessage("§6---- Chat History ----");
|
||||
Stream<Channel> stream;
|
||||
if (args.length == 0) {
|
||||
stream = Channel.getChannels().stream();
|
||||
stream = Channel.getChannels();
|
||||
} else {
|
||||
Optional<Channel> och = Channel.getChannels().stream().filter(chan -> chan.ID.equalsIgnoreCase(args[0])).findAny();
|
||||
Optional<Channel> och = Channel.getChannels().filter(chan -> chan.ID.equalsIgnoreCase(args[0])).findAny();
|
||||
if (!och.isPresent()) {
|
||||
sender.sendMessage("§cChannel not found. Use the ID, for example: /" + (hc == null ? "u history" : hc.GetCommandPath()) + " ooc");
|
||||
return true;
|
||||
|
|
|
@ -2,6 +2,7 @@ package buttondevteam.chat.commands.ucmds;
|
|||
|
||||
import buttondevteam.chat.ChatPlayer;
|
||||
import buttondevteam.chat.PluginMain;
|
||||
import buttondevteam.chat.components.towny.TownyComponent;
|
||||
import buttondevteam.chat.listener.PlayerJoinLeaveListener;
|
||||
import buttondevteam.lib.chat.Color;
|
||||
import buttondevteam.lib.chat.CommandClass;
|
||||
|
@ -34,7 +35,7 @@ public class NColorCommand extends UCommandBase {
|
|||
Resident res;
|
||||
Town town;
|
||||
try {
|
||||
if ((res = PluginMain.TU.getResidentMap().get(player.getName().toLowerCase())) == null || !res.hasTown()
|
||||
if ((res = TownyComponent.TU.getResidentMap().get(player.getName().toLowerCase())) == null || !res.hasTown()
|
||||
|| (town = res.getTown()) == null) {
|
||||
player.sendMessage("§cYou need to be in a town.");
|
||||
return true;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
package buttondevteam.chat.commands.ucmds;
|
||||
|
||||
import buttondevteam.chat.PluginMain;
|
||||
import buttondevteam.chat.components.towny.TownyComponent;
|
||||
import buttondevteam.lib.TBMCCoreAPI;
|
||||
import buttondevteam.lib.chat.CommandClass;
|
||||
import buttondevteam.lib.chat.OptionallyPlayerCommandClass;
|
||||
|
@ -26,8 +26,8 @@ public class NationColorCommand extends UCommandBase {
|
|||
@Override
|
||||
public boolean OnCommand(Player player, String alias, String[] args) {
|
||||
Resident res;
|
||||
if (!(PluginMain.TU.getResidentMap().containsKey(player.getName().toLowerCase())
|
||||
&& (res = PluginMain.TU.getResidentMap().get(player.getName().toLowerCase())).isKing())) {
|
||||
if (!(TownyComponent.TU.getResidentMap().containsKey(player.getName().toLowerCase())
|
||||
&& (res = TownyComponent.TU.getResidentMap().get(player.getName().toLowerCase())).isKing())) {
|
||||
player.sendMessage("§cYou need to be the king of a nation to set it's colors.");
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
package buttondevteam.chat.commands.ucmds;
|
||||
|
||||
import buttondevteam.chat.PluginMain;
|
||||
import buttondevteam.chat.components.towny.TownyComponent;
|
||||
import buttondevteam.lib.TBMCCoreAPI;
|
||||
import buttondevteam.lib.chat.CommandClass;
|
||||
import buttondevteam.lib.chat.OptionallyPlayerCommandClass;
|
||||
|
@ -31,8 +31,8 @@ public class TownColorCommand extends UCommandBase {
|
|||
@Override
|
||||
public boolean OnCommand(Player player, String alias, String[] args) {
|
||||
Resident res;
|
||||
if (!(PluginMain.TU.getResidentMap().containsKey(player.getName().toLowerCase())
|
||||
&& (res = PluginMain.TU.getResidentMap().get(player.getName().toLowerCase())).isMayor())) {
|
||||
if (!(TownyComponent.TU.getResidentMap().containsKey(player.getName().toLowerCase())
|
||||
&& (res = TownyComponent.TU.getResidentMap().get(player.getName().toLowerCase())).isMayor())) {
|
||||
player.sendMessage("§cYou need to be the mayor of a town to set it's colors.");
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package buttondevteam.chat.commands.ucmds.admin;
|
||||
|
||||
import buttondevteam.chat.PluginMain;
|
||||
import buttondevteam.chat.components.towny.TownyComponent;
|
||||
import buttondevteam.chat.listener.TownyListener;
|
||||
import buttondevteam.lib.chat.Color;
|
||||
import com.palmergames.bukkit.towny.object.Nation;
|
||||
|
@ -31,7 +32,7 @@ public class NationColorCommand extends AdminCommandBase {
|
|||
sender.sendMessage("§cYou can only use one color as a nation color.");
|
||||
return true;
|
||||
}
|
||||
final Nation nation = PluginMain.TU.getNationsMap().get(args[0].toLowerCase());
|
||||
final Nation nation = TownyComponent.TU.getNationsMap().get(args[0].toLowerCase());
|
||||
if (nation == null) {
|
||||
sender.sendMessage("§cThe nation '" + args[0] + "' cannot be found.");
|
||||
return true;
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package buttondevteam.chat.commands.ucmds.admin;
|
||||
|
||||
import buttondevteam.chat.PluginMain;
|
||||
import buttondevteam.chat.components.towny.TownyComponent;
|
||||
import buttondevteam.chat.listener.TownyListener;
|
||||
import buttondevteam.lib.chat.Color;
|
||||
import com.palmergames.bukkit.towny.object.Town;
|
||||
|
@ -35,12 +36,12 @@ public class TownColorCommand extends AdminCommandBase {
|
|||
public static boolean SetTownColor(CommandSender sender, String alias, String[] args) {
|
||||
if (args.length < 2)
|
||||
return false;
|
||||
if (!PluginMain.TU.getTownsMap().containsKey(args[0].toLowerCase())) {
|
||||
if (!TownyComponent.TU.getTownsMap().containsKey(args[0].toLowerCase())) {
|
||||
sender.sendMessage("§cThe town '" + args[0] + "' cannot be found.");
|
||||
return true;
|
||||
}
|
||||
Color[] clrs = new Color[args.length - 1];
|
||||
Town targetTown = PluginMain.TU.getTownsMap().get(args[0].toLowerCase());
|
||||
Town targetTown = TownyComponent.TU.getTownsMap().get(args[0].toLowerCase());
|
||||
for (int i = 1; i < args.length; i++) {
|
||||
val c = getColorOrSendError(args[i], sender);
|
||||
if (!c.isPresent())
|
||||
|
@ -50,7 +51,7 @@ public class TownColorCommand extends AdminCommandBase {
|
|||
for (Map.Entry<String, Color[]> other : PluginMain.TownColors.entrySet()) {
|
||||
Color nc, tnc;
|
||||
try {
|
||||
nc = PluginMain.NationColor.get(PluginMain.TU.getTownsMap().get(other.getKey()).getNation().getName().toLowerCase());
|
||||
nc = PluginMain.NationColor.get(TownyComponent.TU.getTownsMap().get(other.getKey()).getNation().getName().toLowerCase());
|
||||
} catch (Exception e) { //Too lazy for lots of null-checks and it may throw exceptions anyways
|
||||
nc = null;
|
||||
}
|
||||
|
@ -103,6 +104,6 @@ public class TownColorCommand extends AdminCommandBase {
|
|||
}
|
||||
|
||||
public static String getTownNameCased(String name) {
|
||||
return PluginMain.TU.getTownsMap().get(name.toLowerCase()).getName();
|
||||
return TownyComponent.TU.getTownsMap().get(name.toLowerCase()).getName();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,15 +0,0 @@
|
|||
package buttondevteam.chat.components;
|
||||
|
||||
import buttondevteam.lib.architecture.Component;
|
||||
|
||||
public class TownyComponent extends Component {
|
||||
@Override
|
||||
protected void enable() {
|
||||
TownyAnnouncer.setup();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void disable() {
|
||||
TownyAnnouncer.setdown();
|
||||
}
|
||||
}
|
|
@ -1,37 +1,36 @@
|
|||
package buttondevteam.chat.commands.ucmds.announce;
|
||||
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
import buttondevteam.chat.PluginMain;
|
||||
|
||||
public class AddCommand extends AnnounceCommandBase {
|
||||
|
||||
@Override
|
||||
public String[] GetHelpText(String alias) {
|
||||
return new String[] {
|
||||
"§6---- Add announcement ----",
|
||||
"This command adds a new announcement",
|
||||
"Note: Please avoid using this command, if possible",
|
||||
"Instead, use the command blocks in flatworld to set announcements",
|
||||
"This makes editing announcements easier" };
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean OnCommand(CommandSender sender, String alias,
|
||||
String[] args) {
|
||||
if (args.length < 1) {
|
||||
return false;
|
||||
}
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (int i = 0; i < args.length; i++) {
|
||||
sb.append(args[i]);
|
||||
if (i != args.length - 1)
|
||||
sb.append(" ");
|
||||
}
|
||||
String finalmessage = sb.toString().replace('&', '§');
|
||||
PluginMain.AnnounceMessages.add(finalmessage);
|
||||
sender.sendMessage("§bAnnouncement added. - Plase avoid using this command if possible, see /u announce add without args.§r");
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
package buttondevteam.chat.components.announce;
|
||||
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
public class AddCommand extends AnnounceCommandBase {
|
||||
|
||||
@Override
|
||||
public String[] GetHelpText(String alias) {
|
||||
return new String[] {
|
||||
"§6---- Add announcement ----",
|
||||
"This command adds a new announcement",
|
||||
"Note: Please avoid using this command, if possible",
|
||||
"Instead, use the command blocks in flatworld to set announcements",
|
||||
"This makes editing announcements easier" };
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean OnCommand(CommandSender sender, String alias,
|
||||
String[] args) {
|
||||
if (args.length < 1) {
|
||||
return false;
|
||||
}
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (int i = 0; i < args.length; i++) {
|
||||
sb.append(args[i]);
|
||||
if (i != args.length - 1)
|
||||
sb.append(" ");
|
||||
}
|
||||
String finalmessage = sb.toString().replace('&', '§');
|
||||
AnnouncerComponent component = (AnnouncerComponent) getComponent();
|
||||
component.AnnounceMessages().get().add(finalmessage);
|
||||
sender.sendMessage("§bAnnouncement added. - Plase avoid using this command if possible, see /u announce add without args.§r");
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,13 +1,13 @@
|
|||
package buttondevteam.chat.commands.ucmds.announce;
|
||||
|
||||
import buttondevteam.chat.commands.ucmds.UCommandBase;
|
||||
import buttondevteam.lib.chat.CommandClass;
|
||||
import buttondevteam.lib.chat.OptionallyPlayerCommandClass;
|
||||
|
||||
@CommandClass(modOnly = true)
|
||||
@OptionallyPlayerCommandClass(playerOnly = false)
|
||||
public abstract class AnnounceCommandBase extends UCommandBase {
|
||||
|
||||
public abstract String[] GetHelpText(String alias);
|
||||
|
||||
}
|
||||
package buttondevteam.chat.components.announce;
|
||||
|
||||
import buttondevteam.chat.commands.ucmds.UCommandBase;
|
||||
import buttondevteam.lib.chat.CommandClass;
|
||||
import buttondevteam.lib.chat.OptionallyPlayerCommandClass;
|
||||
|
||||
@CommandClass(modOnly = true)
|
||||
@OptionallyPlayerCommandClass(playerOnly = false)
|
||||
public abstract class AnnounceCommandBase extends UCommandBase {
|
||||
|
||||
public abstract String[] GetHelpText(String alias);
|
||||
|
||||
}
|
|
@ -0,0 +1,50 @@
|
|||
package buttondevteam.chat.components.announce;
|
||||
|
||||
import buttondevteam.lib.architecture.Component;
|
||||
import buttondevteam.lib.architecture.ConfigData;
|
||||
import org.bukkit.Bukkit;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class AnnouncerComponent extends Component implements Runnable {
|
||||
public ConfigData<ArrayList<String>> AnnounceMessages() {
|
||||
return getConfig().getData("announceMessages", new ArrayList<>(0));
|
||||
}
|
||||
|
||||
public ConfigData<Integer> AnnounceTime() {
|
||||
return getConfig().getData("announceTime", 15 * 60 * 1000);
|
||||
}
|
||||
private static int AnnounceMessageIndex = 0;
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
while (isEnabled()) {
|
||||
try {
|
||||
Thread.sleep(AnnounceTime().get());
|
||||
} catch (InterruptedException ex) {
|
||||
Thread.currentThread().interrupt();
|
||||
}
|
||||
if (Bukkit.getOnlinePlayers().size() == 0) continue; //Don't post to Discord if nobody is on
|
||||
if (AnnounceMessages().get().size() > AnnounceMessageIndex) {
|
||||
Bukkit.broadcastMessage(AnnounceMessages().get().get(AnnounceMessageIndex));
|
||||
AnnounceMessageIndex++;
|
||||
if (AnnounceMessageIndex == AnnounceMessages().get().size())
|
||||
AnnounceMessageIndex = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void enable() {
|
||||
registerCommand(new AddCommand());
|
||||
registerCommand(new EditCommand());
|
||||
registerCommand(new ListCommand());
|
||||
registerCommand(new RemoveCommand());
|
||||
registerCommand(new SetTimeCommand());
|
||||
new Thread(this).start();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void disable() {
|
||||
}
|
||||
}
|
|
@ -1,45 +1,44 @@
|
|||
package buttondevteam.chat.commands.ucmds.announce;
|
||||
|
||||
import org.bukkit.command.BlockCommandSender;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
import buttondevteam.chat.PluginMain;
|
||||
|
||||
public class EditCommand extends AnnounceCommandBase {
|
||||
|
||||
@Override
|
||||
public String[] GetHelpText(String alias) {
|
||||
return new String[] { "§6---- Edit announcement ----",
|
||||
"This command can only be used in a command block.",
|
||||
"Usage: /u annonunce edit <index> <text>" };
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean OnCommand(CommandSender sender, String alias,
|
||||
String[] args) {
|
||||
if (!(sender instanceof BlockCommandSender)) {
|
||||
sender.sendMessage("§cError: This command can only be used from a command block. You can use add and remove, though it's not recommended.");
|
||||
return true;
|
||||
}
|
||||
if (args.length < 1) {
|
||||
return false;
|
||||
}
|
||||
StringBuilder sb1 = new StringBuilder();
|
||||
for (int i1 = 1; i1 < args.length; i1++) {
|
||||
sb1.append(args[i1]);
|
||||
if (i1 != args.length - 1)
|
||||
sb1.append(" ");
|
||||
}
|
||||
String finalmessage1 = sb1.toString().replace('&', '§');
|
||||
int index = Integer.parseInt(args[0]);
|
||||
if (index > 100)
|
||||
return false;
|
||||
while (PluginMain.AnnounceMessages.size() <= index)
|
||||
PluginMain.AnnounceMessages.add("");
|
||||
PluginMain.AnnounceMessages.set(Integer.parseInt(args[0]),
|
||||
finalmessage1);
|
||||
sender.sendMessage("Announcement edited.");
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
package buttondevteam.chat.components.announce;
|
||||
|
||||
import org.bukkit.command.BlockCommandSender;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
public class EditCommand extends AnnounceCommandBase {
|
||||
|
||||
@Override
|
||||
public String[] GetHelpText(String alias) {
|
||||
return new String[] { "§6---- Edit announcement ----",
|
||||
"This command can only be used in a command block.",
|
||||
"Usage: /u annonunce edit <index> <text>" };
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean OnCommand(CommandSender sender, String alias,
|
||||
String[] args) {
|
||||
if (!(sender instanceof BlockCommandSender)) {
|
||||
sender.sendMessage("§cError: This command can only be used from a command block. You can use add and remove, though it's not recommended.");
|
||||
return true;
|
||||
}
|
||||
if (args.length < 1) {
|
||||
return false;
|
||||
}
|
||||
StringBuilder sb1 = new StringBuilder();
|
||||
for (int i1 = 1; i1 < args.length; i1++) {
|
||||
sb1.append(args[i1]);
|
||||
if (i1 != args.length - 1)
|
||||
sb1.append(" ");
|
||||
}
|
||||
String finalmessage1 = sb1.toString().replace('&', '§');
|
||||
int index = Integer.parseInt(args[0]);
|
||||
if (index > 100)
|
||||
return false;
|
||||
AnnouncerComponent component = (AnnouncerComponent) getComponent();
|
||||
while (component.AnnounceMessages().get().size() <= index)
|
||||
component.AnnounceMessages().get().add("");
|
||||
component.AnnounceMessages().get().set(Integer.parseInt(args[0]),
|
||||
finalmessage1);
|
||||
sender.sendMessage("Announcement edited.");
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,28 +1,27 @@
|
|||
package buttondevteam.chat.commands.ucmds.announce;
|
||||
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
import buttondevteam.chat.PluginMain;
|
||||
|
||||
public class ListCommand extends AnnounceCommandBase {
|
||||
|
||||
@Override
|
||||
public String[] GetHelpText(String alias) {
|
||||
return new String[] { "§6---- List announcements ----",
|
||||
"This command lists the announcements and the time between them" };
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean OnCommand(CommandSender sender, String alias,
|
||||
String[] args) {
|
||||
sender.sendMessage("§bList of announce messages:§r");
|
||||
sender.sendMessage("§bFormat: [index] message§r");
|
||||
int i = 0;
|
||||
for (String message : PluginMain.AnnounceMessages)
|
||||
sender.sendMessage("[" + i++ + "] " + message);
|
||||
sender.sendMessage("§bCurrent wait time between announcements: "
|
||||
+ PluginMain.AnnounceTime / 60 / 1000 + " minute(s)§r");
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
package buttondevteam.chat.components.announce;
|
||||
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
public class ListCommand extends AnnounceCommandBase {
|
||||
|
||||
@Override
|
||||
public String[] GetHelpText(String alias) {
|
||||
return new String[] { "§6---- List announcements ----",
|
||||
"This command lists the announcements and the time between them" };
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean OnCommand(CommandSender sender, String alias,
|
||||
String[] args) {
|
||||
sender.sendMessage("§bList of announce messages:§r");
|
||||
sender.sendMessage("§bFormat: [index] message§r");
|
||||
int i = 0;
|
||||
AnnouncerComponent component = (AnnouncerComponent) getComponent();
|
||||
for (String message : component.AnnounceMessages().get())
|
||||
sender.sendMessage("[" + i++ + "] " + message);
|
||||
sender.sendMessage("§bCurrent wait time between announcements: "
|
||||
+ component.AnnounceTime().get() / 60 / 1000 + " minute(s)§r");
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,30 +1,28 @@
|
|||
package buttondevteam.chat.commands.ucmds.announce;
|
||||
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
import buttondevteam.chat.PluginMain;
|
||||
|
||||
public class RemoveCommand extends AnnounceCommandBase {
|
||||
|
||||
@Override
|
||||
public String[] GetHelpText(String alias) {
|
||||
return new String[] {
|
||||
"§6---- Remove announcement ----",
|
||||
"This command removes an announcement",
|
||||
"Note: Please avoid using this command, if possible",
|
||||
"Instead, use the command blocks in flatworld to set announcements",
|
||||
"This makes editing announcements easier" };
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean OnCommand(CommandSender sender, String alias,
|
||||
String[] args) {
|
||||
if (args.length < 1) {
|
||||
sender.sendMessage("§cUsage: /u announce remove <index>");
|
||||
return true;
|
||||
}
|
||||
PluginMain.AnnounceMessages.remove(Integer.parseInt(args[0]));
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
package buttondevteam.chat.components.announce;
|
||||
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
public class RemoveCommand extends AnnounceCommandBase {
|
||||
|
||||
@Override
|
||||
public String[] GetHelpText(String alias) {
|
||||
return new String[] {
|
||||
"§6---- Remove announcement ----",
|
||||
"This command removes an announcement",
|
||||
"Note: Please avoid using this command, if possible",
|
||||
"Instead, use the command blocks in flatworld to set announcements",
|
||||
"This makes editing announcements easier" };
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean OnCommand(CommandSender sender, String alias,
|
||||
String[] args) {
|
||||
if (args.length < 1) {
|
||||
sender.sendMessage("§cUsage: /u announce remove <index>");
|
||||
return true;
|
||||
}
|
||||
((AnnouncerComponent) getComponent()).AnnounceMessages().get().remove(Integer.parseInt(args[0]));
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,33 +1,31 @@
|
|||
package buttondevteam.chat.commands.ucmds.announce;
|
||||
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
import buttondevteam.chat.PluginMain;
|
||||
|
||||
public class SetTimeCommand extends AnnounceCommandBase {
|
||||
|
||||
@Override
|
||||
public String[] GetHelpText(String alias) {
|
||||
return new String[] { "§6---- Set time ----",
|
||||
"This command sets the time between the announcements",
|
||||
"Usage: /u anonunce settime <minutes>", "Default: 15" };
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean OnCommand(CommandSender sender, String alias,
|
||||
String[] args) {
|
||||
if (args.length < 1) {
|
||||
return false;
|
||||
}
|
||||
try {
|
||||
PluginMain.AnnounceTime = Integer.parseInt(args[0]) * 60 * 1000;
|
||||
} catch (Exception e) {
|
||||
sender.sendMessage("§cMinutes argument must be a number. Got: "
|
||||
+ args[0]);
|
||||
return true;
|
||||
}
|
||||
sender.sendMessage("Time set between announce messages");
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
package buttondevteam.chat.components.announce;
|
||||
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
public class SetTimeCommand extends AnnounceCommandBase {
|
||||
|
||||
@Override
|
||||
public String[] GetHelpText(String alias) {
|
||||
return new String[] { "§6---- Set time ----",
|
||||
"This command sets the time between the announcements",
|
||||
"Usage: /u anonunce settime <minutes>", "Default: 15" };
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean OnCommand(CommandSender sender, String alias,
|
||||
String[] args) {
|
||||
if (args.length < 1) {
|
||||
return false;
|
||||
}
|
||||
try {
|
||||
((AnnouncerComponent) getComponent()).AnnounceTime().set(Integer.parseInt(args[0]) * 60 * 1000);
|
||||
} catch (Exception e) {
|
||||
sender.sendMessage("§cMinutes argument must be a number. Got: "
|
||||
+ args[0]);
|
||||
return true;
|
||||
}
|
||||
sender.sendMessage("Time set between announce messages");
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,99 +1,97 @@
|
|||
package buttondevteam.chat.commands.ucmds;
|
||||
|
||||
import java.util.Timer;
|
||||
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import buttondevteam.chat.ChatPlayer;
|
||||
import buttondevteam.chat.FlairStates;
|
||||
import buttondevteam.chat.PlayerJoinTimerTask;
|
||||
import buttondevteam.chat.PluginMain;
|
||||
import buttondevteam.lib.TBMCCoreAPI;
|
||||
import buttondevteam.lib.chat.CommandClass;
|
||||
import buttondevteam.lib.chat.OptionallyPlayerCommandClass;
|
||||
import buttondevteam.lib.player.TBMCPlayer;
|
||||
|
||||
@CommandClass(modOnly = false)
|
||||
@OptionallyPlayerCommandClass(playerOnly = true)
|
||||
public class AcceptCommand extends UCommandBase {
|
||||
|
||||
@Override
|
||||
public String[] GetHelpText(String alias) {
|
||||
return new String[] { "§6---- Accept flair ----", //
|
||||
"Accepts a flair from Reddit", //
|
||||
"Use /u accept <username> if you commented from multiple accounts" //
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean OnCommand(CommandSender sender, String alias, String[] args) {
|
||||
final Player player = (Player) sender;
|
||||
ChatPlayer p = TBMCPlayer.getPlayer(player.getUniqueId(), ChatPlayer.class);
|
||||
if (args.length < 1 && p.UserNames().size() > 1) {
|
||||
player.sendMessage("§9Multiple users commented your name. §bPlease pick one using /u accept <username>");
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("§6Usernames:");
|
||||
for (String username : p.UserNames())
|
||||
sb.append(" ").append(username);
|
||||
player.sendMessage(sb.toString());
|
||||
return true;
|
||||
}
|
||||
if (p.FlairState().get().equals(FlairStates.NoComment) || p.UserNames().size() == 0) {
|
||||
player.sendMessage("§cError: You need to write your username to the reddit thread at /r/ChromaGamers§r");
|
||||
return true;
|
||||
}
|
||||
if (args.length > 0 && !p.UserNames().contains(args[0])) {
|
||||
player.sendMessage("§cError: Unknown name: " + args[0] + "§r");
|
||||
return true;
|
||||
}
|
||||
if (p.Working) {
|
||||
player.sendMessage("§cError: Something is already in progress.§r");
|
||||
return true;
|
||||
}
|
||||
|
||||
if ((args.length > 0 ? args[0] : p.UserNames().get(0)).equals(p.UserName().get())) {
|
||||
player.sendMessage("§cYou already have this user's flair.§r");
|
||||
return true;
|
||||
}
|
||||
if (args.length > 0)
|
||||
p.UserName().set(args[0]);
|
||||
else
|
||||
p.UserName().set(p.UserNames().get(0));
|
||||
|
||||
player.sendMessage("§bObtaining flair...");
|
||||
p.Working = true;
|
||||
Timer timer = new Timer();
|
||||
PlayerJoinTimerTask tt = new PlayerJoinTimerTask() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
PluginMain.Instance.DownloadFlair(mp);
|
||||
} catch (Exception e) {
|
||||
TBMCCoreAPI.SendException(
|
||||
"An error occured while downloading flair for " + player.getCustomName() + "!", e);
|
||||
player.sendMessage(
|
||||
"Sorry, but an error occured while trying to get your flair. Please contact a mod.");
|
||||
mp.Working = false;
|
||||
return;
|
||||
}
|
||||
|
||||
if (mp.FlairState().get().equals(FlairStates.Commented)) {
|
||||
player.sendMessage(
|
||||
"Sorry, but your flair isn't recorded. Please ask an admin to set it for you. Also, prepare a comment on /r/thebutton, if possible.");
|
||||
mp.Working = false;
|
||||
return;
|
||||
}
|
||||
String flair = mp.GetFormattedFlair();
|
||||
mp.FlairState().set(FlairStates.Accepted);
|
||||
PluginMain.ConfirmUserMessage(mp);
|
||||
player.sendMessage("§bYour flair has been set:§r " + flair);
|
||||
mp.Working = false;
|
||||
}
|
||||
};
|
||||
tt.mp = p;
|
||||
timer.schedule(tt, 20);
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
package buttondevteam.chat.components.flair;
|
||||
|
||||
import buttondevteam.chat.ChatPlayer;
|
||||
import buttondevteam.chat.PlayerJoinTimerTask;
|
||||
import buttondevteam.chat.commands.ucmds.UCommandBase;
|
||||
import buttondevteam.lib.TBMCCoreAPI;
|
||||
import buttondevteam.lib.chat.CommandClass;
|
||||
import buttondevteam.lib.chat.OptionallyPlayerCommandClass;
|
||||
import buttondevteam.lib.player.TBMCPlayer;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.Timer;
|
||||
|
||||
@CommandClass(modOnly = false)
|
||||
@OptionallyPlayerCommandClass(playerOnly = true)
|
||||
public class AcceptCommand extends UCommandBase {
|
||||
|
||||
@Override
|
||||
public String[] GetHelpText(String alias) {
|
||||
return new String[] { "§6---- Accept flair ----", //
|
||||
"Accepts a flair from Reddit", //
|
||||
"Use /u accept <username> if you commented from multiple accounts" //
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean OnCommand(CommandSender sender, String alias, String[] args) {
|
||||
final Player player = (Player) sender;
|
||||
ChatPlayer p = TBMCPlayer.getPlayer(player.getUniqueId(), ChatPlayer.class);
|
||||
if (args.length < 1 && p.UserNames().size() > 1) {
|
||||
player.sendMessage("§9Multiple users commented your name. §bPlease pick one using /u accept <username>");
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("§6Usernames:");
|
||||
for (String username : p.UserNames())
|
||||
sb.append(" ").append(username);
|
||||
player.sendMessage(sb.toString());
|
||||
return true;
|
||||
}
|
||||
if (p.FlairState().get().equals(FlairStates.NoComment) || p.UserNames().size() == 0) {
|
||||
player.sendMessage("§cError: You need to write your username to the reddit thread at /r/ChromaGamers§r");
|
||||
return true;
|
||||
}
|
||||
if (args.length > 0 && !p.UserNames().contains(args[0])) {
|
||||
player.sendMessage("§cError: Unknown name: " + args[0] + "§r");
|
||||
return true;
|
||||
}
|
||||
if (p.Working) {
|
||||
player.sendMessage("§cError: Something is already in progress.§r");
|
||||
return true;
|
||||
}
|
||||
|
||||
if ((args.length > 0 ? args[0] : p.UserNames().get(0)).equals(p.UserName().get())) {
|
||||
player.sendMessage("§cYou already have this user's flair.§r");
|
||||
return true;
|
||||
}
|
||||
if (args.length > 0)
|
||||
p.UserName().set(args[0]);
|
||||
else
|
||||
p.UserName().set(p.UserNames().get(0));
|
||||
|
||||
player.sendMessage("§bObtaining flair...");
|
||||
p.Working = true;
|
||||
Timer timer = new Timer();
|
||||
PlayerJoinTimerTask tt = new PlayerJoinTimerTask() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
FlairComponent.DownloadFlair(mp);
|
||||
} catch (Exception e) {
|
||||
TBMCCoreAPI.SendException(
|
||||
"An error occured while downloading flair for " + player.getCustomName() + "!", e);
|
||||
player.sendMessage(
|
||||
"Sorry, but an error occured while trying to get your flair. Please contact a mod.");
|
||||
mp.Working = false;
|
||||
return;
|
||||
}
|
||||
|
||||
if (mp.FlairState().get().equals(FlairStates.Commented)) {
|
||||
player.sendMessage(
|
||||
"Sorry, but your flair isn't recorded. Please ask an admin to set it for you. Also, prepare a comment on /r/thebutton, if possible.");
|
||||
mp.Working = false;
|
||||
return;
|
||||
}
|
||||
String flair = mp.GetFormattedFlair();
|
||||
mp.FlairState().set(FlairStates.Accepted);
|
||||
FlairComponent.ConfirmUserMessage(mp);
|
||||
player.sendMessage("§bYour flair has been set:§r " + flair);
|
||||
mp.Working = false;
|
||||
}
|
||||
};
|
||||
tt.mp = p;
|
||||
timer.schedule(tt, 20);
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,185 @@
|
|||
package buttondevteam.chat.components.flair;
|
||||
|
||||
import buttondevteam.chat.ChatPlayer;
|
||||
import buttondevteam.lib.TBMCCoreAPI;
|
||||
import buttondevteam.lib.architecture.Component;
|
||||
import buttondevteam.lib.architecture.ConfigData;
|
||||
import buttondevteam.lib.player.TBMCPlayerBase;
|
||||
import com.google.gson.JsonArray;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.htmlcleaner.HtmlCleaner;
|
||||
import org.htmlcleaner.TagNode;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.net.URL;
|
||||
import java.net.URLConnection;
|
||||
import java.net.UnknownHostException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.*;
|
||||
|
||||
public class FlairComponent extends Component {
|
||||
private ConfigData<String> FlairThreadURL() {
|
||||
return getConfig().getData("flairThreadURL", "https://www.reddit.com/r/Chromagamers/comments/51ys94/flair_thread_for_the_mc_server/");
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* This variable is used as a cache for flair state checking when reading the flair thread.
|
||||
* </p>
|
||||
* <p>
|
||||
* It's used because normally it has to load all associated player files every time to read the flair state
|
||||
* </p>
|
||||
*/
|
||||
private Set<String> PlayersWithFlairs = new HashSet<>();
|
||||
|
||||
@Override
|
||||
protected void enable() {
|
||||
registerCommand(new AcceptCommand());
|
||||
registerCommand(new IgnoreCommand());
|
||||
registerCommand(new SetFlairCommand());
|
||||
new Thread(this::FlairGetterThreadMethod).start();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void disable() {
|
||||
|
||||
}
|
||||
|
||||
private void FlairGetterThreadMethod() {
|
||||
int errorcount = 0;
|
||||
while (isEnabled()) {
|
||||
try {
|
||||
String body = TBMCCoreAPI.DownloadString(FlairThreadURL().get() + ".json?limit=1000");
|
||||
JsonArray json = new JsonParser().parse(body).getAsJsonArray().get(1).getAsJsonObject().get("data")
|
||||
.getAsJsonObject().get("children").getAsJsonArray();
|
||||
for (Object obj : json) {
|
||||
JsonObject item = (JsonObject) obj;
|
||||
String author = item.get("data").getAsJsonObject().get("author").getAsString();
|
||||
String ign = item.get("data").getAsJsonObject().get("body").getAsString();
|
||||
int start = ign.indexOf("IGN:") + "IGN:".length();
|
||||
if (start == -1 + "IGN:".length())
|
||||
continue;
|
||||
int end = ign.indexOf(' ', start);
|
||||
if (end == -1 || end == start)
|
||||
end = ign.indexOf('\n', start);
|
||||
if (end == -1 || end == start)
|
||||
ign = ign.substring(start);
|
||||
else
|
||||
ign = ign.substring(start, end);
|
||||
ign = ign.trim();
|
||||
if (PlayersWithFlairs.contains(ign))
|
||||
continue;
|
||||
try (ChatPlayer mp = TBMCPlayerBase.getFromName(ign, ChatPlayer.class)) { // Loads player file
|
||||
if (mp == null)
|
||||
continue;
|
||||
/*
|
||||
* if (!JoinedBefore(mp, 2015, 6, 5)) continue;
|
||||
*/
|
||||
if (!mp.UserNames().contains(author))
|
||||
mp.UserNames().add(author);
|
||||
if (mp.FlairState().get().equals(FlairStates.NoComment)) {
|
||||
mp.FlairState().set(FlairStates.Commented);
|
||||
ConfirmUserMessage(mp);
|
||||
}
|
||||
PlayersWithFlairs.add(ign); // Don't redownload even if flair isn't accepted
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
errorcount++;
|
||||
if (errorcount >= 10) {
|
||||
errorcount = 0;
|
||||
if (!e.getMessage().contains("Server returned HTTP response code")
|
||||
&& !(e instanceof UnknownHostException))
|
||||
TBMCCoreAPI.SendException("Error while getting flairs from Reddit!", e);
|
||||
}
|
||||
}
|
||||
try {
|
||||
Thread.sleep(10000);
|
||||
} catch (InterruptedException ex) {
|
||||
Thread.currentThread().interrupt();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void DownloadFlair(ChatPlayer mp) throws IOException {
|
||||
String[] flairdata = TBMCCoreAPI
|
||||
.DownloadString("http://karmadecay.com/thebutton-data.php?users=" + mp.UserName().get())
|
||||
.replace("\"", "").split(":");
|
||||
String flair;
|
||||
if (flairdata.length > 1)
|
||||
flair = flairdata[1];
|
||||
else
|
||||
flair = "";
|
||||
String flairclass;
|
||||
if (flairdata.length > 2)
|
||||
flairclass = flairdata[2];
|
||||
else
|
||||
flairclass = "unknown";
|
||||
SetFlair(mp, flair, flairclass, mp.UserName().get());
|
||||
}
|
||||
|
||||
private static void SetFlair(ChatPlayer p, String text, String flairclass, String username) {
|
||||
p.UserName().set(username);
|
||||
p.FlairState().set(FlairStates.Recognised);
|
||||
switch (flairclass) {
|
||||
case "cheater":
|
||||
p.SetFlair(Short.parseShort(text), true);
|
||||
return;
|
||||
case "unknown":
|
||||
try {
|
||||
if (CheckForJoinDate(p)) {
|
||||
if (text.equals("-1")) // If true, only non-presser/can't press; if false, any flair (but we can still detect can't press)
|
||||
p.SetFlair(ChatPlayer.FlairTimeNonPresser);
|
||||
else
|
||||
p.SetFlair(ChatPlayer.FlairTimeNone); // Flair unknown
|
||||
} else {
|
||||
p.SetFlair(ChatPlayer.FlairTimeCantPress);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
p.FlairState().set(FlairStates.Commented); // Flair unknown
|
||||
p.SetFlair(ChatPlayer.FlairTimeNone);
|
||||
TBMCCoreAPI.SendException("Error while checking join date for player " + p.PlayerName() + "!", e);
|
||||
}
|
||||
return;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
p.SetFlair(Short.parseShort(text));
|
||||
}
|
||||
|
||||
private static boolean CheckForJoinDate(ChatPlayer mp) throws Exception {
|
||||
return JoinedBefore(mp, 2015, 4, 1);
|
||||
}
|
||||
|
||||
private static boolean JoinedBefore(ChatPlayer mp, int year, int month, int day) throws Exception {
|
||||
URL url = new URL("https://www.reddit.com/u/" + mp.UserName());
|
||||
URLConnection con = url.openConnection();
|
||||
con.setRequestProperty("User-Agent", "TheButtonAutoFlair");
|
||||
InputStream in = con.getInputStream();
|
||||
HtmlCleaner cleaner = new HtmlCleaner();
|
||||
TagNode node = cleaner.clean(in);
|
||||
|
||||
node = node.getElementsByAttValue("class", "age", true, true)[0];
|
||||
node = node.getElementsByName("time", false)[0];
|
||||
String joindate = node.getAttributeByName("datetime");
|
||||
SimpleDateFormat parserSDF = new SimpleDateFormat("yyyy-MM-dd");
|
||||
joindate = joindate.split("T")[0];
|
||||
Date date = parserSDF.parse(joindate);
|
||||
return date.before(new Calendar.Builder().setTimeZone(TimeZone.getTimeZone("UTC")).setDate(year, month, day)
|
||||
.build().getTime());
|
||||
}
|
||||
|
||||
public static void ConfirmUserMessage(ChatPlayer mp) {
|
||||
Player p = Bukkit.getPlayer(mp.getUUID());
|
||||
if (mp.FlairState().get().equals(FlairStates.Commented) && p != null)
|
||||
if (mp.UserNames().size() > 1)
|
||||
p.sendMessage(
|
||||
"§9Multiple Reddit users commented your name. You can select with /u accept.§r §6Type /u accept or /u ignore§r");
|
||||
else
|
||||
p.sendMessage("§9A Reddit user commented your name. Is that you?§r §6Type /u accept or /u ignore§r");
|
||||
}
|
||||
}
|
|
@ -1,5 +1,5 @@
|
|||
package buttondevteam.chat;
|
||||
|
||||
public enum FlairStates {
|
||||
Accepted, Ignored, Recognised, Commented, NoComment
|
||||
}
|
||||
package buttondevteam.chat.components.flair;
|
||||
|
||||
public enum FlairStates {
|
||||
Accepted, Ignored, Recognised, Commented, NoComment
|
||||
}
|
|
@ -1,44 +1,43 @@
|
|||
package buttondevteam.chat.commands.ucmds;
|
||||
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import buttondevteam.chat.ChatPlayer;
|
||||
import buttondevteam.chat.FlairStates;
|
||||
import buttondevteam.lib.chat.CommandClass;
|
||||
import buttondevteam.lib.chat.OptionallyPlayerCommandClass;
|
||||
import buttondevteam.lib.player.TBMCPlayer;
|
||||
|
||||
@CommandClass(modOnly = false)
|
||||
@OptionallyPlayerCommandClass(playerOnly = true)
|
||||
public final class IgnoreCommand extends UCommandBase {
|
||||
|
||||
@Override
|
||||
public String[] GetHelpText(String alias) {
|
||||
return new String[] { "§6---- Ignore flair ----",
|
||||
"Stop the \"write your name in the thread\" message from showing up" };
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean OnCommand(CommandSender sender, String alias, String[] args) {
|
||||
final Player player = (Player) sender;
|
||||
ChatPlayer p = TBMCPlayer.getPlayer(player.getUniqueId(), ChatPlayer.class);
|
||||
if (p.FlairState().get().equals(FlairStates.Accepted)) {
|
||||
player.sendMessage("§cYou can only ignore the \"write your name in the thread\" message.");
|
||||
return true;
|
||||
}
|
||||
if (p.FlairState().get().equals(FlairStates.Commented)) {
|
||||
player.sendMessage("Sorry, but your flair isn't recorded. Please ask a mod to set it for you.");
|
||||
return true;
|
||||
}
|
||||
if (!p.FlairState().get().equals(FlairStates.Ignored)) {
|
||||
p.FlairState().set(FlairStates.Ignored);
|
||||
p.SetFlair(ChatPlayer.FlairTimeNone);
|
||||
p.UserName().set("");
|
||||
player.sendMessage("§bYou have ignored the message.§r");
|
||||
} else
|
||||
player.sendMessage("§cYou already ignored the message.§r");
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
package buttondevteam.chat.components.flair;
|
||||
|
||||
import buttondevteam.chat.ChatPlayer;
|
||||
import buttondevteam.chat.commands.ucmds.UCommandBase;
|
||||
import buttondevteam.lib.chat.CommandClass;
|
||||
import buttondevteam.lib.chat.OptionallyPlayerCommandClass;
|
||||
import buttondevteam.lib.player.TBMCPlayer;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandClass(modOnly = false)
|
||||
@OptionallyPlayerCommandClass(playerOnly = true)
|
||||
public final class IgnoreCommand extends UCommandBase {
|
||||
|
||||
@Override
|
||||
public String[] GetHelpText(String alias) {
|
||||
return new String[] { "§6---- Ignore flair ----",
|
||||
"Stop the \"write your name in the thread\" message from showing up" };
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean OnCommand(CommandSender sender, String alias, String[] args) {
|
||||
final Player player = (Player) sender;
|
||||
ChatPlayer p = TBMCPlayer.getPlayer(player.getUniqueId(), ChatPlayer.class);
|
||||
if (p.FlairState().get().equals(FlairStates.Accepted)) {
|
||||
player.sendMessage("§cYou can only ignore the \"write your name in the thread\" message.");
|
||||
return true;
|
||||
}
|
||||
if (p.FlairState().get().equals(FlairStates.Commented)) {
|
||||
player.sendMessage("Sorry, but your flair isn't recorded. Please ask a mod to set it for you.");
|
||||
return true;
|
||||
}
|
||||
if (!p.FlairState().get().equals(FlairStates.Ignored)) {
|
||||
p.FlairState().set(FlairStates.Ignored);
|
||||
p.SetFlair(ChatPlayer.FlairTimeNone);
|
||||
p.UserName().set("");
|
||||
player.sendMessage("§bYou have ignored the message.§r");
|
||||
} else
|
||||
player.sendMessage("§cYou already ignored the message.§r");
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,71 +1,70 @@
|
|||
package buttondevteam.chat.commands.ucmds.admin;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import buttondevteam.chat.ChatPlayer;
|
||||
import buttondevteam.chat.FlairStates;
|
||||
import buttondevteam.lib.player.TBMCPlayerBase;
|
||||
|
||||
public class SetFlairCommand extends AdminCommandBase {
|
||||
|
||||
@Override
|
||||
public String[] GetHelpText(String alias) {
|
||||
return new String[] { "§6---- Set flair -----", "Set a flair for a player",
|
||||
"Usage: /u admin setflair <player> <flairtime (or non-presser, cant-press, none)> <cheater(true/false)> [username]",
|
||||
"Example 1: /u admin setflair NorbiPeti 19 false NorbiPeti --> orange (19s)",
|
||||
"Example 2: /u admin setflair iie 0 true asde --> purple (0s)" };
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean OnCommand(CommandSender sender, String alias, String[] args) {
|
||||
if (args.length < 3) {
|
||||
return false;
|
||||
}
|
||||
Player p = Bukkit.getPlayer(args[0]);
|
||||
if (p == null) {
|
||||
sender.sendMessage("§cPlayer not found.&r");
|
||||
return true;
|
||||
}
|
||||
short flairtime = 0x00;
|
||||
if (args[1].equalsIgnoreCase("non-presser"))
|
||||
flairtime = ChatPlayer.FlairTimeNonPresser;
|
||||
else if (args[1].equalsIgnoreCase("cant-press"))
|
||||
flairtime = ChatPlayer.FlairTimeCantPress;
|
||||
else if (args[1].equalsIgnoreCase("none"))
|
||||
flairtime = ChatPlayer.FlairTimeNone;
|
||||
else {
|
||||
try {
|
||||
flairtime = Short.parseShort(args[1]);
|
||||
} catch (Exception e) {
|
||||
sender.sendMessage(
|
||||
"§cFlairtime must be a number, \"non-presser\", \"cant-press\" or \"none\". Run without args to see usage.");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
boolean cheater = false;
|
||||
if (args[2].equalsIgnoreCase("true"))
|
||||
cheater = true;
|
||||
else if (args[2].equalsIgnoreCase("false"))
|
||||
cheater = false;
|
||||
else {
|
||||
sender.sendMessage("§cUnknown value for cheater parameter. Run without args to see usage.");
|
||||
return true;
|
||||
}
|
||||
ChatPlayer mp = TBMCPlayerBase.getPlayer(p.getUniqueId(), ChatPlayer.class);
|
||||
mp.SetFlair(flairtime, cheater);
|
||||
mp.FlairState().set(FlairStates.Accepted);
|
||||
if (args.length < 4)
|
||||
mp.UserName().set("");
|
||||
else {
|
||||
mp.UserName().set(args[3]);
|
||||
if (!mp.UserNames().contains(args[3]))
|
||||
mp.UserNames().add(args[3]);
|
||||
}
|
||||
sender.sendMessage(
|
||||
"§bThe flair has been set. Player: " + mp.PlayerName() + " Flair: " + mp.GetFormattedFlair() + "§r");
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
package buttondevteam.chat.components.flair;
|
||||
|
||||
import buttondevteam.chat.ChatPlayer;
|
||||
import buttondevteam.chat.commands.ucmds.admin.AdminCommandBase;
|
||||
import buttondevteam.lib.player.TBMCPlayerBase;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class SetFlairCommand extends AdminCommandBase {
|
||||
|
||||
@Override
|
||||
public String[] GetHelpText(String alias) {
|
||||
return new String[] { "§6---- Set flair -----", "Set a flair for a player",
|
||||
"Usage: /u admin setflair <player> <flairtime (or non-presser, cant-press, none)> <cheater(true/false)> [username]",
|
||||
"Example 1: /u admin setflair NorbiPeti 19 false NorbiPeti --> orange (19s)",
|
||||
"Example 2: /u admin setflair iie 0 true asde --> purple (0s)" };
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean OnCommand(CommandSender sender, String alias, String[] args) {
|
||||
if (args.length < 3) {
|
||||
return false;
|
||||
}
|
||||
Player p = Bukkit.getPlayer(args[0]);
|
||||
if (p == null) {
|
||||
sender.sendMessage("§cPlayer not found.&r");
|
||||
return true;
|
||||
}
|
||||
short flairtime = 0x00;
|
||||
if (args[1].equalsIgnoreCase("non-presser"))
|
||||
flairtime = ChatPlayer.FlairTimeNonPresser;
|
||||
else if (args[1].equalsIgnoreCase("cant-press"))
|
||||
flairtime = ChatPlayer.FlairTimeCantPress;
|
||||
else if (args[1].equalsIgnoreCase("none"))
|
||||
flairtime = ChatPlayer.FlairTimeNone;
|
||||
else {
|
||||
try {
|
||||
flairtime = Short.parseShort(args[1]);
|
||||
} catch (Exception e) {
|
||||
sender.sendMessage(
|
||||
"§cFlairtime must be a number, \"non-presser\", \"cant-press\" or \"none\". Run without args to see usage.");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
boolean cheater;
|
||||
if (args[2].equalsIgnoreCase("true"))
|
||||
cheater = true;
|
||||
else if (args[2].equalsIgnoreCase("false"))
|
||||
cheater = false;
|
||||
else {
|
||||
sender.sendMessage("§cUnknown value for cheater parameter.");
|
||||
return false;
|
||||
}
|
||||
ChatPlayer mp = TBMCPlayerBase.getPlayer(p.getUniqueId(), ChatPlayer.class);
|
||||
mp.SetFlair(flairtime, cheater);
|
||||
mp.FlairState().set(FlairStates.Accepted);
|
||||
if (args.length < 4)
|
||||
mp.UserName().set("");
|
||||
else {
|
||||
mp.UserName().set(args[3]);
|
||||
if (!mp.UserNames().contains(args[3]))
|
||||
mp.UserNames().add(args[3]);
|
||||
}
|
||||
sender.sendMessage(
|
||||
"§bThe flair has been set. Player: " + mp.PlayerName() + " Flair: " + mp.GetFormattedFlair() + "§r");
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
package buttondevteam.chat.components;
|
||||
package buttondevteam.chat.components.towny;
|
||||
|
||||
import buttondevteam.chat.ChatProcessing;
|
||||
import buttondevteam.chat.PluginMain;
|
||||
|
@ -23,12 +23,12 @@ public class TownyAnnouncer {
|
|||
switch (String.valueOf(m.group(1))) { //valueOf: Handles null
|
||||
case "Town":
|
||||
TBMCChatAPI.SendSystemMessage(PluginMain.TownChat,
|
||||
new Channel.RecipientTestResult(PluginMain.getTownNationIndex(groupID, false), groupID),
|
||||
new Channel.RecipientTestResult(TownyComponent.getTownNationIndex(groupID, false), groupID),
|
||||
logRecord.getMessage(), ChatProcessing.MCORIGIN);
|
||||
break;
|
||||
case "Nation":
|
||||
TBMCChatAPI.SendSystemMessage(PluginMain.NationChat,
|
||||
new Channel.RecipientTestResult(PluginMain.getTownNationIndex(groupID, true), groupID),
|
||||
new Channel.RecipientTestResult(TownyComponent.getTownNationIndex(groupID, true), groupID),
|
||||
logRecord.getMessage(), ChatProcessing.MCORIGIN);
|
||||
break;
|
||||
case "Global":
|
|
@ -0,0 +1,94 @@
|
|||
package buttondevteam.chat.components.towny;
|
||||
|
||||
import buttondevteam.chat.PluginMain;
|
||||
import buttondevteam.component.channel.Channel;
|
||||
import buttondevteam.lib.architecture.Component;
|
||||
import buttondevteam.lib.chat.Color;
|
||||
import buttondevteam.lib.chat.TBMCChatAPI;
|
||||
import com.palmergames.bukkit.towny.Towny;
|
||||
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 com.palmergames.bukkit.towny.object.TownyUniverse;
|
||||
import lombok.val;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class TownyComponent extends Component {
|
||||
public static TownyUniverse TU;
|
||||
private static ArrayList<String> Towns;
|
||||
private static ArrayList<String> Nations;
|
||||
|
||||
@Override
|
||||
protected void enable() {
|
||||
TU = ((Towny) Bukkit.getPluginManager().getPlugin("Towny")).getTownyUniverse();
|
||||
Towns = TU.getTownsMap().values().stream().map(Town::getName).collect(Collectors.toCollection(ArrayList::new)); // Creates a snapshot of towns, new towns will be added when needed
|
||||
Nations = TU.getNationsMap().values().stream().map(Nation::getName).collect(Collectors.toCollection(ArrayList::new)); // Same here but with nations
|
||||
TBMCChatAPI.RegisterChatChannel(
|
||||
PluginMain.TownChat = new Channel("§3TC§f", Color.DarkAqua, "tc", s -> checkTownNationChat(s, false)));
|
||||
TBMCChatAPI.RegisterChatChannel(
|
||||
PluginMain.NationChat = new Channel("§6NC§f", Color.Gold, "nc", s -> checkTownNationChat(s, true)));
|
||||
TownyAnnouncer.setup();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void disable() {
|
||||
TownyAnnouncer.setdown();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Return the error message for the message sender if they can't send it and the score
|
||||
*/
|
||||
private static Channel.RecipientTestResult checkTownNationChat(CommandSender sender, boolean nationchat) {
|
||||
if (!(sender instanceof Player))
|
||||
return new Channel.RecipientTestResult("§cYou are not a player!");
|
||||
Resident resident = TU.getResidentMap().get(sender.getName().toLowerCase());
|
||||
Channel.RecipientTestResult result = checkTownNationChatInternal(sender, nationchat, resident);
|
||||
if (result.errormessage != null && resident != null && resident.getModes().contains("spy")) // Only use spy if they wouldn't see it
|
||||
result = new Channel.RecipientTestResult(1000, "allspies"); // There won't be more than a thousand towns/nations probably
|
||||
return result;
|
||||
}
|
||||
|
||||
private static Channel.RecipientTestResult checkTownNationChatInternal(CommandSender sender, boolean nationchat,
|
||||
Resident resident) {
|
||||
try {
|
||||
/*
|
||||
* 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 Channel.RecipientTestResult("You aren't in a town.");
|
||||
Nation nation = null;
|
||||
int index;
|
||||
if (nationchat) {
|
||||
if (town.hasNation())
|
||||
nation = town.getNation();
|
||||
if (nation == null)
|
||||
return new Channel.RecipientTestResult("Your town isn't in a nation.");
|
||||
index = getTownNationIndex(nation.getName(), true);
|
||||
} else
|
||||
index = getTownNationIndex(town.getName(), false);
|
||||
return new Channel.RecipientTestResult(index, nationchat ? nation.getName() : town.getName());
|
||||
} catch (NotRegisteredException e) {
|
||||
return new Channel.RecipientTestResult("You (probably) aren't knwon by Towny! (Not in a town)");
|
||||
}
|
||||
}
|
||||
|
||||
public static int getTownNationIndex(String name, boolean nation) {
|
||||
val list = nation ? Nations : Towns;
|
||||
int index = list.indexOf(name);
|
||||
if (index < 0) {
|
||||
list.add(name);
|
||||
index = list.size() - 1;
|
||||
}
|
||||
return index;
|
||||
}
|
||||
}
|
|
@ -1,144 +1,149 @@
|
|||
package buttondevteam.chat.listener;
|
||||
|
||||
import buttondevteam.chat.ChatPlayer;
|
||||
import buttondevteam.chat.FlairStates;
|
||||
import buttondevteam.chat.PlayerJoinTimerTask;
|
||||
import buttondevteam.chat.PluginMain;
|
||||
import buttondevteam.chat.commands.UnlolCommand;
|
||||
import buttondevteam.chat.commands.ucmds.HistoryCommand;
|
||||
import buttondevteam.lib.chat.Color;
|
||||
import buttondevteam.lib.player.TBMCPlayerJoinEvent;
|
||||
import buttondevteam.lib.player.TBMCPlayerLoadEvent;
|
||||
import buttondevteam.lib.player.TBMCPlayerSaveEvent;
|
||||
import com.earth2me.essentials.User;
|
||||
import com.palmergames.bukkit.towny.exceptions.NotRegisteredException;
|
||||
import lombok.val;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.GameMode;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Optional;
|
||||
import java.util.Timer;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.function.BiFunction;
|
||||
|
||||
public class PlayerJoinLeaveListener implements Listener {
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerLoad(TBMCPlayerLoadEvent e) {
|
||||
ChatPlayer cp = e.GetPlayer().asPluginPlayer(ChatPlayer.class);
|
||||
cp.FlairUpdate();
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerTBMCJoin(TBMCPlayerJoinEvent e) {
|
||||
ChatPlayer cp = e.GetPlayer().asPluginPlayer(ChatPlayer.class);
|
||||
Player p = Bukkit.getPlayer(cp.getUUID());
|
||||
|
||||
if (!cp.FlairState().get().equals(FlairStates.NoComment)) {
|
||||
PluginMain.ConfirmUserMessage(cp);
|
||||
Timer timer = new Timer();
|
||||
PlayerJoinTimerTask tt = new PlayerJoinTimerTask() {
|
||||
@Override
|
||||
public void run() {
|
||||
mp.FlairUpdate();
|
||||
}
|
||||
};
|
||||
tt.mp = cp;
|
||||
timer.schedule(tt, 1000);
|
||||
} //TODO: Better Reddit integration (OAuth)
|
||||
|
||||
String nwithoutformatting = PluginMain.essentials.getUser(p).getNickname();
|
||||
|
||||
int index;
|
||||
if (nwithoutformatting != null) {
|
||||
while ((index = nwithoutformatting.indexOf("§k")) != -1)
|
||||
nwithoutformatting = nwithoutformatting.replace("§k" + nwithoutformatting.charAt(index + 2), ""); // Support for one random char
|
||||
while ((index = nwithoutformatting.indexOf('§')) != -1)
|
||||
nwithoutformatting = nwithoutformatting.replace("§" + nwithoutformatting.charAt(index + 1), "");
|
||||
} else
|
||||
nwithoutformatting = p.getName();
|
||||
PlayerListener.nicknames.forcePut(nwithoutformatting.toLowerCase(), p.getUniqueId());
|
||||
|
||||
updatePlayerColors(p, cp); //TO!DO: Doesn't have effect - It can help to register the listener
|
||||
|
||||
if (cp.ChatOnly || p.getGameMode().equals(GameMode.SPECTATOR)) {
|
||||
cp.ChatOnly = false;
|
||||
p.setGameMode(GameMode.SURVIVAL);
|
||||
}
|
||||
|
||||
HistoryCommand.showHistory(e.getPlayer(), "u history", new String[0], null);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerSave(TBMCPlayerSaveEvent e) {
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerLeave(PlayerQuitEvent event) {
|
||||
PlayerListener.nicknames.inverse().remove(event.getPlayer().getUniqueId());
|
||||
UnlolCommand.Lastlol.values().removeIf(lld -> lld.getLolowner().equals(event.getPlayer()));
|
||||
}
|
||||
|
||||
private static String getPlayerNickname(Player player, User user, ChatPlayer cp) {
|
||||
String nickname = user.getNick(true);
|
||||
if (nickname.contains("~")) //StartsWith doesn't work because of color codes
|
||||
nickname = nickname.replace("~", ""); //It gets stacked otherwise
|
||||
String name = ChatColor.stripColor(nickname); //Enforce "town colors" on non-members
|
||||
val res = PluginMain.TU.getResidentMap().get(player.getName().toLowerCase());
|
||||
if (res == null || !res.hasTown())
|
||||
return name;
|
||||
try {
|
||||
Color[] clrs = Optional.ofNullable(
|
||||
PluginMain.TownColors.get(res.getTown().getName().toLowerCase())
|
||||
).orElse(new Color[]{Color.White}); //Use white as default town color
|
||||
StringBuilder ret = new StringBuilder();
|
||||
AtomicInteger prevlen = new AtomicInteger();
|
||||
BiFunction<Color, Integer, String> anyColoredNamePart = (c, len) -> "§" //Len==0 if last part
|
||||
+ Integer.toHexString(c.ordinal()) // 'Odds' are the last character is chopped off so we make sure to include all chars at the end
|
||||
+ (len == 0 ? name.substring(prevlen.get())
|
||||
: name.substring(prevlen.get(), prevlen.addAndGet(len)));
|
||||
BiFunction<Integer, Integer, String> coloredNamePart = (len, i)
|
||||
-> anyColoredNamePart.apply(clrs[i], i + 1 == clrs.length ? 0 : len);
|
||||
final int len = name.length() / (clrs.length + 1); //The above param is needed because this isn't always passed
|
||||
Color nc;
|
||||
/*if(res.getTown().hasNation()
|
||||
&&(nc=PluginMain.NationColor.get(res.getTown().getNation().getName().toLowerCase()))!=null)
|
||||
len = name.length() / (clrs.length+1);
|
||||
else
|
||||
len = name.length() / clrs.length;*/
|
||||
val nclar = cp.NameColorLocations().get();
|
||||
int[] ncl = nclar == null ? null : nclar.stream().mapToInt(Integer::intValue).toArray();
|
||||
if (ncl != null && (Arrays.stream(ncl).sum() != name.length() || ncl.length != clrs.length + 1)) //+1: Nation color
|
||||
ncl = null; // Reset if name length changed
|
||||
//System.out.println("ncl: "+Arrays.toString(ncl)+" - sum: "+Arrays.stream(ncl).sum()+" - name len: "+name.length());
|
||||
if (!res.getTown().hasNation()
|
||||
|| (nc = PluginMain.NationColor.get(res.getTown().getNation().getName().toLowerCase())) == null)
|
||||
nc = Color.White;
|
||||
ret.append(anyColoredNamePart.apply(nc, ncl == null ? len : ncl[0])); //Make first color the nation color
|
||||
for (int i = 0; i < clrs.length; i++)
|
||||
//ret.append(coloredNamePart.apply(ncl == null ? len : (nc==null?ncl[i]:ncl[i+1]), i));
|
||||
ret.append(coloredNamePart.apply(ncl == null ? len : ncl[i + 1], i));
|
||||
return ret.toString();
|
||||
} catch (NotRegisteredException e) {
|
||||
return nickname;
|
||||
}
|
||||
}
|
||||
|
||||
public static void updatePlayerColors(Player player) { //Probably while ingame (/u ncolor)
|
||||
updatePlayerColors(player, ChatPlayer.getPlayer(player.getUniqueId(), ChatPlayer.class));
|
||||
}
|
||||
|
||||
@SuppressWarnings("WeakerAccess")
|
||||
public static void updatePlayerColors(Player player, ChatPlayer cp) { //Probably at join - nop, nicknames
|
||||
User user = PluginMain.essentials.getUser(player);
|
||||
user.setNickname(getPlayerNickname(player, user, cp));
|
||||
user.setDisplayNick(); //These won't fire the nick change event
|
||||
cp.FlairUpdate(); //Update in list
|
||||
}
|
||||
}
|
||||
package buttondevteam.chat.listener;
|
||||
|
||||
import buttondevteam.chat.ChatPlayer;
|
||||
import buttondevteam.chat.PlayerJoinTimerTask;
|
||||
import buttondevteam.chat.PluginMain;
|
||||
import buttondevteam.chat.commands.UnlolCommand;
|
||||
import buttondevteam.chat.commands.ucmds.HistoryCommand;
|
||||
import buttondevteam.chat.components.flair.FlairComponent;
|
||||
import buttondevteam.chat.components.flair.FlairStates;
|
||||
import buttondevteam.chat.components.towny.TownyComponent;
|
||||
import buttondevteam.core.ComponentManager;
|
||||
import buttondevteam.lib.chat.Color;
|
||||
import buttondevteam.lib.player.TBMCPlayerJoinEvent;
|
||||
import buttondevteam.lib.player.TBMCPlayerLoadEvent;
|
||||
import buttondevteam.lib.player.TBMCPlayerSaveEvent;
|
||||
import com.earth2me.essentials.User;
|
||||
import com.palmergames.bukkit.towny.exceptions.NotRegisteredException;
|
||||
import lombok.val;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.GameMode;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Optional;
|
||||
import java.util.Timer;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.function.BiFunction;
|
||||
|
||||
public class PlayerJoinLeaveListener implements Listener {
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerLoad(TBMCPlayerLoadEvent e) {
|
||||
ChatPlayer cp = e.GetPlayer().asPluginPlayer(ChatPlayer.class);
|
||||
cp.FlairUpdate();
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerTBMCJoin(TBMCPlayerJoinEvent e) {
|
||||
ChatPlayer cp = e.GetPlayer().asPluginPlayer(ChatPlayer.class);
|
||||
Player p = Bukkit.getPlayer(cp.getUUID());
|
||||
|
||||
if (ComponentManager.isEnabled(FlairComponent.class)) {
|
||||
if (!cp.FlairState().get().equals(FlairStates.NoComment)) {
|
||||
FlairComponent.ConfirmUserMessage(cp);
|
||||
Timer timer = new Timer();
|
||||
PlayerJoinTimerTask tt = new PlayerJoinTimerTask() {
|
||||
@Override
|
||||
public void run() {
|
||||
mp.FlairUpdate();
|
||||
}
|
||||
};
|
||||
tt.mp = cp;
|
||||
timer.schedule(tt, 1000);
|
||||
} //TODO: Better Reddit integration (OAuth)
|
||||
}
|
||||
|
||||
String nwithoutformatting = PluginMain.essentials.getUser(p).getNickname();
|
||||
|
||||
int index;
|
||||
if (nwithoutformatting != null) {
|
||||
while ((index = nwithoutformatting.indexOf("§k")) != -1)
|
||||
nwithoutformatting = nwithoutformatting.replace("§k" + nwithoutformatting.charAt(index + 2), ""); // Support for one random char
|
||||
while ((index = nwithoutformatting.indexOf('§')) != -1)
|
||||
nwithoutformatting = nwithoutformatting.replace("§" + nwithoutformatting.charAt(index + 1), "");
|
||||
} else
|
||||
nwithoutformatting = p.getName();
|
||||
PlayerListener.nicknames.forcePut(nwithoutformatting.toLowerCase(), p.getUniqueId());
|
||||
|
||||
updatePlayerColors(p, cp); //TO!DO: Doesn't have effect - It can help to register the listener
|
||||
|
||||
if (cp.ChatOnly || p.getGameMode().equals(GameMode.SPECTATOR)) {
|
||||
cp.ChatOnly = false;
|
||||
p.setGameMode(GameMode.SURVIVAL);
|
||||
}
|
||||
|
||||
HistoryCommand.showHistory(e.getPlayer(), "u history", new String[0], null);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerSave(TBMCPlayerSaveEvent e) {
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerLeave(PlayerQuitEvent event) {
|
||||
PlayerListener.nicknames.inverse().remove(event.getPlayer().getUniqueId());
|
||||
UnlolCommand.Lastlol.values().removeIf(lld -> lld.getLolowner().equals(event.getPlayer()));
|
||||
}
|
||||
|
||||
private static String getPlayerNickname(Player player, User user, ChatPlayer cp) {
|
||||
String nickname = user.getNick(true);
|
||||
if (nickname.contains("~")) //StartsWith doesn't work because of color codes
|
||||
nickname = nickname.replace("~", ""); //It gets stacked otherwise
|
||||
String name = ChatColor.stripColor(nickname); //Enforce "town colors" on non-members
|
||||
val res = TownyComponent.TU.getResidentMap().get(player.getName().toLowerCase());
|
||||
if (res == null || !res.hasTown())
|
||||
return name;
|
||||
try {
|
||||
Color[] clrs = Optional.ofNullable(
|
||||
PluginMain.TownColors.get(res.getTown().getName().toLowerCase())
|
||||
).orElse(new Color[]{Color.White}); //Use white as default town color
|
||||
StringBuilder ret = new StringBuilder();
|
||||
AtomicInteger prevlen = new AtomicInteger();
|
||||
BiFunction<Color, Integer, String> anyColoredNamePart = (c, len) -> "§" //Len==0 if last part
|
||||
+ Integer.toHexString(c.ordinal()) // 'Odds' are the last character is chopped off so we make sure to include all chars at the end
|
||||
+ (len == 0 ? name.substring(prevlen.get())
|
||||
: name.substring(prevlen.get(), prevlen.addAndGet(len)));
|
||||
BiFunction<Integer, Integer, String> coloredNamePart = (len, i)
|
||||
-> anyColoredNamePart.apply(clrs[i], i + 1 == clrs.length ? 0 : len);
|
||||
final int len = name.length() / (clrs.length + 1); //The above param is needed because this isn't always passed
|
||||
Color nc;
|
||||
/*if(res.getTown().hasNation()
|
||||
&&(nc=PluginMain.NationColor.get(res.getTown().getNation().getName().toLowerCase()))!=null)
|
||||
len = name.length() / (clrs.length+1);
|
||||
else
|
||||
len = name.length() / clrs.length;*/
|
||||
val nclar = cp.NameColorLocations().get();
|
||||
int[] ncl = nclar == null ? null : nclar.stream().mapToInt(Integer::intValue).toArray();
|
||||
if (ncl != null && (Arrays.stream(ncl).sum() != name.length() || ncl.length != clrs.length + 1)) //+1: Nation color
|
||||
ncl = null; // Reset if name length changed
|
||||
//System.out.println("ncl: "+Arrays.toString(ncl)+" - sum: "+Arrays.stream(ncl).sum()+" - name len: "+name.length());
|
||||
if (!res.getTown().hasNation()
|
||||
|| (nc = PluginMain.NationColor.get(res.getTown().getNation().getName().toLowerCase())) == null)
|
||||
nc = Color.White;
|
||||
ret.append(anyColoredNamePart.apply(nc, ncl == null ? len : ncl[0])); //Make first color the nation color
|
||||
for (int i = 0; i < clrs.length; i++)
|
||||
//ret.append(coloredNamePart.apply(ncl == null ? len : (nc==null?ncl[i]:ncl[i+1]), i));
|
||||
ret.append(coloredNamePart.apply(ncl == null ? len : ncl[i + 1], i));
|
||||
return ret.toString();
|
||||
} catch (NotRegisteredException e) {
|
||||
return nickname;
|
||||
}
|
||||
}
|
||||
|
||||
public static void updatePlayerColors(Player player) { //Probably while ingame (/u ncolor)
|
||||
updatePlayerColors(player, ChatPlayer.getPlayer(player.getUniqueId(), ChatPlayer.class));
|
||||
}
|
||||
|
||||
@SuppressWarnings("WeakerAccess")
|
||||
public static void updatePlayerColors(Player player, ChatPlayer cp) { //Probably at join - nop, nicknames
|
||||
User user = PluginMain.essentials.getUser(player);
|
||||
user.setNickname(getPlayerNickname(player, user, cp));
|
||||
user.setDisplayNick(); //These won't fire the nick change event
|
||||
cp.FlairUpdate(); //Update in list
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,9 +4,11 @@ import buttondevteam.chat.ChatPlayer;
|
|||
import buttondevteam.chat.ChatProcessing;
|
||||
import buttondevteam.chat.PluginMain;
|
||||
import buttondevteam.chat.commands.ucmds.HistoryCommand;
|
||||
import buttondevteam.chat.components.flair.FlairComponent;
|
||||
import buttondevteam.component.channel.Channel;
|
||||
import buttondevteam.component.channel.ChatChannelRegisterEvent;
|
||||
import buttondevteam.component.channel.ChatRoom;
|
||||
import buttondevteam.core.ComponentManager;
|
||||
import buttondevteam.lib.TBMCChatEvent;
|
||||
import buttondevteam.lib.TBMCCoreAPI;
|
||||
import buttondevteam.lib.chat.ChatMessage;
|
||||
|
@ -50,15 +52,9 @@ public class PlayerListener implements Listener {
|
|||
*/
|
||||
public static BiMap<String, UUID> nicknames = HashBiMap.create();
|
||||
|
||||
public static boolean Enable = false;
|
||||
|
||||
public static int LoginWarningCountTotal = 5;
|
||||
|
||||
public static String NotificationSound;
|
||||
public static double NotificationPitch;
|
||||
|
||||
public static boolean ShowRPTag = false;
|
||||
|
||||
public final static String[] LaughStrings = new String[]{"xd", "lel", "lawl", "kek", "lmao", "hue", "hah", "rofl"};
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGHEST)
|
||||
|
@ -88,7 +84,7 @@ public class PlayerListener implements Listener {
|
|||
return false;
|
||||
// ^^ We can only store player or console channels - Directly sending to channels would still work if they had an event
|
||||
cmd = sender instanceof ConsoleCommandSender ? message : message.substring(1);
|
||||
for (Channel channel : Channel.getChannels()) {
|
||||
for (Channel channel : ((Iterable<Channel>) Channel.getChannels()::iterator)) { //Using Stream.forEach would be too easy
|
||||
if (checkchid.test(channel, cmd)) {
|
||||
Channel oldch = mp.channel().get();
|
||||
if (oldch instanceof ChatRoom)
|
||||
|
@ -130,7 +126,7 @@ public class PlayerListener implements Listener {
|
|||
return true;
|
||||
}
|
||||
} else
|
||||
for (Channel channel : Channel.getChannels()) {
|
||||
for (Channel channel : (Iterable<Channel>) Channel.getChannels()::iterator) {
|
||||
if (checkchid.test(channel, cmd)) { //Apparently method references don't require final variables
|
||||
TBMCChatAPI.SendChatMessage(ChatMessage.builder(sender, mp, message.substring(index + 1)).build(), channel);
|
||||
return true;
|
||||
|
@ -173,13 +169,10 @@ public class PlayerListener implements Listener {
|
|||
public static boolean ActiveF = false;
|
||||
public static ChatPlayer FPlayer = null;
|
||||
public static BukkitTask Ftask = null;
|
||||
public static int AlphaDeaths;
|
||||
public static ArrayList<CommandSender> Fs = new ArrayList<>();
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerDeath(PlayerDeathEvent e) {
|
||||
if (e.getEntity().getName().equals("Alpha_Bacca44"))
|
||||
AlphaDeaths++;
|
||||
// MinigamePlayer mgp = Minigames.plugin.pdata.getMinigamePlayer(e.getEntity());
|
||||
if (/* (mgp != null && !mgp.isInMinigame()) && */ new Random().nextBoolean()) { // Don't store Fs for NPCs
|
||||
Runnable tt = () -> {
|
||||
|
@ -249,9 +242,11 @@ public class PlayerListener implements Listener {
|
|||
e.addInfo("Minecraft name: " + cp.PlayerName().get());
|
||||
if (cp.UserName().get() != null && cp.UserName().get().length() > 0)
|
||||
e.addInfo("Reddit name: " + cp.UserName().get());
|
||||
final String flair = cp.GetFormattedFlair(e.getTarget() != InfoTarget.MCCommand);
|
||||
if (flair.length() > 0)
|
||||
e.addInfo("/r/TheButton flair: " + flair);
|
||||
if (ComponentManager.isEnabled(FlairComponent.class)) {
|
||||
final String flair = cp.GetFormattedFlair(e.getTarget() != InfoTarget.MCCommand);
|
||||
if (flair.length() > 0)
|
||||
e.addInfo("/r/TheButton flair: " + flair);
|
||||
}
|
||||
e.addInfo(String.format("Respect: %.2f", cp.getF()));
|
||||
} catch (Exception ex) {
|
||||
TBMCCoreAPI.SendException("Error while providing chat info for player " + e.getPlayer().getFileName(), ex);
|
||||
|
|
Loading…
Reference in a new issue