diff --git a/README.md b/README.md
index c0f1e0fe..74fb3017 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@ Build Status : [![Build Status](https://travis-ci.org/ucchyocean/LunaChat.svg?br
チャンネルチャットプラグイン
ダウンロードはこちらから
-http://forum.minecraftuser.jp/viewtopic.php?f=38&t=13739
+https://github.com/ucchyocean/LunaChat/releases
コマンドリファレンスや、設定リファレンスは、こちらから
https://github.com/ucchyocean/LunaChat/wiki/Commands
diff --git a/distribution.xml b/distribution.xml
deleted file mode 100644
index 2463451a..00000000
--- a/distribution.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
- dist
-
- zip
-
- false
-
-
-
- plugins/LunaChat.jar
-
-
-
-
diff --git a/pom.xml b/pom.xml
index ee76480c..7f172c73 100644
--- a/pom.xml
+++ b/pom.xml
@@ -2,8 +2,9 @@
4.0.0
com.github.ucchyocean
LunaChat
- 2.8.15
+ 3.0.0
A powerfull chat channel plugin with IME (Kana-Kanji conversion) support
+ https://github.com/ucchyocean/LunaChat
@@ -15,6 +16,8 @@
UTF-8
+ 1.8
+ 8
@@ -40,8 +43,8 @@
maven-compiler-plugin
3.8.1
-
- 1.8
+
+ ${java.version}
@@ -49,34 +52,18 @@
maven-javadoc-plugin
3.1.0
-
+
UTF-8
UTF-8
UTF-8
public
true
- https://docs.oracle.com/javase/jp/8/docs/api/
+ https://docs.oracle.com/javase/jp/${java.version.short}/docs/api/
https://hub.spigotmc.org/javadocs/bukkit/
-
- org.apache.maven.plugins
- maven-assembly-plugin
- 3.1.1
-
- ${project.artifactId}-${project.version}
-
- distribution.xml
-
-
-
-
- deploy
-
-
-
org.apache.maven.plugins
maven-shade-plugin
@@ -100,6 +87,10 @@
org.apache.commons.lang3
com.github.ucchyocean.lc.lib.org.apache.commons.lang3
+
+ org.jetbrains
+ com.github.ucchyocean.lc.lib.org.jetbrains
+
@@ -109,11 +100,6 @@
-
- spigot-repo
- Spigot Maven Repository
- https://hub.spigotmc.org/nexus/content/groups/public/
-
jitpack.io
Vault Repository
@@ -127,12 +113,17 @@
onarandombox-repo
Multiverse repository
- http://repo.onarandombox.com/content/groups/public/
+ http://repo.onarandombox.com/content/repositories/multiverse/
md5-repo
MD5 repository
- https://repo.md-5.net/content/repositories/releases/
+ https://hub.spigotmc.org/nexus/content/repositories/snapshots/
+
+
+ BungeeCord-repo
+ sonatype repository
+ https://oss.sonatype.org/content/repositories/snapshots/
@@ -143,6 +134,12 @@
1.15.2-R0.1-SNAPSHOT
provided
+
+ net.md-5
+ bungeecord-api
+ 1.15-SNAPSHOT
+ provided
+
com.github.MilkBowl
VaultAPI
@@ -157,24 +154,10 @@
true
provided
-
- uk.co.oliwali
- HawkEye
- 1.7.2
- true
- system
- ${project.basedir}/lib/HawkEye.jar
-
-
- com.dthielke.herochat
- Herochat
-
-
-
com.onarandombox.multiversecore
Multiverse-Core
- 3.0.0
+ 4.1.0
true
provided
@@ -185,14 +168,6 @@
true
provided
-
- me.botsko
- prism
- 2.0.6
- true
- system
- ${project.basedir}/lib/prism-2.0.6.jar
-
com.google.code.gson
gson
@@ -203,5 +178,16 @@
commons-lang3
3.9
+
+ org.jetbrains
+ annotations
+ 16.0.2
+
+
+ junit
+ junit
+ 4.12
+ test
+
diff --git a/src/main/java/com/github/ucchyocean/lc/LunaChat.java b/src/main/java/com/github/ucchyocean/lc/LunaChat.java
index f207fa53..7140df1b 100644
--- a/src/main/java/com/github/ucchyocean/lc/LunaChat.java
+++ b/src/main/java/com/github/ucchyocean/lc/LunaChat.java
@@ -5,260 +5,31 @@
*/
package com.github.ucchyocean.lc;
-import java.io.File;
-import java.util.List;
-
-import org.bukkit.Bukkit;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.plugin.Plugin;
-import org.bukkit.plugin.java.JavaPlugin;
-
-import com.github.ucchyocean.lc.bridge.DynmapBridge;
-import com.github.ucchyocean.lc.bridge.HawkEyeBridge;
-import com.github.ucchyocean.lc.bridge.McMMOBridge;
-import com.github.ucchyocean.lc.bridge.MultiverseCoreBridge;
-import com.github.ucchyocean.lc.bridge.PrismBridge;
-import com.github.ucchyocean.lc.bridge.VaultChatBridge;
-import com.github.ucchyocean.lc.channel.ChannelManager;
-import com.github.ucchyocean.lc.command.LunaChatCommand;
-import com.github.ucchyocean.lc.command.LunaChatJapanizeCommand;
-import com.github.ucchyocean.lc.command.LunaChatMessageCommand;
-import com.github.ucchyocean.lc.command.LunaChatReplyCommand;
-
/**
* LunaChat プラグイン
* @author ucchy
*/
-public class LunaChat extends JavaPlugin {
-
- private static LunaChat instance;
-
- private LunaChatConfig config;
- private ChannelManager manager;
-
- private VaultChatBridge vaultchat;
- private DynmapBridge dynmap;
- private HawkEyeBridge hawkeye;
- private MultiverseCoreBridge multiverse;
- private PrismBridge prism;
-
- private ExpireCheckTask expireCheckerTask;
- private LunaChatLogger normalChatLogger;
-
- private LunaChatCommand lunachatCommand;
- private LunaChatMessageCommand messageCommand;
- private LunaChatReplyCommand replyCommand;
- private LunaChatJapanizeCommand lcjapanizeCommand;
-
- /**
- * プラグインが有効化されたときに呼び出されるメソッド
- * @see org.bukkit.plugin.java.JavaPlugin#onEnable()
- */
- @Override
- public void onEnable() {
-
- // 変数などの初期化
- config = new LunaChatConfig();
- manager = new ChannelManager();
- normalChatLogger = new LunaChatLogger("==normalchat");
-
- // チャンネルチャット無効なら、デフォルト発言先をクリアする(see issue #59)
- if ( !config.isEnableChannelChat() ) {
- manager.removeAllDefaultChannels();
- }
-
- // Vault のロード
- Plugin temp = getServer().getPluginManager().getPlugin("Vault");
- if ( temp != null ) {
- vaultchat = VaultChatBridge.load(temp);
- }
-
- // Dynmap のロード
- temp = getServer().getPluginManager().getPlugin("dynmap");
- if ( temp != null ) {
- dynmap = DynmapBridge.load(temp);
- if ( dynmap != null ) {
- getServer().getPluginManager().registerEvents(dynmap, this);
- }
- }
-
- // HawkEye のロード
- temp = getServer().getPluginManager().getPlugin("HawkEye");
- if ( temp != null ) {
- hawkeye = HawkEyeBridge.load(temp);
- }
-
- // MultiverseCore のロード
- temp = getServer().getPluginManager().getPlugin("Multiverse-Core");
- if ( temp != null ) {
- multiverse = MultiverseCoreBridge.load(temp);
- }
-
- // mcMMOのロード
- if ( getServer().getPluginManager().isPluginEnabled("mcMMO") ) {
- getServer().getPluginManager().registerEvents(new McMMOBridge(), this);
- }
-
- // Prismのロード
- if ( getServer().getPluginManager().isPluginEnabled("Prism") ) {
- prism = PrismBridge.load();
- }
-
- // リスナーの登録
- getServer().getPluginManager().registerEvents(new PlayerListener(), this);
-
- // コマンドの登録
- lunachatCommand = new LunaChatCommand();
- messageCommand = new LunaChatMessageCommand();
- replyCommand = new LunaChatReplyCommand();
- lcjapanizeCommand = new LunaChatJapanizeCommand();
-
- // 期限チェッカータスクの起動
- expireCheckerTask = new ExpireCheckTask();
- expireCheckerTask.runTaskTimerAsynchronously(this, 100, 600);
- }
-
- /**
- * プラグインが無効化されたときに呼び出されるメソッド
- * @see org.bukkit.plugin.java.JavaPlugin#onDisable()
- */
- @Override
- public void onDisable() {
-
- // 期限チェッカータスクの停止
- if ( expireCheckerTask != null ) {
- expireCheckerTask.cancel();
- }
- }
-
- /**
- * コマンド実行時に呼び出されるメソッド
- * @see org.bukkit.plugin.java.JavaPlugin#onCommand(org.bukkit.command.CommandSender, org.bukkit.command.Command, java.lang.String, java.lang.String[])
- */
- @Override
- public boolean onCommand(
- CommandSender sender, Command command, String label, String[] args) {
-
- if ( command.getName().equals("lunachat") ) {
- return lunachatCommand.onCommand(sender, command, label, args);
- } else if ( command.getName().equals("tell") ) {
- return messageCommand.onCommand(sender, command, label, args);
- } else if ( command.getName().equals("reply") ) {
- return replyCommand.onCommand(sender, command, label, args);
- } else if ( command.getName().equals("lcjapanize") ) {
- return lcjapanizeCommand.onCommand(sender, command, label, args);
- }
-
- return false;
- }
-
- /**
- * TABキー補完が実行されたときに呼び出されるメソッド
- * @see org.bukkit.plugin.java.JavaPlugin#onTabComplete(org.bukkit.command.CommandSender, org.bukkit.command.Command, java.lang.String, java.lang.String[])
- */
- @Override
- public List onTabComplete(
- CommandSender sender, Command command, String label, String[] args) {
+public class LunaChat {
- List completeList = null;
- if ( command.getName().equals("lunachat") ) {
- completeList = lunachatCommand.onTabComplete(sender, command, label, args);
- }
- if ( completeList != null ) {
- return completeList;
- }
- return super.onTabComplete(sender, command, label, args);
- }
+ private static LunaChat instance = new LunaChat();
+ @SuppressWarnings("deprecation")
+ private LunaChatAPI api = new LunaChatAPIImpl();
/**
* LunaChatのインスタンスを返す
* @return LunaChat
+ * @deprecated Legacy Version
*/
public static LunaChat getInstance() {
- if ( instance == null ) {
- instance = (LunaChat)Bukkit.getPluginManager().getPlugin("LunaChat");
- }
return instance;
}
- /**
- * このプラグインのJarファイル自身を示すFileクラスを返す。
- * @return Jarファイル
- */
- protected static File getPluginJarFile() {
- return getInstance().getFile();
- }
-
/**
* LunaChatAPIを取得する
* @return LunaChatAPI
+ * @deprecated Legacy Version
*/
public LunaChatAPI getLunaChatAPI() {
- return manager;
- }
-
- /**
- * LunaChatConfigを取得する
- * @return LunaChatConfig
- */
- public LunaChatConfig getLunaChatConfig() {
- return config;
- }
-
- /**
- * VaultChat連携クラスを返す
- * @return VaultChatBridge
- */
- public VaultChatBridge getVaultChat() {
- return vaultchat;
- }
-
- /**
- * Dynmap連携クラスを返す
- * @return DynmapBridge
- */
- public DynmapBridge getDynmap() {
- return dynmap;
- }
-
- /**
- * HawkEye連携クラスを返す
- * @return HawkEyeBridge
- */
- public HawkEyeBridge getHawkEye() {
- return hawkeye;
- }
-
- /**
- * MultiverseCore連携クラスを返す
- * @return MultiverseCoreBridge
- */
- public MultiverseCoreBridge getMultiverseCore() {
- return multiverse;
- }
-
- /**
- * Prism連携クラスを返す
- * @return MultiverseCoreBridge
- */
- public PrismBridge getPrism() {
- return prism;
- }
-
- /**
- * 通常チャット用のロガーを返す
- * @return normalChatLogger
- */
- public LunaChatLogger getNormalChatLogger() {
- return normalChatLogger;
- }
-
- /**
- * 通常チャット用のロガーを設定する
- * @param normalChatLogger normalChatLogger
- */
- protected void setNormalChatLogger(LunaChatLogger normalChatLogger) {
- this.normalChatLogger = normalChatLogger;
+ return api;
}
}
diff --git a/src/main/java/com/github/ucchyocean/lc/LunaChatAPI.java b/src/main/java/com/github/ucchyocean/lc/LunaChatAPI.java
index 3ee967ac..7976bc3a 100644
--- a/src/main/java/com/github/ucchyocean/lc/LunaChatAPI.java
+++ b/src/main/java/com/github/ucchyocean/lc/LunaChatAPI.java
@@ -1,195 +1,215 @@
-/*
- * @author ucchy
- * @license LGPLv3
- * @copyright Copyright ucchy 2013
- */
-package com.github.ucchyocean.lc;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-
-import org.bukkit.command.CommandSender;
-
-import com.github.ucchyocean.lc.channel.Channel;
-import com.github.ucchyocean.lc.channel.ChannelPlayer;
-import com.github.ucchyocean.lc.japanize.JapanizeType;
-
-/**
- * LunaChat APIクラス
- * @author ucchy
- */
-public interface LunaChatAPI {
-
- /**
- * 指定したチャンネル名が存在するかどうかを返す
- * @param channelName チャンネル名
- * @return 存在するかどうか
- */
- public boolean isExistChannel(String channelName);
-
- /**
- * 全てのチャンネルを返す
- * @return 全てのチャンネル
- */
- public Collection getChannels();
-
- /**
- * プレイヤーが参加しているチャンネルを返す
- * @param playerName プレイヤー名
- * @return チャンネル
- */
- public Collection getChannelsByPlayer(String playerName);
-
- /**
- * プレイヤーが参加しているデフォルトのチャンネルを返す
- * @param playerName プレイヤー
- * @return チャンネル
- */
- public Channel getDefaultChannel(String playerName);
-
- /**
- * プレイヤーのデフォルトチャンネルを設定する
- * @param playerName プレイヤー
- * @param channelName チャンネル名
- */
- public void setDefaultChannel(String playerName, String channelName);
-
- /**
- * 指定した名前のプレイヤーに設定されている、デフォルトチャンネルを削除する
- * @param playerName プレイヤー名
- */
- public void removeDefaultChannel(String playerName);
-
- /**
- * チャンネルを取得する
- * @param channelName チャンネル名
- * @return チャンネル
- */
- public Channel getChannel(String channelName);
-
- /**
- * 新しいチャンネルを作成する
- * @param channelName チャンネル名
- * @return 作成されたチャンネル
- */
- public Channel createChannel(String channelName);
-
- /**
- * 新しいチャンネルを作成する
- * @param channelName チャンネル名
- * @param sender チャンネルを作成した人
- * @return 作成されたチャンネル
- */
- public Channel createChannel(String channelName, CommandSender sender);
-
- /**
- * チャンネルを削除する
- * @param channelName 削除するチャンネル名
- * @return 削除したかどうか
- */
- public boolean removeChannel(String channelName);
-
- /**
- * チャンネルを削除する
- * @param channelName 削除するチャンネル名
- * @param sender チャンネルを削除した人
- * @return 削除したかどうか
- */
- public boolean removeChannel(String channelName, CommandSender sender);
-
- /**
- * テンプレートを取得する
- * @param id テンプレートID
- * @return テンプレート
- */
- public String getTemplate(String id);
-
- /**
- * テンプレートを登録する
- * @param id テンプレートID
- * @param template テンプレート
- */
- public void setTemplate(String id, String template);
-
- /**
- * テンプレートを削除する
- * @param id テンプレートID
- */
- public void removeTemplate(String id);
-
- /**
- * 辞書データを全て取得する
- * @return 辞書データ
- */
- public HashMap getAllDictionary();
-
- /**
- * 新しい辞書データを追加する
- * @param key キー
- * @param value 値
- */
- public void setDictionary(String key, String value);
-
- /**
- * 指定したキーの辞書データを削除する
- * @param key キー
- */
- public void removeDictionary(String key);
-
- /**
- * 該当のプレイヤーに関連するhidelistを取得する。
- * @param key プレイヤー
- * @return 指定されたプレイヤーをhideしているプレイヤー(非null)
- */
- public List getHidelist(ChannelPlayer key);
-
- /**
- * 該当のプレイヤーがhideしているプレイヤーのリストを返す。
- * @param player プレイヤー
- * @return 指定したプレイヤーがhideしているプレイヤーのリスト
- */
- public ArrayList getHideinfo(ChannelPlayer player);
-
- /**
- * 指定されたプレイヤーが、指定されたプレイヤーをhideするように設定する。
- * @param player hideする側のプレイヤー
- * @param hided hideされる側のプレイヤー
- */
- public void addHidelist(ChannelPlayer player, ChannelPlayer hided);
-
- /**
- * 指定されたプレイヤーが、指定されたプレイヤーのhideを解除するように設定する。
- * @param player hideしていた側のプレイヤー
- * @param hided hideされていた側のプレイヤー
- */
- public void removeHidelist(ChannelPlayer player, ChannelPlayer hided);
-
- /**
- * Japanize変換を行う
- * @param message 変換するメッセージ
- * @param type 変換タイプ
- * @return 変換後のメッセージ、ただしイベントでキャンセルされた場合はnullが返されるので注意
- */
- public String japanize(String message, JapanizeType type);
-
- /**
- * 該当プレイヤーのJapanize変換をオン/オフする
- * @param playerName 設定するプレイヤー名
- * @param doJapanize Japanize変換するかどうか
- */
- public void setPlayersJapanize(String playerName, boolean doJapanize);
-
- /**
- * プレイヤーのJapanize設定を返す
- * @param playerName プレイヤー名
- * @return Japanize設定
- */
- public boolean isPlayerJapanize(String playerName);
-
- /**
- * LunaChatの全データを再読み込みする
- */
- public void reloadAllData();
-}
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+
+import org.bukkit.command.CommandSender;
+
+import com.github.ucchyocean.lc.channel.Channel;
+import com.github.ucchyocean.lc.channel.ChannelPlayer;
+import com.github.ucchyocean.lc.japanize.JapanizeType;
+
+/**
+ * LunaChat APIクラス
+ * @author ucchy
+ * @deprecated Legacy Version
+ */
+public interface LunaChatAPI {
+
+ /**
+ * 指定したチャンネル名が存在するかどうかを返す
+ * @param channelName チャンネル名
+ * @return 存在するかどうか
+ * @deprecated Legacy Version
+ */
+ public boolean isExistChannel(String channelName);
+
+ /**
+ * 全てのチャンネルを返す
+ * @return 全てのチャンネル
+ * @deprecated Legacy Version
+ */
+ public Collection getChannels();
+
+ /**
+ * プレイヤーが参加しているチャンネルを返す
+ * @param playerName プレイヤー名
+ * @return チャンネル
+ * @deprecated Legacy Version
+ */
+ public Collection getChannelsByPlayer(String playerName);
+
+ /**
+ * プレイヤーが参加しているデフォルトのチャンネルを返す
+ * @param playerName プレイヤー
+ * @return チャンネル
+ * @deprecated Legacy Version
+ */
+ public Channel getDefaultChannel(String playerName);
+
+ /**
+ * プレイヤーのデフォルトチャンネルを設定する
+ * @param playerName プレイヤー
+ * @param channelName チャンネル名
+ * @deprecated Legacy Version
+ */
+ public void setDefaultChannel(String playerName, String channelName);
+
+ /**
+ * 指定した名前のプレイヤーに設定されている、デフォルトチャンネルを削除する
+ * @param playerName プレイヤー名
+ * @deprecated Legacy Version
+ */
+ public void removeDefaultChannel(String playerName);
+
+ /**
+ * チャンネルを取得する
+ * @param channelName チャンネル名
+ * @return チャンネル
+ * @deprecated Legacy Version
+ */
+ public Channel getChannel(String channelName);
+
+ /**
+ * 新しいチャンネルを作成する
+ * @param channelName チャンネル名
+ * @return 作成されたチャンネル
+ * @deprecated Legacy Version
+ */
+ public Channel createChannel(String channelName);
+
+ /**
+ * 新しいチャンネルを作成する
+ * @param channelName チャンネル名
+ * @param sender チャンネルを作成した人
+ * @return 作成されたチャンネル
+ * @deprecated Legacy Version
+ */
+ public Channel createChannel(String channelName, CommandSender sender);
+
+ /**
+ * チャンネルを削除する
+ * @param channelName 削除するチャンネル名
+ * @return 削除したかどうか
+ * @deprecated Legacy Version
+ */
+ public boolean removeChannel(String channelName);
+
+ /**
+ * チャンネルを削除する
+ * @param channelName 削除するチャンネル名
+ * @param sender チャンネルを削除した人
+ * @return 削除したかどうか
+ * @deprecated Legacy Version
+ */
+ public boolean removeChannel(String channelName, CommandSender sender);
+
+ /**
+ * テンプレートを取得する
+ * @param id テンプレートID
+ * @return テンプレート
+ * @deprecated Legacy Version
+ */
+ public String getTemplate(String id);
+
+ /**
+ * テンプレートを登録する
+ * @param id テンプレートID
+ * @param template テンプレート
+ * @deprecated Legacy Version
+ */
+ public void setTemplate(String id, String template);
+
+ /**
+ * テンプレートを削除する
+ * @param id テンプレートID
+ * @deprecated Legacy Version
+ */
+ public void removeTemplate(String id);
+
+ /**
+ * 辞書データを全て取得する
+ * @return 辞書データ
+ * @deprecated Legacy Version
+ */
+ public HashMap getAllDictionary();
+
+ /**
+ * 新しい辞書データを追加する
+ * @param key キー
+ * @param value 値
+ * @deprecated Legacy Version
+ */
+ public void setDictionary(String key, String value);
+
+ /**
+ * 指定したキーの辞書データを削除する
+ * @param key キー
+ * @deprecated Legacy Version
+ */
+ public void removeDictionary(String key);
+
+ /**
+ * 該当のプレイヤーに関連するhidelistを取得する。
+ * @param key プレイヤー
+ * @return 指定されたプレイヤーをhideしているプレイヤー(非null)
+ * @deprecated Legacy Version
+ */
+ public List getHidelist(ChannelPlayer key);
+
+ /**
+ * 該当のプレイヤーがhideしているプレイヤーのリストを返す。
+ * @param player プレイヤー
+ * @return 指定したプレイヤーがhideしているプレイヤーのリスト
+ * @deprecated Legacy Version
+ */
+ public ArrayList getHideinfo(ChannelPlayer player);
+
+ /**
+ * 指定されたプレイヤーが、指定されたプレイヤーをhideするように設定する。
+ * @param player hideする側のプレイヤー
+ * @param hided hideされる側のプレイヤー
+ * @deprecated Legacy Version
+ */
+ public void addHidelist(ChannelPlayer player, ChannelPlayer hided);
+
+ /**
+ * 指定されたプレイヤーが、指定されたプレイヤーのhideを解除するように設定する。
+ * @param player hideしていた側のプレイヤー
+ * @param hided hideされていた側のプレイヤー
+ * @deprecated Legacy Version
+ */
+ public void removeHidelist(ChannelPlayer player, ChannelPlayer hided);
+
+ /**
+ * Japanize変換を行う
+ * @param message 変換するメッセージ
+ * @param type 変換タイプ
+ * @return 変換後のメッセージ、ただしイベントでキャンセルされた場合はnullが返されるので注意
+ * @deprecated Legacy Version
+ */
+ public String japanize(String message, JapanizeType type);
+
+ /**
+ * 該当プレイヤーのJapanize変換をオン/オフする
+ * @param playerName 設定するプレイヤー名
+ * @param doJapanize Japanize変換するかどうか
+ * @deprecated Legacy Version
+ */
+ public void setPlayersJapanize(String playerName, boolean doJapanize);
+
+ /**
+ * プレイヤーのJapanize設定を返す
+ * @param playerName プレイヤー名
+ * @return Japanize設定
+ * @deprecated Legacy Version
+ */
+ public boolean isPlayerJapanize(String playerName);
+}
diff --git a/src/main/java/com/github/ucchyocean/lc/LunaChatAPIImpl.java b/src/main/java/com/github/ucchyocean/lc/LunaChatAPIImpl.java
new file mode 100644
index 00000000..f3450205
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc/LunaChatAPIImpl.java
@@ -0,0 +1,363 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2013
+ */
+package com.github.ucchyocean.lc;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+
+import org.bukkit.Bukkit;
+import org.bukkit.command.CommandSender;
+
+import com.github.ucchyocean.lc.channel.Channel;
+import com.github.ucchyocean.lc.channel.ChannelPlayer;
+import com.github.ucchyocean.lc.channel.ChannelPlayerBlock;
+import com.github.ucchyocean.lc.channel.ChannelPlayerConsole;
+import com.github.ucchyocean.lc.channel.ChannelPlayerName;
+import com.github.ucchyocean.lc.channel.ChannelPlayerUUID;
+import com.github.ucchyocean.lc.japanize.JapanizeType;
+import com.github.ucchyocean.lc3.member.ChannelMember;
+import com.github.ucchyocean.lc3.member.ChannelMemberBlock;
+import com.github.ucchyocean.lc3.member.ChannelMemberBukkitConsole;
+import com.github.ucchyocean.lc3.member.ChannelMemberBungee;
+import com.github.ucchyocean.lc3.member.ChannelMemberPlayer;
+
+/**
+ * LunaChat API実装クラス
+ * @author ucchy
+ */
+@SuppressWarnings("deprecation")
+class LunaChatAPIImpl implements LunaChatAPI {
+
+ /**
+ * 指定したチャンネル名が存在するかどうかを返す
+ * @param channelName チャンネル名
+ * @return 存在するかどうか
+ * @deprecated Legacy Version
+ */
+ public boolean isExistChannel(String channelName) {
+ return com.github.ucchyocean.lc3.LunaChat.getAPI().isExistChannel(channelName);
+ }
+
+ /**
+ * 全てのチャンネルを返す
+ * @return 全てのチャンネル
+ * @deprecated Legacy Version
+ */
+ public Collection getChannels() {
+ Collection result = new ArrayList();
+ for ( com.github.ucchyocean.lc3.channel.Channel c :
+ com.github.ucchyocean.lc3.LunaChat.getAPI().getChannels() ) {
+ result.add(new Channel(c));
+ }
+ return result;
+ }
+
+ /**
+ * プレイヤーが参加しているチャンネルを返す
+ * @param playerName プレイヤー名
+ * @return チャンネル
+ * @deprecated Legacy Version
+ */
+ public Collection getChannelsByPlayer(String playerName) {
+ Collection result = new ArrayList();
+ for ( com.github.ucchyocean.lc3.channel.Channel c :
+ com.github.ucchyocean.lc3.LunaChat.getAPI().getChannelsByPlayer(playerName) ) {
+ result.add(new Channel(c));
+ }
+ return result;
+ }
+
+ /**
+ * プレイヤーが参加しているデフォルトのチャンネルを返す
+ * @param playerName プレイヤー
+ * @return チャンネル
+ * @deprecated Legacy Version
+ */
+ public Channel getDefaultChannel(String playerName) {
+ com.github.ucchyocean.lc3.channel.Channel c =
+ com.github.ucchyocean.lc3.LunaChat.getAPI().getDefaultChannel(playerName);
+ if ( c != null ) return new Channel(c);
+ return null;
+ }
+
+ /**
+ * プレイヤーのデフォルトチャンネルを設定する
+ * @param playerName プレイヤー
+ * @param channelName チャンネル名
+ * @deprecated Legacy Version
+ */
+ public void setDefaultChannel(String playerName, String channelName) {
+ com.github.ucchyocean.lc3.LunaChat.getAPI().setDefaultChannel(playerName, channelName);
+ }
+
+ /**
+ * 指定した名前のプレイヤーに設定されている、デフォルトチャンネルを削除する
+ * @param playerName プレイヤー名
+ * @deprecated Legacy Version
+ */
+ public void removeDefaultChannel(String playerName) {
+ com.github.ucchyocean.lc3.LunaChat.getAPI().removeDefaultChannel(playerName);
+ }
+
+ /**
+ * チャンネルを取得する
+ * @param channelName チャンネル名
+ * @return チャンネル
+ * @deprecated Legacy Version
+ */
+ public Channel getChannel(String channelName) {
+ com.github.ucchyocean.lc3.channel.Channel c =
+ com.github.ucchyocean.lc3.LunaChat.getAPI().getChannel(channelName);
+ if ( c != null ) return new Channel(c);
+ return null;
+ }
+
+ /**
+ * 新しいチャンネルを作成する
+ * @param channelName チャンネル名
+ * @return 作成されたチャンネル
+ * @deprecated Legacy Version
+ */
+ public Channel createChannel(String channelName) {
+ com.github.ucchyocean.lc3.channel.Channel c =
+ com.github.ucchyocean.lc3.LunaChat.getAPI().createChannel(channelName);
+ if ( c != null ) return new Channel(c);
+ return null;
+ }
+
+ /**
+ * 新しいチャンネルを作成する
+ * @param channelName チャンネル名
+ * @param sender チャンネルを作成した人
+ * @return 作成されたチャンネル
+ * @deprecated Legacy Version
+ */
+ public Channel createChannel(String channelName, CommandSender sender) {
+ com.github.ucchyocean.lc3.channel.Channel c =
+ com.github.ucchyocean.lc3.LunaChat.getAPI().createChannel(
+ channelName, ChannelMember.getChannelMember(sender));
+ if ( c != null ) return new Channel(c);
+ return null;
+ }
+
+ /**
+ * チャンネルを削除する
+ * @param channelName 削除するチャンネル名
+ * @return 削除したかどうか
+ * @deprecated Legacy Version
+ */
+ public boolean removeChannel(String channelName) {
+ return com.github.ucchyocean.lc3.LunaChat.getAPI().removeChannel(channelName);
+ }
+
+ /**
+ * チャンネルを削除する
+ * @param channelName 削除するチャンネル名
+ * @param sender チャンネルを削除した人
+ * @return 削除したかどうか
+ * @deprecated Legacy Version
+ */
+ public boolean removeChannel(String channelName, CommandSender sender) {
+ return com.github.ucchyocean.lc3.LunaChat.getAPI().removeChannel(
+ channelName, ChannelMember.getChannelMember(sender));
+ }
+
+ /**
+ * テンプレートを取得する
+ * @param id テンプレートID
+ * @return テンプレート
+ * @deprecated Legacy Version
+ */
+ public String getTemplate(String id) {
+ return com.github.ucchyocean.lc3.LunaChat.getAPI().getTemplate(id);
+ }
+
+ /**
+ * テンプレートを登録する
+ * @param id テンプレートID
+ * @param template テンプレート
+ * @deprecated Legacy Version
+ */
+ public void setTemplate(String id, String template) {
+ com.github.ucchyocean.lc3.LunaChat.getAPI().setTemplate(id, template);
+ }
+
+ /**
+ * テンプレートを削除する
+ * @param id テンプレートID
+ * @deprecated Legacy Version
+ */
+ public void removeTemplate(String id) {
+ com.github.ucchyocean.lc3.LunaChat.getAPI().removeTemplate(id);
+ }
+
+ /**
+ * 辞書データを全て取得する
+ * @return 辞書データ
+ * @deprecated Legacy Version
+ */
+ public HashMap getAllDictionary() {
+ return new HashMap(
+ com.github.ucchyocean.lc3.LunaChat.getAPI().getAllDictionary());
+ }
+
+ /**
+ * 新しい辞書データを追加する
+ * @param key キー
+ * @param value 値
+ * @deprecated Legacy Version
+ */
+ public void setDictionary(String key, String value) {
+ com.github.ucchyocean.lc3.LunaChat.getAPI().setDictionary(key, value);
+ }
+
+ /**
+ * 指定したキーの辞書データを削除する
+ * @param key キー
+ * @deprecated Legacy Version
+ */
+ public void removeDictionary(String key) {
+ com.github.ucchyocean.lc3.LunaChat.getAPI().removeDictionary(key);
+ }
+
+ /**
+ * 該当のプレイヤーに関連するhidelistを取得する。
+ * @param key プレイヤー
+ * @return 指定されたプレイヤーをhideしているプレイヤー(非null)
+ * @deprecated Legacy Version
+ */
+ public List getHidelist(ChannelPlayer key) {
+ List result = new ArrayList();
+ ChannelMember mem = convertChannelPlayerToChannelMember(key);
+ if ( mem == null ) return result;
+ for ( ChannelMember m : com.github.ucchyocean.lc3.LunaChat.getAPI().getHidelist(mem) ) {
+ ChannelPlayer p = convertChannelMemberToChannelPlayer(m);
+ if ( p != null ) result.add(p);
+ }
+ return result;
+ }
+
+ /**
+ * 該当のプレイヤーがhideしているプレイヤーのリストを返す。
+ * @param player プレイヤー
+ * @return 指定したプレイヤーがhideしているプレイヤーのリスト
+ * @deprecated Legacy Version
+ */
+ public ArrayList getHideinfo(ChannelPlayer player) {
+ ArrayList result = new ArrayList();
+ ChannelMember mem = convertChannelPlayerToChannelMember(player);
+ if ( mem == null ) return result;
+ for ( ChannelMember m : com.github.ucchyocean.lc3.LunaChat.getAPI().getHideinfo(mem) ) {
+ ChannelPlayer p = convertChannelMemberToChannelPlayer(m);
+ if ( p != null ) result.add(p);
+ }
+ return result;
+ }
+
+ /**
+ * 指定されたプレイヤーが、指定されたプレイヤーをhideするように設定する。
+ * @param player hideする側のプレイヤー
+ * @param hided hideされる側のプレイヤー
+ * @deprecated Legacy Version
+ */
+ public void addHidelist(ChannelPlayer player, ChannelPlayer hided) {
+ ChannelMember memPlayer = convertChannelPlayerToChannelMember(player);
+ ChannelMember memHided = convertChannelPlayerToChannelMember(hided);
+ if ( memPlayer == null || memHided == null ) return;
+ com.github.ucchyocean.lc3.LunaChat.getAPI().addHidelist(memPlayer, memHided);
+ }
+
+ /**
+ * 指定されたプレイヤーが、指定されたプレイヤーのhideを解除するように設定する。
+ * @param player hideしていた側のプレイヤー
+ * @param hided hideされていた側のプレイヤー
+ * @deprecated Legacy Version
+ */
+ public void removeHidelist(ChannelPlayer player, ChannelPlayer hided) {
+ ChannelMember memPlayer = convertChannelPlayerToChannelMember(player);
+ ChannelMember memHided = convertChannelPlayerToChannelMember(hided);
+ if ( memPlayer == null || memHided == null ) return;
+ com.github.ucchyocean.lc3.LunaChat.getAPI().removeHidelist(memPlayer, memHided);
+ }
+
+ /**
+ * Japanize変換を行う
+ * @param message 変換するメッセージ
+ * @param type 変換タイプ
+ * @return 変換後のメッセージ、ただしイベントでキャンセルされた場合はnullが返されるので注意
+ * @deprecated Legacy Version
+ */
+ public String japanize(String message, JapanizeType type) {
+ String value = (type != null) ? type.name() : "";
+ com.github.ucchyocean.lc3.japanize.JapanizeType t =
+ com.github.ucchyocean.lc3.japanize.JapanizeType.fromID(value,
+ com.github.ucchyocean.lc3.japanize.JapanizeType.GOOGLE_IME);
+ return com.github.ucchyocean.lc3.LunaChat.getAPI().japanize(message, t);
+ }
+
+ /**
+ * 該当プレイヤーのJapanize変換をオン/オフする
+ * @param playerName 設定するプレイヤー名
+ * @param doJapanize Japanize変換するかどうか
+ * @deprecated Legacy Version
+ */
+ public void setPlayersJapanize(String playerName, boolean doJapanize) {
+ com.github.ucchyocean.lc3.LunaChat.getAPI().setPlayersJapanize(playerName, doJapanize);
+ }
+
+ /**
+ * プレイヤーのJapanize設定を返す
+ * @param playerName プレイヤー名
+ * @return Japanize設定
+ * @deprecated Legacy Version
+ */
+ public boolean isPlayerJapanize(String playerName) {
+ return com.github.ucchyocean.lc3.LunaChat.getAPI().isPlayerJapanize(playerName);
+ }
+
+ /**
+ * ChannelPlayerをChannelMemberに変換する
+ * @param cp
+ * @return
+ */
+ private ChannelMember convertChannelPlayerToChannelMember(ChannelPlayer cp) {
+ if ( cp == null ) return null;
+ if ( cp instanceof ChannelPlayerName || cp instanceof ChannelPlayerUUID ) {
+ return ChannelMember.getChannelMember(cp.toString());
+ } else if ( cp instanceof ChannelPlayerConsole ) {
+ return new ChannelMemberBukkitConsole(Bukkit.getConsoleSender());
+ } else if ( cp instanceof ChannelPlayerBlock ) {
+ ChannelPlayerBlock cpb = (ChannelPlayerBlock)cp;
+ if ( cpb.getBlockCommandSender() != null ) {
+ return new ChannelMemberBlock(cpb.getBlockCommandSender());
+ }
+ }
+ return null;
+ }
+
+ /**
+ * ChannelMemberをChannelPlayerに変換する
+ * @param cp
+ * @return
+ */
+ private ChannelPlayer convertChannelMemberToChannelPlayer(ChannelMember cm) {
+ if ( cm == null ) return null;
+ if ( cm instanceof ChannelMemberBungee ) return null; // Bungeeモードの場合は変換できない
+ if ( cm instanceof ChannelMemberPlayer ) {
+ return ChannelPlayer.getChannelPlayer(cm.toString());
+ } else if ( cm instanceof ChannelMemberBukkitConsole ) {
+ return new ChannelPlayerConsole(Bukkit.getConsoleSender());
+ } else if ( cm instanceof ChannelMemberBlock ) {
+ ChannelMemberBlock cmb = (ChannelMemberBlock)cm;
+ if ( cmb.getBlockCommandSender() != null ) {
+ return new ChannelPlayerBlock(cmb.getBlockCommandSender());
+ }
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/com/github/ucchyocean/lc/Resources.java b/src/main/java/com/github/ucchyocean/lc/Resources.java
deleted file mode 100644
index cc9dd607..00000000
--- a/src/main/java/com/github/ucchyocean/lc/Resources.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * @author ucchy
- * @license LGPLv3
- * @copyright Copyright ucchy 2013
- */
-package com.github.ucchyocean.lc;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.jar.JarFile;
-import java.util.zip.ZipEntry;
-
-import org.bukkit.configuration.file.YamlConfiguration;
-
-/**
- * プラグインのリソース管理クラス
- * @author ucchy
- */
-public class Resources {
-
- private static final String FILE_NAME = "messages.yml";
-
- private static YamlConfiguration defaultMessages;
- private static YamlConfiguration resources;
-
- /**
- * 初期化する
- */
- protected static void initialize() {
-
- File file = new File(
- LunaChat.getInstance().getDataFolder() +
- File.separator + FILE_NAME);
-
- if ( !file.exists() ) {
- Utility.copyFileFromJar(LunaChat.getPluginJarFile(),
- file, FILE_NAME, false);
- }
-
- defaultMessages = loadDefaultMessages();
- resources = YamlConfiguration.loadConfiguration(file);
- }
-
- /**
- * リソースを取得する
- * @param key リソースキー
- * @return リソース
- */
- public static String get(String key) {
-
- if ( resources == null ) {
- initialize();
- }
- String def = defaultMessages.getString(key);
- return Utility.replaceColorCode(resources.getString(key, def));
- }
-
- /**
- * Jarファイル内から直接 messages.yml を読み込み、YamlConfigurationにして返すメソッド
- * @return
- */
- private static YamlConfiguration loadDefaultMessages() {
-
- YamlConfiguration messages = new YamlConfiguration();
- JarFile jarFile = null;
- BufferedReader reader = null;
- try {
- jarFile = new JarFile(LunaChat.getPluginJarFile());
- ZipEntry zipEntry = jarFile.getEntry(FILE_NAME);
- InputStream inputStream = jarFile.getInputStream(zipEntry);
- reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
- String line;
- while ( (line = reader.readLine()) != null ) {
- if ( line.contains(":") && !line.startsWith("#") ) {
- String key = line.substring(0, line.indexOf(":")).trim();
- String value = line.substring(line.indexOf(":") + 1).trim();
- if ( value.startsWith("'") && value.endsWith("'") )
- value = value.substring(1, value.length()-1);
- messages.set(key, value);
- }
- }
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- if ( reader != null ) {
- try {
- reader.close();
- } catch (IOException e) {
- // do nothing.
- }
- }
- if ( jarFile != null ) {
- try {
- jarFile.close();
- } catch (IOException e) {
- // do nothing.
- }
- }
- }
-
- return messages;
- }
-}
diff --git a/src/main/java/com/github/ucchyocean/lc/Utility.java b/src/main/java/com/github/ucchyocean/lc/Utility.java
deleted file mode 100644
index 8c134032..00000000
--- a/src/main/java/com/github/ucchyocean/lc/Utility.java
+++ /dev/null
@@ -1,350 +0,0 @@
-/*
- * @author ucchy
- * @license LGPLv3
- * @copyright Copyright ucchy 2013
- */
-package com.github.ucchyocean.lc;
-
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStreamWriter;
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.jar.JarFile;
-import java.util.zip.ZipEntry;
-
-import org.bukkit.Bukkit;
-import org.bukkit.ChatColor;
-import org.bukkit.OfflinePlayer;
-import org.bukkit.entity.Player;
-
-/**
- * ユーティリティクラス
- * @author ucchy
- */
-public class Utility {
-
- private static Boolean isCB178orLaterCache;
- private static Boolean isCB19orLaterCache;
-
- /**
- * jarファイルの中に格納されているファイルを、jarファイルの外にコピーするメソッド
- * @param jarFile jarファイル
- * @param targetFile コピー先
- * @param sourceFilePath コピー元
- * @param isBinary バイナリファイルかどうか
- */
- public static void copyFileFromJar(
- File jarFile, File targetFile, String sourceFilePath, boolean isBinary) {
-
- JarFile jar = null;
- InputStream is = null;
- FileOutputStream fos = null;
- BufferedReader reader = null;
- BufferedWriter writer = null;
-
- File parent = targetFile.getParentFile();
- if (!parent.exists()) {
- parent.mkdirs();
- }
-
- try {
- jar = new JarFile(jarFile);
- ZipEntry zipEntry = jar.getEntry(sourceFilePath);
- is = jar.getInputStream(zipEntry);
-
- fos = new FileOutputStream(targetFile);
-
- if (isBinary) {
- byte[] buf = new byte[8192];
- int len;
- while ((len = is.read(buf)) != -1) {
- fos.write(buf, 0, len);
- }
-
- } else {
- reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
-
- // CB190以降は、書き出すファイルエンコードにUTF-8を強制する。see issue #141.
- if ( isCB19orLater() ) {
- writer = new BufferedWriter(new OutputStreamWriter(fos, "UTF-8"));
- } else {
- writer = new BufferedWriter(new OutputStreamWriter(fos));
- }
-
- String line;
- while ((line = reader.readLine()) != null) {
- writer.write(line);
- writer.newLine();
- }
-
- }
-
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- if (jar != null) {
- try {
- jar.close();
- } catch (IOException e) {
- // do nothing.
- }
- }
- if (writer != null) {
- try {
- writer.flush();
- writer.close();
- } catch (IOException e) {
- // do nothing.
- }
- }
- if (reader != null) {
- try {
- reader.close();
- } catch (IOException e) {
- // do nothing.
- }
- }
- if (fos != null) {
- try {
- fos.flush();
- fos.close();
- } catch (IOException e) {
- // do nothing.
- }
- }
- if (is != null) {
- try {
- is.close();
- } catch (IOException e) {
- // do nothing.
- }
- }
- }
- }
-
- /**
- * 文字列内のカラーコード候補(&a)を、カラーコード(§a)に置き換えする
- * @param source 置き換え元の文字列
- * @return 置き換え後の文字列
- */
- public static String replaceColorCode(String source) {
- if (source == null)
- return null;
- return ChatColor.translateAlternateColorCodes('&', source);
- }
-
- /**
- * 文字列に含まれているカラーコード(§a)を除去して返す
- * @param source 置き換え元の文字列
- * @return 置き換え後の文字列
- */
- public static String stripColor(String source) {
- if (source == null)
- return null;
- return ChatColor.stripColor(source);
- }
-
- /**
- * 指定された文字数のアスタリスクの文字列を返す
- * @param length アスタリスクの個数
- * @return 指定された文字数のアスタリスク
- */
- public static String getAstariskString(int length) {
- StringBuilder buf = new StringBuilder();
- for (int i = 0; i < length; i++) {
- buf.append("*");
- }
- return buf.toString();
- }
-
- /**
- * カラー表記の文字列を、ChatColorクラスに変換する
- * @param color カラー表記の文字列
- * @return ChatColorクラス
- */
- public static ChatColor changeToChatColor(String color) {
-
- if (isValidColor(color)) {
- return ChatColor.valueOf(color.toUpperCase());
- }
- return ChatColor.WHITE;
- }
-
- /**
- * カラー表記の文字列を、カラーコードに変換する
- * @param color カラー表記の文字列
- * @return カラーコード
- */
- public static String changeToColorCode(String color) {
-
- return "&" + changeToChatColor(color).getChar();
- }
-
- /**
- * ChatColorで指定可能な色かどうかを判断する
- * @param color カラー表記の文字列
- * @return 指定可能かどうか
- */
- public static boolean isValidColor(String color) {
-
- for (ChatColor c : ChatColor.values()) {
- if (c.name().equals(color.toUpperCase())) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * カラーコードかどうかを判断する
- * @param color カラー表記の文字列
- * @return 指定可能かどうか
- */
- public static boolean isValidColorCode(String code) {
-
- if (code == null) {
- return false;
- }
- return code.matches("&[0-9a-f]");
- }
-
- /**
- * 現在動作中のCraftBukkitが、v1.7.8 以上かどうかを確認する
- * @return v1.7.8以上ならtrue、そうでないならfalse
- */
- public static boolean isCB178orLater() {
- if ( isCB178orLaterCache == null ) {
- isCB178orLaterCache = isUpperVersion(Bukkit.getBukkitVersion(), "1.7.8");
- }
- return isCB178orLaterCache;
- }
-
- /**
- * 現在動作中のCraftBukkitが、v1.9 以上かどうかを確認する
- * @return v1.9以上ならtrue、そうでないならfalse
- */
- public static boolean isCB19orLater() {
- if ( isCB19orLaterCache == null ) {
- isCB19orLaterCache = isUpperVersion(Bukkit.getBukkitVersion(), "1.9");
- }
- return isCB19orLaterCache;
- }
-
- /**
- * 指定されたバージョンが、基準より新しいバージョンかどうかを確認する
- * @param version 確認するバージョン
- * @param border 基準のバージョン
- * @return 基準より確認対象の方が新しいバージョンかどうか
- * ただし、無効なバージョン番号(数値でないなど)が指定された場合はfalseに、
- * 2つのバージョンが完全一致した場合はtrueになる。
- */
- public static boolean isUpperVersion(String version, String border) {
-
- int hyphen = version.indexOf("-");
- if ( hyphen > 0 ) {
- version = version.substring(0, hyphen);
- }
-
- String[] versionArray = version.split("\\.");
- int[] versionNumbers = new int[versionArray.length];
- for ( int i=0; i index) && (borderNumbers.length > index) ) {
- if ( versionNumbers[index] > borderNumbers[index] ) {
- return true;
- } else if ( versionNumbers[index] < borderNumbers[index] ) {
- return false;
- }
- index++;
- }
- if ( borderNumbers.length == index ) {
- return true;
- } else {
- return false;
- }
- }
-
- /**
- * 現在接続中のプレイヤーを全て取得する
- * @return 接続中の全てのプレイヤー
- */
- @SuppressWarnings("unchecked")
- public static ArrayList getOnlinePlayers() {
- // CB179以前と、CB1710以降で戻り値が異なるため、
- // リフレクションを使って互換性を(無理やり)保つ。
- try {
- if (Bukkit.class.getMethod("getOnlinePlayers", new Class>[0]).getReturnType() == Collection.class) {
- Collection> temp =
- ((Collection>) Bukkit.class.getMethod("getOnlinePlayers", new Class>[0])
- .invoke(null, new Object[0]));
- return new ArrayList((Collection extends Player>) temp);
- } else {
- Player[] temp =
- ((Player[]) Bukkit.class.getMethod("getOnlinePlayers", new Class>[0])
- .invoke(null, new Object[0]));
- ArrayList players = new ArrayList();
- for (Player t : temp) {
- players.add(t);
- }
- return players;
- }
- } catch (NoSuchMethodException ex) {} // never happen
- catch (InvocationTargetException ex) {} // never happen
- catch (IllegalAccessException ex) {} // never happen
- return new ArrayList();
- }
-
- /**
- * 現在のサーバー接続人数を返します。
- * @return サーバー接続人数
- */
- public static int getOnlinePlayersCount() {
- return getOnlinePlayers().size();
- }
-
- /**
- * 指定された名前のオフラインプレイヤーを取得する
- * @param name プレイヤー名
- * @return オフラインプレイヤー
- */
- @SuppressWarnings("deprecation")
- public static OfflinePlayer getOfflinePlayer(String name) {
- if (name == null) return null;
- OfflinePlayer player = Bukkit.getOfflinePlayer(name);
- if (player == null || (!player.hasPlayedBefore() && !player.isOnline()))
- return null;
- return player;
- }
-
- /**
- * 指定された名前のプレイヤーを取得する
- * @param name プレイヤー名
- * @return プレイヤー
- */
- public static Player getPlayerExact(String name) {
- return Bukkit.getPlayer(stripColor(name));
- }
-}
diff --git a/src/main/java/com/github/ucchyocean/lc/bridge/HawkEyeBridge.java b/src/main/java/com/github/ucchyocean/lc/bridge/HawkEyeBridge.java
deleted file mode 100644
index 83f57434..00000000
--- a/src/main/java/com/github/ucchyocean/lc/bridge/HawkEyeBridge.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * @author ucchy
- * @license LGPLv3
- * @copyright Copyright ucchy 2015
- */
-package com.github.ucchyocean.lc.bridge;
-
-import org.bukkit.Location;
-import org.bukkit.plugin.Plugin;
-import org.bukkit.scheduler.BukkitRunnable;
-
-import com.github.ucchyocean.lc.LunaChat;
-import com.github.ucchyocean.lc.Utility;
-
-import uk.co.oliwali.HawkEye.DataType;
-import uk.co.oliwali.HawkEye.entry.DataEntry;
-import uk.co.oliwali.HawkEye.util.HawkEyeAPI;
-
-/**
- * HawkEye連携クラス
- * @author ucchy
- */
-public class HawkEyeBridge {
-
- private boolean isV162orLater;
-
- /** コンストラクタは使用不可 */
- private HawkEyeBridge() {
- }
-
- /**
- * HawkEye Reloaded をロードする
- * @param plugin HawkEye Reloaded のプラグインインスタンス
- * @return ロードしたブリッジのインスタンス
- */
- public static HawkEyeBridge load(Plugin plugin) {
-
- String version = plugin.getDescription().getVersion();
- HawkEyeBridge instance = new HawkEyeBridge();
- instance.isV162orLater = Utility.isUpperVersion(version, "1.6.2");
- return instance;
- }
-
- /**
- * HawkEyeにCHATログを書き出す
- * @param player プレイヤー名
- * @param location 場所
- * @param data データ
- */
- @SuppressWarnings("deprecation")
- public void writeLog(String player, Location location, String data) {
- final DataEntry entry = new DataEntry(player, DataType.CHAT, location, data);
- new BukkitRunnable() {
- public void run() {
- if ( isV162orLater ) {
- HawkEyeAPI.addEntry(entry);
- } else {
- HawkEyeAPI.addEntry(LunaChat.getInstance(), entry);
- }
- }
- }.runTaskAsynchronously(LunaChat.getInstance());
- }
-}
diff --git a/src/main/java/com/github/ucchyocean/lc/bridge/PrismBridge.java b/src/main/java/com/github/ucchyocean/lc/bridge/PrismBridge.java
deleted file mode 100644
index ec658407..00000000
--- a/src/main/java/com/github/ucchyocean/lc/bridge/PrismBridge.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * @author ucchy
- * @license LGPLv3
- * @copyright Copyright ucchy 2016
- */
-package com.github.ucchyocean.lc.bridge;
-
-import org.bukkit.entity.Player;
-import org.bukkit.scheduler.BukkitRunnable;
-
-import com.github.ucchyocean.lc.LunaChat;
-
-import me.botsko.prism.Prism;
-import me.botsko.prism.actionlibs.ActionFactory;
-import me.botsko.prism.actionlibs.RecordingQueue;
-
-/**
- * Prism連携クラス
- * @author ucchy
- */
-public class PrismBridge {
-
- /** コンストラクタは使用不可 */
- private PrismBridge() {
- }
-
- /**
- * Prism をロードする
- * @return ロードしたブリッジのインスタンス
- */
- public static PrismBridge load() {
- return new PrismBridge();
- }
-
- /**
- * PrismにCHATログを書き出す
- * @param player プレイヤー
- * @param data データ
- */
- public void writeLog(final Player player, final String data) {
- if ( !Prism.getIgnore().event( "player-chat", player ) ) {
- return;
- }
- new BukkitRunnable() {
- public void run() {
- RecordingQueue.addToQueue( ActionFactory.createPlayer(
- "player-chat", player, data ) );
- }
- }.runTaskAsynchronously(LunaChat.getInstance());
- }
-}
diff --git a/src/main/java/com/github/ucchyocean/lc/channel/Channel.java b/src/main/java/com/github/ucchyocean/lc/channel/Channel.java
index aa92a12d..e7cd32d7 100644
--- a/src/main/java/com/github/ucchyocean/lc/channel/Channel.java
+++ b/src/main/java/com/github/ucchyocean/lc/channel/Channel.java
@@ -5,9 +5,6 @@
*/
package com.github.ucchyocean.lc.channel;
-import java.io.File;
-import java.io.FilenameFilter;
-import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -15,348 +12,152 @@
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
-import org.bukkit.configuration.file.YamlConfiguration;
-import org.bukkit.configuration.serialization.ConfigurationSerializable;
-import org.bukkit.configuration.serialization.SerializableAs;
-import org.bukkit.entity.Player;
-
-import com.github.ucchyocean.lc.LunaChat;
-import com.github.ucchyocean.lc.LunaChatAPI;
-import com.github.ucchyocean.lc.LunaChatConfig;
-import com.github.ucchyocean.lc.Utility;
-import com.github.ucchyocean.lc.event.LunaChatChannelMemberChangedEvent;
+
import com.github.ucchyocean.lc.japanize.JapanizeType;
+import com.github.ucchyocean.lc3.member.ChannelMember;
+import com.github.ucchyocean.lc3.member.ChannelMemberBlock;
+import com.github.ucchyocean.lc3.member.ChannelMemberBukkitConsole;
+import com.github.ucchyocean.lc3.member.ChannelMemberBungee;
+import com.github.ucchyocean.lc3.member.ChannelMemberPlayer;
/**
* チャンネル
* @author ucchy
+ * @deprecated Legacy Version
*/
-@SerializableAs("Channel")
-public abstract class Channel implements ConfigurationSerializable {
-
- private static final String FOLDER_NAME_CHANNELS = "channels";
-
- private static final String KEY_NAME = "name";
- private static final String KEY_ALIAS = "alias";
- private static final String KEY_DESC = "desc";
- private static final String KEY_FORMAT = "format";
- private static final String KEY_MEMBERS = "members";
- private static final String KEY_BANNED = "banned";
- private static final String KEY_MUTED = "muted";
- private static final String KEY_HIDED = "hided";
- private static final String KEY_MODERATOR = "moderator";
- private static final String KEY_PASSWORD = "password";
- private static final String KEY_VISIBLE = "visible";
- private static final String KEY_COLOR = "color";
- private static final String KEY_BROADCAST = "broadcast";
- private static final String KEY_WORLD = "world";
- private static final String KEY_RANGE = "range";
- private static final String KEY_BAN_EXPIRES = "ban_expires";
- private static final String KEY_MUTE_EXPIRES = "mute_expires";
- private static final String KEY_ALLOWCC = "allowcc";
- private static final String KEY_JAPANIZE = "japanize";
-
- /** 参加者 */
- private List members;
-
- /** チャンネルモデレータ */
- private List moderator;
-
- /** BANされたプレイヤー */
- private List banned;
-
- /** Muteされたプレイヤー */
- private List muted;
-
- /** Hideしているプレイヤー */
- private List hided;
-
- /** チャンネルの名称 */
- private String name;
-
- /** チャンネルの別名 */
- private String alias;
-
- /** チャンネルの説明文 */
- private String description;
-
- /** チャンネルのパスワード */
- private String password;
-
- /** チャンネルリストに表示されるかどうか */
- private boolean visible;
-
- /** チャンネルのカラー */
- private String colorCode;
-
- /** メッセージフォーマット
- * 指定可能なキーワードは下記のとおり
- * %ch - チャンネル名
- * %username - ユーザー名
- * %msg - メッセージ
- * %prefix - PermissionsExに設定するprefix
- * %suffix - PermissionsExに設定するsuffix
- * %color - チャンネルのカラーコード
- * */
- private String format;
-
- /** ブロードキャストチャンネルかどうか */
- private boolean broadcastChannel;
-
- /** ワールドチャットかどうか */
- private boolean isWorldRange;
-
- /** チャットの可聴範囲 0は無制限 */
- private int chatRange;
-
- /** 期限付きBANの期限(key=プレイヤー名、value=期日(ミリ秒)) */
- private Map banExpires;
-
- /** 期限付きMuteの期限(key=プレイヤー名、value=期日(ミリ秒)) */
- private Map muteExpires;
+public class Channel {
- /** 1:1チャットの相手名 */
- private String privateMessageTo;
-
- /** カラーコードの使用可否 */
- private boolean allowcc;
-
- /** チャンネルごとのjapanize変換設定 */
- private JapanizeType japanizeType;
+ private com.github.ucchyocean.lc3.channel.Channel channel;
/**
* コンストラクタ
- * @param name チャンネルの名称
- */
- protected Channel(String name) {
-
- this.name = name;
- this.alias = "";
- this.description = "";
- this.members = new ArrayList();
- this.banned = new ArrayList();
- this.muted = new ArrayList();
- this.hided = new ArrayList();
- this.moderator = new ArrayList();
- this.password = "";
- this.visible = true;
- this.colorCode = "";
- this.broadcastChannel = false;
- this.isWorldRange = false;
- this.chatRange = 0;
- this.banExpires = new HashMap();
- this.muteExpires = new HashMap();
- this.privateMessageTo = "";
- this.allowcc = true;
- this.japanizeType = null;
-
- LunaChatConfig config = LunaChat.getInstance().getLunaChatConfig();
- if ( isPersonalChat() ) {
- this.format = config.getDefaultFormatForPrivateMessage();
- } else {
- this.format = config.getDefaultFormat();
- }
+ * @param channel 新バージョンのチャンネル
+ */
+ public Channel(com.github.ucchyocean.lc3.channel.Channel channel) {
+ this.channel = channel;
}
/**
* 1:1チャットかどうか
* @return 1:1チャットかどうか
+ * @deprecated Legacy Version
*/
public boolean isPersonalChat() {
- return name.contains(">");
+ return channel.isPersonalChat();
}
/**
* ブロードキャストチャンネルかどうか
* @return ブロードキャストチャンネルかどうか
+ * @deprecated Legacy Version
*/
public boolean isBroadcastChannel() {
- return (isGlobalChannel() || broadcastChannel);
+ return channel.isBroadcastChannel();
}
/**
* グローバルチャンネルかどうか
* @return グローバルチャンネルかどうか
+ * @deprecated Legacy Version
*/
public boolean isGlobalChannel() {
- LunaChatConfig config = LunaChat.getInstance().getLunaChatConfig();
- return getName().equals(config.getGlobalChannel());
+ return channel.isGlobalChannel();
}
/**
* 強制参加チャンネルかどうか
* @return 強制参加チャンネルかどうか
+ * @deprecated Legacy Version
*/
public boolean isForceJoinChannel() {
- LunaChatConfig config = LunaChat.getInstance().getLunaChatConfig();
- return config.getForceJoinChannels().contains(getName());
+ return channel.isForceJoinChannel();
}
/**
* このチャンネルのモデレータ権限を持っているかどうかを確認する
* @param sender 権限を確認する対象
* @return チャンネルのモデレータ権限を持っているかどうか
+ * @deprecated Legacy Version
*/
public boolean hasModeratorPermission(CommandSender sender) {
- if (sender.isOp() ||
- sender.hasPermission("lunachat-admin.mod-all-channels")) {
- return true;
- }
- ChannelPlayer player = ChannelPlayer.getChannelPlayer(sender);
- return moderator.contains(player);
+ return channel.hasModeratorPermission(ChannelMember.getChannelMember(sender));
}
/**
* このチャットに発言をする
* @param player 発言をするプレイヤー
* @param message 発言をするメッセージ
+ * @deprecated Legacy Version
*/
- public abstract void chat(ChannelPlayer player, String message);
+ public void chat(ChannelPlayer player, String message) {
+ // TODO player.getPlayer()で問題ないか、要確認
+ channel.chat(ChannelMember.getChannelMember(player.getPlayer()), message);
+ }
/**
* ほかの連携先などから、このチャットに発言する
* @param player プレイヤー名
* @param source 連携元を判別する文字列
* @param message メッセージ
+ * @deprecated Legacy Version
*/
- public abstract void chatFromOtherSource(String player, String source, String message);
+ public void chatFromOtherSource(String player, String source, String message) {
+ channel.chatFromOtherSource(player, source, message);
+ }
/**
* メンバーを追加する
* @param name 追加するプレイヤー
+ * @deprecated Legacy Version
*/
public void addMember(ChannelPlayer player) {
-
- // 既に参加しているなら、何もしない
- if ( members.contains(player) ) {
- return;
- }
-
- // 変更後のメンバーリストを作成
- ArrayList after = new ArrayList(members);
- after.add(player);
-
- // イベントコール
- LunaChatChannelMemberChangedEvent event =
- new LunaChatChannelMemberChangedEvent(this.name, this.members, after);
- Bukkit.getPluginManager().callEvent(event);
- if ( event.isCancelled() ) {
- return;
+ if ( player != null ) {
+ channel.addMember(ChannelMember.getChannelMember(player.toString()));
}
-
- // メンバー更新
- if ( members.size() == 0 && moderator.size() == 0 ) {
- moderator.add(player);
- }
- members = after;
-
- sendSystemMessage("joinMessage", player);
-
- save();
}
/**
* メンバーを削除する
* @param name 削除するプレイヤー
+ * @deprecated Legacy Version
*/
public void removeMember(ChannelPlayer player) {
-
- // 既に削除しているなら、何もしない
- if ( !members.contains(player) ) {
- return;
- }
-
- // 変更後のメンバーリストを作成
- ArrayList after = new ArrayList(members);
- after.remove(player);
-
- // イベントコール
- LunaChatChannelMemberChangedEvent event =
- new LunaChatChannelMemberChangedEvent(this.name, this.members, after);
- Bukkit.getPluginManager().callEvent(event);
- if ( event.isCancelled() ) {
- return;
+ if ( player != null ) {
+ channel.removeMember(ChannelMember.getChannelMember(player.toString()));
}
-
- // デフォルト発言先が退出するチャンネルと一致する場合、
- // デフォルト発言先を削除する
- LunaChatAPI api = LunaChat.getInstance().getLunaChatAPI();
- Channel def = api.getDefaultChannel(player.getName());
- if ( def != null && def.getName().equals(getName()) ) {
- api.removeDefaultChannel(player.getName());
- }
-
- // 実際にメンバーから削除する
- members.remove(player);
-
- sendSystemMessage("quitMessage", player);
-
- // 0人で削除する設定がオンで、0人になったなら、チャンネルを削除する
- LunaChatConfig config = LunaChat.getInstance().getLunaChatConfig();
- if ( config.isZeroMemberRemove() && members.size() <= 0 ) {
- api.removeChannel(this.name);
- return;
- }
-
- // 非表示設定プレイヤーだったら、リストから削除する
- if ( hided.contains(player) ) {
- hided.remove(player);
- }
-
- // モデレーターだった場合は、モデレーターから除去する
- if ( moderator.contains(player) ) {
- moderator.remove(player);
- }
-
- save();
}
/**
* モデレータを追加する
* @param player 追加するプレイヤー
+ * @deprecated Legacy Version
*/
public void addModerator(ChannelPlayer player) {
-
- // 既にモデレータなら何もしない
- if ( moderator.contains(player) ) {
- return;
+ if ( player != null ) {
+ channel.addModerator(ChannelMember.getChannelMember(player.toString()));
}
-
- // モデレータへ追加
- moderator.add(player);
-
- // メッセージ
- sendSystemMessage("addModeratorMessage", player);
-
- save();
}
/**
* モデレータを削除する
* @param player 削除するプレイヤー
+ * @deprecated Legacy Version
*/
public void removeModerator(ChannelPlayer player) {
-
- // 既にモデレータでないなら何もしない
- if ( !moderator.contains(player) ) {
- return;
+ if ( player != null ) {
+ channel.removeModerator(ChannelMember.getChannelMember(player.toString()));
}
-
- // モデレータから削除
- moderator.remove(player);
-
- // メッセージ
- sendSystemMessage("removeModeratorMessage", player);
-
- save();
}
/**
* プレイヤーに関連する、システムメッセージをチャンネルに流す
* @param key リソースキー
* @param player プレイヤー
+ * @deprecated Legacy Version
*/
- protected abstract void sendSystemMessage(String key, ChannelPlayer player);
+ protected void sendSystemMessage(String key, ChannelPlayer player) {
+ // do nothing.
+ }
/**
* メッセージを表示します。指定したプレイヤーの発言として処理されます。
@@ -365,16 +166,29 @@ public void removeModerator(ChannelPlayer player) {
* @param format フォーマット
* @param sendDynmap dynmapへ送信するかどうか
* @param displayName 発言者の表示名(APIに使用されます)
+ * @deprecated Legacy Version
*/
- public abstract void sendMessage(
- ChannelPlayer player, String message, String format, boolean sendDynmap, String displayName);
+ public void sendMessage(
+ ChannelPlayer player, String message, String format, boolean sendDynmap, String displayName) {
+ if ( format != null ) {
+ message = format.replace("%msg", message);
+ }
+ if ( player != null ) {
+ channel.chat(ChannelMember.getChannelMember(player.toString()), message);
+ } else {
+ channel.chatFromOtherSource(displayName, null, message);
+ }
+ }
/**
* チャンネル情報を返す
* @param forModerator モデレータ向けの情報を含めるかどうか
* @return チャンネル情報
+ * @deprecated Legacy Version
*/
- public abstract ArrayList getInfo(boolean forModerator);
+ public ArrayList getInfo(boolean forModerator) {
+ return new ArrayList(channel.getInfo(forModerator));
+ }
/**
* ログファイルを読み込んで、ログデータを取得する
@@ -383,606 +197,376 @@ public abstract void sendMessage(
* @param date 日付、今日のデータを取得するならnullを指定すること
* @param reverse 逆順取得
* @return ログデータ
+ * @deprecated Legacy Version
*/
- public abstract ArrayList getLog(
- String player, String filter, String date, boolean reverse);
+ public ArrayList getLog(
+ String player, String filter, String date, boolean reverse) {
+ return new ArrayList(channel.getLog(player, filter, date, reverse));
+ }
/**
* チャンネルのオンライン人数を返す
* @return オンライン人数
+ * @deprecated Legacy Version
*/
public int getOnlineNum() {
-
- // ブロードキャストチャンネルならサーバー接続人数を返す
- if ( isBroadcastChannel() ) {
- return Utility.getOnlinePlayersCount();
- }
-
- // メンバーの人数を数える
- int onlineNum = 0;
- for ( ChannelPlayer player : members ) {
- if ( player.isOnline() ) {
- onlineNum++;
- }
- }
- return onlineNum;
+ return channel.getOnlineNum();
}
/**
* チャンネルの総参加人数を返す
* @return 総参加人数
+ * @deprecated Legacy Version
*/
public int getTotalNum() {
-
- // ブロードキャストチャンネルならサーバー接続人数を返す
- if ( isBroadcastChannel() ) {
- return Utility.getOnlinePlayersCount();
- }
-
- return members.size();
+ return channel.getTotalNum();
}
/**
* 期限付きBanや期限付きMuteをチェックし、期限が切れていたら解除を行う
+ * @deprecated Legacy Version
*/
- public abstract void checkExpires();
-
- /**
- * シリアライズ
- * ConfigurationSerializable互換のための実装。
- * @see org.bukkit.configuration.serialization.ConfigurationSerializable#serialize()
- */
- @Override
- public Map serialize() {
-
- Map map = new HashMap();
- map.put(KEY_NAME, name);
- map.put(KEY_ALIAS, alias);
- map.put(KEY_DESC, description);
- map.put(KEY_FORMAT, format);
- map.put(KEY_MEMBERS, getStringList(members));
- map.put(KEY_BANNED, getStringList(banned));
- map.put(KEY_MUTED, getStringList(muted));
- map.put(KEY_HIDED, getStringList(hided));
- map.put(KEY_MODERATOR, getStringList(moderator));
- map.put(KEY_PASSWORD, password);
- map.put(KEY_VISIBLE, visible);
- map.put(KEY_COLOR, colorCode);
- map.put(KEY_BROADCAST, broadcastChannel);
- map.put(KEY_WORLD, isWorldRange);
- map.put(KEY_RANGE, chatRange);
- map.put(KEY_BAN_EXPIRES, getStringLongMap(banExpires));
- map.put(KEY_MUTE_EXPIRES, getStringLongMap(muteExpires));
- map.put(KEY_ALLOWCC, allowcc);
- map.put(KEY_JAPANIZE, japanizeType == null ? null : japanizeType.toString());
- return map;
- }
-
- /**
- * デシリアライズ
- * ConfigurationSerializable互換のための実装。
- * @param data デシリアライズ元のMapデータ。
- * @return デシリアライズされたクラス
- */
- public static Channel deserialize(Map data) {
-
- String name = castWithDefault(data.get(KEY_NAME), (String)null);
- if ( name == null ) {
- return null;
- }
-
- Channel channel = new ChannelImpl(name);
- channel.alias = castWithDefault(data.get(KEY_ALIAS), "");
- channel.description = castWithDefault(data.get(KEY_DESC), "");
- channel.format = castWithDefault(data.get(KEY_FORMAT), channel.format);
- channel.members = castToChannelPlayerList(data.get(KEY_MEMBERS));
- channel.banned = castToChannelPlayerList(data.get(KEY_BANNED));
- channel.muted = castToChannelPlayerList(data.get(KEY_MUTED));
- channel.hided = castToChannelPlayerList(data.get(KEY_HIDED));
- channel.moderator = castToChannelPlayerList(data.get(KEY_MODERATOR));
- channel.password = castWithDefault(data.get(KEY_PASSWORD), "");
- channel.visible = castWithDefault(data.get(KEY_VISIBLE), true);
- channel.colorCode = castWithDefault(data.get(KEY_COLOR), "");
- channel.broadcastChannel = castWithDefault(data.get(KEY_BROADCAST), false);
- channel.isWorldRange = castWithDefault(data.get(KEY_WORLD), false);
- channel.chatRange = castWithDefault(data.get(KEY_RANGE), 0);
- channel.banExpires = castToChannelPlayerLongMap(data.get(KEY_BAN_EXPIRES));
- channel.muteExpires = castToChannelPlayerLongMap(data.get(KEY_MUTE_EXPIRES));
- channel.allowcc = castWithDefault(data.get(KEY_ALLOWCC), true);
- channel.japanizeType = JapanizeType.fromID(data.get(KEY_JAPANIZE) + "", null);
- return channel;
- }
-
- /**
- * List<ChannelPlayer>を、List<String>に変換する。
- * @param org 変換元
- * @return 変換後
- */
- private static List getStringList(List org) {
-
- ArrayList result = new ArrayList();
- for ( ChannelPlayer cp : org ) {
- result.add(cp.toString());
- }
- return result;
- }
-
- /**
- * Map<ChannelPlayer, Long>を、Map<String, Long>に変換する。
- * @param org 変換元
- * @return 変換後
- */
- private static Map getStringLongMap(Map org) {
-
- HashMap result = new HashMap();
- for ( ChannelPlayer cp : org.keySet() ) {
- result.put(cp.toString(), org.get(cp));
- }
- return result;
- }
-
- /**
- * Objectを、クラスTに変換する。nullならデフォルトを返す。
- * @param obj 変換元
- * @param def nullだった場合のデフォルト
- * @return 変換後
- */
- @SuppressWarnings("unchecked")
- private static T castWithDefault(Object obj, T def) {
-
- if ( obj == null ) {
- return def;
- }
- return (T)obj;
- }
-
- /**
- * Objectを、List<ChannelPlayer>に変換する。nullなら空のリストを返す。
- * @param obj 変換元
- * @return 変換後
- */
- private static List castToChannelPlayerList(Object obj) {
-
- List entries = castToStringList(obj);
- ArrayList players = new ArrayList();
-
- for ( String entry : entries ) {
- players.add(ChannelPlayer.getChannelPlayer(entry));
- }
-
- return players;
- }
-
- /**
- * Objectを、List<String>に変換する。nullなら空のリストを返す。
- * @param obj 変換元
- * @return 変換後
- */
- @SuppressWarnings("unchecked")
- private static List castToStringList(Object obj) {
-
- if ( obj == null ) {
- return new ArrayList();
- }
- if ( !(obj instanceof List>) ) {
- return new ArrayList();
- }
- return (List)obj;
- }
-
- /**
- * Objectを、Map<ChannelPlayer, Long>に変換する。nullなら空のリストを返す。
- * @param obj 変換元
- * @return 変換後
- */
- private static Map castToChannelPlayerLongMap(Object obj) {
-
- Map entries = castToStringLongMap(obj);
- HashMap map = new HashMap();
-
- for ( String key : entries.keySet() ) {
- ChannelPlayer cp = ChannelPlayer.getChannelPlayer(key);
- map.put(cp, entries.get(key));
- }
-
- return map;
- }
-
- /**
- * Objectを、Map<String, Long>に変換する。nullなら空のリストを返す。
- * @param obj 変換元
- * @return 変換後
- */
- @SuppressWarnings("unchecked")
- private static Map castToStringLongMap(Object obj) {
-
- if ( obj == null ) {
- return new HashMap();
- }
- if ( !(obj instanceof HashMap, ?>) ) {
- return new HashMap();
- }
- return (Map)obj;
- }
-
- /**
- * チャンネルの設定ファイルが、UUID化のために一旦保存が必要かどうかを返す
- * @param data チャンネルの実コンフィグデータ
- */
- private static boolean isNeedToSaveForUUIDUpdate(Map data) {
-
- if ( !Utility.isCB178orLater() ) {
- return false;
- }
-
- List members = castToStringList(data.get(KEY_MEMBERS));
- if ( members.size() == 0 ) {
- return false;
- }
-
- for ( String member : members ) {
- if ( member.startsWith("$") ) {
- return false;
- }
- }
-
- return true;
+ public void checkExpires() {
+ channel.checkExpires();
}
/**
* チャンネルの別名を返す
* @return チャンネルの別名
+ * @deprecated Legacy Version
*/
public String getAlias() {
- return alias;
+ return channel.getAlias();
}
/**
* チャンネルの別名を設定する
* @param alias チャンネルの別名
+ * @deprecated Legacy Version
*/
public void setAlias(String alias) {
- this.alias = alias;
+ channel.setAlias(alias);
}
/**
* チャンネルの説明文を返す
* @return チャンネルの説明文
+ * @deprecated Legacy Version
*/
public String getDescription() {
- return description;
+ return channel.getDescription();
}
/**
* チャンネルの説明文を設定する
* @param description チャンネルの説明文
+ * @deprecated Legacy Version
*/
public void setDescription(String description) {
- this.description = description;
+ channel.setDescription(description);
}
/**
* チャンネルのパスワードを返す
* @return チャンネルのパスワード
+ * @deprecated Legacy Version
*/
public String getPassword() {
- return password;
+ return channel.getPassword();
}
/**
* チャンネルのパスワードを設定する
* @param password チャンネルのパスワード
+ * @deprecated Legacy Version
*/
public void setPassword(String password) {
- this.password = password;
+ channel.setPassword(password);
}
/**
* チャンネルの可視性を返す
* @return チャンネルの可視性
+ * @deprecated Legacy Version
*/
public boolean isVisible() {
- return visible;
+ return channel.isVisible();
}
/**
* チャンネルの可視性を設定する
* @param visible チャンネルの可視性
+ * @deprecated Legacy Version
*/
public void setVisible(boolean visible) {
- this.visible = visible;
+ channel.setVisible(visible);
}
/**
* チャンネルのメッセージフォーマットを返す
* @return チャンネルのメッセージフォーマット
+ * @deprecated Legacy Version
*/
public String getFormat() {
- return format;
+ return channel.getFormat();
}
/**
* チャンネルのメッセージフォーマットを設定する
* @param format チャンネルのメッセージフォーマット
+ * @deprecated Legacy Version
*/
public void setFormat(String format) {
- this.format = format;
+ channel.setFormat(format);
}
/**
* チャンネルのメンバーを返す
* @return チャンネルのメンバー
+ * @deprecated Legacy Version
*/
public List getMembers() {
-
- // ブロードキャストチャンネルなら、
- // 現在サーバーに接続している全プレイヤーをメンバーとして返す
- if ( isBroadcastChannel() ) {
- List mem = new ArrayList();
- for ( Player p : Utility.getOnlinePlayers() ) {
- mem.add(ChannelPlayer.getChannelPlayer(p));
- }
- return mem;
- }
-
- return members;
+ return convertMemberListToPlayerList(channel.getMembers());
}
/**
* チャンネルのモデレーターを返す
* @return チャンネルのモデレーター
+ * @deprecated Legacy Version
*/
public List getModerator() {
- return moderator;
+ return convertMemberListToPlayerList(channel.getModerator());
}
/**
* チャンネルのBANリストを返す
* @return チャンネルのBANリスト
+ * @deprecated Legacy Version
*/
public List getBanned() {
- return banned;
+ return convertMemberListToPlayerList(channel.getBanned());
}
/**
* チャンネルのMuteリストを返す
* @return チャンネルのMuteリスト
+ * @deprecated Legacy Version
*/
public List getMuted() {
- return muted;
+ return convertMemberListToPlayerList(channel.getMuted());
}
/**
* 期限付きBANの期限マップを返す(key=プレイヤー名、value=期日(ミリ秒))
* @return banExpires
+ * @deprecated Legacy Version
*/
public Map getBanExpires() {
- return banExpires;
+ return convertMemberMapToPlayerMap(channel.getBanExpires());
}
/**
* 期限付きMuteの期限マップを返す(key=プレイヤー名、value=期日(ミリ秒))
* @return muteExpires
+ * @deprecated Legacy Version
*/
public Map getMuteExpires() {
- return muteExpires;
+ return convertMemberMapToPlayerMap(channel.getMuteExpires());
}
/**
* 非表示プレイヤーの一覧を返す
* @return チャンネルの非表示プレイヤーの一覧
+ * @deprecated Legacy Version
*/
public List getHided() {
- return hided;
+ return convertMemberListToPlayerList(channel.getHided());
}
/**
* チャンネル名を返す
* @return チャンネル名
+ * @deprecated Legacy Version
*/
public String getName() {
- return name;
+ return channel.getName();
}
/**
* チャンネルのカラーコードを返す
* @return チャンネルのカラーコード
+ * @deprecated Legacy Version
*/
public String getColorCode() {
- return colorCode;
+ return channel.getColorCode();
}
/**
* チャンネルのカラーコードを設定する
* @param colorCode カラーコード
+ * @deprecated Legacy Version
*/
public void setColorCode(String colorCode) {
- this.colorCode = colorCode;
+ channel.setColorCode(colorCode);
}
/**
* ブロードキャストチャンネルを設定する
* @param broadcast ブロードキャストチャンネルにするかどうか
+ * @deprecated Legacy Version
*/
public void setBroadcast(boolean broadcast) {
- this.broadcastChannel = broadcast;
+ channel.setBroadcast(broadcast);
}
/**
* チャットを同ワールド内に制限するかどうかを設定する
* @param isWorldRange 同ワールド制限するかどうか
+ * @deprecated Legacy Version
*/
public void setWorldRange(boolean isWorldRange) {
- this.isWorldRange = isWorldRange;
+ channel.setWorldRange(isWorldRange);
}
/**
* チャットの可聴範囲を設定する
* @param range 可聴範囲
+ * @deprecated Legacy Version
*/
public void setChatRange(int range) {
- this.chatRange = range;
+ channel.setChatRange(range);
}
/**
* 1:1チャットのときに、会話の相手先を取得する
* @return 会話の相手のプレイヤー名
+ * @deprecated Legacy Version
*/
public String getPrivateMessageTo() {
- return privateMessageTo;
+ if ( channel.getPrivateMessageTo() != null ) return channel.getPrivateMessageTo().getName();
+ return null;
}
/**
* 1:1チャットのときに、会話の相手先を設定する
* @param name 会話の相手のプレイヤー名
+ * @deprecated Legacy Version
*/
public void setPrivateMessageTo(String name) {
- this.privateMessageTo = name;
+ channel.setPrivateMessageTo(ChannelMember.getChannelMember(name));
}
/**
* ワールドチャットかどうか
* @return ワールドチャットかどうか
+ * @deprecated Legacy Version
*/
public boolean isWorldRange() {
- return isWorldRange;
+ return channel.isWorldRange();
}
/**
* チャットの可聴範囲、0の場合は無制限
* @return チャットの可聴範囲
+ * @deprecated Legacy Version
*/
public int getChatRange() {
- return chatRange;
+ return channel.getChatRange();
}
/**
* カラーコードが使用可能な設定かどうか
* @return allowccを返す
+ * @deprecated Legacy Version
*/
public boolean isAllowCC() {
- return allowcc;
+ return channel.isAllowCC();
}
/**
* カラーコードの使用可否を設定する
* @param allowcc 使用可否
+ * @deprecated Legacy Version
*/
public void setAllowCC(boolean allowcc) {
- this.allowcc = allowcc;
+ channel.setAllowCC(allowcc);
}
/**
* Japanize変換設定を取得する
* @return japanize
+ * @deprecated Legacy Version
*/
public JapanizeType getJapanizeType() {
- return japanizeType;
+ String value = (channel.getJapanizeType() != null) ? channel.getJapanizeType().name() : "";
+ return JapanizeType.fromID(value, null);
}
/**
* Japanize変換設定を再設定する
* @param japanize japanize
+ * @deprecated Legacy Version
*/
public void setJapanizeType(JapanizeType japanize) {
- this.japanizeType = japanize;
+ channel.setJapanizeType(com.github.ucchyocean.lc3.japanize.JapanizeType.fromID(
+ japanize.name(), null));
}
/**
* チャンネルの情報をファイルに保存する。
* @return 保存をしたかどうか。
+ * @deprecated Legacy Version
*/
public boolean save() {
-
- // フォルダーの取得と、必要に応じて作成
- File folder = new File(
- LunaChat.getInstance().getDataFolder(), FOLDER_NAME_CHANNELS);
- if ( !folder.exists() ) {
- folder.mkdirs();
- }
-
- // 1:1チャットチャンネルの場合は、何もしない。
- if ( isPersonalChat() ) {
- return false;
- }
-
- File file = new File(folder, name + ".yml");
-
- // ファイルへ保存する
- YamlConfiguration conf = new YamlConfiguration();
- Map data = this.serialize();
- for ( String key : data.keySet() ) {
- conf.set(key, data.get(key));
- }
- try {
- conf.save(file);
- return true;
- } catch (IOException e) {
- e.printStackTrace();
- return false;
- }
+ return channel.save();
}
/**
- * チャンネルの情報を保存したファイルを、削除する。
- * @return 削除したかどうか。
+ * ChannelMemberをChannelPlayerに変換する
+ * @param cp
+ * @return
*/
- protected boolean remove() {
-
- // フォルダーの取得
- File folder = new File(
- LunaChat.getInstance().getDataFolder(), FOLDER_NAME_CHANNELS);
- if ( !folder.exists() ) {
- return false;
- }
- File file = new File(folder, name + ".yml");
- if ( !file.exists() ) {
- return false;
+ private ChannelPlayer convertChannelMemberToChannelPlayer(ChannelMember cm) {
+ if ( cm == null ) return null;
+ if ( cm instanceof ChannelMemberBungee ) return null; // Bungeeモードの場合は変換できない
+ if ( cm instanceof ChannelMemberPlayer ) {
+ return ChannelPlayer.getChannelPlayer(cm.toString());
+ } else if ( cm instanceof ChannelMemberBukkitConsole ) {
+ return new ChannelPlayerConsole(Bukkit.getConsoleSender());
+ } else if ( cm instanceof ChannelMemberBlock ) {
+ ChannelMemberBlock cmb = (ChannelMemberBlock)cm;
+ if ( cmb.getBlockCommandSender() != null ) {
+ return new ChannelPlayerBlock(cmb.getBlockCommandSender());
+ }
}
-
- // ファイルを削除
- return file.delete();
+ return null;
}
/**
- * チャンネルの情報を保存したファイルから全てのチャンネルを復元して返す。
- * @return 全てのチャンネル
+ * ChannelMemberのリストをChannelPlayerのリストに変換する
+ * @param list
+ * @return
*/
- protected static HashMap loadAllChannels() {
-
- // フォルダーの取得
- File folder = new File(
- LunaChat.getInstance().getDataFolder(), FOLDER_NAME_CHANNELS);
- if ( !folder.exists() ) {
- return new HashMap();
+ private List convertMemberListToPlayerList(List list) {
+ List result = new ArrayList();
+ for ( ChannelMember member : list ) {
+ ChannelPlayer player = convertChannelMemberToChannelPlayer(member);
+ if ( player != null ) result.add(player);
}
+ return result;
+ }
- File[] files = folder.listFiles(new FilenameFilter() {
- @Override
- public boolean accept(File dir, String name) {
- return name.endsWith(".yml");
- }
- });
- if ( files == null ) files = new File[0];
-
- HashMap result = new HashMap();
- for ( File file : files ) {
- YamlConfiguration config =
- YamlConfiguration.loadConfiguration(file);
- Map data = new HashMap();
- for ( String key : config.getKeys(false) ) {
- data.put(key, config.get(key));
- }
- Channel channel = deserialize(data);
-
- // 自動アップデート
- if ( isNeedToSaveForUUIDUpdate(data) ) {
- channel.save();
- }
-
- result.put(channel.name.toLowerCase(), channel);
+ /**
+ * ChannelMemberのマップをChannelPlayerのマップに変換する
+ * @param map
+ * @return
+ */
+ private Map convertMemberMapToPlayerMap(Map map) {
+ Map result = new HashMap();
+ for ( ChannelMember member : map.keySet() ) {
+ ChannelPlayer player = convertChannelMemberToChannelPlayer(member);
+ if ( player != null ) result.put(player, map.get(member));
}
-
return result;
}
}
diff --git a/src/main/java/com/github/ucchyocean/lc/channel/ChannelImpl.java b/src/main/java/com/github/ucchyocean/lc/channel/ChannelImpl.java
deleted file mode 100644
index 530615a0..00000000
--- a/src/main/java/com/github/ucchyocean/lc/channel/ChannelImpl.java
+++ /dev/null
@@ -1,792 +0,0 @@
-/*
- * @author ucchy
- * @license LGPLv3
- * @copyright Copyright ucchy 2014
- */
-package com.github.ucchyocean.lc.channel;
-
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.bukkit.Bukkit;
-import org.bukkit.ChatColor;
-import org.bukkit.Location;
-import org.bukkit.World;
-import org.bukkit.entity.Player;
-
-import com.github.ucchyocean.lc.LunaChat;
-import com.github.ucchyocean.lc.LunaChatAPI;
-import com.github.ucchyocean.lc.LunaChatConfig;
-import com.github.ucchyocean.lc.LunaChatLogger;
-import com.github.ucchyocean.lc.NGWordAction;
-import com.github.ucchyocean.lc.Resources;
-import com.github.ucchyocean.lc.Utility;
-import com.github.ucchyocean.lc.bridge.DynmapBridge;
-import com.github.ucchyocean.lc.event.LunaChatChannelChatEvent;
-import com.github.ucchyocean.lc.event.LunaChatChannelMessageEvent;
-import com.github.ucchyocean.lc.japanize.JapanizeType;
-
-/**
- * チャンネルの実装クラス
- * @author ucchy
- */
-public class ChannelImpl extends Channel {
-
- private static final String PERMISSION_SPEAK_PREFIX = "lunachat.speak";
-
- private static final String INFO_FIRSTLINE = Resources.get("channelInfoFirstLine");
- private static final String INFO_PREFIX = Resources.get("channelInfoPrefix");
- private static final String INFO_ALIAS = Resources.get("channelInfoAlias");
- private static final String INFO_GLOBAL = Resources.get("channelInfoGlobal");
- private static final String INFO_BROADCAST = Resources.get("channelInfoBroadcast");
- private static final String INFO_SECRET = Resources.get("channelInfoSecret");
- private static final String INFO_PASSWORD = Resources.get("channelInfoPassword");
- private static final String INFO_WORLDCHAT = Resources.get("channelInfoWorldChat");
- private static final String INFO_RANGECHAT = Resources.get("channelInfoRangeChat");
- private static final String INFO_FORMAT = Resources.get("channelInfoFormat");
- private static final String INFO_BANNED = Resources.get("channelInfoBanned");
- private static final String INFO_MUTED = Resources.get("channelInfoMuted");
-
- private static final String LIST_ENDLINE = Resources.get("listEndLine");
- private static final String LIST_FORMAT = Resources.get("listFormat");
-
- private static final String MSG_BAN_NGWORD = Resources.get("banNGWordMessage");
- private static final String MSG_KICK_NGWORD = Resources.get("kickNGWordMessage");
- private static final String MSG_MUTE_NGWORD = Resources.get("muteNGWordMessage");
-
- private static final String MSG_BAN_EXPIRED = Resources.get("expiredBanMessage");
- private static final String MSG_MUTE_EXPIRED = Resources.get("expiredMuteMessage");
- private static final String MSG_BAN_EXPIRED_PLAYER = Resources.get("cmdmsgPardoned");
- private static final String MSG_MUTE_EXPIRED_PLAYER = Resources.get("cmdmsgUnmuted");
-
- private static final String PREINFO = Resources.get("infoPrefix");
- private static final String PREERR = Resources.get("errorPrefix");
-
- private static final String MSG_NO_RECIPIENT = Resources.get("noRecipientMessage");
-
- private static final String ERRMSG_MUTED = Resources.get("errmsgMuted");
-
- private SimpleDateFormat dateFormat;
- private SimpleDateFormat timeFormat;
-
- /** ロガー */
- private LunaChatLogger logger;
-
- /**
- * コンストラクタ
- * @param name チャンネル名
- */
- protected ChannelImpl(String name) {
-
- super(name);
-
- logger = new LunaChatLogger(name.replace(">", "-"));
- dateFormat = new SimpleDateFormat("yyyy/MM/dd");
- timeFormat = new SimpleDateFormat("HH:mm:ss");
- }
-
- /**
- * このチャットに発言をする
- * @param player 発言をするプレイヤー
- * @param message 発言をするメッセージ
- */
- @Override
- public void chat(ChannelPlayer player, String message) {
-
- // 発言権限を確認する
- String node = PERMISSION_SPEAK_PREFIX + "." + getName();
- if ( player.isPermissionSet(node) && !player.hasPermission(node) ) {
- sendResourceMessage(player, PREERR, "errmsgPermission",
- PERMISSION_SPEAK_PREFIX + "." + getName());
- return;
- }
-
- LunaChatConfig config = LunaChat.getInstance().getLunaChatConfig();
- LunaChatAPI api = LunaChat.getInstance().getLunaChatAPI();
-
- // Muteされているかどうかを確認する
- if ( getMuted().contains(player) ) {
- player.sendMessage( PREERR + ERRMSG_MUTED );
- return;
- }
-
- String preReplaceMessage = new String(message);
- String maskedMessage = new String(message);
-
- // 一時的にJapanizeスキップ設定かどうかを確認する
- boolean skipJapanize = false;
- String marker = config.getNoneJapanizeMarker();
- if ( !marker.equals("") && maskedMessage.startsWith(marker) ) {
- skipJapanize = true;
- maskedMessage = maskedMessage.substring(marker.length());
- }
-
- // NGワード発言をしたかどうかのチェックとマスク
- boolean isNG = false;
- for ( Pattern pattern : config.getNgwordCompiled() ) {
- Matcher matcher = pattern.matcher(maskedMessage);
- if ( matcher.find() ) {
- maskedMessage = matcher.replaceAll(
- Utility.getAstariskString(matcher.group(0).length()));
- isNG = true;
- }
- }
-
- // キーワード置き換え
- String msgFormat = replaceKeywords(getFormat(), player);
-
- // カラーコード置き換え
- // チャンネルで許可されていて、発言者がパーミッションを持っている場合に置き換える
- if ( isAllowCC() && player.hasPermission("lunachat.allowcc") ) {
- maskedMessage = Utility.replaceColorCode(maskedMessage);
- }
-
- // イベントコール
- LunaChatChannelChatEvent event =
- new LunaChatChannelChatEvent(getName(), player,
- preReplaceMessage, maskedMessage, msgFormat);
- Bukkit.getPluginManager().callEvent(event);
- if ( event.isCancelled() ) {
- return;
- }
- msgFormat = event.getMessageFormat();
- maskedMessage = event.getNgMaskedMessage();
-
- // 2byteコードを含むか、半角カタカナのみなら、Japanize変換は行わない
- String kanaTemp = Utility.stripColor(maskedMessage);
- if ( !skipJapanize &&
- ( kanaTemp.getBytes().length > kanaTemp.length() ||
- kanaTemp.matches("[ \\uFF61-\\uFF9F]+") ) ) {
- skipJapanize = true;
- }
-
- // Japanize変換タスクを作成する
- boolean isIncludeSyncChat = true;
- DelayedJapanizeConvertTask delayedTask = null;
- JapanizeType japanizeType = (getJapanizeType() == null)
- ? config.getJapanizeType() : getJapanizeType();
-
- if ( !skipJapanize &&
- api.isPlayerJapanize(player.getName()) &&
- japanizeType != JapanizeType.NONE ) {
-
- int lineType = config.getJapanizeDisplayLine();
- String jpFormat;
- String messageFormat = null;
- if ( lineType == 1 ) {
- jpFormat = Utility.replaceColorCode(config.getJapanizeLine1Format());
- messageFormat = msgFormat;
- isIncludeSyncChat = false;
- } else {
- jpFormat = Utility.replaceColorCode(config.getJapanizeLine2Format());
- }
-
- // タスクを作成しておく
- delayedTask = new DelayedJapanizeChannelChatTask(maskedMessage,
- japanizeType, this, player, jpFormat, messageFormat);
- }
-
- if ( isIncludeSyncChat ) {
- // メッセージの送信
- sendMessage(player, maskedMessage, msgFormat, true, player.getDisplayName());
- }
-
- // 非同期実行タスクがある場合、追加で実行する
- if ( delayedTask != null ) {
- delayedTask.runTaskAsynchronously(LunaChat.getInstance());
- }
-
- // NGワード発言者に、NGワードアクションを実行する
- if ( isNG ) {
- if ( config.getNgwordAction() == NGWordAction.BAN ) {
- // BANする
-
- if ( !isGlobalChannel() ) {
- getBanned().add(player);
- removeMember(player);
- if ( !MSG_BAN_NGWORD.equals("") ) {
- String m = replaceKeywordsForSystemMessages(
- MSG_BAN_NGWORD, player.getName());
- player.sendMessage(m);
- sendMessage(null, m, null, true, "system");
- }
- }
-
- } else if ( config.getNgwordAction() == NGWordAction.KICK ) {
- // キックする
-
- if ( !isGlobalChannel() ) {
- removeMember(player);
- if ( !MSG_KICK_NGWORD.equals("") ) {
- String m = replaceKeywordsForSystemMessages(
- MSG_KICK_NGWORD, player.getName());
- player.sendMessage(m);
- sendMessage(null, m, null, true, "system");
- }
- }
-
- } else if ( config.getNgwordAction() == NGWordAction.MUTE ) {
- // Muteする
-
- getMuted().add(player);
- save();
- if ( !MSG_MUTE_NGWORD.equals("") ) {
- String m = replaceKeywordsForSystemMessages(
- MSG_MUTE_NGWORD, player.getName());
- player.sendMessage(m);
- sendMessage(null, m, null, true, "system");
- }
- }
- }
- }
-
- /**
- * ほかの連携先などから、このチャットに発言する
- * @param player プレイヤー名
- * @param source 連携元を判別する文字列
- * @param message メッセージ
- */
- @Override
- public void chatFromOtherSource(String player, String source, String message) {
-
- LunaChatConfig config = LunaChat.getInstance().getLunaChatConfig();
-
- // 表示名
- String name = player + "@" + source;
-
- // NGワード発言のマスク
- String maskedMessage = new String(message);
- for ( Pattern pattern : config.getNgwordCompiled() ) {
- Matcher matcher = pattern.matcher(maskedMessage);
- if ( matcher.find() ) {
- maskedMessage = matcher.replaceAll(
- Utility.getAstariskString(matcher.group(0).length()));
- }
- }
-
- // キーワード置き換え
- String msgFormat = replaceKeywordsForSystemMessages(getFormat(), name);
- msgFormat = msgFormat.replace("%prefix", "");
- msgFormat = msgFormat.replace("%suffix", "");
-
- // カラーコード置き換え チャンネルで許可されている場合に置き換える。
- if ( isAllowCC() ) {
- maskedMessage = Utility.replaceColorCode(maskedMessage);
- }
-
- // メッセージの送信
- boolean sendDynmap = source == null || !source.equals("web");
- sendMessage(null, maskedMessage, msgFormat, sendDynmap, name);
- }
-
- /**
- * プレイヤーに関連する、システムメッセージをチャンネルに流す
- * @param key リソースキー
- * @param player プレイヤー
- */
- @Override
- protected void sendSystemMessage(String key, ChannelPlayer player) {
-
- // プライベートチャットならシステムメッセージを流さない
- if ( isPersonalChat() ) {
- return;
- }
-
- String msg = Resources.get(key);
- if ( msg == null || msg.equals("") ) {
- return;
- }
- msg = replaceKeywordsForSystemMessages(msg, player.getName());
- sendMessage(null, msg, null, false, "system");
- }
-
- /**
- * メッセージを表示します。指定したプレイヤーの発言として処理されます。
- * @param player プレイヤー(ワールドチャット、範囲チャットの場合は必須です)
- * @param message メッセージ
- * @param format フォーマット
- * @param sendDynmap dynmapへ送信するかどうか
- * @param name 発言者名
- */
- @Override
- public void sendMessage(ChannelPlayer player, String message,
- String format, boolean sendDynmap, String name) {
-
- LunaChatConfig config = LunaChat.getInstance().getLunaChatConfig();
-
- String originalMessage = new String(message);
-
- // 受信者を設定する
- ArrayList recipients = new ArrayList();
- boolean sendNoRecipientMessage = false;
-
- if ( isBroadcastChannel() ) {
- // ブロードキャストチャンネル
-
- if ( isWorldRange() && player != null &&
- player.isOnline() && player.getPlayer() != null ) {
-
- World w = player.getPlayer().getWorld();
-
- if ( getChatRange() > 0 ) {
- // 範囲チャット
-
- Location origin = player.getPlayer().getLocation();
- for ( Player p : Utility.getOnlinePlayers() ) {
- ChannelPlayer cp = ChannelPlayer.getChannelPlayer(p);
- if ( p.getWorld().equals(w) &&
- origin.distance(p.getLocation()) <= getChatRange() &&
- !getHided().contains(cp) ) {
- recipients.add(ChannelPlayer.getChannelPlayer(p));
- }
- }
-
- } else {
- // ワールドチャット
-
- for ( Player p : Utility.getOnlinePlayers() ) {
- ChannelPlayer cp = ChannelPlayer.getChannelPlayer(p);
- if ( p.getWorld().equals(w) && !getHided().contains(cp) ) {
- recipients.add(ChannelPlayer.getChannelPlayer(p));
- }
- }
- }
-
- // 受信者が自分以外いない場合は、メッセージを表示する
- if ( !MSG_NO_RECIPIENT.equals("") && (
- recipients.size() == 0 ||
- (recipients.size() == 1 &&
- recipients.get(0).getName().equals(player.getName()) ) ) ) {
- sendNoRecipientMessage = true;
- }
-
- } else {
- // 通常ブロードキャスト(全員へ送信)
-
- for ( Player p : Utility.getOnlinePlayers() ) {
- ChannelPlayer cp = ChannelPlayer.getChannelPlayer(p);
- if ( !getHided().contains(cp) ) {
- recipients.add(cp);
- }
- }
- }
-
- } else {
- // 通常チャンネル
-
- for ( ChannelPlayer mem : getMembers() ) {
- if ( mem != null && mem.isOnline() && !getHided().contains(mem) ) {
- recipients.add(mem);
- }
- }
- }
-
- // opListenAllChannel 設定がある場合は、
- // パーミッション lunachat-admin.listen-all-channels を持つプレイヤーを
- // 受信者に加える。
- if ( config.isOpListenAllChannel() ) {
- for ( Player p : Utility.getOnlinePlayers() ) {
- ChannelPlayer cp = ChannelPlayer.getChannelPlayer(p);
- if ( cp.hasPermission("lunachat-admin.listen-all-channels")
- && !recipients.contains(cp) ) {
- recipients.add(cp);
- }
- }
- }
-
- // hideされている場合は、受信対象者から抜く。
- LunaChatAPI api = LunaChat.getInstance().getLunaChatAPI();
- for ( ChannelPlayer cp : api.getHidelist(player) ) {
- if ( recipients.contains(cp) ) {
- recipients.remove(cp);
- }
- }
-
- // フォーマットがある場合は置き換える
- if ( format != null ) {
- message = format.replace("%msg", message);
- }
-
- // イベントコール
- LunaChatChannelMessageEvent event =
- new LunaChatChannelMessageEvent(
- getName(), player, message, recipients, name, originalMessage);
- Bukkit.getPluginManager().callEvent(event);
- message = event.getMessage();
- recipients = event.getRecipients();
-
- // 通常ブロードキャストなら、設定に応じてdynmapへ送信する
- DynmapBridge dynmap = LunaChat.getInstance().getDynmap();
- if ( config.isSendBroadcastChannelChatToDynmap() &&
- sendDynmap &&
- dynmap != null &&
- isBroadcastChannel() &&
- !isWorldRange() ) {
- if ( config.isSendFormattedMessageToDynmap() ) {
- if ( player != null && player.getPlayer() != null ) {
- dynmap.chat(player.getPlayer(), message);
- } else {
- dynmap.broadcast(message);
- }
- } else {
- if ( player != null && player.getPlayer() != null ) {
- dynmap.chat(player.getPlayer(), originalMessage);
- } else {
- dynmap.broadcast(originalMessage);
- }
- }
- }
-
- // 送信する
- for ( ChannelPlayer p : recipients ) {
- p.sendMessage(message);
- }
-
- // 設定に応じて、コンソールに出力する
- if ( config.isDisplayChatOnConsole() ) {
- Bukkit.getLogger().info(ChatColor.stripColor(message));
- }
-
- // 受信者が自分以外いない場合は、メッセージを表示する
- if ( sendNoRecipientMessage ) {
- String msg = replaceKeywordsForSystemMessages(MSG_NO_RECIPIENT, "");
- player.sendMessage(msg);
- }
-
- // ロギング
- log(originalMessage, name, player);
- }
-
- /**
- * チャンネル情報を返す
- * @param forModerator モデレータ向けの情報を含めるかどうか
- * @return チャンネル情報
- */
- @Override
- public ArrayList getInfo(boolean forModerator) {
-
- ArrayList info = new ArrayList();
- info.add(INFO_FIRSTLINE);
-
- // チャンネル名、参加人数、総人数、チャンネル説明文
- info.add( String.format(
- LIST_FORMAT, getName(), getOnlineNum(), getTotalNum(), getDescription()) );
-
- // チャンネル別名
- String alias = getAlias();
- if ( alias != null && alias.length() > 0 ) {
- info.add(INFO_ALIAS + alias);
- }
-
- // 参加メンバー一覧
- if ( isGlobalChannel() ) {
- info.add(INFO_GLOBAL);
- } else if ( isBroadcastChannel() ) {
- info.add(INFO_BROADCAST);
- } else {
- // メンバーを、5人ごとに表示する
- StringBuffer buf = new StringBuffer();
- buf.append(INFO_PREFIX);
-
- for ( int i=0; i 0 ) {
- if ( !forModerator ) {
- info.add(INFO_PASSWORD);
- } else {
- info.add(INFO_PASSWORD + " " + getPassword());
- }
- }
-
- // 範囲チャット、ワールドチャット
- if ( isWorldRange() && getChatRange() > 0 ) {
- info.add(String.format(INFO_RANGECHAT, getChatRange()));
- } else if ( isWorldRange() ) {
- info.add(INFO_WORLDCHAT);
- }
-
- if ( forModerator ) {
-
- // フォーマット情報
- info.add(INFO_FORMAT);
- info.add(INFO_PREFIX + " " + ChatColor.WHITE + getFormat());
-
- // Muteリスト情報、5人ごとに表示する
- if ( getMuted().size() > 0 ) {
- info.add(INFO_MUTED);
-
- StringBuffer buf = new StringBuffer();
- buf.append(INFO_PREFIX + ChatColor.WHITE);
- for ( int i=0; i 0 ) {
- info.add(INFO_BANNED);
-
- StringBuffer buf = new StringBuffer();
- buf.append(INFO_PREFIX + ChatColor.WHITE);
- for ( int i=0; i getLog(
- String player, String filter, String date, boolean reverse) {
-
- return logger.getLog(player, filter, date, reverse);
- }
-
- /**
- * 期限付きBanや期限付きMuteをチェックし、期限が切れていたら解除を行う
- */
- @Override
- public void checkExpires() {
-
- long now = System.currentTimeMillis();
-
- // 期限付きBANのチェック
- for ( ChannelPlayer cp : getBanExpires().keySet() ) {
- if ( getBanExpires().get(cp) <= now ) {
-
- // 期限マップから削除し、BANを解除
- getBanExpires().remove(cp);
- if ( getBanned().contains(cp) ) {
- getBanned().remove(cp);
- save();
-
- // メッセージ通知を流す
- if ( !MSG_BAN_EXPIRED.equals("") ) {
- String msg = replaceKeywords(MSG_BAN_EXPIRED, cp);
- sendMessage(null, msg, null, false, "system");
- }
-
- if ( cp.isOnline() && !MSG_BAN_EXPIRED_PLAYER.equals("") ) {
- String msg = PREINFO + String.format(MSG_BAN_EXPIRED_PLAYER, getName());
- cp.sendMessage(msg);
- }
- }
- }
- }
-
- // 期限付きMuteのチェック
- for ( ChannelPlayer cp : getMuteExpires().keySet() ) {
- if ( getMuteExpires().get(cp) <= now ) {
-
- // 期限マップから削除し、Muteを解除
- getMuteExpires().remove(cp);
- if ( getMuted().contains(cp) ) {
- getMuted().remove(cp);
- save();
-
- // メッセージ通知を流す
- if ( !MSG_MUTE_EXPIRED.equals("") ) {
- String msg = replaceKeywords(MSG_MUTE_EXPIRED, cp);
- sendMessage(null, msg, null, false, "system");
- }
-
- if ( cp.isOnline() && !MSG_MUTE_EXPIRED_PLAYER.equals("") ) {
- String msg = PREINFO + String.format(MSG_MUTE_EXPIRED_PLAYER, getName());
- cp.sendMessage(msg);
- }
- }
- }
- }
- }
-
- /**
- * チャットフォーマット内のキーワードを置き換えする
- * @param format チャットフォーマット
- * @param player プレイヤー
- * @return 置き換え結果
- */
- private String replaceKeywords(String format, ChannelPlayer player) {
-
- LunaChatAPI api = LunaChat.getInstance().getLunaChatAPI();
-
- String msg = format;
-
- // テンプレートのキーワードを、まず最初に置き換える
- for ( int i=0; i<=9; i++ ) {
- String key = "%" + i;
- if ( msg.contains(key) ) {
- if ( api.getTemplate("" + i) != null ) {
- msg = msg.replace(key, api.getTemplate("" + i));
- break;
- }
- }
- }
-
- msg = msg.replace("%ch", getName());
- //msg = msg.replace("%msg", message);
- msg = msg.replace("%color", getColorCode());
- msg = msg.replace("%to", getPrivateMessageTo());
-
- if ( msg.contains("%date") ) {
- msg = msg.replace("%date", dateFormat.format(new Date()));
- }
- if ( msg.contains("%time") ) {
- msg = msg.replace("%time", timeFormat.format(new Date()));
- }
-
- if ( player != null ) {
- msg = msg.replace("%username", player.getDisplayName());
- msg = msg.replace("%player", player.getName());
-
- if ( msg.contains("%prefix") || msg.contains("%suffix") ) {
- msg = msg.replace("%prefix", player.getPrefix());
- msg = msg.replace("%suffix", player.getSuffix());
- }
-
- if ( msg.contains("%world") ) {
-
- String worldname = null;
- if ( LunaChat.getInstance().getMultiverseCore() != null ) {
- worldname = LunaChat.getInstance().getMultiverseCore().getWorldAlias(player.getWorldName());
- }
- if ( worldname == null || worldname.equals("") ) {
- worldname = player.getWorldName();
- }
- msg = msg.replace("%world", worldname);
- }
-
- } else {
- msg = msg.replace("%username", "");
- msg = msg.replace("%player", "");
- msg = msg.replace("%prefix", "");
- msg = msg.replace("%suffix", "");
- msg = msg.replace("%world", "");
- }
-
- return Utility.replaceColorCode(msg);
- }
-
- /**
- * チャットフォーマット内のキーワードを置き換えする
- * @param format チャットフォーマット
- * @param playerName プレイヤー名
- * @return 置き換え結果
- */
- private String replaceKeywordsForSystemMessages(String format, String playerName) {
-
- String msg = format;
- msg = msg.replace("%ch", getName());
- msg = msg.replace("%color", getColorCode());
- msg = msg.replace("%username", playerName);
- msg = msg.replace("%player", playerName);
-
- return Utility.replaceColorCode(msg);
- }
-
- /**
- * ログを記録する
- * @param name 発言者
- * @param message 記録するメッセージ
- * @param player プレイヤー
- */
- private void log(String message, String name, ChannelPlayer player) {
-
- // LunaChatのチャットログへ記録
- LunaChatConfig config = LunaChat.getInstance().getLunaChatConfig();
- if ( config.isLoggingChat() && logger != null ) {
- logger.log(message, name);
- }
-
- // Hawkeye Reloaded のチャットログへ記録
- if ( config.isLoggingChatToHawkEye() && LunaChat.getInstance().getHawkEye() != null
- && player != null && player.getLocation() != null ) {
- LunaChat.getInstance().getHawkEye().writeLog(name, player.getLocation(),
- "channel(" + getName() + ")-" + Utility.stripColor(message));
- }
-
- // Prism のチャットログへ記録
- if ( config.isLoggingChatToPrism() && LunaChat.getInstance().getPrism() != null
- && player != null && player.getPlayer() != null ) {
- LunaChat.getInstance().getPrism().writeLog(player.getPlayer(),
- "channel(" + getName() + ")-" + Utility.stripColor(message));
- }
- }
-
- /**
- * メッセージリソースのメッセージを、カラーコード置き換えしつつ、senderに送信する
- * @param player メッセージの送り先
- * @param pre プレフィックス
- * @param key リソースキー
- * @param args リソース内の置き換え対象キーワード
- */
- private void sendResourceMessage(
- ChannelPlayer player, String pre, String key, Object... args) {
-
- String org = Resources.get(key);
- if ( org == null || org.equals("") ) {
- return;
- }
- String msg = String.format(pre + org, args);
- player.sendMessage(msg);
- }
-}
diff --git a/src/main/java/com/github/ucchyocean/lc/channel/ChannelPlayer.java b/src/main/java/com/github/ucchyocean/lc/channel/ChannelPlayer.java
index 41780415..d8fa8698 100644
--- a/src/main/java/com/github/ucchyocean/lc/channel/ChannelPlayer.java
+++ b/src/main/java/com/github/ucchyocean/lc/channel/ChannelPlayer.java
@@ -11,11 +11,10 @@
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.entity.Player;
-import com.github.ucchyocean.lc.Utility;
-
/**
* プレイヤーの抽象クラス
* @author ucchy
+ * @deprecated Legacy Version
*/
public abstract class ChannelPlayer implements Comparable {
@@ -136,12 +135,10 @@ public static ChannelPlayer getChannelPlayer(String nameOrUuid) {
String id = nameOrUuid.substring(1);
return new ChannelPlayerUUID(id);
}
- if ( Utility.isCB178orLater() ) {
- ChannelPlayer player =
- ChannelPlayerUUID.getChannelPlayerUUIDFromName(nameOrUuid);
- if ( player != null ) {
- return player;
- }
+ ChannelPlayer player =
+ ChannelPlayerUUID.getChannelPlayerUUIDFromName(nameOrUuid);
+ if ( player != null ) {
+ return player;
}
return new ChannelPlayerName(nameOrUuid);
}
@@ -158,9 +155,7 @@ public static ChannelPlayer getChannelPlayer(CommandSender sender) {
return new ChannelPlayerBlock((BlockCommandSender)sender);
} else if ( sender instanceof ConsoleCommandSender ) {
return new ChannelPlayerConsole((ConsoleCommandSender)sender);
- } else if ( Utility.isCB178orLater() ) {
- return ChannelPlayerUUID.getChannelPlayer(sender);
}
- return new ChannelPlayerName(sender.getName());
+ return ChannelPlayerUUID.getChannelPlayer(sender);
}
}
diff --git a/src/main/java/com/github/ucchyocean/lc/channel/ChannelPlayerBlock.java b/src/main/java/com/github/ucchyocean/lc/channel/ChannelPlayerBlock.java
index ee7960b8..c243f9db 100644
--- a/src/main/java/com/github/ucchyocean/lc/channel/ChannelPlayerBlock.java
+++ b/src/main/java/com/github/ucchyocean/lc/channel/ChannelPlayerBlock.java
@@ -13,6 +13,7 @@
/**
* コマンドブロック
* @author ucchy
+ * @deprecated Legacy Version
*/
public class ChannelPlayerBlock extends ChannelPlayer {
@@ -161,4 +162,8 @@ public boolean equals(CommandSender sender) {
public String toString() {
return getName();
}
+
+ public BlockCommandSender getBlockCommandSender() {
+ return sender;
+ }
}
diff --git a/src/main/java/com/github/ucchyocean/lc/channel/ChannelPlayerConsole.java b/src/main/java/com/github/ucchyocean/lc/channel/ChannelPlayerConsole.java
index 0af73de5..a29b8cb2 100644
--- a/src/main/java/com/github/ucchyocean/lc/channel/ChannelPlayerConsole.java
+++ b/src/main/java/com/github/ucchyocean/lc/channel/ChannelPlayerConsole.java
@@ -13,6 +13,7 @@
/**
* コンソール
* @author ucchy
+ * @deprecated Legacy Version
*/
public class ChannelPlayerConsole extends ChannelPlayer {
diff --git a/src/main/java/com/github/ucchyocean/lc/channel/ChannelPlayerName.java b/src/main/java/com/github/ucchyocean/lc/channel/ChannelPlayerName.java
index 2d1dcd7b..1a8ca44e 100644
--- a/src/main/java/com/github/ucchyocean/lc/channel/ChannelPlayerName.java
+++ b/src/main/java/com/github/ucchyocean/lc/channel/ChannelPlayerName.java
@@ -10,12 +10,10 @@
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
-import com.github.ucchyocean.lc.LunaChat;
-import com.github.ucchyocean.lc.bridge.VaultChatBridge;
-
/**
* 名前管理のプレイヤー
* @author ucchy
+ * @deprecated Legacy Version
*/
public class ChannelPlayerName extends ChannelPlayer {
@@ -70,14 +68,6 @@ public String getDisplayName() {
*/
@Override
public String getPrefix() {
- VaultChatBridge vault = LunaChat.getInstance().getVaultChat();
- if ( vault == null ) {
- return "";
- }
- Player player = getPlayer();
- if ( player != null ) {
- return vault.getPlayerPrefix(player);
- }
return "";
}
@@ -88,14 +78,6 @@ public String getPrefix() {
*/
@Override
public String getSuffix() {
- VaultChatBridge vault = LunaChat.getInstance().getVaultChat();
- if ( vault == null ) {
- return "";
- }
- Player player = getPlayer();
- if ( player != null ) {
- return vault.getPlayerSuffix(player);
- }
return "";
}
diff --git a/src/main/java/com/github/ucchyocean/lc/channel/ChannelPlayerUUID.java b/src/main/java/com/github/ucchyocean/lc/channel/ChannelPlayerUUID.java
index 4cf014d9..726d3563 100644
--- a/src/main/java/com/github/ucchyocean/lc/channel/ChannelPlayerUUID.java
+++ b/src/main/java/com/github/ucchyocean/lc/channel/ChannelPlayerUUID.java
@@ -13,12 +13,10 @@
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
-import com.github.ucchyocean.lc.LunaChat;
-import com.github.ucchyocean.lc.bridge.VaultChatBridge;
-
/**
* UUID管理のプレイヤー
* @author ucchy
+ * @deprecated Legacy Version
*/
public class ChannelPlayerUUID extends ChannelPlayer {
@@ -50,7 +48,6 @@ public static ChannelPlayerUUID getChannelPlayerUUIDFromName(String name) {
if ( player != null ) {
return new ChannelPlayerUUID(player.getUniqueId());
}
- @SuppressWarnings("deprecation")
OfflinePlayer offline = Bukkit.getOfflinePlayer(name);
if ( offline != null && offline.getUniqueId() != null ) {
return new ChannelPlayerUUID(offline.getUniqueId());
@@ -120,14 +117,6 @@ public String getDisplayName() {
*/
@Override
public String getPrefix() {
- VaultChatBridge vault = LunaChat.getInstance().getVaultChat();
- if ( vault == null ) {
- return "";
- }
- Player player = getPlayer();
- if ( player != null ) {
- return vault.getPlayerPrefix(player);
- }
return "";
}
@@ -138,14 +127,6 @@ public String getPrefix() {
*/
@Override
public String getSuffix() {
- VaultChatBridge vault = LunaChat.getInstance().getVaultChat();
- if ( vault == null ) {
- return "";
- }
- Player player = getPlayer();
- if ( player != null ) {
- return vault.getPlayerSuffix(player);
- }
return "";
}
diff --git a/src/main/java/com/github/ucchyocean/lc/channel/DelayedJapanizeNormalChatTask.java b/src/main/java/com/github/ucchyocean/lc/channel/DelayedJapanizeNormalChatTask.java
deleted file mode 100644
index fe286a15..00000000
--- a/src/main/java/com/github/ucchyocean/lc/channel/DelayedJapanizeNormalChatTask.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * @author ucchy
- * @license LGPLv3
- * @copyright Copyright ucchy 2015
- */
-package com.github.ucchyocean.lc.channel;
-
-import org.bukkit.Bukkit;
-import org.bukkit.entity.Player;
-import org.bukkit.event.player.AsyncPlayerChatEvent;
-
-import com.github.ucchyocean.lc.LunaChat;
-import com.github.ucchyocean.lc.japanize.JapanizeType;
-
-/**
- * Japanize2行表示のときに、変換結果を遅延して通常チャットに表示するためのタスク
- * @author ucchy
- */
-public class DelayedJapanizeNormalChatTask extends DelayedJapanizeConvertTask {
-
- private ChannelPlayer player;
- private AsyncPlayerChatEvent event;
-
- /**
- * コンストラクタ
- * @param org 変換前の文字列
- * @param type 変換タイプ
- * @param player 発言したプレイヤー
- * @param japanizeFormat 変換後に発言するときの、発言フォーマット
- * @param event イベント
- */
- public DelayedJapanizeNormalChatTask(String org, JapanizeType type,
- ChannelPlayer player, String japanizeFormat, final AsyncPlayerChatEvent event) {
- super(org, type, null, player, japanizeFormat);
- this.player = player;
- this.event = event;
- }
-
- /**
- * @see java.lang.Runnable#run()
- */
- @Override
- public void run() {
-
- if ( runSync() ) {
-
- String result = getResult();
-
- // 送信
- for ( Player p : event.getRecipients() ) {
- p.sendMessage(result);
- }
- Bukkit.getConsoleSender().sendMessage(result);
-
- // 設定に応じてdynmapへ送信する
- if ( LunaChat.getInstance().getLunaChatConfig().
- isSendBroadcastChannelChatToDynmap() &&
- LunaChat.getInstance().getDynmap() != null ) {
- if ( player != null && player.getPlayer() != null )
- LunaChat.getInstance().getDynmap().chat(player.getPlayer(), result);
- else
- LunaChat.getInstance().getDynmap().broadcast(result);
- }
- }
- }
-}
diff --git a/src/main/java/com/github/ucchyocean/lc/command/CheckCommand.java b/src/main/java/com/github/ucchyocean/lc/command/CheckCommand.java
deleted file mode 100644
index 126daed8..00000000
--- a/src/main/java/com/github/ucchyocean/lc/command/CheckCommand.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- * @author ucchy
- * @license LGPLv3
- * @copyright Copyright ucchy 2013
- */
-package com.github.ucchyocean.lc.command;
-
-import java.util.ArrayList;
-
-import org.bukkit.ChatColor;
-import org.bukkit.command.CommandSender;
-import org.bukkit.command.ConsoleCommandSender;
-import org.bukkit.entity.Player;
-import org.bukkit.metadata.FixedMetadataValue;
-
-import com.github.ucchyocean.lc.LunaChat;
-import com.github.ucchyocean.lc.Resources;
-import com.github.ucchyocean.lc.channel.Channel;
-import com.github.ucchyocean.lc.channel.ChannelPlayer;
-
-/**
- * checkコマンドの実行クラス
- * @author ucchy
- */
-public class CheckCommand extends SubCommandAbst {
-
- private static final String LIST_FIRSTLINE = Resources.get("listFirstLine");
- private static final String LIST_ENDLINE = Resources.get("listEndLine");
- private static final String LIST_FORMAT = Resources.get("listFormat");
-
- private static final String COMMAND_NAME = "check";
- private static final String PERMISSION_NODE = "lunachat-admin." + COMMAND_NAME;
- private static final String USAGE_KEY1 = "usageCheck1";
- private static final String USAGE_KEY2 = "usageCheck2";
- private static final String COMMAND_TRACKER_NAME = "lunachat-check-command";
-
- private boolean consoleRemoveTracker;
-
- /**
- * コマンドを取得します。
- * @return コマンド
- * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandName()
- */
- @Override
- public String getCommandName() {
- return COMMAND_NAME;
- }
-
- /**
- * パーミッションノードを取得します。
- * @return パーミッションノード
- * @see com.github.ucchyocean.lc.command.SubCommandAbst#getPermissionNode()
- */
- @Override
- public String getPermissionNode() {
- return PERMISSION_NODE;
- }
-
- /**
- * コマンドの種別を取得します。
- * @return コマンド種別
- * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandType()
- */
- @Override
- public CommandType getCommandType() {
- return CommandType.ADMIN;
- }
-
- /**
- * 使用方法に関するメッセージをsenderに送信します。
- * @param sender コマンド実行者
- * @param label 実行ラベル
- * @see com.github.ucchyocean.lc.command.SubCommandAbst#sendUsageMessage()
- */
- @Override
- public void sendUsageMessage(
- CommandSender sender, String label) {
- sendResourceMessage(sender, "", USAGE_KEY1, label);
- sendResourceMessage(sender, "", USAGE_KEY2, label);
- }
-
- /**
- * コマンドを実行します。
- * @param sender コマンド実行者
- * @param label 実行ラベル
- * @param args 実行時の引数
- * @return コマンドが実行されたかどうか
- * @see com.github.ucchyocean.lc.command.SubCommandAbst#runCommand(java.lang.String[])
- */
- @Override
- public boolean runCommand(
- CommandSender sender, String label, String[] args) {
-
- boolean isRemove = false;
-
- Player player = null;
- if ( sender instanceof Player ) {
- player = (Player)sender;
- }
-
- // 引数チェック
- // このコマンドは、コンソールでも実行できる
- if (args.length >= 2 && args[1].equalsIgnoreCase("remove")) {
- if (player != null && player.hasMetadata(COMMAND_TRACKER_NAME)) {
- // フラグをたてて、トラッカーを除去する
- isRemove = true;
- player.removeMetadata(COMMAND_TRACKER_NAME, LunaChat.getInstance());
- } else if (sender instanceof ConsoleCommandSender && consoleRemoveTracker) {
- // フラグをたてて、トラッカーを除去する
- isRemove = true;
- consoleRemoveTracker = false;
- } else {
- // トラッカーが確認できない実行者には、警告を表示して終了する
- sendResourceMessage(sender, PREERR, "errmsgNotInCheckRemoveConfirm", label);
- return true;
- }
- }
-
- if ( !isRemove ) {
- // チェックの実行と確認メッセージ
- ArrayList list = getCheckList();
- if ( list.size() == 0 ) {
- sendResourceMessage(sender, PREINFO, "cmdmsgCheck", list.size());
- } else {
- sendCheckListMessages(sender, list);
- sendResourceMessage(sender, PREINFO, "cmdmsgCheck", list.size());
- sendResourceMessage(sender, PREINFO, "cmdmsgCheckConfirm", label);
-
- // コマンドトラッカーを設定する
- if (player != null) {
- player.setMetadata(COMMAND_TRACKER_NAME,
- new FixedMetadataValue(LunaChat.getInstance(), true));
- } else if (sender instanceof ConsoleCommandSender) {
- consoleRemoveTracker = true;
- }
- }
- return true;
-
- } else {
- // クリーンアップの実行
- int counter = 0;
- ArrayList list = getCheckList();
- for ( Channel channel : list ) {
- if ( api.removeChannel(channel.getName(), sender) ) {
- counter++;
- }
- }
- sendResourceMessage(sender, PREINFO, "cmdmsgCheckRemove", counter);
-
- return true;
- }
- }
-
- /**
- * 削除対象となるチャンネルのリストを返す
- * @return 削除対象のチャンネルのリスト
- */
- private ArrayList getCheckList() {
-
- ArrayList list = new ArrayList();
- for ( Channel channel : api.getChannels() ) {
- if ( channel.getModerator().size() == 0 &&
- !channel.isBroadcastChannel() && !channel.isPersonalChat() ) {
- list.add(channel);
- }
- }
- return list;
- }
-
- /**
- * 削除対象となるチャンネルを、リスト表示で通知する
- * @param sender 通知先
- * @param list 対象チャンネル
- */
- private void sendCheckListMessages(CommandSender sender, ArrayList list) {
-
- Player player = null;
- if ( sender instanceof Player ) {
- player = (Player)sender;
- }
-
- ArrayList items = new ArrayList();
- String dchannel = "";
- String playerName = "";
- ChannelPlayer cp = ChannelPlayer.getChannelPlayer(player);
- if ( player != null ) {
- playerName = player.getName();
- Channel def = api.getDefaultChannel(playerName);
- if ( def != null ) {
- dchannel = def.getName();
- }
- }
-
- // メッセージを作成する
- items.add(LIST_FIRSTLINE);
- for ( Channel channel : list ) {
-
- // デフォルト発言先なら赤にする。
- String disp = ChatColor.WHITE + channel.getName();
- if ( channel.getName().equalsIgnoreCase(dchannel) ) {
- disp = ChatColor.RED + channel.getName();
- }
-
- if ( player != null &&
- !channel.getMembers().contains(cp) &&
- !channel.isGlobalChannel() ) {
-
- // 参加していないチャンネルならグレーにする
- disp = ChatColor.GRAY + channel.getName();
- }
-
- String desc = channel.getDescription();
- int onlineNum = channel.getOnlineNum();
- int memberNum = channel.getTotalNum();
- String item = String.format(
- LIST_FORMAT, disp, onlineNum, memberNum, desc);
- items.add(item);
- }
- items.add(LIST_ENDLINE);
-
- // メッセージを送信する
- for (String msg : items) {
- sender.sendMessage(msg);
- }
- }
-}
diff --git a/src/main/java/com/github/ucchyocean/lc/command/DenyCommand.java b/src/main/java/com/github/ucchyocean/lc/command/DenyCommand.java
deleted file mode 100644
index 3839354b..00000000
--- a/src/main/java/com/github/ucchyocean/lc/command/DenyCommand.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * @author ucchy
- * @license LGPLv3
- * @copyright Copyright ucchy 2013
- */
-package com.github.ucchyocean.lc.command;
-
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
-
-import com.github.ucchyocean.lc.channel.ChannelPlayer;
-
-/**
- * denyコマンドの実行クラス
- * @author ucchy
- */
-public class DenyCommand extends SubCommandAbst {
-
- private static final String COMMAND_NAME = "deny";
- private static final String PERMISSION_NODE = "lunachat." + COMMAND_NAME;
- private static final String USAGE_KEY = "usageDeny";
-
- /**
- * コマンドを取得します。
- * @return コマンド
- * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandName()
- */
- @Override
- public String getCommandName() {
- return COMMAND_NAME;
- }
-
- /**
- * パーミッションノードを取得します。
- * @return パーミッションノード
- * @see com.github.ucchyocean.lc.command.SubCommandAbst#getPermissionNode()
- */
- @Override
- public String getPermissionNode() {
- return PERMISSION_NODE;
- }
-
- /**
- * コマンドの種別を取得します。
- * @return コマンド種別
- * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandType()
- */
- @Override
- public CommandType getCommandType() {
- return CommandType.USER;
- }
-
- /**
- * 使用方法に関するメッセージをsenderに送信します。
- * @param sender コマンド実行者
- * @param label 実行ラベル
- * @see com.github.ucchyocean.lc.command.SubCommandAbst#sendUsageMessage()
- */
- @Override
- public void sendUsageMessage(
- CommandSender sender, String label) {
- sendResourceMessage(sender, "", USAGE_KEY, label);
- }
-
- /**
- * コマンドを実行します。
- * @param sender コマンド実行者
- * @param label 実行ラベル
- * @param args 実行時の引数
- * @return コマンドが実行されたかどうか
- * @see com.github.ucchyocean.lc.command.SubCommandAbst#runCommand(java.lang.String[])
- */
- @Override
- public boolean runCommand(CommandSender sender, String label, String[] args) {
-
- // プレイヤーでなければ終了する
- if (!(sender instanceof Player)) {
- sendResourceMessage(sender, PREERR, "errmsgIngame");
- return true;
- }
-
- // 招待を受けていないプレイヤーなら、エラーを表示して終了する
- Player player = (Player) sender;
- if (!DataMaps.inviteMap.containsKey(player.getName())) {
- sendResourceMessage(sender, PREERR, "errmsgNotInvited");
- return true;
- }
-
- // 招待者を取得して、招待記録を消去する
- String inviterName = DataMaps.inviterMap.get(player.getName());
- DataMaps.inviteMap.remove(player.getName());
- DataMaps.inviterMap.remove(player.getName());
-
- // メッセージ送信
- sendResourceMessage(sender, PREINFO, "cmdmsgDeny");
- ChannelPlayer inviter = ChannelPlayer.getChannelPlayer(inviterName);
- if (inviter != null) {
- sendResourceMessage(inviter, PREINFO, "cmdmsgDenyed");
- }
- return true;
- }
-
-}
diff --git a/src/main/java/com/github/ucchyocean/lc/command/LunaChatJapanizeCommand.java b/src/main/java/com/github/ucchyocean/lc/command/LunaChatJapanizeCommand.java
deleted file mode 100644
index 0ded70be..00000000
--- a/src/main/java/com/github/ucchyocean/lc/command/LunaChatJapanizeCommand.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * @author ucchy
- * @license LGPLv3
- * @copyright Copyright ucchy 2013
- */
-package com.github.ucchyocean.lc.command;
-
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandExecutor;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
-
-import com.github.ucchyocean.lc.LunaChat;
-import com.github.ucchyocean.lc.LunaChatAPI;
-import com.github.ucchyocean.lc.Resources;
-import com.github.ucchyocean.lc.channel.ChannelPlayer;
-
-/**
- * Japanize変換設定コマンド
- * @author ucchy
- */
-public class LunaChatJapanizeCommand implements CommandExecutor {
-
- private static final String PERM_JAPANIZE_OTHER = "lunachat-admin.japanize-other";
-
- private static final String PREINFO = Resources.get("infoPrefix");
- private static final String PREERR = Resources.get("errorPrefix");
-
- /**
- * @see org.bukkit.command.CommandExecutor#onCommand(org.bukkit.command.CommandSender, org.bukkit.command.Command, java.lang.String, java.lang.String[])
- */
- @Override
- public boolean onCommand(CommandSender sender, Command command,
- String label, String[] args) {
-
- if ( args.length == 1 &&
- (args[0].equalsIgnoreCase("on") || args[0].equalsIgnoreCase("off")) ) {
- // japanize on/off の実行
-
- // プレイヤーでなければ終了する
- if (!(sender instanceof Player)) {
- sendResourceMessage(sender, PREERR, "errmsgIngame");
- return true;
- }
- Player player = (Player)sender;
-
- // Japanize設定をon/offにする
- boolean value = args[0].equalsIgnoreCase("on");
- LunaChatAPI api = LunaChat.getInstance().getLunaChatAPI();
- api.setPlayersJapanize(player.getName(), value);
-
- sendResourceMessage(sender, PREINFO,
- "cmdmsgPlayerJapanize", args[0]);
- return true;
-
- } else if ( args.length == 2 &&
- (args[1].equalsIgnoreCase("on") || args[1].equalsIgnoreCase("off")) ) {
- // japanize (player) on/off の実行
-
- // 権限チェック
- if ( !sender.hasPermission(PERM_JAPANIZE_OTHER) ) {
- sendResourceMessage(sender, PREERR,
- "errmsgNotPermission", PERM_JAPANIZE_OTHER);
- return true;
- }
-
- // 指定されたプレイヤーが存在するかチェック
- ChannelPlayer target = ChannelPlayer.getChannelPlayer(args[0]);
- if ( target == null || !target.isOnline() ) {
- sendResourceMessage(sender, PREERR,
- "errmsgNotfoundPlayer", args[0]);
- return true;
- }
-
- // Japanize設定をon/offにする
- boolean value = args[1].equalsIgnoreCase("on");
- LunaChatAPI api = LunaChat.getInstance().getLunaChatAPI();
- api.setPlayersJapanize(target.getName(), value);
-
- sendResourceMessage(target, PREINFO,
- "cmdmsgPlayerJapanize", args[1]);
- sendResourceMessage(sender, PREINFO,
- "cmdmsgPlayerJapanizeOther", args[0], args[1]);
- return true;
- }
-
- // usageを表示して終了する
- printUsage(sender, label);
- return true;
- }
-
- /**
- * コマンドの使い方を senderに送る
- * @param sender
- * @param label
- */
- private void printUsage(CommandSender sender, String label) {
- sendResourceMessage(sender, "", "usageJapanize", label);
- if ( sender.hasPermission(PERM_JAPANIZE_OTHER) ) {
- sendResourceMessage(sender, "", "usageJapanizeOther", label);
- }
- }
-
- /**
- * メッセージリソースのメッセージを、カラーコード置き換えしつつ、senderに送信する
- * @param sender メッセージの送り先
- * @param pre プレフィックス
- * @param key リソースキー
- * @param args リソース内の置き換え対象キーワード
- */
- protected void sendResourceMessage(CommandSender sender, String pre,
- String key, Object... args) {
-
- String org = Resources.get(key);
- if ( org == null || org.equals("") ) {
- return;
- }
- String msg = String.format(pre + org, args);
- sender.sendMessage(msg);
- }
-
- /**
- * メッセージリソースのメッセージを、カラーコード置き換えしつつ、senderに送信する
- * @param cp メッセージの送り先
- * @param pre プレフィックス
- * @param key リソースキー
- * @param args リソース内の置き換え対象キーワード
- */
- protected void sendResourceMessage(ChannelPlayer cp, String pre,
- String key, Object... args) {
-
- String org = Resources.get(key);
- if ( org == null || org.equals("") ) {
- return;
- }
- String msg = String.format(pre + org, args);
- cp.sendMessage(msg);
- }
-}
diff --git a/src/main/java/com/github/ucchyocean/lc/command/LunaChatMessageCommand.java b/src/main/java/com/github/ucchyocean/lc/command/LunaChatMessageCommand.java
deleted file mode 100644
index 3c2551a6..00000000
--- a/src/main/java/com/github/ucchyocean/lc/command/LunaChatMessageCommand.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * @author ucchy
- * @license LGPLv3
- * @copyright Copyright ucchy 2013
- */
-package com.github.ucchyocean.lc.command;
-
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandExecutor;
-import org.bukkit.command.CommandSender;
-
-import com.github.ucchyocean.lc.LunaChat;
-import com.github.ucchyocean.lc.LunaChatAPI;
-import com.github.ucchyocean.lc.Resources;
-import com.github.ucchyocean.lc.channel.Channel;
-import com.github.ucchyocean.lc.channel.ChannelPlayer;
-
-/**
- * 1:1チャット送信コマンド
- * @author ucchy
- */
-public class LunaChatMessageCommand implements CommandExecutor {
-
- private static final String PREERR = Resources.get("errorPrefix");
-
- /**
- * @see org.bukkit.command.CommandExecutor#onCommand(org.bukkit.command.CommandSender, org.bukkit.command.Command, java.lang.String, java.lang.String[])
- */
- @Override
- public boolean onCommand(CommandSender sender, Command command,
- String label, String[] args) {
-
- // senderからChannelPlayerを作成する
- ChannelPlayer inviter = ChannelPlayer.getChannelPlayer(sender);
-
- // 引数が無ければ、usageを表示して終了する
- if (args.length == 0) {
- printUsage(sender, label);
- return true;
- }
-
- // 実行引数から1:1チャットの相手を取得する
- String invitedName = "";
- StringBuilder message = new StringBuilder();
- if (args.length >= 1) {
- invitedName = args[0];
- if ( args.length >= 2 ) {
- for ( int i=1; i" + invited.getName();
- Channel channel = api.getChannel(cname);
- if ( channel == null ) {
- // チャンネルを作成して、送信者、受信者をメンバーにする
- channel = api.createChannel(cname);
- channel.setVisible(false);
- channel.addMember(inviter);
- channel.addMember(invited);
- channel.setPrivateMessageTo(invited.getName());
- }
-
- // メッセージがあるなら送信する
- if ( message.trim().length() > 0 ) {
- channel.chat(inviter, message);
- }
-
- // 送信履歴を残す
- DataMaps.privateMessageMap.put(
- invited.getName(), inviter.getName());
- DataMaps.privateMessageMap.put(
- inviter.getName(), invited.getName());
-
- return;
- }
-
- /**
- * コマンドの使い方を senderに送る
- * @param sender
- * @param label
- */
- private void printUsage(CommandSender sender, String label) {
- sendResourceMessage(sender, "", "usageMessage", label);
- }
-
- /**
- * メッセージリソースのメッセージを、カラーコード置き換えしつつ、senderに送信する
- * @param sender メッセージの送り先
- * @param pre プレフィックス
- * @param key リソースキー
- * @param args リソース内の置き換え対象キーワード
- */
- protected void sendResourceMessage(CommandSender sender, String pre,
- String key, Object... args) {
-
- String org = Resources.get(key);
- if ( org == null || org.equals("") ) {
- return;
- }
- String msg = String.format(pre + org, args);
- sender.sendMessage(msg);
- }
-
- /**
- * メッセージリソースのメッセージを、カラーコード置き換えしつつ、senderに送信する
- * @param sender メッセージの送り先
- * @param pre プレフィックス
- * @param key リソースキー
- * @param args リソース内の置き換え対象キーワード
- */
- protected void sendResourceMessage(ChannelPlayer cp, String pre,
- String key, Object... args) {
-
- String org = Resources.get(key);
- if ( org == null || org.equals("") ) {
- return;
- }
- String msg = String.format(pre + org, args);
- cp.sendMessage(msg);
- }
-}
diff --git a/src/main/java/com/github/ucchyocean/lc/command/LunaChatReplyCommand.java b/src/main/java/com/github/ucchyocean/lc/command/LunaChatReplyCommand.java
deleted file mode 100644
index 3e98f231..00000000
--- a/src/main/java/com/github/ucchyocean/lc/command/LunaChatReplyCommand.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * @author ucchy
- * @license LGPLv3
- * @copyright Copyright ucchy 2013
- */
-package com.github.ucchyocean.lc.command;
-
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-
-import com.github.ucchyocean.lc.Resources;
-import com.github.ucchyocean.lc.channel.ChannelPlayer;
-
-/**
- * 1:1チャット受信コマンド
- * @author ucchy
- */
-public class LunaChatReplyCommand extends LunaChatMessageCommand {
-
- private static final String PREINFO = Resources.get("infoPrefix");
- private static final String PREERR = Resources.get("errorPrefix");
-
- /**
- * @see org.bukkit.command.CommandExecutor#onCommand(org.bukkit.command.CommandSender, org.bukkit.command.Command, java.lang.String, java.lang.String[])
- */
- @Override
- public boolean onCommand(CommandSender sender, Command command,
- String label, String[] args) {
-
- // senderからChannelPlayerを作成する
- ChannelPlayer inviter = ChannelPlayer.getChannelPlayer(sender);
-
- // 会話相手を履歴から取得する
- String invitedName = DataMaps.privateMessageMap.get(inviter.getName());
-
- // 引数が無ければ、現在の会話相手を表示して終了する
- if (args.length == 0) {
- if ( invitedName == null ) {
- sendResourceMessage(sender, PREINFO,
- "cmdmsgReplyInviterNone", inviter.getName());
- } else {
- sendResourceMessage(sender, PREINFO,
- "cmdmsgReplyInviter", inviter.getName(), invitedName);
- }
- return true;
- }
-
- // 会話相手がからっぽなら、コマンドを終了する。
- if ( invitedName == null ) {
- sendResourceMessage(sender, PREERR, "errmsgNotfoundPM");
- return true;
- }
-
- // メッセージを取得する
- StringBuilder message = new StringBuilder();
- for ( int i=0; i TABLE;
- static {
- TABLE = new HashMap();
- TABLE.put( "", new String[]{"あ","い","う","え","お"});
- TABLE.put( "k", new String[]{"か","き","く","け","こ"});
- TABLE.put( "s", new String[]{"さ","し","す","せ","そ"});
- TABLE.put( "t", new String[]{"た","ち","つ","て","と"});
- TABLE.put( "n", new String[]{"な","に","ぬ","ね","の"});
- TABLE.put( "h", new String[]{"は","ひ","ふ","へ","ほ"});
- TABLE.put( "m", new String[]{"ま","み","む","め","も"});
- TABLE.put( "y", new String[]{"や","い","ゆ","いぇ","よ"});
- TABLE.put( "r", new String[]{"ら","り","る","れ","ろ"});
- TABLE.put( "w", new String[]{"わ","うぃ","う","うぇ","を"});
- TABLE.put( "g", new String[]{"が","ぎ","ぐ","げ","ご"});
- TABLE.put( "z", new String[]{"ざ","じ","ず","ぜ","ぞ"});
- TABLE.put( "j", new String[]{"じゃ","じ","じゅ","じぇ","じょ"});
- TABLE.put( "d", new String[]{"だ","ぢ","づ","で","ど"});
- TABLE.put( "b", new String[]{"ば","び","ぶ","べ","ぼ"});
- TABLE.put( "p", new String[]{"ぱ","ぴ","ぷ","ぺ","ぽ"});
- TABLE.put("gy", new String[]{"ぎゃ","ぎぃ","ぎゅ","ぎぇ","ぎょ"});
- TABLE.put("gw", new String[]{"ぐぁ","ぐぃ","ぐぅ","ぐぇ","ぐぉ"});
- TABLE.put("zy", new String[]{"じゃ","じぃ","じゅ","じぇ","じょ"});
- TABLE.put("jy", new String[]{"じゃ","じぃ","じゅ","じぇ","じょ"});
- TABLE.put("dy", new String[]{"ぢゃ","ぢぃ","ぢゅ","ぢぇ","ぢょ"});
- TABLE.put("dh", new String[]{"でゃ","でぃ","でゅ","でぇ","でょ"});
- TABLE.put("dw", new String[]{"どぁ","どぃ","どぅ","どぇ","どぉ"});
- TABLE.put("by", new String[]{"びゃ","びぃ","びゅ","びぇ","びょ"});
- TABLE.put("py", new String[]{"ぴゃ","ぴぃ","ぴゅ","ぴぇ","ぴょ"});
- TABLE.put( "v", new String[]{"ヴぁ","ヴぃ","ヴ","ヴぇ","ヴぉ"});
- TABLE.put("vy", new String[]{"ヴゃ","ヴぃ","ヴゅ","ヴぇ","ヴょ"});
- TABLE.put("sh", new String[]{"しゃ","し","しゅ","しぇ","しょ"});
- TABLE.put("sy", new String[]{"しゃ","し","しゅ","しぇ","しょ"});
- TABLE.put( "c", new String[]{"か","し","く","せ","こ"});
- TABLE.put("ch", new String[]{"ちゃ","ち","ちゅ","ちぇ","ちょ"});
- TABLE.put("cy", new String[]{"ちゃ","ち","ちゅ","ちぇ","ちょ"});
- TABLE.put( "f", new String[]{"ふぁ","ふぃ","ふ","ふぇ","ふぉ"});
- TABLE.put("fy", new String[]{"ふゃ","ふぃ","ふゅ","ふぇ","ふょ"});
- TABLE.put("fw", new String[]{"ふぁ","ふぃ","ふ","ふぇ","ふぉ"});
- TABLE.put( "q", new String[]{"くぁ","くぃ","く","くぇ","くぉ"});
- TABLE.put("ky", new String[]{"きゃ","きぃ","きゅ","きぇ","きょ"});
- TABLE.put("kw", new String[]{"くぁ","くぃ","く","くぇ","くぉ"});
- TABLE.put("ty", new String[]{"ちゃ","ちぃ","ちゅ","ちぇ","ちょ"});
- TABLE.put("ts", new String[]{"つぁ","つぃ","つ","つぇ","つぉ"});
- TABLE.put("th", new String[]{"てゃ","てぃ","てゅ","てぇ","てょ"});
- TABLE.put("tw", new String[]{"とぁ","とぃ","とぅ","とぇ","とぉ"});
- TABLE.put("ny", new String[]{"にゃ","にぃ","にゅ","にぇ","にょ"});
- TABLE.put("hy", new String[]{"ひゃ","ひぃ","ひゅ","ひぇ","ひょ"});
- TABLE.put("my", new String[]{"みゃ","みぃ","みゅ","みぇ","みょ"});
- TABLE.put("ry", new String[]{"りゃ","りぃ","りゅ","りぇ","りょ"});
- TABLE.put( "l", new String[]{"ぁ","ぃ","ぅ","ぇ","ぉ"});
- TABLE.put( "x", new String[]{"ぁ","ぃ","ぅ","ぇ","ぉ"});
- TABLE.put("ly", new String[]{"ゃ","ぃ","ゅ","ぇ","ょ"});
- TABLE.put("lt", new String[]{"た","ち","っ","て","と"});
- TABLE.put("lk", new String[]{"ヵ","き","く","ヶ","こ"});
- TABLE.put("xy", new String[]{"ゃ","ぃ","ゅ","ぇ","ょ"});
- TABLE.put("xt", new String[]{"た","ち","っ","て","と"});
- TABLE.put("xk", new String[]{"ヵ","き","く","ヶ","こ"});
- TABLE.put("wy", new String[]{"わ","ゐ","う","ゑ","を"});
- TABLE.put("wh", new String[]{"うぁ","うぃ","う","うぇ","うぉ"});
- };
-
- private static String getKanaFromTable(String s, int n) {
-
- if ( TABLE.containsKey(s) ) {
- return TABLE.get(s)[n];
- }
- return s + TABLE.get("")[n];
- }
-
- /**
- * ローマ字をかな文字へ変換する
- * @param org 変換元文字列
- * @return 変換後の文字列
- */
- public static String conv(String org) {
-
- String last = "";
- StringBuilder line = new StringBuilder();
-
- for ( int i=0; i") ) {
- line.append(last + ">");
- last = "";
- } else if ( tmp.equals("&") ) {
- line.append(last + "&");
- last = "";
- } else if ( tmp.equals("\"") ) {
- line.append(last + "”");
- last = "";
- } else if ( tmp.equals("(") || tmp.equals(")") ) {
- line.append(last);
- last = "";
- } else {
- line.append(last + tmp);
- last = "";
- }
- }
- }
- }
- line.append(last);
-
- return line.toString();
- }
-}
diff --git a/src/main/java/com/github/ucchyocean/lc3/ChatColor.java b/src/main/java/com/github/ucchyocean/lc3/ChatColor.java
new file mode 100644
index 00000000..eaca3018
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc3/ChatColor.java
@@ -0,0 +1,71 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc3;
+
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * チャットカラー
+ * @author ucchy
+ */
+public enum ChatColor {
+
+ BLACK('0', 0x00),
+ DARK_BLUE('1', 0x1),
+ DARK_GREEN('2', 0x2),
+ DARK_AQUA('3', 0x3),
+ DARK_RED('4', 0x4),
+ DARK_PURPLE('5', 0x5),
+ GOLD('6', 0x6),
+ GRAY('7', 0x7),
+ DARK_GRAY('8', 0x8),
+ BLUE('9', 0x9),
+ GREEN('a', 0xA),
+ AQUA('b', 0xB),
+ RED('c', 0xC),
+ LIGHT_PURPLE('d', 0xD),
+ YELLOW('e', 0xE),
+ WHITE('f', 0xF),
+ MAGIC('k', 0x10, true),
+ BOLD('l', 0x11, true),
+ STRIKETHROUGH('m', 0x12, true),
+ UNDERLINE('n', 0x13, true),
+ ITALIC('o', 0x14, true),
+ RESET('r', 0x15);
+
+ public static final char COLOR_CHAR = '\u00A7';
+
+ @SuppressWarnings("unused")
+ private final int intCode;
+ private final char code;
+ private final boolean isFormat;
+ private final String toString;
+
+ private ChatColor(char code, int intCode) {
+ this(code, intCode, false);
+ }
+
+ private ChatColor(char code, int intCode, boolean isFormat) {
+ this.code = code;
+ this.intCode = intCode;
+ this.isFormat = isFormat;
+ this.toString = new String(new char[] {COLOR_CHAR, code});
+ }
+
+ public char getChar() {
+ return code;
+ }
+
+ @NotNull
+ @Override
+ public String toString() {
+ return toString;
+ }
+
+ public boolean isFormat() {
+ return isFormat;
+ }
+}
diff --git a/src/main/java/com/github/ucchyocean/lc3/EventPriority.java b/src/main/java/com/github/ucchyocean/lc3/EventPriority.java
new file mode 100644
index 00000000..509ee5f9
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc3/EventPriority.java
@@ -0,0 +1,19 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc3;
+
+/**
+ * Event優先度列挙子
+ * @author ucchy
+ */
+public enum EventPriority {
+ LOWEST,
+ LOW,
+ NORMAL,
+ HIGH,
+ HIGHEST,
+ MONITOR,
+}
diff --git a/src/main/java/com/github/ucchyocean/lc/ExpireCheckTask.java b/src/main/java/com/github/ucchyocean/lc3/ExpireCheckTask.java
similarity index 51%
rename from src/main/java/com/github/ucchyocean/lc/ExpireCheckTask.java
rename to src/main/java/com/github/ucchyocean/lc3/ExpireCheckTask.java
index 24b195a7..32c1385a 100644
--- a/src/main/java/com/github/ucchyocean/lc/ExpireCheckTask.java
+++ b/src/main/java/com/github/ucchyocean/lc3/ExpireCheckTask.java
@@ -1,19 +1,17 @@
/*
* @author ucchy
* @license LGPLv3
- * @copyright Copyright ucchy 2014
+ * @copyright Copyright ucchy 2020
*/
-package com.github.ucchyocean.lc;
+package com.github.ucchyocean.lc3;
-import org.bukkit.scheduler.BukkitRunnable;
-
-import com.github.ucchyocean.lc.channel.Channel;
+import com.github.ucchyocean.lc3.channel.Channel;
/**
* 各チャンネルの期限付きBANや期限付きMuteを、1分間隔で確認しに行くタスク
* @author ucchy
*/
-public class ExpireCheckTask extends BukkitRunnable {
+public class ExpireCheckTask implements Runnable {
/**
* 1分ごとに呼び出されるメソッド
@@ -21,8 +19,7 @@ public class ExpireCheckTask extends BukkitRunnable {
*/
@Override
public void run() {
- for ( Channel channel :
- LunaChat.getInstance().getLunaChatAPI().getChannels() ) {
+ for ( Channel channel : LunaChat.getAPI().getChannels() ) {
channel.checkExpires();
}
}
diff --git a/src/main/java/com/github/ucchyocean/lc3/LunaChat.java b/src/main/java/com/github/ucchyocean/lc3/LunaChat.java
new file mode 100644
index 00000000..987d0d57
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc3/LunaChat.java
@@ -0,0 +1,73 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc3;
+
+import java.io.File;
+
+import com.github.ucchyocean.lc3.event.EventSenderInterface;
+
+/**
+ * LunaChat
+ * @author ucchy
+ */
+public class LunaChat {
+
+ private static PluginInterface instance;
+ private static LunaChatMode mode;
+ private static EventSenderInterface esender;
+
+ static void setPlugin(PluginInterface plugin) {
+ instance = plugin;
+ }
+
+ public static PluginInterface getPlugin() {
+ return instance;
+ }
+
+ static void setMode(LunaChatMode _mode) {
+ mode = _mode;
+ }
+
+ public static LunaChatMode getMode() {
+ return mode;
+ }
+
+ static void setEventSender(EventSenderInterface eventSender) {
+ esender = eventSender;
+ }
+
+ public static EventSenderInterface getEventSender() {
+ return esender;
+ }
+
+ public static File getDataFolder() {
+ return instance.getDataFolder();
+ }
+
+ public static File getPluginJarFile() {
+ return instance.getPluginJarFile();
+ }
+
+ public static LunaChatConfig getConfig() {
+ return instance.getLunaChatConfig();
+ }
+
+ public static LunaChatAPI getAPI() {
+ return instance.getLunaChatAPI();
+ }
+
+ public static LunaChatLogger getNormalChatLogger() {
+ return instance.getNormalChatLogger();
+ }
+
+ public static UUIDCacheData getUUIDCacheData() {
+ return instance.getUUIDCacheData();
+ }
+
+ public static void runAsyncTask(Runnable task) {
+ instance.runAsyncTask(task);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/github/ucchyocean/lc3/LunaChatAPI.java b/src/main/java/com/github/ucchyocean/lc3/LunaChatAPI.java
new file mode 100644
index 00000000..71ca3a81
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc3/LunaChatAPI.java
@@ -0,0 +1,192 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc3;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+import com.github.ucchyocean.lc3.channel.Channel;
+import com.github.ucchyocean.lc3.japanize.JapanizeType;
+import com.github.ucchyocean.lc3.member.ChannelMember;
+
+/**
+ * LunaChat APIクラス
+ * @author ucchy
+ */
+public interface LunaChatAPI {
+
+ /**
+ * 指定したチャンネル名が存在するかどうかを返す
+ * @param channelName チャンネル名
+ * @return 存在するかどうか
+ */
+ public boolean isExistChannel(String channelName);
+
+ /**
+ * 全てのチャンネルを返す
+ * @return 全てのチャンネル
+ */
+ public Collection getChannels();
+
+ /**
+ * プレイヤーが参加しているチャンネルを返す
+ * @param playerName プレイヤー名
+ * @return チャンネル
+ */
+ public Collection getChannelsByPlayer(String playerName);
+
+ /**
+ * プレイヤーが参加しているデフォルトのチャンネルを返す
+ * @param playerName プレイヤー
+ * @return チャンネル
+ */
+ public Channel getDefaultChannel(String playerName);
+
+ /**
+ * プレイヤーのデフォルトチャンネルを設定する
+ * @param playerName プレイヤー
+ * @param channelName チャンネル名
+ */
+ public void setDefaultChannel(String playerName, String channelName);
+
+ /**
+ * 指定した名前のプレイヤーに設定されている、デフォルトチャンネルを削除する
+ * @param playerName プレイヤー名
+ */
+ public void removeDefaultChannel(String playerName);
+
+ /**
+ * チャンネルを取得する
+ * @param channelName チャンネル名
+ * @return チャンネル
+ */
+ public Channel getChannel(String channelName);
+
+ /**
+ * 新しいチャンネルを作成する
+ * @param channelName チャンネル名
+ * @return 作成されたチャンネル
+ */
+ public Channel createChannel(String channelName);
+
+ /**
+ * 新しいチャンネルを作成する
+ * @param channelName チャンネル名
+ * @param member チャンネルを作成した人
+ * @return 作成されたチャンネル
+ */
+ public Channel createChannel(String channelName, ChannelMember member);
+
+ /**
+ * チャンネルを削除する
+ * @param channelName 削除するチャンネル名
+ * @return 削除したかどうか
+ */
+ public boolean removeChannel(String channelName);
+
+ /**
+ * チャンネルを削除する
+ * @param channelName 削除するチャンネル名
+ * @param member チャンネルを削除した人
+ * @return 削除したかどうか
+ */
+ public boolean removeChannel(String channelName, ChannelMember member);
+
+ /**
+ * テンプレートを取得する
+ * @param id テンプレートID
+ * @return テンプレート
+ */
+ public String getTemplate(String id);
+
+ /**
+ * テンプレートを登録する
+ * @param id テンプレートID
+ * @param template テンプレート
+ */
+ public void setTemplate(String id, String template);
+
+ /**
+ * テンプレートを削除する
+ * @param id テンプレートID
+ */
+ public void removeTemplate(String id);
+
+ /**
+ * 辞書データを全て取得する
+ * @return 辞書データ
+ */
+ public Map getAllDictionary();
+
+ /**
+ * 新しい辞書データを追加する
+ * @param key キー
+ * @param value 値
+ */
+ public void setDictionary(String key, String value);
+
+ /**
+ * 指定したキーの辞書データを削除する
+ * @param key キー
+ */
+ public void removeDictionary(String key);
+
+ /**
+ * 該当のプレイヤーに関連するhidelistを取得する。
+ * @param key プレイヤー
+ * @return 指定されたプレイヤーをhideしているプレイヤー(非null)
+ */
+ public List getHidelist(ChannelMember key);
+
+ /**
+ * 該当のプレイヤーがhideしているプレイヤーのリストを返す。
+ * @param player プレイヤー
+ * @return 指定したプレイヤーがhideしているプレイヤーのリスト
+ */
+ public List getHideinfo(ChannelMember player);
+
+ /**
+ * 指定されたプレイヤーが、指定されたプレイヤーをhideするように設定する。
+ * @param player hideする側のプレイヤー
+ * @param hided hideされる側のプレイヤー
+ */
+ public void addHidelist(ChannelMember player, ChannelMember hided);
+
+ /**
+ * 指定されたプレイヤーが、指定されたプレイヤーのhideを解除するように設定する。
+ * @param player hideしていた側のプレイヤー
+ * @param hided hideされていた側のプレイヤー
+ */
+ public void removeHidelist(ChannelMember player, ChannelMember hided);
+
+ /**
+ * Japanize変換を行う
+ * @param message 変換するメッセージ
+ * @param type 変換タイプ
+ * @return 変換後のメッセージ、ただしイベントでキャンセルされた場合はnullが返されるので注意
+ */
+ public String japanize(String message, JapanizeType type);
+
+ /**
+ * 該当プレイヤーのJapanize変換をオン/オフする
+ * @param playerName 設定するプレイヤー名
+ * @param doJapanize Japanize変換するかどうか
+ */
+ public void setPlayersJapanize(String playerName, boolean doJapanize);
+
+ /**
+ * プレイヤーのJapanize設定を返す
+ * @param playerName プレイヤー名
+ * @return Japanize設定
+ */
+ public boolean isPlayerJapanize(String playerName);
+
+ /**
+ * LunaChatの全データを再読み込みする
+ */
+ public void reloadAllData();
+}
diff --git a/src/main/java/com/github/ucchyocean/lc3/LunaChatBukkit.java b/src/main/java/com/github/ucchyocean/lc3/LunaChatBukkit.java
new file mode 100644
index 00000000..6d74a8c9
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc3/LunaChatBukkit.java
@@ -0,0 +1,293 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc3;
+
+import java.io.File;
+import java.util.List;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.logging.Level;
+
+import org.bukkit.Bukkit;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+import org.bukkit.plugin.Plugin;
+import org.bukkit.plugin.java.JavaPlugin;
+import org.bukkit.scheduler.BukkitTask;
+
+import com.github.ucchyocean.lc3.bridge.DynmapBridge;
+import com.github.ucchyocean.lc3.bridge.McMMOBridge;
+import com.github.ucchyocean.lc3.bridge.MultiverseCoreBridge;
+import com.github.ucchyocean.lc3.bridge.VaultChatBridge;
+import com.github.ucchyocean.lc3.bukkit.BukkitEventListener;
+import com.github.ucchyocean.lc3.bukkit.BukkitEventSender;
+import com.github.ucchyocean.lc3.channel.ChannelManager;
+import com.github.ucchyocean.lc3.command.LunaChatCommand;
+import com.github.ucchyocean.lc3.command.LunaChatJapanizeCommand;
+import com.github.ucchyocean.lc3.command.LunaChatMessageCommand;
+import com.github.ucchyocean.lc3.command.LunaChatReplyCommand;
+import com.github.ucchyocean.lc3.member.ChannelMember;
+
+/**
+ * LunaChatのBukkit実装
+ * @author ucchy
+ */
+public class LunaChatBukkit extends JavaPlugin implements PluginInterface {
+
+ private static LunaChatBukkit instance;
+
+ private LunaChatConfig config;
+ private ChannelManager manager;
+ private UUIDCacheData uuidCacheData;
+
+ private VaultChatBridge vaultchat;
+ private DynmapBridge dynmap;
+ private MultiverseCoreBridge multiverse;
+
+ private BukkitTask expireCheckerTask;
+ private LunaChatLogger normalChatLogger;
+
+ private LunaChatCommand lunachatCommand;
+ private LunaChatMessageCommand messageCommand;
+ private LunaChatReplyCommand replyCommand;
+ private LunaChatJapanizeCommand lcjapanizeCommand;
+
+ /**
+ * プラグインが有効化されたときに呼び出されるメソッド
+ * @see org.bukkit.plugin.java.JavaPlugin#onEnable()
+ */
+ @Override
+ public void onEnable() {
+
+ LunaChat.setPlugin(this);
+ LunaChat.setMode(LunaChatMode.BUKKIT);
+
+ // 変数などの初期化
+ config = new LunaChatConfig(getDataFolder(), getFile());
+ uuidCacheData = new UUIDCacheData(getDataFolder());
+ Messages.initialize(new File(getDataFolder(), "messages"), getFile(), config.getLang());
+ manager = new ChannelManager();
+ normalChatLogger = new LunaChatLogger("==normalchat");
+
+ // チャンネルチャット無効なら、デフォルト発言先をクリアする(see issue #59)
+ if ( !config.isEnableChannelChat() ) {
+ manager.removeAllDefaultChannels();
+ }
+
+ // Vault のロード
+ Plugin temp = getServer().getPluginManager().getPlugin("Vault");
+ if ( temp != null ) {
+ vaultchat = VaultChatBridge.load(temp);
+ }
+
+ // Dynmap のロード
+ temp = getServer().getPluginManager().getPlugin("dynmap");
+ if ( temp != null ) {
+ dynmap = DynmapBridge.load(temp);
+ if ( dynmap != null ) {
+ getServer().getPluginManager().registerEvents(dynmap, this);
+ }
+ }
+
+ // MultiverseCore のロード
+ temp = getServer().getPluginManager().getPlugin("Multiverse-Core");
+ if ( temp != null ) {
+ multiverse = MultiverseCoreBridge.load(temp);
+ }
+
+ // mcMMOのロード
+ if ( getServer().getPluginManager().isPluginEnabled("mcMMO") ) {
+ getServer().getPluginManager().registerEvents(new McMMOBridge(), this);
+ }
+
+ // リスナーの登録
+ getServer().getPluginManager().registerEvents(new BukkitEventListener(), this);
+
+ // コマンドの登録
+ lunachatCommand = new LunaChatCommand();
+ messageCommand = new LunaChatMessageCommand();
+ replyCommand = new LunaChatReplyCommand();
+ lcjapanizeCommand = new LunaChatJapanizeCommand();
+
+ // 期限チェッカータスクの起動
+ expireCheckerTask = Bukkit.getScheduler().runTaskTimerAsynchronously(
+ this, new ExpireCheckTask(), 100, 600);
+
+ // イベント実行クラスの登録
+ LunaChat.setEventSender(new BukkitEventSender());
+ }
+
+ /**
+ * プラグインが無効化されたときに呼び出されるメソッド
+ * @see org.bukkit.plugin.java.JavaPlugin#onDisable()
+ */
+ @Override
+ public void onDisable() {
+
+ // 期限チェッカータスクの停止
+ if ( expireCheckerTask != null ) {
+ expireCheckerTask.cancel();
+ }
+ }
+
+ /**
+ * コマンド実行時に呼び出されるメソッド
+ * @see org.bukkit.plugin.java.JavaPlugin#onCommand(org.bukkit.command.CommandSender, org.bukkit.command.Command, java.lang.String, java.lang.String[])
+ */
+ @Override
+ public boolean onCommand(
+ CommandSender sender, Command command, String label, String[] args) {
+
+ if ( command.getName().equals("lunachat") ) {
+ return lunachatCommand.execute(ChannelMember.getChannelMember(sender), label, args);
+ } else if ( command.getName().equals("tell") ) {
+ return messageCommand.execute(ChannelMember.getChannelMember(sender), label, args);
+ } else if ( command.getName().equals("reply") ) {
+ return replyCommand.execute(ChannelMember.getChannelMember(sender), label, args);
+ } else if ( command.getName().equals("lcjapanize") ) {
+ return lcjapanizeCommand.execute(ChannelMember.getChannelMember(sender), label, args);
+ }
+
+ return false;
+ }
+
+ /**
+ * TABキー補完が実行されたときに呼び出されるメソッド
+ * @see org.bukkit.plugin.java.JavaPlugin#onTabComplete(org.bukkit.command.CommandSender, org.bukkit.command.Command, java.lang.String, java.lang.String[])
+ */
+ @Override
+ public List onTabComplete(
+ CommandSender sender, Command command, String label, String[] args) {
+
+ List completeList = null;
+ if ( command.getName().equals("lunachat") ) {
+ completeList = lunachatCommand.onTabComplete(ChannelMember.getChannelMember(sender), label, args);
+ }
+ if ( completeList != null ) {
+ return completeList;
+ }
+ return super.onTabComplete(sender, command, label, args);
+ }
+
+ /**
+ * LunaChatのインスタンスを返す
+ * @return LunaChat
+ */
+ public static LunaChatBukkit getInstance() {
+ if ( instance == null ) {
+ instance = (LunaChatBukkit)Bukkit.getPluginManager().getPlugin("LunaChat");
+ }
+ return instance;
+ }
+
+ /**
+ * このプラグインのJarファイル自身を示すFileクラスを返す。
+ * @return Jarファイル
+ */
+ public File getPluginJarFile() {
+ return getFile();
+ }
+
+ /**
+ * LunaChatAPIを取得する
+ * @return LunaChatAPI
+ */
+ public LunaChatAPI getLunaChatAPI() {
+ return manager;
+ }
+
+ /**
+ * LunaChatConfigを取得する
+ * @return LunaChatConfig
+ */
+ public LunaChatConfig getLunaChatConfig() {
+ return config;
+ }
+
+ /**
+ * VaultChat連携クラスを返す
+ * @return VaultChatBridge
+ */
+ public VaultChatBridge getVaultChat() {
+ return vaultchat;
+ }
+
+ /**
+ * Dynmap連携クラスを返す
+ * @return DynmapBridge
+ */
+ public DynmapBridge getDynmap() {
+ return dynmap;
+ }
+
+ /**
+ * MultiverseCore連携クラスを返す
+ * @return MultiverseCoreBridge
+ */
+ public MultiverseCoreBridge getMultiverseCore() {
+ return multiverse;
+ }
+
+ /**
+ * 通常チャット用のロガーを返す
+ * @return normalChatLogger
+ */
+ public LunaChatLogger getNormalChatLogger() {
+ return normalChatLogger;
+ }
+
+ /**
+ * 通常チャット用のロガーを設定する
+ * @param normalChatLogger normalChatLogger
+ */
+ protected void setNormalChatLogger(LunaChatLogger normalChatLogger) {
+ this.normalChatLogger = normalChatLogger;
+ }
+
+ /**
+ * オンラインのプレイヤー名一覧を取得する
+ * @return オンラインのプレイヤー名一覧
+ */
+ @Override
+ public Set getOnlinePlayerNames() {
+ Set list = new TreeSet<>();
+ for ( Player p : Bukkit.getOnlinePlayers() ) {
+ list.add(p.getName());
+ }
+ return list;
+ }
+
+ /**
+ * このプラグインのログを記録する
+ * @param level ログレベル
+ * @param msg ログメッセージ
+ */
+ @Override
+ public void log(Level level, String msg) {
+ getLogger().log(level, msg);
+ }
+
+ /**
+ * UUIDキャッシュデータを取得する
+ * @return UUIDキャッシュデータ
+ * @see com.github.ucchyocean.lc3.PluginInterface#getUUIDCacheData()
+ */
+ @Override
+ public UUIDCacheData getUUIDCacheData() {
+ return uuidCacheData;
+ }
+
+ /**
+ * 非同期タスクを実行する
+ * @param task タスク
+ * @see com.github.ucchyocean.lc3.PluginInterface#runAsyncTask(java.lang.Runnable)
+ */
+ @Override
+ public void runAsyncTask(Runnable task) {
+ Bukkit.getScheduler().runTaskAsynchronously(this, task);
+ }
+}
diff --git a/src/main/java/com/github/ucchyocean/lc3/LunaChatBungee.java b/src/main/java/com/github/ucchyocean/lc3/LunaChatBungee.java
new file mode 100644
index 00000000..746bddd8
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc3/LunaChatBungee.java
@@ -0,0 +1,199 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc3;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.logging.Level;
+
+import com.github.ucchyocean.lc3.bungee.BungeeEventListener;
+import com.github.ucchyocean.lc3.bungee.BungeeEventSender;
+import com.github.ucchyocean.lc3.bungee.JapanizeCommandBungee;
+import com.github.ucchyocean.lc3.bungee.LunaChatCommandBungee;
+import com.github.ucchyocean.lc3.bungee.MessageCommandBungee;
+import com.github.ucchyocean.lc3.bungee.ReplyCommandBungee;
+import com.github.ucchyocean.lc3.channel.ChannelManager;
+
+import net.md_5.bungee.api.ProxyServer;
+import net.md_5.bungee.api.connection.ProxiedPlayer;
+import net.md_5.bungee.api.plugin.Plugin;
+
+/**
+ * LunaChatのBungeeCord実装
+ * @author ucchy
+ */
+public class LunaChatBungee extends Plugin implements PluginInterface {
+
+ private static LunaChatBungee instance;
+
+ private HashMap history;
+ private LunaChatConfig config;
+ private ChannelManager manager;
+ private UUIDCacheData uuidCacheData;
+ private LunaChatLogger normalChatLogger;
+
+ /**
+ * プラグインが有効化されたときに呼び出されるメソッド
+ * @see net.md_5.bungee.api.plugin.Plugin#onEnable()
+ */
+ @Override
+ public void onEnable() {
+
+ LunaChat.setPlugin(this);
+ LunaChat.setMode(LunaChatMode.BUNGEE);
+
+ // 初期化
+ config = new LunaChatConfig(getDataFolder(), getFile());
+ uuidCacheData = new UUIDCacheData(getDataFolder());
+ Messages.initialize(new File(getDataFolder(), "messages"), getFile(), config.getLang());
+ history = new HashMap();
+
+ manager = new ChannelManager();
+ normalChatLogger = new LunaChatLogger("==normalchat");
+
+ // チャンネルチャット無効なら、デフォルト発言先をクリアする
+ if ( !config.isEnableChannelChat() ) {
+ manager.removeAllDefaultChannels();
+ }
+
+ // コマンド登録
+ getProxy().getPluginManager().registerCommand(this,
+ new LunaChatCommandBungee("lunachat", "", "lc", "ch"));
+ getProxy().getPluginManager().registerCommand(this,
+ new MessageCommandBungee("tell", "", "msg", "message", "m", "t"));
+ getProxy().getPluginManager().registerCommand(this,
+ new ReplyCommandBungee("reply", "", "r"));
+ getProxy().getPluginManager().registerCommand(this,
+ new JapanizeCommandBungee("japanize", "", "jp"));
+
+ // リスナー登録
+ getProxy().getPluginManager().registerListener(this, new BungeeEventListener(this));
+
+ // イベント実行クラスの登録
+ LunaChat.setEventSender(new BungeeEventSender());
+ }
+
+ /**
+ * LunaChatのインスタンスを返す
+ * @return LunaChat
+ */
+ public static LunaChatBungee getInstance() {
+ if ( instance == null ) {
+ instance = (LunaChatBungee)ProxyServer.getInstance().getPluginManager().getPlugin("LunaChat");
+ }
+ return instance;
+ }
+
+ /**
+ * コンフィグを返す
+ * @return コンフィグ
+ */
+ public LunaChatConfig getConfig() {
+ return config;
+ }
+
+ /**
+ * プライベートメッセージの受信履歴を記録する
+ * @param reciever 受信者
+ * @param sender 送信者
+ */
+ protected void putHistory(String reciever, String sender) {
+ history.put(reciever, sender);
+ }
+
+ /**
+ * プライベートメッセージの受信履歴を取得する
+ * @param reciever 受信者
+ * @return 送信者
+ */
+ protected String getHistory(String reciever) {
+ return history.get(reciever);
+ }
+
+ /**
+ * このプラグインのJarファイル自身を示すFileクラスを返す。
+ * @return Jarファイル
+ * @see com.github.ucchyocean.lc3.PluginInterface#getPluginJarFile()
+ */
+ @Override
+ public File getPluginJarFile() {
+ return getFile();
+ }
+
+ /**
+ * LunaChatConfigを取得する
+ * @return LunaChatConfig
+ * @see com.github.ucchyocean.lc3.PluginInterface#getLunaChatConfig()
+ */
+ @Override
+ public LunaChatConfig getLunaChatConfig() {
+ return config;
+ }
+
+ /**
+ * LunaChatAPIを取得する
+ * @return LunaChatAPI
+ * @see com.github.ucchyocean.lc3.PluginInterface#getLunaChatAPI()
+ */
+ @Override
+ public LunaChatAPI getLunaChatAPI() {
+ return manager;
+ }
+
+ /**
+ * 通常チャット用のロガーを返す
+ * @return normalChatLogger
+ */
+ @Override
+ public LunaChatLogger getNormalChatLogger() {
+ return normalChatLogger;
+ }
+
+ /**
+ * オンラインのプレイヤー名一覧を取得する
+ * @return オンラインのプレイヤー名一覧
+ */
+ @Override
+ public Set getOnlinePlayerNames() {
+ Set list = new TreeSet<>();
+ for ( ProxiedPlayer p : ProxyServer.getInstance().getPlayers() ) {
+ list.add(p.getName());
+ }
+ return list;
+ }
+
+ /**
+ * このプラグインのログを記録する
+ * @param level ログレベル
+ * @param msg ログメッセージ
+ */
+ @Override
+ public void log(Level level, String msg) {
+ getLogger().log(level, msg);
+ }
+
+ /**
+ * UUIDキャッシュデータを取得する
+ * @return UUIDキャッシュデータ
+ * @see com.github.ucchyocean.lc3.PluginInterface#getUUIDCacheData()
+ */
+ @Override
+ public UUIDCacheData getUUIDCacheData() {
+ return uuidCacheData;
+ }
+
+ /**
+ * 非同期タスクを実行する
+ * @param task タスク
+ * @see com.github.ucchyocean.lc3.PluginInterface#runAsyncTask(java.lang.Runnable)
+ */
+ @Override
+ public void runAsyncTask(Runnable task) {
+ ProxyServer.getInstance().getScheduler().runAsync(this, task);
+ }
+}
diff --git a/src/main/java/com/github/ucchyocean/lc/LunaChatConfig.java b/src/main/java/com/github/ucchyocean/lc3/LunaChatConfig.java
similarity index 91%
rename from src/main/java/com/github/ucchyocean/lc/LunaChatConfig.java
rename to src/main/java/com/github/ucchyocean/lc3/LunaChatConfig.java
index 53fff15e..4b6c0213 100644
--- a/src/main/java/com/github/ucchyocean/lc/LunaChatConfig.java
+++ b/src/main/java/com/github/ucchyocean/lc3/LunaChatConfig.java
@@ -1,19 +1,17 @@
/*
* @author ucchy
* @license LGPLv3
- * @copyright Copyright ucchy 2013
+ * @copyright Copyright ucchy 2020
*/
-package com.github.ucchyocean.lc;
+package com.github.ucchyocean.lc3;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
+import java.util.logging.Level;
import java.util.regex.Pattern;
-import org.bukkit.configuration.file.FileConfiguration;
-import org.bukkit.event.EventPriority;
-
-import com.github.ucchyocean.lc.japanize.JapanizeType;
+import com.github.ucchyocean.lc3.japanize.JapanizeType;
/**
* LunaChatのコンフィグクラス
@@ -21,6 +19,9 @@
*/
public class LunaChatConfig {
+ /** メッセージの言語 */
+ private String lang;
+
/** チャンネルチャット機能を利用可能にするかどうか */
private boolean enableChannelChat;
@@ -33,12 +34,6 @@ public class LunaChatConfig {
/** チャンネルチャットの発言内容を、ログに残すかどうか */
private boolean loggingChat;
- /** チャンネルチャットの発言内容を、HawkEyeに記録するかどうか */
- private boolean loggingChatToHawkEye;
-
- /** チャンネルチャットの発言内容を、Prismに記録するかどうか */
- private boolean loggingChatToPrism;
-
/** チャンネルチャットの発言内容を、コンソールに表示するかどうか */
private boolean displayChatOnConsole;
@@ -145,36 +140,41 @@ public class LunaChatConfig {
* 隠し設定。 */
private int japanizeWait;
+ // === 以下、BungeeCord用設定 ===
+
/**
* コンストラクタ
+ * @param dataFolder コンフィグ格納フォルダ
+ * @param jarFile プラグインJarファイル
*/
- protected LunaChatConfig() {
- reloadConfig();
+ public LunaChatConfig(File dataFolder, File jarFile) {
+ reloadConfig(dataFolder, jarFile);
}
/**
* config.yml を再読み込みする
*/
- public void reloadConfig() {
+ public void reloadConfig(File dataFolder, File jarFile) {
- File configFile = new File(
- LunaChat.getInstance().getDataFolder(), "config.yml");
+ File configFile = new File(dataFolder, "config.yml");
if ( !configFile.exists() ) {
- //LunaChat.instance.saveDefaultConfig();
- Utility.copyFileFromJar(LunaChat.getPluginJarFile(),
- configFile, "config_ja.yml", false);
+ Utility.copyFileFromJar(jarFile, configFile, "config_ja.yml", false);
+ String language = Utility.getDefaultLocale().getLanguage();
+ if ( language.equals("ja") ) {
+ Utility.copyFileFromJar(jarFile, configFile, "config_ja.yml", false);
+ } else {
+ Utility.copyFileFromJar(jarFile, configFile, "config.yml", false);
+ }
}
- LunaChat.getInstance().reloadConfig();
- FileConfiguration config = LunaChat.getInstance().getConfig();
+ YamlConfig config = YamlConfig.load(configFile);
+ lang = config.getString("lang", "en");
enableChannelChat = config.getBoolean("enableChannelChat", true);
playerChatEventListenerPriority
= getEventPriority(config.getString("playerChatEventListenerPriority"), EventPriority.HIGH);
noJoinAsGlobal = config.getBoolean("noJoinAsGlobal", true);
loggingChat = config.getBoolean("loggingChat", true);
- loggingChatToHawkEye = config.getBoolean("loggingChatToHawkEye", true);
- loggingChatToPrism = config.getBoolean("loggingChatToPrism", true);
displayChatOnConsole = config.getBoolean("displayChatOnConsole", true);
globalMarker = config.getString("globalMarker", "!");
zeroMemberRemove = config.getBoolean("zeroMemberRemove", false);
@@ -239,7 +239,7 @@ public void reloadConfig() {
enableNormalChatColorCode =
config.getBoolean("enableNormalChatColorCode", true);
- japanizeType = JapanizeType.fromID(config.getString("japanizeType"), JapanizeType.KANA);
+ japanizeType = JapanizeType.fromID(config.getString("japanizeType"), null);
japanizeDisplayLine = config.getInt("japanizeDisplayLine", 2);
if ( japanizeDisplayLine != 1 && japanizeDisplayLine != 2 ) {
japanizeDisplayLine = 2;
@@ -253,13 +253,21 @@ public void reloadConfig() {
// globalチャンネルが、使用可能なチャンネル名かどうかを調べる
if ( globalChannel != null && !globalChannel.equals("") &&
!globalChannel.matches("[0-9a-zA-Z\\-_]{1,20}") ) {
- String msg = String.format(
- Resources.get("errmsgCannotUseForGlobal"), globalChannel);
- LunaChat.getInstance().getLogger().warning(msg);
+
+ // コンソールに警告を表示する
+ LunaChat.getPlugin().log(Level.WARNING, Messages.errmsgCannotUseForGlobal(globalChannel));
globalChannel = "";
}
}
+ /**
+ * メッセージの言語
+ * @return lang
+ */
+ public String getLang() {
+ return lang;
+ }
+
/**
* チャンネルチャット機能を利用可能にするかどうか
* @return enableChannelChatを返す
@@ -292,22 +300,6 @@ public boolean isLoggingChat() {
return loggingChat;
}
- /**
- * チャンネルチャットの発言内容を、HawkEyeに記録するかどうか
- * @return loggingChatToHawkEye
- */
- public boolean isLoggingChatToHawkEye() {
- return loggingChatToHawkEye;
- }
-
- /**
- * チャンネルチャットの発言内容を、Prismに記録するかどうか
- * @return loggingChatToPrism
- */
- public boolean isLoggingChatToPrism() {
- return loggingChatToPrism;
- }
-
/**
* チャンネルチャットの発言内容を、コンソールに表示するかどうか
* @return displayChatOnConsoleを返す
diff --git a/src/main/java/com/github/ucchyocean/lc/LunaChatLogger.java b/src/main/java/com/github/ucchyocean/lc3/LunaChatLogger.java
similarity index 80%
rename from src/main/java/com/github/ucchyocean/lc/LunaChatLogger.java
rename to src/main/java/com/github/ucchyocean/lc3/LunaChatLogger.java
index f6e6a7fa..240eca03 100644
--- a/src/main/java/com/github/ucchyocean/lc/LunaChatLogger.java
+++ b/src/main/java/com/github/ucchyocean/lc3/LunaChatLogger.java
@@ -1,16 +1,17 @@
/*
* @author ucchy
* @license LGPLv3
- * @copyright Copyright ucchy 2013
+ * @copyright Copyright ucchy 2020
*/
-package com.github.ucchyocean.lc;
+package com.github.ucchyocean.lc3;
import java.io.BufferedReader;
import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.FileWriter;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
@@ -18,9 +19,6 @@
import java.util.Collections;
import java.util.Date;
-import org.bukkit.ChatColor;
-import org.bukkit.scheduler.BukkitRunnable;
-
/**
* LunaChatロガー
* @author ucchy
@@ -61,34 +59,24 @@ public synchronized void log(final String message, final String player) {
checkDir();
// 以降の処理を、発言処理の負荷軽減のため、非同期実行にする。(see issue #40.)
- new BukkitRunnable() {
+ LunaChat.runAsyncTask(new Runnable() {
@Override
public void run() {
- String msg = ChatColor.stripColor(message);
+ String msg = Utility.stripColorCode(message);
if ( msg == null ) msg = "";
msg = msg.replace(",", ",");
- FileWriter writer = null;
- try {
- writer = new FileWriter(file, true);
- String str = lformat.format(new Date()) +
- "," + msg + "," + player;
+
+ try ( OutputStreamWriter writer = new OutputStreamWriter(
+ new FileOutputStream(file, true), "UTF-8"); ) {
+
+ String str = lformat.format(new Date()) + "," + msg + "," + player;
writer.write(str + "\r\n");
- writer.flush();
- } catch (Exception e) {
+ } catch (IOException e) {
e.printStackTrace();
- } finally {
- if ( writer != null ) {
- try {
- writer.close();
- } catch (Exception e) {
- // do nothing.
- }
- }
}
-
}
- }.runTaskAsynchronously(LunaChat.getInstance());
+ });
}
/**
@@ -151,11 +139,11 @@ public ArrayList getLog(
private ArrayList readAllLines(File file) {
ArrayList data = new ArrayList();
+ if ( !file.exists() ) return data;
- BufferedReader reader = null;
+ try ( BufferedReader reader = new BufferedReader(
+ new InputStreamReader(new FileInputStream(file), "UTF-8")) ) {
- try {
- reader = new BufferedReader(new FileReader(file));
String line;
while ( (line = reader.readLine()) != null ) {
line = line.trim();
@@ -163,18 +151,8 @@ private ArrayList readAllLines(File file) {
data.add(line);
}
}
- } catch (FileNotFoundException e) {
- e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
- } finally {
- if ( reader != null ) {
- try {
- reader.close();
- } catch (IOException e) {
- // do nothing.
- }
- }
}
return data;
@@ -246,7 +224,7 @@ private void checkDir() {
*/
private String getFolderPath(Date date) {
- return LunaChat.getInstance().getDataFolder() +
+ return LunaChat.getDataFolder() +
File.separator + "logs" +
File.separator + dformat.format(date);
}
diff --git a/src/main/java/com/github/ucchyocean/lc3/LunaChatMode.java b/src/main/java/com/github/ucchyocean/lc3/LunaChatMode.java
new file mode 100644
index 00000000..91ef5286
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc3/LunaChatMode.java
@@ -0,0 +1,16 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc3;
+
+/**
+ * LunaChatの動作モード
+ * @author ucchy
+ */
+public enum LunaChatMode {
+ BUKKIT,
+ BUNGEE,
+ STANDALONE,
+}
diff --git a/src/main/java/com/github/ucchyocean/lc3/LunaChatStandalone.java b/src/main/java/com/github/ucchyocean/lc3/LunaChatStandalone.java
new file mode 100644
index 00000000..d7678cca
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc3/LunaChatStandalone.java
@@ -0,0 +1,108 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc3;
+
+import java.io.File;
+import java.net.URISyntaxException;
+import java.util.Set;
+import java.util.logging.Level;
+
+import com.github.ucchyocean.lc3.channel.ChannelManager;
+
+/**
+ * LunaChatのスタンドアロンサーバー
+ * @author ucchy
+ */
+public class LunaChatStandalone implements PluginInterface {
+
+ private LunaChatConfig config;
+ private ChannelManager manager;
+ private UUIDCacheData uuidCacheData;
+
+ public void onEnable() {
+
+ LunaChat.setPlugin(this);
+ LunaChat.setMode(LunaChatMode.STANDALONE);
+
+ // 初期化
+ manager = new ChannelManager();
+
+ // コンフィグ取得
+ config = new LunaChatConfig(getDataFolder(), getPluginJarFile());
+
+ // UUIDキャッシュデータ (これ要る?)
+ uuidCacheData = new UUIDCacheData(getDataFolder());
+ }
+
+ @Override
+ public File getPluginJarFile() {
+ try {
+ return new File(LunaChatStandalone.class
+ .getProtectionDomain().getCodeSource().getLocation().toURI());
+ } catch (URISyntaxException e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ @Override
+ public LunaChatConfig getLunaChatConfig() {
+ return config;
+ }
+
+ @Override
+ public LunaChatAPI getLunaChatAPI() {
+ return manager ;
+ }
+
+ @Override
+ public File getDataFolder() {
+
+ // 現在のフォルダ下にLunaChatフォルダを作成して返す
+ String cd = new File(".").getAbsoluteFile().getParent();
+ File folder = new File(cd, "LunaChat");
+ if ( !folder.exists() ) folder.mkdirs();
+ return folder;
+ }
+
+ @Override
+ public LunaChatLogger getNormalChatLogger() {
+ return null;
+ }
+
+ /**
+ * オンラインのプレイヤー名一覧を取得する
+ * @return オンラインのプレイヤー名一覧
+ */
+ public Set getOnlinePlayerNames() {
+ return null;
+ }
+
+ @Override
+ public void log(Level level, String msg) {
+ // TODO 未実装
+ }
+
+ /**
+ * UUIDキャッシュデータを取得する
+ * @return UUIDキャッシュデータ
+ * @see com.github.ucchyocean.lc3.PluginInterface#getUUIDCacheData()
+ */
+ @Override
+ public UUIDCacheData getUUIDCacheData() {
+ return uuidCacheData;
+ }
+
+ /**
+ * 非同期タスクを実行する
+ * @param task タスク
+ * @see com.github.ucchyocean.lc3.PluginInterface#runAsyncTask(java.lang.Runnable)
+ */
+ @Override
+ public void runAsyncTask(Runnable task) {
+ new Thread(task).start();
+ }
+}
diff --git a/src/main/java/com/github/ucchyocean/lc3/Messages.java b/src/main/java/com/github/ucchyocean/lc3/Messages.java
new file mode 100644
index 00000000..d902650a
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc3/Messages.java
@@ -0,0 +1,1939 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc3;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.jar.JarFile;
+import java.util.zip.ZipEntry;
+
+/**
+ * プラグインのメッセージリソース管理クラス
+ * @author ucchy
+ */
+public class Messages {
+
+ private static YamlConfig resources;
+ private static File _messageFolder;
+ private static File _jar;
+
+ /**
+ * Jarファイル内から直接 messages_en.yml をdefaultMessagesとしてロードし、
+ * langに対応するメッセージをファイルからロードする。
+ * @param messagesFolder メッセージ格納フォルダ
+ * @param jar jarファイル
+ * @param lang デフォルト言語
+ */
+ public static void initialize(File messagesFolder, File jar, String lang) {
+
+ _jar = jar;
+ _messageFolder = messagesFolder;
+ if (!_messageFolder.exists()) {
+ _messageFolder.mkdirs();
+ }
+
+ // コンフィグフォルダにメッセージファイルがまだ無いなら、コピーしておく
+ for (String filename : new String[] {
+ "messages_en.yml", "messages_ja.yml" }) {
+ File file = new File(_messageFolder, filename);
+ if (!file.exists()) {
+ Utility.copyFileFromJar(_jar, file, filename, true);
+ }
+ }
+
+ // デフォルトメッセージを、jarファイル内からロードする
+ YamlConfig defaultMessages = null;
+ try (JarFile jarFile = new JarFile(_jar)) {
+
+ ZipEntry zipEntry = jarFile.getEntry(String.format("messages_%s.yml", lang));
+ if (zipEntry == null) {
+ zipEntry = jarFile.getEntry("messages_en.yml");
+ }
+
+ defaultMessages = YamlConfig.load(jarFile.getInputStream(zipEntry));
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ // 対応する言語のメッセージをロードする
+ File file = new File(_messageFolder, String.format("messages_%s.yml", lang));
+ if (!file.exists()) {
+ file = new File(_messageFolder, "messages_en.yml");
+ }
+
+ resources = YamlConfig.load(file);
+ resources.addDefaults(defaultMessages);
+ }
+
+ /**
+ * 指定された言語でリロードを行う。
+ * @param lang 言語
+ */
+ public static void reload(String lang) {
+ initialize(_jar, _messageFolder, lang);
+ }
+
+ // ここから下は自動生成メソッドです。変更をしないでください。
+
+ // === Auto-generated methods area start. ===
+
+ /**
+ * &f[%color%%channel%&f]&7%player% さんがチャンネルに参加しました。
+ */
+ public static String joinMessage(Object color, Object channel, Object player) {
+ String msg = resources.getString("joinMessage");
+ if ( msg == null ) return "";
+ msg = msg.replace("%color%", color.toString());
+ msg = msg.replace("%channel%", channel.toString());
+ msg = msg.replace("%player%", player.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &f[%color%%channel%&f]&7%player% さんがチャンネルから退出しました。
+ */
+ public static String quitMessage(Object color, Object channel, Object player) {
+ String msg = resources.getString("quitMessage");
+ if ( msg == null ) return "";
+ msg = msg.replace("%color%", color.toString());
+ msg = msg.replace("%channel%", channel.toString());
+ msg = msg.replace("%player%", player.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &f[%color%%channel%&f]&7チャンネルが削除されました。
+ */
+ public static String breakupMessage(Object color, Object channel) {
+ String msg = resources.getString("breakupMessage");
+ if ( msg == null ) return "";
+ msg = msg.replace("%color%", color.toString());
+ msg = msg.replace("%channel%", channel.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &f[%color%%channel%&f]&7%player% さんをチャンネルからBANしました。
+ */
+ public static String banMessage(Object color, Object channel, Object player) {
+ String msg = resources.getString("banMessage");
+ if ( msg == null ) return "";
+ msg = msg.replace("%color%", color.toString());
+ msg = msg.replace("%channel%", channel.toString());
+ msg = msg.replace("%player%", player.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &f[%color%%channel%&f]&7%player% さんをチャンネルからキックしました。
+ */
+ public static String kickMessage(Object color, Object channel, Object player) {
+ String msg = resources.getString("kickMessage");
+ if ( msg == null ) return "";
+ msg = msg.replace("%color%", color.toString());
+ msg = msg.replace("%channel%", channel.toString());
+ msg = msg.replace("%player%", player.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &f[%color%%channel%&f]&7%player% さんをチャンネルからMuteしました。
+ */
+ public static String muteMessage(Object color, Object channel, Object player) {
+ String msg = resources.getString("muteMessage");
+ if ( msg == null ) return "";
+ msg = msg.replace("%color%", color.toString());
+ msg = msg.replace("%channel%", channel.toString());
+ msg = msg.replace("%player%", player.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &f[%color%%channel%&f]&7NGワード発言により、%player% さんをチャンネルから自動BANしました。
+ */
+ public static String banNGWordMessage(Object color, Object channel, Object player) {
+ String msg = resources.getString("banNGWordMessage");
+ if ( msg == null ) return "";
+ msg = msg.replace("%color%", color.toString());
+ msg = msg.replace("%channel%", channel.toString());
+ msg = msg.replace("%player%", player.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &f[%color%%channel%&f]&7NGワード発言により、%player% さんをチャンネルから自動キックしました。
+ */
+ public static String kickNGWordMessage(Object color, Object channel, Object player) {
+ String msg = resources.getString("kickNGWordMessage");
+ if ( msg == null ) return "";
+ msg = msg.replace("%color%", color.toString());
+ msg = msg.replace("%channel%", channel.toString());
+ msg = msg.replace("%player%", player.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &f[%color%%channel%&f]&7NGワード発言により、%player% さんをチャンネルから自動Muteしました。
+ */
+ public static String muteNGWordMessage(Object color, Object channel, Object player) {
+ String msg = resources.getString("muteNGWordMessage");
+ if ( msg == null ) return "";
+ msg = msg.replace("%color%", color.toString());
+ msg = msg.replace("%channel%", channel.toString());
+ msg = msg.replace("%player%", player.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &f[%color%%channel%&f]&7%player% さんを期限 %minutes% 分でチャンネルからBANしました。
+ */
+ public static String banWithExpireMessage(Object color, Object channel, Object player, Object minutes) {
+ String msg = resources.getString("banWithExpireMessage");
+ if ( msg == null ) return "";
+ msg = msg.replace("%color%", color.toString());
+ msg = msg.replace("%channel%", channel.toString());
+ msg = msg.replace("%player%", player.toString());
+ msg = msg.replace("%minutes%", minutes.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &f[%color%%channel%&f]&7%player% さんを期限 %minutes% 分でチャンネルからMuteしました。
+ */
+ public static String muteWithExpireMessage(Object color, Object channel, Object player, Object minutes) {
+ String msg = resources.getString("muteWithExpireMessage");
+ if ( msg == null ) return "";
+ msg = msg.replace("%color%", color.toString());
+ msg = msg.replace("%channel%", channel.toString());
+ msg = msg.replace("%player%", player.toString());
+ msg = msg.replace("%minutes%", minutes.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &f[%color%%channel%&f]&7%player% さんのBANが解除されました。
+ */
+ public static String pardonMessage(Object color, Object channel, Object player) {
+ String msg = resources.getString("pardonMessage");
+ if ( msg == null ) return "";
+ msg = msg.replace("%color%", color.toString());
+ msg = msg.replace("%channel%", channel.toString());
+ msg = msg.replace("%player%", player.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &f[%color%%channel%&f]&7%player% さんのMuteが解除されました。
+ */
+ public static String unmuteMessage(Object color, Object channel, Object player) {
+ String msg = resources.getString("unmuteMessage");
+ if ( msg == null ) return "";
+ msg = msg.replace("%color%", color.toString());
+ msg = msg.replace("%channel%", channel.toString());
+ msg = msg.replace("%player%", player.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &f[%color%%channel%&f]&7%player% さんの期限付きBANが解除されました。
+ */
+ public static String expiredBanMessage(Object color, Object channel, Object player) {
+ String msg = resources.getString("expiredBanMessage");
+ if ( msg == null ) return "";
+ msg = msg.replace("%color%", color.toString());
+ msg = msg.replace("%channel%", channel.toString());
+ msg = msg.replace("%player%", player.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &f[%color%%channel%&f]&7%player% さんの期限付きMuteが解除されました。
+ */
+ public static String expiredMuteMessage(Object color, Object channel, Object player) {
+ String msg = resources.getString("expiredMuteMessage");
+ if ( msg == null ) return "";
+ msg = msg.replace("%color%", color.toString());
+ msg = msg.replace("%channel%", channel.toString());
+ msg = msg.replace("%player%", player.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &f[%color%%channel%&f]&7%player% さんがチャンネルのモデレーターになりました。
+ */
+ public static String addModeratorMessage(Object color, Object channel, Object player) {
+ String msg = resources.getString("addModeratorMessage");
+ if ( msg == null ) return "";
+ msg = msg.replace("%color%", color.toString());
+ msg = msg.replace("%channel%", channel.toString());
+ msg = msg.replace("%player%", player.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &f[%color%%channel%&f]&7%player% さんがチャンネルのモデレーターから外れました。
+ */
+ public static String removeModeratorMessage(Object color, Object channel, Object player) {
+ String msg = resources.getString("removeModeratorMessage");
+ if ( msg == null ) return "";
+ msg = msg.replace("%color%", color.toString());
+ msg = msg.replace("%channel%", channel.toString());
+ msg = msg.replace("%player%", player.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &f[%color%%channel%&f]&7あなたの発言は、誰にも届きませんでした。
+ */
+ public static String noRecipientMessage(Object color, Object channel) {
+ String msg = resources.getString("noRecipientMessage");
+ if ( msg == null ) return "";
+ msg = msg.replace("%color%", color.toString());
+ msg = msg.replace("%channel%", channel.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &7---------- &bチャンネルリスト &7----------
+ */
+ public static String listFirstLine() {
+ String msg = resources.getString("listFirstLine");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &7---------- &bチャンネルリスト&7(&c%page%&7/&c%max%&7) ----------
+ */
+ public static String listFirstLinePaging(Object page, Object max) {
+ String msg = resources.getString("listFirstLinePaging");
+ if ( msg == null ) return "";
+ msg = msg.replace("%page%", page.toString());
+ msg = msg.replace("%max%", max.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &7----------------------------------
+ */
+ public static String listEndLine() {
+ String msg = resources.getString("listEndLine");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &7| &f%channel%&7(&c%online%&7/&c%total%&7) &a%topic%
+ */
+ public static String listFormat(Object channel, Object online, Object total, Object topic) {
+ String msg = resources.getString("listFormat");
+ if ( msg == null ) return "";
+ msg = msg.replace("%channel%", channel.toString());
+ msg = msg.replace("%online%", online.toString());
+ msg = msg.replace("%total%", total.toString());
+ msg = msg.replace("%topic%", topic.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &7|
+ */
+ public static String listPlainPrefix() {
+ String msg = resources.getString("listPlainPrefix");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &7---------- &bチャンネル情報 &7----------
+ */
+ public static String channelInfoFirstLine() {
+ String msg = resources.getString("channelInfoFirstLine");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &7|
+ */
+ public static String channelInfoPrefix() {
+ String msg = resources.getString("channelInfoPrefix");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &7| &cチャンネル別名:&f
+ */
+ public static String channelInfoAlias() {
+ String msg = resources.getString("channelInfoAlias");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &7| &cグローバルチャンネル
+ */
+ public static String channelInfoGlobal() {
+ String msg = resources.getString("channelInfoGlobal");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &7| &cブロードキャストチャンネル
+ */
+ public static String channelInfoBroadcast() {
+ String msg = resources.getString("channelInfoBroadcast");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &7| &cシークレットチャンネル
+ */
+ public static String channelInfoSecret() {
+ String msg = resources.getString("channelInfoSecret");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &7| &cパスワード設定あり
+ */
+ public static String channelInfoPassword() {
+ String msg = resources.getString("channelInfoPassword");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &7| &cワールドチャット
+ */
+ public static String channelInfoWorldChat() {
+ String msg = resources.getString("channelInfoWorldChat");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &7| &c範囲チャット:%block% ブロック
+ */
+ public static String channelInfoRangeChat(Object block) {
+ String msg = resources.getString("channelInfoRangeChat");
+ if ( msg == null ) return "";
+ msg = msg.replace("%block%", block.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &7| &cフォーマット設定:
+ */
+ public static String channelInfoFormat() {
+ String msg = resources.getString("channelInfoFormat");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &7| &cBANリスト:
+ */
+ public static String channelInfoBanned() {
+ String msg = resources.getString("channelInfoBanned");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &7| &cMuteリスト:
+ */
+ public static String channelInfoMuted() {
+ String msg = resources.getString("channelInfoMuted");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &7----- &b参加中のチャット &7-----
+ */
+ public static String motdFirstLine() {
+ String msg = resources.getString("motdFirstLine");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &7----- &b非表示にしているチャット &7-----
+ */
+ public static String hideChannelFirstLine() {
+ String msg = resources.getString("hideChannelFirstLine");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &7----- &b非表示にしているプレイヤー &7-----
+ */
+ public static String hidePlayerFirstLine() {
+ String msg = resources.getString("hidePlayerFirstLine");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &7----- &b%channel%の発言ログ &7-----
+ */
+ public static String logDisplayFirstLine(Object channel) {
+ String msg = resources.getString("logDisplayFirstLine");
+ if ( msg == null ) return "";
+ msg = msg.replace("%channel%", channel.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &7----------------------------------
+ */
+ public static String logDisplayEndLine() {
+ String msg = resources.getString("logDisplayEndLine");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &7| &c%date%&7, &f%player%&7: &f%message%
+ */
+ public static String logDisplayFormat(Object date, Object player, Object message) {
+ String msg = resources.getString("logDisplayFormat");
+ if ( msg == null ) return "";
+ msg = msg.replace("%date%", date.toString());
+ msg = msg.replace("%player%", player.toString());
+ msg = msg.replace("%message%", message.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &f[&aLC&f]
+ */
+ public static String infoPrefix() {
+ String msg = resources.getString("infoPrefix");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &f[&cLC&f]
+ */
+ public static String errorPrefix() {
+ String msg = resources.getString("errorPrefix");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * チャンネル %channel% に参加しました。
+ */
+ public static String cmdmsgJoin(Object channel) {
+ String msg = resources.getString("cmdmsgJoin");
+ if ( msg == null ) return "";
+ msg = msg.replace("%channel%", channel.toString());
+ return Utility.replaceColorCode(resources.getString("infoPrefix", "") + msg);
+ }
+
+ /**
+ * デフォルトの発言先を %channel% に設定しました。
+ */
+ public static String cmdmsgSet(Object channel) {
+ String msg = resources.getString("cmdmsgSet");
+ if ( msg == null ) return "";
+ msg = msg.replace("%channel%", channel.toString());
+ return Utility.replaceColorCode(resources.getString("infoPrefix", "") + msg);
+ }
+
+ /**
+ * トピック: &a%topic%
+ */
+ public static String cmdmsgSetTopic(Object topic) {
+ String msg = resources.getString("cmdmsgSetTopic");
+ if ( msg == null ) return "";
+ msg = msg.replace("%topic%", topic.toString());
+ return Utility.replaceColorCode(resources.getString("infoPrefix", "") + msg);
+ }
+
+ /**
+ * <注意> 現在このチャンネルを非表示に設定しています。
+ */
+ public static String cmdmsgSetHide() {
+ String msg = resources.getString("cmdmsgSetHide");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(resources.getString("infoPrefix", "") + msg);
+ }
+
+ /**
+ * チャンネル %channel% から退出しました。
+ */
+ public static String cmdmsgLeave(Object channel) {
+ String msg = resources.getString("cmdmsgLeave");
+ if ( msg == null ) return "";
+ msg = msg.replace("%channel%", channel.toString());
+ return Utility.replaceColorCode(resources.getString("infoPrefix", "") + msg);
+ }
+
+ /**
+ * %player% さんを、チャンネル %channel% に招待しました。
+ */
+ public static String cmdmsgInvite(Object player, Object channel) {
+ String msg = resources.getString("cmdmsgInvite");
+ if ( msg == null ) return "";
+ msg = msg.replace("%player%", player.toString());
+ msg = msg.replace("%channel%", channel.toString());
+ return Utility.replaceColorCode(resources.getString("infoPrefix", "") + msg);
+ }
+
+ /**
+ * %player% さんから、チャンネル %channel% に招待されました。
+ */
+ public static String cmdmsgInvited1(Object player, Object channel) {
+ String msg = resources.getString("cmdmsgInvited1");
+ if ( msg == null ) return "";
+ msg = msg.replace("%player%", player.toString());
+ msg = msg.replace("%channel%", channel.toString());
+ return Utility.replaceColorCode(resources.getString("infoPrefix", "") + msg);
+ }
+
+ /**
+ * 入室するには /ch accept、拒否するには /ch deny を実行してください。
+ */
+ public static String cmdmsgInvited2() {
+ String msg = resources.getString("cmdmsgInvited2");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(resources.getString("infoPrefix", "") + msg);
+ }
+
+ /**
+ * 招待を拒否しました。
+ */
+ public static String cmdmsgDeny() {
+ String msg = resources.getString("cmdmsgDeny");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(resources.getString("infoPrefix", "") + msg);
+ }
+
+ /**
+ * 招待が拒否されました。
+ */
+ public static String cmdmsgDenyed() {
+ String msg = resources.getString("cmdmsgDenyed");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(resources.getString("infoPrefix", "") + msg);
+ }
+
+ /**
+ * %player% さんを、チャンネル %channel% からキックしました。
+ */
+ public static String cmdmsgKick(Object player, Object channel) {
+ String msg = resources.getString("cmdmsgKick");
+ if ( msg == null ) return "";
+ msg = msg.replace("%player%", player.toString());
+ msg = msg.replace("%channel%", channel.toString());
+ return Utility.replaceColorCode(resources.getString("infoPrefix", "") + msg);
+ }
+
+ /**
+ * チャンネル %channel% からキックされました。
+ */
+ public static String cmdmsgKicked(Object channel) {
+ String msg = resources.getString("cmdmsgKicked");
+ if ( msg == null ) return "";
+ msg = msg.replace("%channel%", channel.toString());
+ return Utility.replaceColorCode(resources.getString("infoPrefix", "") + msg);
+ }
+
+ /**
+ * %player% さんを、チャンネル %channel% からBANしました。
+ */
+ public static String cmdmsgBan(Object player, Object channel) {
+ String msg = resources.getString("cmdmsgBan");
+ if ( msg == null ) return "";
+ msg = msg.replace("%player%", player.toString());
+ msg = msg.replace("%channel%", channel.toString());
+ return Utility.replaceColorCode(resources.getString("infoPrefix", "") + msg);
+ }
+
+ /**
+ * %player% さんを、チャンネル %channel% から期限 %minutes% 分でBANしました。
+ */
+ public static String cmdmsgBanWithExpire(Object player, Object channel, Object minutes) {
+ String msg = resources.getString("cmdmsgBanWithExpire");
+ if ( msg == null ) return "";
+ msg = msg.replace("%player%", player.toString());
+ msg = msg.replace("%channel%", channel.toString());
+ msg = msg.replace("%minutes%", minutes.toString());
+ return Utility.replaceColorCode(resources.getString("infoPrefix", "") + msg);
+ }
+
+ /**
+ * チャンネル %channel% からBANされました。
+ */
+ public static String cmdmsgBanned(Object channel) {
+ String msg = resources.getString("cmdmsgBanned");
+ if ( msg == null ) return "";
+ msg = msg.replace("%channel%", channel.toString());
+ return Utility.replaceColorCode(resources.getString("infoPrefix", "") + msg);
+ }
+
+ /**
+ * %player% さんの、チャンネル %channel% のBANを解除しました。
+ */
+ public static String cmdmsgPardon(Object player, Object channel) {
+ String msg = resources.getString("cmdmsgPardon");
+ if ( msg == null ) return "";
+ msg = msg.replace("%player%", player.toString());
+ msg = msg.replace("%channel%", channel.toString());
+ return Utility.replaceColorCode(resources.getString("infoPrefix", "") + msg);
+ }
+
+ /**
+ * チャンネル %channel% のBANが解除されました。
+ */
+ public static String cmdmsgPardoned(Object channel) {
+ String msg = resources.getString("cmdmsgPardoned");
+ if ( msg == null ) return "";
+ msg = msg.replace("%channel%", channel.toString());
+ return Utility.replaceColorCode(resources.getString("infoPrefix", "") + msg);
+ }
+
+ /**
+ * %player% さんを、チャンネル %channel% でMuteしました。
+ */
+ public static String cmdmsgMute(Object player, Object channel) {
+ String msg = resources.getString("cmdmsgMute");
+ if ( msg == null ) return "";
+ msg = msg.replace("%player%", player.toString());
+ msg = msg.replace("%channel%", channel.toString());
+ return Utility.replaceColorCode(resources.getString("infoPrefix", "") + msg);
+ }
+
+ /**
+ * %player% さんを、チャンネル %channel% から期限 %minutes% 分でMuteしました。
+ */
+ public static String cmdmsgMuteWithExpire(Object player, Object channel, Object minutes) {
+ String msg = resources.getString("cmdmsgMuteWithExpire");
+ if ( msg == null ) return "";
+ msg = msg.replace("%player%", player.toString());
+ msg = msg.replace("%channel%", channel.toString());
+ msg = msg.replace("%minutes%", minutes.toString());
+ return Utility.replaceColorCode(resources.getString("infoPrefix", "") + msg);
+ }
+
+ /**
+ * チャンネル %channel% からMuteされました。
+ */
+ public static String cmdmsgMuted(Object channel) {
+ String msg = resources.getString("cmdmsgMuted");
+ if ( msg == null ) return "";
+ msg = msg.replace("%channel%", channel.toString());
+ return Utility.replaceColorCode(resources.getString("infoPrefix", "") + msg);
+ }
+
+ /**
+ * %player% さんの、チャンネル %channel% のMuteを解除しました。
+ */
+ public static String cmdmsgUnmute(Object player, Object channel) {
+ String msg = resources.getString("cmdmsgUnmute");
+ if ( msg == null ) return "";
+ msg = msg.replace("%player%", player.toString());
+ msg = msg.replace("%channel%", channel.toString());
+ return Utility.replaceColorCode(resources.getString("infoPrefix", "") + msg);
+ }
+
+ /**
+ * チャンネル %channel% のMuteが解除されました。
+ */
+ public static String cmdmsgUnmuted(Object channel) {
+ String msg = resources.getString("cmdmsgUnmuted");
+ if ( msg == null ) return "";
+ msg = msg.replace("%channel%", channel.toString());
+ return Utility.replaceColorCode(resources.getString("infoPrefix", "") + msg);
+ }
+
+ /**
+ * チャンネル %channel% を非表示に設定しました。
+ */
+ public static String cmdmsgHided(Object channel) {
+ String msg = resources.getString("cmdmsgHided");
+ if ( msg == null ) return "";
+ msg = msg.replace("%channel%", channel.toString());
+ return Utility.replaceColorCode(resources.getString("infoPrefix", "") + msg);
+ }
+
+ /**
+ * プレイヤー %player% を非表示に設定しました。
+ */
+ public static String cmdmsgHidedPlayer(Object player) {
+ String msg = resources.getString("cmdmsgHidedPlayer");
+ if ( msg == null ) return "";
+ msg = msg.replace("%player%", player.toString());
+ return Utility.replaceColorCode(resources.getString("infoPrefix", "") + msg);
+ }
+
+ /**
+ * チャンネル %channel% を表示に設定しました。
+ */
+ public static String cmdmsgUnhided(Object channel) {
+ String msg = resources.getString("cmdmsgUnhided");
+ if ( msg == null ) return "";
+ msg = msg.replace("%channel%", channel.toString());
+ return Utility.replaceColorCode(resources.getString("infoPrefix", "") + msg);
+ }
+
+ /**
+ * プレイヤー %channel% を表示に設定しました。
+ */
+ public static String cmdmsgUnhidedPlayer(Object channel) {
+ String msg = resources.getString("cmdmsgUnhidedPlayer");
+ if ( msg == null ) return "";
+ msg = msg.replace("%channel%", channel.toString());
+ return Utility.replaceColorCode(resources.getString("infoPrefix", "") + msg);
+ }
+
+ /**
+ * LunaChatの設定を再読み込みしました。
+ */
+ public static String cmdmsgReload() {
+ String msg = resources.getString("cmdmsgReload");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(resources.getString("infoPrefix", "") + msg);
+ }
+
+ /**
+ * チャンネル %channel% を新規作成しました。
+ */
+ public static String cmdmsgCreate(Object channel) {
+ String msg = resources.getString("cmdmsgCreate");
+ if ( msg == null ) return "";
+ msg = msg.replace("%channel%", channel.toString());
+ return Utility.replaceColorCode(resources.getString("infoPrefix", "") + msg);
+ }
+
+ /**
+ * チャンネル %channel% を削除しました。
+ */
+ public static String cmdmsgRemove(Object channel) {
+ String msg = resources.getString("cmdmsgRemove");
+ if ( msg == null ) return "";
+ msg = msg.replace("%channel%", channel.toString());
+ return Utility.replaceColorCode(resources.getString("infoPrefix", "") + msg);
+ }
+
+ /**
+ * メッセージフォーマットを %format% に設定しました。
+ */
+ public static String cmdmsgFormat(Object format) {
+ String msg = resources.getString("cmdmsgFormat");
+ if ( msg == null ) return "";
+ msg = msg.replace("%format%", format.toString());
+ return Utility.replaceColorCode(resources.getString("infoPrefix", "") + msg);
+ }
+
+ /**
+ * %player% さんをチャンネル %channel% のモデレーターに設定しました。
+ */
+ public static String cmdmsgModerator(Object player, Object channel) {
+ String msg = resources.getString("cmdmsgModerator");
+ if ( msg == null ) return "";
+ msg = msg.replace("%player%", player.toString());
+ msg = msg.replace("%channel%", channel.toString());
+ return Utility.replaceColorCode(resources.getString("infoPrefix", "") + msg);
+ }
+
+ /**
+ * %player% さんをチャンネル %channel% のモデレーターから外しました。
+ */
+ public static String cmdmsgModeratorMinus(Object player, Object channel) {
+ String msg = resources.getString("cmdmsgModeratorMinus");
+ if ( msg == null ) return "";
+ msg = msg.replace("%player%", player.toString());
+ msg = msg.replace("%channel%", channel.toString());
+ return Utility.replaceColorCode(resources.getString("infoPrefix", "") + msg);
+ }
+
+ /**
+ * %key% を %value% と覚えました。
+ */
+ public static String cmdmsgDictionaryAdd(Object key, Object value) {
+ String msg = resources.getString("cmdmsgDictionaryAdd");
+ if ( msg == null ) return "";
+ msg = msg.replace("%key%", key.toString());
+ msg = msg.replace("%value%", value.toString());
+ return Utility.replaceColorCode(resources.getString("infoPrefix", "") + msg);
+ }
+
+ /**
+ * %key% を忘れました。
+ */
+ public static String cmdmsgDictionaryRemove(Object key) {
+ String msg = resources.getString("cmdmsgDictionaryRemove");
+ if ( msg == null ) return "";
+ msg = msg.replace("%key%", key.toString());
+ return Utility.replaceColorCode(resources.getString("infoPrefix", "") + msg);
+ }
+
+ /**
+ * %key% を %value% に設定しました。
+ */
+ public static String cmdmsgOption(Object key, Object value) {
+ String msg = resources.getString("cmdmsgOption");
+ if ( msg == null ) return "";
+ msg = msg.replace("%key%", key.toString());
+ msg = msg.replace("%value%", value.toString());
+ return Utility.replaceColorCode(resources.getString("infoPrefix", "") + msg);
+ }
+
+ /**
+ * テンプレート %index% を、%value% に設定しました。
+ */
+ public static String cmdmsgTemplate(Object index, Object value) {
+ String msg = resources.getString("cmdmsgTemplate");
+ if ( msg == null ) return "";
+ msg = msg.replace("%index%", index.toString());
+ msg = msg.replace("%value%", value.toString());
+ return Utility.replaceColorCode(resources.getString("infoPrefix", "") + msg);
+ }
+
+ /**
+ * テンプレート %index% を削除しました。
+ */
+ public static String cmdmsgTemplateRemove(Object index) {
+ String msg = resources.getString("cmdmsgTemplateRemove");
+ if ( msg == null ) return "";
+ msg = msg.replace("%index%", index.toString());
+ return Utility.replaceColorCode(resources.getString("infoPrefix", "") + msg);
+ }
+
+ /**
+ * %player% さんの発言先を %channel% に設定しました。
+ */
+ public static String cmdmsgSetDefault(Object player, Object channel) {
+ String msg = resources.getString("cmdmsgSetDefault");
+ if ( msg == null ) return "";
+ msg = msg.replace("%player%", player.toString());
+ msg = msg.replace("%channel%", channel.toString());
+ return Utility.replaceColorCode(resources.getString("infoPrefix", "") + msg);
+ }
+
+ /**
+ * Your chat's Japanize conversion was turned %value%.
+ */
+ public static String cmdmsgPlayerJapanize(Object value) {
+ String msg = resources.getString("cmdmsgPlayerJapanize");
+ if ( msg == null ) return "";
+ msg = msg.replace("%value%", value.toString());
+ return Utility.replaceColorCode(resources.getString("infoPrefix", "") + msg);
+ }
+
+ /**
+ * %player% さんのJapanize変換を %value% にしました。
+ */
+ public static String cmdmsgPlayerJapanizeOther(Object player, Object value) {
+ String msg = resources.getString("cmdmsgPlayerJapanizeOther");
+ if ( msg == null ) return "";
+ msg = msg.replace("%player%", player.toString());
+ msg = msg.replace("%value%", value.toString());
+ return Utility.replaceColorCode(resources.getString("infoPrefix", "") + msg);
+ }
+
+ /**
+ * %inviter%の現在の会話相手 : %invited%
+ */
+ public static String cmdmsgReplyInviter(Object inviter, Object invited) {
+ String msg = resources.getString("cmdmsgReplyInviter");
+ if ( msg == null ) return "";
+ msg = msg.replace("%inviter%", inviter.toString());
+ msg = msg.replace("%invited%", invited.toString());
+ return Utility.replaceColorCode(resources.getString("infoPrefix", "") + msg);
+ }
+
+ /**
+ * %inviter%の現在の会話相手 : 相手がいません。
+ */
+ public static String cmdmsgReplyInviterNone(Object inviter) {
+ String msg = resources.getString("cmdmsgReplyInviterNone");
+ if ( msg == null ) return "";
+ msg = msg.replace("%inviter%", inviter.toString());
+ return Utility.replaceColorCode(resources.getString("infoPrefix", "") + msg);
+ }
+
+ /**
+ * このコマンドはゲーム内からしか実行できません。
+ */
+ public static String errmsgIngame() {
+ String msg = resources.getString("errmsgIngame");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * コマンドの指定が正しくありません。
+ */
+ public static String errmsgCommand() {
+ String msg = resources.getString("errmsgCommand");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * 指定されたチャンネルが存在しません。
+ */
+ public static String errmsgNotExist() {
+ String msg = resources.getString("errmsgNotExist");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * 指定されたチャンネルもプレイヤーも存在しません。
+ */
+ public static String errmsgNotExistChannelAndPlayer() {
+ String msg = resources.getString("errmsgNotExistChannelAndPlayer");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * 指定されたチャンネルが存在しないか、チャンネルが指定されませんでした。
+ */
+ public static String errmsgNotExistOrNotSpecified() {
+ String msg = resources.getString("errmsgNotExistOrNotSpecified");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * 指定されたチャンネル名が既に存在します。
+ */
+ public static String errmsgExist() {
+ String msg = resources.getString("errmsgExist");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * 指定されたチャンネルに参加していません。
+ */
+ public static String errmsgNomember() {
+ String msg = resources.getString("errmsgNomember");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * 指定されたプレイヤーはチャンネルに参加していません。
+ */
+ public static String errmsgNomemberOther() {
+ String msg = resources.getString("errmsgNomemberOther");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * 指定されたプレイヤー %player% が見つかりません。
+ */
+ public static String errmsgNotfoundPlayer(Object player) {
+ String msg = resources.getString("errmsgNotfoundPlayer");
+ if ( msg == null ) return "";
+ msg = msg.replace("%player%", player.toString());
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * 招待を受けたプレイヤーではありません。
+ */
+ public static String errmsgNotInvited() {
+ String msg = resources.getString("errmsgNotInvited");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * チャンネルが無くなってしまったため、参加できませんでした。
+ */
+ public static String errmsgNotfoundChannel() {
+ String msg = resources.getString("errmsgNotfoundChannel");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * 招待された %player% さんは、既にチャンネルに参加しています。
+ */
+ public static String errmsgInvitedAlreadyExist(Object player) {
+ String msg = resources.getString("errmsgInvitedAlreadyExist");
+ if ( msg == null ) return "";
+ msg = msg.replace("%player%", player.toString());
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * 既にチャンネルに参加しています。
+ */
+ public static String errmsgInvitedAlreadyJoin() {
+ String msg = resources.getString("errmsgInvitedAlreadyJoin");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * 現在チャンネルに参加していません。
+ */
+ public static String errmsgNoJoin() {
+ String msg = resources.getString("errmsgNoJoin");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * あなたはこのチャンネルからBANされています。
+ */
+ public static String errmsgBanned() {
+ String msg = resources.getString("errmsgBanned");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * あなたはこのチャンネルからMuteされているため、発言できません。
+ */
+ public static String errmsgMuted() {
+ String msg = resources.getString("errmsgMuted");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * 指定されたプレイヤーは既にBANリストに含まれています。
+ */
+ public static String errmsgAlreadyBanned() {
+ String msg = resources.getString("errmsgAlreadyBanned");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * 指定されたプレイヤーは既にMuteリストに含まれています。
+ */
+ public static String errmsgAlreadyMuted() {
+ String msg = resources.getString("errmsgAlreadyMuted");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * このチャンネルは既に非表示になっています。
+ */
+ public static String errmsgAlreadyHided() {
+ String msg = resources.getString("errmsgAlreadyHided");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * このプレイヤーは既に非表示になっています。
+ */
+ public static String errmsgAlreadyHidedPlayer() {
+ String msg = resources.getString("errmsgAlreadyHidedPlayer");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * このチャンネルは非表示になっていません。
+ */
+ public static String errmsgAlreadyUnhided() {
+ String msg = resources.getString("errmsgAlreadyUnhided");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * このプレイヤーは非表示になっていません。
+ */
+ public static String errmsgAlreadyUnhidedPlayer() {
+ String msg = resources.getString("errmsgAlreadyUnhidedPlayer");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * 個人チャットチャンネルには参加できません。
+ */
+ public static String errmsgCannotJoinPersonal() {
+ String msg = resources.getString("errmsgCannotJoinPersonal");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * あなたはモデレーターではないため、そのコマンドを実行できません。
+ */
+ public static String errmsgNotModerator() {
+ String msg = resources.getString("errmsgNotModerator");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * 指定されたプレイヤーはBANリストに含まれていません。
+ */
+ public static String errmsgNotBanned() {
+ String msg = resources.getString("errmsgNotBanned");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * 指定されたプレイヤーはMuteリストに含まれていません。
+ */
+ public static String errmsgNotMuted() {
+ String msg = resources.getString("errmsgNotMuted");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * 有効なオプション指定が1つもありませんでした。
+ */
+ public static String errmsgInvalidOptions() {
+ String msg = resources.getString("errmsgInvalidOptions");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * このチャンネルはパスワードが設定されているため入れません。
+ */
+ public static String errmsgPassword1() {
+ String msg = resources.getString("errmsgPassword1");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * パスワードを指定して、チャンネルに入ってください。
+ */
+ public static String errmsgPassword2() {
+ String msg = resources.getString("errmsgPassword2");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * /ch (channel) (password)
+ */
+ public static String errmsgPassword3() {
+ String msg = resources.getString("errmsgPassword3");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * パスワードが正しくないため、チャンネルに入れません。
+ */
+ public static String errmsgPasswordNotmatch() {
+ String msg = resources.getString("errmsgPasswordNotmatch");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * 権限 "%permission%" が無いため、実行できません。
+ */
+ public static String errmsgPermission(Object permission) {
+ String msg = resources.getString("errmsgPermission");
+ if ( msg == null ) return "";
+ msg = msg.replace("%permission%", permission.toString());
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * チャンネル %channel% はグローバルチャンネルなので、退出できません。
+ */
+ public static String errmsgCannotLeaveGlobal(Object channel) {
+ String msg = resources.getString("errmsgCannotLeaveGlobal");
+ if ( msg == null ) return "";
+ msg = msg.replace("%channel%", channel.toString());
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * チャンネル %channel% はグローバルチャンネルなので、キックできません。
+ */
+ public static String errmsgCannotKickGlobal(Object channel) {
+ String msg = resources.getString("errmsgCannotKickGlobal");
+ if ( msg == null ) return "";
+ msg = msg.replace("%channel%", channel.toString());
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * チャンネル %channel% はグローバルチャンネルなので、BANできません。
+ */
+ public static String errmsgCannotBANGlobal(Object channel) {
+ String msg = resources.getString("errmsgCannotBANGlobal");
+ if ( msg == null ) return "";
+ msg = msg.replace("%channel%", channel.toString());
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * チャンネル %channel% はグローバルチャンネルなので、削除できません。
+ */
+ public static String errmsgCannotRemoveGlobal(Object channel) {
+ String msg = resources.getString("errmsgCannotRemoveGlobal");
+ if ( msg == null ) return "";
+ msg = msg.replace("%channel%", channel.toString());
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * チャンネル %channel% はグローバルチャンネルなので、モデレーターを設定できません。
+ */
+ public static String errmsgCannotModeratorGlobal(Object channel) {
+ String msg = resources.getString("errmsgCannotModeratorGlobal");
+ if ( msg == null ) return "";
+ msg = msg.replace("%channel%", channel.toString());
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * チャンネル %channel% は強制参加チャンネルなので、退出できません。
+ */
+ public static String errmsgCannotLeaveForceJoin(Object channel) {
+ String msg = resources.getString("errmsgCannotLeaveForceJoin");
+ if ( msg == null ) return "";
+ msg = msg.replace("%channel%", channel.toString());
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * あなたが受信したプライベートメッセージがありません。
+ */
+ public static String errmsgNotfoundPM() {
+ String msg = resources.getString("errmsgNotfoundPM");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * 自分自身にプライベートメッセージを送ることはできません。
+ */
+ public static String errmsgCannotSendPMSelf() {
+ String msg = resources.getString("errmsgCannotSendPMSelf");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * %channel% はチャンネル名に使用できない文字を含んでいます。
+ */
+ public static String errmsgCannotUseForChannel(Object channel) {
+ String msg = resources.getString("errmsgCannotUseForChannel");
+ if ( msg == null ) return "";
+ msg = msg.replace("%channel%", channel.toString());
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * %channel% は短すぎてチャンネル名に使用できません。%min% 文字以上にしてください。
+ */
+ public static String errmsgCannotUseForChannelTooShort(Object channel, Object min) {
+ String msg = resources.getString("errmsgCannotUseForChannelTooShort");
+ if ( msg == null ) return "";
+ msg = msg.replace("%channel%", channel.toString());
+ msg = msg.replace("%min%", min.toString());
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * %channel% は長すぎてチャンネル名に使用できません。%max% 文字以下にしてください。
+ */
+ public static String errmsgCannotUseForChannelTooLong(Object channel, Object max) {
+ String msg = resources.getString("errmsgCannotUseForChannelTooLong");
+ if ( msg == null ) return "";
+ msg = msg.replace("%channel%", channel.toString());
+ msg = msg.replace("%max%", max.toString());
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * %word% はグローバルチャンネル名に使用できない文字を含んでいます。
+ */
+ public static String errmsgCannotUseForGlobal(Object word) {
+ String msg = resources.getString("errmsgCannotUseForGlobal");
+ if ( msg == null ) return "";
+ msg = msg.replace("%word%", word.toString());
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * %value% はカラーコードとして正しくありません。
+ */
+ public static String errmsgInvalidColorCode(Object value) {
+ String msg = resources.getString("errmsgInvalidColorCode");
+ if ( msg == null ) return "";
+ msg = msg.replace("%value%", value.toString());
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * テンプレート番号は、0から9までの数字を指定してください。
+ */
+ public static String errmsgInvalidTemplateNumber() {
+ String msg = resources.getString("errmsgInvalidTemplateNumber");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * 説明文は %max% 文字以下にしてください。
+ */
+ public static String errmsgToolongDescription(Object max) {
+ String msg = resources.getString("errmsgToolongDescription");
+ if ( msg == null ) return "";
+ msg = msg.replace("%max%", max.toString());
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * チャンネル別名は %max% 文字以下にしてください。
+ */
+ public static String errmsgToolongAlias(Object max) {
+ String msg = resources.getString("errmsgToolongAlias");
+ if ( msg == null ) return "";
+ msg = msg.replace("%max%", max.toString());
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * パスワードは %max% 文字以下にしてください。
+ */
+ public static String errmsgToolongPassword(Object max) {
+ String msg = resources.getString("errmsgToolongPassword");
+ if ( msg == null ) return "";
+ msg = msg.replace("%max%", max.toString());
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * %key% は true/false で指定してください。
+ */
+ public static String errmsgInvalidBooleanOption(Object key) {
+ String msg = resources.getString("errmsgInvalidBooleanOption");
+ if ( msg == null ) return "";
+ msg = msg.replace("%key%", key.toString());
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * range に正しくない値が指定されました。
+ */
+ public static String errmsgInvalidRangeOption() {
+ String msg = resources.getString("errmsgInvalidRangeOption");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * %key% に指定された %value% は、Japanize変換タイプとして正しくありません。
+ */
+ public static String errmsgInvalidJapanizeOption(Object key, Object value) {
+ String msg = resources.getString("errmsgInvalidJapanizeOption");
+ if ( msg == null ) return "";
+ msg = msg.replace("%key%", key.toString());
+ msg = msg.replace("%value%", value.toString());
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * このチャンネルはグローバルチャンネルのため、ブロードキャストをオフにできません。
+ */
+ public static String errmsgCannotOffGlobalBroadcast() {
+ String msg = resources.getString("errmsgCannotOffGlobalBroadcast");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * 必須キーワード %key% が指定されていません。
+ */
+ public static String errmsgFormatConstraint(Object key) {
+ String msg = resources.getString("errmsgFormatConstraint");
+ if ( msg == null ) return "";
+ msg = msg.replace("%key%", key.toString());
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * BAN期限(分)の指定が正しくありません。1 から 43200 の間の数値を指定してください。
+ */
+ public static String errmsgInvalidBanExpireParameter() {
+ String msg = resources.getString("errmsgInvalidBanExpireParameter");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * Mute期限(分)の指定が正しくありません。1 から 43200 の間の数値を指定してください。
+ */
+ public static String errmsgInvalidMuteExpireParameter() {
+ String msg = resources.getString("errmsgInvalidMuteExpireParameter");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * 自分の発言を非表示にすることはできません。
+ */
+ public static String errmsgCannotHideSelf() {
+ String msg = resources.getString("errmsgCannotHideSelf");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * 指定されたチャンネル別名 %aliase% は、チャンネル %channel% と重複するので設定できません。
+ */
+ public static String errmsgDuplicatedAlias(Object aliase, Object channel) {
+ String msg = resources.getString("errmsgDuplicatedAlias");
+ if ( msg == null ) return "";
+ msg = msg.replace("%aliase%", aliase.toString());
+ msg = msg.replace("%channel%", channel.toString());
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * 権限がありません&7(%permission%)
+ */
+ public static String errmsgNotPermission(Object permission) {
+ String msg = resources.getString("errmsgNotPermission");
+ if ( msg == null ) return "";
+ msg = msg.replace("%permission%", permission.toString());
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * このサーバーでは、チャンネルチャットは動作しません。
+ */
+ public static String errmsgChannelChatDisabled() {
+ String msg = resources.getString("errmsgChannelChatDisabled");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(resources.getString("errorPrefix", "") + msg);
+ }
+
+ /**
+ * &6/%label% join (channel) &7- チャンネルに参加します。
+ */
+ public static String usageJoin(Object label) {
+ String msg = resources.getString("usageJoin");
+ if ( msg == null ) return "";
+ msg = msg.replace("%label%", label.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &6/%label% leave &7- 参加しているチャンネルから退出します。
+ */
+ public static String usageLeave(Object label) {
+ String msg = resources.getString("usageLeave");
+ if ( msg == null ) return "";
+ msg = msg.replace("%label%", label.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &6/%label% list &7- チャンネルのリストを表示します。
+ */
+ public static String usageList(Object label) {
+ String msg = resources.getString("usageList");
+ if ( msg == null ) return "";
+ msg = msg.replace("%label%", label.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &6/%label% invite (name) &7- 指定したプレイヤーをチャンネルチャットに招待します。
+ */
+ public static String usageInvite(Object label) {
+ String msg = resources.getString("usageInvite");
+ if ( msg == null ) return "";
+ msg = msg.replace("%label%", label.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &6/%label% accept &7- 招待を受けてチャンネルチャットに入室します。
+ */
+ public static String usageAccept(Object label) {
+ String msg = resources.getString("usageAccept");
+ if ( msg == null ) return "";
+ msg = msg.replace("%label%", label.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &6/%label% deny &7- 招待を拒否します。
+ */
+ public static String usageDeny(Object label) {
+ String msg = resources.getString("usageDeny");
+ if ( msg == null ) return "";
+ msg = msg.replace("%label%", label.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &6/%label% kick (name) &7- 指定したプレイヤーをチャンネルチャットからキックします。
+ */
+ public static String usageKick(Object label) {
+ String msg = resources.getString("usageKick");
+ if ( msg == null ) return "";
+ msg = msg.replace("%label%", label.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &6/%label% ban (name) &7- 指定したプレイヤーをチャンネルチャットからBANします。
+ */
+ public static String usageBan(Object label) {
+ String msg = resources.getString("usageBan");
+ if ( msg == null ) return "";
+ msg = msg.replace("%label%", label.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &6/%label% ban (name) [minutes] &7- 指定したプレイヤーを指定した分の間、BANします。
+ */
+ public static String usageBan2(Object label) {
+ String msg = resources.getString("usageBan2");
+ if ( msg == null ) return "";
+ msg = msg.replace("%label%", label.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &6/%label% pardon (name) &7- 指定したプレイヤーのBANを解除します。
+ */
+ public static String usagePardon(Object label) {
+ String msg = resources.getString("usagePardon");
+ if ( msg == null ) return "";
+ msg = msg.replace("%label%", label.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &6/%label% mute (name) &7- 指定したプレイヤーのチャンネルでの発言権を剥奪します。
+ */
+ public static String usageMute(Object label) {
+ String msg = resources.getString("usageMute");
+ if ( msg == null ) return "";
+ msg = msg.replace("%label%", label.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &6/%label% mute (name) [minutes] &7- 指定したプレイヤーを指定した分の間、発言権剥奪します。
+ */
+ public static String usageMute2(Object label) {
+ String msg = resources.getString("usageMute2");
+ if ( msg == null ) return "";
+ msg = msg.replace("%label%", label.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &6/%label% unmute (name) &7- 指定したプレイヤーのチャンネルでの発言権剥奪を解除します。
+ */
+ public static String usageUnmute(Object label) {
+ String msg = resources.getString("usageUnmute");
+ if ( msg == null ) return "";
+ msg = msg.replace("%label%", label.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &6/%label% hide [channel] &7- 指定したチャンネルの発言内容を非表示にします。
+ */
+ public static String usageHide(Object label) {
+ String msg = resources.getString("usageHide");
+ if ( msg == null ) return "";
+ msg = msg.replace("%label%", label.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &6/%label% hide (player) &7- 指定したプレイヤーの発言内容を非表示にします。
+ */
+ public static String usageHidePlayer(Object label) {
+ String msg = resources.getString("usageHidePlayer");
+ if ( msg == null ) return "";
+ msg = msg.replace("%label%", label.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &6/%label% unhide [channel] &7- 指定したチャンネルの発言内容を非表示から表示に戻します。
+ */
+ public static String usageUnhide(Object label) {
+ String msg = resources.getString("usageUnhide");
+ if ( msg == null ) return "";
+ msg = msg.replace("%label%", label.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &6/%label% unhide (player) &7- 指定したプレイヤーの発言内容を非表示から表示に戻します。
+ */
+ public static String usageUnhidePlayer(Object label) {
+ String msg = resources.getString("usageUnhidePlayer");
+ if ( msg == null ) return "";
+ msg = msg.replace("%label%", label.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &6/%label% info [channel] &7- チャンネルの情報を表示します。
+ */
+ public static String usageInfo(Object label) {
+ String msg = resources.getString("usageInfo");
+ if ( msg == null ) return "";
+ msg = msg.replace("%label%", label.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &6/%label% log [channel] [p=player] [f=filter] [d=date] [r] &7- チャンネルの発言ログを表示します。
+ */
+ public static String usageLog(Object label) {
+ String msg = resources.getString("usageLog");
+ if ( msg == null ) return "";
+ msg = msg.replace("%label%", label.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &6/%label% create (channel) [description] &7- チャンネルを作成します。
+ */
+ public static String usageCreate(Object label) {
+ String msg = resources.getString("usageCreate");
+ if ( msg == null ) return "";
+ msg = msg.replace("%label%", label.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &6/%label% remove [channel] &7- チャンネルを削除します。
+ */
+ public static String usageRemove(Object label) {
+ String msg = resources.getString("usageRemove");
+ if ( msg == null ) return "";
+ msg = msg.replace("%label%", label.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &6/%label% format [channel] (format...) &7- チャンネルのメッセージフォーマットを設定します。
+ */
+ public static String usageFormat(Object label) {
+ String msg = resources.getString("usageFormat");
+ if ( msg == null ) return "";
+ msg = msg.replace("%label%", label.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &6/%label% moderator [channel] (player) &7- チャンネルのモデレーターを指定したプレイヤーに設定します。
+ */
+ public static String usageModerator(Object label) {
+ String msg = resources.getString("usageModerator");
+ if ( msg == null ) return "";
+ msg = msg.replace("%label%", label.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &6/%label% mod [channel] (player) &7- チャンネルのモデレーターを指定したプレイヤーに設定します。
+ */
+ public static String usageMod(Object label) {
+ String msg = resources.getString("usageMod");
+ if ( msg == null ) return "";
+ msg = msg.replace("%label%", label.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &6/%label% dictionary (add (word) (value)|remove (word)) &7- Japanize変換辞書に新しいワードを登録したり、指定したワードを削除したりします。
+ */
+ public static String usageDictionary(Object label) {
+ String msg = resources.getString("usageDictionary");
+ if ( msg == null ) return "";
+ msg = msg.replace("%label%", label.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &6/%label% dic (add (word) (value)|remove (word)) &7- Japanize変換辞書に新しいワードを登録したり、指定したワードを削除したりします。
+ */
+ public static String usageDic(Object label) {
+ String msg = resources.getString("usageDic");
+ if ( msg == null ) return "";
+ msg = msg.replace("%label%", label.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &6/%label% option [channel] (key=value...) &7- チャンネルのオプションを設定します。
+ */
+ public static String usageOption(Object label) {
+ String msg = resources.getString("usageOption");
+ if ( msg == null ) return "";
+ msg = msg.replace("%label%", label.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &6/%label% template (number) (template...) &7- メッセージフォーマットのテンプレートを登録します。
+ */
+ public static String usageTemplate(Object label) {
+ String msg = resources.getString("usageTemplate");
+ if ( msg == null ) return "";
+ msg = msg.replace("%label%", label.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &6/%label% check &7- モデレーターがいないチャンネルを一覧します。
+ */
+ public static String usageCheck1(Object label) {
+ String msg = resources.getString("usageCheck1");
+ if ( msg == null ) return "";
+ msg = msg.replace("%label%", label.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &6/%label% check remove &7- /ch check で一覧されたチャンネルを全て削除します。
+ */
+ public static String usageCheck2(Object label) {
+ String msg = resources.getString("usageCheck2");
+ if ( msg == null ) return "";
+ msg = msg.replace("%label%", label.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &6/%label% reload &7- config.ymlの再読み込みをします。
+ */
+ public static String usageReload(Object label) {
+ String msg = resources.getString("usageReload");
+ if ( msg == null ) return "";
+ msg = msg.replace("%label%", label.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &6/%label% help [user|mod|admin] [page] &7- ヘルプを表示します。
+ */
+ public static String usageHelp(Object label) {
+ String msg = resources.getString("usageHelp");
+ if ( msg == null ) return "";
+ msg = msg.replace("%label%", label.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &6/%label% set default (player) [channel] &7- 指定したプレイヤーの発言先チャンネルを、指定したチャンネルに設定します。
+ */
+ public static String usageSet1(Object label) {
+ String msg = resources.getString("usageSet1");
+ if ( msg == null ) return "";
+ msg = msg.replace("%label%", label.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &6/%label% (name) [message] &7- 指定したプレイヤーとの個人チャットを開始します。
+ */
+ public static String usageMessage(Object label) {
+ String msg = resources.getString("usageMessage");
+ if ( msg == null ) return "";
+ msg = msg.replace("%label%", label.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &6/%label% [message] &7- 受信した個人チャットに返信します。
+ */
+ public static String usageReply(Object label) {
+ String msg = resources.getString("usageReply");
+ if ( msg == null ) return "";
+ msg = msg.replace("%label%", label.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &6/%label% on|off &7- Turn on/off the Japanize conversion of your chat.
+ */
+ public static String usageJapanize(Object label) {
+ String msg = resources.getString("usageJapanize");
+ if ( msg == null ) return "";
+ msg = msg.replace("%label%", label.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &6/%label% (player) on|off &7- Turn on/off the Japanize conversion of other player's chat.
+ */
+ public static String usageJapanizeOther(Object label) {
+ String msg = resources.getString("usageJapanizeOther");
+ if ( msg == null ) return "";
+ msg = msg.replace("%label%", label.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &e----- &6LunaChat %type% command (&c%num%&6/&c%max%&6) &e-----
+ */
+ public static String usageTop(Object type, Object num, Object max) {
+ String msg = resources.getString("usageTop");
+ if ( msg == null ) return "";
+ msg = msg.replace("%type%", type.toString());
+ msg = msg.replace("%num%", num.toString());
+ msg = msg.replace("%max%", max.toString());
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &e-----------------------------------------
+ */
+ public static String usageFoot() {
+ String msg = resources.getString("usageFoot");
+ if ( msg == null ) return "";
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * &6次のページを見るには、&c/%label% help %type% %next%&6 と実行してください。
+ */
+ public static String usageNoticeNextPage(Object label, Object type, Object next) {
+ String msg = resources.getString("usageNoticeNextPage");
+ if ( msg == null ) return "";
+ msg = msg.replace("%label%", label.toString());
+ msg = msg.replace("%type%", type.toString());
+ msg = msg.replace("%next%", next.toString());
+ return Utility.replaceColorCode(msg);
+ }
+ // === Auto-generated methods area end. ===
+}
diff --git a/src/main/java/com/github/ucchyocean/lc/NGWordAction.java b/src/main/java/com/github/ucchyocean/lc3/NGWordAction.java
similarity index 94%
rename from src/main/java/com/github/ucchyocean/lc/NGWordAction.java
rename to src/main/java/com/github/ucchyocean/lc3/NGWordAction.java
index 4de73652..bb15f1ce 100644
--- a/src/main/java/com/github/ucchyocean/lc/NGWordAction.java
+++ b/src/main/java/com/github/ucchyocean/lc3/NGWordAction.java
@@ -1,9 +1,9 @@
/*
* @author ucchy
* @license LGPLv3
- * @copyright Copyright ucchy 2013
+ * @copyright Copyright ucchy 2020
*/
-package com.github.ucchyocean.lc;
+package com.github.ucchyocean.lc3;
/**
diff --git a/src/main/java/com/github/ucchyocean/lc3/PluginInterface.java b/src/main/java/com/github/ucchyocean/lc3/PluginInterface.java
new file mode 100644
index 00000000..0439eadd
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc3/PluginInterface.java
@@ -0,0 +1,72 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc3;
+
+import java.io.File;
+import java.util.Set;
+import java.util.logging.Level;
+
+/**
+ * プラグインインターフェイス
+ * @author ucchy
+ */
+public interface PluginInterface {
+
+ /**
+ * このプラグインのJarファイル自身を示すFileクラスを返す。
+ * @return Jarファイル
+ */
+ public File getPluginJarFile();
+
+ /**
+ * LunaChatConfigを取得する
+ * @return LunaChatConfig
+ */
+ public LunaChatConfig getLunaChatConfig();
+
+ /**
+ * LunaChatAPIを取得する
+ * @return LunaChatAPI
+ */
+ public LunaChatAPI getLunaChatAPI();
+
+ /**
+ * プラグインのデータ格納フォルダを取得する
+ * @return データ格納フォルダ
+ */
+ public File getDataFolder();
+
+ /**
+ * 通常チャット用のロガーを返す
+ * @return normalChatLogger
+ */
+ public LunaChatLogger getNormalChatLogger();
+
+ /**
+ * オンラインのプレイヤー名一覧を取得する
+ * @return オンラインのプレイヤー名一覧
+ */
+ public Set getOnlinePlayerNames();
+
+ /**
+ * このプラグインのログを記録する
+ * @param level ログレベル
+ * @param msg ログメッセージ
+ */
+ public void log(Level level, String msg);
+
+ /**
+ * UUIDキャッシュデータを取得する
+ * @return UUIDキャッシュデータ
+ */
+ public UUIDCacheData getUUIDCacheData();
+
+ /**
+ * 非同期タスクを実行する
+ * @param task タスク
+ */
+ public void runAsyncTask(Runnable task);
+}
diff --git a/src/main/java/com/github/ucchyocean/lc3/UUIDCacheData.java b/src/main/java/com/github/ucchyocean/lc3/UUIDCacheData.java
new file mode 100644
index 00000000..2c813a11
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc3/UUIDCacheData.java
@@ -0,0 +1,83 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc3;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * UUIDのキャッシュデータを管理するクラス
+ * @author ucchy
+ */
+public class UUIDCacheData {
+
+ private static final String FILE_NAME = "uuidcache.yml";
+
+ // キャッシュデータ key=UUID文字列、value=プレイヤー名
+ private YamlConfig cache;
+
+ private File dataFolder;
+
+ /**
+ * コンストラクタ
+ * @param dataFolder プラグインのデータ格納フォルダ
+ */
+ public UUIDCacheData(File dataFolder) {
+ cache = new YamlConfig();
+ this.dataFolder = dataFolder;
+ reload();
+ }
+
+ /**
+ * キャッシュデータを読み込む
+ */
+ public void reload() {
+ File file = new File(dataFolder, FILE_NAME);
+ if ( !file.exists() ) {
+ // キャッシュファイルがまだ無いなら、からファイルを作成しておく。
+ cache = new YamlConfig();
+ try {
+ cache.save(file);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return;
+ }
+ cache = YamlConfig.load(file);
+ }
+
+ /**
+ * キャッシュデータをファイルに保存する
+ */
+ public void save() {
+ File file = new File(dataFolder, FILE_NAME);
+ try {
+ cache.save(file);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * プレイヤーのUUIDとプレイヤー名を追加する。
+ * @param uuid UUID
+ * @param name プレイヤー名
+ */
+ public void put(String uuid, String name) {
+ cache.set(uuid, name);
+ }
+
+ /**
+ * プレイヤーのUUIDからプレイヤー名を取得する。
+ * @param uuid UUID
+ * @return プレイヤー名(キャッシュされていない場合はnullが返される)
+ */
+ public @Nullable String get(String uuid) {
+ return cache.getString(uuid);
+ }
+}
diff --git a/src/main/java/com/github/ucchyocean/lc3/Utility.java b/src/main/java/com/github/ucchyocean/lc3/Utility.java
new file mode 100644
index 00000000..34745a3e
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc3/Utility.java
@@ -0,0 +1,192 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc3;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.util.Locale;
+import java.util.jar.JarFile;
+import java.util.zip.ZipEntry;
+
+/**
+ * ユーティリティクラス
+ * @author ucchy
+ */
+public class Utility {
+
+ /**
+ * jarファイルの中に格納されているファイルを、jarファイルの外にコピーするメソッド
+ * @param jarFile jarファイル
+ * @param targetFile コピー先
+ * @param sourceFilePath コピー元
+ * @param isBinary バイナリファイルかどうか
+ */
+ public static void copyFileFromJar(
+ File jarFile, File targetFile, String sourceFilePath, boolean isBinary) {
+
+ File parent = targetFile.getParentFile();
+ if (!parent.exists()) {
+ parent.mkdirs();
+ }
+
+ try ( JarFile jar = new JarFile(jarFile) ) {
+ ZipEntry zipEntry = jar.getEntry(sourceFilePath);
+ InputStream is = jar.getInputStream(zipEntry);
+
+ try ( FileOutputStream fos = new FileOutputStream(targetFile) ) {
+
+ if (isBinary) {
+ byte[] buf = new byte[8192];
+ int len;
+ while ((len = is.read(buf)) != -1) {
+ fos.write(buf, 0, len);
+ }
+
+ } else {
+
+ try ( BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
+ BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(fos, "UTF-8")) ) {
+
+ String line;
+ while ((line = reader.readLine()) != null) {
+ writer.write(line);
+ writer.newLine();
+ }
+ }
+ }
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * 文字列内のカラーコード候補(&a)を、カラーコード(§a)に置き換えする
+ * @param source 置き換え元の文字列
+ * @return 置き換え後の文字列
+ */
+ public static String replaceColorCode(String source) {
+ if (source == null) return null;
+ return source.replaceAll("&([0-9a-fk-or])", "\u00A7$1");
+ }
+
+ /**
+ * 文字列に含まれているカラーコード(§a)を除去して返す
+ * @param source 置き換え元の文字列
+ * @return 置き換え後の文字列
+ */
+ public static String stripColorCode(String source) {
+ if (source == null) return null;
+ return stripAltColorCode(source).replaceAll("\u00A7([0-9a-fk-or])", "").replaceAll("&([0-9a-fk-or])", "");
+ }
+
+ /**
+ * 文字列に含まれているカラーコード候補(&a)を除去して返す
+ * @param source 置き換え元の文字列
+ * @return 置き換え後の文字列
+ */
+ public static String stripAltColorCode(String source) {
+ if (source == null) return null;
+ return source.replaceAll("&([0-9a-fk-or])", "");
+ }
+
+ /**
+ * カラーコード(§a)かどうかを判断する
+ * @param code カラーコード
+ * @return カラーコードかどうか
+ */
+ public static boolean isColorCode(String code) {
+ if (code == null) return false;
+ return code.matches("\u00A7[0-9a-fk-orA-FK-OR]");
+ }
+
+ /**
+ * カラーコード候補(&a)かどうかを判断する
+ * @param color カラーコード候補
+ * @return カラーコード候補かどうか
+ */
+ public static boolean isAltColorCode(String code) {
+ if (code == null) return false;
+ return code.matches("&[0-9a-fk-orA-FK-OR]");
+ }
+
+ /**
+ * ChatColorで指定可能な色(REDとかGREENとか)かどうかを判断する
+ * @param color カラー表記の文字列
+ * @return 指定可能かどうか
+ */
+ public static boolean isValidColor(String color) {
+ if ( color == null ) return false;
+ for (ChatColor c : ChatColor.values()) {
+ if (c.name().equals(color.toUpperCase())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * カラー表記の文字列を、カラーコードに変換する
+ * @param color カラー表記の文字列
+ * @return カラーコード
+ */
+ public static String changeToColorCode(String color) {
+
+ return "&" + changeToChatColor(color).getChar();
+ }
+
+ /**
+ * カラー表記の文字列を、ChatColorクラスに変換する
+ * @param color カラー表記の文字列
+ * @return ChatColorクラス
+ */
+ public static ChatColor changeToChatColor(String color) {
+
+ if (isValidColor(color)) {
+ return ChatColor.valueOf(color.toUpperCase());
+ }
+ return ChatColor.WHITE;
+ }
+
+ /**
+ * 指定された文字数のアスタリスクの文字列を返す
+ * @param length アスタリスクの個数
+ * @return 指定された文字数のアスタリスク
+ */
+ public static String getAstariskString(int length) {
+ StringBuilder buf = new StringBuilder();
+ for (int i = 0; i < length; i++) {
+ buf.append("*");
+ }
+ return buf.toString();
+ }
+
+ /**
+ * 指定された名前のプレイヤーが接続したことがあるかどうかを検索する
+ * @param name プレイヤー名
+ * @return 接続したことがあるかどうか
+ */
+ public static boolean existsOfflinePlayer(String name) {
+ // TODO 未実装
+ return false;
+ }
+
+ /**
+ * 動作環境のロケールを取得する。
+ * @return 動作環境のロケール
+ */
+ public static Locale getDefaultLocale() {
+ Locale locale = Locale.getDefault();
+ if ( locale == null ) return Locale.ENGLISH;
+ return locale;
+ }
+}
diff --git a/src/main/java/com/github/ucchyocean/lc3/UtilityBukkit.java b/src/main/java/com/github/ucchyocean/lc3/UtilityBukkit.java
new file mode 100644
index 00000000..fa46c43d
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc3/UtilityBukkit.java
@@ -0,0 +1,58 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc3;
+
+import java.util.Collection;
+
+import org.bukkit.Bukkit;
+import org.bukkit.OfflinePlayer;
+import org.bukkit.entity.Player;
+
+/**
+ * Bukkit関連のユーティリティクラス
+ * @author ucchy
+ */
+public class UtilityBukkit {
+
+ /**
+ * 現在接続中のプレイヤーを全て取得する
+ * @return 接続中の全てのプレイヤー
+ */
+ public static Collection extends Player> getOnlinePlayers() {
+ return Bukkit.getOnlinePlayers();
+ }
+
+ /**
+ * 現在のサーバー接続人数を返します。
+ * @return サーバー接続人数
+ */
+ public static int getOnlinePlayersCount() {
+ return getOnlinePlayers().size();
+ }
+
+ /**
+ * 指定された名前のオフラインプレイヤーを取得する
+ * @param name プレイヤー名
+ * @return オフラインプレイヤー
+ */
+ @SuppressWarnings("deprecation")
+ public static OfflinePlayer getOfflinePlayer(String name) {
+ if (name == null) return null;
+ OfflinePlayer player = Bukkit.getOfflinePlayer(name);
+ if (player == null || (!player.hasPlayedBefore() && !player.isOnline()))
+ return null;
+ return player;
+ }
+
+ /**
+ * 指定された名前のプレイヤーを取得する
+ * @param name プレイヤー名
+ * @return プレイヤー
+ */
+ public static Player getPlayerExact(String name) {
+ return Bukkit.getPlayer(Utility.stripColorCode(name));
+ }
+}
diff --git a/src/main/java/com/github/ucchyocean/lc3/YamlConfig.java b/src/main/java/com/github/ucchyocean/lc3/YamlConfig.java
new file mode 100644
index 00000000..7aaacc39
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc3/YamlConfig.java
@@ -0,0 +1,153 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc3;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.yaml.snakeyaml.Yaml;
+
+/**
+ * Yaml設定読み書きユーティリティクラス
+ * このクラスは、階層構造のデータ形式に対応していないので注意。
+ * @author ucchy
+ */
+public class YamlConfig {
+
+ private Map map = new HashMap<>();
+ private Map defaults = new HashMap<>();
+
+ public static YamlConfig load(InputStream stream) throws IOException {
+
+ YamlConfig config = new YamlConfig();
+ if ( stream == null ) return config;
+
+ Yaml yaml = new Yaml();
+
+ @SuppressWarnings("unchecked")
+ Map map = yaml.loadAs(stream, Map.class);
+ if ( map == null ) {
+ throw new IOException("Cannot load stream as yaml.");
+ }
+
+ config.map = map;
+ return config;
+ }
+
+ public static YamlConfig load(Reader reader) throws IOException {
+
+ YamlConfig config = new YamlConfig();
+ if ( reader == null ) return config;
+
+ Yaml yaml = new Yaml();
+
+ @SuppressWarnings("unchecked")
+ Map map = yaml.loadAs(reader, Map.class);
+ if ( map == null ) {
+ throw new IOException("Cannot load reader as yaml.");
+ }
+
+ config.map = map;
+ return config;
+ }
+
+ public static YamlConfig load(File file) {
+ try ( InputStreamReader reader = new InputStreamReader(new FileInputStream(file), "UTF-8") ) {
+ return load(reader);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ public void save(File file) throws IOException {
+
+ Yaml yaml = new Yaml();
+ String data = yaml.dumpAsMap(map);
+
+ try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {
+ writer.write(data);
+ }
+ }
+
+ public String getRawData() {
+ Yaml yaml = new Yaml();
+ return yaml.dumpAsMap(map);
+ }
+
+ public void set(String key, Object value) {
+ map.put(key, value);
+ }
+
+ public Object get(String key) {
+ return map.get(key);
+ }
+
+ public boolean getBoolean(String key) {
+ return getBoolean(key, false);
+ }
+
+ public boolean getBoolean(String key, boolean defaultValue) {
+ Object val = map.getOrDefault(key, defaults.get(key));
+ return ( val != null && val instanceof Boolean ) ? (boolean)val : defaultValue;
+ }
+
+ public int getInt(String key) {
+ return getInt(key, 0);
+ }
+
+ public int getInt(String key, int defaultValue) {
+ Object val = map.getOrDefault(key, defaults.get(key));
+ return ( val != null && val instanceof Integer ) ? (int)val : defaultValue;
+ }
+
+ public String getString(String key) {
+ return getString(key, null);
+ }
+
+ public String getString(String key, String defaultValue) {
+ Object val = map.getOrDefault(key, defaults.get(key));
+ return ( val != null ) ? val.toString() : null;
+ }
+
+ public List getStringList(String key) {
+ return getStringList(key, null);
+ }
+
+ @SuppressWarnings("unchecked")
+ public List getStringList(String key, ArrayList defaultValue) {
+ Object val = map.getOrDefault(key, defaults.get(key));
+ return ( val != null && val instanceof ArrayList> ) ? (List)val : null;
+ }
+
+ public boolean contains(String key) {
+ return map.containsKey(key);
+ }
+
+ public Set getKeys(boolean deeps) {
+ if ( !deeps ) {
+ return map.keySet();
+ } else {
+ // TODO 未実装
+ return map.keySet();
+ }
+ }
+
+ public void addDefaults(YamlConfig defaults) {
+ this.defaults = defaults.map;
+ }
+}
diff --git a/src/main/java/com/github/ucchyocean/lc/bridge/DynmapBridge.java b/src/main/java/com/github/ucchyocean/lc3/bridge/DynmapBridge.java
similarity index 86%
rename from src/main/java/com/github/ucchyocean/lc/bridge/DynmapBridge.java
rename to src/main/java/com/github/ucchyocean/lc3/bridge/DynmapBridge.java
index 7cf20c6c..45842935 100644
--- a/src/main/java/com/github/ucchyocean/lc/bridge/DynmapBridge.java
+++ b/src/main/java/com/github/ucchyocean/lc3/bridge/DynmapBridge.java
@@ -1,9 +1,9 @@
/*
* @author ucchy
* @license LGPLv3
- * @copyright Copyright ucchy 2013
+ * @copyright Copyright ucchy 2020
*/
-package com.github.ucchyocean.lc.bridge;
+package com.github.ucchyocean.lc3.bridge;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
@@ -12,10 +12,10 @@
import org.dynmap.DynmapAPI;
import org.dynmap.DynmapWebChatEvent;
-import com.github.ucchyocean.lc.LunaChat;
-import com.github.ucchyocean.lc.LunaChatAPI;
-import com.github.ucchyocean.lc.LunaChatConfig;
-import com.github.ucchyocean.lc.channel.Channel;
+import com.github.ucchyocean.lc3.LunaChat;
+import com.github.ucchyocean.lc3.LunaChatAPI;
+import com.github.ucchyocean.lc3.LunaChatConfig;
+import com.github.ucchyocean.lc3.channel.Channel;
/**
* dynmap連携クラス
@@ -72,8 +72,8 @@ public void broadcast(String message) {
@EventHandler
public void onDynmapWebChat(DynmapWebChatEvent event) {
- LunaChatAPI api = LunaChat.getInstance().getLunaChatAPI();
- LunaChatConfig config = LunaChat.getInstance().getLunaChatConfig();
+ LunaChatAPI api = LunaChat.getAPI();
+ LunaChatConfig config = LunaChat.getConfig();
String dchannel = config.getDynmapChannel();
Channel channel = null;
diff --git a/src/main/java/com/github/ucchyocean/lc/bridge/McMMOBridge.java b/src/main/java/com/github/ucchyocean/lc3/bridge/McMMOBridge.java
similarity index 75%
rename from src/main/java/com/github/ucchyocean/lc/bridge/McMMOBridge.java
rename to src/main/java/com/github/ucchyocean/lc3/bridge/McMMOBridge.java
index 79c39d24..21d7b5db 100644
--- a/src/main/java/com/github/ucchyocean/lc/bridge/McMMOBridge.java
+++ b/src/main/java/com/github/ucchyocean/lc3/bridge/McMMOBridge.java
@@ -1,9 +1,9 @@
/*
* @author ucchy
* @license LGPLv3
- * @copyright Copyright ucchy 2016
+ * @copyright Copyright ucchy 2020
*/
-package com.github.ucchyocean.lc.bridge;
+package com.github.ucchyocean.lc3.bridge;
import java.util.List;
import java.util.regex.Matcher;
@@ -13,13 +13,14 @@
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
-import com.github.ucchyocean.lc.LunaChat;
-import com.github.ucchyocean.lc.LunaChatAPI;
-import com.github.ucchyocean.lc.LunaChatConfig;
-import com.github.ucchyocean.lc.Utility;
-import com.github.ucchyocean.lc.channel.ChannelPlayer;
-import com.github.ucchyocean.lc.channel.DelayedJapanizeRecipientChatTask;
-import com.github.ucchyocean.lc.japanize.JapanizeType;
+import com.github.ucchyocean.lc3.LunaChat;
+import com.github.ucchyocean.lc3.LunaChatAPI;
+import com.github.ucchyocean.lc3.LunaChatBukkit;
+import com.github.ucchyocean.lc3.LunaChatConfig;
+import com.github.ucchyocean.lc3.Utility;
+import com.github.ucchyocean.lc3.bukkit.BukkitRecipientChatJapanizeTask;
+import com.github.ucchyocean.lc3.japanize.JapanizeType;
+import com.github.ucchyocean.lc3.member.ChannelMember;
import com.gmail.nossr50.api.PartyAPI;
import com.gmail.nossr50.events.chat.McMMOPartyChatEvent;
@@ -40,9 +41,9 @@ public void onMcMMOPartyChatEvent(McMMOPartyChatEvent event) {
List recipients = PartyAPI.getOnlineMembers(event.getParty());
String message = event.getMessage();
- ChannelPlayer player = ChannelPlayer.getChannelPlayer(event.getSender());
- LunaChatConfig config = LunaChat.getInstance().getLunaChatConfig();
- LunaChatAPI api = LunaChat.getInstance().getLunaChatAPI();
+ ChannelMember player = ChannelMember.getChannelMember(event.getSender());
+ LunaChatConfig config = LunaChat.getConfig();
+ LunaChatAPI api = LunaChat.getAPI();
// NGワード発言をマスク
for ( Pattern pattern : config.getNgwordCompiled() ) {
@@ -69,7 +70,7 @@ public void onMcMMOPartyChatEvent(McMMOPartyChatEvent event) {
}
// 2byteコードを含むなら、Japanize変換は行わない
- String kanaTemp = Utility.stripColor(message);
+ String kanaTemp = Utility.stripColorCode(message);
if ( !skipJapanize &&
( kanaTemp.getBytes().length > kanaTemp.length() ||
kanaTemp.matches("[ \\uFF61-\\uFF9F]+") ) ) {
@@ -78,7 +79,7 @@ public void onMcMMOPartyChatEvent(McMMOPartyChatEvent event) {
// Japanize変換と、発言処理
if ( !skipJapanize &&
- LunaChat.getInstance().getLunaChatAPI().isPlayerJapanize(player.getName()) &&
+ LunaChat.getAPI().isPlayerJapanize(player.getName()) &&
config.getJapanizeType() != JapanizeType.NONE ) {
int lineType = config.getJapanizeDisplayLine();
@@ -98,12 +99,12 @@ public void onMcMMOPartyChatEvent(McMMOPartyChatEvent event) {
String taskFormat = Utility.replaceColorCode(config.getJapanizeLine2Format());
- DelayedJapanizeRecipientChatTask task = new DelayedJapanizeRecipientChatTask(
+ BukkitRecipientChatJapanizeTask task = new BukkitRecipientChatJapanizeTask(
message, config.getJapanizeType(), player, taskFormat, recipients);
// 発言処理を必ず先に実施させるため、遅延を入れてタスクを実行する。
int wait = config.getJapanizeWait();
- task.runTaskLater(LunaChat.getInstance(), wait);
+ task.runTaskLater(LunaChatBukkit.getInstance(), wait);
}
}
diff --git a/src/main/java/com/github/ucchyocean/lc/bridge/MultiverseCoreBridge.java b/src/main/java/com/github/ucchyocean/lc3/bridge/MultiverseCoreBridge.java
similarity index 92%
rename from src/main/java/com/github/ucchyocean/lc/bridge/MultiverseCoreBridge.java
rename to src/main/java/com/github/ucchyocean/lc3/bridge/MultiverseCoreBridge.java
index f620ee9f..1ae90ef2 100644
--- a/src/main/java/com/github/ucchyocean/lc/bridge/MultiverseCoreBridge.java
+++ b/src/main/java/com/github/ucchyocean/lc3/bridge/MultiverseCoreBridge.java
@@ -1,9 +1,9 @@
/*
* @author ucchy
* @license LGPLv3
- * @copyright Copyright ucchy 2015
+ * @copyright Copyright ucchy 2020
*/
-package com.github.ucchyocean.lc.bridge;
+package com.github.ucchyocean.lc3.bridge;
import org.bukkit.World;
import org.bukkit.plugin.Plugin;
diff --git a/src/main/java/com/github/ucchyocean/lc/bridge/VaultChatBridge.java b/src/main/java/com/github/ucchyocean/lc3/bridge/VaultChatBridge.java
similarity index 95%
rename from src/main/java/com/github/ucchyocean/lc/bridge/VaultChatBridge.java
rename to src/main/java/com/github/ucchyocean/lc3/bridge/VaultChatBridge.java
index 67e32608..f2e6d6e8 100644
--- a/src/main/java/com/github/ucchyocean/lc/bridge/VaultChatBridge.java
+++ b/src/main/java/com/github/ucchyocean/lc3/bridge/VaultChatBridge.java
@@ -1,9 +1,9 @@
/*
* @author ucchy
* @license LGPLv3
- * @copyright Copyright ucchy 2013
+ * @copyright Copyright ucchy 2020
*/
-package com.github.ucchyocean.lc.bridge;
+package com.github.ucchyocean.lc3.bridge;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
diff --git a/src/main/java/com/github/ucchyocean/lc/PlayerListener.java b/src/main/java/com/github/ucchyocean/lc3/bukkit/BukkitEventListener.java
similarity index 75%
rename from src/main/java/com/github/ucchyocean/lc/PlayerListener.java
rename to src/main/java/com/github/ucchyocean/lc3/bukkit/BukkitEventListener.java
index 1ca94c08..74256ce6 100644
--- a/src/main/java/com/github/ucchyocean/lc/PlayerListener.java
+++ b/src/main/java/com/github/ucchyocean/lc3/bukkit/BukkitEventListener.java
@@ -1,10 +1,11 @@
/*
* @author ucchy
* @license LGPLv3
- * @copyright Copyright ucchy 2013
+ * @copyright Copyright ucchy 2020
*/
-package com.github.ucchyocean.lc;
+package com.github.ucchyocean.lc3.bukkit;
+import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
@@ -12,9 +13,7 @@
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
-import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
@@ -23,25 +22,24 @@
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
-import com.github.ucchyocean.lc.bridge.VaultChatBridge;
-import com.github.ucchyocean.lc.channel.Channel;
-import com.github.ucchyocean.lc.channel.ChannelPlayer;
-import com.github.ucchyocean.lc.channel.ChannelPlayerName;
-import com.github.ucchyocean.lc.channel.ChannelPlayerUUID;
-import com.github.ucchyocean.lc.channel.DelayedJapanizeNormalChatTask;
-import com.github.ucchyocean.lc.event.LunaChatPreChatEvent;
-import com.github.ucchyocean.lc.japanize.JapanizeType;
+import com.github.ucchyocean.lc3.LunaChat;
+import com.github.ucchyocean.lc3.LunaChatAPI;
+import com.github.ucchyocean.lc3.LunaChatBukkit;
+import com.github.ucchyocean.lc3.LunaChatConfig;
+import com.github.ucchyocean.lc3.Messages;
+import com.github.ucchyocean.lc3.Utility;
+import com.github.ucchyocean.lc3.bridge.VaultChatBridge;
+import com.github.ucchyocean.lc3.channel.Channel;
+import com.github.ucchyocean.lc3.event.EventResult;
+import com.github.ucchyocean.lc3.japanize.JapanizeType;
+import com.github.ucchyocean.lc3.member.ChannelMember;
+import com.github.ucchyocean.lc3.member.ChannelMemberBukkit;
/**
- * プレイヤーの行動を監視するリスナ
+ * Bukkit関連のイベントを監視するリスナ
* @author ucchy
*/
-public class PlayerListener implements Listener {
-
- private static final String MOTD_FIRSTLINE = Resources.get("motdFirstLine");
- private static final String LIST_ENDLINE = Resources.get("listEndLine");
- private static final String LIST_FORMAT = Resources.get("listFormat");
- private static final String PREERR = Resources.get("errorPrefix");
+public class BukkitEventListener implements Listener {
private SimpleDateFormat dateFormat;
private SimpleDateFormat timeFormat;
@@ -49,7 +47,7 @@ public class PlayerListener implements Listener {
/**
* コンストラクタ
*/
- public PlayerListener() {
+ public BukkitEventListener() {
dateFormat = new SimpleDateFormat("yyyy/MM/dd");
timeFormat = new SimpleDateFormat("HH:mm:ss");
}
@@ -60,7 +58,7 @@ public PlayerListener() {
*/
@EventHandler(priority=EventPriority.LOWEST, ignoreCancelled=true)
public void onAsyncPlayerChatLowest(AsyncPlayerChatEvent event) {
- if ( LunaChat.getInstance().getLunaChatConfig().getPlayerChatEventListenerPriority() == EventPriority.LOWEST ) {
+ if ( matchesEventPriority(EventPriority.LOWEST) ) {
processChatEvent(event);
}
}
@@ -71,7 +69,7 @@ public void onAsyncPlayerChatLowest(AsyncPlayerChatEvent event) {
*/
@EventHandler(priority=EventPriority.LOW, ignoreCancelled=true)
public void onAsyncPlayerChatLow(AsyncPlayerChatEvent event) {
- if ( LunaChat.getInstance().getLunaChatConfig().getPlayerChatEventListenerPriority() == EventPriority.LOW ) {
+ if ( matchesEventPriority(EventPriority.LOW) ) {
processChatEvent(event);
}
}
@@ -82,7 +80,7 @@ public void onAsyncPlayerChatLow(AsyncPlayerChatEvent event) {
*/
@EventHandler(priority=EventPriority.NORMAL, ignoreCancelled=true)
public void onAsyncPlayerChatNormal(AsyncPlayerChatEvent event) {
- if ( LunaChat.getInstance().getLunaChatConfig().getPlayerChatEventListenerPriority() == EventPriority.NORMAL ) {
+ if ( matchesEventPriority(EventPriority.NORMAL) ) {
processChatEvent(event);
}
}
@@ -93,7 +91,7 @@ public void onAsyncPlayerChatNormal(AsyncPlayerChatEvent event) {
*/
@EventHandler(priority=EventPriority.HIGH, ignoreCancelled=true)
public void onAsyncPlayerChatHigh(AsyncPlayerChatEvent event) {
- if ( LunaChat.getInstance().getLunaChatConfig().getPlayerChatEventListenerPriority() == EventPriority.HIGH ) {
+ if ( matchesEventPriority(EventPriority.HIGH) ) {
processChatEvent(event);
}
}
@@ -104,7 +102,7 @@ public void onAsyncPlayerChatHigh(AsyncPlayerChatEvent event) {
*/
@EventHandler(priority=EventPriority.HIGHEST, ignoreCancelled=true)
public void onAsyncPlayerChatHighest(AsyncPlayerChatEvent event) {
- if ( LunaChat.getInstance().getLunaChatConfig().getPlayerChatEventListenerPriority() == EventPriority.HIGHEST ) {
+ if ( matchesEventPriority(EventPriority.HIGHEST) ) {
processChatEvent(event);
}
}
@@ -116,9 +114,13 @@ public void onAsyncPlayerChatHighest(AsyncPlayerChatEvent event) {
@EventHandler
public void onJoin(PlayerJoinEvent event) {
- LunaChatConfig config = LunaChat.getInstance().getLunaChatConfig();
+ LunaChatConfig config = LunaChat.getConfig();
Player player = event.getPlayer();
+ // UUIDをキャッシュ
+ LunaChat.getUUIDCacheData().put(player.getUniqueId().toString(), player.getName());
+ LunaChat.getUUIDCacheData().save();
+
// 強制参加チャンネル設定を確認し、参加させる
forceJoinToForceJoinChannels(player);
@@ -144,19 +146,18 @@ public void onJoin(PlayerJoinEvent event) {
public void onQuit(PlayerQuitEvent event) {
Player player = event.getPlayer();
+ String pname = player.getName();
// お互いがオフラインになるPMチャンネルがある場合は
// チャンネルをクリアする
ArrayList deleteList = new ArrayList();
- for ( Channel channel : LunaChat.getInstance().getLunaChatAPI().getChannels() ) {
+ for ( Channel channel : LunaChat.getAPI().getChannels() ) {
String cname = channel.getName();
- String pname = player.getName();
if ( channel.isPersonalChat() && cname.contains(pname) ) {
boolean isAllOffline = true;
- for ( ChannelPlayer cp : channel.getMembers() ) {
- if ( !cp.equals(player) && cp.isOnline() &&
- (cp instanceof ChannelPlayerName || cp instanceof ChannelPlayerUUID) ) {
+ for ( ChannelMember cp : channel.getMembers() ) {
+ if ( cp.isOnline() ) {
isAllOffline = false;
}
}
@@ -167,7 +168,7 @@ public void onQuit(PlayerQuitEvent event) {
}
for ( Channel channel : deleteList ) {
- LunaChat.getInstance().getLunaChatAPI().removeChannel(channel.getName());
+ LunaChat.getAPI().removeChannel(channel.getName());
}
}
@@ -177,8 +178,8 @@ public void onQuit(PlayerQuitEvent event) {
*/
private void processChatEvent(AsyncPlayerChatEvent event) {
- LunaChatConfig config = LunaChat.getInstance().getLunaChatConfig();
- LunaChatAPI api = LunaChat.getInstance().getLunaChatAPI();
+ LunaChatConfig config = LunaChat.getConfig();
+ LunaChatAPI api = LunaChat.getAPI();
// 頭にglobalMarkerが付いている場合は、グローバル発言にする
if ( config.getGlobalMarker() != null &&
@@ -206,11 +207,11 @@ private void processChatEvent(AsyncPlayerChatEvent event) {
Channel channel = api.getChannel(name);
if ( channel != null && !channel.isPersonalChat() ) {
- ChannelPlayer player =
- ChannelPlayer.getChannelPlayer(event.getPlayer());
+ ChannelMember player =
+ ChannelMember.getChannelMember(event.getPlayer());
if ( !channel.getMembers().contains(player) ) {
// 指定されたチャンネルに参加していないなら、エラーを表示して何も発言せずに終了する。
- sendResourceMessage(event.getPlayer(), PREERR, "errmsgNomember");
+ event.getPlayer().sendMessage(Messages.errmsgNomember());
event.setCancelled(true);
return;
}
@@ -223,8 +224,8 @@ private void processChatEvent(AsyncPlayerChatEvent event) {
}
}
- ChannelPlayer player =
- ChannelPlayer.getChannelPlayer(event.getPlayer());
+ ChannelMember player =
+ ChannelMember.getChannelMember(event.getPlayer());
Channel channel = api.getDefaultChannel(player.getName());
// デフォルトの発言先が無い場合
@@ -253,10 +254,10 @@ private void processChatEvent(AsyncPlayerChatEvent event) {
*/
private void chatGlobal(AsyncPlayerChatEvent event) {
- LunaChatConfig config = LunaChat.getInstance().getLunaChatConfig();
- LunaChatAPI api = LunaChat.getInstance().getLunaChatAPI();
- ChannelPlayer player =
- ChannelPlayer.getChannelPlayer(event.getPlayer());
+ LunaChatConfig config = LunaChat.getConfig();
+ LunaChatAPI api = LunaChat.getAPI();
+ ChannelMember player =
+ ChannelMember.getChannelMember(event.getPlayer());
if ( !config.getGlobalChannel().equals("") ) {
// グローバルチャンネル設定がある場合
@@ -268,18 +269,17 @@ private void chatGlobal(AsyncPlayerChatEvent event) {
}
// LunaChatPreChatEvent イベントコール
- LunaChatPreChatEvent preChatEvent = new LunaChatPreChatEvent(
+ EventResult result = LunaChat.getEventSender().sendLunaChatPreChatEvent(
global.getName(), player, event.getMessage());
- Bukkit.getPluginManager().callEvent(preChatEvent);
- if ( preChatEvent.isCancelled() ) {
+ if ( result.isCancelled() ) {
event.setCancelled(true);
return;
}
- Channel alt = preChatEvent.getChannel();
+ Channel alt = result.getChannel();
if ( alt != null ) {
global = alt;
}
- String message = preChatEvent.getMessage();
+ String message = result.getMessage();
// デフォルト発言先が無いなら、グローバルチャンネルに設定する
Channel dchannel = api.getDefaultChannel(player.getName());
@@ -323,8 +323,8 @@ private void chatGlobal(AsyncPlayerChatEvent event) {
}
// hideされているプレイヤーを、recipientから抜く
- for ( ChannelPlayer cp : api.getHidelist(player) ) {
- Player p = cp.getPlayer();
+ for ( ChannelMember cp : api.getHidelist(player) ) {
+ Player p = ((ChannelMemberBukkit)cp).getPlayer();
if ( p != null ) {
event.getRecipients().remove(p);
}
@@ -338,17 +338,17 @@ private void chatGlobal(AsyncPlayerChatEvent event) {
message = message.substring(marker.length());
}
- // 2byteコードを含むなら、Japanize変換は行わない
- String kanaTemp = Utility.stripColor(message);
+ // 2byteコードを含む、または、半角カタカナのみなら、Japanize変換は行わない
+ String kanaTemp = Utility.stripColorCode(message);
if ( !skipJapanize &&
- ( kanaTemp.getBytes().length > kanaTemp.length() ||
+ ( kanaTemp.getBytes(StandardCharsets.UTF_8).length > kanaTemp.length() ||
kanaTemp.matches("[ \\uFF61-\\uFF9F]+") ) ) {
skipJapanize = true;
}
// Japanize変換と、発言処理
if ( !skipJapanize &&
- LunaChat.getInstance().getLunaChatAPI().isPlayerJapanize(player.getName()) &&
+ LunaChat.getAPI().isPlayerJapanize(player.getName()) &&
config.getJapanizeType() != JapanizeType.NONE ) {
int lineType = config.getJapanizeDisplayLine();
@@ -368,12 +368,12 @@ private void chatGlobal(AsyncPlayerChatEvent event) {
String taskFormat = Utility.replaceColorCode(config.getJapanizeLine2Format());
- DelayedJapanizeNormalChatTask task = new DelayedJapanizeNormalChatTask(
+ BukkitNormalChatJapanizeTask task = new BukkitNormalChatJapanizeTask(
message, config.getJapanizeType(), player, taskFormat, event);
// 発言処理を必ず先に実施させるため、遅延を入れてタスクを実行する。
int wait = config.getJapanizeWait();
- task.runTaskLater(LunaChat.getInstance(), wait);
+ task.runTaskLater(LunaChatBukkit.getInstance(), wait);
}
}
@@ -394,8 +394,8 @@ private void chatGlobal(AsyncPlayerChatEvent event) {
*/
private boolean tryJoinToGlobalChannel(Player player) {
- LunaChatConfig config = LunaChat.getInstance().getLunaChatConfig();
- LunaChatAPI api = LunaChat.getInstance().getLunaChatAPI();
+ LunaChatConfig config = LunaChat.getConfig();
+ LunaChatAPI api = LunaChat.getAPI();
String gcName = config.getGlobalChannel();
@@ -420,8 +420,8 @@ private boolean tryJoinToGlobalChannel(Player player) {
*/
private void forceJoinToForceJoinChannels(Player player) {
- LunaChatConfig config = LunaChat.getInstance().getLunaChatConfig();
- LunaChatAPI api = LunaChat.getInstance().getLunaChatAPI();
+ LunaChatConfig config = LunaChat.getConfig();
+ LunaChatAPI api = LunaChat.getAPI();
List forceJoinChannels = config.getForceJoinChannels();
@@ -434,7 +434,7 @@ private void forceJoinToForceJoinChannels(Player player) {
}
// チャンネルのメンバーでないなら、参加する
- ChannelPlayer cp = ChannelPlayer.getChannelPlayer(player);
+ ChannelMember cp = ChannelMember.getChannelMember(player);
if ( !channel.getMembers().contains(cp) ) {
channel.addMember(cp);
}
@@ -471,7 +471,7 @@ private String replaceNormalChatFormatKeywords(String org, Player player) {
String prefix = "";
String suffix = "";
- VaultChatBridge vaultchat = LunaChat.getInstance().getVaultChat();
+ VaultChatBridge vaultchat = LunaChatBukkit.getInstance().getVaultChat();
if ( vaultchat != null ) {
prefix = vaultchat.getPlayerPrefix(player);
suffix = vaultchat.getPlayerSuffix(player);
@@ -483,8 +483,8 @@ private String replaceNormalChatFormatKeywords(String org, Player player) {
if ( format.contains("%world") ) {
String worldname = null;
- if ( LunaChat.getInstance().getMultiverseCore() != null ) {
- worldname = LunaChat.getInstance().getMultiverseCore().getWorldAlias(player.getWorld());
+ if ( LunaChatBukkit.getInstance().getMultiverseCore() != null ) {
+ worldname = LunaChatBukkit.getInstance().getMultiverseCore().getWorldAlias(player.getWorld());
}
if ( worldname == null || worldname.equals("") ) {
worldname = player.getWorld().getName();
@@ -492,6 +492,8 @@ private String replaceNormalChatFormatKeywords(String org, Player player) {
format = format.replace("%world", worldname);
}
+ format = format.replace("%server", "");
+
return Utility.replaceColorCode(format);
}
@@ -502,8 +504,8 @@ private String replaceNormalChatFormatKeywords(String org, Player player) {
*/
private ArrayList getListForMotd(Player player) {
- ChannelPlayer cp = ChannelPlayer.getChannelPlayer(player);
- LunaChatAPI api = LunaChat.getInstance().getLunaChatAPI();
+ ChannelMember cp = ChannelMember.getChannelMember(player);
+ LunaChatAPI api = LunaChat.getAPI();
Channel dc = api.getDefaultChannel(cp.getName());
String dchannel = "";
if ( dc != null ) {
@@ -511,7 +513,7 @@ private ArrayList getListForMotd(Player player) {
}
ArrayList items = new ArrayList();
- items.add(MOTD_FIRSTLINE);
+ items.add(Messages.motdFirstLine());
for ( Channel channel : api.getChannels() ) {
// BANされているチャンネルは表示しない
@@ -537,11 +539,10 @@ private ArrayList getListForMotd(Player player) {
String desc = channel.getDescription();
int onlineNum = channel.getOnlineNum();
int memberNum = channel.getTotalNum();
- String item = String.format(
- LIST_FORMAT, disp, onlineNum, memberNum, desc);
+ String item = Messages.listFormat(disp, onlineNum, memberNum, desc);
items.add(item);
}
- items.add(LIST_ENDLINE);
+ items.add(Messages.listEndLine());
return items;
}
@@ -553,20 +554,19 @@ private ArrayList getListForMotd(Player player) {
* @param message 発言内容
* @return イベントでキャンセルされたかどうか
*/
- private boolean chatToChannelWithEvent(ChannelPlayer player, Channel channel, String message) {
+ private boolean chatToChannelWithEvent(ChannelMember player, Channel channel, String message) {
// LunaChatPreChatEvent イベントコール
- LunaChatPreChatEvent preChatEvent = new LunaChatPreChatEvent(
+ EventResult result = LunaChat.getEventSender().sendLunaChatPreChatEvent(
channel.getName(), player, message);
- Bukkit.getPluginManager().callEvent(preChatEvent);
- if ( preChatEvent.isCancelled() ) {
+ if ( result.isCancelled() ) {
return true;
}
- Channel alt = preChatEvent.getChannel();
+ Channel alt = result.getChannel();
if ( alt != null ) {
channel = alt;
}
- message = preChatEvent.getMessage();
+ message = result.getMessage();
// チャンネルチャット発言
channel.chat(player, message);
@@ -580,25 +580,16 @@ private boolean chatToChannelWithEvent(ChannelPlayer player, Channel channel, St
* @param player
*/
private void logNormalChat(String message, String player) {
-
- LunaChat.getInstance().getNormalChatLogger().log(message, player);
+ LunaChat.getNormalChatLogger().log(message, player);
}
/**
- * メッセージリソースのメッセージを、カラーコード置き換えしつつ、senderに送信する
- * @param sender メッセージの送り先
- * @param pre プレフィックス
- * @param key リソースキー
- * @param args リソース内の置き換え対象キーワード
+ * 指定されたEventPriorityが、LunaChatConfigで指定されているEventPriorityと一致するかどうかを調べる
+ * @param priority
+ * @return 一致するかどうか
*/
- private void sendResourceMessage(
- CommandSender sender, String pre, String key, Object... args) {
-
- String org = Resources.get(key);
- if ( org == null || org.equals("") ) {
- return;
- }
- String msg = String.format(pre + org, args);
- sender.sendMessage(msg);
+ private boolean matchesEventPriority(EventPriority priority) {
+ String c = LunaChat.getConfig().getPlayerChatEventListenerPriority().name();
+ return c.equals(priority.name());
}
}
diff --git a/src/main/java/com/github/ucchyocean/lc3/bukkit/BukkitEventSender.java b/src/main/java/com/github/ucchyocean/lc3/bukkit/BukkitEventSender.java
new file mode 100644
index 00000000..5b2abeb3
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc3/bukkit/BukkitEventSender.java
@@ -0,0 +1,366 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc3.bukkit;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.bukkit.Bukkit;
+import org.bukkit.command.CommandSender;
+
+import com.github.ucchyocean.lc.channel.ChannelPlayer;
+import com.github.ucchyocean.lc.channel.ChannelPlayerBlock;
+import com.github.ucchyocean.lc.channel.ChannelPlayerConsole;
+import com.github.ucchyocean.lc.channel.ChannelPlayerName;
+import com.github.ucchyocean.lc.channel.ChannelPlayerUUID;
+import com.github.ucchyocean.lc.event.LunaChatChannelChatEvent;
+import com.github.ucchyocean.lc.event.LunaChatChannelCreateEvent;
+import com.github.ucchyocean.lc.event.LunaChatChannelMemberChangedEvent;
+import com.github.ucchyocean.lc.event.LunaChatChannelMessageEvent;
+import com.github.ucchyocean.lc.event.LunaChatChannelOptionChangedEvent;
+import com.github.ucchyocean.lc.event.LunaChatChannelRemoveEvent;
+import com.github.ucchyocean.lc.event.LunaChatPostJapanizeEvent;
+import com.github.ucchyocean.lc.event.LunaChatPreChatEvent;
+import com.github.ucchyocean.lc3.bukkit.event.LunaChatBukkitChannelChatEvent;
+import com.github.ucchyocean.lc3.bukkit.event.LunaChatBukkitChannelCreateEvent;
+import com.github.ucchyocean.lc3.bukkit.event.LunaChatBukkitChannelMemberChangedEvent;
+import com.github.ucchyocean.lc3.bukkit.event.LunaChatBukkitChannelMessageEvent;
+import com.github.ucchyocean.lc3.bukkit.event.LunaChatBukkitChannelOptionChangedEvent;
+import com.github.ucchyocean.lc3.bukkit.event.LunaChatBukkitChannelRemoveEvent;
+import com.github.ucchyocean.lc3.bukkit.event.LunaChatBukkitPostJapanizeEvent;
+import com.github.ucchyocean.lc3.bukkit.event.LunaChatBukkitPreChatEvent;
+import com.github.ucchyocean.lc3.event.EventResult;
+import com.github.ucchyocean.lc3.event.EventSenderInterface;
+import com.github.ucchyocean.lc3.member.ChannelMember;
+import com.github.ucchyocean.lc3.member.ChannelMemberBlock;
+import com.github.ucchyocean.lc3.member.ChannelMemberBukkitConsole;
+import com.github.ucchyocean.lc3.member.ChannelMemberBungee;
+import com.github.ucchyocean.lc3.member.ChannelMemberPlayer;
+
+/**
+ * Bukkitのイベント実行クラス
+ * @author ucchy
+ */
+@SuppressWarnings("deprecation")
+public class BukkitEventSender implements EventSenderInterface {
+
+ /**
+ * チャンネルチャットのチャットイベント
+ * @param channelName チャンネル名
+ * @param player 発言者
+ * @param originalMessage 発言内容
+ * @param ngMaskedMessage 発言内容(NGマスク後)
+ * @param messageFormat 発言に適用されるフォーマット
+ * @return イベント実行結果
+ * @see com.github.ucchyocean.lc3.event.EventSenderInterface#sendLunaChatChannelChatEvent(java.lang.String, com.github.ucchyocean.lc3.member.ChannelMember, java.lang.String, java.lang.String, java.lang.String)
+ */
+ @Override
+ public EventResult sendLunaChatChannelChatEvent(String channelName, ChannelMember member, String originalMessage,
+ String ngMaskedMessage, String messageFormat) {
+
+ LunaChatBukkitChannelChatEvent event =
+ new LunaChatBukkitChannelChatEvent(
+ channelName, member, originalMessage, ngMaskedMessage, messageFormat);
+ Bukkit.getPluginManager().callEvent(event);
+
+ LunaChatChannelChatEvent legacy = new LunaChatChannelChatEvent(
+ channelName, convertChannelMemberToChannelPlayer(member),
+ originalMessage, event.getNgMaskedMessage(), event.getMessageFormat());
+ legacy.setCancelled(event.isCancelled());
+ Bukkit.getPluginManager().callEvent(legacy);
+
+ EventResult result = new EventResult();
+ result.setCancelled(legacy.isCancelled());
+ result.setNgMaskedMessage(legacy.getNgMaskedMessage());
+ result.setMessageFormat(legacy.getMessageFormat());
+ return result;
+ }
+
+ /**
+ * チャンネル作成イベント
+ * @param channelName チャンネル名
+ * @param member 作成した人
+ * @return イベント実行結果
+ * @see com.github.ucchyocean.lc3.event.EventSenderInterface#sendLunaChatChannelCreateEvent(java.lang.String, com.github.ucchyocean.lc3.member.ChannelMember)
+ */
+ @Override
+ public EventResult sendLunaChatChannelCreateEvent(String channelName, ChannelMember member) {
+
+ LunaChatBukkitChannelCreateEvent event =
+ new LunaChatBukkitChannelCreateEvent(channelName, member);
+ Bukkit.getPluginManager().callEvent(event);
+
+ LunaChatChannelCreateEvent legacy = new LunaChatChannelCreateEvent(
+ event.getChannelName(), convertChannelMemberToCommandSender(member));
+ legacy.setCancelled(event.isCancelled());
+ Bukkit.getPluginManager().callEvent(legacy);
+
+ EventResult result = new EventResult();
+ result.setCancelled(legacy.isCancelled());
+ result.setChannelName(legacy.getChannelName());
+ return result;
+ }
+
+ /**
+ * メンバー変更イベント
+ * @param channelName チャンネル名
+ * @param before 変更前のメンバー
+ * @param after 変更後のメンバー
+ * @return イベント実行結果
+ * @see com.github.ucchyocean.lc3.event.EventSenderInterface#sendLunaChatChannelMemberChangedEvent(java.lang.String, java.util.List, java.util.List)
+ */
+ @Override
+ public EventResult sendLunaChatChannelMemberChangedEvent(String channelName, List before,
+ List after) {
+
+ LunaChatBukkitChannelMemberChangedEvent event =
+ new LunaChatBukkitChannelMemberChangedEvent(channelName, before, after);
+ Bukkit.getPluginManager().callEvent(event);
+
+ LunaChatChannelMemberChangedEvent legacy =
+ new LunaChatChannelMemberChangedEvent(channelName,
+ convertMemberListToPlayerList(before), convertMemberListToPlayerList(after));
+ legacy.setCancelled(event.isCancelled());
+ Bukkit.getPluginManager().callEvent(legacy);
+
+ EventResult result = new EventResult();
+ result.setCancelled(event.isCancelled());
+ return result;
+ }
+
+ /**
+ * チャンネルチャットのメッセージイベント。このイベントはキャンセルできない。
+ * @param channelName チャンネル名
+ * @param member 発言者
+ * @param message 発言内容(NGマスクやJapanizeされた後の内容)
+ * @param recipients 受信者
+ * @param displayName 発言者の表示名
+ * @param originalMessage 発言内容(元々の内容)
+ * @return イベント実行結果
+ * @see com.github.ucchyocean.lc3.event.EventSenderInterface#sendLunaChatChannelMessageEvent(java.lang.String, com.github.ucchyocean.lc3.member.ChannelMember, java.lang.String, java.util.ArrayList, java.lang.String, java.lang.String)
+ */
+ @Override
+ public EventResult sendLunaChatChannelMessageEvent(String channelName, ChannelMember member, String message,
+ List recipients, String displayName, String originalMessage) {
+
+ LunaChatBukkitChannelMessageEvent event =
+ new LunaChatBukkitChannelMessageEvent(
+ channelName, member, message, recipients, displayName, originalMessage);
+ Bukkit.getPluginManager().callEvent(event);
+
+ ArrayList recipientsTemp =
+ new ArrayList(convertMemberListToPlayerList(event.getRecipients()));
+ LunaChatChannelMessageEvent legacy =
+ new LunaChatChannelMessageEvent(
+ channelName, convertChannelMemberToChannelPlayer(member),
+ event.getMessage(), recipientsTemp, displayName, originalMessage);
+ Bukkit.getPluginManager().callEvent(legacy);
+
+ EventResult result = new EventResult();
+ result.setMessage(legacy.getMessage());
+ result.setRecipients(convertPlayerListToMemberList(legacy.getRecipients()));
+ return result;
+ }
+
+ /**
+ * オプション変更イベント
+ * @param channelName チャンネル名
+ * @param member オプションを変更した人
+ * @param options 変更後のオプション
+ * @return イベント実行結果
+ * @see com.github.ucchyocean.lc3.event.EventSenderInterface#sendLunaChatChannelOptionChangedEvent(java.lang.String, com.github.ucchyocean.lc3.member.ChannelMember, java.util.HashMap)
+ */
+ @Override
+ public EventResult sendLunaChatChannelOptionChangedEvent(String channelName, ChannelMember member,
+ Map options) {
+
+ LunaChatBukkitChannelOptionChangedEvent event =
+ new LunaChatBukkitChannelOptionChangedEvent(channelName, member, options);
+ Bukkit.getPluginManager().callEvent(event);
+
+ LunaChatChannelOptionChangedEvent legacy =
+ new LunaChatChannelOptionChangedEvent(
+ channelName, convertChannelMemberToCommandSender(member),
+ new HashMap(options));
+ legacy.setCancelled(event.isCancelled());
+ Bukkit.getPluginManager().callEvent(legacy);
+
+ EventResult result = new EventResult();
+ result.setCancelled(legacy.isCancelled());
+ result.setOptions(legacy.getOptions());
+ return result;
+ }
+
+ /**
+ * チャンネル削除イベント
+ * @param channelName チャンネル名
+ * @param member 削除を実行した人
+ * @return イベント実行結果
+ * @see com.github.ucchyocean.lc3.event.EventSenderInterface#sendLunaChatChannelRemoveEvent(java.lang.String, com.github.ucchyocean.lc3.member.ChannelMember)
+ */
+ @Override
+ public EventResult sendLunaChatChannelRemoveEvent(String channelName, ChannelMember member) {
+
+ LunaChatBukkitChannelRemoveEvent event = new LunaChatBukkitChannelRemoveEvent(channelName, member);
+ Bukkit.getPluginManager().callEvent(event);
+
+ LunaChatChannelRemoveEvent legacy =
+ new LunaChatChannelRemoveEvent(
+ event.getChannelName(), convertChannelMemberToCommandSender(member));
+ legacy.setCancelled(event.isCancelled());
+ Bukkit.getPluginManager().callEvent(legacy);
+
+ EventResult result = new EventResult();
+ result.setCancelled(legacy.isCancelled());
+ result.setChannelName(legacy.getChannelName());
+ return result;
+ }
+
+ /**
+ * Japanize変換が行われた後に呼び出されるイベント
+ * @param channelName チャンネル名
+ * @param member 発言したメンバー
+ * @param original 変換前の文字列
+ * @param japanized 変換後の文字列
+ * @return イベント実行結果
+ * @see com.github.ucchyocean.lc3.event.EventSenderInterface#sendLunaChatPostJapanizeEvent(java.lang.String, com.github.ucchyocean.lc3.member.ChannelMember, java.lang.String, java.lang.String)
+ */
+ @Override
+ public EventResult sendLunaChatPostJapanizeEvent(String channelName, ChannelMember member, String original,
+ String japanized) {
+
+ LunaChatBukkitPostJapanizeEvent event =
+ new LunaChatBukkitPostJapanizeEvent(channelName, member, original, japanized);
+ Bukkit.getPluginManager().callEvent(event);
+
+ LunaChatPostJapanizeEvent legacy =
+ new LunaChatPostJapanizeEvent(
+ channelName, convertChannelMemberToChannelPlayer(member), original, event.getJapanized());
+ legacy.setCancelled(event.isCancelled());
+ Bukkit.getPluginManager().callEvent(legacy);
+
+ EventResult result = new EventResult();
+ result.setCancelled(legacy.isCancelled());
+ result.setJapanized(legacy.getJapanized());
+ return result;
+ }
+
+ /**
+ * チャンネルチャットへの発言前に発生するイベント
+ * @param channelName チャンネル名
+ * @param member 発言したメンバー
+ * @param message 発言内容
+ * @return イベント実行結果
+ * @see com.github.ucchyocean.lc3.event.EventSenderInterface#sendLunaChatPreChatEvent(java.lang.String, com.github.ucchyocean.lc3.member.ChannelMember, java.lang.String)
+ */
+ @Override
+ public EventResult sendLunaChatPreChatEvent(String channelName, ChannelMember member, String message) {
+
+ LunaChatBukkitPreChatEvent event =
+ new LunaChatBukkitPreChatEvent(channelName, member, message);
+ Bukkit.getPluginManager().callEvent(event);
+
+
+ LunaChatPreChatEvent legacy =
+ new LunaChatPreChatEvent(channelName, convertChannelMemberToChannelPlayer(member), event.getMessage());
+ legacy.setCancelled(event.isCancelled());
+ Bukkit.getPluginManager().callEvent(legacy);
+
+ EventResult result = new EventResult();
+ result.setCancelled(legacy.isCancelled());
+ result.setMessage(legacy.getMessage());
+ return result;
+ }
+
+ /**
+ * ChannelMemberをChannelPlayerに変換する
+ * @param cm
+ * @return
+ */
+ private ChannelPlayer convertChannelMemberToChannelPlayer(ChannelMember cm) {
+ if ( cm == null ) return null;
+ if ( cm instanceof ChannelMemberBungee ) return null; // Bungeeモードの場合は変換できない
+ if ( cm instanceof ChannelMemberPlayer ) {
+ return ChannelPlayer.getChannelPlayer(cm.toString());
+ } else if ( cm instanceof ChannelMemberBukkitConsole ) {
+ return new ChannelPlayerConsole(Bukkit.getConsoleSender());
+ } else if ( cm instanceof ChannelMemberBlock ) {
+ ChannelMemberBlock cmb = (ChannelMemberBlock)cm;
+ if ( cmb.getBlockCommandSender() != null ) {
+ return new ChannelPlayerBlock(cmb.getBlockCommandSender());
+ }
+ }
+ return null;
+ }
+
+ /**
+ * ChannelPlayerをChannelMemberに変換する
+ * @param cp
+ * @return
+ */
+ private ChannelMember convertChannelPlayerToChannelMember(ChannelPlayer cp) {
+ if ( cp == null ) return null;
+ if ( cp instanceof ChannelPlayerName || cp instanceof ChannelPlayerUUID ) {
+ return ChannelMember.getChannelMember(cp.toString());
+ } else if ( cp instanceof ChannelPlayerConsole ) {
+ return new ChannelMemberBukkitConsole(Bukkit.getConsoleSender());
+ } else if ( cp instanceof ChannelPlayerBlock ) {
+ ChannelPlayerBlock cpb = (ChannelPlayerBlock)cp;
+ if ( cpb.getBlockCommandSender() != null ) {
+ return new ChannelMemberBlock(cpb.getBlockCommandSender());
+ }
+ }
+ return null;
+ }
+
+ /**
+ * ChannelMemberをCommandSenderに変換する
+ * @param cm
+ * @return
+ */
+ private CommandSender convertChannelMemberToCommandSender(ChannelMember cm) {
+ if ( cm == null ) return null;
+ if ( cm instanceof ChannelMemberBungee ) return null; // Bungeeモードの場合は変換できない
+ if ( cm instanceof ChannelMemberPlayer ) {
+ return ((ChannelMemberPlayer)cm).getPlayer();
+ } else if ( cm instanceof ChannelMemberBukkitConsole ) {
+ return Bukkit.getConsoleSender();
+ } else if ( cm instanceof ChannelMemberBlock ) {
+ return ((ChannelMemberBlock)cm).getBlockCommandSender();
+ }
+ return null;
+ }
+
+ /**
+ * ChannelMemberのリストをChannelPlayerのリストに変換する
+ * @param list
+ * @return
+ */
+ private List convertMemberListToPlayerList(List list) {
+ List result = new ArrayList();
+ for ( ChannelMember member : list ) {
+ ChannelPlayer player = convertChannelMemberToChannelPlayer(member);
+ if ( player != null ) result.add(player);
+ }
+ return result;
+ }
+
+ /**
+ * ChannelPlayerのリストをChannelMemberのリストに変換する
+ * @param list
+ * @return
+ */
+ private List convertPlayerListToMemberList(List list) {
+ List result = new ArrayList();
+ for ( ChannelPlayer player : list ) {
+ ChannelMember member = convertChannelPlayerToChannelMember(player);
+ if ( member != null ) result.add(member);
+ }
+ return result;
+ }
+}
diff --git a/src/main/java/com/github/ucchyocean/lc3/bukkit/BukkitNormalChatJapanizeTask.java b/src/main/java/com/github/ucchyocean/lc3/bukkit/BukkitNormalChatJapanizeTask.java
new file mode 100644
index 00000000..fbb0b056
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc3/bukkit/BukkitNormalChatJapanizeTask.java
@@ -0,0 +1,74 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc3.bukkit;
+
+import org.bukkit.Bukkit;
+import org.bukkit.entity.Player;
+import org.bukkit.event.player.AsyncPlayerChatEvent;
+import org.bukkit.scheduler.BukkitRunnable;
+
+import com.github.ucchyocean.lc3.LunaChat;
+import com.github.ucchyocean.lc3.LunaChatBukkit;
+import com.github.ucchyocean.lc3.channel.JapanizeConvertTask;
+import com.github.ucchyocean.lc3.japanize.JapanizeType;
+import com.github.ucchyocean.lc3.member.ChannelMember;
+import com.github.ucchyocean.lc3.member.ChannelMemberPlayer;
+
+/**
+ * Japanize2行表示のときに、変換結果を遅延して通常チャットに表示するためのタスク
+ * @author ucchy
+ */
+public class BukkitNormalChatJapanizeTask extends BukkitRunnable {
+
+ private ChannelMember player;
+ private AsyncPlayerChatEvent event;
+
+ private JapanizeConvertTask task;
+
+ /**
+ * コンストラクタ
+ * @param org 変換前の文字列
+ * @param type 変換タイプ
+ * @param player 発言したプレイヤー
+ * @param japanizeFormat 変換後に発言するときの、発言フォーマット
+ * @param event イベント
+ */
+ public BukkitNormalChatJapanizeTask(String org, JapanizeType type,
+ ChannelMember player, String japanizeFormat, final AsyncPlayerChatEvent event) {
+
+ task = new JapanizeConvertTask(org, type, japanizeFormat, null, player);
+ this.player = player;
+ this.event = event;
+ }
+
+ /**
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+
+ if ( task.runSync() ) {
+
+ String result = task.getResult();
+
+ // 送信
+ for ( Player p : event.getRecipients() ) {
+ p.sendMessage(result);
+ }
+ Bukkit.getConsoleSender().sendMessage(result);
+
+ // 設定に応じてdynmapへ送信する
+ if ( LunaChat.getConfig().isSendBroadcastChannelChatToDynmap() &&
+ LunaChatBukkit.getInstance().getDynmap() != null ) {
+ if ( player != null && player instanceof ChannelMemberPlayer
+ && ((ChannelMemberPlayer)player).getPlayer() != null )
+ LunaChatBukkit.getInstance().getDynmap().chat(((ChannelMemberPlayer)player).getPlayer(), result);
+ else
+ LunaChatBukkit.getInstance().getDynmap().broadcast(result);
+ }
+ }
+ }
+}
diff --git a/src/main/java/com/github/ucchyocean/lc/channel/DelayedJapanizeRecipientChatTask.java b/src/main/java/com/github/ucchyocean/lc3/bukkit/BukkitRecipientChatJapanizeTask.java
similarity index 62%
rename from src/main/java/com/github/ucchyocean/lc/channel/DelayedJapanizeRecipientChatTask.java
rename to src/main/java/com/github/ucchyocean/lc3/bukkit/BukkitRecipientChatJapanizeTask.java
index 4723ee8d..e2e1751f 100644
--- a/src/main/java/com/github/ucchyocean/lc/channel/DelayedJapanizeRecipientChatTask.java
+++ b/src/main/java/com/github/ucchyocean/lc3/bukkit/BukkitRecipientChatJapanizeTask.java
@@ -1,26 +1,31 @@
/*
* @author ucchy
* @license LGPLv3
- * @copyright Copyright ucchy 2016
+ * @copyright Copyright ucchy 2020
*/
-package com.github.ucchyocean.lc.channel;
+package com.github.ucchyocean.lc3.bukkit;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
+import org.bukkit.scheduler.BukkitRunnable;
-import com.github.ucchyocean.lc.japanize.JapanizeType;
+import com.github.ucchyocean.lc3.channel.JapanizeConvertTask;
+import com.github.ucchyocean.lc3.japanize.JapanizeType;
+import com.github.ucchyocean.lc3.member.ChannelMember;
/**
* Japanize2行表示のときに、変換結果を遅延して指定した受信者に表示するためのタスク。
* 他プラグインのチャンネル(mcMMOのパーティチャットや、TownyChatなど)に、Japanize変換結果を表示するために使用する。
* @author ucchy
*/
-public class DelayedJapanizeRecipientChatTask extends DelayedJapanizeConvertTask {
+public class BukkitRecipientChatJapanizeTask extends BukkitRunnable {
private List recipients;
+ private JapanizeConvertTask task;
+
/**
* コンストラクタ
* @param org 変換前の文字列
@@ -29,9 +34,9 @@ public class DelayedJapanizeRecipientChatTask extends DelayedJapanizeConvertTask
* @param japanizeFormat 変換後に発言するときの、発言フォーマット
* @param recipients メッセージ受信者
*/
- public DelayedJapanizeRecipientChatTask(String org, JapanizeType type, ChannelPlayer player,
+ public BukkitRecipientChatJapanizeTask(String org, JapanizeType type, ChannelMember player,
String japanizeFormat, List recipients) {
- super(org, type, null, player, japanizeFormat);
+ task = new JapanizeConvertTask(org, type, japanizeFormat, null, player);
this.recipients = recipients;
}
@@ -41,9 +46,9 @@ public DelayedJapanizeRecipientChatTask(String org, JapanizeType type, ChannelPl
@Override
public void run() {
- if ( runSync() ) {
+ if ( task.runSync() ) {
- String result = getResult();
+ String result = task.getResult();
// 送信
for ( Player p : recipients ) {
diff --git a/src/main/java/com/github/ucchyocean/lc3/bukkit/event/LunaChatBukkitBaseCancellableEvent.java b/src/main/java/com/github/ucchyocean/lc3/bukkit/event/LunaChatBukkitBaseCancellableEvent.java
new file mode 100644
index 00000000..35b8c399
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc3/bukkit/event/LunaChatBukkitBaseCancellableEvent.java
@@ -0,0 +1,43 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc3.bukkit.event;
+
+import org.bukkit.event.Cancellable;
+
+/**
+ * 基底のキャンセル可能イベントクラス
+ * @author ucchy
+ */
+public class LunaChatBukkitBaseCancellableEvent extends LunaChatBukkitBaseEvent implements Cancellable {
+
+ private boolean isCancelled;
+
+ /**
+ * コンストラクタ
+ * @param channelName チャンネル名
+ */
+ public LunaChatBukkitBaseCancellableEvent(String channelName) {
+ super(channelName);
+ }
+
+ /**
+ * イベントがキャンセルされたかどうかをかえす
+ * @see org.bukkit.event.Cancellable#isCancelled()
+ */
+ @Override
+ public boolean isCancelled() {
+ return isCancelled;
+ }
+
+ /**
+ * イベントをキャンセルするかどうかを設定する
+ * @see org.bukkit.event.Cancellable#setCancelled(boolean)
+ */
+ @Override
+ public void setCancelled(boolean cancelled) {
+ isCancelled = cancelled;
+ }
+}
diff --git a/src/main/java/com/github/ucchyocean/lc3/bukkit/event/LunaChatBukkitBaseEvent.java b/src/main/java/com/github/ucchyocean/lc3/bukkit/event/LunaChatBukkitBaseEvent.java
new file mode 100644
index 00000000..352e776b
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc3/bukkit/event/LunaChatBukkitBaseEvent.java
@@ -0,0 +1,57 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc3.bukkit.event;
+
+import org.bukkit.Bukkit;
+import org.bukkit.event.Event;
+import org.bukkit.event.HandlerList;
+
+import com.github.ucchyocean.lc3.LunaChat;
+import com.github.ucchyocean.lc3.channel.Channel;
+
+/**
+ * 基底イベントクラス
+ * @author ucchy
+ */
+public abstract class LunaChatBukkitBaseEvent extends Event {
+
+ private static final HandlerList handlers = new HandlerList();
+ protected String channelName;
+
+ /**
+ * コンストラクタ
+ * @param channelName チャンネル名
+ */
+ public LunaChatBukkitBaseEvent(String channelName) {
+ super(!Bukkit.isPrimaryThread());
+ this.channelName = channelName;
+ }
+
+ @Override
+ public HandlerList getHandlers() {
+ return handlers;
+ }
+
+ public static HandlerList getHandlerList() {
+ return handlers;
+ }
+
+ /**
+ * チャンネル名を取得する
+ * @return チャンネル名
+ */
+ public String getChannelName() {
+ return channelName;
+ }
+
+ /**
+ * チャンネルを取得する
+ * @return チャンネル
+ */
+ public Channel getChannel() {
+ return LunaChat.getAPI().getChannel(channelName);
+ }
+}
diff --git a/src/main/java/com/github/ucchyocean/lc3/bukkit/event/LunaChatBukkitChannelChatEvent.java b/src/main/java/com/github/ucchyocean/lc3/bukkit/event/LunaChatBukkitChannelChatEvent.java
new file mode 100644
index 00000000..37299763
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc3/bukkit/event/LunaChatBukkitChannelChatEvent.java
@@ -0,0 +1,78 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc3.bukkit.event;
+
+import com.github.ucchyocean.lc3.member.ChannelMember;
+
+/**
+ * チャンネルチャットのチャットイベント
+ * @author ucchy
+ */
+public class LunaChatBukkitChannelChatEvent extends LunaChatBukkitBaseCancellableEvent {
+
+ private ChannelMember player;
+ private String originalMessage;
+ private String ngMaskedMessage;
+ private String messageFormat;
+
+ public LunaChatBukkitChannelChatEvent(String channelName, ChannelMember player,
+ String originalMessage, String ngMaskedMessage,
+ String messageFormat) {
+ super(channelName);
+ this.player = player;
+ this.originalMessage = originalMessage;
+ this.ngMaskedMessage = ngMaskedMessage;
+ this.messageFormat = messageFormat;
+ }
+
+ /**
+ * 発言を行ったプレイヤーを取得します。
+ * @return 発言したプレイヤー
+ */
+ public ChannelMember getPlayer() {
+ return player;
+ }
+
+ /**
+ * 置き換え前の、発言されたままのテキストをかえす
+ * @return 発言内容
+ */
+ public String getPreReplaceMessage() {
+ return originalMessage;
+ }
+
+ /**
+ * NGワードがマスクされた後のテキストをかえす
+ * @return NGワードマスク済みの発言内容
+ */
+ public String getNgMaskedMessage() {
+ return ngMaskedMessage;
+ }
+
+ /**
+ * メッセージに適用されるフォーマットをかえす
+ * @return フォーマット
+ */
+ public String getMessageFormat() {
+ return messageFormat;
+ }
+
+ /**
+ * NGワードマスク後のテキストを上書き設定する
+ * @param ngMaskedMessage 上書きする発言内容
+ */
+ public void setNgMaskedMessage(String ngMaskedMessage) {
+ this.ngMaskedMessage = ngMaskedMessage;
+ }
+
+ /**
+ * メッセージフォーマットを上書き設定する
+ * @param messageFormat フォーマット
+ */
+ public void setMessageFormat(String messageFormat) {
+ this.messageFormat = messageFormat;
+ }
+}
diff --git a/src/main/java/com/github/ucchyocean/lc3/bukkit/event/LunaChatBukkitChannelCreateEvent.java b/src/main/java/com/github/ucchyocean/lc3/bukkit/event/LunaChatBukkitChannelCreateEvent.java
new file mode 100644
index 00000000..70a9fc91
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc3/bukkit/event/LunaChatBukkitChannelCreateEvent.java
@@ -0,0 +1,49 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc3.bukkit.event;
+
+import com.github.ucchyocean.lc3.channel.Channel;
+import com.github.ucchyocean.lc3.member.ChannelMember;
+
+/**
+ * チャンネル作成イベント
+ * @author ucchy
+ */
+public class LunaChatBukkitChannelCreateEvent extends LunaChatBukkitBaseCancellableEvent {
+
+ private ChannelMember member;
+
+ public LunaChatBukkitChannelCreateEvent(String channelName, ChannelMember member) {
+ super(channelName);
+ this.member = member;
+ }
+
+ /**
+ * 作成するチャンネルのチャンネル名を上書き設定する
+ * @param channelName 設定するチャンネル名
+ */
+ public void setChannelName(String channelName) {
+ this.channelName = channelName;
+ }
+
+ /**
+ * チャンネルを作成した人を取得する。
+ * @return チャンネルを作成したChannelMember
+ */
+ public ChannelMember getMember() {
+ return member;
+ }
+
+ /**
+ * @deprecated チャンネル作成イベントは、チャンネルを作成する前に呼び出されるので、
+ * このメソッドの戻り値は必ずnullになります。
+ * @see com.github.ucchyocean.lc3.bukkit.event.LunaChatBukkitBaseEvent#getChannel()
+ */
+ @Override
+ public Channel getChannel() {
+ return super.getChannel();
+ }
+}
diff --git a/src/main/java/com/github/ucchyocean/lc3/bukkit/event/LunaChatBukkitChannelMemberChangedEvent.java b/src/main/java/com/github/ucchyocean/lc3/bukkit/event/LunaChatBukkitChannelMemberChangedEvent.java
new file mode 100644
index 00000000..60e95b6d
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc3/bukkit/event/LunaChatBukkitChannelMemberChangedEvent.java
@@ -0,0 +1,49 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc3.bukkit.event;
+
+import java.util.List;
+
+import com.github.ucchyocean.lc3.member.ChannelMember;
+
+/**
+ * メンバー変更イベント
+ * @author ucchy
+ */
+public class LunaChatBukkitChannelMemberChangedEvent extends LunaChatBukkitBaseCancellableEvent {
+
+ private List before;
+ private List after;
+
+ /**
+ * コンストラクタ
+ * @param channelName チャンネル名
+ * @param before 変更前のメンバー
+ * @param after 変更後のメンバー
+ */
+ public LunaChatBukkitChannelMemberChangedEvent(
+ String channelName, List before, List after) {
+ super(channelName);
+ this.before = before;
+ this.after = after;
+ }
+
+ /**
+ * 変更前のメンバーリストをかえす
+ * @return
+ */
+ public List getMembersBefore() {
+ return before;
+ }
+
+ /**
+ * 変更後のメンバーリストをかえす
+ * @return
+ */
+ public List getMembersAfter() {
+ return after;
+ }
+}
diff --git a/src/main/java/com/github/ucchyocean/lc3/bukkit/event/LunaChatBukkitChannelMessageEvent.java b/src/main/java/com/github/ucchyocean/lc3/bukkit/event/LunaChatBukkitChannelMessageEvent.java
new file mode 100644
index 00000000..d92518d4
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc3/bukkit/event/LunaChatBukkitChannelMessageEvent.java
@@ -0,0 +1,91 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc3.bukkit.event;
+
+import java.util.List;
+
+import com.github.ucchyocean.lc3.member.ChannelMember;
+
+/**
+ * チャンネルチャットのメッセージイベント、
+ * このイベントはキャンセルできない。
+ * @author ucchy
+ */
+public class LunaChatBukkitChannelMessageEvent extends LunaChatBukkitBaseEvent {
+
+ private ChannelMember player;
+ private String message;
+ private List recipients;
+ private String displayName;
+ private String originalMessage;
+
+ public LunaChatBukkitChannelMessageEvent(String channelName,
+ ChannelMember player, String message, List recipients,
+ String displayName, String originalMessage) {
+ super(channelName);
+ this.player = player;
+ this.message = message;
+ this.recipients = recipients;
+ this.displayName = displayName;
+ this.originalMessage = originalMessage;
+ }
+
+ /**
+ * 発言したプレイヤー、システムメッセージの場合はnullになることに注意
+ * @return player 発言プレイヤー
+ */
+ public ChannelMember getPlayer() {
+ return player;
+ }
+
+ /**
+ * 置き換えされたメッセージ
+ * @return message メッセージ
+ */
+ public String getMessage() {
+ return message;
+ }
+
+ /**
+ * メッセージを受信するプレイヤーリスト
+ * @return recipients プレイヤーリスト
+ */
+ public List getRecipients() {
+ return recipients;
+ }
+
+ /**
+ * 発言者の表示名を取得する
+ * @return 発言者の表示名
+ */
+ public String getDisplayName() {
+ return displayName;
+ }
+
+ /**
+ * オリジナルメッセージ(チャットフォーマットを適用していない状態のメッセージ)を取得する
+ * @return オリジナルメッセージ
+ */
+ public String getOriginalMessage() {
+ return originalMessage;
+ }
+
+ /**
+ * メッセージを上書き設定する
+ * @param message メッセージ
+ */
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ /**
+ * メッセージ受信者を上書き設定する
+ * @param recipients メッセージ受信者
+ */
+ public void setRecipients(List recipients) {
+ this.recipients = recipients;
+ }
+}
diff --git a/src/main/java/com/github/ucchyocean/lc3/bukkit/event/LunaChatBukkitChannelOptionChangedEvent.java b/src/main/java/com/github/ucchyocean/lc3/bukkit/event/LunaChatBukkitChannelOptionChangedEvent.java
new file mode 100644
index 00000000..b7bc6c78
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc3/bukkit/event/LunaChatBukkitChannelOptionChangedEvent.java
@@ -0,0 +1,52 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc3.bukkit.event;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.github.ucchyocean.lc3.member.ChannelMember;
+
+/**
+ * オプション変更イベント
+ * @author ucchy
+ */
+public class LunaChatBukkitChannelOptionChangedEvent extends LunaChatBukkitBaseCancellableEvent {
+
+ private ChannelMember member;
+ private Map options;
+
+ public LunaChatBukkitChannelOptionChangedEvent(String channelName,
+ ChannelMember member, Map options) {
+ super(channelName);
+ this.member = member;
+ this.options = options;
+ }
+
+ /**
+ * 変更後のオプションリストをかえす
+ * @return オプションリスト
+ */
+ public Map getOptions() {
+ return options;
+ }
+
+ /**
+ * オプションリストを上書き設定する
+ * @param options オプションリスト
+ */
+ public void setOptions(HashMap options) {
+ this.options = options;
+ }
+
+ /**
+ * チャンネルのオプションを変更した人を取得する。
+ * @return チャンネルのオプションを変更したChannelMember
+ */
+ public ChannelMember getMember() {
+ return member;
+ }
+}
diff --git a/src/main/java/com/github/ucchyocean/lc3/bukkit/event/LunaChatBukkitChannelRemoveEvent.java b/src/main/java/com/github/ucchyocean/lc3/bukkit/event/LunaChatBukkitChannelRemoveEvent.java
new file mode 100644
index 00000000..c63cf06b
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc3/bukkit/event/LunaChatBukkitChannelRemoveEvent.java
@@ -0,0 +1,30 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc3.bukkit.event;
+
+import com.github.ucchyocean.lc3.member.ChannelMember;
+
+/**
+ * チャンネル削除イベント
+ * @author ucchy
+ */
+public class LunaChatBukkitChannelRemoveEvent extends LunaChatBukkitBaseCancellableEvent {
+
+ private ChannelMember member;
+
+ public LunaChatBukkitChannelRemoveEvent(String channelName, ChannelMember member) {
+ super(channelName);
+ this.member = member;
+ }
+
+ /**
+ * チャンネルを削除した人を取得する。
+ * @return チャンネルを削除したChannelMember
+ */
+ public ChannelMember getMember() {
+ return member;
+ }
+}
diff --git a/src/main/java/com/github/ucchyocean/lc3/bukkit/event/LunaChatBukkitPostJapanizeEvent.java b/src/main/java/com/github/ucchyocean/lc3/bukkit/event/LunaChatBukkitPostJapanizeEvent.java
new file mode 100644
index 00000000..ab574a39
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc3/bukkit/event/LunaChatBukkitPostJapanizeEvent.java
@@ -0,0 +1,66 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc3.bukkit.event;
+
+import com.github.ucchyocean.lc3.member.ChannelMember;
+
+/**
+ * Japanize変換が行われた後に呼び出されるイベント
+ * @author ucchy
+ */
+public class LunaChatBukkitPostJapanizeEvent extends LunaChatBukkitBaseCancellableEvent {
+
+ private ChannelMember player;
+ private String original;
+ private String japanized;
+
+ /**
+ * コンストラクタ
+ * @param channelName チャンネル名
+ * @param player 発言したプレイヤー
+ * @param original 変換前の文字列
+ * @param japanized 変換後の文字列
+ */
+ public LunaChatBukkitPostJapanizeEvent(String channelName, ChannelMember player,
+ String original, String japanized) {
+ super(channelName);
+ this.player = player;
+ this.original = original;
+ this.japanized = japanized;
+ }
+
+ /**
+ * 発言を行ったプレイヤーを取得します。
+ * @return 発言したプレイヤー
+ */
+ public ChannelMember getPlayer() {
+ return player;
+ }
+
+ /**
+ * Japanize変換後の文字列を返す
+ * @return 変換後の文字列
+ */
+ public String getJapanized() {
+ return japanized;
+ }
+
+ /**
+ * Japanize変換後の文字列を差し替える
+ * @param japanized 変換後の文字列
+ */
+ public void setJapanized(String japanized) {
+ this.japanized = japanized;
+ }
+
+ /**
+ * Japanize変換前の文字列を返す
+ * @return 変換前の文字列
+ */
+ public String getOriginal() {
+ return original;
+ }
+}
diff --git a/src/main/java/com/github/ucchyocean/lc3/bukkit/event/LunaChatBukkitPreChatEvent.java b/src/main/java/com/github/ucchyocean/lc3/bukkit/event/LunaChatBukkitPreChatEvent.java
new file mode 100644
index 00000000..702f0bd5
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc3/bukkit/event/LunaChatBukkitPreChatEvent.java
@@ -0,0 +1,66 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc3.bukkit.event;
+
+import com.github.ucchyocean.lc3.channel.Channel;
+import com.github.ucchyocean.lc3.member.ChannelMember;
+
+/**
+ * チャンネルチャットへの発言前に発生するイベント
+ * @author ucchy
+ */
+public class LunaChatBukkitPreChatEvent extends LunaChatBukkitBaseCancellableEvent {
+
+ private ChannelMember player;
+ private String message;
+
+ public LunaChatBukkitPreChatEvent(String channelName, ChannelMember player, String message) {
+ super(channelName);
+ this.player = player;
+ this.message = message;
+ }
+
+ /**
+ * 発言を行ったプレイヤーを取得します。
+ * @return 発言したプレイヤー
+ */
+ public ChannelMember getPlayer() {
+ return player;
+ }
+
+ /**
+ * 発言内容を取得します。
+ * @return 発言内容
+ */
+ public String getMessage() {
+ return message;
+ }
+
+ /**
+ * 発言先チャンネルを変更します。
+ * @param channelName 発言先チャンネル名
+ */
+ public void setChannelName(String channelName) {
+ this.channelName = channelName;
+ }
+
+ /**
+ * 発言先チャンネルを変更します。
+ * @param channel 発言先チャンネル
+ */
+ public void setChannel(Channel channel) {
+ if ( channel == null ) return;
+ this.channelName = channel.getName();
+ }
+
+ /**
+ * 発言内容を変更します。
+ * @param message 発言内容
+ */
+ public void setMessage(String message) {
+ this.message = message;
+ }
+}
diff --git a/src/main/java/com/github/ucchyocean/lc3/bungee/BungeeEventListener.java b/src/main/java/com/github/ucchyocean/lc3/bungee/BungeeEventListener.java
new file mode 100644
index 00000000..f29a5e21
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc3/bungee/BungeeEventListener.java
@@ -0,0 +1,622 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc3.bungee;
+
+import java.nio.charset.StandardCharsets;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import com.github.ucchyocean.lc3.ChatColor;
+import com.github.ucchyocean.lc3.LunaChat;
+import com.github.ucchyocean.lc3.LunaChatAPI;
+import com.github.ucchyocean.lc3.LunaChatBungee;
+import com.github.ucchyocean.lc3.LunaChatConfig;
+import com.github.ucchyocean.lc3.Messages;
+import com.github.ucchyocean.lc3.Utility;
+import com.github.ucchyocean.lc3.channel.Channel;
+import com.github.ucchyocean.lc3.event.EventResult;
+import com.github.ucchyocean.lc3.japanize.Japanizer;
+import com.github.ucchyocean.lc3.member.ChannelMember;
+
+import net.md_5.bungee.api.CommandSender;
+import net.md_5.bungee.api.chat.TextComponent;
+import net.md_5.bungee.api.config.ServerInfo;
+import net.md_5.bungee.api.connection.ProxiedPlayer;
+import net.md_5.bungee.api.event.ChatEvent;
+import net.md_5.bungee.api.event.PlayerDisconnectEvent;
+import net.md_5.bungee.api.event.PostLoginEvent;
+import net.md_5.bungee.api.plugin.Listener;
+import net.md_5.bungee.event.EventHandler;
+import net.md_5.bungee.event.EventPriority;
+
+/**
+ * BungeeCordのイベントを監視するリスナークラス
+ * @author ucchy
+ */
+public class BungeeEventListener implements Listener {
+
+ private static final String DATE_FORMAT_PATTERN = "yyyy/MM/dd";
+ private static final String TIME_FORMAT_PATTERN = "HH:mm:ss";
+
+ private SimpleDateFormat dateFormat;
+ private SimpleDateFormat timeFormat;
+ private LunaChatBungee parent;
+ private LunaChatConfig config;
+ private LunaChatAPI api;
+
+ /**
+ * コンストラクタ
+ * @param parent LunaChatBungeeのインスタンス
+ */
+ public BungeeEventListener(LunaChatBungee parent) {
+ this.parent = parent;
+ config = parent.getConfig();
+ api = parent.getLunaChatAPI();
+ dateFormat = new SimpleDateFormat(DATE_FORMAT_PATTERN);
+ timeFormat = new SimpleDateFormat(TIME_FORMAT_PATTERN);
+ }
+
+ /**
+ * プレイヤーがチャット発言したときに呼び出されるメソッド
+ * @param event
+ */
+ @EventHandler(priority=EventPriority.LOWEST)
+ public void onAsyncPlayerChatLowest(ChatEvent event) {
+ if ( matchesEventPriority(EventPriority.LOWEST) ) {
+ processChatEvent(event);
+ }
+ }
+
+ /**
+ * プレイヤーがチャット発言したときに呼び出されるメソッド
+ * @param event
+ */
+ @EventHandler(priority=EventPriority.LOW)
+ public void onAsyncPlayerChatLow(ChatEvent event) {
+ if ( matchesEventPriority(EventPriority.LOW) ) {
+ processChatEvent(event);
+ }
+ }
+
+ /**
+ * プレイヤーがチャット発言したときに呼び出されるメソッド
+ * @param event
+ */
+ @EventHandler(priority=EventPriority.NORMAL)
+ public void onAsyncPlayerChatNormal(ChatEvent event) {
+ if ( matchesEventPriority(EventPriority.NORMAL) ) {
+ processChatEvent(event);
+ }
+ }
+
+ /**
+ * プレイヤーがチャット発言したときに呼び出されるメソッド
+ * @param event
+ */
+ @EventHandler(priority=EventPriority.HIGH)
+ public void onAsyncPlayerChatHigh(ChatEvent event) {
+ if ( matchesEventPriority(EventPriority.HIGH) ) {
+ processChatEvent(event);
+ }
+ }
+
+ /**
+ * プレイヤーがチャット発言したときに呼び出されるメソッド
+ * @param event
+ */
+ @EventHandler(priority=EventPriority.HIGHEST)
+ public void onAsyncPlayerChatHighest(ChatEvent event) {
+ if ( matchesEventPriority(EventPriority.HIGHEST) ) {
+ processChatEvent(event);
+ }
+ }
+
+ /**
+ * プレイヤーが接続したときに呼び出されるメソッド
+ * @param event プレイヤーログインイベント
+ */
+ @EventHandler
+ public void onJoin(PostLoginEvent event) {
+
+ LunaChatConfig config = LunaChat.getConfig();
+ ProxiedPlayer player = event.getPlayer();
+
+ // UUIDをキャッシュ
+ LunaChat.getUUIDCacheData().put(player.getUniqueId().toString(), player.getName());
+ LunaChat.getUUIDCacheData().save();
+
+ // 強制参加チャンネル設定を確認し、参加させる
+ forceJoinToForceJoinChannels(player);
+
+ // グローバルチャンネル設定がある場合
+ if ( !config.getGlobalChannel().equals("") ) {
+ tryJoinToGlobalChannel(player);
+ }
+
+ // チャンネルチャット情報を表示する
+ if ( config.isShowListOnJoin() ) {
+ ArrayList list = getListForMotd(player);
+ for ( String msg : list ) {
+ player.sendMessage(TextComponent.fromLegacyText(msg));
+ }
+ }
+ }
+
+ /**
+ * プレイヤーのサーバー退出ごとに呼び出されるメソッド
+ * @param event プレイヤー退出イベント
+ */
+ @EventHandler
+ public void onQuit(PlayerDisconnectEvent event) {
+
+ ProxiedPlayer player = event.getPlayer();
+ String pname = player.getName();
+
+ // お互いがオフラインになるPMチャンネルがある場合は
+ // チャンネルをクリアする
+ ArrayList deleteList = new ArrayList();
+
+ for ( Channel channel : LunaChat.getAPI().getChannels() ) {
+ String cname = channel.getName();
+ if ( channel.isPersonalChat() && cname.contains(pname) ) {
+ boolean isAllOffline = true;
+ for ( ChannelMember cp : channel.getMembers() ) {
+ if ( cp.isOnline() ) {
+ isAllOffline = false;
+ }
+ }
+ if ( isAllOffline ) {
+ deleteList.add(channel);
+ }
+ }
+ }
+
+ for ( Channel channel : deleteList ) {
+ LunaChat.getAPI().removeChannel(channel.getName());
+ }
+ }
+
+ /**
+ * プレイヤーのチャットごとに呼び出されるメソッド
+ * @param event チャットイベント
+ */
+ private void processChatEvent(ChatEvent event) {
+
+ // コマンド実行の場合は、そのまま無視する
+ if ( event.isCommand() ) {
+ return;
+ }
+
+ // プレイヤーの発言ではない場合は、そのまま無視する
+ if ( !(event.getSender() instanceof ProxiedPlayer) ) {
+ return;
+ }
+
+ // 頭にglobalMarkerが付いている場合は、グローバル発言にする
+ if ( config.getGlobalMarker() != null &&
+ !config.getGlobalMarker().equals("") &&
+ event.getMessage().startsWith(config.getGlobalMarker()) &&
+ event.getMessage().length() > config.getGlobalMarker().length() ) {
+
+ int offset = config.getGlobalMarker().length();
+ event.setMessage( event.getMessage().substring(offset) );
+ chatGlobal(event);
+ return;
+ }
+
+ // クイックチャンネルチャット機能が有効で、専用の記号が含まれるなら、
+ // クイックチャンネルチャットとして処理する。
+ if ( config.isEnableQuickChannelChat() ) {
+ String separator = config.getQuickChannelChatSeparator();
+ if ( event.getMessage().contains(separator) ) {
+ String[] temp = event.getMessage().split(separator, 2);
+ String name = temp[0];
+ String value = "";
+ if ( temp.length > 0 ) {
+ value = temp[1];
+ }
+
+ Channel channel = api.getChannel(name);
+ if ( channel != null && !channel.isPersonalChat()
+ && event.getSender() instanceof ProxiedPlayer ) {
+ ChannelMember player =
+ ChannelMember.getChannelMember(event.getSender());
+ if ( !channel.getMembers().contains(player) ) {
+ // 指定されたチャンネルに参加していないなら、エラーを表示して何も発言せずに終了する。
+ ((ProxiedPlayer)event.getSender()).sendMessage(
+ TextComponent.fromLegacyText(Messages.errmsgNomember()));
+ event.setCancelled(true);
+ return;
+ }
+
+ // 指定されたチャンネルに発言して終了する。
+ chatToChannelWithEvent(player, channel, value);
+ event.setCancelled(true);
+ return;
+ }
+ }
+ }
+
+ ChannelMember player =
+ ChannelMember.getChannelMember(event.getSender());
+ Channel channel = api.getDefaultChannel(player.getName());
+
+ // デフォルトの発言先が無い場合
+ if ( channel == null ) {
+ if ( config.isNoJoinAsGlobal() ) {
+ // グローバル発言にする
+ chatGlobal(event);
+ return;
+
+ } else {
+ // 発言をキャンセルして終了する
+ event.setCancelled(true);
+ return;
+ }
+ }
+
+ chatToChannelWithEvent(player, channel, event.getMessage());
+
+ // もとのイベントをキャンセル
+ event.setCancelled(true);
+ }
+
+ private void chatGlobal(ChatEvent event) {
+
+ // 発言者と発言サーバーと発言内容の取得
+ final ProxiedPlayer sender = (ProxiedPlayer)event.getSender();
+ String message = event.getMessage();
+ LunaChatConfig config = LunaChat.getConfig();
+
+ // NGワードのマスク
+ message = maskNGWord(message, config.getNgwordCompiled());
+
+ // Japanizeをスキップするかどうかフラグ
+ boolean skipJapanize = !LunaChat.getAPI().isPlayerJapanize(sender.getName());
+
+ // 一時的なJapanizeスキップが指定されているか確認する
+ if ( message.startsWith(config.getNoneJapanizeMarker()) ) {
+ message = message.substring(config.getNoneJapanizeMarker().length());
+ skipJapanize = true;
+ }
+
+ // 2byteコードを含む、または、半角カタカナのみなら、Japanize変換は行わない
+ String kanaTemp = Utility.stripColorCode(message);
+
+ if ( !skipJapanize &&
+ ( kanaTemp.getBytes(StandardCharsets.UTF_8).length > kanaTemp.length() ||
+ kanaTemp.matches("[ \\uFF61-\\uFF9F]+") ) ) {
+ skipJapanize = true;
+ }
+
+ // Japanizeの付加
+ if ( !skipJapanize ) {
+
+ String japanize = Japanizer.japanize(Utility.stripColorCode(message), config.getJapanizeType(),
+ LunaChat.getAPI().getAllDictionary());
+ if ( japanize.length() > 0 ) {
+
+ // NGワードのマスク
+ japanize = maskNGWord(japanize, config.getNgwordCompiled());
+
+ // フォーマット化してメッセージを上書きする
+ String japanizeFormat = config.getJapanizeDisplayLine() == 1 ?
+ config.getJapanizeLine1Format() :
+ "%msg\n" + config.getJapanizeLine2Format();
+ String preMessage = new String(message);
+ message = japanizeFormat.replace("%msg", preMessage).replace("%japanize", japanize);
+ }
+ }
+
+ String result;
+ if ( config.isEnableNormalChatMessageFormat() ) {
+ // チャットフォーマット装飾を適用する場合
+ String format = config.getNormalChatMessageFormat();
+ result = replaceNormalChatFormatKeywords(format, sender, message);
+
+ // イベントをキャンセルする
+ event.setCancelled(true);
+
+ // hideされているプレイヤーを除くすべてのプレイヤーに、
+ // 発言内容を送信する。
+ List hidelist = api.getHidelist(ChannelMember.getChannelMember(sender));
+ for ( String server : parent.getProxy().getServers().keySet() ) {
+
+ ServerInfo info = parent.getProxy().getServerInfo(server);
+ for ( ProxiedPlayer player : info.getPlayers() ) {
+ if ( !containsHideList(player, hidelist) ) {
+ sendMessage(player, result);
+ }
+ }
+ }
+
+ } else {
+ // チャットフォーマットを適用しない場合
+ // NOTE: ChatEvent経由で送信する都合上、hideは適用しない(できない)仕様とする。
+
+ // NOTE: 改行がサポートされないので、改行を含む場合は、
+ // \nで分割して前半をセットし、後半は150ミリ秒後に送信する。
+ if ( !message.contains("\n") ) {
+ event.setMessage(Utility.stripColorCode(message));
+ } else {
+ int index = message.indexOf("\n");
+ String pre = message.substring(0, index);
+ final String post = Utility.replaceColorCode(
+ message.substring(index + "\n".length()));
+ event.setMessage(Utility.stripColorCode(pre));
+
+ parent.getProxy().getScheduler().schedule(parent, new Runnable() {
+ @Override
+ public void run() {
+ for ( ProxiedPlayer p : sender.getServer().getInfo().getPlayers() ) {
+ sendMessage(p, post);
+ }
+ }
+ }, 150, TimeUnit.MILLISECONDS);
+ }
+
+ result = Utility.replaceColorCode(message);
+
+ // 発言したプレイヤーがいるサーバー"以外"のサーバーに、
+ // 発言内容を送信する。
+ for ( String server : parent.getProxy().getServers().keySet() ) {
+
+ String senderServer = sender.getServer().getInfo().getName();
+ if ( server.equals(senderServer) ) {
+ continue;
+ }
+
+ ServerInfo info = parent.getProxy().getServerInfo(server);
+ for ( ProxiedPlayer player : info.getPlayers() ) {
+ sendMessage(player, result);
+ }
+ }
+ }
+
+ // コンソールに表示設定なら、コンソールに表示する
+ if ( config.isDisplayChatOnConsole() ) {
+ parent.getLogger().info(result);
+ }
+
+ // ログに記録する
+ LunaChat.getNormalChatLogger().log(Utility.stripColorCode(result), sender.getName());
+ }
+
+ /**
+ * 通常チャットのフォーマット設定のキーワードを置き換えして返す
+ * @param org フォーマット設定
+ * @param player 発言プレイヤー
+ * @param msg 発言内容
+ * @return キーワード置き換え済みの文字列
+ */
+ private String replaceNormalChatFormatKeywords(String org, ProxiedPlayer player, String msg) {
+
+ String format = org;
+ format = format.replace("%username", player.getDisplayName());
+ format = format.replace("%msg", msg);
+ format = format.replace("%player", player.getName());
+
+ if ( format.contains("%date") ) {
+ format = format.replace("%date", dateFormat.format(new Date()));
+ }
+ if ( format.contains("%time") ) {
+ format = format.replace("%time", timeFormat.format(new Date()));
+ }
+
+ if ( format.contains("%prefix") || format.contains("%suffix") ) {
+ // TODO 未実装
+ format = format.replace("%prefix", "");
+ format = format.replace("%suffix", "");
+ }
+
+ if ( format.contains("%world") ) {
+ format = format.replace("%world", "");
+ }
+
+ if ( format.contains("%server") ) {
+ format = format.replace("%server", player.getServer().getInfo().getName());
+ }
+
+ return Utility.replaceColorCode(format);
+ }
+
+ /**
+ * チャンネルに発言処理を行う
+ * @param player プレイヤー
+ * @param channel チャンネル
+ * @param message 発言内容
+ * @return イベントでキャンセルされたかどうか
+ */
+ private boolean chatToChannelWithEvent(ChannelMember player, Channel channel, String message) {
+
+ // LunaChatPreChatEvent イベントコール
+ EventResult result = LunaChat.getEventSender().sendLunaChatPreChatEvent(
+ channel.getName(), player, message);
+ if ( result.isCancelled() ) {
+ return true;
+ }
+ Channel alt = result.getChannel();
+ if ( alt != null ) {
+ channel = alt;
+ }
+ message = result.getMessage();
+
+ // チャンネルチャット発言
+ channel.chat(player, message);
+
+ return false;
+ }
+
+ /**
+ * NGワードをマスクする
+ * @param message メッセージ
+ * @param ngwords NGワード
+ * @return マスクされたメッセージ
+ */
+ private String maskNGWord(String message, List ngwords) {
+ for ( Pattern pattern : ngwords ) {
+ Matcher matcher = pattern.matcher(message);
+ if ( matcher.find() ) {
+ message = matcher.replaceAll(
+ Utility.getAstariskString(matcher.group(0).length()));
+ }
+ }
+ return message;
+ }
+
+ /**
+ * 強制参加チャンネルへ参加させる
+ * @param player プレイヤー
+ */
+ private void forceJoinToForceJoinChannels(ProxiedPlayer player) {
+
+ LunaChatConfig config = LunaChat.getConfig();
+ LunaChatAPI api = LunaChat.getAPI();
+
+ List forceJoinChannels = config.getForceJoinChannels();
+
+ for ( String cname : forceJoinChannels ) {
+
+ // チャンネルが存在しない場合は作成する
+ Channel channel = api.getChannel(cname);
+ if ( channel == null ) {
+ channel = api.createChannel(cname);
+ }
+
+ // チャンネルのメンバーでないなら、参加する
+ ChannelMember cp = ChannelMember.getChannelMember(player);
+ if ( !channel.getMembers().contains(cp) ) {
+ channel.addMember(cp);
+ }
+
+ // デフォルト発言先が無いなら、グローバルチャンネルに設定する
+ Channel dchannel = api.getDefaultChannel(player.getName());
+ if ( dchannel == null ) {
+ api.setDefaultChannel(player.getName(), cname);
+ }
+ }
+ }
+
+ /**
+ * 既定のチャンネルへの参加を試みる。
+ * @param player プレイヤー
+ * @return 参加できたかどうか
+ */
+ private boolean tryJoinToGlobalChannel(ProxiedPlayer player) {
+
+ LunaChatConfig config = LunaChat.getConfig();
+ LunaChatAPI api = LunaChat.getAPI();
+
+ String gcName = config.getGlobalChannel();
+
+ // チャンネルが存在しない場合は作成する
+ Channel global = api.getChannel(gcName);
+ if ( global == null ) {
+ global = api.createChannel(gcName);
+ }
+
+ // デフォルト発言先が無いなら、グローバルチャンネルに設定する
+ Channel dchannel = api.getDefaultChannel(player.getName());
+ if ( dchannel == null ) {
+ api.setDefaultChannel(player.getName(), gcName);
+ }
+
+ return true;
+ }
+
+ /**
+ * プレイヤーのサーバー参加時用の参加チャンネルリストを返す
+ * @param player プレイヤー
+ * @return リスト
+ */
+ private ArrayList getListForMotd(ProxiedPlayer player) {
+
+ ChannelMember cp = ChannelMember.getChannelMember(player);
+ LunaChatAPI api = LunaChat.getAPI();
+ Channel dc = api.getDefaultChannel(cp.getName());
+ String dchannel = "";
+ if ( dc != null ) {
+ dchannel = dc.getName().toLowerCase();
+ }
+
+ ArrayList items = new ArrayList();
+ items.add(Messages.motdFirstLine());
+ for ( Channel channel : api.getChannels() ) {
+
+ // BANされているチャンネルは表示しない
+ if ( channel.getBanned().contains(cp) ) {
+ continue;
+ }
+
+ // 個人チャットはリストに表示しない
+ if ( channel.isPersonalChat() ) {
+ continue;
+ }
+
+ // 参加していないチャンネルは、グローバルチャンネルを除き表示しない
+ if ( !channel.getMembers().contains(cp) &&
+ !channel.isGlobalChannel() ) {
+ continue;
+ }
+
+ String disp = ChatColor.WHITE + channel.getName();
+ if ( channel.getName().equals(dchannel) ) {
+ disp = ChatColor.RED + channel.getName();
+ }
+ String desc = channel.getDescription();
+ int onlineNum = channel.getOnlineNum();
+ int memberNum = channel.getTotalNum();
+ String item = Messages.listFormat(disp, onlineNum, memberNum, desc);
+ items.add(item);
+ }
+ items.add(Messages.listEndLine());
+
+ return items;
+ }
+
+ /**
+ * 指定した対象にメッセージを送信する
+ * @param reciever 送信先
+ * @param message メッセージ
+ */
+ private void sendMessage(CommandSender reciever, String message) {
+ if ( message == null ) return;
+ reciever.sendMessage(TextComponent.fromLegacyText(message));
+ }
+
+ /**
+ * 指定されたEventPriorityが、LunaChatConfigで指定されているEventPriorityと一致するかどうかを調べる
+ * @param priority
+ * @return 一致するかどうか
+ */
+ private boolean matchesEventPriority(int priority) {
+ String c = LunaChat.getConfig().getPlayerChatEventListenerPriority().name();
+ if ( priority == EventPriority.LOWEST ) return "LOWEST".equals(c);
+ if ( priority == EventPriority.LOW ) return "LOW".equals(c);
+ if ( priority == EventPriority.NORMAL ) return "NORMAL".equals(c);
+ if ( priority == EventPriority.HIGH ) return "HIGH".equals(c);
+ if ( priority == EventPriority.HIGHEST ) return "HIGHEST".equals(c);
+ return false;
+ }
+
+ /**
+ * 指定されたプレイヤーが指定されたHideListに含まれるかどうかを判定する
+ * @param p プレイヤー
+ * @param list リスト
+ * @return 含まれるかどうか
+ */
+ private boolean containsHideList(ProxiedPlayer p, List list) {
+ for ( ChannelMember m : list ) {
+ if (m.getName().equals(p.getName())) return true;
+ }
+ return false;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/github/ucchyocean/lc3/bungee/BungeeEventSender.java b/src/main/java/com/github/ucchyocean/lc3/bungee/BungeeEventSender.java
new file mode 100644
index 00000000..1e3d8f7a
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc3/bungee/BungeeEventSender.java
@@ -0,0 +1,208 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc3.bungee;
+
+import java.util.List;
+import java.util.Map;
+
+import com.github.ucchyocean.lc3.bungee.event.LunaChatBungeeChannelChatEvent;
+import com.github.ucchyocean.lc3.bungee.event.LunaChatBungeeChannelCreateEvent;
+import com.github.ucchyocean.lc3.bungee.event.LunaChatBungeeChannelMemberChangedEvent;
+import com.github.ucchyocean.lc3.bungee.event.LunaChatBungeeChannelMessageEvent;
+import com.github.ucchyocean.lc3.bungee.event.LunaChatBungeeChannelOptionChangedEvent;
+import com.github.ucchyocean.lc3.bungee.event.LunaChatBungeeChannelRemoveEvent;
+import com.github.ucchyocean.lc3.bungee.event.LunaChatBungeePostJapanizeEvent;
+import com.github.ucchyocean.lc3.bungee.event.LunaChatBungeePreChatEvent;
+import com.github.ucchyocean.lc3.event.EventResult;
+import com.github.ucchyocean.lc3.event.EventSenderInterface;
+import com.github.ucchyocean.lc3.member.ChannelMember;
+
+import net.md_5.bungee.api.ProxyServer;
+
+/**
+ * Bungeeのイベント実行クラス
+ * @author ucchy
+ */
+public class BungeeEventSender implements EventSenderInterface {
+
+ /**
+ * チャンネルチャットのチャットイベント
+ * @param channelName チャンネル名
+ * @param player 発言者
+ * @param originalMessage 発言内容
+ * @param ngMaskedMessage 発言内容(NGマスク後)
+ * @param messageFormat 発言に適用されるフォーマット
+ * @return イベント実行結果
+ * @see com.github.ucchyocean.lc3.event.EventSenderInterface#sendLunaChatChannelChatEvent(java.lang.String, com.github.ucchyocean.lc3.member.ChannelMember, java.lang.String, java.lang.String, java.lang.String)
+ */
+ @Override
+ public EventResult sendLunaChatChannelChatEvent(String channelName, ChannelMember member, String originalMessage,
+ String ngMaskedMessage, String messageFormat) {
+
+ LunaChatBungeeChannelChatEvent event =
+ new LunaChatBungeeChannelChatEvent(
+ channelName, member, originalMessage, ngMaskedMessage, messageFormat);
+ event = ProxyServer.getInstance().getPluginManager().callEvent(event);
+
+ EventResult result = new EventResult();
+ result.setCancelled(event.isCancelled());
+ result.setNgMaskedMessage(event.getNgMaskedMessage());
+ result.setMessageFormat(event.getMessageFormat());
+ return result;
+ }
+
+ /**
+ * チャンネル作成イベント
+ * @param channelName チャンネル名
+ * @param member 作成した人
+ * @return イベント実行結果
+ * @see com.github.ucchyocean.lc3.event.EventSenderInterface#sendLunaChatChannelCreateEvent(java.lang.String, com.github.ucchyocean.lc3.member.ChannelMember)
+ */
+ @Override
+ public EventResult sendLunaChatChannelCreateEvent(String channelName, ChannelMember member) {
+
+ LunaChatBungeeChannelCreateEvent event =
+ new LunaChatBungeeChannelCreateEvent(channelName, member);
+ event = ProxyServer.getInstance().getPluginManager().callEvent(event);
+
+ EventResult result = new EventResult();
+ result.setCancelled(event.isCancelled());
+ result.setChannelName(event.getChannelName());
+ return result;
+ }
+
+ /**
+ * メンバー変更イベント
+ * @param channelName チャンネル名
+ * @param before 変更前のメンバー
+ * @param after 変更後のメンバー
+ * @return イベント実行結果
+ * @see com.github.ucchyocean.lc3.event.EventSenderInterface#sendLunaChatChannelMemberChangedEvent(java.lang.String, java.util.List, java.util.List)
+ */
+ @Override
+ public EventResult sendLunaChatChannelMemberChangedEvent(String channelName, List before,
+ List after) {
+
+ LunaChatBungeeChannelMemberChangedEvent event =
+ new LunaChatBungeeChannelMemberChangedEvent(channelName, before, after);
+ event = ProxyServer.getInstance().getPluginManager().callEvent(event);
+
+ EventResult result = new EventResult();
+ result.setCancelled(event.isCancelled());
+ return result;
+ }
+
+ /**
+ * チャンネルチャットのメッセージイベント。このイベントはキャンセルできない。
+ * @param channelName チャンネル名
+ * @param member 発言者
+ * @param message 発言内容(NGマスクやJapanizeされた後の内容)
+ * @param recipients 受信者
+ * @param displayName 発言者の表示名
+ * @param originalMessage 発言内容(元々の内容)
+ * @return イベント実行結果
+ * @see com.github.ucchyocean.lc3.event.EventSenderInterface#sendLunaChatChannelMessageEvent(java.lang.String, com.github.ucchyocean.lc3.member.ChannelMember, java.lang.String, java.util.ArrayList, java.lang.String, java.lang.String)
+ */
+ @Override
+ public EventResult sendLunaChatChannelMessageEvent(String channelName, ChannelMember member, String message,
+ List recipients, String displayName, String originalMessage) {
+
+ LunaChatBungeeChannelMessageEvent event =
+ new LunaChatBungeeChannelMessageEvent(
+ channelName, member, message, recipients, displayName, originalMessage);
+ event = ProxyServer.getInstance().getPluginManager().callEvent(event);
+
+ EventResult result = new EventResult();
+ result.setMessage(event.getMessage());
+ result.setRecipients(event.getRecipients());
+ return result;
+ }
+
+ /**
+ * オプション変更イベント
+ * @param channelName チャンネル名
+ * @param member オプションを変更した人
+ * @param options 変更後のオプション
+ * @return イベント実行結果
+ * @see com.github.ucchyocean.lc3.event.EventSenderInterface#sendLunaChatChannelOptionChangedEvent(java.lang.String, com.github.ucchyocean.lc3.member.ChannelMember, java.util.HashMap)
+ */
+ @Override
+ public EventResult sendLunaChatChannelOptionChangedEvent(String channelName, ChannelMember member,
+ Map options) {
+
+ LunaChatBungeeChannelOptionChangedEvent event =
+ new LunaChatBungeeChannelOptionChangedEvent(channelName, member, options);
+ event = ProxyServer.getInstance().getPluginManager().callEvent(event);
+
+ EventResult result = new EventResult();
+ result.setCancelled(event.isCancelled());
+ result.setOptions(event.getOptions());
+ return result;
+ }
+
+ /**
+ * チャンネル削除イベント
+ * @param channelName チャンネル名
+ * @param member 削除を実行した人
+ * @return イベント実行結果
+ * @see com.github.ucchyocean.lc3.event.EventSenderInterface#sendLunaChatChannelRemoveEvent(java.lang.String, com.github.ucchyocean.lc3.member.ChannelMember)
+ */
+ @Override
+ public EventResult sendLunaChatChannelRemoveEvent(String channelName, ChannelMember member) {
+
+ LunaChatBungeeChannelRemoveEvent event = new LunaChatBungeeChannelRemoveEvent(channelName, member);
+ event = ProxyServer.getInstance().getPluginManager().callEvent(event);
+
+ EventResult result = new EventResult();
+ result.setCancelled(event.isCancelled());
+ result.setChannelName(event.getChannelName());
+ return result;
+ }
+
+ /**
+ * Japanize変換が行われた後に呼び出されるイベント
+ * @param channelName チャンネル名
+ * @param member 発言したメンバー
+ * @param original 変換前の文字列
+ * @param japanized 変換後の文字列
+ * @return イベント実行結果
+ * @see com.github.ucchyocean.lc3.event.EventSenderInterface#sendLunaChatPostJapanizeEvent(java.lang.String, com.github.ucchyocean.lc3.member.ChannelMember, java.lang.String, java.lang.String)
+ */
+ @Override
+ public EventResult sendLunaChatPostJapanizeEvent(String channelName, ChannelMember member, String original,
+ String japanized) {
+
+ LunaChatBungeePostJapanizeEvent event =
+ new LunaChatBungeePostJapanizeEvent(channelName, member, original, japanized);
+ event = ProxyServer.getInstance().getPluginManager().callEvent(event);
+
+ EventResult result = new EventResult();
+ result.setCancelled(event.isCancelled());
+ result.setJapanized(event.getJapanized());
+ return result;
+ }
+
+ /**
+ * チャンネルチャットへの発言前に発生するイベント
+ * @param channelName チャンネル名
+ * @param member 発言したメンバー
+ * @param message 発言内容
+ * @return イベント実行結果
+ * @see com.github.ucchyocean.lc3.event.EventSenderInterface#sendLunaChatPreChatEvent(java.lang.String, com.github.ucchyocean.lc3.member.ChannelMember, java.lang.String)
+ */
+ @Override
+ public EventResult sendLunaChatPreChatEvent(String channelName, ChannelMember member, String message) {
+
+ LunaChatBungeePreChatEvent event =
+ new LunaChatBungeePreChatEvent(channelName, member, message);
+ event = ProxyServer.getInstance().getPluginManager().callEvent(event);
+
+ EventResult result = new EventResult();
+ result.setCancelled(event.isCancelled());
+ result.setMessage(event.getMessage());
+ return result;
+ }
+}
diff --git a/src/main/java/com/github/ucchyocean/lc3/bungee/JapanizeCommandBungee.java b/src/main/java/com/github/ucchyocean/lc3/bungee/JapanizeCommandBungee.java
new file mode 100644
index 00000000..af78c1f5
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc3/bungee/JapanizeCommandBungee.java
@@ -0,0 +1,44 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc3.bungee;
+
+import com.github.ucchyocean.lc3.command.LunaChatJapanizeCommand;
+import com.github.ucchyocean.lc3.member.ChannelMember;
+
+import net.md_5.bungee.api.CommandSender;
+import net.md_5.bungee.api.plugin.Command;
+
+/**
+ * Japanizeコマンドの処理クラス(Bungee実装)
+ * @author ucchy
+ */
+public class JapanizeCommandBungee extends Command {
+
+ private LunaChatJapanizeCommand command;
+
+ /**
+ * コンストラクタ
+ * @param name
+ * @param permission
+ * @param aliases
+ */
+ public JapanizeCommandBungee(String name, String permission, String... aliases) {
+ super(name, permission, aliases);
+ command = new LunaChatJapanizeCommand();
+ }
+
+ /**
+ * コマンドを実行したときに呼び出されるメソッド
+ * @param sender 実行者
+ * @param args 実行されたコマンドの引数
+ * @see net.md_5.bungee.api.plugin.Command#execute(net.md_5.bungee.api.CommandSender, java.lang.String[])
+ */
+ @Override
+ public void execute(CommandSender sender, String[] args) {
+ command.execute(ChannelMember.getChannelMember(sender), "jp", args);
+ }
+
+}
diff --git a/src/main/java/com/github/ucchyocean/lc3/bungee/LunaChatCommandBungee.java b/src/main/java/com/github/ucchyocean/lc3/bungee/LunaChatCommandBungee.java
new file mode 100644
index 00000000..669a7f4c
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc3/bungee/LunaChatCommandBungee.java
@@ -0,0 +1,56 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc3.bungee;
+
+import com.github.ucchyocean.lc3.command.LunaChatCommand;
+import com.github.ucchyocean.lc3.member.ChannelMember;
+
+import net.md_5.bungee.api.CommandSender;
+import net.md_5.bungee.api.plugin.Command;
+import net.md_5.bungee.api.plugin.TabExecutor;
+
+/**
+ * Lunachatコマンドの処理クラス(Bungee実装)
+ * @author ucchy
+ */
+public class LunaChatCommandBungee extends Command implements TabExecutor {
+
+ private LunaChatCommand command;
+
+ /**
+ * コンストラクタ
+ * @param name
+ * @param permission
+ * @param aliases
+ */
+ public LunaChatCommandBungee(String name, String permission, String... aliases) {
+ super(name, permission, aliases);
+ command = new LunaChatCommand();
+ }
+
+ /**
+ * コマンドを実行したときに呼び出されるメソッド
+ * @param sender 実行者
+ * @param args 実行されたコマンドの引数
+ * @see net.md_5.bungee.api.plugin.Command#execute(net.md_5.bungee.api.CommandSender, java.lang.String[])
+ */
+ @Override
+ public void execute(CommandSender sender, String[] args) {
+ command.execute(ChannelMember.getChannelMember(sender), "ch", args);
+ }
+
+ /**
+ * TABキー補完が実行されたときに呼び出されるメソッド
+ * @param sender 実行者
+ * @param args 実行されたコマンドの引数
+ * @return 補完候補
+ * @see net.md_5.bungee.api.plugin.TabExecutor#onTabComplete(net.md_5.bungee.api.CommandSender, java.lang.String[])
+ */
+ @Override
+ public Iterable onTabComplete(CommandSender sender, String[] args) {
+ return command.onTabComplete(ChannelMember.getChannelMember(sender), "ch", args);
+ }
+}
diff --git a/src/main/java/com/github/ucchyocean/lc3/bungee/MessageCommandBungee.java b/src/main/java/com/github/ucchyocean/lc3/bungee/MessageCommandBungee.java
new file mode 100644
index 00000000..3efd7933
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc3/bungee/MessageCommandBungee.java
@@ -0,0 +1,44 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc3.bungee;
+
+import com.github.ucchyocean.lc3.command.LunaChatMessageCommand;
+import com.github.ucchyocean.lc3.member.ChannelMember;
+
+import net.md_5.bungee.api.CommandSender;
+import net.md_5.bungee.api.plugin.Command;
+
+/**
+ * Tellコマンドの処理クラス(Bungee実装)
+ * @author ucchy
+ */
+public class MessageCommandBungee extends Command {
+
+ private LunaChatMessageCommand command;
+
+ /**
+ * コンストラクタ
+ * @param name
+ * @param permission
+ * @param aliases
+ */
+ public MessageCommandBungee(String name, String permission, String... aliases) {
+ super(name, permission, aliases);
+ command = new LunaChatMessageCommand();
+ }
+
+ /**
+ * コマンドを実行したときに呼び出されるメソッド
+ * @param sender 実行者
+ * @param args 実行されたコマンドの引数
+ * @see net.md_5.bungee.api.plugin.Command#execute(net.md_5.bungee.api.CommandSender, java.lang.String[])
+ */
+ @Override
+ public void execute(CommandSender sender, String[] args) {
+ command.execute(ChannelMember.getChannelMember(sender), "m", args);
+ }
+
+}
diff --git a/src/main/java/com/github/ucchyocean/lc3/bungee/ReplyCommandBungee.java b/src/main/java/com/github/ucchyocean/lc3/bungee/ReplyCommandBungee.java
new file mode 100644
index 00000000..6478ae00
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc3/bungee/ReplyCommandBungee.java
@@ -0,0 +1,43 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc3.bungee;
+
+import com.github.ucchyocean.lc3.command.LunaChatReplyCommand;
+import com.github.ucchyocean.lc3.member.ChannelMember;
+
+import net.md_5.bungee.api.CommandSender;
+import net.md_5.bungee.api.plugin.Command;
+
+/**
+ * Replyコマンドの処理クラス(Bungee実装)
+ * @author ucchy
+ */
+public class ReplyCommandBungee extends Command {
+
+ private LunaChatReplyCommand command;
+
+ /**
+ * コンストラクタ
+ * @param name
+ * @param permission
+ * @param aliases
+ */
+ public ReplyCommandBungee(String name, String permission, String... aliases) {
+ super(name, permission, aliases);
+ command = new LunaChatReplyCommand();
+ }
+
+ /**
+ * コマンドを実行したときに呼び出されるメソッド
+ * @param sender 実行者
+ * @param args 実行されたコマンドの引数
+ * @see net.md_5.bungee.api.plugin.Command#execute(net.md_5.bungee.api.CommandSender, java.lang.String[])
+ */
+ @Override
+ public void execute(CommandSender sender, String[] args) {
+ command.execute(ChannelMember.getChannelMember(sender), "r", args);
+ }
+}
diff --git a/src/main/java/com/github/ucchyocean/lc3/bungee/event/LunaChatBungeeBaseCancellableEvent.java b/src/main/java/com/github/ucchyocean/lc3/bungee/event/LunaChatBungeeBaseCancellableEvent.java
new file mode 100644
index 00000000..5ef2db7d
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc3/bungee/event/LunaChatBungeeBaseCancellableEvent.java
@@ -0,0 +1,43 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc3.bungee.event;
+
+import net.md_5.bungee.api.plugin.Cancellable;
+
+/**
+ * 基底のキャンセル可能イベントクラス
+ * @author ucchy
+ */
+public class LunaChatBungeeBaseCancellableEvent extends LunaChatBungeeBaseEvent implements Cancellable {
+
+ private boolean isCancelled;
+
+ /**
+ * コンストラクタ
+ * @param channelName チャンネル名
+ */
+ public LunaChatBungeeBaseCancellableEvent(String channelName) {
+ super(channelName);
+ }
+
+ /**
+ * イベントがキャンセルされたかどうかをかえす
+ * @see org.bukkit.event.Cancellable#isCancelled()
+ */
+ @Override
+ public boolean isCancelled() {
+ return isCancelled;
+ }
+
+ /**
+ * イベントをキャンセルするかどうかを設定する
+ * @see org.bukkit.event.Cancellable#setCancelled(boolean)
+ */
+ @Override
+ public void setCancelled(boolean cancelled) {
+ isCancelled = cancelled;
+ }
+}
diff --git a/src/main/java/com/github/ucchyocean/lc3/bungee/event/LunaChatBungeeBaseEvent.java b/src/main/java/com/github/ucchyocean/lc3/bungee/event/LunaChatBungeeBaseEvent.java
new file mode 100644
index 00000000..64079ff8
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc3/bungee/event/LunaChatBungeeBaseEvent.java
@@ -0,0 +1,44 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc3.bungee.event;
+
+import com.github.ucchyocean.lc3.LunaChat;
+import com.github.ucchyocean.lc3.channel.Channel;
+
+import net.md_5.bungee.api.plugin.Event;
+
+/**
+ * 基底イベントクラス
+ * @author ucchy
+ */
+public abstract class LunaChatBungeeBaseEvent extends Event {
+
+ protected String channelName;
+
+ /**
+ * コンストラクタ
+ * @param channelName チャンネル名
+ */
+ public LunaChatBungeeBaseEvent(String channelName) {
+ this.channelName = channelName;
+ }
+
+ /**
+ * チャンネル名を取得する
+ * @return チャンネル名
+ */
+ public String getChannelName() {
+ return channelName;
+ }
+
+ /**
+ * チャンネルを取得する
+ * @return チャンネル
+ */
+ public Channel getChannel() {
+ return LunaChat.getAPI().getChannel(channelName);
+ }
+}
diff --git a/src/main/java/com/github/ucchyocean/lc3/bungee/event/LunaChatBungeeChannelChatEvent.java b/src/main/java/com/github/ucchyocean/lc3/bungee/event/LunaChatBungeeChannelChatEvent.java
new file mode 100644
index 00000000..7f7d5f57
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc3/bungee/event/LunaChatBungeeChannelChatEvent.java
@@ -0,0 +1,78 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc3.bungee.event;
+
+import com.github.ucchyocean.lc3.member.ChannelMember;
+
+/**
+ * チャンネルチャットのチャットイベント
+ * @author ucchy
+ */
+public class LunaChatBungeeChannelChatEvent extends LunaChatBungeeBaseCancellableEvent {
+
+ private ChannelMember player;
+ private String originalMessage;
+ private String ngMaskedMessage;
+ private String messageFormat;
+
+ public LunaChatBungeeChannelChatEvent(String channelName, ChannelMember player,
+ String originalMessage, String ngMaskedMessage,
+ String messageFormat) {
+ super(channelName);
+ this.player = player;
+ this.originalMessage = originalMessage;
+ this.ngMaskedMessage = ngMaskedMessage;
+ this.messageFormat = messageFormat;
+ }
+
+ /**
+ * 発言を行ったプレイヤーを取得します。
+ * @return 発言したプレイヤー
+ */
+ public ChannelMember getPlayer() {
+ return player;
+ }
+
+ /**
+ * 置き換え前の、発言されたままのテキストをかえす
+ * @return 発言内容
+ */
+ public String getPreReplaceMessage() {
+ return originalMessage;
+ }
+
+ /**
+ * NGワードがマスクされた後のテキストをかえす
+ * @return NGワードマスク済みの発言内容
+ */
+ public String getNgMaskedMessage() {
+ return ngMaskedMessage;
+ }
+
+ /**
+ * メッセージに適用されるフォーマットをかえす
+ * @return フォーマット
+ */
+ public String getMessageFormat() {
+ return messageFormat;
+ }
+
+ /**
+ * NGワードマスク後のテキストを上書き設定する
+ * @param ngMaskedMessage 上書きする発言内容
+ */
+ public void setNgMaskedMessage(String ngMaskedMessage) {
+ this.ngMaskedMessage = ngMaskedMessage;
+ }
+
+ /**
+ * メッセージフォーマットを上書き設定する
+ * @param messageFormat フォーマット
+ */
+ public void setMessageFormat(String messageFormat) {
+ this.messageFormat = messageFormat;
+ }
+}
diff --git a/src/main/java/com/github/ucchyocean/lc3/bungee/event/LunaChatBungeeChannelCreateEvent.java b/src/main/java/com/github/ucchyocean/lc3/bungee/event/LunaChatBungeeChannelCreateEvent.java
new file mode 100644
index 00000000..727dd297
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc3/bungee/event/LunaChatBungeeChannelCreateEvent.java
@@ -0,0 +1,49 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc3.bungee.event;
+
+import com.github.ucchyocean.lc3.channel.Channel;
+import com.github.ucchyocean.lc3.member.ChannelMember;
+
+/**
+ * チャンネル作成イベント
+ * @author ucchy
+ */
+public class LunaChatBungeeChannelCreateEvent extends LunaChatBungeeBaseCancellableEvent {
+
+ private ChannelMember member;
+
+ public LunaChatBungeeChannelCreateEvent(String channelName, ChannelMember member) {
+ super(channelName);
+ this.member = member;
+ }
+
+ /**
+ * 作成するチャンネルのチャンネル名を上書き設定する
+ * @param channelName 設定するチャンネル名
+ */
+ public void setChannelName(String channelName) {
+ this.channelName = channelName;
+ }
+
+ /**
+ * チャンネルを作成した人を取得する。
+ * @return チャンネルを作成したChannelMember
+ */
+ public ChannelMember getMember() {
+ return member;
+ }
+
+ /**
+ * @deprecated チャンネル作成イベントは、チャンネルを作成する前に呼び出されるので、
+ * このメソッドの戻り値は必ずnullになります。
+ * @see com.github.ucchyocean.lc3.bukkit.event.LunaChatBukkitBaseEvent#getChannel()
+ */
+ @Override
+ public Channel getChannel() {
+ return super.getChannel();
+ }
+}
diff --git a/src/main/java/com/github/ucchyocean/lc3/bungee/event/LunaChatBungeeChannelMemberChangedEvent.java b/src/main/java/com/github/ucchyocean/lc3/bungee/event/LunaChatBungeeChannelMemberChangedEvent.java
new file mode 100644
index 00000000..b7eae954
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc3/bungee/event/LunaChatBungeeChannelMemberChangedEvent.java
@@ -0,0 +1,49 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc3.bungee.event;
+
+import java.util.List;
+
+import com.github.ucchyocean.lc3.member.ChannelMember;
+
+/**
+ * メンバー変更イベント
+ * @author ucchy
+ */
+public class LunaChatBungeeChannelMemberChangedEvent extends LunaChatBungeeBaseCancellableEvent {
+
+ private List before;
+ private List after;
+
+ /**
+ * コンストラクタ
+ * @param channelName チャンネル名
+ * @param before 変更前のメンバー
+ * @param after 変更後のメンバー
+ */
+ public LunaChatBungeeChannelMemberChangedEvent(
+ String channelName, List before, List after) {
+ super(channelName);
+ this.before = before;
+ this.after = after;
+ }
+
+ /**
+ * 変更前のメンバーリストをかえす
+ * @return
+ */
+ public List getMembersBefore() {
+ return before;
+ }
+
+ /**
+ * 変更後のメンバーリストをかえす
+ * @return
+ */
+ public List getMembersAfter() {
+ return after;
+ }
+}
diff --git a/src/main/java/com/github/ucchyocean/lc3/bungee/event/LunaChatBungeeChannelMessageEvent.java b/src/main/java/com/github/ucchyocean/lc3/bungee/event/LunaChatBungeeChannelMessageEvent.java
new file mode 100644
index 00000000..47b08e4e
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc3/bungee/event/LunaChatBungeeChannelMessageEvent.java
@@ -0,0 +1,92 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc3.bungee.event;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.github.ucchyocean.lc3.member.ChannelMember;
+
+/**
+ * チャンネルチャットのメッセージイベント、
+ * このイベントはキャンセルできない。
+ * @author ucchy
+ */
+public class LunaChatBungeeChannelMessageEvent extends LunaChatBungeeBaseEvent {
+
+ private ChannelMember player;
+ private String message;
+ private List recipients;
+ private String displayName;
+ private String originalMessage;
+
+ public LunaChatBungeeChannelMessageEvent(String channelName,
+ ChannelMember player, String message, List recipients,
+ String displayName, String originalMessage) {
+ super(channelName);
+ this.player = player;
+ this.message = message;
+ this.recipients = recipients;
+ this.displayName = displayName;
+ this.originalMessage = originalMessage;
+ }
+
+ /**
+ * 発言したプレイヤー、システムメッセージの場合はnullになることに注意
+ * @return player 発言プレイヤー
+ */
+ public ChannelMember getPlayer() {
+ return player;
+ }
+
+ /**
+ * 置き換えされたメッセージ
+ * @return message メッセージ
+ */
+ public String getMessage() {
+ return message;
+ }
+
+ /**
+ * メッセージを受信するプレイヤーリスト
+ * @return recipients プレイヤーリスト
+ */
+ public List getRecipients() {
+ return recipients;
+ }
+
+ /**
+ * 発言者の表示名を取得する
+ * @return 発言者の表示名
+ */
+ public String getDisplayName() {
+ return displayName;
+ }
+
+ /**
+ * オリジナルメッセージ(チャットフォーマットを適用していない状態のメッセージ)を取得する
+ * @return オリジナルメッセージ
+ */
+ public String getOriginalMessage() {
+ return originalMessage;
+ }
+
+ /**
+ * メッセージを上書き設定する
+ * @param message メッセージ
+ */
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ /**
+ * メッセージ受信者を上書き設定する
+ * @param recipients メッセージ受信者
+ */
+ public void setRecipients(ArrayList recipients) {
+ this.recipients = recipients;
+ }
+}
diff --git a/src/main/java/com/github/ucchyocean/lc3/bungee/event/LunaChatBungeeChannelOptionChangedEvent.java b/src/main/java/com/github/ucchyocean/lc3/bungee/event/LunaChatBungeeChannelOptionChangedEvent.java
new file mode 100644
index 00000000..695a6aec
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc3/bungee/event/LunaChatBungeeChannelOptionChangedEvent.java
@@ -0,0 +1,52 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc3.bungee.event;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.github.ucchyocean.lc3.member.ChannelMember;
+
+/**
+ * オプション変更イベント
+ * @author ucchy
+ */
+public class LunaChatBungeeChannelOptionChangedEvent extends LunaChatBungeeBaseCancellableEvent {
+
+ private ChannelMember member;
+ private Map options;
+
+ public LunaChatBungeeChannelOptionChangedEvent(String channelName,
+ ChannelMember member, Map options) {
+ super(channelName);
+ this.member = member;
+ this.options = options;
+ }
+
+ /**
+ * 変更後のオプションリストをかえす
+ * @return オプションリスト
+ */
+ public Map getOptions() {
+ return options;
+ }
+
+ /**
+ * オプションリストを上書き設定する
+ * @param options オプションリスト
+ */
+ public void setOptions(HashMap options) {
+ this.options = options;
+ }
+
+ /**
+ * チャンネルのオプションを変更した人を取得する。
+ * @return チャンネルのオプションを変更したChannelMember
+ */
+ public ChannelMember getMember() {
+ return member;
+ }
+}
diff --git a/src/main/java/com/github/ucchyocean/lc3/bungee/event/LunaChatBungeeChannelRemoveEvent.java b/src/main/java/com/github/ucchyocean/lc3/bungee/event/LunaChatBungeeChannelRemoveEvent.java
new file mode 100644
index 00000000..0c0c1721
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc3/bungee/event/LunaChatBungeeChannelRemoveEvent.java
@@ -0,0 +1,30 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc3.bungee.event;
+
+import com.github.ucchyocean.lc3.member.ChannelMember;
+
+/**
+ * チャンネル削除イベント
+ * @author ucchy
+ */
+public class LunaChatBungeeChannelRemoveEvent extends LunaChatBungeeBaseCancellableEvent {
+
+ private ChannelMember member;
+
+ public LunaChatBungeeChannelRemoveEvent(String channelName, ChannelMember member) {
+ super(channelName);
+ this.member = member;
+ }
+
+ /**
+ * チャンネルを削除した人を取得する。
+ * @return チャンネルを削除したChannelMember
+ */
+ public ChannelMember getMember() {
+ return member;
+ }
+}
diff --git a/src/main/java/com/github/ucchyocean/lc3/bungee/event/LunaChatBungeePostJapanizeEvent.java b/src/main/java/com/github/ucchyocean/lc3/bungee/event/LunaChatBungeePostJapanizeEvent.java
new file mode 100644
index 00000000..a50162e3
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc3/bungee/event/LunaChatBungeePostJapanizeEvent.java
@@ -0,0 +1,66 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc3.bungee.event;
+
+import com.github.ucchyocean.lc3.member.ChannelMember;
+
+/**
+ * Japanize変換が行われた後に呼び出されるイベント
+ * @author ucchy
+ */
+public class LunaChatBungeePostJapanizeEvent extends LunaChatBungeeBaseCancellableEvent {
+
+ private ChannelMember player;
+ private String original;
+ private String japanized;
+
+ /**
+ * コンストラクタ
+ * @param channelName チャンネル名
+ * @param player 発言したプレイヤー
+ * @param original 変換前の文字列
+ * @param japanized 変換後の文字列
+ */
+ public LunaChatBungeePostJapanizeEvent(String channelName, ChannelMember player,
+ String original, String japanized) {
+ super(channelName);
+ this.player = player;
+ this.original = original;
+ this.japanized = japanized;
+ }
+
+ /**
+ * 発言を行ったプレイヤーを取得します。
+ * @return 発言したプレイヤー
+ */
+ public ChannelMember getPlayer() {
+ return player;
+ }
+
+ /**
+ * Japanize変換後の文字列を返す
+ * @return 変換後の文字列
+ */
+ public String getJapanized() {
+ return japanized;
+ }
+
+ /**
+ * Japanize変換後の文字列を差し替える
+ * @param japanized 変換後の文字列
+ */
+ public void setJapanized(String japanized) {
+ this.japanized = japanized;
+ }
+
+ /**
+ * Japanize変換前の文字列を返す
+ * @return 変換前の文字列
+ */
+ public String getOriginal() {
+ return original;
+ }
+}
diff --git a/src/main/java/com/github/ucchyocean/lc3/bungee/event/LunaChatBungeePreChatEvent.java b/src/main/java/com/github/ucchyocean/lc3/bungee/event/LunaChatBungeePreChatEvent.java
new file mode 100644
index 00000000..d2d08551
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc3/bungee/event/LunaChatBungeePreChatEvent.java
@@ -0,0 +1,66 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc3.bungee.event;
+
+import com.github.ucchyocean.lc3.channel.Channel;
+import com.github.ucchyocean.lc3.member.ChannelMember;
+
+/**
+ * チャンネルチャットへの発言前に発生するイベント
+ * @author ucchy
+ */
+public class LunaChatBungeePreChatEvent extends LunaChatBungeeBaseCancellableEvent {
+
+ private ChannelMember player;
+ private String message;
+
+ public LunaChatBungeePreChatEvent(String channelName, ChannelMember player, String message) {
+ super(channelName);
+ this.player = player;
+ this.message = message;
+ }
+
+ /**
+ * 発言を行ったプレイヤーを取得します。
+ * @return 発言したプレイヤー
+ */
+ public ChannelMember getPlayer() {
+ return player;
+ }
+
+ /**
+ * 発言内容を取得します。
+ * @return 発言内容
+ */
+ public String getMessage() {
+ return message;
+ }
+
+ /**
+ * 発言先チャンネルを変更します。
+ * @param channelName 発言先チャンネル名
+ */
+ public void setChannelName(String channelName) {
+ this.channelName = channelName;
+ }
+
+ /**
+ * 発言先チャンネルを変更します。
+ * @param channel 発言先チャンネル
+ */
+ public void setChannel(Channel channel) {
+ if ( channel == null ) return;
+ this.channelName = channel.getName();
+ }
+
+ /**
+ * 発言内容を変更します。
+ * @param message 発言内容
+ */
+ public void setMessage(String message) {
+ this.message = message;
+ }
+}
diff --git a/src/main/java/com/github/ucchyocean/lc3/channel/BukkitChannel.java b/src/main/java/com/github/ucchyocean/lc3/channel/BukkitChannel.java
new file mode 100644
index 00000000..62f325d9
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc3/channel/BukkitChannel.java
@@ -0,0 +1,362 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc3.channel;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import org.bukkit.Bukkit;
+import org.bukkit.ChatColor;
+import org.bukkit.Location;
+import org.bukkit.World;
+import org.bukkit.entity.Player;
+
+import com.github.ucchyocean.lc3.LunaChat;
+import com.github.ucchyocean.lc3.LunaChatAPI;
+import com.github.ucchyocean.lc3.LunaChatBukkit;
+import com.github.ucchyocean.lc3.LunaChatConfig;
+import com.github.ucchyocean.lc3.Messages;
+import com.github.ucchyocean.lc3.Utility;
+import com.github.ucchyocean.lc3.UtilityBukkit;
+import com.github.ucchyocean.lc3.bridge.DynmapBridge;
+import com.github.ucchyocean.lc3.event.EventResult;
+import com.github.ucchyocean.lc3.member.ChannelMember;
+import com.github.ucchyocean.lc3.member.ChannelMemberBukkit;
+
+/**
+ * チャンネルの実装クラス
+ * @author ucchy
+ */
+public class BukkitChannel extends Channel {
+
+ private SimpleDateFormat dateFormat;
+ private SimpleDateFormat timeFormat;
+
+ /**
+ * コンストラクタ
+ * @param name チャンネル名
+ */
+ protected BukkitChannel(String name) {
+
+ super(name);
+
+ dateFormat = new SimpleDateFormat("yyyy/MM/dd");
+ timeFormat = new SimpleDateFormat("HH:mm:ss");
+ }
+
+ /**
+ * メッセージを表示します。指定したプレイヤーの発言として処理されます。
+ * @param player プレイヤー(ワールドチャット、範囲チャットの場合は必須です)
+ * @param message メッセージ
+ * @param format フォーマット
+ * @param sendDynmap dynmapへ送信するかどうか
+ * @param name 発言者名
+ */
+ @Override
+ protected void sendMessage(ChannelMember player, String message,
+ String format, boolean sendDynmap, String name) {
+
+ LunaChatConfig config = LunaChat.getConfig();
+
+ String originalMessage = new String(message);
+
+ // 受信者を設定する
+ List recipients = new ArrayList();
+ boolean sendNoRecipientMessage = false;
+
+ if ( isBroadcastChannel() ) {
+ // ブロードキャストチャンネル
+
+ if ( isWorldRange() && player.isOnline() && player.getWorldName() != null ) {
+
+ World w = Bukkit.getWorld(player.getWorldName());
+
+ if ( getChatRange() > 0 ) {
+ // 範囲チャット
+
+ if ( player instanceof ChannelMemberBukkit ) {
+ Location origin = ((ChannelMemberBukkit)player).getLocation();
+ for ( Player p : Bukkit.getOnlinePlayers() ) {
+ ChannelMember cp = ChannelMember.getChannelMember(p);
+ if ( p.getWorld().equals(w) &&
+ origin.distance(p.getLocation()) <= getChatRange() &&
+ !getHided().contains(cp) ) {
+ recipients.add(ChannelMember.getChannelMember(p));
+ }
+ }
+ } else {
+ // TODO 何かするか?検討する
+ }
+
+ } else {
+ // ワールドチャット
+
+ for ( Player p : Bukkit.getOnlinePlayers() ) {
+ ChannelMember cp = ChannelMember.getChannelMember(p);
+ if ( p.getWorld().equals(w) && !getHided().contains(cp) ) {
+ recipients.add(ChannelMember.getChannelMember(p));
+ }
+ }
+ }
+
+ // 受信者が自分以外いない場合は、メッセージを表示する
+ if ( !Messages.noRecipientMessage("", "").isEmpty() && (
+ recipients.size() == 0 ||
+ (recipients.size() == 1 &&
+ recipients.get(0).getName().equals(player.getName()) ) ) ) {
+ sendNoRecipientMessage = true;
+ }
+
+ } else {
+ // 通常ブロードキャスト(全員へ送信)
+
+ for ( Player p : Bukkit.getOnlinePlayers() ) {
+ ChannelMember cp = ChannelMember.getChannelMember(p);
+ if ( !getHided().contains(cp) ) {
+ recipients.add(cp);
+ }
+ }
+ }
+
+ } else {
+ // 通常チャンネル
+
+ for ( ChannelMember mem : getMembers() ) {
+ if ( mem != null && mem.isOnline() && !getHided().contains(mem) ) {
+ recipients.add(mem);
+ }
+ }
+ }
+
+ // opListenAllChannel 設定がある場合は、
+ // パーミッション lunachat-admin.listen-all-channels を持つプレイヤーを
+ // 受信者に加える。
+ if ( config.isOpListenAllChannel() ) {
+ for ( Player p : Bukkit.getOnlinePlayers() ) {
+ ChannelMember cp = ChannelMember.getChannelMember(p);
+ if ( cp.hasPermission("lunachat-admin.listen-all-channels")
+ && !recipients.contains(cp) ) {
+ recipients.add(cp);
+ }
+ }
+ }
+
+ // hideされている場合は、受信対象者から抜く。
+ LunaChatAPI api = LunaChat.getAPI();
+ for ( ChannelMember cp : api.getHidelist(player) ) {
+ if ( recipients.contains(cp) ) {
+ recipients.remove(cp);
+ }
+ }
+
+ // フォーマットがある場合は置き換える
+ if ( format != null ) {
+ message = format.replace("%msg", message);
+ }
+
+ // LunaChatChannelMessageEvent イベントコール
+ EventResult result = LunaChat.getEventSender().sendLunaChatChannelMessageEvent(
+ getName(), player, message, recipients, name, originalMessage);
+ message = result.getMessage();
+ recipients = result.getRecipients();
+
+ // 通常ブロードキャストなら、設定に応じてdynmapへ送信する
+ DynmapBridge dynmap = LunaChatBukkit.getInstance().getDynmap();
+ if ( config.isSendBroadcastChannelChatToDynmap() &&
+ sendDynmap &&
+ dynmap != null &&
+ isBroadcastChannel() &&
+ !isWorldRange() ) {
+
+ String msg = config.isSendFormattedMessageToDynmap() ? message : originalMessage;
+ if ( player != null && player instanceof ChannelMemberBukkit
+ && ((ChannelMemberBukkit)player).getPlayer() != null ) {
+ dynmap.chat(((ChannelMemberBukkit)player).getPlayer(), msg);
+ } else {
+ dynmap.broadcast(msg);
+ }
+ }
+
+ // 送信する
+ for ( ChannelMember p : recipients ) {
+ p.sendMessage(message);
+ }
+
+ // 設定に応じて、コンソールに出力する
+ if ( config.isDisplayChatOnConsole() ) {
+ Bukkit.getLogger().info(ChatColor.stripColor(message));
+ }
+
+ // 受信者が自分以外いない場合は、メッセージを表示する
+ if ( sendNoRecipientMessage ) {
+ player.sendMessage(Messages.noRecipientMessage(getColorCode(), getName()));
+ }
+
+ // ロギング
+ log(originalMessage, name, player);
+ }
+
+ /**
+ * チャンネルのオンライン人数を返す
+ * @return オンライン人数
+ * @see com.github.ucchyocean.lc3.channel.Channel#getOnlineNum()
+ */
+ @Override
+ public int getOnlineNum() {
+
+ // ブロードキャストチャンネルならサーバー接続人数を返す
+ if ( isBroadcastChannel() ) {
+ return UtilityBukkit.getOnlinePlayersCount();
+ }
+
+ return super.getOnlineNum();
+ }
+
+ /**
+ * チャンネルの総参加人数を返す
+ * @return 総参加人数
+ * @see com.github.ucchyocean.lc3.channel.Channel#getTotalNum()
+ */
+ @Override
+ public int getTotalNum() {
+
+ // ブロードキャストチャンネルならサーバー接続人数を返す
+ if ( isBroadcastChannel() ) {
+ return UtilityBukkit.getOnlinePlayersCount();
+ }
+
+ return super.getTotalNum();
+ }
+
+ /**
+ * チャンネルのメンバーを返す
+ * @return チャンネルのメンバー
+ * @see com.github.ucchyocean.lc3.channel.Channel#getMembers()
+ */
+ @Override
+ public List getMembers() {
+
+ // ブロードキャストチャンネルなら、
+ // 現在サーバーに接続している全プレイヤーをメンバーとして返す
+ if ( isBroadcastChannel() ) {
+ List mem = new ArrayList();
+ for ( Player p : Bukkit.getOnlinePlayers() ) {
+ mem.add(ChannelMember.getChannelMember(p));
+ }
+ return mem;
+ }
+
+ return super.getMembers();
+ }
+
+ /**
+ * チャットフォーマット内のキーワードを置き換えする
+ * @param format チャットフォーマット
+ * @param player プレイヤー
+ * @return 置き換え結果
+ */
+ @Override
+ protected String replaceKeywords(String format, ChannelMember player) {
+
+ LunaChatAPI api = LunaChat.getAPI();
+
+ String msg = format;
+
+ // テンプレートのキーワードを、まず最初に置き換える
+ for ( int i=0; i<=9; i++ ) {
+ String key = "%" + i;
+ if ( msg.contains(key) ) {
+ if ( api.getTemplate("" + i) != null ) {
+ msg = msg.replace(key, api.getTemplate("" + i));
+ break;
+ }
+ }
+ }
+
+ msg = msg.replace("%ch", getName());
+ //msg = msg.replace("%msg", message);
+ msg = msg.replace("%color", getColorCode());
+ if ( getPrivateMessageTo() != null ) {
+ msg = msg.replace("%to", getPrivateMessageTo().getDisplayName());
+ } else {
+ msg = msg.replace("%to", "");
+ }
+ msg = msg.replace("%recieverserver", "");
+
+ if ( msg.contains("%date") ) {
+ msg = msg.replace("%date", dateFormat.format(new Date()));
+ }
+ if ( msg.contains("%time") ) {
+ msg = msg.replace("%time", timeFormat.format(new Date()));
+ }
+
+ if ( player != null ) {
+ msg = msg.replace("%username", player.getDisplayName());
+ msg = msg.replace("%player", player.getName());
+
+ if ( msg.contains("%prefix") || msg.contains("%suffix") ) {
+ msg = msg.replace("%prefix", player.getPrefix());
+ msg = msg.replace("%suffix", player.getSuffix());
+ }
+
+ if ( msg.contains("%world") ) {
+
+ String worldname = null;
+ if ( LunaChatBukkit.getInstance().getMultiverseCore() != null ) {
+ worldname = LunaChatBukkit.getInstance().getMultiverseCore().getWorldAlias(player.getWorldName());
+ }
+ if ( worldname == null || worldname.equals("") ) {
+ worldname = player.getWorldName();
+ }
+ msg = msg.replace("%world", worldname);
+ }
+
+ msg = msg.replace("%server", "");
+
+ } else {
+ msg = msg.replace("%username", "");
+ msg = msg.replace("%player", "");
+ msg = msg.replace("%prefix", "");
+ msg = msg.replace("%suffix", "");
+ msg = msg.replace("%world", "");
+ msg = msg.replace("%server", "");
+ }
+
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * ログを記録する
+ * @param name 発言者
+ * @param message 記録するメッセージ
+ * @param player プレイヤー
+ */
+ private void log(String message, String name, ChannelMember player) {
+
+ // LunaChatのチャットログへ記録
+ LunaChatConfig config = LunaChat.getConfig();
+ if ( config.isLoggingChat() && logger != null ) {
+ logger.log(message, name);
+ }
+
+ // TODO ログ記録プラグイン連携を検討する
+// // Hawkeye Reloaded のチャットログへ記録
+// if ( config.isLoggingChatToHawkEye() && LunaChat.getInstance().getHawkEye() != null
+// && player != null && player.getLocation() != null ) {
+// LunaChat.getInstance().getHawkEye().writeLog(name, player.getLocation(),
+// "channel(" + getName() + ")-" + Utility.stripColor(message));
+// }
+//
+// // Prism のチャットログへ記録
+// if ( config.isLoggingChatToPrism() && LunaChat.getInstance().getPrism() != null
+// && player != null && player.getPlayer() != null ) {
+// LunaChat.getInstance().getPrism().writeLog(player.getPlayer(),
+// "channel(" + getName() + ")-" + Utility.stripColor(message));
+// }
+ }
+}
diff --git a/src/main/java/com/github/ucchyocean/lc3/channel/BungeeChannel.java b/src/main/java/com/github/ucchyocean/lc3/channel/BungeeChannel.java
new file mode 100644
index 00000000..8158d4ad
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc3/channel/BungeeChannel.java
@@ -0,0 +1,281 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc3.channel;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import com.github.ucchyocean.lc3.LunaChat;
+import com.github.ucchyocean.lc3.LunaChatAPI;
+import com.github.ucchyocean.lc3.LunaChatBungee;
+import com.github.ucchyocean.lc3.LunaChatConfig;
+import com.github.ucchyocean.lc3.Utility;
+import com.github.ucchyocean.lc3.event.EventResult;
+import com.github.ucchyocean.lc3.member.ChannelMember;
+import com.github.ucchyocean.lc3.member.ChannelMemberProxiedPlayer;
+
+import net.md_5.bungee.api.ProxyServer;
+import net.md_5.bungee.api.connection.ProxiedPlayer;
+
+/**
+ * チャンネルのBungee実装クラス
+ * @author ucchy
+ */
+public class BungeeChannel extends Channel {
+
+ private SimpleDateFormat dateFormat;
+ private SimpleDateFormat timeFormat;
+
+ /**
+ * コンストラクタ
+ * @param name チャンネル名
+ */
+ protected BungeeChannel(String name) {
+
+ super(name);
+
+ dateFormat = new SimpleDateFormat("yyyy/MM/dd");
+ timeFormat = new SimpleDateFormat("HH:mm:ss");
+ }
+
+ /**
+ * メッセージを表示します。指定したプレイヤーの発言として処理されます。
+ * @param player プレイヤー(ワールドチャット、範囲チャットの場合は必須です)
+ * @param message メッセージ
+ * @param format フォーマット
+ * @param sendDynmap dynmapへ送信するかどうか
+ * @param name 発言者名
+ */
+ @Override
+ protected void sendMessage(ChannelMember player, String message,
+ String format, boolean sendDynmap, String name) {
+
+ LunaChatConfig config = LunaChat.getConfig();
+
+ String originalMessage = new String(message);
+
+ // 受信者を設定する
+ List recipients = new ArrayList();
+
+ if ( isBroadcastChannel() ) {
+ // ブロードキャストチャンネル
+
+ // NOTE: BungeeChannelは範囲チャットやワールドチャットをサポートしない
+
+ // 通常ブロードキャスト(全員へ送信)
+ for ( ProxiedPlayer p : ProxyServer.getInstance().getPlayers() ) {
+ ChannelMember cp = ChannelMember.getChannelMember(p);
+ if ( !getHided().contains(cp) ) {
+ recipients.add(cp);
+ }
+ }
+
+ } else {
+ // 通常チャンネル
+
+ for ( ChannelMember mem : getMembers() ) {
+ if ( mem != null && mem.isOnline() && !getHided().contains(mem) ) {
+ recipients.add(mem);
+ }
+ }
+ }
+
+ // opListenAllChannel 設定がある場合は、
+ // パーミッション lunachat-admin.listen-all-channels を持つプレイヤーを
+ // 受信者に加える。
+ if ( config.isOpListenAllChannel() ) {
+ for ( ProxiedPlayer p : ProxyServer.getInstance().getPlayers() ) {
+ ChannelMember cp = ChannelMember.getChannelMember(p);
+ if ( cp.hasPermission("lunachat-admin.listen-all-channels")
+ && !recipients.contains(cp) ) {
+ recipients.add(cp);
+ }
+ }
+ }
+
+ // hideされている場合は、受信対象者から抜く。
+ LunaChatAPI api = LunaChat.getAPI();
+ for ( ChannelMember cp : api.getHidelist(player) ) {
+ if ( recipients.contains(cp) ) {
+ recipients.remove(cp);
+ }
+ }
+
+ // フォーマットがある場合は置き換える
+ if ( format != null ) {
+ message = format.replace("%msg", message);
+ }
+
+ // LunaChatChannelMessageEvent イベントコール
+ EventResult result = LunaChat.getEventSender().sendLunaChatChannelMessageEvent(
+ getName(), player, message, recipients, name, originalMessage);
+ message = result.getMessage();
+ recipients = result.getRecipients();
+
+ // 送信する
+ for ( ChannelMember p : recipients ) {
+ p.sendMessage(message);
+ }
+
+ // 設定に応じて、コンソールに出力する
+ if ( config.isDisplayChatOnConsole() ) {
+ LunaChatBungee.getInstance().getLogger().info(message);
+ }
+
+ // ロギング
+ log(originalMessage, name, player);
+ }
+
+ /**
+ * チャンネルのオンライン人数を返す
+ * @return オンライン人数
+ * @see com.github.ucchyocean.lc3.channel.Channel#getOnlineNum()
+ */
+ @Override
+ public int getOnlineNum() {
+
+ // ブロードキャストチャンネルならサーバー接続人数を返す
+ if ( isBroadcastChannel() ) {
+ return ProxyServer.getInstance().getOnlineCount();
+ }
+
+ return super.getOnlineNum();
+ }
+
+ /**
+ * チャンネルの総参加人数を返す
+ * @return 総参加人数
+ * @see com.github.ucchyocean.lc3.channel.Channel#getTotalNum()
+ */
+ @Override
+ public int getTotalNum() {
+
+ // ブロードキャストチャンネルならサーバー接続人数を返す
+ if ( isBroadcastChannel() ) {
+ return ProxyServer.getInstance().getOnlineCount();
+ }
+
+ return super.getTotalNum();
+ }
+
+ /**
+ * チャンネルのメンバーを返す
+ * @return チャンネルのメンバー
+ * @see com.github.ucchyocean.lc3.channel.Channel#getMembers()
+ */
+ @Override
+ public List getMembers() {
+
+ // ブロードキャストチャンネルなら、
+ // 現在サーバーに接続している全プレイヤーをメンバーとして返す
+ if ( isBroadcastChannel() ) {
+ List mem = new ArrayList();
+ for ( ProxiedPlayer p : ProxyServer.getInstance().getPlayers() ) {
+ mem.add(ChannelMember.getChannelMember(p));
+ }
+ return mem;
+ }
+
+ return super.getMembers();
+ }
+
+ /**
+ * チャットフォーマット内のキーワードを置き換えする
+ * @param format チャットフォーマット
+ * @param player プレイヤー
+ * @return 置き換え結果
+ */
+ @Override
+ protected String replaceKeywords(String format, ChannelMember player) {
+
+ LunaChatAPI api = LunaChat.getAPI();
+
+ String msg = format;
+
+ // テンプレートのキーワードを、まず最初に置き換える
+ for ( int i=0; i<=9; i++ ) {
+ String key = "%" + i;
+ if ( msg.contains(key) ) {
+ if ( api.getTemplate("" + i) != null ) {
+ msg = msg.replace(key, api.getTemplate("" + i));
+ break;
+ }
+ }
+ }
+
+ msg = msg.replace("%ch", getName());
+ //msg = msg.replace("%msg", message);
+ msg = msg.replace("%color", getColorCode());
+ if ( getPrivateMessageTo() != null ) {
+ msg = msg.replace("%to", getPrivateMessageTo().getDisplayName());
+ if ( getPrivateMessageTo() instanceof ChannelMemberProxiedPlayer ) {
+ ChannelMemberProxiedPlayer cm = (ChannelMemberProxiedPlayer)getPrivateMessageTo();
+ msg = msg.replace("%recieverserver", cm.getServer().getInfo().getName());
+ } else {
+ msg = msg.replace("%recieverserver", "");
+ }
+ } else {
+ msg = msg.replace("%to", "");
+ msg = msg.replace("%recieverserver", "");
+ }
+
+ if ( msg.contains("%date") ) {
+ msg = msg.replace("%date", dateFormat.format(new Date()));
+ }
+ if ( msg.contains("%time") ) {
+ msg = msg.replace("%time", timeFormat.format(new Date()));
+ }
+
+ if ( player != null ) {
+ msg = msg.replace("%username", player.getDisplayName());
+ msg = msg.replace("%player", player.getName());
+
+ if ( msg.contains("%prefix") || msg.contains("%suffix") ) {
+ msg = msg.replace("%prefix", player.getPrefix());
+ msg = msg.replace("%suffix", player.getSuffix());
+ }
+
+ msg = msg.replace("%world", "");
+
+ if ( msg.contains("%server") ) {
+ if ( player instanceof ChannelMemberProxiedPlayer ) {
+ String serverName = ((ChannelMemberProxiedPlayer)player).getServer().getInfo().getName();
+ msg = msg.replace("%server", serverName);
+ }
+ msg = msg.replace("%server", "");
+ }
+
+ } else {
+ msg = msg.replace("%username", "");
+ msg = msg.replace("%player", "");
+ msg = msg.replace("%prefix", "");
+ msg = msg.replace("%suffix", "");
+ msg = msg.replace("%world", "");
+ msg = msg.replace("%server", "");
+ }
+
+ return Utility.replaceColorCode(msg);
+ }
+
+ /**
+ * ログを記録する
+ * @param name 発言者
+ * @param message 記録するメッセージ
+ * @param player プレイヤー
+ */
+ private void log(String message, String name, ChannelMember player) {
+
+ // LunaChatのチャットログへ記録
+ LunaChatConfig config = LunaChat.getConfig();
+ if ( config.isLoggingChat() && logger != null ) {
+ logger.log(message, name);
+ }
+
+ // TODO ログ記録プラグイン連携を検討する
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/github/ucchyocean/lc3/channel/Channel.java b/src/main/java/com/github/ucchyocean/lc3/channel/Channel.java
new file mode 100644
index 00000000..ec10118d
--- /dev/null
+++ b/src/main/java/com/github/ucchyocean/lc3/channel/Channel.java
@@ -0,0 +1,1327 @@
+/*
+ * @author ucchy
+ * @license LGPLv3
+ * @copyright Copyright ucchy 2020
+ */
+package com.github.ucchyocean.lc3.channel;
+
+import java.io.File;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import com.github.ucchyocean.lc3.ChatColor;
+import com.github.ucchyocean.lc3.LunaChat;
+import com.github.ucchyocean.lc3.LunaChatAPI;
+import com.github.ucchyocean.lc3.LunaChatConfig;
+import com.github.ucchyocean.lc3.LunaChatLogger;
+import com.github.ucchyocean.lc3.LunaChatMode;
+import com.github.ucchyocean.lc3.Messages;
+import com.github.ucchyocean.lc3.NGWordAction;
+import com.github.ucchyocean.lc3.Utility;
+import com.github.ucchyocean.lc3.YamlConfig;
+import com.github.ucchyocean.lc3.event.EventResult;
+import com.github.ucchyocean.lc3.japanize.JapanizeType;
+import com.github.ucchyocean.lc3.member.ChannelMember;
+
+/**
+ * チャンネル
+ * @author ucchy
+ */
+public abstract class Channel {
+
+ private static final String PERMISSION_SPEAK_PREFIX = "lunachat.speak";
+
+ private static final String FOLDER_NAME_CHANNELS = "channels";
+
+ private static final String KEY_NAME = "name";
+ private static final String KEY_ALIAS = "alias";
+ private static final String KEY_DESC = "desc";
+ private static final String KEY_FORMAT = "format";
+ private static final String KEY_MEMBERS = "members";
+ private static final String KEY_BANNED = "banned";
+ private static final String KEY_MUTED = "muted";
+ private static final String KEY_HIDED = "hided";
+ private static final String KEY_MODERATOR = "moderator";
+ private static final String KEY_PASSWORD = "password";
+ private static final String KEY_VISIBLE = "visible";
+ private static final String KEY_COLOR = "color";
+ private static final String KEY_BROADCAST = "broadcast";
+ private static final String KEY_WORLD = "world";
+ private static final String KEY_RANGE = "range";
+ private static final String KEY_BAN_EXPIRES = "ban_expires";
+ private static final String KEY_MUTE_EXPIRES = "mute_expires";
+ private static final String KEY_ALLOWCC = "allowcc";
+ private static final String KEY_JAPANIZE = "japanize";
+
+ /** 参加者 */
+ private List members;
+
+ /** チャンネルモデレータ */
+ private List moderator;
+
+ /** BANされたプレイヤー */
+ private List banned;
+
+ /** Muteされたプレイヤー */
+ private List muted;
+
+ /** Hideしているプレイヤー */
+ private List hided;
+
+ /** チャンネルの名称 */
+ private String name;
+
+ /** チャンネルの別名 */
+ private String alias;
+
+ /** チャンネルの説明文 */
+ private String description;
+
+ /** チャンネルのパスワード */
+ private String password;
+
+ /** チャンネルリストに表示されるかどうか */
+ private boolean visible;
+
+ /** チャンネルのカラー */
+ private String colorCode;
+
+ /** メッセージフォーマット
+ * 指定可能なキーワードは下記のとおり
+ * %ch - チャンネル名
+ * %username - ユーザー名
+ * %msg - メッセージ
+ * %prefix - PermissionsExに設定するprefix
+ * %suffix - PermissionsExに設定するsuffix
+ * %color - チャンネルのカラーコード
+ * */
+ private String format;
+
+ /** ブロードキャストチャンネルかどうか */
+ private boolean broadcastChannel;
+
+ /** ワールドチャットかどうか */
+ private boolean isWorldRange;
+
+ /** チャットの可聴範囲 0は無制限 */
+ private int chatRange;
+
+ /** 期限付きBANの期限(key=プレイヤー名、value=期日(ミリ秒)) */
+ private Map banExpires;
+
+ /** 期限付きMuteの期限(key=プレイヤー名、value=期日(ミリ秒)) */
+ private Map muteExpires;
+
+ /** 1:1チャットの相手 */
+ private ChannelMember privateMessageTo;
+
+ /** カラーコードの使用可否 */
+ private boolean allowcc;
+
+ /** チャンネルごとのjapanize変換設定 */
+ private JapanizeType japanizeType;
+
+
+ protected LunaChatLogger logger;
+
+ /**
+ * コンストラクタ
+ * @param name チャンネルの名称
+ */
+ protected Channel(String name) {
+
+ this.name = name;
+ this.alias = "";
+ this.description = "";
+ this.members = new ArrayList();
+ this.banned = new ArrayList();
+ this.muted = new ArrayList