summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Essentials/src/com/earth2me/essentials/Essentials.java115
-rw-r--r--Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java23
-rw-r--r--Essentials/src/com/earth2me/essentials/EssentialsUpgrade.java47
-rw-r--r--Essentials/src/com/earth2me/essentials/IEssentials.java4
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandinfo.java178
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandmotd.java13
-rw-r--r--Essentials/src/com/earth2me/essentials/commands/Commandrules.java14
-rw-r--r--Essentials/src/com/earth2me/essentials/textreader/IText.java14
-rw-r--r--Essentials/src/com/earth2me/essentials/textreader/KeywordReplacer.java112
-rw-r--r--Essentials/src/com/earth2me/essentials/textreader/TextInput.java114
-rw-r--r--Essentials/src/com/earth2me/essentials/textreader/TextPager.java156
-rw-r--r--Essentials/src/config.yml15
-rw-r--r--Essentials/src/info.txt35
-rw-r--r--Essentials/src/motd.txt3
-rw-r--r--Essentials/src/rules.txt3
15 files changed, 525 insertions, 321 deletions
diff --git a/Essentials/src/com/earth2me/essentials/Essentials.java b/Essentials/src/com/earth2me/essentials/Essentials.java
index 5fec76a21..1597c1fe9 100644
--- a/Essentials/src/com/earth2me/essentials/Essentials.java
+++ b/Essentials/src/com/earth2me/essentials/Essentials.java
@@ -36,7 +36,6 @@ import com.earth2me.essentials.signs.SignPlayerListener;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.bukkit.command.PluginCommand;
-import org.bukkit.command.PluginCommandYamlParser;
import org.bukkit.entity.Player;
import org.bukkit.event.Event.Priority;
import org.bukkit.event.Event.Type;
@@ -240,120 +239,6 @@ public class Essentials extends JavaPlugin implements IEssentials
}
Util.updateLocale(settings.getLocale(), this);
-
- // for motd
- getConfiguration().load();
- }
-
- @Override
- public String[] getMotd(final CommandSender sender, final String def)
- {
- return getLines(sender, "motd", def);
- }
-
- @Override
- public String[] getLines(final CommandSender sender, final String node, final String def)
- {
- List<String> lines = (List<String>)getConfiguration().getProperty(node);
- if (lines == null)
- {
- return new String[0];
- }
- String[] retval = new String[lines.size()];
-
- if (lines.isEmpty() || lines.get(0) == null)
- {
- try
- {
- lines = new ArrayList<String>();
- // "[]" in YaML indicates empty array, so respect that
- if (!getConfiguration().getString(node, def).equals("[]"))
- {
- lines.add(getConfiguration().getString(node, def));
- retval = new String[lines.size()];
- }
- }
- catch (Throwable ex2)
- {
- LOGGER.log(Level.WARNING, Util.format("corruptNodeInConfig", node));
- return new String[0];
- }
- }
-
- // if still empty, call it a day
- if (lines == null || lines.isEmpty() || lines.get(0) == null)
- {
- return new String[0];
- }
-
- for (int i = 0; i < lines.size(); i++)
- {
- String m = lines.get(i);
- if (m == null)
- {
- continue;
- }
- m = m.replace('&', '§').replace("§§", "&");
-
- if (sender instanceof User || sender instanceof Player)
- {
- User user = getUser(sender);
- m = m.replace("{PLAYER}", user.getDisplayName());
- m = m.replace("{IP}", user.getAddress().toString());
- m = m.replace("{BALANCE}", Double.toString(user.getMoney()));
- m = m.replace("{MAILS}", Integer.toString(user.getMails().size()));
- m = m.replace("{WORLD}", user.getLocation().getWorld().getName());
- }
- int playerHidden = 0;
- for (Player p : getServer().getOnlinePlayers())
- {
- if (getUser(p).isHidden())
- {
- playerHidden++;
- }
- }
- m = m.replace("{ONLINE}", Integer.toString(getServer().getOnlinePlayers().length - playerHidden));
- m = m.replace("{UNIQUE}", Integer.toString(userMap.getUniqueUsers()));
-
- if (m.matches(".*\\{PLAYERLIST\\}.*"))
- {
- StringBuilder online = new StringBuilder();
- for (Player p : getServer().getOnlinePlayers())
- {
- if (getUser(p).isHidden())
- {
- continue;
- }
- if (online.length() > 0)
- {
- online.append(", ");
- }
- online.append(p.getDisplayName());
- }
- m = m.replace("{PLAYERLIST}", online.toString());
- }
-
- if (sender instanceof Player)
- {
- try
- {
- Class User = getClassLoader().loadClass("bukkit.Vandolis.User");
- Object vuser = User.getConstructor(User.class).newInstance((Player)sender);
- m = m.replace("{RED:BALANCE}", User.getMethod("getMoney").invoke(vuser).toString());
- m = m.replace("{RED:BUYS}", User.getMethod("getNumTransactionsBuy").invoke(vuser).toString());
- m = m.replace("{RED:SELLS}", User.getMethod("getNumTransactionsSell").invoke(vuser).toString());
- }
- catch (Throwable ex)
- {
- m = m.replace("{RED:BALANCE}", "N/A");
- m = m.replace("{RED:BUYS}", "N/A");
- m = m.replace("{RED:SELLS}", "N/A");
- }
- }
-
- retval[i] = m + " ";
- }
- return retval;
}
@Override
diff --git a/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java b/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java
index 8ddc540ba..2ad673822 100644
--- a/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java
+++ b/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java
@@ -1,5 +1,10 @@
package com.earth2me.essentials;
+import com.earth2me.essentials.textreader.IText;
+import com.earth2me.essentials.textreader.KeywordReplacer;
+import com.earth2me.essentials.textreader.TextInput;
+import com.earth2me.essentials.textreader.TextPager;
+import java.io.IOException;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
@@ -8,13 +13,10 @@ import java.util.logging.Logger;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Server;
-import org.bukkit.World;
-import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerAnimationEvent;
import org.bukkit.event.player.PlayerAnimationType;
-import org.bukkit.event.player.PlayerBedEnterEvent;
import org.bukkit.event.player.PlayerBucketEmptyEvent;
import org.bukkit.event.player.PlayerChatEvent;
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
@@ -177,13 +179,16 @@ public class EssentialsPlayerListener extends PlayerListener
if (!ess.getSettings().isCommandDisabled("motd") && user.isAuthorized("essentials.motd"))
{
- for (String m : ess.getMotd(user, null))
+ try
{
- if (m == null)
- {
- continue;
- }
- user.sendMessage(m);
+ final IText input = new TextInput(user, "motd", true, ess);
+ final IText output = new KeywordReplacer(input, user, ess);
+ final TextPager pager = new TextPager(output, false);
+ pager.showPage("1", null, user);
+ }
+ catch (IOException ex)
+ {
+ LOGGER.log(Level.WARNING, ex.getMessage(), ex);
}
}
diff --git a/Essentials/src/com/earth2me/essentials/EssentialsUpgrade.java b/Essentials/src/com/earth2me/essentials/EssentialsUpgrade.java
index 409250a00..2f8f7512e 100644
--- a/Essentials/src/com/earth2me/essentials/EssentialsUpgrade.java
+++ b/Essentials/src/com/earth2me/essentials/EssentialsUpgrade.java
@@ -8,6 +8,7 @@ import java.io.FileInputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
+import java.io.PrintWriter;
import java.math.BigInteger;
import java.security.DigestInputStream;
import java.security.MessageDigest;
@@ -82,6 +83,50 @@ public class EssentialsUpgrade
}
}
+ private void moveMotdRulesToFile(String name)
+ {
+ if (doneFile.getBoolean("move"+name+"ToFile", false))
+ {
+ return;
+ }
+ try
+ {
+ final File file = new File(ess.getDataFolder(), name+".txt");
+ if (file.exists())
+ {
+ return;
+ }
+ final File configFile = new File(ess.getDataFolder(), "config.yml");
+ if (!configFile.exists())
+ {
+ return;
+ }
+ final EssentialsConf conf = new EssentialsConf(configFile);
+ conf.load();
+ List<String> lines = conf.getStringList(name, null);
+ if (lines != null && !lines.isEmpty())
+ {
+ if (!file.createNewFile())
+ {
+ throw new IOException("Failed to create file " + file);
+ }
+ PrintWriter writer = new PrintWriter(file);
+
+ for (String line : lines)
+ {
+ writer.println(line);
+ }
+ writer.close();
+ }
+ doneFile.setProperty("move"+name+"ToFile", true);
+ doneFile.save();
+ }
+ catch (Throwable e)
+ {
+ LOGGER.log(Level.SEVERE, Util.i18n("upgradingFilesError"), e);
+ }
+ }
+
private void removeLinesFromConfig(File file, String regex, String info) throws Exception
{
boolean needUpdate = false;
@@ -654,6 +699,8 @@ public class EssentialsUpgrade
ess.getDataFolder().mkdirs();
}
moveWorthValuesToWorthYml();
+ moveMotdRulesToFile("motd");
+ moveMotdRulesToFile("rules");
}
public void afterSettings()
diff --git a/Essentials/src/com/earth2me/essentials/IEssentials.java b/Essentials/src/com/earth2me/essentials/IEssentials.java
index 337a3997d..ef54b0776 100644
--- a/Essentials/src/com/earth2me/essentials/IEssentials.java
+++ b/Essentials/src/com/earth2me/essentials/IEssentials.java
@@ -29,10 +29,6 @@ public interface IEssentials extends Plugin
BukkitScheduler getScheduler();
- String[] getMotd(CommandSender sender, String def);
-
- String[] getLines(CommandSender sender, String node, String def);
-
Jail getJail();
Warps getWarps();
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandinfo.java b/Essentials/src/com/earth2me/essentials/commands/Commandinfo.java
index 97dd71d35..05985e9d9 100644
--- a/Essentials/src/com/earth2me/essentials/commands/Commandinfo.java
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandinfo.java
@@ -1,17 +1,11 @@
package com.earth2me.essentials.commands;
-import com.earth2me.essentials.User;
-import com.earth2me.essentials.Util;
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import com.earth2me.essentials.textreader.IText;
+import com.earth2me.essentials.textreader.KeywordReplacer;
+import com.earth2me.essentials.textreader.TextInput;
+import com.earth2me.essentials.textreader.TextPager;
import org.bukkit.Server;
import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
public class Commandinfo extends EssentialsCommand
@@ -24,165 +18,9 @@ public class Commandinfo extends EssentialsCommand
@Override
protected void run(Server server, CommandSender sender, String commandLabel, String[] args) throws Exception
{
- String pageStr = args.length > 0 ? args[0].trim() : null;
-
- List<String> lines = new ArrayList<String>();
- List<String> chapters = new ArrayList<String>();
- Map<String, Integer> bookmarks = new HashMap<String, Integer>();
- File file = null;
- if (sender instanceof Player)
- {
- User user = ess.getUser(sender);
- file = new File(ess.getDataFolder(), "info_"+Util.sanitizeFileName(user.getName()) +".txt");
- if (!file.exists())
- {
- file = new File(ess.getDataFolder(), "info_"+Util.sanitizeFileName(user.getGroup()) +".txt");
- }
- }
- if (file == null || !file.exists())
- {
- file = new File(ess.getDataFolder(), "info.txt");
- }
- if (file.exists())
- {
- final BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
- try
- {
- int lineNumber = 0;
- while (bufferedReader.ready())
- {
- final String line = bufferedReader.readLine();
- if (line.length() > 0 && line.charAt(0) == '#')
- {
- bookmarks.put(line.substring(1).toLowerCase().replaceAll("&[0-9a-f]", ""), lineNumber);
- chapters.add(line.substring(1).replace('&', '§'));
- }
- lines.add(line.replace('&', '§'));
- lineNumber++;
- }
- }
- finally
- {
- bufferedReader.close();
- }
- }
- else
- {
- file.createNewFile();
- throw new Exception(Util.i18n("infoFileDoesNotExist"));
- }
-
- if (bookmarks.isEmpty())
- {
- int page = 1;
- try
- {
- page = Integer.parseInt(pageStr);
- }
- catch (Exception ex)
- {
- page = 1;
- }
-
- int start = (page - 1) * 9;
- int pages = lines.size() / 9 + (lines.size() % 9 > 0 ? 1 : 0);
-
- sender.sendMessage(Util.format("infoPages", page, pages ));
- for (int i = start; i < lines.size() && i < start + 9; i++)
- {
- sender.sendMessage(lines.get(i));
- }
- return;
- }
-
- if (pageStr == null || pageStr.isEmpty() || pageStr.matches("[0-9]+"))
- {
- if (lines.get(0).startsWith("#"))
- {
- sender.sendMessage(Util.i18n("infoChapter"));
- StringBuilder sb = new StringBuilder();
- boolean first = true;
- for (String string : chapters)
- {
- if (!first)
- {
- sb.append(", ");
- }
- first = false;
- sb.append(string);
- }
- sender.sendMessage(sb.toString());
- return;
- }
- else
- {
- int page = 1;
- try
- {
- page = Integer.parseInt(pageStr);
- }
- catch (Exception ex)
- {
- page = 1;
- }
-
- int start = (page - 1) * 9;
- int end;
- for (end = 0; end < lines.size(); end++)
- {
- String line = lines.get(end);
- if (line.startsWith("#"))
- {
- break;
- }
- }
- int pages = end / 9 + (end % 9 > 0 ? 1 : 0);
-
- sender.sendMessage(Util.format("infoPages", page, pages ));
- for (int i = start; i < end && i < start + 9; i++)
- {
- sender.sendMessage(lines.get(i));
- }
- return;
- }
- }
-
- int chapterpage = 0;
- if (args.length >= 2)
- {
- try
- {
- chapterpage = Integer.parseInt(args[1]) - 1;
- }
- catch (Exception ex)
- {
- chapterpage = 0;
- }
- }
-
- if (!bookmarks.containsKey(pageStr.toLowerCase()))
- {
- sender.sendMessage(Util.i18n("infoUnknownChapter"));
- return;
- }
- int chapterstart = bookmarks.get(pageStr.toLowerCase()) + 1;
- int chapterend;
- for (chapterend = chapterstart; chapterend < lines.size(); chapterend++)
- {
- String line = lines.get(chapterend);
- if (line.startsWith("#"))
- {
- break;
- }
- }
- int start = chapterstart + chapterpage * 9;
- int page = chapterpage + 1;
- int pages = (chapterend - chapterstart) / 9 + ((chapterend - chapterstart) % 9 > 0 ? 1 : 0);
-
- sender.sendMessage(Util.format("infoChapterPages", pageStr, page , pages));
- for (int i = start; i < chapterend && i < start + 9; i++)
- {
- sender.sendMessage(lines.get(i));
- }
+ final IText input = new TextInput(sender, "info", true, ess);
+ final IText output = new KeywordReplacer(input, sender, ess);
+ final TextPager pager = new TextPager(output);
+ pager.showPage(args.length > 0 ? args[0] : null, args.length > 1 ? args[1] : null, sender);
}
}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandmotd.java b/Essentials/src/com/earth2me/essentials/commands/Commandmotd.java
index c695338f6..9439d2ca2 100644
--- a/Essentials/src/com/earth2me/essentials/commands/Commandmotd.java
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandmotd.java
@@ -1,6 +1,9 @@
package com.earth2me.essentials.commands;
-import com.earth2me.essentials.Util;
+import com.earth2me.essentials.textreader.IText;
+import com.earth2me.essentials.textreader.KeywordReplacer;
+import com.earth2me.essentials.textreader.TextInput;
+import com.earth2me.essentials.textreader.TextPager;
import org.bukkit.Server;
import org.bukkit.command.CommandSender;
@@ -15,9 +18,9 @@ public class Commandmotd extends EssentialsCommand
@Override
public void run(Server server, CommandSender sender, String commandLabel, String[] args) throws Exception
{
- for (String m : ess.getMotd(sender, Util.i18n("noMotd")))
- {
- sender.sendMessage(m);
- }
+ final IText input = new TextInput(sender, "motd", true, ess);
+ final IText output = new KeywordReplacer(input, sender, ess);
+ final TextPager pager = new TextPager(output);
+ pager.showPage(args.length > 0 ? args[0] : null, args.length > 1 ? args[1] : null, sender);
}
}
diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandrules.java b/Essentials/src/com/earth2me/essentials/commands/Commandrules.java
index 39f7de68e..e8f2d23d2 100644
--- a/Essentials/src/com/earth2me/essentials/commands/Commandrules.java
+++ b/Essentials/src/com/earth2me/essentials/commands/Commandrules.java
@@ -1,6 +1,10 @@
package com.earth2me.essentials.commands;
import com.earth2me.essentials.Util;
+import com.earth2me.essentials.textreader.IText;
+import com.earth2me.essentials.textreader.KeywordReplacer;
+import com.earth2me.essentials.textreader.TextInput;
+import com.earth2me.essentials.textreader.TextPager;
import org.bukkit.Server;
import org.bukkit.command.CommandSender;
@@ -13,11 +17,11 @@ public class Commandrules extends EssentialsCommand
}
@Override
- public void run(Server server, CommandSender sender, String commandLabel, String[] args) throws Exception
+ public void run(final Server server, final CommandSender sender, final String commandLabel, String[] args) throws Exception
{
- for (String m : ess.getLines(sender, "rules", Util.i18n("noRules")))
- {
- sender.sendMessage(m);
- }
+ final IText input = new TextInput(sender, "rules", true, ess);
+ final IText output = new KeywordReplacer(input, sender, ess);
+ final TextPager pager = new TextPager(output);
+ pager.showPage(args.length > 0 ? args[0] : null, args.length > 1 ? args[1] : null, sender);
}
}
diff --git a/Essentials/src/com/earth2me/essentials/textreader/IText.java b/Essentials/src/com/earth2me/essentials/textreader/IText.java
new file mode 100644
index 000000000..851119701
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/textreader/IText.java
@@ -0,0 +1,14 @@
+package com.earth2me.essentials.textreader;
+
+import java.util.List;
+import java.util.Map;
+
+
+public interface IText
+{
+ List<String> getLines();
+
+ List<String> getChapters();
+
+ Map<String, Integer> getBookmarks();
+}
diff --git a/Essentials/src/com/earth2me/essentials/textreader/KeywordReplacer.java b/Essentials/src/com/earth2me/essentials/textreader/KeywordReplacer.java
new file mode 100644
index 000000000..29e44a682
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/textreader/KeywordReplacer.java
@@ -0,0 +1,112 @@
+package com.earth2me.essentials.textreader;
+
+import com.earth2me.essentials.IEssentials;
+import com.earth2me.essentials.User;
+import java.util.List;
+import java.util.Map;
+import org.bukkit.World;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+
+
+public class KeywordReplacer implements IText
+{
+ private final transient IText input;
+ private final transient IEssentials ess;
+
+ public KeywordReplacer(final IText input, final CommandSender sender, final IEssentials ess)
+ {
+ this.input = input;
+ this.ess = ess;
+ replaceKeywords(sender);
+ }
+
+ private void replaceKeywords(final CommandSender sender)
+ {
+ String displayName, ipAddress, balance, mails, world;
+ String worlds, online, unique, playerlist;
+ if (sender instanceof Player)
+ {
+ final User user = ess.getUser(sender);
+ displayName = user.getDisplayName();
+ ipAddress = user.getAddress().getAddress().toString();
+ balance = Double.toString(user.getMoney());
+ mails = Integer.toString(user.getMails().size());
+ world = user.getLocation().getWorld().getName();
+ }
+ else
+ {
+ displayName = ipAddress = balance = mails = world = "";
+ }
+
+ int playerHidden = 0;
+ for (Player p : ess.getServer().getOnlinePlayers())
+ {
+ if (ess.getUser(p).isHidden())
+ {
+ playerHidden++;
+ }
+ }
+ online = Integer.toString(ess.getServer().getOnlinePlayers().length - playerHidden);
+ unique = Integer.toString(ess.getUserMap().getUniqueUsers());
+
+ final StringBuilder worldsBuilder = new StringBuilder();
+ for (World w : ess.getServer().getWorlds())
+ {
+ if (worldsBuilder.length() > 0)
+ {
+ worldsBuilder.append(", ");
+ }
+ worldsBuilder.append(w.getName());
+ }
+ worlds = worldsBuilder.toString();
+
+ final StringBuilder playerlistBuilder = new StringBuilder();
+ for (Player p : ess.getServer().getOnlinePlayers())
+ {
+ if (ess.getUser(p).isHidden())
+ {
+ continue;
+ }
+ if (playerlistBuilder.length() > 0)
+ {
+ playerlistBuilder.append(", ");
+ }
+ playerlistBuilder.append(p.getDisplayName());
+ }
+ playerlist = playerlistBuilder.toString();
+
+ for (int i = 0; i < input.getLines().size(); i++)
+ {
+ String line = input.getLines().get(i);
+ line = line.replace("{PLAYER}", displayName);
+ line = line.replace("{IP}", ipAddress);
+ line = line.replace("{BALANCE}", balance);
+ line = line.replace("{MAILS}", mails);
+ line = line.replace("{WORLD}", world);
+ line = line.replace("{ONLINE}", online);
+ line = line.replace("{UNIQUE}", unique);
+ line = line.replace("{WORLDS}", worlds);
+ line = line.replace("{PLAYERLIST}", playerlist);
+ input.getLines().set(i, line);
+ }
+ }
+
+ @Override
+ public List<String> getLines()
+ {
+ return input.getLines();
+ }
+
+ @Override
+ public List<String> getChapters()
+ {
+ return input.getChapters();
+ }
+
+ @Override
+ public Map<String, Integer> getBookmarks()
+ {
+ return input.getBookmarks();
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/textreader/TextInput.java b/Essentials/src/com/earth2me/essentials/textreader/TextInput.java
new file mode 100644
index 000000000..c5536dd51
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/textreader/TextInput.java
@@ -0,0 +1,114 @@
+package com.earth2me.essentials.textreader;
+
+import com.earth2me.essentials.IEssentials;
+import com.earth2me.essentials.User;
+import com.earth2me.essentials.Util;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+import quicktime.streaming.Stream;
+
+
+public class TextInput implements IText
+{
+ private final transient List<String> lines = new ArrayList<String>();
+ private final transient List<String> chapters = new ArrayList<String>();
+ private final transient Map<String, Integer> bookmarks = new HashMap<String, Integer>();
+
+ public TextInput(final CommandSender sender, final String filename, final boolean createFile, final IEssentials ess) throws IOException
+ {
+
+ File file = null;
+ if (sender instanceof Player)
+ {
+ final User user = ess.getUser(sender);
+ file = new File(ess.getDataFolder(), filename + "_" + Util.sanitizeFileName(user.getName()) + ".txt");
+ if (!file.exists())
+ {
+ file = new File(ess.getDataFolder(), filename + "_" + Util.sanitizeFileName(user.getGroup()) + ".txt");
+ }
+ }
+ if (file == null || !file.exists())
+ {
+ file = new File(ess.getDataFolder(), filename + ".txt");
+ }
+ if (file.exists())
+ {
+ final BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
+ try
+ {
+ int lineNumber = 0;
+ while (bufferedReader.ready())
+ {
+ final String line = bufferedReader.readLine();
+ if (line == null)
+ {
+ break;
+ }
+ if (line.length() > 0 && line.charAt(0) == '#')
+ {
+ bookmarks.put(line.substring(1).toLowerCase().replaceAll("&[0-9a-f]", ""), lineNumber);
+ chapters.add(line.substring(1).replace('&', '§').replace("§§", "&"));
+ }
+ lines.add(line.replace('&', '§').replace("§§", "&"));
+ lineNumber++;
+ }
+ }
+ finally
+ {
+ bufferedReader.close();
+ }
+ }
+ else
+ {
+ if (createFile)
+ {
+ final InputStream input = ess.getResource(filename + ".txt");
+ final OutputStream output = new FileOutputStream(file);
+ try
+ {
+ final byte[] buffer = new byte[1024];
+ int length = 0;
+ length = input.read(buffer);
+ while (length > 0)
+ {
+ output.write(buffer, 0, length);
+ length = input.read(buffer);
+ }
+ }
+ finally
+ {
+ output.close();
+ input.close();
+ }
+ throw new FileNotFoundException("File " + filename + ".txt does not exist. Creating one for you.");
+ }
+ }
+ }
+
+ public List<String> getLines()
+ {
+ return lines;
+ }
+
+ public List<String> getChapters()
+ {
+ return chapters;
+ }
+
+ public Map<String, Integer> getBookmarks()
+ {
+ return bookmarks;
+ }
+}
diff --git a/Essentials/src/com/earth2me/essentials/textreader/TextPager.java b/Essentials/src/com/earth2me/essentials/textreader/TextPager.java
new file mode 100644
index 000000000..786ca96bd
--- /dev/null
+++ b/Essentials/src/com/earth2me/essentials/textreader/TextPager.java
@@ -0,0 +1,156 @@
+package com.earth2me.essentials.textreader;
+
+import com.earth2me.essentials.Util;
+import java.util.List;
+import java.util.Map;
+import org.bukkit.command.CommandSender;
+
+
+public class TextPager
+{
+ private final transient IText text;
+ private final transient boolean showHeader;
+
+ public TextPager(final IText text)
+ {
+ this(text, true);
+ }
+
+ public TextPager(final IText text, final boolean showHeader)
+ {
+ this.text = text;
+ this.showHeader = showHeader;
+ }
+
+ public void showPage(final String pageStr, final String chapterPageStr, final CommandSender sender)
+ {
+ List<String> lines = text.getLines();
+ List<String> chapters = text.getChapters();
+ Map<String, Integer> bookmarks = text.getBookmarks();
+
+ if (bookmarks.isEmpty())
+ {
+ int page = 1;
+ try
+ {
+ page = Integer.parseInt(pageStr);
+ }
+ catch (Exception ex)
+ {
+ page = 1;
+ }
+
+ int start = (page - 1) * 9;
+ if (showHeader)
+ {
+ int pages = lines.size() / 9 + (lines.size() % 9 > 0 ? 1 : 0);
+ sender.sendMessage(Util.format("infoPages", page, pages));
+ }
+ for (int i = start; i < lines.size() && i < start + 9; i++)
+ {
+ sender.sendMessage(lines.get(i));
+ }
+ return;
+ }
+
+ if (pageStr == null || pageStr.isEmpty() || pageStr.matches("[0-9]+"))
+ {
+ if (lines.get(0).startsWith("#"))
+ {
+ if (!showHeader)
+ {
+ return;
+ }
+ sender.sendMessage(Util.i18n("infoChapter"));
+ final StringBuilder sb = new StringBuilder();
+ boolean first = true;
+ for (String string : chapters)
+ {
+ if (!first)
+ {
+ sb.append(", ");
+ }
+ first = false;
+ sb.append(string);
+ }
+ sender.sendMessage(sb.toString());
+ return;
+ }
+ else
+ {
+ int page = 1;
+ try
+ {
+ page = Integer.parseInt(pageStr);
+ }
+ catch (Exception ex)
+ {
+ page = 1;
+ }
+
+ int start = (page - 1) * 9;
+ int end;
+ for (end = 0; end < lines.size(); end++)
+ {
+ String line = lines.get(end);
+ if (line.startsWith("#"))
+ {
+ break;
+ }
+ }
+
+ if (showHeader)
+ {
+ int pages = end / 9 + (end % 9 > 0 ? 1 : 0);
+ sender.sendMessage(Util.format("infoPages", page, pages));
+ }
+ for (int i = start; i < end && i < start + 9; i++)
+ {
+ sender.sendMessage(lines.get(i));
+ }
+ return;
+ }
+ }
+
+ int chapterpage = 0;
+ if (chapterPageStr != null)
+ {
+ try
+ {
+ chapterpage = Integer.parseInt(chapterPageStr) - 1;
+ }
+ catch (Exception ex)
+ {
+ chapterpage = 0;
+ }
+ }
+
+ if (!bookmarks.containsKey(pageStr.toLowerCase()))
+ {
+ sender.sendMessage(Util.i18n("infoUnknownChapter"));
+ return;
+ }
+ final int chapterstart = bookmarks.get(pageStr.toLowerCase()) + 1;
+ int chapterend;
+ for (chapterend = chapterstart; chapterend < lines.size(); chapterend++)
+ {
+ final String line = lines.get(chapterend);
+ if (line.length() > 0 && line.charAt(0) == '#')
+ {
+ break;
+ }
+ }
+ final int start = chapterstart + chapterpage * 9;
+
+ if (showHeader)
+ {
+ final int page = chapterpage + 1;
+ final int pages = (chapterend - chapterstart) / 9 + ((chapterend - chapterstart) % 9 > 0 ? 1 : 0);
+ sender.sendMessage(Util.format("infoChapterPages", pageStr, page, pages));
+ }
+ for (int i = start; i < chapterend && i < start + 9; i++)
+ {
+ sender.sendMessage(lines.get(i));
+ }
+ }
+}
diff --git a/Essentials/src/config.yml b/Essentials/src/config.yml
index 472887d5d..0e3361308 100644
--- a/Essentials/src/config.yml
+++ b/Essentials/src/config.yml
@@ -85,19 +85,8 @@ spawnmob-limit: 10
# Shall we notify users when using /lightning
warn-on-smite: true
-# The message of the day, displayed on connect and by typing /motd.
-# Valid tags are: {PLAYER}, {IP}, {BALANCE}, {MAILS}, {WORLD}, {ONLINE}, {UNIQUE}, {PLAYERLIST}
-motd:
- - '&cWelcome, {PLAYER}&c!'
- - '&fType &c/help&f for a list of commands.'
- - 'Currently online: {PLAYERLIST}'
-
-# The server rules, available by typing /rules
-rules:
- - '[1] Be respectful'
- - '[2] Be ethical'
- - '[3] Use common sense'
-
+# motd and rules are now configured in the files motd.txt and rules.txt
+
# When a command conflicts with another plugin, by default, Essentials will try to force the OTHER plugin to take
# priority. If a command is in this list, Essentials will try to give ITSELF priority. This does not always work:
# usually whichever plugin was updated most recently wins out. However, the full name of the command will always work.
diff --git a/Essentials/src/info.txt b/Essentials/src/info.txt
new file mode 100644
index 000000000..4435364fe
--- /dev/null
+++ b/Essentials/src/info.txt
@@ -0,0 +1,35 @@
+This is the info file.
+
+This file format works for the info.txt, motd.txt and rules.txt
+
+You can create a specific file for a user or a group:
+Name it info_username.txt or info_groupname.txt
+
+This also works with motd and rules.
+
+It can contain chapters like the Chapter1 below:
+
+#Chapter1
+Lines starting with # begin a new chapter
+The user has to type /info Chapter1 to read this chapter
+
+If the file starts with a # then the user is shown a chapter selection,
+when he does not select a chapter.
+
+#Colors
+Minecraft colors:
+&0 &&0 &1 &&1 &2 &&2 &3 &&3
+&4 &&4 &5 &&5 &6 &&6 &7 &&7
+&8 &&8 &9 &&9 &a &&a &b &&b
+&c &&c &d &&d &e &&e &f &&f
+
+#Tags
+PLAYER: {PLAYER}
+IP: {IP}
+BALANCE: {BALANCE}
+MAILS: {MAILS}
+WORLD: {WORLD}
+WORLDS: {WORLDS}
+ONLINE: {ONLINE}
+UNIQUE: {UNIQUE}
+PLAYERLIST: {PLAYERLIST} \ No newline at end of file
diff --git a/Essentials/src/motd.txt b/Essentials/src/motd.txt
new file mode 100644
index 000000000..224e452ef
--- /dev/null
+++ b/Essentials/src/motd.txt
@@ -0,0 +1,3 @@
+&cWelcome, {PLAYER}&c!
+&fType &c/help&f for a list of commands.
+Currently online: {PLAYERLIST} \ No newline at end of file
diff --git a/Essentials/src/rules.txt b/Essentials/src/rules.txt
new file mode 100644
index 000000000..486bfdf29
--- /dev/null
+++ b/Essentials/src/rules.txt
@@ -0,0 +1,3 @@
+[1] Be respectful
+[2] Be ethical
+[3] Use common sense \ No newline at end of file