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 - - - target/LunaChat.jar - 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 - 1.8 + ${java.version} + ${java.version} @@ -49,34 +52,18 @@ maven-javadoc-plugin 3.1.0 - 1.8 + ${java.version} 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) 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 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(); + 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 = null; + this.allowcc = true; + + LunaChatConfig config = LunaChat.getConfig(); + if ( isPersonalChat() ) { + this.format = config.getDefaultFormatForPrivateMessage(); + } else { + this.format = config.getDefaultFormat(); + } + this.japanizeType = config.getJapanizeType(); + + logger = new LunaChatLogger(name.replace(">", "-").replace("*", "_")); + } + + /** + * 1:1チャットかどうか + * @return 1:1チャットかどうか + */ + public boolean isPersonalChat() { + return name.contains(">"); + } + + /** + * ブロードキャストチャンネルかどうか + * @return ブロードキャストチャンネルかどうか + */ + public boolean isBroadcastChannel() { + return (isGlobalChannel() || broadcastChannel); + } + + /** + * グローバルチャンネルかどうか + * @return グローバルチャンネルかどうか + */ + public boolean isGlobalChannel() { + LunaChatConfig config = LunaChat.getConfig(); + return getName().equals(config.getGlobalChannel()); + } + + /** + * 強制参加チャンネルかどうか + * @return 強制参加チャンネルかどうか + */ + public boolean isForceJoinChannel() { + LunaChatConfig config = LunaChat.getConfig(); + return config.getForceJoinChannels().contains(getName()); + } + + /** + * このチャンネルのモデレータ権限を持っているかどうかを確認する + * @param player 権限を確認する対象 + * @return チャンネルのモデレータ権限を持っているかどうか + */ + public boolean hasModeratorPermission(ChannelMember player) { + if ( player == null ) return false; + return player.hasPermission("lunachat-admin.mod-all-channels") || moderator.contains(player); + } + + /** + * このチャットに発言をする + * @param player 発言をするプレイヤー + * @param message 発言をするメッセージ + */ + public void chat(ChannelMember player, String message) { + + // 発言権限を確認する + String node = PERMISSION_SPEAK_PREFIX + "." + getName(); + if ( player.isPermissionSet(node) && !player.hasPermission(node) ) { + player.sendMessage(Messages.errmsgPermission(node)); + return; + } + + LunaChatConfig config = LunaChat.getConfig(); + LunaChatAPI api = LunaChat.getAPI(); + + // Muteされているかどうかを確認する + if ( getMuted().contains(player) ) { + player.sendMessage(Messages.errmsgMuted()); + return; + } + + 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 イベントコール + EventResult result = LunaChat.getEventSender().sendLunaChatChannelChatEvent( + getName(), player, message, maskedMessage, msgFormat); + if ( result.isCancelled() ) { + return; + } + msgFormat = result.getMessageFormat(); + maskedMessage = result.getNgMaskedMessage(); + + // 2byteコードを含むか、半角カタカナのみなら、Japanize変換は行わない + String kanaTemp = Utility.stripColorCode(maskedMessage); + + if ( !skipJapanize && + ( kanaTemp.getBytes(StandardCharsets.UTF_8).length > kanaTemp.length() || + kanaTemp.matches("[ \\uFF61-\\uFF9F]+") ) ) { + skipJapanize = true; + } + + // Japanize変換タスクを作成する + boolean isIncludeSyncChat = true; + ChannelChatJapanizeTask 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 ChannelChatJapanizeTask(maskedMessage, + japanizeType, this, player, jpFormat, messageFormat); + } + + if ( isIncludeSyncChat ) { + // メッセージの送信 + sendMessage(player, maskedMessage, msgFormat, true, player.getDisplayName()); + } + + // 非同期実行タスクがある場合、追加で実行する + if ( delayedTask != null ) { + LunaChat.runAsyncTask(delayedTask); + } + + // NGワード発言者に、NGワードアクションを実行する + if ( isNG ) { + if ( config.getNgwordAction() == NGWordAction.BAN ) { + // BANする + + if ( !isGlobalChannel() ) { + getBanned().add(player); + removeMember(player); + if ( !Messages.banNGWordMessage("", "", "").isEmpty() ) { + String m = Messages.banNGWordMessage(getColorCode(), getName(), player.getName()); + player.sendMessage(m); + sendMessage(null, m, null, true, "system"); + } + } + + } else if ( config.getNgwordAction() == NGWordAction.KICK ) { + // キックする + + if ( !isGlobalChannel() ) { + removeMember(player); + if ( !Messages.kickNGWordMessage("", "", "").isEmpty() ) { + String m = Messages.kickNGWordMessage(getColorCode(), getName(), player.getName()); + player.sendMessage(m); + sendMessage(null, m, null, true, "system"); + } + } + + } else if ( config.getNgwordAction() == NGWordAction.MUTE ) { + // Muteする + + getMuted().add(player); + save(); + if ( !Messages.muteNGWordMessage("", "", "").isEmpty() ) { + String m = Messages.muteNGWordMessage(getColorCode(), getName(), player.getName()); + player.sendMessage(m); + sendMessage(null, m, null, true, "system"); + } + } + } + } + + /** + * ほかの連携先などから、このチャットに発言する + * @param player プレイヤー名 + * @param source 連携元を判別する文字列 + * @param message メッセージ + */ + public void chatFromOtherSource(String player, String source, String message) { + + LunaChatConfig config = LunaChat.getConfig(); + + // 表示名 + String name; + if ( source != null && !source.isEmpty() ) { + name = player + "@" + source; + } else { + name = player; + } + + // 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 message メッセージ + * @param sendDynmap Dynmapにも表示するかどうか + * @param name 発言者の表示名 + */ + public void sendSystemMessage(String message, boolean sendDynmap, String name) { + sendMessage(null, message, null, sendDynmap, name); + } + + /** + * メンバーを追加する + * @param name 追加するプレイヤー + */ + public void addMember(ChannelMember player) { + + // 既に参加しているなら、何もしない + if ( members.contains(player) ) { + return; + } + + // 変更後のメンバーリストを作成 + ArrayList after = new ArrayList(members); + after.add(player); + + // LunaChatChannelMemberChangedEvent イベントコール + EventResult result = LunaChat.getEventSender().sendLunaChatChannelMemberChangedEvent(name, members, after); + if ( result.isCancelled() ) { + return; + } + + // メンバー更新 + if ( members.size() == 0 && moderator.size() == 0 ) { + moderator.add(player); + } + members = after; + + if ( !isPersonalChat() ) { + player.sendMessage(Messages.joinMessage(getColorCode(), getName(), player.getName())); + } + + save(); + } + + /** + * メンバーを削除する + * @param name 削除するプレイヤー + */ + public void removeMember(ChannelMember player) { + + // 既に削除しているなら、何もしない + if ( !members.contains(player) ) { + return; + } + + // 変更後のメンバーリストを作成 + ArrayList after = new ArrayList(members); + after.remove(player); + + // LunaChatChannelMemberChangedEvent イベントコール + EventResult result = LunaChat.getEventSender().sendLunaChatChannelMemberChangedEvent(name, members, after); + if ( result.isCancelled() ) { + return; + } + + // デフォルト発言先が退出するチャンネルと一致する場合、 + // デフォルト発言先を削除する + LunaChatAPI api = LunaChat.getAPI(); + Channel def = api.getDefaultChannel(player.getName()); + if ( def != null && def.getName().equals(getName()) ) { + api.removeDefaultChannel(player.getName()); + } + + // 実際にメンバーから削除する + members.remove(player); + + if ( !isPersonalChat() ) { + player.sendMessage(Messages.quitMessage(getColorCode(), getName(), player.getName())); + } + + // 0人で削除する設定がオンで、0人になったなら、チャンネルを削除する + LunaChatConfig config = LunaChat.getConfig(); + 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 追加するプレイヤー + */ + public void addModerator(ChannelMember player) { + + // 既にモデレータなら何もしない + if ( moderator.contains(player) ) { + return; + } + + // モデレータへ追加 + moderator.add(player); + + // メッセージ + if ( !isPersonalChat() ) { + player.sendMessage(Messages.addModeratorMessage(getColorCode(), getName(), player.getName())); + } + + save(); + } + + /** + * モデレータを削除する + * @param player 削除するプレイヤー + */ + public void removeModerator(ChannelMember player) { + + // 既にモデレータでないなら何もしない + if ( !moderator.contains(player) ) { + return; + } + + // モデレータから削除 + moderator.remove(player); + + // メッセージ + if ( !isPersonalChat() ) { + player.sendMessage(Messages.removeModeratorMessage(getColorCode(), getName(), player.getName())); + } + + save(); + } + + /** + * メッセージを表示します。指定したプレイヤーの発言として処理されます。 + * @param player プレイヤー(ワールドチャット、範囲チャットの場合は必須です) + * @param message メッセージ + * @param format フォーマット + * @param sendDynmap dynmapへ送信するかどうか + * @param displayName 発言者の表示名(APIに使用されます) + */ + protected abstract void sendMessage( + ChannelMember player, String message, String format, boolean sendDynmap, String displayName); + + /** + * チャットフォーマット内のキーワードを置き換えする + * @param format チャットフォーマット + * @param player プレイヤー + * @return 置き換え結果 + */ + protected abstract String replaceKeywords(String format, ChannelMember player); + + /** + * チャンネル情報を返す + * @param forModerator モデレータ向けの情報を含めるかどうか + * @return チャンネル情報 + */ + public List getInfo(boolean forModerator) { + + ArrayList info = new ArrayList(); + info.add(Messages.channelInfoFirstLine()); + + // チャンネル名、参加人数、総人数、チャンネル説明文 + info.add(Messages.listFormat(getName(), getOnlineNum(), getTotalNum(), getDescription())); + + // チャンネル別名 + String alias = getAlias(); + if ( alias != null && alias.length() > 0 ) { + info.add(Messages.channelInfoAlias() + alias); + } + + // 参加メンバー一覧 + if ( isGlobalChannel() ) { + info.add(Messages.channelInfoGlobal()); + } else if ( isBroadcastChannel() ) { + info.add(Messages.channelInfoBroadcast()); + } else { + // メンバーを、5人ごとに表示する + StringBuffer buf = new StringBuffer(); + buf.append(Messages.channelInfoPrefix()); + + for ( int i=0; i 0 ) { + if ( !forModerator ) { + info.add(Messages.channelInfoPassword()); + } else { + info.add(Messages.channelInfoPassword() + " " + getPassword()); + } + } + + // 範囲チャット、ワールドチャット + if ( isWorldRange() && getChatRange() > 0 ) { + info.add(Messages.channelInfoRangeChat(getChatRange())); + } else if ( isWorldRange() ) { + info.add(Messages.channelInfoWorldChat()); + } + + if ( forModerator ) { + + // フォーマット情報 + info.add(Messages.channelInfoFormat()); + info.add(Messages.channelInfoPrefix() + " " + ChatColor.WHITE + getFormat()); + + // Muteリスト情報、5人ごとに表示する + if ( getMuted().size() > 0 ) { + info.add(Messages.channelInfoMuted()); + + StringBuffer buf = new StringBuffer(); + buf.append(Messages.channelInfoPrefix() + ChatColor.WHITE); + for ( int i=0; i 0 ) { + info.add(Messages.channelInfoBanned()); + + StringBuffer buf = new StringBuffer(); + buf.append(Messages.channelInfoPrefix() + ChatColor.WHITE); + for ( int i=0; i getLog( + String player, String filter, String date, boolean reverse) { + + return logger.getLog(player, filter, date, reverse); + } + + /** + * チャンネルのオンライン人数を返す + * @return オンライン人数 + */ + public int getOnlineNum() { + + // オンラインになっているメンバーの人数を数える + int onlineNum = 0; + for ( ChannelMember player : members ) { + if ( player.isOnline() ) { + onlineNum++; + } + } + return onlineNum; + } + + /** + * チャンネルの総参加人数を返す + * @return 総参加人数 + */ + public int getTotalNum() { + return members.size(); + } + + /** + * シリアライズ
+ * ConfigurationSerializable互換のための実装。 + * @see org.bukkit.configuration.serialization.ConfigurationSerializable#serialize() + */ + 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 = null; + if ( LunaChat.getMode() == LunaChatMode.BUKKIT ) { + channel = new BukkitChannel(name); + } else if ( LunaChat.getMode() == LunaChatMode.BUNGEE ) { + channel = new BungeeChannel(name); + } + // TODO Standalone のチャンネル作成 + + 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 = castToChannelMemberList(data.get(KEY_MEMBERS)); + channel.banned = castToChannelMemberList(data.get(KEY_BANNED)); + channel.muted = castToChannelMemberList(data.get(KEY_MUTED)); + channel.hided = castToChannelMemberList(data.get(KEY_HIDED)); + channel.moderator = castToChannelMemberList(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 = castToChannelMemberLongMap(data.get(KEY_BAN_EXPIRES)); + channel.muteExpires = castToChannelMemberLongMap(data.get(KEY_MUTE_EXPIRES)); + channel.allowcc = castWithDefault(data.get(KEY_ALLOWCC), true); + channel.japanizeType = JapanizeType.fromID(data.get(KEY_JAPANIZE) + "", null); + return channel; + } + + /** + * チャンネルの別名を返す + * @return チャンネルの別名 + */ + public String getAlias() { + return alias; + } + + /** + * チャンネルの別名を設定する + * @param alias チャンネルの別名 + */ + public void setAlias(String alias) { + this.alias = alias; + } + + /** + * チャンネルの説明文を返す + * @return チャンネルの説明文 + */ + public String getDescription() { + return description; + } + + /** + * チャンネルの説明文を設定する + * @param description チャンネルの説明文 + */ + public void setDescription(String description) { + this.description = description; + } + + /** + * チャンネルのパスワードを返す + * @return チャンネルのパスワード + */ + public String getPassword() { + return password; + } + + /** + * チャンネルのパスワードを設定する + * @param password チャンネルのパスワード + */ + public void setPassword(String password) { + this.password = password; + } + + /** + * チャンネルの可視性を返す + * @return チャンネルの可視性 + */ + public boolean isVisible() { + return visible; + } + + /** + * チャンネルの可視性を設定する + * @param visible チャンネルの可視性 + */ + public void setVisible(boolean visible) { + this.visible = visible; + } + + /** + * チャンネルのメッセージフォーマットを返す + * @return チャンネルのメッセージフォーマット + */ + public String getFormat() { + return format; + } + + /** + * チャンネルのメッセージフォーマットを設定する + * @param format チャンネルのメッセージフォーマット + */ + public void setFormat(String format) { + this.format = format; + } + + /** + * チャンネルのメンバーを返す + * @return チャンネルのメンバー + */ + public List getMembers() { + return members; + } + + /** + * チャンネルのモデレーターを返す + * @return チャンネルのモデレーター + */ + public List getModerator() { + return moderator; + } + + /** + * チャンネルのBANリストを返す + * @return チャンネルのBANリスト + */ + public List getBanned() { + return banned; + } + + /** + * チャンネルのMuteリストを返す + * @return チャンネルのMuteリスト + */ + public List getMuted() { + return muted; + } + + /** + * 期限付きBANの期限マップを返す(key=プレイヤー名、value=期日(ミリ秒)) + * @return banExpires + */ + public Map getBanExpires() { + return banExpires; + } + + /** + * 期限付きMuteの期限マップを返す(key=プレイヤー名、value=期日(ミリ秒)) + * @return muteExpires + */ + public Map getMuteExpires() { + return muteExpires; + } + + /** + * 非表示プレイヤーの一覧を返す + * @return チャンネルの非表示プレイヤーの一覧 + */ + public List getHided() { + return hided; + } + + /** + * チャンネル名を返す + * @return チャンネル名 + */ + public String getName() { + return name; + } + + /** + * チャンネルのカラーコードを返す + * @return チャンネルのカラーコード + */ + public String getColorCode() { + return colorCode; + } + + /** + * チャンネルのカラーコードを設定する + * @param colorCode カラーコード + */ + public void setColorCode(String colorCode) { + this.colorCode = colorCode; + } + + /** + * ブロードキャストチャンネルを設定する + * @param broadcast ブロードキャストチャンネルにするかどうか + */ + public void setBroadcast(boolean broadcast) { + this.broadcastChannel = broadcast; + } + + /** + * チャットを同ワールド内に制限するかどうかを設定する + * @param isWorldRange 同ワールド制限するかどうか + */ + public void setWorldRange(boolean isWorldRange) { + this.isWorldRange = isWorldRange; + } + + /** + * チャットの可聴範囲を設定する + * @param range 可聴範囲 + */ + public void setChatRange(int range) { + this.chatRange = range; + } + + /** + * 1:1チャットのときに、会話の相手先を取得する + * @return 会話の相手のプレイヤー + */ + public ChannelMember getPrivateMessageTo() { + return privateMessageTo; + } + + /** + * 1:1チャットのときに、会話の相手先を設定する + * @param name 会話の相手のプレイヤー名 + */ + public void setPrivateMessageTo(ChannelMember to) { + this.privateMessageTo = to; + } + + /** + * ワールドチャットかどうか + * @return ワールドチャットかどうか + */ + public boolean isWorldRange() { + return isWorldRange; + } + + /** + * チャットの可聴範囲、0の場合は無制限 + * @return チャットの可聴範囲 + */ + public int getChatRange() { + return chatRange; + } + + /** + * カラーコードが使用可能な設定かどうか + * @return allowccを返す + */ + public boolean isAllowCC() { + return allowcc; + } + + /** + * カラーコードの使用可否を設定する + * @param allowcc 使用可否 + */ + public void setAllowCC(boolean allowcc) { + this.allowcc = allowcc; + } + + /** + * Japanize変換設定を取得する + * @return japanize + */ + public JapanizeType getJapanizeType() { + return japanizeType; + } + + /** + * Japanize変換設定を再設定する + * @param japanize japanize + */ + public void setJapanizeType(JapanizeType japanize) { + this.japanizeType = japanize; + } + + /** + * チャンネルの情報をファイルに保存する。 + * @return 保存をしたかどうか。 + */ + public boolean save() { + + // フォルダーの取得と、必要に応じて作成 + File folder = new File( + LunaChat.getDataFolder(), FOLDER_NAME_CHANNELS); + if ( !folder.exists() ) { + folder.mkdirs(); + } + + // 1:1チャットチャンネルの場合は、何もしない。 + if ( isPersonalChat() ) { + return false; + } + + File file = new File(folder, name + ".yml"); + + // ファイルへ保存する + YamlConfig conf = new YamlConfig(); + 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 削除したかどうか。 + */ + protected boolean remove() { + + // フォルダーの取得 + File folder = new File( + LunaChat.getDataFolder(), FOLDER_NAME_CHANNELS); + if ( !folder.exists() ) { + return false; + } + File file = new File(folder, name + ".yml"); + if ( !file.exists() ) { + return false; + } + + // ファイルを削除 + return file.delete(); + } + + /** + * チャンネルの情報を保存したファイルから全てのチャンネルを復元して返す。 + * @return 全てのチャンネル + */ + protected static HashMap loadAllChannels() { + + // フォルダーの取得 + File folder = new File( + LunaChat.getDataFolder(), FOLDER_NAME_CHANNELS); + if ( !folder.exists() ) { + return new HashMap(); + } + + 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 ) { + YamlConfig config = YamlConfig.load(file); + Map data = new HashMap(); + for ( String key : config.getKeys(false) ) { + data.put(key, config.get(key)); + } + Channel channel = deserialize(data); + result.put(channel.name.toLowerCase(), channel); + } + + return result; + } + + /** + * チャットフォーマット内のキーワードを置き換えする + * @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); + } + + /** + * List<ChannelMember>を、List<String>に変換する。 + * @param org 変換元 + * @return 変換後 + */ + private static List getStringList(List org) { + + List result = new ArrayList(); + for ( ChannelMember cp : org ) { + if ( cp != null ) result.add(cp.toString()); + } + return result; + } + + /** + * Map<ChannelMember, Long>を、Map<String, Long>に変換する。 + * @param org 変換元 + * @return 変換後 + */ + private static Map getStringLongMap(Map org) { + + HashMap result = new HashMap(); + for ( ChannelMember cp : org.keySet() ) { + if ( cp != null ) 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<ChannelMember>に変換する。nullなら空のリストを返す。 + * @param obj 変換元 + * @return 変換後 + */ + private static List castToChannelMemberList(Object obj) { + + List entries = castToStringList(obj); + ArrayList players = new ArrayList(); + + for ( String entry : entries ) { + players.add(ChannelMember.getChannelMember(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<ChannelMember, Long>に変換する。nullなら空のリストを返す。 + * @param obj 変換元 + * @return 変換後 + */ + private static Map castToChannelMemberLongMap(Object obj) { + + Map entries = castToStringLongMap(obj); + HashMap map = new HashMap(); + + for ( String key : entries.keySet() ) { + ChannelMember cp = ChannelMember.getChannelMember(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; + } +} diff --git a/src/main/java/com/github/ucchyocean/lc/channel/DelayedJapanizeChannelChatTask.java b/src/main/java/com/github/ucchyocean/lc3/channel/ChannelChatJapanizeTask.java similarity index 57% rename from src/main/java/com/github/ucchyocean/lc/channel/DelayedJapanizeChannelChatTask.java rename to src/main/java/com/github/ucchyocean/lc3/channel/ChannelChatJapanizeTask.java index 0eb0c0a4..c29c082e 100644 --- a/src/main/java/com/github/ucchyocean/lc/channel/DelayedJapanizeChannelChatTask.java +++ b/src/main/java/com/github/ucchyocean/lc3/channel/ChannelChatJapanizeTask.java @@ -1,22 +1,25 @@ /* * @author ucchy * @license LGPLv3 - * @copyright Copyright ucchy 2015 + * @copyright Copyright ucchy 2020 */ -package com.github.ucchyocean.lc.channel; +package com.github.ucchyocean.lc3.channel; -import com.github.ucchyocean.lc.japanize.JapanizeType; +import com.github.ucchyocean.lc3.japanize.JapanizeType; +import com.github.ucchyocean.lc3.member.ChannelMember; /** * Japanize2行表示のときに、変換結果を遅延してチャンネルに表示するためのタスク * @author ucchy */ -public class DelayedJapanizeChannelChatTask extends DelayedJapanizeConvertTask { +public class ChannelChatJapanizeTask implements Runnable { private Channel channel; - private ChannelPlayer player; + private ChannelMember player; private String lineFormat; + private JapanizeConvertTask task; + /** * コンストラクタ * @param org 変換前の文字列 @@ -26,9 +29,10 @@ public class DelayedJapanizeChannelChatTask extends DelayedJapanizeConvertTask { * @param japanizeFormat 変換後に発言するときの、発言フォーマット * @param lineFormat */ - public DelayedJapanizeChannelChatTask(String org, JapanizeType type, Channel channel, - ChannelPlayer player, String japanizeFormat, String lineFormat) { - super(org, type, channel, player, japanizeFormat); + public ChannelChatJapanizeTask(String org, JapanizeType type, Channel channel, + ChannelMember player, String japanizeFormat, String lineFormat) { + + task = new JapanizeConvertTask(org, type, japanizeFormat, channel, player); this.channel = channel; this.player = player; this.lineFormat = lineFormat; @@ -39,11 +43,10 @@ public DelayedJapanizeChannelChatTask(String org, JapanizeType type, Channel cha */ @Override public void run() { - if ( runSync() ) { + if ( task.runSync() ) { // チャンネルへ送信 String name = (player != null) ? player.getDisplayName() : ""; - channel.sendMessage(player, getResult(), lineFormat, true, name); + channel.sendMessage(player, task.getResult(), lineFormat, true, name); } } - } diff --git a/src/main/java/com/github/ucchyocean/lc/channel/ChannelManager.java b/src/main/java/com/github/ucchyocean/lc3/channel/ChannelManager.java similarity index 69% rename from src/main/java/com/github/ucchyocean/lc/channel/ChannelManager.java rename to src/main/java/com/github/ucchyocean/lc3/channel/ChannelManager.java index ad7b0b77..70016e31 100644 --- a/src/main/java/com/github/ucchyocean/lc/channel/ChannelManager.java +++ b/src/main/java/com/github/ucchyocean/lc3/channel/ChannelManager.java @@ -1,9 +1,9 @@ /* * @author ucchy * @license LGPLv3 - * @copyright Copyright ucchy 2013 + * @copyright Copyright ucchy 2020 */ -package com.github.ucchyocean.lc.channel; +package com.github.ucchyocean.lc3.channel; import java.io.File; import java.io.IOException; @@ -12,16 +12,14 @@ import java.util.HashMap; import java.util.List; -import org.bukkit.Bukkit; -import org.bukkit.command.CommandSender; -import org.bukkit.configuration.file.YamlConfiguration; - -import com.github.ucchyocean.lc.LunaChat; -import com.github.ucchyocean.lc.LunaChatAPI; -import com.github.ucchyocean.lc.Resources; -import com.github.ucchyocean.lc.event.LunaChatChannelCreateEvent; -import com.github.ucchyocean.lc.event.LunaChatChannelRemoveEvent; -import com.github.ucchyocean.lc.japanize.JapanizeType; +import com.github.ucchyocean.lc3.LunaChat; +import com.github.ucchyocean.lc3.LunaChatAPI; +import com.github.ucchyocean.lc3.LunaChatMode; +import com.github.ucchyocean.lc3.Messages; +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; /** * チャンネルマネージャー @@ -29,8 +27,6 @@ */ public class ChannelManager implements LunaChatAPI { - private static final String MSG_BREAKUP = Resources.get("breakupMessage"); - private static final String FILE_NAME_DCHANNELS = "defaults.yml"; private static final String FILE_NAME_TEMPLATES = "templates.yml"; private static final String FILE_NAME_JAPANIZE = "japanize.yml"; @@ -47,7 +43,7 @@ public class ChannelManager implements LunaChatAPI { private HashMap templates; private HashMap japanize; private HashMap dictionary; - private HashMap> hidelist; + private HashMap> hidelist; /** * コンストラクタ @@ -63,20 +59,13 @@ public ChannelManager() { public void reloadAllData() { // デフォルトチャンネル設定のロード - fileDefaults = new File( - LunaChat.getInstance().getDataFolder(), FILE_NAME_DCHANNELS); + fileDefaults = new File(LunaChat.getDataFolder(), FILE_NAME_DCHANNELS); if ( !fileDefaults.exists() ) { - YamlConfiguration conf = new YamlConfiguration(); - try { - conf.save(fileDefaults); - } catch (IOException e) { - e.printStackTrace(); - } + makeEmptyFile(fileDefaults); } - YamlConfiguration config = - YamlConfiguration.loadConfiguration(fileDefaults); + YamlConfig config = YamlConfig.load(fileDefaults); defaultChannels = new HashMap(); for ( String key : config.getKeys(false) ) { @@ -87,20 +76,13 @@ public void reloadAllData() { } // テンプレート設定のロード - fileTemplates = new File( - LunaChat.getInstance().getDataFolder(), FILE_NAME_TEMPLATES); + fileTemplates = new File(LunaChat.getDataFolder(), FILE_NAME_TEMPLATES); if ( !fileTemplates.exists() ) { - YamlConfiguration conf = new YamlConfiguration(); - try { - conf.save(fileTemplates); - } catch (IOException e) { - e.printStackTrace(); - } + makeEmptyFile(fileTemplates); } - YamlConfiguration configTemplates = - YamlConfiguration.loadConfiguration(fileTemplates); + YamlConfig configTemplates = YamlConfig.load(fileTemplates); templates = new HashMap(); for ( String key : configTemplates.getKeys(false) ) { @@ -108,20 +90,13 @@ public void reloadAllData() { } // Japanize設定のロード - fileJapanize = new File( - LunaChat.getInstance().getDataFolder(), FILE_NAME_JAPANIZE); + fileJapanize = new File(LunaChat.getDataFolder(), FILE_NAME_JAPANIZE); if ( !fileJapanize.exists() ) { - YamlConfiguration conf = new YamlConfiguration(); - try { - conf.save(fileJapanize); - } catch (IOException e) { - e.printStackTrace(); - } + makeEmptyFile(fileJapanize); } - YamlConfiguration configJapanize = - YamlConfiguration.loadConfiguration(fileJapanize); + YamlConfig configJapanize = YamlConfig.load(fileJapanize); japanize = new HashMap(); for ( String key : configJapanize.getKeys(false) ) { @@ -129,20 +104,13 @@ public void reloadAllData() { } // dictionaryのロード - fileDictionary = new File( - LunaChat.getInstance().getDataFolder(), FILE_NAME_DICTIONARY); + fileDictionary = new File(LunaChat.getDataFolder(), FILE_NAME_DICTIONARY); if ( !fileDictionary.exists() ) { - YamlConfiguration conf = new YamlConfiguration(); - try { - conf.save(fileDictionary); - } catch (IOException e) { - e.printStackTrace(); - } + makeEmptyFile(fileDictionary); } - YamlConfiguration configDictionary = - YamlConfiguration.loadConfiguration(fileDictionary); + YamlConfig configDictionary = YamlConfig.load(fileDictionary); dictionary = new HashMap(); for ( String key : configDictionary.getKeys(false) ) { @@ -150,26 +118,19 @@ public void reloadAllData() { } // hideリストのロード - fileHidelist = new File( - LunaChat.getInstance().getDataFolder(), FILE_NAME_HIDELIST); + fileHidelist = new File(LunaChat.getDataFolder(), FILE_NAME_HIDELIST); if ( !fileHidelist.exists() ) { - YamlConfiguration conf = new YamlConfiguration(); - try { - conf.save(fileHidelist); - } catch (IOException e) { - e.printStackTrace(); - } + makeEmptyFile(fileHidelist); } - YamlConfiguration configHidelist = - YamlConfiguration.loadConfiguration(fileHidelist); + YamlConfig configHidelist = YamlConfig.load(fileHidelist); - hidelist = new HashMap>(); + hidelist = new HashMap>(); for ( String key : configHidelist.getKeys(false) ) { - hidelist.put(key, new ArrayList()); + hidelist.put(key, new ArrayList()); for ( String id : configHidelist.getStringList(key) ) { - hidelist.get(key).add(ChannelPlayer.getChannelPlayer(id)); + hidelist.get(key).add(ChannelMember.getChannelMember(id)); } } @@ -196,7 +157,7 @@ protected void saveAllChannels() { private boolean saveDefaults() { try { - YamlConfiguration config = new YamlConfiguration(); + YamlConfig config = new YamlConfig(); for ( String key : defaultChannels.keySet() ) { config.set(key, defaultChannels.get(key)); } @@ -215,7 +176,7 @@ private boolean saveDefaults() { private boolean saveTemplates() { try { - YamlConfiguration config = new YamlConfiguration(); + YamlConfig config = new YamlConfig(); for ( String key : templates.keySet() ) { config.set(key, templates.get(key)); } @@ -234,7 +195,7 @@ private boolean saveTemplates() { private boolean saveJapanize() { try { - YamlConfiguration config = new YamlConfiguration(); + YamlConfig config = new YamlConfig(); for ( String key : japanize.keySet() ) { config.set(key, japanize.get(key)); } @@ -253,7 +214,7 @@ private boolean saveJapanize() { private boolean saveDictionary() { try { - YamlConfiguration config = new YamlConfiguration(); + YamlConfig config = new YamlConfig(); for ( String key : dictionary.keySet() ) { config.set(key, dictionary.get(key)); } @@ -272,7 +233,7 @@ private boolean saveDictionary() { private boolean saveHidelist() { try { - YamlConfiguration config = new YamlConfiguration(); + YamlConfig config = new YamlConfig(); for ( String key : hidelist.keySet() ) { config.set(key, getIdList(hidelist.get(key))); } @@ -309,7 +270,7 @@ public boolean isPlayerJapanize(String playerName) { * 指定したチャンネル名が存在するかどうかを返す * @param channelName チャンネル名 * @return 存在するかどうか - * @see com.github.ucchyocean.lc.LunaChatAPI#isExistChannel(java.lang.String) + * @see com.github.ucchyocean.lc3.LunaChatAPI#isExistChannel(java.lang.String) */ @Override public boolean isExistChannel(String channelName) { @@ -322,7 +283,7 @@ public boolean isExistChannel(String channelName) { /** * 全てのチャンネルを返す * @return 全てのチャンネル - * @see com.github.ucchyocean.lc.LunaChatAPI#getChannels() + * @see com.github.ucchyocean.lc3.LunaChatAPI#getChannels() */ @Override public Collection getChannels() { @@ -334,12 +295,12 @@ public Collection getChannels() { * プレイヤーが参加しているチャンネルを返す * @param playerName プレイヤー名 * @return チャンネル - * @see com.github.ucchyocean.lc.LunaChatAPI#getChannelsByPlayer(java.lang.String) + * @see com.github.ucchyocean.lc3.LunaChatAPI#getChannelsByPlayer(java.lang.String) */ @Override public Collection getChannelsByPlayer(String playerName) { - ChannelPlayer cp = ChannelPlayer.getChannelPlayer(playerName); + ChannelMember cp = ChannelMember.getChannelMember(playerName); Collection result = new ArrayList(); for ( String key : channels.keySet() ) { Channel channel = channels.get(key); @@ -355,7 +316,7 @@ public Collection getChannelsByPlayer(String playerName) { * プレイヤーが参加しているデフォルトのチャンネルを返す * @param playerName プレイヤー * @return チャンネル - * @see com.github.ucchyocean.lc.LunaChatAPI#getDefaultChannel(java.lang.String) + * @see com.github.ucchyocean.lc3.LunaChatAPI#getDefaultChannel(java.lang.String) */ @Override public Channel getDefaultChannel(String playerName) { @@ -372,7 +333,7 @@ public Channel getDefaultChannel(String playerName) { * プレイヤーのデフォルトチャンネルを設定する * @param playerName プレイヤー * @param channelName チャンネル名 - * @see com.github.ucchyocean.lc.LunaChatAPI#setDefaultChannel(java.lang.String, java.lang.String) + * @see com.github.ucchyocean.lc3.LunaChatAPI#setDefaultChannel(java.lang.String, java.lang.String) */ @Override public void setDefaultChannel(String playerName, String channelName) { @@ -387,7 +348,7 @@ public void setDefaultChannel(String playerName, String channelName) { /** * 指定した名前のプレイヤーに設定されている、デフォルトチャンネルを削除する * @param playerName プレイヤー名 - * @see com.github.ucchyocean.lc.LunaChatAPI#removeDefaultChannel(java.lang.String) + * @see com.github.ucchyocean.lc3.LunaChatAPI#removeDefaultChannel(java.lang.String) */ @Override public void removeDefaultChannel(String playerName) { @@ -401,7 +362,7 @@ public void removeDefaultChannel(String playerName) { * チャンネルを取得する * @param channelName チャンネル名、または、チャンネルの別名 * @return チャンネル - * @see com.github.ucchyocean.lc.LunaChatAPI#getChannel(java.lang.String) + * @see com.github.ucchyocean.lc3.LunaChatAPI#getChannel(java.lang.String) */ @Override public Channel getChannel(String channelName) { @@ -422,7 +383,7 @@ public Channel getChannel(String channelName) { * 新しいチャンネルを作成する * @param channelName チャンネル名 * @return 作成されたチャンネル - * @see com.github.ucchyocean.lc.LunaChatAPI#createChannel(java.lang.String) + * @see com.github.ucchyocean.lc3.LunaChatAPI#createChannel(java.lang.String) */ @Override public Channel createChannel(String channelName) { @@ -432,22 +393,28 @@ public Channel createChannel(String channelName) { /** * 新しいチャンネルを作成する * @param channelName チャンネル名 + * @param member チャンネルを作成した人 * @return 作成されたチャンネル - * @see com.github.ucchyocean.lc.LunaChatAPI#createChannel(java.lang.String, org.bukkit.command.CommandSender) + * @see com.github.ucchyocean.lc3.LunaChatAPI#createChannel(java.lang.String, com.github.ucchyocean.lc3.member.ChannelMember) */ @Override - public Channel createChannel(String channelName, CommandSender sender) { + public Channel createChannel(String channelName, ChannelMember member) { - // イベントコール - LunaChatChannelCreateEvent event = - new LunaChatChannelCreateEvent(channelName, sender); - Bukkit.getPluginManager().callEvent(event); - if ( event.isCancelled() ) { + // LunaChatChannelCreateEvent イベントコール + EventResult result = LunaChat.getEventSender().sendLunaChatChannelCreateEvent(channelName, member); + if ( result.isCancelled() ) { return null; } - String name = event.getChannelName(); + String name = result.getChannelName(); + + Channel channel = null; + if ( LunaChat.getMode() == LunaChatMode.BUKKIT ) { + channel = new BukkitChannel(name); + } else if ( LunaChat.getMode() == LunaChatMode.BUNGEE ) { + channel = new BungeeChannel(name); + } + // TODO Standalone のチャンネル作成 - Channel channel = new ChannelImpl(name); channels.put(name.toLowerCase(), channel); channel.save(); return channel; @@ -457,7 +424,7 @@ public Channel createChannel(String channelName, CommandSender sender) { * チャンネルを削除する * @param channelName 削除するチャンネル名 * @return 削除したかどうか - * @see com.github.ucchyocean.lc.LunaChatAPI#removeChannel(java.lang.String) + * @see com.github.ucchyocean.lc3.LunaChatAPI#removeChannel(java.lang.String) */ @Override public boolean removeChannel(String channelName) { @@ -467,31 +434,29 @@ public boolean removeChannel(String channelName) { /** * チャンネルを削除する * @param channelName 削除するチャンネル名 + * @param member チャンネルを削除した人 * @return 削除したかどうか - * @see com.github.ucchyocean.lc.LunaChatAPI#removeChannel(java.lang.String, org.bukkit.command.CommandSender) + * @see com.github.ucchyocean.lc3.LunaChatAPI#removeChannel(java.lang.String, com.github.ucchyocean.lc3.member.ChannelMember) */ @Override - public boolean removeChannel(String channelName, CommandSender sender) { + public boolean removeChannel(String channelName, ChannelMember member) { channelName = channelName.toLowerCase(); - // イベントコール - LunaChatChannelRemoveEvent event = - new LunaChatChannelRemoveEvent(channelName, sender); - Bukkit.getPluginManager().callEvent(event); - if ( event.isCancelled() ) { + // LunaChatChannelRemoveEvent イベントコール + EventResult result = LunaChat.getEventSender().sendLunaChatChannelRemoveEvent(channelName, member); + if ( result.isCancelled() ) { return false; } + channelName = result.getChannelName(); Channel channel = getChannel(channelName); if ( channel != null ) { // 強制解散のメッセージを、残ったメンバーに流す - if ( !channel.isPersonalChat() && !MSG_BREAKUP.equals("") ) { - String message = new String(MSG_BREAKUP); - message = message.replace("%ch", channel.getName()); - message = message.replace("%color", channel.getColorCode()); - for ( ChannelPlayer cp : channel.getMembers() ) { + String message = Messages.breakupMessage(channel.getColorCode(), channel.getName()); + if ( !channel.isPersonalChat() && !message.equals("") ) { + for ( ChannelMember cp : channel.getMembers() ) { cp.sendMessage(message); } } @@ -508,7 +473,7 @@ public boolean removeChannel(String channelName, CommandSender sender) { * テンプレートを取得する * @param id テンプレートID * @return テンプレート - * @see com.github.ucchyocean.lc.LunaChatAPI#getTemplate(java.lang.String) + * @see com.github.ucchyocean.lc3.LunaChatAPI#getTemplate(java.lang.String) */ @Override public String getTemplate(String id) { @@ -519,7 +484,7 @@ public String getTemplate(String id) { * テンプレートを登録する * @param id テンプレートID * @param template テンプレート - * @see com.github.ucchyocean.lc.LunaChatAPI#setTemplate(java.lang.String, java.lang.String) + * @see com.github.ucchyocean.lc3.LunaChatAPI#setTemplate(java.lang.String, java.lang.String) */ @Override public void setTemplate(String id, String template) { @@ -530,7 +495,7 @@ public void setTemplate(String id, String template) { /** * テンプレートを削除する * @param id テンプレートID - * @see com.github.ucchyocean.lc.LunaChatAPI#removeTemplate(java.lang.String) + * @see com.github.ucchyocean.lc3.LunaChatAPI#removeTemplate(java.lang.String) */ @Override public void removeTemplate(String id) { @@ -570,14 +535,14 @@ public void removeDictionary(String key) { * @param key プレイヤー * @return 指定されたプレイヤーをhideしているプレイヤー(非null) */ - public List getHidelist(ChannelPlayer key) { + public List getHidelist(ChannelMember key) { if ( key == null ) { - return new ArrayList(); + return new ArrayList(); } if ( hidelist.containsKey(key.toString()) ) { return hidelist.get(key.toString()); } - return new ArrayList(); + return new ArrayList(); } /** @@ -585,14 +550,14 @@ public List getHidelist(ChannelPlayer key) { * @param player プレイヤー * @return 指定したプレイヤーがhideしているプレイヤーのリスト(非null) */ - public ArrayList getHideinfo(ChannelPlayer player) { + public ArrayList getHideinfo(ChannelMember player) { if ( player == null ) { - return new ArrayList(); + return new ArrayList(); } - ArrayList info = new ArrayList(); + ArrayList info = new ArrayList(); for ( String key : hidelist.keySet() ) { if ( hidelist.get(key).contains(player) ) { - info.add(ChannelPlayer.getChannelPlayer(key)); + info.add(ChannelMember.getChannelMember(key)); } } return info; @@ -603,10 +568,10 @@ public ArrayList getHideinfo(ChannelPlayer player) { * @param player hideする側のプレイヤー * @param hided hideされる側のプレイヤー */ - public void addHidelist(ChannelPlayer player, ChannelPlayer hided) { + public void addHidelist(ChannelMember player, ChannelMember hided) { String hidedId = hided.toString(); if ( !hidelist.containsKey(hidedId) ) { - hidelist.put(hidedId, new ArrayList()); + hidelist.put(hidedId, new ArrayList()); } if ( !hidelist.get(hidedId).contains(player) ) { hidelist.get(hidedId).add(player); @@ -619,7 +584,7 @@ public void addHidelist(ChannelPlayer player, ChannelPlayer hided) { * @param player hideしていた側のプレイヤー * @param hided hideされていた側のプレイヤー */ - public void removeHidelist(ChannelPlayer player, ChannelPlayer hided) { + public void removeHidelist(ChannelMember player, ChannelMember hided) { String hidedId = hided.toString(); if ( !hidelist.containsKey(hidedId) ) { return; @@ -646,9 +611,8 @@ public String japanize(String message, JapanizeType type) { return message; } - // Japanize変換タスクを作成して、同期で実行する。 - DelayedJapanizeConvertTask task = new DelayedJapanizeConvertTask( - message, type, null, null, "%japanize"); + // Japanize変換 + JapanizeConvertTask task = new JapanizeConvertTask(message, type, "%japanize", null, null); if ( task.runSync() ) { return task.getResult(); } @@ -667,15 +631,34 @@ public void setPlayersJapanize(String playerName, boolean doJapanize) { } /** - * ChannelPlayerのリストを、IDのStringリストに変換して返す + * ChannelMemberのリストを、IDのStringリストに変換して返す * @param players * @return */ - private List getIdList(List players) { + private List getIdList(List players) { List results = new ArrayList(); - for ( ChannelPlayer cp : players ) { + for ( ChannelMember cp : players ) { results.add(cp.toString()); } return results; } + + /** + * 指定されたファイル出力先に、空のYamlファイルを作成する + * @param file 出力先 + */ + private void makeEmptyFile(File file) { +// try { +// file.createNewFile(); +// } catch (IOException e) { +// e.printStackTrace(); +// } + + YamlConfig config = new YamlConfig(); + try { + config.save(file); + } catch (IOException e) { + e.printStackTrace(); + } + } } diff --git a/src/main/java/com/github/ucchyocean/lc/channel/DelayedJapanizeConvertTask.java b/src/main/java/com/github/ucchyocean/lc3/channel/JapanizeConvertTask.java similarity index 75% rename from src/main/java/com/github/ucchyocean/lc/channel/DelayedJapanizeConvertTask.java rename to src/main/java/com/github/ucchyocean/lc3/channel/JapanizeConvertTask.java index 9d1c7f81..5dcd0119 100644 --- a/src/main/java/com/github/ucchyocean/lc/channel/DelayedJapanizeConvertTask.java +++ b/src/main/java/com/github/ucchyocean/lc3/channel/JapanizeConvertTask.java @@ -1,175 +1,168 @@ -/* - * @author ucchy - * @license LGPLv3 - * @copyright Copyright ucchy 2013 - */ -package com.github.ucchyocean.lc.channel; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitRunnable; - -import com.github.ucchyocean.lc.LunaChat; -import com.github.ucchyocean.lc.Utility; -import com.github.ucchyocean.lc.event.LunaChatPostJapanizeEvent; -import com.github.ucchyocean.lc.japanize.IMEConverter; -import com.github.ucchyocean.lc.japanize.JapanizeType; -import com.github.ucchyocean.lc.japanize.YukiKanaConverter; - -/** - * Japanize変換を実行して、実行後に発言を行うタスク - * @author ucchy - */ -public class DelayedJapanizeConvertTask extends BukkitRunnable { - - private static final String REGEX_URL = "https?://[\\w/:%#\\$&\\?\\(\\)~\\.=\\+\\-]+"; - - private String org; - private JapanizeType type; - private Channel channel; - private ChannelPlayer player; - private String format; - private String result; - - /** - * コンストラクタ - * @param org 変換前の文字列 - * @param type 変換タイプ - * @param channel 変換後に発言する、発言先チャンネル - * @param player 発言したプレイヤー - * @param japanizeFormat 変換後に発言するときの、発言フォーマット - */ - public DelayedJapanizeConvertTask(String org, JapanizeType type, Channel channel, - ChannelPlayer player, String japanizeFormat) { - this.org = org; - this.type = type; - this.channel = channel; - this.player = player; - this.format = japanizeFormat; - } - - @Override - public void run() { - runSync(); - } - - /** - * 同期処理で変換を行います。結果は getResult() で取得してください。 - * @return 処理を実行したかどうか(イベントでキャンセルされた場合はfalseになります) - */ - public boolean runSync() { - - // 変換対象外のキーワード - HashMap keywordMap = new HashMap(); - ArrayList keywords = new ArrayList(); - if ( LunaChat.getInstance().getLunaChatConfig().isJapanizeIgnorePlayerName() ) { - for ( Player player : Utility.getOnlinePlayers() ) { - keywords.add(player.getName()); - } - } - HashMap dictionary = - LunaChat.getInstance().getLunaChatAPI().getAllDictionary(); - - // カラーコード削除、URL削除 - String deletedURL = Utility.stripColor(org.replaceAll(REGEX_URL, " ")); - - // キーワードをロック - int index = 0; - String keywordLocked = deletedURL; - for ( String keyword : keywords ) { - if ( keywordLocked.contains(keyword) ) { - index++; - String key = "<" + makeMultibytesDigit(index) + ">"; - keywordLocked = keywordLocked.replace(keyword, key); - keywordMap.put(key, keyword); - } - } - for ( String dickey : dictionary.keySet() ) { - if ( keywordLocked.contains(dickey) ) { - index++; - String key = "<" + makeMultibytesDigit(index) + ">"; - keywordLocked = keywordLocked.replace(dickey, key); - keywordMap.put(key, dictionary.get(dickey)); - } - } - - // カナ変換 - String japanized = YukiKanaConverter.conv(keywordLocked); - - // IME変換 - if ( type == JapanizeType.GOOGLE_IME ) { - japanized = IMEConverter.convByGoogleIME(japanized); - } - - // キーワードのアンロック - for ( String key : keywordMap.keySet() ) { - japanized = japanized.replace(key, keywordMap.get(key)); - } - - // 変換後の文字列にNGワードが含まれている場合は、マスクする - for ( Pattern pattern : - LunaChat.getInstance().getLunaChatConfig().getNgwordCompiled() ) { - Matcher matcher = pattern.matcher(japanized); - if ( matcher.find() ) { - japanized = matcher.replaceAll( - Utility.getAstariskString(matcher.group(0).length())); - } - } - - // イベントコール - String channelName = (channel == null) ? "" : channel.getName(); - LunaChatPostJapanizeEvent event = - new LunaChatPostJapanizeEvent(channelName, player, org, japanized); - Bukkit.getPluginManager().callEvent(event); - if ( event.isCancelled() ) { - return false; - } - japanized = event.getJapanized(); - - // フォーマットする - result = format.replace("%msg", org); - result = result.replace("%japanize", japanized); - - return true; - } - - /** - * Japanize変換の結果を返します。 - * @return 変換結果 - */ - public String getResult() { - return result; - } - - /** - * 数値を、全角文字の文字列に変換して返す - * @param digit - * @return - */ - private String makeMultibytesDigit(int digit) { - - String half = Integer.toString(digit); - StringBuilder result = new StringBuilder(); - for ( int index=0; index < half.length(); index++ ) { - switch ( half.charAt(index) ) { - case '0' : result.append("0"); break; - case '1' : result.append("1"); break; - case '2' : result.append("2"); break; - case '3' : result.append("3"); break; - case '4' : result.append("4"); break; - case '5' : result.append("5"); break; - case '6' : result.append("6"); break; - case '7' : result.append("7"); break; - case '8' : result.append("8"); break; - case '9' : result.append("9"); break; - } - } - return result.toString(); - } -} - +/* + * @author ucchy + * @license LGPLv3 + * @copyright Copyright ucchy 2020 + */ +package com.github.ucchyocean.lc3.channel; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import com.github.ucchyocean.lc3.LunaChat; +import com.github.ucchyocean.lc3.Utility; +import com.github.ucchyocean.lc3.event.EventResult; +import com.github.ucchyocean.lc3.japanize.IMEConverter; +import com.github.ucchyocean.lc3.japanize.JapanizeType; +import com.github.ucchyocean.lc3.japanize.YukiKanaConverter; +import com.github.ucchyocean.lc3.member.ChannelMember; + +/** + * Japanize変換を実行して、実行後に発言を行うタスク + * @author ucchy + */ +public class JapanizeConvertTask { + + private static final String REGEX_URL = "https?://[\\w/:%#\\$&\\?\\(\\)~\\.=\\+\\-]+"; + + private String org; + private JapanizeType type; + private String format; + private Channel channel; + private ChannelMember player; + private String result; + + /** + * コンストラクタ + * @param org 変換前の文字列 + * @param type 変換タイプ + * @param japanizeFormat 変換後に発言するときの、発言フォーマット + * @param channel 変換後に発言する、発言先チャンネル + * @param player 発言したプレイヤー + */ + public JapanizeConvertTask(String org, JapanizeType type, String japanizeFormat, + Channel channel, ChannelMember player) { + this.org = org; + this.type = type; + this.format = japanizeFormat; + this.channel = channel; + this.player = player; + } + + public void run() { + runSync(); + } + + /** + * 同期処理で変換を行います。結果は getResult() で取得してください。 + * @return 処理を実行したかどうか(イベントでキャンセルされた場合はfalseになります) + */ + public boolean runSync() { + + // 変換対象外のキーワード + HashMap keywordMap = new HashMap(); + ArrayList keywords = new ArrayList(); + if ( LunaChat.getConfig().isJapanizeIgnorePlayerName() ) { + keywords.addAll(LunaChat.getPlugin().getOnlinePlayerNames()); + } + Map dictionary = + LunaChat.getAPI().getAllDictionary(); + + // カラーコード削除、URL削除 + String deletedURL = Utility.stripColorCode(org.replaceAll(REGEX_URL, " ")); + + // キーワードをロック + int index = 0; + String keywordLocked = deletedURL; + for ( String keyword : keywords ) { + if ( keywordLocked.contains(keyword) ) { + index++; + String key = "<" + makeMultibytesDigit(index) + ">"; + keywordLocked = keywordLocked.replace(keyword, key); + keywordMap.put(key, keyword); + } + } + for ( String dickey : dictionary.keySet() ) { + if ( keywordLocked.contains(dickey) ) { + index++; + String key = "<" + makeMultibytesDigit(index) + ">"; + keywordLocked = keywordLocked.replace(dickey, key); + keywordMap.put(key, dictionary.get(dickey)); + } + } + + // カナ変換 + String japanized = YukiKanaConverter.conv(keywordLocked); + + // IME変換 + if ( type == JapanizeType.GOOGLE_IME ) { + japanized = IMEConverter.convByGoogleIME(japanized); + } + + // キーワードのアンロック + for ( String key : keywordMap.keySet() ) { + japanized = japanized.replace(key, keywordMap.get(key)); + } + + // 変換後の文字列にNGワードが含まれている場合は、マスクする + for ( Pattern pattern : LunaChat.getConfig().getNgwordCompiled() ) { + Matcher matcher = pattern.matcher(japanized); + if ( matcher.find() ) { + japanized = matcher.replaceAll( + Utility.getAstariskString(matcher.group(0).length())); + } + } + + // LunaChatPostJapanizeEvent イベントコール + String channelName = (channel == null) ? "" : channel.getName(); + EventResult event = LunaChat.getEventSender().sendLunaChatPostJapanizeEvent( + channelName, player, org, japanized); + if ( event.isCancelled() ) { + return false; + } + japanized = event.getJapanized(); + + // フォーマットする + result = format.replace("%msg", org); + result = result.replace("%japanize", japanized); + + return true; + } + + /** + * Japanize変換の結果を返します。 + * @return 変換結果 + */ + public String getResult() { + return result; + } + + /** + * 数値を、全角文字の文字列に変換して返す + * @param digit + * @return + */ + private String makeMultibytesDigit(int digit) { + + String half = Integer.toString(digit); + StringBuilder result = new StringBuilder(); + for ( int index=0; index < half.length(); index++ ) { + switch ( half.charAt(index) ) { + case '0' : result.append("0"); break; + case '1' : result.append("1"); break; + case '2' : result.append("2"); break; + case '3' : result.append("3"); break; + case '4' : result.append("4"); break; + case '5' : result.append("5"); break; + case '6' : result.append("6"); break; + case '7' : result.append("7"); break; + case '8' : result.append("8"); break; + case '9' : result.append("9"); break; + } + } + return result.toString(); + } +} + diff --git a/src/main/java/com/github/ucchyocean/lc/command/AcceptCommand.java b/src/main/java/com/github/ucchyocean/lc3/command/AcceptCommand.java similarity index 50% rename from src/main/java/com/github/ucchyocean/lc/command/AcceptCommand.java rename to src/main/java/com/github/ucchyocean/lc3/command/AcceptCommand.java index 7b62d029..49bd498b 100644 --- a/src/main/java/com/github/ucchyocean/lc/command/AcceptCommand.java +++ b/src/main/java/com/github/ucchyocean/lc3/command/AcceptCommand.java @@ -1,30 +1,27 @@ /* * @author ucchy * @license LGPLv3 - * @copyright Copyright ucchy 2013 + * @copyright Copyright ucchy 2020 */ -package com.github.ucchyocean.lc.command; +package com.github.ucchyocean.lc3.command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import com.github.ucchyocean.lc.channel.Channel; -import com.github.ucchyocean.lc.channel.ChannelPlayer; +import com.github.ucchyocean.lc3.Messages; +import com.github.ucchyocean.lc3.channel.Channel; +import com.github.ucchyocean.lc3.member.ChannelMember; /** * acceptコマンドの実行クラス * @author ucchy */ -public class AcceptCommand extends SubCommandAbst { +public class AcceptCommand extends LunaChatSubCommand { private static final String COMMAND_NAME = "accept"; private static final String PERMISSION_NODE = "lunachat." + COMMAND_NAME; - private static final String USAGE_KEY = "usageAccept"; /** * コマンドを取得します。 * @return コマンド - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandName() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandName() */ @Override public String getCommandName() { @@ -34,7 +31,7 @@ public String getCommandName() { /** * パーミッションノードを取得します。 * @return パーミッションノード - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getPermissionNode() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getPermissionNode() */ @Override public String getPermissionNode() { @@ -44,7 +41,7 @@ public String getPermissionNode() { /** * コマンドの種別を取得します。 * @return コマンド種別 - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandType() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandType() */ @Override public CommandType getCommandType() { @@ -55,12 +52,12 @@ public CommandType getCommandType() { * 使用方法に関するメッセージをsenderに送信します。 * @param sender コマンド実行者 * @param label 実行ラベル - * @see com.github.ucchyocean.lc.command.SubCommandAbst#sendUsageMessage() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#sendUsageMessage() */ @Override public void sendUsageMessage( - CommandSender sender, String label) { - sendResourceMessage(sender, "", USAGE_KEY, label); + ChannelMember sender, String label) { + sender.sendMessage(Messages.usageAccept(label)); } /** @@ -69,50 +66,56 @@ public void sendUsageMessage( * @param label 実行ラベル * @param args 実行時の引数 * @return コマンドが実行されたかどうか - * @see com.github.ucchyocean.lc.command.SubCommandAbst#runCommand(java.lang.String[]) + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#runCommand(java.lang.String[]) */ @Override - public boolean runCommand(CommandSender sender, String label, String[] args) { + public boolean runCommand(ChannelMember sender, String label, String[] args) { - // プレイヤーでなければ終了する - if (!(sender instanceof Player)) { - sendResourceMessage(sender, PREERR, "errmsgIngame"); + // 招待を受けていないプレイヤーなら、エラーを表示して終了する + if (!DataMaps.inviteMap.containsKey(sender.getName())) { + sender.sendMessage(Messages.errmsgNotInvited()); return true; } - // 招待を受けていないプレイヤーなら、エラーを表示して終了する - Player player = (Player) sender; - if (!DataMaps.inviteMap.containsKey(player.getName())) { - sendResourceMessage(sender, PREERR, "errmsgNotInvited"); + // チャンネルを取得して、招待記録を消去する + String channelName = DataMaps.inviteMap.get(sender.getName()); + + // 取得できなかったらエラー終了する + if ( channelName == null ) { + sender.sendMessage(Messages.errmsgNotfoundChannel()); return true; } - // チャンネルを取得して、招待記録を消去する - String channelName = DataMaps.inviteMap.get(player.getName()); Channel channel = api.getChannel(channelName); - DataMaps.inviteMap.remove(player.getName()); - DataMaps.inviterMap.remove(player.getName()); // 取得できなかったらエラー終了する if (channel == null) { - sendResourceMessage(sender, PREERR, "errmsgNotfoundChannel"); + sender.sendMessage(Messages.errmsgNotfoundChannel()); return true; } + DataMaps.inviteMap.remove(sender.getName()); + DataMaps.inviterMap.remove(sender.getName()); + // 既に参加しているなら、エラーを表示して終了する - ChannelPlayer cp = ChannelPlayer.getChannelPlayer(player); - if (channel.getMembers().contains(cp)) { - sendResourceMessage(sender, PREERR, "errmsgInvitedAlreadyJoin"); + if (channel.getMembers().contains(sender)) { + sender.sendMessage(Messages.errmsgInvitedAlreadyJoin()); + return true; + } + + // BANされていないか確認する + if (channel.getBanned().contains(sender)) { + sender.sendMessage(Messages.errmsgBanned()); return true; } // 参加する - channel.addMember(cp); - sendResourceMessage(sender, PREINFO, "cmdmsgJoin", channel.getName()); + channel.addMember(sender); + sender.sendMessage(Messages.cmdmsgJoin(channel.getName())); // デフォルトの発言先に設定する - api.setDefaultChannel(player.getName(), channelName); - sendResourceMessage(sender, PREINFO, "cmdmsgSet", channelName); + api.setDefaultChannel(sender.getName(), channelName); + sender.sendMessage(Messages.cmdmsgSet(channel.getName())); return true; } diff --git a/src/main/java/com/github/ucchyocean/lc/command/BanCommand.java b/src/main/java/com/github/ucchyocean/lc3/command/BanCommand.java similarity index 59% rename from src/main/java/com/github/ucchyocean/lc/command/BanCommand.java rename to src/main/java/com/github/ucchyocean/lc3/command/BanCommand.java index c5b7ba01..aedd76b5 100644 --- a/src/main/java/com/github/ucchyocean/lc/command/BanCommand.java +++ b/src/main/java/com/github/ucchyocean/lc3/command/BanCommand.java @@ -1,176 +1,173 @@ -/* - * @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.Channel; -import com.github.ucchyocean.lc.channel.ChannelPlayer; - -/** - * banコマンドの実行クラス - * @author ucchy - */ -public class BanCommand extends SubCommandAbst { - - private static final String COMMAND_NAME = "ban"; - private static final String PERMISSION_NODE = "lunachat." + COMMAND_NAME; - private static final String USAGE_KEY1 = "usageBan"; - private static final String USAGE_KEY2 = "usageBan2"; - - /** - * コマンドを取得します。 - * @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.MODERATOR; - } - - /** - * 使用方法に関するメッセージを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) { - - // 実行引数から、BANするユーザーを取得する - String kickedName = ""; - if (args.length >= 2) { - kickedName = args[1]; - } else { - sendResourceMessage(sender, PREERR, "errmsgCommand"); - return true; - } - - // 対象チャンネルを取得、取得できない場合はエラー表示して終了する - Channel channel = null; - boolean isSpecifiedChannel = false; - if (args.length >= 3) { - channel = api.getChannel(args[2]); - isSpecifiedChannel = true; - } else if (sender instanceof Player) { - Player kicker = (Player) sender; - channel = api.getDefaultChannel(kicker.getName()); - } - if (channel == null) { - sendResourceMessage(sender, PREERR, "errmsgNoJoin"); - return true; - } - - // モデレーターかどうか確認する - if ( !channel.hasModeratorPermission(sender) ) { - sendResourceMessage(sender, PREERR, "errmsgNotModerator"); - return true; - } - - // グローバルチャンネルならBANできない - if ( channel.isGlobalChannel() ) { - sendResourceMessage(sender, PREERR, "errmsgCannotBANGlobal", channel.getName()); - return true; - } - - // BANされるプレイヤーがメンバーかどうかチェックする - ChannelPlayer kicked = ChannelPlayer.getChannelPlayer(kickedName); - if (!channel.getMembers().contains(kicked)) { - sendResourceMessage(sender, PREERR, "errmsgNomemberOther"); - return true; - } - - // 既にBANされているかどうかチェックする - if (channel.getBanned().contains(kicked)) { - sendResourceMessage(sender, PREERR, "errmsgAlreadyBanned"); - return true; - } - - // 期限付きBANの場合、期限の指定が正しいかどうかをチェックする - int expireMinutes = -1; - if (args.length >= 3 && !isSpecifiedChannel) { - if ( !args[2].matches("[0-9]+") ) { - sendResourceMessage(sender, PREERR, "errmsgInvalidBanExpireParameter"); - return true; - } - expireMinutes = Integer.parseInt(args[2]); - if ( expireMinutes < 1 || 43200 < expireMinutes ) { - sendResourceMessage(sender, PREERR, "errmsgInvalidBanExpireParameter"); - return true; - } - } - - // BAN実行 - channel.getBanned().add(kicked); - if ( expireMinutes != -1 ) { - long expire = System.currentTimeMillis() + expireMinutes * 60 * 1000; - channel.getBanExpires().put(kicked, expire); - } - channel.removeMember(kicked); - - // senderに通知メッセージを出す - if ( expireMinutes != -1 ) { - sendResourceMessage(sender, PREINFO, - "cmdmsgBanWithExpire", kickedName, channel.getName(), expireMinutes); - } else { - sendResourceMessage(sender, PREINFO, - "cmdmsgBan", kickedName, channel.getName()); - } - - // チャンネルに通知メッセージを出す - if ( expireMinutes != -1 ) { - sendResourceMessageWithKeyword(channel, - "banWithExpireMessage", kicked, expireMinutes); - } else { - sendResourceMessageWithKeyword(channel, "banMessage", kicked); - } - - // BANされた人に通知メッセージを出す - if ( kicked != null && kicked.isOnline() ) { - sendResourceMessage(kicked, PREINFO, - "cmdmsgBanned", channel.getName()); - } - - return true; - } -} +/* + * @author ucchy + * @license LGPLv3 + * @copyright Copyright ucchy 2020 + */ +package com.github.ucchyocean.lc3.command; + +import com.github.ucchyocean.lc3.Messages; +import com.github.ucchyocean.lc3.channel.Channel; +import com.github.ucchyocean.lc3.member.ChannelMember; + +/** + * banコマンドの実行クラス + * @author ucchy + */ +public class BanCommand extends LunaChatSubCommand { + + private static final String COMMAND_NAME = "ban"; + private static final String PERMISSION_NODE = "lunachat." + COMMAND_NAME; + + /** + * コマンドを取得します。 + * @return コマンド + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandName() + */ + @Override + public String getCommandName() { + return COMMAND_NAME; + } + + /** + * パーミッションノードを取得します。 + * @return パーミッションノード + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getPermissionNode() + */ + @Override + public String getPermissionNode() { + return PERMISSION_NODE; + } + + /** + * コマンドの種別を取得します。 + * @return コマンド種別 + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandType() + */ + @Override + public CommandType getCommandType() { + return CommandType.MODERATOR; + } + + /** + * 使用方法に関するメッセージをsenderに送信します。 + * @param sender コマンド実行者 + * @param label 実行ラベル + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#sendUsageMessage() + */ + @Override + public void sendUsageMessage( + ChannelMember sender, String label) { + sender.sendMessage(Messages.usageBan(label)); + sender.sendMessage(Messages.usageBan2(label)); + } + + /** + * コマンドを実行します。 + * @param sender コマンド実行者 + * @param label 実行ラベル + * @param args 実行時の引数 + * @return コマンドが実行されたかどうか + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#runCommand(java.lang.String[]) + */ + @Override + public boolean runCommand( + ChannelMember sender, String label, String[] args) { + + // 実行引数から、BANするユーザーを取得する + String kickedName = ""; + if (args.length >= 2) { + kickedName = args[1]; + } else { + sender.sendMessage(Messages.errmsgCommand()); + return true; + } + + // 対象チャンネルを取得、取得できない場合はエラー表示して終了する + Channel channel = null; + boolean isSpecifiedChannel = false; + if (args.length >= 3) { + channel = api.getChannel(args[2]); + isSpecifiedChannel = true; + } else { + channel = api.getDefaultChannel(sender.getName()); + } + if (channel == null) { + sender.sendMessage(Messages.errmsgNoJoin()); + return true; + } + + // モデレーターかどうか確認する + if ( !channel.hasModeratorPermission(sender) ) { + sender.sendMessage(Messages.errmsgNotModerator()); + return true; + } + + // グローバルチャンネルならBANできない + if ( channel.isGlobalChannel() ) { + sender.sendMessage(Messages.errmsgCannotBANGlobal(channel.getName())); + return true; + } + + // BANされるプレイヤーがメンバーかどうかチェックする + ChannelMember kicked = ChannelMember.getChannelMember(kickedName); + if (!channel.getMembers().contains(kicked)) { + sender.sendMessage(Messages.errmsgNomemberOther()); + return true; + } + + // 既にBANされているかどうかチェックする + if (channel.getBanned().contains(kicked)) { + sender.sendMessage(Messages.errmsgAlreadyBanned()); + return true; + } + + // 期限付きBANの場合、期限の指定が正しいかどうかをチェックする + int expireMinutes = -1; + if (args.length >= 3 && !isSpecifiedChannel) { + if ( !args[2].matches("[0-9]+") ) { + sender.sendMessage(Messages.errmsgInvalidBanExpireParameter()); + return true; + } + expireMinutes = Integer.parseInt(args[2]); + if ( expireMinutes < 1 || 43200 < expireMinutes ) { + sender.sendMessage(Messages.errmsgInvalidBanExpireParameter()); + return true; + } + } + + // BAN実行 + channel.getBanned().add(kicked); + if ( expireMinutes != -1 ) { + long expire = System.currentTimeMillis() + expireMinutes * 60 * 1000; + channel.getBanExpires().put(kicked, expire); + } + channel.removeMember(kicked); + + // senderに通知メッセージを出す + if ( expireMinutes != -1 ) { + sender.sendMessage(Messages.cmdmsgBanWithExpire( + kickedName, channel.getName(), expireMinutes)); + } else { + sender.sendMessage(Messages.cmdmsgBan( + kickedName, channel.getName())); + } + + // チャンネルに通知メッセージを出す + if ( expireMinutes != -1 ) { + channel.sendSystemMessage(Messages.banWithExpireMessage( + channel.getColorCode(), channel.getName(), kicked.getName(), expireMinutes), + true, "system"); + } else { + channel.sendSystemMessage(Messages.banMessage( + channel.getColorCode(), channel.getName(), kicked.getName()), + true, "system"); + } + + // BANされた人に通知メッセージを出す + if ( kicked != null && kicked.isOnline() ) { + kicked.sendMessage(Messages.cmdmsgBanned(channel.getName())); + } + + return true; + } +} diff --git a/src/main/java/com/github/ucchyocean/lc/command/CreateCommand.java b/src/main/java/com/github/ucchyocean/lc3/command/CreateCommand.java similarity index 63% rename from src/main/java/com/github/ucchyocean/lc/command/CreateCommand.java rename to src/main/java/com/github/ucchyocean/lc3/command/CreateCommand.java index b4ee96a0..14a9fe07 100644 --- a/src/main/java/com/github/ucchyocean/lc/command/CreateCommand.java +++ b/src/main/java/com/github/ucchyocean/lc3/command/CreateCommand.java @@ -1,28 +1,27 @@ /* * @author ucchy * @license LGPLv3 - * @copyright Copyright ucchy 2013 + * @copyright Copyright ucchy 2020 */ -package com.github.ucchyocean.lc.command; +package com.github.ucchyocean.lc3.command; -import org.bukkit.command.CommandSender; - -import com.github.ucchyocean.lc.channel.Channel; +import com.github.ucchyocean.lc3.Messages; +import com.github.ucchyocean.lc3.channel.Channel; +import com.github.ucchyocean.lc3.member.ChannelMember; /** * createコマンドの実行クラス * @author ucchy */ -public class CreateCommand extends SubCommandAbst { +public class CreateCommand extends LunaChatSubCommand { private static final String COMMAND_NAME = "create"; private static final String PERMISSION_NODE = "lunachat." + COMMAND_NAME; - private static final String USAGE_KEY = "usageCreate"; /** * コマンドを取得します。 * @return コマンド - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandName() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandName() */ @Override public String getCommandName() { @@ -32,7 +31,7 @@ public String getCommandName() { /** * パーミッションノードを取得します。 * @return パーミッションノード - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getPermissionNode() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getPermissionNode() */ @Override public String getPermissionNode() { @@ -42,7 +41,7 @@ public String getPermissionNode() { /** * コマンドの種別を取得します。 * @return コマンド種別 - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandType() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandType() */ @Override public CommandType getCommandType() { @@ -53,12 +52,12 @@ public CommandType getCommandType() { * 使用方法に関するメッセージをsenderに送信します。 * @param sender コマンド実行者 * @param label 実行ラベル - * @see com.github.ucchyocean.lc.command.SubCommandAbst#sendUsageMessage() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#sendUsageMessage() */ @Override public void sendUsageMessage( - CommandSender sender, String label) { - sendResourceMessage(sender, "", USAGE_KEY, label); + ChannelMember sender, String label) { + sender.sendMessage(Messages.usageCreate(label)); } /** @@ -67,11 +66,11 @@ public void sendUsageMessage( * @param label 実行ラベル * @param args 実行時の引数 * @return コマンドが実行されたかどうか - * @see com.github.ucchyocean.lc.command.SubCommandAbst#runCommand(java.lang.String[]) + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#runCommand(java.lang.String[]) */ @Override public boolean runCommand( - CommandSender sender, String label, String[] args) { + ChannelMember sender, String label, String[] args) { // 実行引数から、作成するチャンネルを取得する String name = ""; @@ -82,37 +81,34 @@ public boolean runCommand( desc = args[2]; } } else { - sendResourceMessage(sender, PREERR, "errmsgCommand"); + sender.sendMessage(Messages.errmsgCommand()); return true; } // チャンネルが存在するかどうかをチェックする Channel other = api.getChannel(name); if ( other != null ) { - sendResourceMessage(sender, PREERR, "errmsgExist"); + sender.sendMessage(Messages.errmsgExist()); return true; } // 使用可能なチャンネル名かどうかをチェックする if ( !name.matches("[0-9a-zA-Z\\-_]+") ) { - sendResourceMessage(sender, PREERR, - "errmsgCannotUseForChannel", name); + sender.sendMessage(Messages.errmsgCannotUseForChannel(name)); return true; } // 最低文字列長を上回っているかをチェックする if ( name.length() < config.getMinChannelNameLength() ) { - sendResourceMessage(sender, PREERR, - "errmsgCannotUseForChannelTooShort", - name, config.getMinChannelNameLength()); + sender.sendMessage(Messages.errmsgCannotUseForChannelTooShort( + name, config.getMinChannelNameLength())); return true; } // 最大文字列長を下回っているかをチェックする if ( name.length() > config.getMaxChannelNameLength() ) { - sendResourceMessage(sender, PREERR, - "errmsgCannotUseForChannelTooLong", - name, config.getMaxChannelNameLength()); + sender.sendMessage(Messages.errmsgCannotUseForChannelTooLong( + name, config.getMaxChannelNameLength())); return true; } @@ -121,7 +117,7 @@ public boolean runCommand( if ( channel != null ) { channel.setDescription(desc); channel.save(); - sendResourceMessage(sender, PREINFO, "cmdmsgCreate", name); + sender.sendMessage(Messages.cmdmsgCreate(name)); } return true; } diff --git a/src/main/java/com/github/ucchyocean/lc/command/DataMaps.java b/src/main/java/com/github/ucchyocean/lc3/command/DataMaps.java similarity index 90% rename from src/main/java/com/github/ucchyocean/lc/command/DataMaps.java rename to src/main/java/com/github/ucchyocean/lc3/command/DataMaps.java index 26ae4f0a..97f531e5 100644 --- a/src/main/java/com/github/ucchyocean/lc/command/DataMaps.java +++ b/src/main/java/com/github/ucchyocean/lc3/command/DataMaps.java @@ -1,9 +1,9 @@ /* * @author ucchy * @license LGPLv3 - * @copyright Copyright ucchy 2013 + * @copyright Copyright ucchy 2020 */ -package com.github.ucchyocean.lc.command; +package com.github.ucchyocean.lc3.command; import java.util.HashMap; diff --git a/src/main/java/com/github/ucchyocean/lc3/command/DenyCommand.java b/src/main/java/com/github/ucchyocean/lc3/command/DenyCommand.java new file mode 100644 index 00000000..fa315596 --- /dev/null +++ b/src/main/java/com/github/ucchyocean/lc3/command/DenyCommand.java @@ -0,0 +1,93 @@ +/* + * @author ucchy + * @license LGPLv3 + * @copyright Copyright ucchy 2020 + */ +package com.github.ucchyocean.lc3.command; + +import com.github.ucchyocean.lc3.Messages; +import com.github.ucchyocean.lc3.member.ChannelMember; + +/** + * denyコマンドの実行クラス + * @author ucchy + */ +public class DenyCommand extends LunaChatSubCommand { + + private static final String COMMAND_NAME = "deny"; + private static final String PERMISSION_NODE = "lunachat." + COMMAND_NAME; + + /** + * コマンドを取得します。 + * @return コマンド + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandName() + */ + @Override + public String getCommandName() { + return COMMAND_NAME; + } + + /** + * パーミッションノードを取得します。 + * @return パーミッションノード + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getPermissionNode() + */ + @Override + public String getPermissionNode() { + return PERMISSION_NODE; + } + + /** + * コマンドの種別を取得します。 + * @return コマンド種別 + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandType() + */ + @Override + public CommandType getCommandType() { + return CommandType.USER; + } + + /** + * 使用方法に関するメッセージをsenderに送信します。 + * @param sender コマンド実行者 + * @param label 実行ラベル + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#sendUsageMessage() + */ + @Override + public void sendUsageMessage( + ChannelMember sender, String label) { + sender.sendMessage(Messages.usageDeny(label)); + } + + /** + * コマンドを実行します。 + * @param sender コマンド実行者 + * @param label 実行ラベル + * @param args 実行時の引数 + * @return コマンドが実行されたかどうか + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#runCommand(java.lang.String[]) + */ + @Override + public boolean runCommand(ChannelMember sender, String label, String[] args) { + + // 招待を受けていないプレイヤーなら、エラーを表示して終了する + if (!DataMaps.inviteMap.containsKey(sender.getName())) { + sender.sendMessage(Messages.errmsgNotInvited()); + return true; + } + + // 招待者を取得して、招待記録を消去する + String inviterName = DataMaps.inviterMap.get(sender.getName()); + DataMaps.inviteMap.remove(sender.getName()); + DataMaps.inviterMap.remove(sender.getName()); + + // メッセージ送信 + sender.sendMessage(Messages.cmdmsgDeny()); + ChannelMember inviter = ChannelMember.getChannelMember(inviterName); + if (inviter != null && inviter.isOnline()) { + inviter.sendMessage(Messages.cmdmsgDenyed()); + } + return true; + } + +} diff --git a/src/main/java/com/github/ucchyocean/lc/command/DicCommand.java b/src/main/java/com/github/ucchyocean/lc3/command/DicCommand.java similarity index 58% rename from src/main/java/com/github/ucchyocean/lc/command/DicCommand.java rename to src/main/java/com/github/ucchyocean/lc3/command/DicCommand.java index 6cdcbb12..f0abb4ee 100644 --- a/src/main/java/com/github/ucchyocean/lc/command/DicCommand.java +++ b/src/main/java/com/github/ucchyocean/lc3/command/DicCommand.java @@ -1,11 +1,12 @@ /* * @author ucchy * @license LGPLv3 - * @copyright Copyright ucchy 2014 + * @copyright Copyright ucchy 2020 */ -package com.github.ucchyocean.lc.command; +package com.github.ucchyocean.lc3.command; -import org.bukkit.command.CommandSender; +import com.github.ucchyocean.lc3.Messages; +import com.github.ucchyocean.lc3.member.ChannelMember; /** * dictionaryコマンドのエイリアス実行クラス、名前のみが異なるが、他は全て一緒。 @@ -14,12 +15,11 @@ public class DicCommand extends DictionaryCommand { private static final String COMMAND_NAME = "dic"; - private static final String USAGE_KEY = "usageDic"; /** * コマンドを取得します。 * @return コマンド - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandName() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandName() */ @Override public String getCommandName() { @@ -30,11 +30,11 @@ public String getCommandName() { * 使用方法に関するメッセージをsenderに送信します。 * @param sender コマンド実行者 * @param label 実行ラベル - * @see com.github.ucchyocean.lc.command.SubCommandAbst#sendUsageMessage() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#sendUsageMessage() */ @Override public void sendUsageMessage( - CommandSender sender, String label) { - sendResourceMessage(sender, "", USAGE_KEY, label); + ChannelMember sender, String label) { + sender.sendMessage(Messages.usageDic(label)); } } diff --git a/src/main/java/com/github/ucchyocean/lc/command/DictionaryCommand.java b/src/main/java/com/github/ucchyocean/lc3/command/DictionaryCommand.java similarity index 65% rename from src/main/java/com/github/ucchyocean/lc/command/DictionaryCommand.java rename to src/main/java/com/github/ucchyocean/lc3/command/DictionaryCommand.java index 171caf91..75f409da 100644 --- a/src/main/java/com/github/ucchyocean/lc/command/DictionaryCommand.java +++ b/src/main/java/com/github/ucchyocean/lc3/command/DictionaryCommand.java @@ -1,29 +1,29 @@ /* * @author ucchy * @license LGPLv3 - * @copyright Copyright ucchy 2014 + * @copyright Copyright ucchy 2020 */ -package com.github.ucchyocean.lc.command; +package com.github.ucchyocean.lc3.command; -import java.util.HashMap; +import java.util.Map; -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; +import com.github.ucchyocean.lc3.ChatColor; +import com.github.ucchyocean.lc3.Messages; +import com.github.ucchyocean.lc3.member.ChannelMember; /** * dictionaryコマンドの実行クラス * @author ucchy */ -public class DictionaryCommand extends SubCommandAbst { +public class DictionaryCommand extends LunaChatSubCommand { private static final String COMMAND_NAME = "dictionary"; private static final String PERMISSION_NODE = "lunachat-admin." + COMMAND_NAME; - private static final String USAGE_KEY = "usageDictionary"; /** * コマンドを取得します。 * @return コマンド - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandName() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandName() */ @Override public String getCommandName() { @@ -33,7 +33,7 @@ public String getCommandName() { /** * パーミッションノードを取得します。 * @return パーミッションノード - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getPermissionNode() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getPermissionNode() */ @Override public String getPermissionNode() { @@ -43,7 +43,7 @@ public String getPermissionNode() { /** * コマンドの種別を取得します。 * @return コマンド種別 - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandType() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandType() */ @Override public CommandType getCommandType() { @@ -54,12 +54,12 @@ public CommandType getCommandType() { * 使用方法に関するメッセージをsenderに送信します。 * @param sender コマンド実行者 * @param label 実行ラベル - * @see com.github.ucchyocean.lc.command.SubCommandAbst#sendUsageMessage() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#sendUsageMessage() */ @Override public void sendUsageMessage( - CommandSender sender, String label) { - sendResourceMessage(sender, "", USAGE_KEY, label); + ChannelMember sender, String label) { + sender.sendMessage(Messages.usageDictionary(label)); } /** @@ -68,15 +68,15 @@ public void sendUsageMessage( * @param label 実行ラベル * @param args 実行時の引数 * @return コマンドが実行されたかどうか - * @see com.github.ucchyocean.lc.command.SubCommandAbst#runCommand(java.lang.String[]) + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#runCommand(java.lang.String[]) */ @Override - public boolean runCommand(CommandSender sender, String label, String[] args) { + public boolean runCommand(ChannelMember sender, String label, String[] args) { // 引数チェック // このコマンドは、コンソールでも実行できる if ( args.length <= 1 ) { - sendResourceMessage(sender, PREERR, "errmsgCommand"); + sender.sendMessage(Messages.errmsgCommand()); sendUsageMessage(sender, label); return true; } @@ -84,7 +84,7 @@ public boolean runCommand(CommandSender sender, String label, String[] args) { if ( !args[1].equalsIgnoreCase("add") && !args[1].equalsIgnoreCase("remove") && !args[1].equalsIgnoreCase("view") ) { - sendResourceMessage(sender, PREERR, "errmsgCommand"); + sender.sendMessage(Messages.errmsgCommand()); sendUsageMessage(sender, label); return true; } @@ -93,7 +93,7 @@ public boolean runCommand(CommandSender sender, String label, String[] args) { // addの場合は、さらに2つ引数が必要 if ( args.length <= 3 ) { - sendResourceMessage(sender, PREERR, "errmsgCommand"); + sender.sendMessage(Messages.errmsgCommand()); sendUsageMessage(sender, label); return true; } @@ -102,14 +102,14 @@ public boolean runCommand(CommandSender sender, String label, String[] args) { String value = args[3]; api.setDictionary(key, value); - sendResourceMessage(sender, PREINFO, "cmdmsgDictionaryAdd", key, value); + sender.sendMessage(Messages.cmdmsgDictionaryAdd(key, value)); return true; } else if ( args[1].equalsIgnoreCase("remove") ) { // removeの場合は、さらに1つ引数が必要 if ( args.length <= 2 ) { - sendResourceMessage(sender, PREERR, "errmsgCommand"); + sender.sendMessage(Messages.errmsgCommand()); sendUsageMessage(sender, label); return true; } @@ -117,12 +117,12 @@ public boolean runCommand(CommandSender sender, String label, String[] args) { String key = args[2]; api.removeDictionary(key); - sendResourceMessage(sender, PREINFO, "cmdmsgDictionaryRemove", key); + sender.sendMessage(Messages.cmdmsgDictionaryRemove(key)); return true; } else if ( args[1].equalsIgnoreCase("view") ) { - HashMap dic = api.getAllDictionary(); + Map dic = api.getAllDictionary(); for ( String key : dic.keySet() ) { String value = dic.get(key); sender.sendMessage(key + ChatColor.GRAY + " -> " + ChatColor.WHITE + value); diff --git a/src/main/java/com/github/ucchyocean/lc/command/FormatCommand.java b/src/main/java/com/github/ucchyocean/lc3/command/FormatCommand.java similarity index 64% rename from src/main/java/com/github/ucchyocean/lc/command/FormatCommand.java rename to src/main/java/com/github/ucchyocean/lc3/command/FormatCommand.java index 0ce10e6b..d87b01bc 100644 --- a/src/main/java/com/github/ucchyocean/lc/command/FormatCommand.java +++ b/src/main/java/com/github/ucchyocean/lc3/command/FormatCommand.java @@ -1,31 +1,29 @@ /* * @author ucchy * @license LGPLv3 - * @copyright Copyright ucchy 2013 + * @copyright Copyright ucchy 2020 */ -package com.github.ucchyocean.lc.command; +package com.github.ucchyocean.lc3.command; import java.util.List; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import com.github.ucchyocean.lc.channel.Channel; +import com.github.ucchyocean.lc3.Messages; +import com.github.ucchyocean.lc3.channel.Channel; +import com.github.ucchyocean.lc3.member.ChannelMember; /** * formatコマンドの実行クラス * @author ucchy */ -public class FormatCommand extends SubCommandAbst { +public class FormatCommand extends LunaChatSubCommand { private static final String COMMAND_NAME = "format"; private static final String PERMISSION_NODE = "lunachat." + COMMAND_NAME; - private static final String USAGE_KEY = "usageFormat"; /** * コマンドを取得します。 * @return コマンド - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandName() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandName() */ @Override public String getCommandName() { @@ -35,7 +33,7 @@ public String getCommandName() { /** * パーミッションノードを取得します。 * @return パーミッションノード - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getPermissionNode() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getPermissionNode() */ @Override public String getPermissionNode() { @@ -45,7 +43,7 @@ public String getPermissionNode() { /** * コマンドの種別を取得します。 * @return コマンド種別 - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandType() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandType() */ @Override public CommandType getCommandType() { @@ -56,12 +54,12 @@ public CommandType getCommandType() { * 使用方法に関するメッセージをsenderに送信します。 * @param sender コマンド実行者 * @param label 実行ラベル - * @see com.github.ucchyocean.lc.command.SubCommandAbst#sendUsageMessage() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#sendUsageMessage() */ @Override public void sendUsageMessage( - CommandSender sender, String label) { - sendResourceMessage(sender, "", USAGE_KEY, label); + ChannelMember sender, String label) { + sender.sendMessage(Messages.usageFormat(label)); } /** @@ -70,23 +68,18 @@ public void sendUsageMessage( * @param label 実行ラベル * @param args 実行時の引数 * @return コマンドが実行されたかどうか - * @see com.github.ucchyocean.lc.command.SubCommandAbst#runCommand(java.lang.String[]) + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#runCommand(java.lang.String[]) */ @Override public boolean runCommand( - CommandSender sender, String label, String[] args) { - - Player player = null; - if (sender instanceof Player) { - player = (Player) sender; - } + ChannelMember sender, String label, String[] args) { // 引数チェック - // このコマンドは、コンソールでも実行できるが、その場合はチャンネル名を指定する必要がある + // このコマンドは、デフォルトチャンネルでない人も実行できるが、その場合はチャンネル名を指定する必要がある String format = ""; String cname = null; - if ( player != null && args.length >= 2 ) { - Channel def = api.getDefaultChannel(player.getName()); + if ( args.length >= 2 ) { + Channel def = api.getDefaultChannel(sender.getName()); if ( def != null ) { cname = def.getName(); } @@ -99,7 +92,7 @@ public boolean runCommand( format = format + args[i] + " "; } } else { - sendResourceMessage(sender, PREERR, "errmsgCommand"); + sender.sendMessage(Messages.errmsgCommand()); return true; } format = format.trim(); @@ -107,13 +100,13 @@ public boolean runCommand( // チャンネルが存在するかどうかをチェックする Channel channel = api.getChannel(cname); if ( channel == null ) { - sendResourceMessage(sender, PREERR, "errmsgNotExist"); + sender.sendMessage(Messages.errmsgNotExist()); return true; } // モデレーターかどうか確認する if ( !channel.hasModeratorPermission(sender) ) { - sendResourceMessage(sender, PREERR, "errmsgNotModerator"); + sender.sendMessage(Messages.errmsgNotModerator()); return true; } @@ -129,14 +122,14 @@ public boolean runCommand( } for ( String constraint : constraints ) { if ( !tempFormat.contains(constraint) ) { - sendResourceMessage(sender, PREERR, "errmsgFormatConstraint", constraint); + sender.sendMessage(Messages.errmsgFormatConstraint(constraint)); return true; } } // フォーマットの設定 channel.setFormat(format); - sendResourceMessage(sender, PREINFO, "cmdmsgFormat", format); + sender.sendMessage(Messages.cmdmsgFormat(format)); channel.save(); return true; } diff --git a/src/main/java/com/github/ucchyocean/lc/command/HelpCommand.java b/src/main/java/com/github/ucchyocean/lc3/command/HelpCommand.java similarity index 70% rename from src/main/java/com/github/ucchyocean/lc/command/HelpCommand.java rename to src/main/java/com/github/ucchyocean/lc3/command/HelpCommand.java index 066633a9..58533d20 100644 --- a/src/main/java/com/github/ucchyocean/lc/command/HelpCommand.java +++ b/src/main/java/com/github/ucchyocean/lc3/command/HelpCommand.java @@ -1,41 +1,41 @@ /* * @author ucchy * @license LGPLv3 - * @copyright Copyright ucchy 2013 + * @copyright Copyright ucchy 2020 */ -package com.github.ucchyocean.lc.command; +package com.github.ucchyocean.lc3.command; import java.util.ArrayList; -import org.bukkit.command.CommandSender; +import com.github.ucchyocean.lc3.Messages; +import com.github.ucchyocean.lc3.member.ChannelMember; /** * helpコマンドの実行クラス * @author ucchy */ -public class HelpCommand extends SubCommandAbst { +public class HelpCommand extends LunaChatSubCommand { private static final String COMMAND_NAME = "help"; private static final String PERMISSION_NODE = "lunachat." + COMMAND_NAME; - private static final String USAGE_KEY = "usageHelp"; // 1ページに表示するコマンドヘルプの項目数 private static final int PAGE_ITEM_NUM = 6; - private ArrayList commands; + private ArrayList commands; /** * コンストラクタ * @param commands */ - public HelpCommand(ArrayList commands) { + public HelpCommand(ArrayList commands) { this.commands = commands; } /** * コマンドを取得します。 * @return コマンド - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandName() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandName() */ @Override public String getCommandName() { @@ -45,7 +45,7 @@ public String getCommandName() { /** * パーミッションノードを取得します。 * @return パーミッションノード - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getPermissionNode() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getPermissionNode() */ @Override public String getPermissionNode() { @@ -55,7 +55,7 @@ public String getPermissionNode() { /** * コマンドの種別を取得します。 * @return コマンド種別 - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandType() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandType() */ @Override public CommandType getCommandType() { @@ -66,12 +66,12 @@ public CommandType getCommandType() { * 使用方法に関するメッセージをsenderに送信します。 * @param sender コマンド実行者 * @param label 実行ラベル - * @see com.github.ucchyocean.lc.command.SubCommandAbst#sendUsageMessage() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#sendUsageMessage() */ @Override public void sendUsageMessage( - CommandSender sender, String label) { - sendResourceMessage(sender, "", USAGE_KEY, label); + ChannelMember sender, String label) { + sender.sendMessage(Messages.usageHelp(label)); } /** @@ -80,10 +80,10 @@ public void sendUsageMessage( * @param label 実行ラベル * @param args 実行時の引数 * @return コマンドが実行されたかどうか - * @see com.github.ucchyocean.lc.command.SubCommandAbst#runCommand(java.lang.String[]) + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#runCommand(java.lang.String[]) */ @Override - public boolean runCommand(CommandSender sender, String label, String[] args) { + public boolean runCommand(ChannelMember sender, String label, String[] args) { CommandType type = CommandType.USER; int page = 1; @@ -114,7 +114,7 @@ public boolean runCommand(CommandSender sender, String label, String[] args) { * @param type コマンド種別 * @param page ページ */ - private void printUsage(CommandSender sender, String label, + private void printUsage(ChannelMember sender, String label, CommandType type, int page) { String typeDesc; @@ -133,8 +133,8 @@ private void printUsage(CommandSender sender, String label, } // 種別に該当するコマンドを取得 - ArrayList com = new ArrayList(); - for ( SubCommandAbst c : commands ) { + ArrayList com = new ArrayList(); + for ( LunaChatSubCommand c : commands ) { if ( c.getCommandType() == type && sender.hasPermission(c.getPermissionNode()) ) { com.add(c); @@ -144,17 +144,17 @@ private void printUsage(CommandSender sender, String label, int lastPage = ( (com.size() - 1) / PAGE_ITEM_NUM) + 1; // 表示処理 - sendResourceMessage(sender, "", "usageTop", typeDesc, page, lastPage); + sender.sendMessage(Messages.usageTop(typeDesc, page, lastPage)); for (int index=(page-1)*PAGE_ITEM_NUM; index= com.size() ) break; com.get(index).sendUsageMessage(sender, label); } - sendResourceMessage(sender, "", "usageFoot"); + sender.sendMessage(Messages.usageFoot()); if ( page < lastPage ) { if ( type != CommandType.USER ) { - sendResourceMessage(sender, "", "usageNoticeNextPage", typeDesc, (page + 1)); + sender.sendMessage(Messages.usageNoticeNextPage(label, typeDesc, (page + 1))); } else { - sendResourceMessage(sender, "", "usageNoticeNextPage", "", (page + 1)); + sender.sendMessage(Messages.usageNoticeNextPage(label, "", (page + 1))); } } } diff --git a/src/main/java/com/github/ucchyocean/lc/command/HideCommand.java b/src/main/java/com/github/ucchyocean/lc3/command/HideCommand.java similarity index 57% rename from src/main/java/com/github/ucchyocean/lc/command/HideCommand.java rename to src/main/java/com/github/ucchyocean/lc3/command/HideCommand.java index c7b47c88..bf3f8abd 100644 --- a/src/main/java/com/github/ucchyocean/lc/command/HideCommand.java +++ b/src/main/java/com/github/ucchyocean/lc3/command/HideCommand.java @@ -1,42 +1,30 @@ /* * @author ucchy * @license LGPLv3 - * @copyright Copyright ucchy 2013 + * @copyright Copyright ucchy 2020 */ -package com.github.ucchyocean.lc.command; +package com.github.ucchyocean.lc3.command; import java.util.ArrayList; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import com.github.ucchyocean.lc.Resources; -import com.github.ucchyocean.lc.Utility; -import com.github.ucchyocean.lc.channel.Channel; -import com.github.ucchyocean.lc.channel.ChannelPlayer; +import com.github.ucchyocean.lc3.Messages; +import com.github.ucchyocean.lc3.Utility; +import com.github.ucchyocean.lc3.channel.Channel; +import com.github.ucchyocean.lc3.member.ChannelMember; /** * hideコマンドの実行クラス * @author ucchy */ -public class HideCommand extends SubCommandAbst { +public class HideCommand extends LunaChatSubCommand { private static final String COMMAND_NAME = "hide"; private static final String PERMISSION_NODE = "lunachat." + COMMAND_NAME; - private static final String USAGE_KEY1 = "usageHide"; - private static final String USAGE_KEY2 = "usageHidePlayer"; - - private static final String HIDE_CHANNEL_FIRSTLINE = - Resources.get("hideChannelFirstLine"); - private static final String HIDE_PLAYER_FIRSTLINE = - Resources.get("hidePlayerFirstLine"); - private static final String LIST_ENDLINE = Resources.get("listEndLine"); - private static final String LIST_PREFIX = Resources.get("listPlainPrefix"); /** * コマンドを取得します。 * @return コマンド - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandName() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandName() */ @Override public String getCommandName() { @@ -46,7 +34,7 @@ public String getCommandName() { /** * パーミッションノードを取得します。 * @return パーミッションノード - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getPermissionNode() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getPermissionNode() */ @Override public String getPermissionNode() { @@ -56,7 +44,7 @@ public String getPermissionNode() { /** * コマンドの種別を取得します。 * @return コマンド種別 - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandType() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandType() */ @Override public CommandType getCommandType() { @@ -67,13 +55,13 @@ public CommandType getCommandType() { * 使用方法に関するメッセージをsenderに送信します。 * @param sender コマンド実行者 * @param label 実行ラベル - * @see com.github.ucchyocean.lc.command.SubCommandAbst#sendUsageMessage() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#sendUsageMessage() */ @Override public void sendUsageMessage( - CommandSender sender, String label) { - sendResourceMessage(sender, "", USAGE_KEY1, label); - sendResourceMessage(sender, "", USAGE_KEY2, label); + ChannelMember sender, String label) { + sender.sendMessage(Messages.usageHide(label)); + sender.sendMessage(Messages.usageHidePlayer(label)); } /** @@ -82,25 +70,18 @@ public void sendUsageMessage( * @param label 実行ラベル * @param args 実行時の引数 * @return コマンドが実行されたかどうか - * @see com.github.ucchyocean.lc.command.SubCommandAbst#runCommand(java.lang.String[]) + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#runCommand(java.lang.String[]) */ @Override public boolean runCommand( - CommandSender sender, String label, String[] args) { - - // プレイヤーでなければ終了する - if (!(sender instanceof Player)) { - sendResourceMessage(sender, PREERR, "errmsgIngame"); - return true; - } - ChannelPlayer player = ChannelPlayer.getChannelPlayer(sender); + ChannelMember sender, String label, String[] args) { // 引数チェック String cname = null; boolean isPlayerCommand = false; boolean isChannelCommand = false; if ( args.length <= 1 ) { - Channel def = api.getDefaultChannel(player.getName()); + Channel def = api.getDefaultChannel(sender.getName()); if ( def != null ) { cname = def.getName(); } @@ -108,8 +89,8 @@ public boolean runCommand( if ( args[1].equals("list") ) { // 指定されたコマンドが「/ch hide list」なら、リストを表示して終了 - for ( String item : getHideInfoList(player) ) { - player.sendMessage(item); + for ( String item : getHideInfoList(sender) ) { + sender.sendMessage(item); } return true; @@ -135,8 +116,8 @@ public boolean runCommand( Channel channel = api.getChannel(cname); if ( !isPlayerCommand && channel != null ) { isChannelCommand = true; - } else if ( Utility.getOfflinePlayer(cname) == null ) { - sendResourceMessage(sender, PREERR, "errmsgNotExistChannelAndPlayer"); + } else if ( Utility.existsOfflinePlayer(cname) ) { + sender.sendMessage(Messages.errmsgNotExistChannelAndPlayer()); return true; } @@ -144,21 +125,21 @@ public boolean runCommand( // チャンネルが対象の場合の処理 // 既に非表示になっていないかどうかをチェックする - if ( channel.getHided().contains(player) ) { - sendResourceMessage(sender, PREERR, "errmsgAlreadyHided"); + if ( channel.getHided().contains(sender) ) { + sender.sendMessage(Messages.errmsgAlreadyHided()); return true; } // メンバーかどうかをチェックする - if ( !channel.getMembers().contains(player) ) { - sendResourceMessage(sender, PREERR, "errmsgNomember"); + if ( !channel.getMembers().contains(sender) ) { + sender.sendMessage(Messages.errmsgNomember()); return true; } // 設定する - channel.getHided().add(player); + channel.getHided().add(sender); channel.save(); - sendResourceMessage(sender, PREINFO, "cmdmsgHided", channel.getName()); + sender.sendMessage(Messages.cmdmsgHided(channel.getName())); return true; @@ -166,21 +147,21 @@ public boolean runCommand( // プレイヤーが対象の場合の処理 // 既に非表示になっていないかどうかをチェックする - ChannelPlayer hided = ChannelPlayer.getChannelPlayer(cname); - if ( api.getHidelist(hided).contains(player) ) { - sendResourceMessage(sender, PREERR, "errmsgAlreadyHidedPlayer"); + ChannelMember hided = ChannelMember.getChannelMember(cname); + if ( api.getHidelist(hided).contains(sender) ) { + sender.sendMessage(Messages.errmsgAlreadyHidedPlayer()); return true; } // 自分自身を指定していないかどうかチェックする - if ( hided.equals(player) ) { - sendResourceMessage(sender, PREERR, "errmsgCannotHideSelf"); + if ( hided.equals(sender) ) { + sender.sendMessage(Messages.errmsgCannotHideSelf()); return true; } // 設定する - api.addHidelist(player, hided); - sendResourceMessage(sender, PREINFO, "cmdmsgHidedPlayer", hided.getDisplayName()); + api.addHidelist(sender, hided); + sender.sendMessage(Messages.cmdmsgHidedPlayer(hided.getDisplayName())); return true; } @@ -191,18 +172,18 @@ public boolean runCommand( * @param player 対象となるプレイヤー * @return メッセージ */ - private ArrayList getHideInfoList(ChannelPlayer player) { + private ArrayList getHideInfoList(ChannelMember player) { ArrayList items = new ArrayList(); - items.add(HIDE_CHANNEL_FIRSTLINE); + items.add(Messages.hideChannelFirstLine()); for ( String channel : getHideChannelNameList(player) ) { - items.add(LIST_PREFIX + channel); + items.add(Messages.listPlainPrefix() + channel); } - items.add(HIDE_PLAYER_FIRSTLINE); - for ( ChannelPlayer p : api.getHideinfo(player) ) { - items.add(LIST_PREFIX + p.getDisplayName()); + items.add(Messages.hidePlayerFirstLine()); + for ( ChannelMember p : api.getHideinfo(player) ) { + items.add(Messages.listPlainPrefix() + p.getDisplayName()); } - items.add(LIST_ENDLINE); + items.add(Messages.listEndLine()); return items; } @@ -212,7 +193,7 @@ private ArrayList getHideInfoList(ChannelPlayer player) { * @param player プレイヤー * @return 指定したプレイヤーが非表示にしているチャンネルのリスト */ - private ArrayList getHideChannelNameList(ChannelPlayer player) { + private ArrayList getHideChannelNameList(ChannelMember player) { ArrayList names = new ArrayList(); for ( Channel channel : api.getChannels() ) { diff --git a/src/main/java/com/github/ucchyocean/lc/command/InfoCommand.java b/src/main/java/com/github/ucchyocean/lc3/command/InfoCommand.java similarity index 55% rename from src/main/java/com/github/ucchyocean/lc/command/InfoCommand.java rename to src/main/java/com/github/ucchyocean/lc3/command/InfoCommand.java index f98983cf..3d3ec965 100644 --- a/src/main/java/com/github/ucchyocean/lc/command/InfoCommand.java +++ b/src/main/java/com/github/ucchyocean/lc3/command/InfoCommand.java @@ -1,32 +1,29 @@ /* * @author ucchy * @license LGPLv3 - * @copyright Copyright ucchy 2013 + * @copyright Copyright ucchy 2020 */ -package com.github.ucchyocean.lc.command; +package com.github.ucchyocean.lc3.command; -import java.util.ArrayList; +import java.util.List; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import com.github.ucchyocean.lc.channel.Channel; -import com.github.ucchyocean.lc.channel.ChannelPlayer; +import com.github.ucchyocean.lc3.Messages; +import com.github.ucchyocean.lc3.channel.Channel; +import com.github.ucchyocean.lc3.member.ChannelMember; /** * infoコマンドの実行クラス * @author ucchy */ -public class InfoCommand extends SubCommandAbst { +public class InfoCommand extends LunaChatSubCommand { private static final String COMMAND_NAME = "info"; private static final String PERMISSION_NODE = "lunachat." + COMMAND_NAME; - private static final String USAGE_KEY = "usageInfo"; /** * コマンドを取得します。 * @return コマンド - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandName() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandName() */ @Override public String getCommandName() { @@ -36,7 +33,7 @@ public String getCommandName() { /** * パーミッションノードを取得します。 * @return パーミッションノード - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getPermissionNode() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getPermissionNode() */ @Override public String getPermissionNode() { @@ -46,7 +43,7 @@ public String getPermissionNode() { /** * コマンドの種別を取得します。 * @return コマンド種別 - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandType() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandType() */ @Override public CommandType getCommandType() { @@ -57,12 +54,12 @@ public CommandType getCommandType() { * 使用方法に関するメッセージをsenderに送信します。 * @param sender コマンド実行者 * @param label 実行ラベル - * @see com.github.ucchyocean.lc.command.SubCommandAbst#sendUsageMessage() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#sendUsageMessage() */ @Override public void sendUsageMessage( - CommandSender sender, String label) { - sendResourceMessage(sender, "", USAGE_KEY, label); + ChannelMember sender, String label) { + sender.sendMessage(Messages.usageInfo(label)); } /** @@ -71,43 +68,37 @@ public void sendUsageMessage( * @param label 実行ラベル * @param args 実行時の引数 * @return コマンドが実行されたかどうか - * @see com.github.ucchyocean.lc.command.SubCommandAbst#runCommand(java.lang.String[]) + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#runCommand(java.lang.String[]) */ @Override public boolean runCommand( - CommandSender sender, String label, String[] args) { - - Player player = null; - if (sender instanceof Player) { - player = (Player) sender; - } + ChannelMember sender, String label, String[] args) { // 引数チェック - // このコマンドは、コンソールでも実行できるが、その場合はチャンネル名を指定する必要がある + // このコマンドは、デフォルトチャンネルでない人も実行できるが、その場合はチャンネル名を指定する必要がある String cname = null; - if ( player != null && args.length <= 1 ) { - Channel def = api.getDefaultChannel(player.getName()); + if ( args.length <= 1 ) { + Channel def = api.getDefaultChannel(sender.getName()); if ( def != null ) { cname = def.getName(); } } else if ( args.length >= 2 ) { cname = args[1]; } else { - sendResourceMessage(sender, PREERR, "errmsgCommand"); + sender.sendMessage(Messages.errmsgCommand()); return true; } // チャンネルが存在するかどうか確認する Channel channel = api.getChannel(cname); if ( channel == null ) { - sendResourceMessage(sender, PREERR, "errmsgNotExist"); + sender.sendMessage(Messages.errmsgNotExist()); return true; } // BANされていないかどうか確認する - ChannelPlayer cp = ChannelPlayer.getChannelPlayer(player); - if ( player != null && channel.getBanned().contains(cp) ) { - sendResourceMessage(sender, PREERR, "errmsgBanned"); + if ( channel.getBanned().contains(sender) ) { + sender.sendMessage(Messages.errmsgBanned()); return true; } @@ -115,7 +106,7 @@ public boolean runCommand( boolean isModerator = channel.hasModeratorPermission(sender); // 情報を取得して表示する - ArrayList list = channel.getInfo(isModerator); + List list = channel.getInfo(isModerator); for (String msg : list) { sender.sendMessage(msg); } diff --git a/src/main/java/com/github/ucchyocean/lc/command/InviteCommand.java b/src/main/java/com/github/ucchyocean/lc3/command/InviteCommand.java similarity index 55% rename from src/main/java/com/github/ucchyocean/lc/command/InviteCommand.java rename to src/main/java/com/github/ucchyocean/lc3/command/InviteCommand.java index 7794d75c..f46eb70d 100644 --- a/src/main/java/com/github/ucchyocean/lc/command/InviteCommand.java +++ b/src/main/java/com/github/ucchyocean/lc3/command/InviteCommand.java @@ -1,25 +1,22 @@ /* * @author ucchy * @license LGPLv3 - * @copyright Copyright ucchy 2013 + * @copyright Copyright ucchy 2020 */ -package com.github.ucchyocean.lc.command; +package com.github.ucchyocean.lc3.command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import com.github.ucchyocean.lc.channel.Channel; -import com.github.ucchyocean.lc.channel.ChannelPlayer; +import com.github.ucchyocean.lc3.Messages; +import com.github.ucchyocean.lc3.channel.Channel; +import com.github.ucchyocean.lc3.member.ChannelMember; /** * inviteコマンドの実行クラス * @author ucchy */ -public class InviteCommand extends SubCommandAbst { +public class InviteCommand extends LunaChatSubCommand { private static final String COMMAND_NAME = "invite"; private static final String PERMISSION_NODE = "lunachat." + COMMAND_NAME; - private static final String USAGE_KEY = "usageInvite"; private static final String PERMISSION_NODE_FORCE_INVITE = "lunachat-admin.force-invite"; @@ -27,7 +24,7 @@ public class InviteCommand extends SubCommandAbst { /** * コマンドを取得します。 * @return コマンド - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandName() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandName() */ @Override public String getCommandName() { @@ -37,7 +34,7 @@ public String getCommandName() { /** * パーミッションノードを取得します。 * @return パーミッションノード - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getPermissionNode() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getPermissionNode() */ @Override public String getPermissionNode() { @@ -47,7 +44,7 @@ public String getPermissionNode() { /** * コマンドの種別を取得します。 * @return コマンド種別 - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandType() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandType() */ @Override public CommandType getCommandType() { @@ -58,12 +55,12 @@ public CommandType getCommandType() { * 使用方法に関するメッセージをsenderに送信します。 * @param sender コマンド実行者 * @param label 実行ラベル - * @see com.github.ucchyocean.lc.command.SubCommandAbst#sendUsageMessage() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#sendUsageMessage() */ @Override public void sendUsageMessage( - CommandSender sender, String label) { - sendResourceMessage(sender, "", USAGE_KEY, label); + ChannelMember sender, String label) { + sender.sendMessage(Messages.usageInvite(label)); } /** @@ -72,10 +69,10 @@ public void sendUsageMessage( * @param label 実行ラベル * @param args 実行時の引数 * @return コマンドが実行されたかどうか - * @see com.github.ucchyocean.lc.command.SubCommandAbst#runCommand(java.lang.String[]) + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#runCommand(java.lang.String[]) */ @Override - public boolean runCommand(CommandSender sender, String label, String[] args) { + public boolean runCommand(ChannelMember sender, String label, String[] args) { if ( args.length >= 3 && args[2].equalsIgnoreCase("force") ) { return runForceInviteCommand(sender, label, args); @@ -91,19 +88,12 @@ public boolean runCommand(CommandSender sender, String label, String[] args) { * @param args * @return */ - private boolean runNormalInviteCommand(CommandSender sender, String label, String[] args) { - - // プレイヤーでなければ終了する - if (!(sender instanceof Player)) { - sendResourceMessage(sender, PREERR, "errmsgIngame"); - return true; - } + private boolean runNormalInviteCommand(ChannelMember sender, String label, String[] args) { // デフォルトの発言先を取得する - Player inviter = (Player)sender; - Channel channel = api.getDefaultChannel(inviter.getName()); + Channel channel = api.getDefaultChannel(sender.getName()); if ( channel == null ) { - sendResourceMessage(sender, PREERR, "errmsgNoJoin"); + sender.sendMessage(Messages.errmsgNoJoin()); return true; } @@ -112,40 +102,36 @@ private boolean runNormalInviteCommand(CommandSender sender, String label, Strin if (args.length >= 2) { invitedName = args[1]; } else { - sendResourceMessage(sender, PREERR, "errmsgCommand"); + sender.sendMessage(Messages.errmsgCommand()); return true; } // モデレーターかどうか確認する if ( !channel.hasModeratorPermission(sender) ) { - sendResourceMessage(sender, PREERR, "errmsgNotModerator"); + sender.sendMessage(Messages.errmsgNotModerator()); return true; } // 招待相手が存在するかどうかを確認する - ChannelPlayer invited = ChannelPlayer.getChannelPlayer(invitedName); + ChannelMember invited = ChannelMember.getChannelMember(invitedName); if ( invited == null || !invited.isOnline() ) { - sendResourceMessage(sender, PREERR, - "errmsgNotfoundPlayer", invitedName); + sender.sendMessage(Messages.errmsgNotfoundPlayer(invitedName)); return true; } // 招待相手が既にチャンネルに参加しているかどうかを確認する if (channel.getMembers().contains(invited)) { - sendResourceMessage(sender, PREERR, - "errmsgInvitedAlreadyExist", invitedName); + sender.sendMessage(Messages.errmsgInvitedAlreadyExist(invitedName)); return true; } // 招待を送信する DataMaps.inviteMap.put(invitedName, channel.getName()); - DataMaps.inviterMap.put(invitedName, inviter.getName()); + DataMaps.inviterMap.put(invitedName, sender.getName()); - sendResourceMessage(sender, PREINFO, - "cmdmsgInvite", invitedName, channel.getName()); - sendResourceMessage(invited, PREINFO, - "cmdmsgInvited1", inviter.getName(), channel.getName()); - sendResourceMessage(invited, PREINFO, "cmdmsgInvited2"); + sender.sendMessage(Messages.cmdmsgInvite(invitedName, channel.getName())); + invited.sendMessage(Messages.cmdmsgInvited1(sender.getName(), channel.getName())); + invited.sendMessage(Messages.cmdmsgInvited2()); return true; } @@ -156,65 +142,55 @@ private boolean runNormalInviteCommand(CommandSender sender, String label, Strin * @param args * @return */ - private boolean runForceInviteCommand(CommandSender sender, String label, String[] args) { + private boolean runForceInviteCommand(ChannelMember sender, String label, String[] args) { // パーミッションチェック if ( !sender.hasPermission(PERMISSION_NODE_FORCE_INVITE) ) { - sendResourceMessage(sender, PREERR, "errmsgPermission", - PERMISSION_NODE_FORCE_INVITE); + sender.sendMessage(Messages.errmsgPermission(PERMISSION_NODE_FORCE_INVITE)); return true; } - Player player = null; - if (sender instanceof Player) { - player = (Player) sender; - } - // 引数チェック - // このコマンドは、コンソールでも実行できるが、その場合はチャンネル名を指定する必要がある + // このコマンドは、デフォルトチャンネルでない人も実行できるが、その場合はチャンネル名を指定する必要がある String cname = null; - if ( player != null && args.length <= 3 ) { - Channel def = api.getDefaultChannel(player.getName()); + if ( args.length <= 3 ) { + Channel def = api.getDefaultChannel(sender.getName()); if ( def != null ) { cname = def.getName(); } } else if ( args.length >= 4 ) { cname = args[3]; } else { - sendResourceMessage(sender, PREERR, "errmsgCommand"); + sender.sendMessage(Messages.errmsgCommand()); return true; } // チャンネルが存在するかどうか確認する Channel channel = api.getChannel(cname); if ( channel == null ) { - sendResourceMessage(sender, PREERR, "errmsgNotExist"); + sender.sendMessage(Messages.errmsgNotExist()); return true; } // 招待相手が存在するかどうかを確認する String invitedName = args[1]; - ChannelPlayer invited = ChannelPlayer.getChannelPlayer(invitedName); + ChannelMember invited = ChannelMember.getChannelMember(invitedName); if ( invited == null || !invited.isOnline() ) { - sendResourceMessage(sender, PREERR, - "errmsgNotfoundPlayer", invitedName); + sender.sendMessage(Messages.errmsgNotfoundPlayer(invitedName)); return true; } // 招待相手が既にチャンネルに参加しているかどうかを確認する if (channel.getMembers().contains(invited)) { - sendResourceMessage(sender, PREERR, - "errmsgInvitedAlreadyExist", invitedName); + sender.sendMessage(Messages.errmsgInvitedAlreadyExist(invitedName)); return true; } // 参加する channel.addMember(invited); api.setDefaultChannel(invitedName, cname); - sendResourceMessage(sender, PREINFO, - "cmdmsgInvite", invitedName, channel.getName()); - sendResourceMessage(invited, PREINFO, - "cmdmsgJoin", channel.getName()); + sender.sendMessage(Messages.cmdmsgInvite(invitedName, channel.getName())); + invited.sendMessage(Messages.cmdmsgJoin(channel.getName())); return true; } diff --git a/src/main/java/com/github/ucchyocean/lc/command/JoinCommand.java b/src/main/java/com/github/ucchyocean/lc3/command/JoinCommand.java similarity index 61% rename from src/main/java/com/github/ucchyocean/lc/command/JoinCommand.java rename to src/main/java/com/github/ucchyocean/lc3/command/JoinCommand.java index eb5bcb3a..58ebc46c 100644 --- a/src/main/java/com/github/ucchyocean/lc/command/JoinCommand.java +++ b/src/main/java/com/github/ucchyocean/lc3/command/JoinCommand.java @@ -1,31 +1,28 @@ /* * @author ucchy * @license LGPLv3 - * @copyright Copyright ucchy 2013 + * @copyright Copyright ucchy 2020 */ -package com.github.ucchyocean.lc.command; +package com.github.ucchyocean.lc3.command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import com.github.ucchyocean.lc.channel.Channel; -import com.github.ucchyocean.lc.channel.ChannelPlayer; +import com.github.ucchyocean.lc3.Messages; +import com.github.ucchyocean.lc3.channel.Channel; +import com.github.ucchyocean.lc3.member.ChannelMember; /** * joinコマンドの実行クラス * @author ucchy */ -public class JoinCommand extends SubCommandAbst { +public class JoinCommand extends LunaChatSubCommand { private static final String COMMAND_NAME = "join"; private static final String PERMISSION_NODE = "lunachat." + COMMAND_NAME; private static final String PERMISSION_SPEAK_PREFIX = "lunachat.speak"; - private static final String USAGE_KEY = "usageJoin"; /** * コマンドを取得します。 * @return コマンド - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandName() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandName() */ @Override public String getCommandName() { @@ -35,7 +32,7 @@ public String getCommandName() { /** * パーミッションノードを取得します。 * @return パーミッションノード - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getPermissionNode() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getPermissionNode() */ @Override public String getPermissionNode() { @@ -45,7 +42,7 @@ public String getPermissionNode() { /** * コマンドの種別を取得します。 * @return コマンド種別 - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandType() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandType() */ @Override public CommandType getCommandType() { @@ -56,12 +53,12 @@ public CommandType getCommandType() { * 使用方法に関するメッセージをsenderに送信します。 * @param sender コマンド実行者 * @param label 実行ラベル - * @see com.github.ucchyocean.lc.command.SubCommandAbst#sendUsageMessage() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#sendUsageMessage() */ @Override public void sendUsageMessage( - CommandSender sender, String label) { - sendResourceMessage(sender, "", USAGE_KEY, label); + ChannelMember sender, String label) { + sender.sendMessage(Messages.usageJoin(label)); } /** @@ -70,18 +67,11 @@ public void sendUsageMessage( * @param label 実行ラベル * @param args 実行時の引数 * @return コマンドが実行されたかどうか - * @see com.github.ucchyocean.lc.command.SubCommandAbst#runCommand(java.lang.String[]) + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#runCommand(java.lang.String[]) */ @Override public boolean runCommand( - CommandSender sender, String label, String[] args) { - - // プレイヤーでなければ終了する - if (!(sender instanceof Player)) { - sendResourceMessage(sender, PREERR, "errmsgIngame"); - return true; - } - ChannelPlayer player = ChannelPlayer.getChannelPlayer(sender); + ChannelMember sender, String label, String[] args) { // 実行引数から、参加するチャンネルを取得する String channelName = ""; @@ -101,7 +91,7 @@ public boolean runCommand( } } } else { - sendResourceMessage(sender, PREERR, "errmsgCommand"); + sender.sendMessage(Messages.errmsgCommand()); return true; } @@ -115,51 +105,53 @@ public boolean runCommand( // グローバルチャンネル設定が無くて、指定チャンネルがマーカーの場合、 // 発言先を削除して、グローバルチャンネルにする - api.removeDefaultChannel(player.getName()); - sendResourceMessage(sender, PREINFO, "cmdmsgSet", "グローバル"); - if ( message.length() > 0 && player.getPlayer() != null ) { - player.getPlayer().chat(config.getGlobalMarker() + message.toString()); + if ( api.getDefaultChannel(sender.getName()) != null ) { + api.removeDefaultChannel(sender.getName()); + sender.sendMessage(Messages.cmdmsgSet("Global")); } + + // 何かメッセージがあるなら、そのままチャット送信する + // TODO 要テスト + sender.chat(message.toString()); + return true; } + if (config.isCreateChannelOnJoinCommand()) { // 存在しないチャットには、チャンネルを作って入る設定の場合 // 使用可能なチャンネル名かどうかをチェックする if ( !channelName.matches("[0-9a-zA-Z\\-_]+") ) { - sendResourceMessage(sender, PREERR, - "errmsgCannotUseForChannel", channelName); + sender.sendMessage(Messages.errmsgCannotUseForChannel(channelName)); return true; } // 最低文字列長を上回っているかをチェックする if ( channelName.length() < config.getMinChannelNameLength() ) { - sendResourceMessage(sender, PREERR, - "errmsgCannotUseForChannelTooShort", - channelName, config.getMinChannelNameLength()); + sender.sendMessage(Messages.errmsgCannotUseForChannelTooShort( + channelName, config.getMinChannelNameLength())); return true; } // 最大文字列長を下回っているかをチェックする if ( channelName.length() > config.getMaxChannelNameLength() ) { - sendResourceMessage(sender, PREERR, - "errmsgCannotUseForChannelTooLong", - channelName, config.getMaxChannelNameLength()); + sender.sendMessage(Messages.errmsgCannotUseForChannelTooLong( + channelName, config.getMaxChannelNameLength())); return true; } // チャンネル作成 Channel c = api.createChannel(channelName); if ( c != null ) { - c.addMember(player); - sendResourceMessage(sender, PREINFO, "cmdmsgCreate", channelName); + c.addMember(sender); + sender.sendMessage(Messages.cmdmsgCreate(channelName)); } return true; } else { // 存在しないチャットには入れない設定の場合 - sendResourceMessage(sender, PREERR, "errmsgNotExist"); + sender.sendMessage(Messages.errmsgNotExist()); return true; } } @@ -169,41 +161,43 @@ public boolean runCommand( // 入室権限を確認する String node = PERMISSION_NODE + "." + channelName; if (sender.isPermissionSet(node) && !sender.hasPermission(node)) { - sendResourceMessage(sender, PREERR, "errmsgPermission", - PERMISSION_NODE + "." + channelName); + sender.sendMessage(Messages.errmsgPermission(node)); return true; } // BANされていないか確認する - if (channel.getBanned().contains(player)) { - sendResourceMessage(sender, PREERR, "errmsgBanned"); + if (channel.getBanned().contains(sender)) { + sender.sendMessage(Messages.errmsgBanned()); return true; } // 個人チャットの場合はエラーにする if (channel.isPersonalChat()) { - sendResourceMessage(sender, PREERR, "errmsgCannotJoinPersonal"); + sender.sendMessage(Messages.errmsgCannotJoinPersonal()); return true; } - if (channel.getMembers().contains(player)) { + if (channel.getMembers().contains(sender)) { // 何かメッセージがあるなら、そのままチャット送信する if (message.length() > 0 && hasSpeakPermission(sender, channelName)) { - channel.chat(player, message.toString()); + channel.chat(sender, message.toString()); return true; } // デフォルトの発言先に設定する - api.setDefaultChannel(player.getName(), channelName); - sendResourceMessage(sender, PREINFO, "cmdmsgSet", channelName); + if ( api.getDefaultChannel(sender.getName()) == null || + !api.getDefaultChannel(sender.getName()).getName().equals(channelName) ) { + api.setDefaultChannel(sender.getName(), channelName); + sender.sendMessage(Messages.cmdmsgSet(channelName)); + } } else { // グローバルチャンネルで、何かメッセージがあるなら、そのままチャット送信する if (channel.getName().equals(config.getGlobalChannel()) && message.length() > 0 && hasSpeakPermission(sender, channelName)) { - channel.chat(player, message.toString()); + channel.chat(sender, message.toString()); return true; } @@ -211,42 +205,47 @@ public boolean runCommand( if ( !channel.getPassword().equals("") ) { if ( message.toString().trim().equals("") ) { // パスワード空欄 - sendResourceMessage(sender, PREERR, "errmsgPassword1"); - sendResourceMessage(sender, PREERR, "errmsgPassword2"); - sendResourceMessage(sender, PREERR, "errmsgPassword3"); + sender.sendMessage(Messages.errmsgPassword1()); + sender.sendMessage(Messages.errmsgPassword2()); + sender.sendMessage(Messages.errmsgPassword3()); return true; } else if ( !channel.getPassword().equals(message.toString().trim()) ) { // パスワード不一致 - sendResourceMessage(sender, PREERR, "errmsgPasswordNotmatch"); - sendResourceMessage(sender, PREERR, "errmsgPassword2"); - sendResourceMessage(sender, PREERR, "errmsgPassword3"); + sender.sendMessage(Messages.errmsgPasswordNotmatch()); + sender.sendMessage(Messages.errmsgPassword2()); + sender.sendMessage(Messages.errmsgPassword3()); return true; } } // チャンネルに参加し、デフォルトの発言先に設定する if ( !channel.getName().equals(config.getGlobalChannel()) ) { - channel.addMember(player); - sendResourceMessage(sender, PREINFO, "cmdmsgJoin", channelName); + channel.addMember(sender); + sender.sendMessage(Messages.cmdmsgJoin(channelName)); + } + + // デフォルトの発言先に設定する + if ( api.getDefaultChannel(sender.getName()) == null || + !api.getDefaultChannel(sender.getName()).getName().equals(channelName) ) { + api.setDefaultChannel(sender.getName(), channelName); + sender.sendMessage(Messages.cmdmsgSet(channelName)); } - api.setDefaultChannel(player.getName(), channelName); - sendResourceMessage(sender, PREINFO, "cmdmsgSet", channelName); } // チャンネル説明文があるなら、説明文を表示する if ( !channel.getDescription().trim().equals("") ) { - sendResourceMessage(sender, PREINFO, "cmdmsgSetTopic", channel.getDescription().trim()); + sender.sendMessage(Messages.cmdmsgSetTopic(channel.getDescription().trim())); } // 非表示に設定しているなら、注意を流す - if ( channel.getHided().contains(player) ) { - sendResourceMessage(sender, PREINFO, "cmdmsgSetHide"); + if ( channel.getHided().contains(sender) ) { + sender.sendMessage(Messages.cmdmsgSetHide()); } return true; } - private boolean hasSpeakPermission(CommandSender sender, String channelName) { + private boolean hasSpeakPermission(ChannelMember sender, String channelName) { String node = PERMISSION_SPEAK_PREFIX + "." + channelName; return sender.isPermissionSet(node) && sender.hasPermission(node); } diff --git a/src/main/java/com/github/ucchyocean/lc/command/KickCommand.java b/src/main/java/com/github/ucchyocean/lc3/command/KickCommand.java similarity index 59% rename from src/main/java/com/github/ucchyocean/lc/command/KickCommand.java rename to src/main/java/com/github/ucchyocean/lc3/command/KickCommand.java index 7b1fa965..1d98e3d0 100644 --- a/src/main/java/com/github/ucchyocean/lc/command/KickCommand.java +++ b/src/main/java/com/github/ucchyocean/lc3/command/KickCommand.java @@ -1,30 +1,27 @@ /* * @author ucchy * @license LGPLv3 - * @copyright Copyright ucchy 2013 + * @copyright Copyright ucchy 2020 */ -package com.github.ucchyocean.lc.command; +package com.github.ucchyocean.lc3.command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import com.github.ucchyocean.lc.channel.Channel; -import com.github.ucchyocean.lc.channel.ChannelPlayer; +import com.github.ucchyocean.lc3.Messages; +import com.github.ucchyocean.lc3.channel.Channel; +import com.github.ucchyocean.lc3.member.ChannelMember; /** * kickコマンドの実行クラス * @author ucchy */ -public class KickCommand extends SubCommandAbst { +public class KickCommand extends LunaChatSubCommand { private static final String COMMAND_NAME = "kick"; private static final String PERMISSION_NODE = "lunachat." + COMMAND_NAME; - private static final String USAGE_KEY = "usageKick"; /** * コマンドを取得します。 * @return コマンド - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandName() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandName() */ @Override public String getCommandName() { @@ -34,17 +31,17 @@ public String getCommandName() { /** * パーミッションノードを取得します。 * @return パーミッションノード - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getPermissionNode() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getPermissionNode() */ @Override public String getPermissionNode() { return PERMISSION_NODE; - } + } /** * コマンドの種別を取得します。 * @return コマンド種別 - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandType() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandType() */ @Override public CommandType getCommandType() { @@ -55,12 +52,12 @@ public CommandType getCommandType() { * 使用方法に関するメッセージをsenderに送信します。 * @param sender コマンド実行者 * @param label 実行ラベル - * @see com.github.ucchyocean.lc.command.SubCommandAbst#sendUsageMessage() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#sendUsageMessage() */ @Override public void sendUsageMessage( - CommandSender sender, String label) { - sendResourceMessage(sender, "", USAGE_KEY, label); + ChannelMember sender, String label) { + sender.sendMessage(Messages.usageKick(label)); } /** @@ -69,18 +66,18 @@ public void sendUsageMessage( * @param label 実行ラベル * @param args 実行時の引数 * @return コマンドが実行されたかどうか - * @see com.github.ucchyocean.lc.command.SubCommandAbst#runCommand(java.lang.String[]) + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#runCommand(java.lang.String[]) */ @Override public boolean runCommand( - CommandSender sender, String label, String[] args) { + ChannelMember sender, String label, String[] args) { // 実行引数から、キックするユーザーを取得する String kickedName = ""; if (args.length >= 2) { kickedName = args[1]; } else { - sendResourceMessage(sender, PREERR, "errmsgCommand"); + sender.sendMessage(Messages.errmsgCommand()); return true; } @@ -88,32 +85,30 @@ public boolean runCommand( Channel channel = null; if (args.length >= 3) { channel = api.getChannel(args[2]); - } else if (sender instanceof Player) { - Player kicker = (Player) sender; - channel = api.getDefaultChannel(kicker.getName()); + } else { + channel = api.getDefaultChannel(sender.getName()); } if (channel == null) { - sendResourceMessage(sender, PREERR, "errmsgNoJoin"); + sender.sendMessage(Messages.errmsgNoJoin()); return true; } // モデレーターかどうか確認する if ( !channel.hasModeratorPermission(sender) ) { - sendResourceMessage(sender, PREERR, "errmsgNotModerator"); + sender.sendMessage(Messages.errmsgNotModerator()); return true; } // グローバルチャンネルならキックできない if ( channel.isGlobalChannel() ) { - sendResourceMessage(sender, PREERR, - "errmsgCannotKickGlobal", channel.getName()); + sender.sendMessage(Messages.errmsgCannotKickGlobal(channel.getName())); return true; } // キックされるプレイヤーがメンバーかどうかチェックする - ChannelPlayer kicked = ChannelPlayer.getChannelPlayer(kickedName); + ChannelMember kicked = ChannelMember.getChannelMember(kickedName); if (!channel.getMembers().contains(kicked)) { - sendResourceMessage(sender, PREERR, "errmsgNomemberOther"); + sender.sendMessage(Messages.errmsgNomemberOther()); return true; } @@ -122,16 +117,16 @@ public boolean runCommand( channel.save(); // senderに通知メッセージを出す - sendResourceMessage(sender, PREINFO, - "cmdmsgKick", kickedName, channel.getName()); + sender.sendMessage(Messages.cmdmsgKick(kickedName, channel.getName())); // チャンネルに通知メッセージを出す - sendResourceMessageWithKeyword(channel, "kickMessage", kicked); + channel.sendSystemMessage( + Messages.kickMessage(channel.getColorCode(), channel.getName(), kicked), + true, "system"); // キックされた人に通知メッセージを出す if ( kicked != null && kicked.isOnline() ) { - sendResourceMessage(kicked, PREINFO, - "cmdmsgKicked", channel.getName()); + kicked.sendMessage(Messages.cmdmsgKicked(channel.getName())); } return true; diff --git a/src/main/java/com/github/ucchyocean/lc/command/LeaveCommand.java b/src/main/java/com/github/ucchyocean/lc3/command/LeaveCommand.java similarity index 57% rename from src/main/java/com/github/ucchyocean/lc/command/LeaveCommand.java rename to src/main/java/com/github/ucchyocean/lc3/command/LeaveCommand.java index 4c3e08d1..3f8450a0 100644 --- a/src/main/java/com/github/ucchyocean/lc/command/LeaveCommand.java +++ b/src/main/java/com/github/ucchyocean/lc3/command/LeaveCommand.java @@ -1,30 +1,27 @@ /* * @author ucchy * @license LGPLv3 - * @copyright Copyright ucchy 2013 + * @copyright Copyright ucchy 2020 */ -package com.github.ucchyocean.lc.command; +package com.github.ucchyocean.lc3.command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import com.github.ucchyocean.lc.channel.Channel; -import com.github.ucchyocean.lc.channel.ChannelPlayer; +import com.github.ucchyocean.lc3.Messages; +import com.github.ucchyocean.lc3.channel.Channel; +import com.github.ucchyocean.lc3.member.ChannelMember; /** * leaveコマンドの実行クラス * @author ucchy */ -public class LeaveCommand extends SubCommandAbst { +public class LeaveCommand extends LunaChatSubCommand { private static final String COMMAND_NAME = "leave"; private static final String PERMISSION_NODE = "lunachat." + COMMAND_NAME; - private static final String USAGE_KEY = "usageLeave"; /** * コマンドを取得します。 * @return コマンド - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandName() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandName() */ @Override public String getCommandName() { @@ -34,7 +31,7 @@ public String getCommandName() { /** * パーミッションノードを取得します。 * @return パーミッションノード - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getPermissionNode() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getPermissionNode() */ @Override public String getPermissionNode() { @@ -44,7 +41,7 @@ public String getPermissionNode() { /** * コマンドの種別を取得します。 * @return コマンド種別 - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandType() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandType() */ @Override public CommandType getCommandType() { @@ -55,12 +52,12 @@ public CommandType getCommandType() { * 使用方法に関するメッセージをsenderに送信します。 * @param sender コマンド実行者 * @param label 実行ラベル - * @see com.github.ucchyocean.lc.command.SubCommandAbst#sendUsageMessage() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#sendUsageMessage() */ @Override public void sendUsageMessage( - CommandSender sender, String label) { - sendResourceMessage(sender, "", USAGE_KEY, label); + ChannelMember sender, String label) { + sender.sendMessage(Messages.usageLeave(label)); } /** @@ -69,22 +66,15 @@ public void sendUsageMessage( * @param label 実行ラベル * @param args 実行時の引数 * @return コマンドが実行されたかどうか - * @see com.github.ucchyocean.lc.command.SubCommandAbst#runCommand(java.lang.String[]) + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#runCommand(java.lang.String[]) */ @Override public boolean runCommand( - CommandSender sender, String label, String[] args) { - - // プレイヤーでなければ終了する - if (!(sender instanceof Player)) { - sendResourceMessage(sender, PREERR, "errmsgIngame"); - return true; - } + ChannelMember sender, String label, String[] args) { // 実行引数から退出するチャンネルを取得する // 指定が無いならデフォルトの発言先にする - ChannelPlayer player = ChannelPlayer.getChannelPlayer(sender); - Channel def = api.getDefaultChannel(player.getName()); + Channel def = api.getDefaultChannel(sender.getName()); String channelName = null; if ( def != null ) { channelName = def.getName(); @@ -97,7 +87,7 @@ public boolean runCommand( // チャンネルが存在するかどうかをチェックする if ( channel == null ) { - sendResourceMessage(sender, PREERR, "errmsgNotExist"); + sender.sendMessage(Messages.errmsgNotExist()); return true; } @@ -106,32 +96,31 @@ public boolean runCommand( // 退室権限を確認する String node = PERMISSION_NODE + "." + channelName; if (sender.isPermissionSet(node) && !sender.hasPermission(node)) { - sendResourceMessage(sender, PREERR, "errmsgPermission", - PERMISSION_NODE + "." + channelName); + sender.sendMessage(Messages.errmsgPermission(node)); return true; } // グローバルチャンネルなら退出できない if ( channel.isGlobalChannel() ) { - sendResourceMessage(sender, PREERR, "errmsgCannotLeaveGlobal", channelName); + sender.sendMessage(Messages.errmsgCannotLeaveGlobal(channelName)); return true; } // 強制参加チャンネルなら退出できない if ( channel.isForceJoinChannel() ) { - sendResourceMessage(sender, PREERR, "errmsgCannotLeaveForceJoin", channelName); + sender.sendMessage(Messages.errmsgCannotLeaveForceJoin(channelName)); return true; } // チャンネルのメンバーかどうかを確認する - if (!channel.getMembers().contains(player)) { - sendResourceMessage(sender, PREERR, "errmsgNomember"); + if (!channel.getMembers().contains(sender)) { + sender.sendMessage(Messages.errmsgNomember()); return true; } // チャンネルから退出する - channel.removeMember(player); - sendResourceMessage(sender, PREINFO, "cmdmsgLeave", channelName); + channel.removeMember(sender); + sender.sendMessage(Messages.cmdmsgLeave(channelName)); return true; } } diff --git a/src/main/java/com/github/ucchyocean/lc/command/ListCommand.java b/src/main/java/com/github/ucchyocean/lc3/command/ListCommand.java similarity index 68% rename from src/main/java/com/github/ucchyocean/lc/command/ListCommand.java rename to src/main/java/com/github/ucchyocean/lc3/command/ListCommand.java index 63bac69d..3e64e5cd 100644 --- a/src/main/java/com/github/ucchyocean/lc/command/ListCommand.java +++ b/src/main/java/com/github/ucchyocean/lc3/command/ListCommand.java @@ -1,43 +1,34 @@ /* * @author ucchy * @license LGPLv3 - * @copyright Copyright ucchy 2013 + * @copyright Copyright ucchy 2020 */ -package com.github.ucchyocean.lc.command; +package com.github.ucchyocean.lc3.command; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import com.github.ucchyocean.lc.Resources; -import com.github.ucchyocean.lc.channel.Channel; -import com.github.ucchyocean.lc.channel.ChannelPlayer; +import com.github.ucchyocean.lc3.ChatColor; +import com.github.ucchyocean.lc3.Messages; +import com.github.ucchyocean.lc3.channel.Channel; +import com.github.ucchyocean.lc3.member.ChannelMember; /** * listコマンドの実行クラス * @author ucchy */ -public class ListCommand extends SubCommandAbst { - - private static final String LIST_FIRSTLINE = Resources.get("listFirstLine"); - private static final String LIST_FIRSTLINE_PAGING = Resources.get("listFirstLinePaging"); - private static final String LIST_ENDLINE = Resources.get("listEndLine"); - private static final String LIST_FORMAT = Resources.get("listFormat"); +public class ListCommand extends LunaChatSubCommand { private static final String COMMAND_NAME = "list"; private static final String PERMISSION_NODE = "lunachat." + COMMAND_NAME; - private static final String USAGE_KEY = "usageList"; private static final int PAGE_SIZE = 8; /** * コマンドを取得します。 * @return コマンド - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandName() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandName() */ @Override public String getCommandName() { @@ -47,7 +38,7 @@ public String getCommandName() { /** * パーミッションノードを取得します。 * @return パーミッションノード - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getPermissionNode() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getPermissionNode() */ @Override public String getPermissionNode() { @@ -57,7 +48,7 @@ public String getPermissionNode() { /** * コマンドの種別を取得します。 * @return コマンド種別 - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandType() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandType() */ @Override public CommandType getCommandType() { @@ -68,12 +59,12 @@ public CommandType getCommandType() { * 使用方法に関するメッセージをsenderに送信します。 * @param sender コマンド実行者 * @param label 実行ラベル - * @see com.github.ucchyocean.lc.command.SubCommandAbst#sendUsageMessage() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#sendUsageMessage() */ @Override public void sendUsageMessage( - CommandSender sender, String label) { - sendResourceMessage(sender, "", USAGE_KEY, label); + ChannelMember sender, String label) { + sender.sendMessage(Messages.usageList(label)); } /** @@ -82,16 +73,11 @@ public void sendUsageMessage( * @param label 実行ラベル * @param args 実行時の引数 * @return コマンドが実行されたかどうか - * @see com.github.ucchyocean.lc.command.SubCommandAbst#runCommand(java.lang.String[]) + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#runCommand(java.lang.String[]) */ @Override public boolean runCommand( - CommandSender sender, String label, String[] args) { - - Player player = null; - if (sender instanceof Player) { - player = (Player) sender; - } + ChannelMember sender, String label, String[] args) { int page = 0; if ( args.length >= 2 && args[1].matches("[0-9]") ) { @@ -99,7 +85,7 @@ public boolean runCommand( } // リストを取得して表示する - ArrayList list = getList(player, page); + ArrayList list = getList(sender, page); for (String msg : list) { sender.sendMessage(msg); } @@ -112,7 +98,7 @@ public boolean runCommand( * @param page 表示するページ、0を指定した場合は全表示 * @return リスト */ - private ArrayList getList(Player player, int page) { + private ArrayList getList(ChannelMember player, int page) { ArrayList list = getPlayerList(player); int size = list.size(); @@ -123,14 +109,14 @@ private ArrayList getList(Player player, int page) { ArrayList items = new ArrayList<>(); if ( page == 0 ) { // 全表示 - items.add(LIST_FIRSTLINE); + items.add(Messages.listFirstLine()); items.addAll(list); - items.add(LIST_ENDLINE); + items.add(Messages.listEndLine()); } else { // ページ表示 - items.add(String.format(LIST_FIRSTLINE_PAGING, page, maxPage)); + items.add(Messages.listFirstLinePaging(page, maxPage)); int endIndex = (page * PAGE_SIZE > size) ? size : page * PAGE_SIZE; items.addAll(list.subList((page - 1) * PAGE_SIZE, endIndex)); - items.add(LIST_ENDLINE); + items.add(Messages.listEndLine()); } return items; @@ -141,7 +127,7 @@ private ArrayList getList(Player player, int page) { * @param player プレイヤー * @return チャンネルリスト */ - private ArrayList getPlayerList(Player player) { + private ArrayList getPlayerList(ChannelMember player) { ArrayList items = new ArrayList(); String dchannel = ""; @@ -155,7 +141,6 @@ private ArrayList getPlayerList(Player player) { dchannel = def.getName(); } } - ChannelPlayer cp = ChannelPlayer.getChannelPlayer(player); // チャンネルを取得して、チャンネル名でソートする ArrayList channels = new ArrayList<>(api.getChannels()); @@ -169,7 +154,7 @@ public int compare(Channel c1, Channel c2) { for ( Channel channel : channels ) { // BANされているチャンネルは表示しない - if ( channel.getBanned().contains(cp) ) { + if ( channel.getBanned().contains(player) ) { continue; } @@ -182,12 +167,11 @@ public int compare(Channel c1, Channel c2) { String disp = ChatColor.WHITE + channel.getName(); if ( channel.getName().equalsIgnoreCase(dchannel) ) { disp = ChatColor.RED + channel.getName(); - } else if ( channel.getHided().contains(cp) ) { + } else if ( channel.getHided().contains(player) ) { disp = ChatColor.DARK_AQUA + channel.getName(); } - if ( player != null && - !channel.getMembers().contains(cp) && + if ( !channel.getMembers().contains(player) && !channel.isGlobalChannel() ) { // 未参加で visible=false のチャンネルは表示しない @@ -199,8 +183,7 @@ public int compare(Channel c1, Channel c2) { 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); } diff --git a/src/main/java/com/github/ucchyocean/lc/command/LogCommand.java b/src/main/java/com/github/ucchyocean/lc3/command/LogCommand.java similarity index 58% rename from src/main/java/com/github/ucchyocean/lc/command/LogCommand.java rename to src/main/java/com/github/ucchyocean/lc3/command/LogCommand.java index 3ee7a840..7f22696e 100644 --- a/src/main/java/com/github/ucchyocean/lc/command/LogCommand.java +++ b/src/main/java/com/github/ucchyocean/lc3/command/LogCommand.java @@ -1,39 +1,31 @@ /* * @author ucchy * @license LGPLv3 - * @copyright Copyright ucchy 2014 + * @copyright Copyright ucchy 2020 */ -package com.github.ucchyocean.lc.command; +package com.github.ucchyocean.lc3.command; import java.util.ArrayList; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import com.github.ucchyocean.lc.LunaChat; -import com.github.ucchyocean.lc.LunaChatLogger; -import com.github.ucchyocean.lc.Resources; -import com.github.ucchyocean.lc.channel.Channel; -import com.github.ucchyocean.lc.channel.ChannelPlayer; +import com.github.ucchyocean.lc3.LunaChat; +import com.github.ucchyocean.lc3.LunaChatLogger; +import com.github.ucchyocean.lc3.Messages; +import com.github.ucchyocean.lc3.channel.Channel; +import com.github.ucchyocean.lc3.member.ChannelMember; /** * logコマンドの実行クラス * @author ucchy */ -public class LogCommand extends SubCommandAbst { - - private static final String LOGDISPLAY_FIRSTLINE = Resources.get("logDisplayFirstLine"); - private static final String LOGDISPLAY_ENDLINE = Resources.get("logDisplayEndLine"); - private static final String LOGDISPLAY_FORMAT = Resources.get("logDisplayFormat"); +public class LogCommand extends LunaChatSubCommand { private static final String COMMAND_NAME = "log"; private static final String PERMISSION_NODE = "lunachat." + COMMAND_NAME; - private static final String USAGE_KEY = "usageLog"; /** * コマンドを取得します。 * @return コマンド - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandName() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandName() */ @Override public String getCommandName() { @@ -43,7 +35,7 @@ public String getCommandName() { /** * パーミッションノードを取得します。 * @return パーミッションノード - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getPermissionNode() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getPermissionNode() */ @Override public String getPermissionNode() { @@ -53,7 +45,7 @@ public String getPermissionNode() { /** * コマンドの種別を取得します。 * @return コマンド種別 - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandType() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandType() */ @Override public CommandType getCommandType() { @@ -64,12 +56,12 @@ public CommandType getCommandType() { * 使用方法に関するメッセージをsenderに送信します。 * @param sender コマンド実行者 * @param label 実行ラベル - * @see com.github.ucchyocean.lc.command.SubCommandAbst#sendUsageMessage() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#sendUsageMessage() */ @Override public void sendUsageMessage( - CommandSender sender, String label) { - sendResourceMessage(sender, "", USAGE_KEY, label); + ChannelMember sender, String label) { + sender.sendMessage(Messages.usageLog(label)); } /** @@ -78,15 +70,10 @@ public void sendUsageMessage( * @param label 実行ラベル * @param args 実行時の引数 * @return コマンドが実行されたかどうか - * @see com.github.ucchyocean.lc.command.SubCommandAbst#runCommand(java.lang.String[]) + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#runCommand(java.lang.String[]) */ @Override - public boolean runCommand(CommandSender sender, String label, String[] args) { - - Player player = null; - if (sender instanceof Player) { - player = (Player) sender; - } + public boolean runCommand(ChannelMember sender, String label, String[] args) { // 引数チェック String cname = null; @@ -114,8 +101,8 @@ public boolean runCommand(CommandSender sender, String label, String[] args) { } } - if ( player != null && cname == null ) { - Channel def = api.getDefaultChannel(player.getName()); + if ( sender != null && cname == null ) { + Channel def = api.getDefaultChannel(sender.getName()); if ( def != null ) { cname = def.getName(); } @@ -124,8 +111,7 @@ public boolean runCommand(CommandSender sender, String label, String[] args) { // 参照権限を確認する String node = PERMISSION_NODE + "." + cname; if (sender.isPermissionSet(node) && !sender.hasPermission(node)) { - sendResourceMessage(sender, PREERR, "errmsgPermission", - PERMISSION_NODE + "." + cname); + sender.sendMessage(Messages.errmsgPermission(node)); return true; } @@ -137,30 +123,29 @@ public boolean runCommand(CommandSender sender, String label, String[] args) { // グローバルチャンネル設定が無くて、指定チャンネルがマーカーの場合、 // 通常チャットのログを取得する - LunaChatLogger logger = LunaChat.getInstance().getNormalChatLogger(); + LunaChatLogger logger = LunaChat.getNormalChatLogger(); logs = logger.getLog(argsPlayer, argsFilter, argsDate, reverse); - cname = "グローバルチャット"; + cname = "GlobalChat"; } else { // チャンネルが存在するかどうか確認する Channel channel = api.getChannel(cname); if ( channel == null ) { - sendResourceMessage(sender, PREERR, "errmsgNotExist"); + sender.sendMessage(Messages.errmsgNotExist()); return true; } // BANされていないかどうか確認する - ChannelPlayer cp = ChannelPlayer.getChannelPlayer(player); - if ( player != null && channel.getBanned().contains(cp) ) { - sendResourceMessage(sender, PREERR, "errmsgBanned"); + if ( sender != null && channel.getBanned().contains(sender) ) { + sender.sendMessage(Messages.errmsgBanned()); return true; } // チャンネルのメンバーかどうかを確認する - if (!channel.getMembers().contains(cp)) { - sendResourceMessage(sender, PREERR, "errmsgNomember"); + if (!channel.getMembers().contains(sender)) { + sender.sendMessage(Messages.errmsgNomember()); return true; } @@ -168,7 +153,7 @@ public boolean runCommand(CommandSender sender, String label, String[] args) { } // 整形と表示 - sender.sendMessage(String.format(LOGDISPLAY_FIRSTLINE, cname)); + sender.sendMessage(Messages.logDisplayFirstLine(cname)); for ( String log : logs ) { @@ -179,11 +164,10 @@ public boolean runCommand(CommandSender sender, String label, String[] args) { if ( temp.length >= 3 ) { playerName = temp[2]; } - sender.sendMessage(String.format( - LOGDISPLAY_FORMAT, date, playerName, message)); + sender.sendMessage(Messages.logDisplayFormat(date, playerName, message)); } - sender.sendMessage(LOGDISPLAY_ENDLINE); + sender.sendMessage(Messages.logDisplayEndLine()); return true; } diff --git a/src/main/java/com/github/ucchyocean/lc/command/LunaChatCommand.java b/src/main/java/com/github/ucchyocean/lc3/command/LunaChatCommand.java similarity index 69% rename from src/main/java/com/github/ucchyocean/lc/command/LunaChatCommand.java rename to src/main/java/com/github/ucchyocean/lc3/command/LunaChatCommand.java index 77f22fb0..03bb14cf 100644 --- a/src/main/java/com/github/ucchyocean/lc/command/LunaChatCommand.java +++ b/src/main/java/com/github/ucchyocean/lc3/command/LunaChatCommand.java @@ -1,439 +1,387 @@ -/* - * @author ucchy - * @license LGPLv3 - * @copyright Copyright ucchy 2013 - */ -package com.github.ucchyocean.lc.command; - -import java.util.ArrayList; -import java.util.List; - -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.Resources; -import com.github.ucchyocean.lc.Utility; -import com.github.ucchyocean.lc.channel.Channel; -import com.github.ucchyocean.lc.channel.ChannelPlayer; - -/** - * Lunachatコマンドの処理クラス - * @author ucchy - */ -public class LunaChatCommand implements CommandExecutor { - - private static final String PREERR = Resources.get("errorPrefix"); - - private ArrayList commands; - private ArrayList commonCommands; - private JoinCommand joinCommand; - private HelpCommand helpCommand; - - /** - * コンストラクタ - */ - public LunaChatCommand() { - - commands = new ArrayList(); - joinCommand = new JoinCommand(); - commands.add(joinCommand); - commands.add(new LeaveCommand()); - commands.add(new ListCommand()); - commands.add(new InviteCommand()); - commands.add(new AcceptCommand()); - commands.add(new DenyCommand()); - commands.add(new KickCommand()); - commands.add(new BanCommand()); - commands.add(new PardonCommand()); - commands.add(new MuteCommand()); - commands.add(new UnmuteCommand()); - commands.add(new InfoCommand()); - commands.add(new LogCommand()); - commands.add(new CreateCommand()); - commands.add(new RemoveCommand()); - commands.add(new FormatCommand()); - commands.add(new ModeratorCommand()); - commands.add(new ModCommand()); - commands.add(new OptionCommand()); - commands.add(new TemplateCommand()); - commands.add(new CheckCommand()); - commands.add(new SetCommand()); - helpCommand = new HelpCommand(commands); - commands.add(helpCommand); - - commonCommands = new ArrayList(); - commonCommands.add(new HideCommand()); - commonCommands.add(new UnhideCommand()); - commonCommands.add(new DictionaryCommand()); - commonCommands.add(new DicCommand()); - commonCommands.add(new ReloadCommand()); - } - - /** - * @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) { - - // チャンネルチャットが無効でも利用できるコマンドはここで処理する - // (hide, unhide, dic, dictionary, reload) - if ( args.length >= 1 ) { - for ( SubCommandAbst c : commonCommands ) { - if ( c.getCommandName().equalsIgnoreCase(args[0]) ) { - - // パーミッションの確認 - String node = c.getPermissionNode(); - if ( !sender.hasPermission(node) ) { - sendResourceMessage(sender, PREERR, "errmsgPermission", node); - return true; - } - - // 実行 - return c.runCommand(sender, label, args); - } - } - } - - // チャンネルチャット機能が無効になっている場合は、メッセージを表示して終了 - if ( !LunaChat.getInstance().getLunaChatConfig().isEnableChannelChat() - && !sender.isOp() ) { - sendResourceMessage(sender, PREERR, "errmsgChannelChatDisabled"); - return true; - } - - // 引数なしは、ヘルプを表示 - if (args.length == 0) { - helpCommand.runCommand(sender, label, args); - return true; - } - - // 第1引数に指定されたコマンドを実行する - for ( SubCommandAbst c : commands ) { - if ( c.getCommandName().equalsIgnoreCase(args[0]) ) { - - // パーミッションの確認 - String node = c.getPermissionNode(); - if ( !sender.hasPermission(node) ) { - sendResourceMessage(sender, PREERR, "errmsgPermission", node); - return true; - } - - // 実行 - return c.runCommand(sender, label, args); - } - } - - // 第1引数がコマンドでないなら、joinが指定されたとみなす - String node = joinCommand.getPermissionNode(); - if ( !sender.hasPermission(node) ) { - sendResourceMessage(sender, PREERR, "errmsgPermission", node); - return true; - } - - return joinCommand.runCommand(sender, label, args); - } - - /** - * TABキー補完が実行されたときに呼び出されるメソッド - * @param sender TABキー補完の実行者 - * @param command 実行されたコマンド - * @param label 実行されたコマンドのラベル - * @param args 実行されたコマンドの引数 - * @return 補完候補 - */ - public List onTabComplete( - CommandSender sender, Command command, String label, String[] args) { - - if ( args.length == 1 ) { - // コマンド名で補完する - String arg = args[0].toLowerCase(); - ArrayList coms = new ArrayList(); - for ( SubCommandAbst c : commands ) { - if ( c.getCommandName().startsWith(arg) && - sender.hasPermission(c.getPermissionNode()) ) { - coms.add(c.getCommandName()); - } - } - for ( SubCommandAbst c : commonCommands ) { - if ( c.getCommandName().startsWith(arg) && - sender.hasPermission(c.getPermissionNode()) ) { - coms.add(c.getCommandName()); - } - } - return coms; - - } else if ( args.length == 2 && ( - args[0].equalsIgnoreCase("join") || - args[0].equalsIgnoreCase("info") ) ) { - // 参加可能チャンネル名で補完する - String arg = args[1].toLowerCase(); - ArrayList items = new ArrayList(); - for ( String name : getListCanJoin(sender) ) { - if ( name.toLowerCase().startsWith(arg) ) { - items.add(name); - } - } - return items; - - } else if ( args.length == 2 && ( - args[0].equalsIgnoreCase("ban") || - args[0].equalsIgnoreCase("pardon") || - args[0].equalsIgnoreCase("kick") || - args[0].equalsIgnoreCase("mute") || - args[0].equalsIgnoreCase("unmute") ) ) { - // プレイヤー名で補完する - String arg = args[1].toLowerCase(); - ArrayList items = new ArrayList(); - for ( Player player : Utility.getOnlinePlayers() ) { - String pname = player.getName(); - pname = pname == null ? "" : pname.toLowerCase(); - if ( pname.startsWith(arg) ) { - items.add(player.getName()); - } - } - return items; - - } else if ( args.length == 3 && ( - args[0].equalsIgnoreCase("ban") || - args[0].equalsIgnoreCase("pardon") || - args[0].equalsIgnoreCase("kick") || - args[0].equalsIgnoreCase("mute") || - args[0].equalsIgnoreCase("unmute") ) ) { - // チャンネル名で補完する - String arg = args[2].toLowerCase(); - ArrayList items = new ArrayList(); - for ( String name : getListCanJoin(sender) ) { - if ( name.toLowerCase().startsWith(arg) ) { - items.add(name); - } - } - return items; - - } else if ( args.length == 2 && ( - args[0].equalsIgnoreCase("hide") || - args[0].equalsIgnoreCase("unhide") ) ) { - - // 参加可能チャンネル名とプレイヤー名と - // 文字列"player", "channel"で補完する - String arg = args[1].toLowerCase(); - ArrayList items = new ArrayList(); - for ( String name : getListCanJoin(sender) ) { - if ( name.toLowerCase().startsWith(arg) ) { - items.add(name); - } - } - for ( Player player : Utility.getOnlinePlayers() ) { - String pname = player.getName(); - pname = pname == null ? "" : pname.toLowerCase(); - if ( pname.startsWith(arg) ) { - items.add(player.getName()); - } - } - if ( "player".startsWith(arg) ) { - items.add("player"); - } - if ( "channel".startsWith(arg) ) { - items.add("channel"); - } - return items; - - } else if ( args.length == 3 && - (args[0].equalsIgnoreCase("hide") || - args[0].equalsIgnoreCase("unhide") ) && - args[1].equalsIgnoreCase("player") ) { - - // プレイヤー名で補完する - String arg = args[2].toLowerCase(); - ArrayList items = new ArrayList(); - for ( Player player : Utility.getOnlinePlayers() ) { - String pname = player.getName(); - pname = pname == null ? "" : pname.toLowerCase(); - if ( pname.startsWith(arg) ) { - items.add(player.getName()); - } - } - return items; - - } else if ( args.length == 3 && - (args[0].equalsIgnoreCase("hide") || - args[0].equalsIgnoreCase("unhide") ) && - args[1].equalsIgnoreCase("channel") ) { - - // チャンネル名で補完する - String arg = args[2].toLowerCase(); - ArrayList items = new ArrayList(); - for ( String name : getListCanJoin(sender) ) { - if ( name.toLowerCase().startsWith(arg) ) { - items.add(name); - } - } - return items; - - } else if ( args.length == 2 && args[0].equalsIgnoreCase("remove") ) { - // 削除可能チャンネル名で補完する - String arg = args[1].toLowerCase(); - ArrayList items = new ArrayList(); - for ( String name : getListCanRemove(sender) ) { - if ( name.toLowerCase().startsWith(arg) ) { - items.add(name); - } - } - return items; - - } else if ( args.length == 2 && - (args[0].equalsIgnoreCase("dic") || args[0].equalsIgnoreCase("dictionary")) ) { - // add、remove、viewで補完する - String arg = args[1].toLowerCase(); - ArrayList items = new ArrayList(); - for ( String name : new String[]{"add", "remove", "view"} ) { - if ( name.toLowerCase().startsWith(arg) ) { - items.add(name); - } - } - return items; - - } else if ( args.length == 3 && - (args[0].equalsIgnoreCase("dic") || args[0].equalsIgnoreCase("dictionary")) && - args[1].equalsIgnoreCase("remove") ) { - // 辞書に登録されているワードで補完する - String arg = args[2].toLowerCase(); - ArrayList items = new ArrayList(); - for ( String name : - LunaChat.getInstance().getLunaChatAPI().getAllDictionary().keySet() ) { - if ( name.toLowerCase().startsWith(arg) ) { - items.add(name); - } - } - return items; - - } else if ( args.length == 2 && - args[0].equalsIgnoreCase("set") ) { - // "default" で補完する - String arg = args[1].toLowerCase(); - ArrayList items = new ArrayList(); - if ( "default".startsWith(arg) ) { - items.add("default"); - } - return items; - - } else if ( args.length == 3 && - args[0].equalsIgnoreCase("set") && args[1].equalsIgnoreCase("default") ) { - // プレイヤー名で補完する - String arg = args[2].toLowerCase(); - ArrayList items = new ArrayList(); - for ( Player player : Utility.getOnlinePlayers() ) { - String pname = player.getName(); - pname = pname == null ? "" : pname.toLowerCase(); - if ( pname.startsWith(arg) ) { - items.add(player.getName()); - } - } - return items; - - } else if ( args.length == 4 && - args[0].equalsIgnoreCase("set") && args[1].equalsIgnoreCase("default") ) { - // チャンネル名で補完する - String arg = args[3].toLowerCase(); - ArrayList items = new ArrayList(); - for ( String name : getListCanJoin(sender) ) { - if ( name.toLowerCase().startsWith(arg) ) { - items.add(name); - } - } - return items; - - } - return null; - } - - /** - * メッセージリソースのメッセージを、カラーコード置き換えしつつ、senderに送信する - * - * @param sender メッセージの送り先 - * @param pre プレフィックス - * @param key リソースキー - * @param args リソース内の置き換え対象キーワード - */ - 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); - } - - /** - * TAB補完用の参加可能チャンネルリストを返す - * @param sender コマンド実行者 - * @return リスト - */ - private ArrayList getListCanJoin(CommandSender sender) { - - ArrayList items = new ArrayList(); - ChannelPlayer cp = ChannelPlayer.getChannelPlayer(sender); - - for ( Channel channel : LunaChat.getInstance().getLunaChatAPI().getChannels() ) { - - // BANされているチャンネルは対象外 - if ( channel.getBanned().contains(cp) ) { - continue; - } - - // 個人チャットは対象外 - if ( channel.isPersonalChat() ) { - continue; - } - - // 未参加で visible=false のチャンネルは対象外 - if ( sender instanceof Player && - !channel.getMembers().contains(cp) && - !channel.isGlobalChannel() && - !channel.isVisible() ) { - continue; - } - - items.add(channel.getName()); - } - - return items; - } - - /** - * TAB補完用の削除可能チャンネルリストを返す - * @param sender コマンド実行者 - * @return リスト - */ - private ArrayList getListCanRemove(CommandSender sender) { - - ArrayList items = new ArrayList(); - - for ( Channel channel : LunaChat.getInstance().getLunaChatAPI().getChannels() ) { - - // 実行者がチャンネルモデレーターでない場合は対象外 - if ( !channel.hasModeratorPermission(sender) ) { - continue; - } - - // 個人チャットは対象外 - if ( channel.isPersonalChat() ) { - continue; - } - - // グローバルチャンネルは対象外 - if ( channel.isGlobalChannel() ) { - continue; - } - - items.add(channel.getName()); - } - - return items; - } -} +/* + * @author ucchy + * @license LGPLv3 + * @copyright Copyright ucchy 2020 + */ +package com.github.ucchyocean.lc3.command; + +import java.util.ArrayList; +import java.util.List; + +import com.github.ucchyocean.lc3.LunaChat; +import com.github.ucchyocean.lc3.Messages; +import com.github.ucchyocean.lc3.channel.Channel; +import com.github.ucchyocean.lc3.member.ChannelMember; + +/** + * Lunachatコマンドの処理クラス + * @author ucchy + */ +public class LunaChatCommand { + + private ArrayList commands; + private ArrayList commonCommands; + private JoinCommand joinCommand; + private HelpCommand helpCommand; + + /** + * コンストラクタ + */ + public LunaChatCommand() { + + commands = new ArrayList(); + joinCommand = new JoinCommand(); + commands.add(joinCommand); + commands.add(new LeaveCommand()); + commands.add(new ListCommand()); + commands.add(new InviteCommand()); + commands.add(new AcceptCommand()); + commands.add(new DenyCommand()); + commands.add(new KickCommand()); + commands.add(new BanCommand()); + commands.add(new PardonCommand()); + commands.add(new MuteCommand()); + commands.add(new UnmuteCommand()); + commands.add(new InfoCommand()); + commands.add(new LogCommand()); + commands.add(new CreateCommand()); + commands.add(new RemoveCommand()); + commands.add(new FormatCommand()); + commands.add(new ModeratorCommand()); + commands.add(new ModCommand()); + commands.add(new OptionCommand()); + commands.add(new TemplateCommand()); + commands.add(new SetCommand()); + helpCommand = new HelpCommand(commands); + commands.add(helpCommand); + + commonCommands = new ArrayList(); + commonCommands.add(new HideCommand()); + commonCommands.add(new UnhideCommand()); + commonCommands.add(new DictionaryCommand()); + commonCommands.add(new DicCommand()); + commonCommands.add(new ReloadCommand()); + } + + /** + * コマンドを実行したときに呼び出されるメソッド + * @param sender 実行者 + * @param label 実行されたコマンドのラベル + * @param args 実行されたコマンドの引数 + * @return 実行したかどうか(falseを返した場合、サーバーがUsageを表示する) + */ + public boolean execute(ChannelMember sender, String label, String[] args) { + + // チャンネルチャットが無効でも利用できるコマンドはここで処理する + // (hide, unhide, dic, dictionary, reload) + if ( args.length >= 1 ) { + for ( LunaChatSubCommand c : commonCommands ) { + if ( c.getCommandName().equalsIgnoreCase(args[0]) ) { + + // パーミッションの確認 + String node = c.getPermissionNode(); + if ( !sender.hasPermission(node) ) { + sender.sendMessage(Messages.errmsgPermission(node)); + return true; + } + + // 実行 + return c.runCommand(sender, label, args); + } + } + } + + // チャンネルチャット機能が無効になっている場合は、メッセージを表示して終了 + if ( !LunaChat.getConfig().isEnableChannelChat() + && !sender.hasPermission("lunachat-admin") ) { + sender.sendMessage(Messages.errmsgChannelChatDisabled()); + return true; + } + + // 引数なしは、ヘルプを表示 + if (args.length == 0) { + helpCommand.runCommand(sender, label, args); + return true; + } + + // 第1引数に指定されたコマンドを実行する + for ( LunaChatSubCommand c : commands ) { + if ( c.getCommandName().equalsIgnoreCase(args[0]) ) { + + // パーミッションの確認 + String node = c.getPermissionNode(); + if ( !sender.hasPermission(node) ) { + sender.sendMessage(Messages.errmsgPermission(node)); + return true; + } + + // 実行 + return c.runCommand(sender, label, args); + } + } + + // 第1引数がコマンドでないなら、joinが指定されたとみなす + String node = joinCommand.getPermissionNode(); + if ( !sender.hasPermission(node) ) { + sender.sendMessage(Messages.errmsgPermission(node)); + return true; + } + + return joinCommand.runCommand(sender, label, args); + } + + /** + * TABキー補完が実行されたときに呼び出されるメソッド + * @param sender TABキー補完の実行者 + * @param label 実行されたコマンドのラベル + * @param args 実行されたコマンドの引数 + * @return 補完候補 + */ + public List onTabComplete(ChannelMember sender, String label, String[] args) { + if ( args.length == 1 ) { + // コマンド名で補完する + String arg = args[0].toLowerCase(); + ArrayList coms = new ArrayList(); + for ( LunaChatSubCommand c : commands ) { + if ( c.getCommandName().startsWith(arg) && + sender.hasPermission(c.getPermissionNode()) ) { + coms.add(c.getCommandName()); + } + } + for ( LunaChatSubCommand c : commonCommands ) { + if ( c.getCommandName().startsWith(arg) && + sender.hasPermission(c.getPermissionNode()) ) { + coms.add(c.getCommandName()); + } + } + return coms; + + } else if ( args.length == 2 && ( + args[0].equalsIgnoreCase("join") || + args[0].equalsIgnoreCase("info") ) ) { + // 参加可能チャンネル名で補完する + String arg = args[1].toLowerCase(); + ArrayList items = new ArrayList(); + for ( String name : getListCanJoin(sender) ) { + if ( name.toLowerCase().startsWith(arg) ) { + items.add(name); + } + } + return items; + + } else if ( args.length == 2 && ( + args[0].equalsIgnoreCase("ban") || + args[0].equalsIgnoreCase("pardon") || + args[0].equalsIgnoreCase("kick") || + args[0].equalsIgnoreCase("mute") || + args[0].equalsIgnoreCase("unmute") ) ) { + // プレイヤー名で補完する + String arg = args[1].toLowerCase(); + return getListPlayerNames(arg); + + } else if ( args.length == 3 && ( + args[0].equalsIgnoreCase("ban") || + args[0].equalsIgnoreCase("pardon") || + args[0].equalsIgnoreCase("kick") || + args[0].equalsIgnoreCase("mute") || + args[0].equalsIgnoreCase("unmute") ) ) { + // チャンネル名で補完する + String arg = args[2].toLowerCase(); + ArrayList items = new ArrayList(); + for ( String name : getListCanJoin(sender) ) { + if ( name.toLowerCase().startsWith(arg) ) { + items.add(name); + } + } + return items; + + } else if ( args.length == 2 && ( + args[0].equalsIgnoreCase("hide") || + args[0].equalsIgnoreCase("unhide") ) ) { + + // 参加可能チャンネル名とプレイヤー名と + // 文字列"player", "channel"で補完する + String arg = args[1].toLowerCase(); + ArrayList items = new ArrayList(); + for ( String name : getListCanJoin(sender) ) { + if ( name.toLowerCase().startsWith(arg) ) { + items.add(name); + } + } + items.addAll(getListPlayerNames(arg)); + if ( "player".startsWith(arg) ) { + items.add("player"); + } + if ( "channel".startsWith(arg) ) { + items.add("channel"); + } + return items; + + } else if ( args.length == 3 && + (args[0].equalsIgnoreCase("hide") || + args[0].equalsIgnoreCase("unhide") ) && + args[1].equalsIgnoreCase("player") ) { + + // プレイヤー名で補完する + String arg = args[2].toLowerCase(); + return getListPlayerNames(arg); + + } else if ( args.length == 3 && + (args[0].equalsIgnoreCase("hide") || + args[0].equalsIgnoreCase("unhide") ) && + args[1].equalsIgnoreCase("channel") ) { + + // チャンネル名で補完する + String arg = args[2].toLowerCase(); + return getListPlayerNames(arg); + + } else if ( args.length == 2 && args[0].equalsIgnoreCase("remove") ) { + // 削除可能チャンネル名で補完する + String arg = args[1].toLowerCase(); + ArrayList items = new ArrayList(); + for ( String name : getListCanRemove(sender) ) { + if ( name.toLowerCase().startsWith(arg) ) { + items.add(name); + } + } + return items; + + } else if ( args.length == 2 && + (args[0].equalsIgnoreCase("dic") || args[0].equalsIgnoreCase("dictionary")) ) { + // add、remove、viewで補完する + String arg = args[1].toLowerCase(); + ArrayList items = new ArrayList(); + for ( String name : new String[]{"add", "remove", "view"} ) { + if ( name.toLowerCase().startsWith(arg) ) { + items.add(name); + } + } + return items; + + } else if ( args.length == 3 && + (args[0].equalsIgnoreCase("dic") || args[0].equalsIgnoreCase("dictionary")) && + args[1].equalsIgnoreCase("remove") ) { + // 辞書に登録されているワードで補完する + String arg = args[2].toLowerCase(); + ArrayList items = new ArrayList(); + for ( String name : + LunaChat.getAPI().getAllDictionary().keySet() ) { + if ( name.toLowerCase().startsWith(arg) ) { + items.add(name); + } + } + return items; + + } else if ( args.length == 2 && + args[0].equalsIgnoreCase("set") ) { + // "default" で補完する + String arg = args[1].toLowerCase(); + ArrayList items = new ArrayList(); + if ( "default".startsWith(arg) ) { + items.add("default"); + } + return items; + + } else if ( args.length == 3 && + args[0].equalsIgnoreCase("set") && args[1].equalsIgnoreCase("default") ) { + // プレイヤー名で補完する + String arg = args[2].toLowerCase(); + return getListPlayerNames(arg); + + } else if ( args.length == 4 && + args[0].equalsIgnoreCase("set") && args[1].equalsIgnoreCase("default") ) { + // チャンネル名で補完する + String arg = args[3].toLowerCase(); + ArrayList items = new ArrayList(); + for ( String name : getListCanJoin(sender) ) { + if ( name.toLowerCase().startsWith(arg) ) { + items.add(name); + } + } + return items; + + } + return new ArrayList(); + } + + /** + * TAB補完用の参加可能チャンネルリストを返す + * @param sender コマンド実行者 + * @return リスト + */ + protected ArrayList getListCanJoin(ChannelMember sender) { + + ArrayList items = new ArrayList(); + + for ( Channel channel : LunaChat.getAPI().getChannels() ) { + + // BANされているチャンネルは対象外 + if ( channel.getBanned().contains(sender) ) { + continue; + } + + // 個人チャットは対象外 + if ( channel.isPersonalChat() ) { + continue; + } + + // 未参加で visible=false のチャンネルは対象外 + if ( !channel.getMembers().contains(sender) && + !channel.isGlobalChannel() && !channel.isVisible() ) { + continue; + } + + items.add(channel.getName()); + } + + return items; + } + + /** + * TAB補完用の削除可能チャンネルリストを返す + * @param sender コマンド実行者 + * @return リスト + */ + protected ArrayList getListCanRemove(ChannelMember sender) { + + ArrayList items = new ArrayList(); + + for ( Channel channel : LunaChat.getAPI().getChannels() ) { + + // 実行者がチャンネルモデレーターでない場合は対象外 + if ( !channel.hasModeratorPermission(sender) ) { + continue; + } + + // 個人チャットは対象外 + if ( channel.isPersonalChat() ) { + continue; + } + + // グローバルチャンネルは対象外 + if ( channel.isGlobalChannel() ) { + continue; + } + + items.add(channel.getName()); + } + + return items; + } + + /** + * オンラインプレイヤーのうち、プレイヤー名が指定された文字列と前方一致するものをリストにして返す + * @param pre 検索キー + * @return プレイヤー名リスト + */ + private List getListPlayerNames(String pre) { + String prefix = pre.toLowerCase(); + List items = new ArrayList(); + for ( String pname : LunaChat.getPlugin().getOnlinePlayerNames() ) { + if ( pname.toLowerCase().startsWith(prefix) ) { + items.add(pname); + } + } + return items; + } +} diff --git a/src/main/java/com/github/ucchyocean/lc3/command/LunaChatJapanizeCommand.java b/src/main/java/com/github/ucchyocean/lc3/command/LunaChatJapanizeCommand.java new file mode 100644 index 00000000..ab6ba3b6 --- /dev/null +++ b/src/main/java/com/github/ucchyocean/lc3/command/LunaChatJapanizeCommand.java @@ -0,0 +1,92 @@ +/* + * @author ucchy + * @license LGPLv3 + * @copyright Copyright ucchy 2020 + */ +package com.github.ucchyocean.lc3.command; + +import com.github.ucchyocean.lc3.LunaChat; +import com.github.ucchyocean.lc3.LunaChatAPI; +import com.github.ucchyocean.lc3.Messages; +import com.github.ucchyocean.lc3.member.ChannelMember; + +/** + * Japanize変換設定コマンド + * @author ucchy + */ +public class LunaChatJapanizeCommand { + + private static final String PERM_JAPANIZE_OTHER = "lunachat-admin.japanize-other"; + + /** + * コマンドを実行したときに呼び出されるメソッド + * @param sender 実行者 + * @param label 実行されたコマンドのラベル + * @param args 実行されたコマンドの引数 + * @return 実行したかどうか(falseを返した場合、サーバーがUsageを表示する) + */ + public boolean execute(ChannelMember sender, String label, String[] args) { + + if ( args.length == 1 && + (args[0].equalsIgnoreCase("on") || args[0].equalsIgnoreCase("off")) ) { + // japanize on/off の実行 + + // プレイヤーでなければ終了する +// if (!(sender instanceof Player)) { +// sender.sendMessage(Messages.errmsgIngame()); +// return true; +// } +// Player player = (Player)sender; + + // Japanize設定をon/offにする + boolean value = args[0].equalsIgnoreCase("on"); + LunaChatAPI api = LunaChat.getAPI(); + api.setPlayersJapanize(sender.getName(), value); + + sender.sendMessage(Messages.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) ) { + sender.sendMessage(Messages.errmsgNotPermission(PERM_JAPANIZE_OTHER)); + return true; + } + + // 指定されたプレイヤーが存在するかチェック + ChannelMember target = ChannelMember.getChannelMember(args[0]); + if ( target == null || !target.isOnline() ) { + sender.sendMessage(Messages.errmsgNotfoundPlayer(args[0])); + return true; + } + + // Japanize設定をon/offにする + boolean value = args[1].equalsIgnoreCase("on"); + LunaChatAPI api = LunaChat.getAPI(); + api.setPlayersJapanize(target.getName(), value); + + target.sendMessage(Messages.cmdmsgPlayerJapanize(args[1])); + sender.sendMessage(Messages.cmdmsgPlayerJapanizeOther(args[0], args[1])); + return true; + } + + // usageを表示して終了する + printUsage(sender, label); + return true; + } + + /** + * コマンドの使い方を senderに送る + * @param sender + * @param label + */ + private void printUsage(ChannelMember sender, String label) { + sender.sendMessage(Messages.usageJapanize(label)); + if ( sender.hasPermission(PERM_JAPANIZE_OTHER) ) { + sender.sendMessage(Messages.usageJapanizeOther(label)); + } + } +} diff --git a/src/main/java/com/github/ucchyocean/lc3/command/LunaChatMessageCommand.java b/src/main/java/com/github/ucchyocean/lc3/command/LunaChatMessageCommand.java new file mode 100644 index 00000000..c90447c5 --- /dev/null +++ b/src/main/java/com/github/ucchyocean/lc3/command/LunaChatMessageCommand.java @@ -0,0 +1,115 @@ +/* + * @author ucchy + * @license LGPLv3 + * @copyright Copyright ucchy 2020 + */ +package com.github.ucchyocean.lc3.command; + +import com.github.ucchyocean.lc3.LunaChat; +import com.github.ucchyocean.lc3.LunaChatAPI; +import com.github.ucchyocean.lc3.Messages; +import com.github.ucchyocean.lc3.channel.Channel; +import com.github.ucchyocean.lc3.member.ChannelMember; + +/** + * 1:1チャット送信コマンド + * @author ucchy + */ +public class LunaChatMessageCommand { + + /** + * コマンドを実行したときに呼び出されるメソッド + * @param sender 実行者 + * @param label 実行されたコマンドのラベル + * @param args 実行されたコマンドの引数 + * @return 実行したかどうか(falseを返した場合、サーバーがUsageを表示する) + */ + public boolean execute(ChannelMember sender, String label, String[] args) { + + // senderからChannelMemberを作成する + ChannelMember inviter = ChannelMember.getChannelMember(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); + } + + // メッセージがあるなら送信する + 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(ChannelMember sender, String label) { + sender.sendMessage(Messages.usageMessage(label)); + } +} diff --git a/src/main/java/com/github/ucchyocean/lc3/command/LunaChatReplyCommand.java b/src/main/java/com/github/ucchyocean/lc3/command/LunaChatReplyCommand.java new file mode 100644 index 00000000..ce0d5a36 --- /dev/null +++ b/src/main/java/com/github/ucchyocean/lc3/command/LunaChatReplyCommand.java @@ -0,0 +1,60 @@ +/* + * @author ucchy + * @license LGPLv3 + * @copyright Copyright ucchy 2020 + */ +package com.github.ucchyocean.lc3.command; + +import com.github.ucchyocean.lc3.Messages; +import com.github.ucchyocean.lc3.member.ChannelMember; + +/** + * 1:1チャット受信コマンド + * @author ucchy + */ +public class LunaChatReplyCommand extends LunaChatMessageCommand { + + /** + * コマンドを実行したときに呼び出されるメソッド + * @param sender 実行者 + * @param label 実行されたコマンドのラベル + * @param args 実行されたコマンドの引数 + * @return 実行したかどうか(falseを返した場合、サーバーがUsageを表示する) + * @see com.github.ucchyocean.lc3.command.LunaChatMessageCommand#execute(com.github.ucchyocean.lc3.member.ChannelMember, java.lang.String, java.lang.String[]) + */ + @Override + public boolean execute(ChannelMember sender, String label, String[] args) { + + // senderからChannelMemberを作成する + ChannelMember inviter = ChannelMember.getChannelMember(sender); + + // 会話相手を履歴から取得する + String invitedName = DataMaps.privateMessageMap.get(inviter.getName()); + + // 引数が無ければ、現在の会話相手を表示して終了する + if (args.length == 0) { + if ( invitedName == null ) { + sender.sendMessage(Messages.cmdmsgReplyInviterNone(inviter.getName())); + } else { + sender.sendMessage(Messages.cmdmsgReplyInviter(inviter.getName(), invitedName)); + } + return true; + } + + // 会話相手がからっぽなら、コマンドを終了する。 + if ( invitedName == null ) { + sender.sendMessage(Messages.errmsgNotfoundPM()); + return true; + } + + // メッセージを取得する + StringBuilder message = new StringBuilder(); + for ( int i=0; i moderator = new ArrayList(); - if ( player != null && args.length >= 2 ) { - Channel def = api.getDefaultChannel(player.getName()); + if ( args.length >= 2 ) { + Channel def = api.getDefaultChannel(sender.getName()); if ( def != null ) { cname = def.getName(); } @@ -100,7 +92,7 @@ public boolean runCommand( moderator.add(args[i]); } } else { - sendResourceMessage(sender, PREERR, "errmsgCommand"); + sender.sendMessage(Messages.errmsgCommand()); return true; } @@ -108,7 +100,7 @@ public boolean runCommand( // チャンネルが存在するかどうかをチェックする if ( channel == null ) { - sendResourceMessage(sender, PREERR, "errmsgNotExist"); + sender.sendMessage(Messages.errmsgNotExist()); return true; } @@ -116,14 +108,13 @@ public boolean runCommand( // モデレーターかどうか確認する if ( !channel.hasModeratorPermission(sender) ) { - sendResourceMessage(sender, PREERR, "errmsgNotModerator"); + sender.sendMessage(Messages.errmsgNotModerator()); return true; } // グローバルチャンネルなら設定できない if ( channel.isGlobalChannel() ) { - sendResourceMessage(sender, PREERR, - "errmsgCannotModeratorGlobal", channel.getName()); + sender.sendMessage(Messages.errmsgCannotModeratorGlobal(channel.getName())); return true; } @@ -131,15 +122,13 @@ public boolean runCommand( for ( String mod : moderator ) { if ( mod.startsWith("-") ) { String name = mod.substring(1); - ChannelPlayer cp = ChannelPlayer.getChannelPlayer(name); + ChannelMember cp = ChannelMember.getChannelMember(name); channel.removeModerator(cp); - sendResourceMessage(sender, PREINFO, - "cmdmsgModeratorMinus", name, cname); + sender.sendMessage(Messages.cmdmsgModeratorMinus(name, cname)); } else { - ChannelPlayer cp = ChannelPlayer.getChannelPlayer(mod); + ChannelMember cp = ChannelMember.getChannelMember(mod); channel.addModerator(cp); - sendResourceMessage(sender, PREINFO, - "cmdmsgModerator", mod, cname); + sender.sendMessage(Messages.cmdmsgModerator(mod, cname)); } } diff --git a/src/main/java/com/github/ucchyocean/lc/command/MuteCommand.java b/src/main/java/com/github/ucchyocean/lc3/command/MuteCommand.java similarity index 59% rename from src/main/java/com/github/ucchyocean/lc/command/MuteCommand.java rename to src/main/java/com/github/ucchyocean/lc3/command/MuteCommand.java index 2f4cbf26..e9b64921 100644 --- a/src/main/java/com/github/ucchyocean/lc/command/MuteCommand.java +++ b/src/main/java/com/github/ucchyocean/lc3/command/MuteCommand.java @@ -1,31 +1,27 @@ /* * @author ucchy * @license LGPLv3 - * @copyright Copyright ucchy 2013 + * @copyright Copyright ucchy 2020 */ -package com.github.ucchyocean.lc.command; +package com.github.ucchyocean.lc3.command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import com.github.ucchyocean.lc.channel.Channel; -import com.github.ucchyocean.lc.channel.ChannelPlayer; +import com.github.ucchyocean.lc3.Messages; +import com.github.ucchyocean.lc3.channel.Channel; +import com.github.ucchyocean.lc3.member.ChannelMember; /** * muteコマンドの実行クラス * @author ucchy */ -public class MuteCommand extends SubCommandAbst { +public class MuteCommand extends LunaChatSubCommand { private static final String COMMAND_NAME = "mute"; private static final String PERMISSION_NODE = "lunachat." + COMMAND_NAME; - private static final String USAGE_KEY1 = "usageMute"; - private static final String USAGE_KEY2 = "usageMute2"; /** * コマンドを取得します。 * @return コマンド - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandName() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandName() */ @Override public String getCommandName() { @@ -35,7 +31,7 @@ public String getCommandName() { /** * パーミッションノードを取得します。 * @return パーミッションノード - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getPermissionNode() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getPermissionNode() */ @Override public String getPermissionNode() { @@ -45,7 +41,7 @@ public String getPermissionNode() { /** * コマンドの種別を取得します。 * @return コマンド種別 - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandType() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandType() */ @Override public CommandType getCommandType() { @@ -56,13 +52,13 @@ public CommandType getCommandType() { * 使用方法に関するメッセージをsenderに送信します。 * @param sender コマンド実行者 * @param label 実行ラベル - * @see com.github.ucchyocean.lc.command.SubCommandAbst#sendUsageMessage() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#sendUsageMessage() */ @Override public void sendUsageMessage( - CommandSender sender, String label) { - sendResourceMessage(sender, "", USAGE_KEY1, label); - sendResourceMessage(sender, "", USAGE_KEY2, label); + ChannelMember sender, String label) { + sender.sendMessage(Messages.usageMute(label)); + sender.sendMessage(Messages.usageMute2(label)); } /** @@ -71,18 +67,18 @@ public void sendUsageMessage( * @param label 実行ラベル * @param args 実行時の引数 * @return コマンドが実行されたかどうか - * @see com.github.ucchyocean.lc.command.SubCommandAbst#runCommand(java.lang.String[]) + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#runCommand(java.lang.String[]) */ @Override public boolean runCommand( - CommandSender sender, String label, String[] args) { + ChannelMember sender, String label, String[] args) { // 実行引数から、Muteするユーザーを取得する String kickedName = ""; if (args.length >= 2) { kickedName = args[1]; } else { - sendResourceMessage(sender, PREERR, "errmsgCommand"); + sender.sendMessage(Messages.errmsgCommand()); return true; } @@ -92,31 +88,30 @@ public boolean runCommand( if (args.length >= 3) { channel = api.getChannel(args[2]); isSpecifiedChannel = true; - } else if (sender instanceof Player) { - Player kicker = (Player) sender; - channel = api.getDefaultChannel(kicker.getName()); + } else { + channel = api.getDefaultChannel(sender.getName()); } if (channel == null) { - sendResourceMessage(sender, PREERR, "errmsgNoJoin"); + sender.sendMessage(Messages.errmsgNoJoin()); return true; } // モデレーターかどうか確認する if ( !channel.hasModeratorPermission(sender) ) { - sendResourceMessage(sender, PREERR, "errmsgNotModerator"); + sender.sendMessage(Messages.errmsgNotModerator()); return true; } // Muteされるプレイヤーがメンバーかどうかチェックする - ChannelPlayer kicked = ChannelPlayer.getChannelPlayer(kickedName); + ChannelMember kicked = ChannelMember.getChannelMember(kickedName); if (!channel.getMembers().contains(kicked)) { - sendResourceMessage(sender, PREERR, "errmsgNomemberOther"); + sender.sendMessage(Messages.errmsgNomemberOther()); return true; } // 既にMuteされているかどうかチェックする if (channel.getMuted().contains(kicked)) { - sendResourceMessage(sender, PREERR, "errmsgAlreadyMuted"); + sender.sendMessage(Messages.errmsgAlreadyMuted()); return true; } @@ -124,12 +119,12 @@ public boolean runCommand( int expireMinutes = -1; if (args.length >= 3 && !isSpecifiedChannel) { if ( !args[2].matches("[0-9]+") ) { - sendResourceMessage(sender, PREERR, "errmsgInvalidMuteExpireParameter"); + sender.sendMessage(Messages.errmsgInvalidMuteExpireParameter()); return true; } expireMinutes = Integer.parseInt(args[2]); if ( expireMinutes < 1 || 43200 < expireMinutes ) { - sendResourceMessage(sender, PREERR, "errmsgInvalidMuteExpireParameter"); + sender.sendMessage(Messages.errmsgInvalidMuteExpireParameter()); return true; } } @@ -144,25 +139,26 @@ public boolean runCommand( // senderに通知メッセージを出す if ( expireMinutes != -1 ) { - sendResourceMessage(sender, PREINFO, - "cmdmsgMuteWithExpire", kickedName, channel.getName(), expireMinutes); + sender.sendMessage(Messages.cmdmsgMuteWithExpire( + kickedName, channel.getName(), expireMinutes)); } else { - sendResourceMessage(sender, PREINFO, - "cmdmsgMute", kickedName, channel.getName()); + sender.sendMessage(Messages.cmdmsgMute(kickedName, channel.getName())); } // チャンネルに通知メッセージを出す if ( expireMinutes != -1 ) { - sendResourceMessageWithKeyword(channel, - "muteWithExpireMessage", kicked, expireMinutes); + channel.sendSystemMessage(Messages.muteWithExpireMessage( + channel.getColorCode(), channel.getName(), kicked.getName(), expireMinutes), + true, "system"); } else { - sendResourceMessageWithKeyword(channel, "muteMessage", kicked); + channel.sendSystemMessage(Messages.muteMessage( + channel.getColorCode(), channel.getName(), kicked.getName()), + true, "system"); } // BANされた人に通知メッセージを出す if ( kicked != null ) { - sendResourceMessage(kicked, PREINFO, - "cmdmsgMuted", channel.getName()); + kicked.sendMessage(Messages.cmdmsgMuted(channel.getName())); } return true; diff --git a/src/main/java/com/github/ucchyocean/lc/command/OptionCommand.java b/src/main/java/com/github/ucchyocean/lc3/command/OptionCommand.java similarity index 59% rename from src/main/java/com/github/ucchyocean/lc/command/OptionCommand.java rename to src/main/java/com/github/ucchyocean/lc3/command/OptionCommand.java index 54b9121f..d82d5b4f 100644 --- a/src/main/java/com/github/ucchyocean/lc/command/OptionCommand.java +++ b/src/main/java/com/github/ucchyocean/lc3/command/OptionCommand.java @@ -1,27 +1,27 @@ /* * @author ucchy * @license LGPLv3 - * @copyright Copyright ucchy 2013 + * @copyright Copyright ucchy 2020 */ -package com.github.ucchyocean.lc.command; +package com.github.ucchyocean.lc3.command; import java.util.ArrayList; import java.util.HashMap; +import java.util.Map; -import org.bukkit.Bukkit; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import com.github.ucchyocean.lc.Utility; -import com.github.ucchyocean.lc.channel.Channel; -import com.github.ucchyocean.lc.event.LunaChatChannelOptionChangedEvent; -import com.github.ucchyocean.lc.japanize.JapanizeType; +import com.github.ucchyocean.lc3.LunaChat; +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.JapanizeType; +import com.github.ucchyocean.lc3.member.ChannelMember; /** * optionコマンドの実行クラス * @author ucchy */ -public class OptionCommand extends SubCommandAbst { +public class OptionCommand extends LunaChatSubCommand { private static final int MAX_LENGTH_DESCRIPTION = 30; private static final int MAX_LENGTH_ALIAS = 15; @@ -29,12 +29,11 @@ public class OptionCommand extends SubCommandAbst { private static final String COMMAND_NAME = "option"; private static final String PERMISSION_NODE = "lunachat." + COMMAND_NAME; - private static final String USAGE_KEY = "usageOption"; /** * コマンドを取得します。 * @return コマンド - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandName() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandName() */ @Override public String getCommandName() { @@ -44,7 +43,7 @@ public String getCommandName() { /** * パーミッションノードを取得します。 * @return パーミッションノード - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getPermissionNode() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getPermissionNode() */ @Override public String getPermissionNode() { @@ -54,7 +53,7 @@ public String getPermissionNode() { /** * コマンドの種別を取得します。 * @return コマンド種別 - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandType() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandType() */ @Override public CommandType getCommandType() { @@ -65,12 +64,12 @@ public CommandType getCommandType() { * 使用方法に関するメッセージをsenderに送信します。 * @param sender コマンド実行者 * @param label 実行ラベル - * @see com.github.ucchyocean.lc.command.SubCommandAbst#sendUsageMessage() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#sendUsageMessage() */ @Override public void sendUsageMessage( - CommandSender sender, String label) { - sendResourceMessage(sender, "", USAGE_KEY, label); + ChannelMember sender, String label) { + sender.sendMessage(Messages.usageOption(label)); } /** @@ -79,23 +78,18 @@ public void sendUsageMessage( * @param label 実行ラベル * @param args 実行時の引数 * @return コマンドが実行されたかどうか - * @see com.github.ucchyocean.lc.command.SubCommandAbst#runCommand(java.lang.String[]) + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#runCommand(java.lang.String[]) */ @Override public boolean runCommand( - CommandSender sender, String label, String[] args) { - - Player player = null; - if (sender instanceof Player) { - player = (Player) sender; - } + ChannelMember sender, String label, String[] args) { // 引数チェック - // このコマンドは、コンソールでも実行できるが、その場合はチャンネル名を指定する必要がある + // このコマンドは、デフォルトチャンネルでない人も実行できるが、その場合はチャンネル名を指定する必要がある ArrayList optionsTemp = new ArrayList(); String cname = null; - if ( player != null && args.length >= 2 ) { - Channel def = api.getDefaultChannel(player.getName()); + if ( args.length >= 2 ) { + Channel def = api.getDefaultChannel(sender.getName()); if ( def != null ) { cname = def.getName(); } @@ -108,7 +102,7 @@ public boolean runCommand( optionsTemp.add(args[i]); } } else { - sendResourceMessage(sender, PREERR, "errmsgCommand"); + sender.sendMessage(Messages.errmsgCommand()); return true; } @@ -116,7 +110,7 @@ public boolean runCommand( // チャンネルが存在するかどうかをチェックする if ( channel == null ) { - sendResourceMessage(sender, PREERR, "errmsgNotExist"); + sender.sendMessage(Messages.errmsgNotExist()); return true; } @@ -124,12 +118,12 @@ public boolean runCommand( // モデレーターかどうか確認する if ( !channel.hasModeratorPermission(sender) ) { - sendResourceMessage(sender, PREERR, "errmsgNotModerator"); + sender.sendMessage(Messages.errmsgNotModerator()); return true; } // 指定内容を解析する - HashMap options = new HashMap(); + Map options = new HashMap(); for ( String t : optionsTemp ) { int index = t.indexOf("="); if ( index == -1 ) { @@ -138,14 +132,13 @@ public boolean runCommand( options.put(t.substring(0, index), t.substring(index + 1)); } - // イベントコール - LunaChatChannelOptionChangedEvent event = - new LunaChatChannelOptionChangedEvent(cname, sender, options); - Bukkit.getPluginManager().callEvent(event); - if ( event.isCancelled() ) { + // LunaChatChannelOptionChangedEvent イベントコール + EventResult result = LunaChat.getEventSender().sendLunaChatChannelOptionChangedEvent( + cname, sender, options); + if ( result.isCancelled() ) { return true; } - options = event.getOptions(); + options = result.getOptions(); // 設定する boolean setOption = false; @@ -155,19 +148,16 @@ public boolean runCommand( String pnode = PERMISSION_NODE + ".description"; if ( !sender.hasPermission(pnode) ) { - sendResourceMessage(sender, PREERR, - "errmsgNotPermission", pnode); + sender.sendMessage(Messages.errmsgNotPermission(pnode)); } else { String desc = options.get("description"); // チャンネル説明文は最大文字長を超えていないか確認 if ( desc.length() > MAX_LENGTH_DESCRIPTION ) { - sendResourceMessage(sender, PREERR, - "errmsgToolongDescription", MAX_LENGTH_DESCRIPTION); + sender.sendMessage(Messages.errmsgToolongDescription(MAX_LENGTH_DESCRIPTION)); } else { channel.setDescription(desc); - sendResourceMessage(sender, PREINFO, - "cmdmsgOption", "description", desc); + sender.sendMessage(Messages.cmdmsgOption("description", desc)); setOption = true; } } @@ -178,26 +168,22 @@ public boolean runCommand( String pnode = PERMISSION_NODE + ".alias"; if ( !sender.hasPermission(pnode) ) { - sendResourceMessage(sender, PREERR, - "errmsgNotPermission", pnode); + sender.sendMessage(Messages.errmsgNotPermission(pnode)); } else { String alias = options.get("alias"); if ( alias.length() > MAX_LENGTH_ALIAS ) { // チャンネル別名が最大文字長を超えている - sendResourceMessage(sender, PREERR, - "errmsgToolongAlias", MAX_LENGTH_ALIAS); + sender.sendMessage(Messages.errmsgToolongAlias(MAX_LENGTH_ALIAS)); } else if (api.getChannel(alias) != null) { // 別のチャンネル名またはチャンネル別名と重複する - sendResourceMessage(sender, PREERR, - "errmsgDuplicatedAlias", - alias, api.getChannel(alias).getName()); + sender.sendMessage(Messages.errmsgDuplicatedAlias( + alias, api.getChannel(alias).getName())); } else { channel.setAlias(alias); - sendResourceMessage(sender, PREINFO, - "cmdmsgOption", "alias", alias); + sender.sendMessage(Messages.cmdmsgOption("alias", alias)); setOption = true; } } @@ -208,22 +194,20 @@ public boolean runCommand( String pnode = PERMISSION_NODE + ".color"; if ( !sender.hasPermission(pnode) ) { - sendResourceMessage(sender, PREERR, - "errmsgNotPermission", pnode); + sender.sendMessage(Messages.errmsgNotPermission(pnode)); } else { String code = options.get("color"); + if ( Utility.isValidColor(code) ) { code = Utility.changeToColorCode(code); } - if ( Utility.isValidColorCode(code) ) { + if ( Utility.isAltColorCode(code) ) { channel.setColorCode(code); - sendResourceMessage(sender, PREINFO, - "cmdmsgOption", "color", options.get("color")); + sender.sendMessage(Messages.cmdmsgOption("color", options.get("color"))); setOption = true; } else { - sendResourceMessage(sender, PREERR, - "errmsgInvalidColorCode", options.get("color")); + sender.sendMessage(Messages.errmsgInvalidColorCode(options.get("color"))); } } } @@ -233,30 +217,25 @@ public boolean runCommand( String pnode = PERMISSION_NODE + ".broadcast"; if ( !sender.hasPermission(pnode) ) { - sendResourceMessage(sender, PREERR, - "errmsgNotPermission", pnode); + sender.sendMessage(Messages.errmsgNotPermission(pnode)); } else { String value = options.get("broadcast"); if ( value.equals("") || value.equalsIgnoreCase("false") ) { if ( channel.isGlobalChannel() ) { - sendResourceMessage(sender, PREERR, - "errmsgCannotOffGlobalBroadcast"); + sender.sendMessage(Messages.errmsgCannotOffGlobalBroadcast()); } else { channel.setBroadcast(false); - sendResourceMessage(sender, PREINFO, - "cmdmsgOption", "broadcast", "false"); + sender.sendMessage(Messages.cmdmsgOption("broadcast", "false")); setOption = true; } } else if ( value.equalsIgnoreCase("true") ) { channel.setBroadcast(true); - sendResourceMessage(sender, PREINFO, - "cmdmsgOption", "broadcast", "true"); + sender.sendMessage(Messages.cmdmsgOption("broadcast", "true")); setOption = true; } else { - sendResourceMessage(sender, PREERR, - "errmsgInvalidBooleanOption", "broadcast"); + sender.sendMessage(Messages.errmsgInvalidBooleanOption("broadcast")); } } } @@ -266,8 +245,7 @@ public boolean runCommand( String pnode = PERMISSION_NODE + ".range"; if ( !sender.hasPermission(pnode) ) { - sendResourceMessage(sender, PREERR, - "errmsgNotPermission", pnode); + sender.sendMessage(Messages.errmsgNotPermission(pnode)); } else { String value = options.get("range"); @@ -275,24 +253,20 @@ public boolean runCommand( if ( value.equals("") ) { channel.setWorldRange(false); channel.setChatRange(0); - sendResourceMessage(sender, PREINFO, - "cmdmsgOption", "range", "無効"); + sender.sendMessage(Messages.cmdmsgOption("range", "off")); setOption = true; } else if ( value.equalsIgnoreCase("world") ) { channel.setWorldRange(true); channel.setChatRange(0); - sendResourceMessage(sender, PREINFO, - "cmdmsgOption", "range", "world"); + sender.sendMessage(Messages.cmdmsgOption("range", "world")); setOption = true; } else if ( value.matches("[0-9]+") ) { channel.setWorldRange(true); channel.setChatRange(Integer.parseInt(value)); - sendResourceMessage(sender, PREINFO, - "cmdmsgOption", "range", value); + sender.sendMessage(Messages.cmdmsgOption("range", value)); setOption = true; } else { - sendResourceMessage(sender, PREERR, - "errmsgInvalidRangeOption"); + sender.sendMessage(Messages.errmsgInvalidRangeOption()); } } } @@ -302,25 +276,21 @@ public boolean runCommand( String pnode = PERMISSION_NODE + ".allowcc"; if ( !sender.hasPermission(pnode) ) { - sendResourceMessage(sender, PREERR, - "errmsgNotPermission", pnode); + sender.sendMessage(Messages.errmsgNotPermission(pnode)); } else { String value = options.get("allowcc"); if ( value.equals("") || value.equalsIgnoreCase("false") ) { channel.setAllowCC(false); - sendResourceMessage(sender, PREINFO, - "cmdmsgOption", "allowcc", "false"); + sender.sendMessage(Messages.cmdmsgOption("allowcc", "false")); setOption = true; } else if ( value.equalsIgnoreCase("true") ) { channel.setAllowCC(true); - sendResourceMessage(sender, PREINFO, - "cmdmsgOption", "allowcc", "true"); + sender.sendMessage(Messages.cmdmsgOption("allowcc", "true")); setOption = true; } else { - sendResourceMessage(sender, PREERR, - "errmsgInvalidBooleanOption", "allowcc"); + sender.sendMessage(Messages.errmsgInvalidBooleanOption("allowcc")); } } } @@ -330,26 +300,22 @@ public boolean runCommand( String pnode = PERMISSION_NODE + ".japanize"; if ( !sender.hasPermission(pnode) ) { - sendResourceMessage(sender, PREERR, - "errmsgNotPermission", pnode); + sender.sendMessage(Messages.errmsgNotPermission(pnode)); } else { String value = options.get("japanize"); if ( value.equals("") ) { channel.setJapanizeType(null); - sendResourceMessage(sender, PREINFO, - "cmdmsgOption", "japanize", "デフォルト"); + sender.sendMessage(Messages.cmdmsgOption("japanize", "default")); setOption = true; } else { JapanizeType type = JapanizeType.fromID(value, null); if ( type == null ) { - sendResourceMessage(sender, PREERR, - "errmsgInvalidJapanizeOption", "japanize", value); + sender.sendMessage(Messages.errmsgCommand()); } else { channel.setJapanizeType(type); - sendResourceMessage(sender, PREINFO, - "cmdmsgOption", "japanize", type.toString()); + sender.sendMessage(Messages.cmdmsgOption("japanize", type.toString())); setOption = true; } } @@ -363,19 +329,16 @@ public boolean runCommand( String pnode = PERMISSION_NODE + ".password"; if ( !sender.hasPermission(pnode) ) { - sendResourceMessage(sender, PREERR, - "errmsgNotPermission", pnode); + sender.sendMessage(Messages.errmsgNotPermission(pnode)); } else { String password = options.get("password"); // パスワードが文字制限を超える場合はエラー if ( password.length() > MAX_LENGTH_PASSWORD ) { - sendResourceMessage(sender, PREERR, - "errmsgToolongPassword", MAX_LENGTH_PASSWORD); + sender.sendMessage(Messages.errmsgToolongPassword(MAX_LENGTH_PASSWORD)); } else { channel.setPassword(password); - sendResourceMessage(sender, PREINFO, - "cmdmsgOption", "password", password); + sender.sendMessage(Messages.cmdmsgOption("password", password)); setOption = true; } } @@ -386,28 +349,27 @@ public boolean runCommand( String pnode = PERMISSION_NODE + ".visible"; if ( !sender.hasPermission(pnode) ) { - sendResourceMessage(sender, PREERR, - "errmsgNotPermission", pnode); + sender.sendMessage(Messages.errmsgNotPermission(pnode)); } else { String temp = options.get("visible"); if ( temp.equalsIgnoreCase("false") ) { channel.setVisible(false); - sendResourceMessage(sender, PREINFO, - "cmdmsgOption", "visible", "false"); + sender.sendMessage(Messages.cmdmsgOption("visible", "false")); setOption = true; } else if ( temp.equalsIgnoreCase("true") ) { channel.setVisible(true); - sendResourceMessage(sender, PREINFO, - "cmdmsgOption", "visible", "true"); + sender.sendMessage(Messages.cmdmsgOption("visible", "true")); setOption = true; + } else { + sender.sendMessage(Messages.errmsgInvalidBooleanOption("visible")); } } } } if ( !setOption ) { - sendResourceMessage(sender, PREERR, "errmsgInvalidOptions"); + sender.sendMessage(Messages.errmsgInvalidOptions()); } else { channel.save(); } diff --git a/src/main/java/com/github/ucchyocean/lc/command/PardonCommand.java b/src/main/java/com/github/ucchyocean/lc3/command/PardonCommand.java similarity index 61% rename from src/main/java/com/github/ucchyocean/lc/command/PardonCommand.java rename to src/main/java/com/github/ucchyocean/lc3/command/PardonCommand.java index e8b67d46..04320e06 100644 --- a/src/main/java/com/github/ucchyocean/lc/command/PardonCommand.java +++ b/src/main/java/com/github/ucchyocean/lc3/command/PardonCommand.java @@ -1,30 +1,27 @@ /* * @author ucchy * @license LGPLv3 - * @copyright Copyright ucchy 2013 + * @copyright Copyright ucchy 2020 */ -package com.github.ucchyocean.lc.command; +package com.github.ucchyocean.lc3.command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import com.github.ucchyocean.lc.channel.Channel; -import com.github.ucchyocean.lc.channel.ChannelPlayer; +import com.github.ucchyocean.lc3.Messages; +import com.github.ucchyocean.lc3.channel.Channel; +import com.github.ucchyocean.lc3.member.ChannelMember; /** * pardonコマンドの実行クラス * @author ucchy */ -public class PardonCommand extends SubCommandAbst { +public class PardonCommand extends LunaChatSubCommand { private static final String COMMAND_NAME = "pardon"; private static final String PERMISSION_NODE = "lunachat." + COMMAND_NAME; - private static final String USAGE_KEY = "usagePardon"; /** * コマンドを取得します。 * @return コマンド - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandName() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandName() */ @Override public String getCommandName() { @@ -34,7 +31,7 @@ public String getCommandName() { /** * パーミッションノードを取得します。 * @return パーミッションノード - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getPermissionNode() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getPermissionNode() */ @Override public String getPermissionNode() { @@ -44,7 +41,7 @@ public String getPermissionNode() { /** * コマンドの種別を取得します。 * @return コマンド種別 - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandType() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandType() */ @Override public CommandType getCommandType() { @@ -55,12 +52,12 @@ public CommandType getCommandType() { * 使用方法に関するメッセージをsenderに送信します。 * @param sender コマンド実行者 * @param label 実行ラベル - * @see com.github.ucchyocean.lc.command.SubCommandAbst#sendUsageMessage() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#sendUsageMessage() */ @Override public void sendUsageMessage( - CommandSender sender, String label) { - sendResourceMessage(sender, "", USAGE_KEY, label); + ChannelMember sender, String label) { + sender.sendMessage(Messages.usagePardon(label)); } /** @@ -69,18 +66,18 @@ public void sendUsageMessage( * @param label 実行ラベル * @param args 実行時の引数 * @return コマンドが実行されたかどうか - * @see com.github.ucchyocean.lc.command.SubCommandAbst#runCommand(java.lang.String[]) + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#runCommand(java.lang.String[]) */ @Override public boolean runCommand( - CommandSender sender, String label, String[] args) { + ChannelMember sender, String label, String[] args) { // 実行引数から、BAN解除するユーザーを取得する String kickedName = ""; if (args.length >= 2) { kickedName = args[1]; } else { - sendResourceMessage(sender, PREERR, "errmsgCommand"); + sender.sendMessage(Messages.errmsgCommand()); return true; } @@ -88,25 +85,24 @@ public boolean runCommand( Channel channel = null; if (args.length >= 3) { channel = api.getChannel(args[2]); - } else if (sender instanceof Player) { - Player kicker = (Player) sender; - channel = api.getDefaultChannel(kicker.getName()); + } else { + channel = api.getDefaultChannel(sender.getName()); } if (channel == null) { - sendResourceMessage(sender, PREERR, "errmsgNoJoin"); + sender.sendMessage(Messages.errmsgNoJoin()); return true; } // モデレーターかどうか確認する if ( !channel.hasModeratorPermission(sender) ) { - sendResourceMessage(sender, PREERR, "errmsgNotModerator"); + sender.sendMessage(Messages.errmsgNotModerator()); return true; } // BAN解除されるプレイヤーがBANされているかどうかチェックする - ChannelPlayer kicked = ChannelPlayer.getChannelPlayer(kickedName); + ChannelMember kicked = ChannelMember.getChannelMember(kickedName); if (!channel.getBanned().contains(kicked)) { - sendResourceMessage(sender, PREERR, "errmsgNotBanned"); + sender.sendMessage(Messages.errmsgNotBanned()); return true; } @@ -118,16 +114,16 @@ public boolean runCommand( channel.save(); // senderに通知メッセージを出す - sendResourceMessage(sender, PREINFO, - "cmdmsgPardon", kickedName, channel.getName()); + sender.sendMessage(Messages.cmdmsgPardon(kickedName, channel.getName())); // チャンネルに通知メッセージを出す - sendResourceMessageWithKeyword(channel, "pardonMessage", kicked); + channel.sendSystemMessage(Messages.pardonMessage( + channel.getColorCode(), channel.getName(), kicked.getName()), + true, "system"); // BANされていた人に通知メッセージを出す if ( kicked != null && kicked.isOnline() ) { - sendResourceMessage(kicked, PREINFO, - "cmdmsgPardoned", channel.getName()); + kicked.sendMessage(Messages.cmdmsgPardoned(channel.getName())); } return true; diff --git a/src/main/java/com/github/ucchyocean/lc/command/ReloadCommand.java b/src/main/java/com/github/ucchyocean/lc3/command/ReloadCommand.java similarity index 54% rename from src/main/java/com/github/ucchyocean/lc/command/ReloadCommand.java rename to src/main/java/com/github/ucchyocean/lc3/command/ReloadCommand.java index 3ff88ebe..2b6ef937 100644 --- a/src/main/java/com/github/ucchyocean/lc/command/ReloadCommand.java +++ b/src/main/java/com/github/ucchyocean/lc3/command/ReloadCommand.java @@ -1,26 +1,29 @@ /* * @author ucchy * @license LGPLv3 - * @copyright Copyright ucchy 2013 + * @copyright Copyright ucchy 2020 */ -package com.github.ucchyocean.lc.command; +package com.github.ucchyocean.lc3.command; -import org.bukkit.command.CommandSender; +import java.io.File; + +import com.github.ucchyocean.lc3.LunaChat; +import com.github.ucchyocean.lc3.Messages; +import com.github.ucchyocean.lc3.member.ChannelMember; /** * reloadコマンドの実行クラス * @author ucchy */ -public class ReloadCommand extends SubCommandAbst { +public class ReloadCommand extends LunaChatSubCommand { private static final String COMMAND_NAME = "reload"; private static final String PERMISSION_NODE = "lunachat-admin." + COMMAND_NAME; - private static final String USAGE_KEY = "usageReload"; /** * コマンドを取得します。 * @return コマンド - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandName() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandName() */ @Override public String getCommandName() { @@ -30,7 +33,7 @@ public String getCommandName() { /** * パーミッションノードを取得します。 * @return パーミッションノード - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getPermissionNode() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getPermissionNode() */ @Override public String getPermissionNode() { @@ -40,7 +43,7 @@ public String getPermissionNode() { /** * コマンドの種別を取得します。 * @return コマンド種別 - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandType() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandType() */ @Override public CommandType getCommandType() { @@ -51,12 +54,12 @@ public CommandType getCommandType() { * 使用方法に関するメッセージをsenderに送信します。 * @param sender コマンド実行者 * @param label 実行ラベル - * @see com.github.ucchyocean.lc.command.SubCommandAbst#sendUsageMessage() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#sendUsageMessage() */ @Override public void sendUsageMessage( - CommandSender sender, String label) { - sendResourceMessage(sender, "", USAGE_KEY, label); + ChannelMember sender, String label) { + sender.sendMessage(Messages.usageReload(label)); } /** @@ -65,15 +68,17 @@ public void sendUsageMessage( * @param label 実行ラベル * @param args 実行時の引数 * @return コマンドが実行されたかどうか - * @see com.github.ucchyocean.lc.command.SubCommandAbst#runCommand(java.lang.String[]) + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#runCommand(java.lang.String[]) */ @Override public boolean runCommand( - CommandSender sender, String label, String[] args) { + ChannelMember sender, String label, String[] args) { api.reloadAllData(); - config.reloadConfig(); - sendResourceMessage(sender, PREINFO, "cmdmsgReload"); + config.reloadConfig(LunaChat.getDataFolder(), LunaChat.getPluginJarFile()); + Messages.initialize(new File(LunaChat.getDataFolder(), "messages"), + LunaChat.getPluginJarFile(), config.getLang()); + sender.sendMessage(Messages.cmdmsgReload()); return true; } diff --git a/src/main/java/com/github/ucchyocean/lc/command/RemoveCommand.java b/src/main/java/com/github/ucchyocean/lc3/command/RemoveCommand.java similarity index 57% rename from src/main/java/com/github/ucchyocean/lc/command/RemoveCommand.java rename to src/main/java/com/github/ucchyocean/lc3/command/RemoveCommand.java index 1967408b..8dad6119 100644 --- a/src/main/java/com/github/ucchyocean/lc/command/RemoveCommand.java +++ b/src/main/java/com/github/ucchyocean/lc3/command/RemoveCommand.java @@ -1,29 +1,27 @@ /* * @author ucchy * @license LGPLv3 - * @copyright Copyright ucchy 2013 + * @copyright Copyright ucchy 2020 */ -package com.github.ucchyocean.lc.command; +package com.github.ucchyocean.lc3.command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import com.github.ucchyocean.lc.channel.Channel; +import com.github.ucchyocean.lc3.Messages; +import com.github.ucchyocean.lc3.channel.Channel; +import com.github.ucchyocean.lc3.member.ChannelMember; /** * removeコマンドの実行クラス * @author ucchy */ -public class RemoveCommand extends SubCommandAbst { +public class RemoveCommand extends LunaChatSubCommand { private static final String COMMAND_NAME = "remove"; private static final String PERMISSION_NODE = "lunachat." + COMMAND_NAME; - private static final String USAGE_KEY = "usageRemove"; /** * コマンドを取得します。 * @return コマンド - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandName() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandName() */ @Override public String getCommandName() { @@ -33,7 +31,7 @@ public String getCommandName() { /** * パーミッションノードを取得します。 * @return パーミッションノード - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getPermissionNode() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getPermissionNode() */ @Override public String getPermissionNode() { @@ -43,7 +41,7 @@ public String getPermissionNode() { /** * コマンドの種別を取得します。 * @return コマンド種別 - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandType() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandType() */ @Override public CommandType getCommandType() { @@ -54,12 +52,12 @@ public CommandType getCommandType() { * 使用方法に関するメッセージをsenderに送信します。 * @param sender コマンド実行者 * @param label 実行ラベル - * @see com.github.ucchyocean.lc.command.SubCommandAbst#sendUsageMessage() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#sendUsageMessage() */ @Override public void sendUsageMessage( - CommandSender sender, String label) { - sendResourceMessage(sender, "", USAGE_KEY, label); + ChannelMember sender, String label) { + sender.sendMessage(Messages.usageRemove(label)); } /** @@ -68,54 +66,49 @@ public void sendUsageMessage( * @param label 実行ラベル * @param args 実行時の引数 * @return コマンドが実行されたかどうか - * @see com.github.ucchyocean.lc.command.SubCommandAbst#runCommand(java.lang.String[]) + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#runCommand(java.lang.String[]) */ @Override public boolean runCommand( - CommandSender sender, String label, String[] args) { - - Player player = null; - if (sender instanceof Player) { - player = (Player) sender; - } + ChannelMember sender, String label, String[] args) { // 引数チェック - // このコマンドは、コンソールでも実行できるが、その場合はチャンネル名を指定する必要がある + // このコマンドは、デフォルトチャンネルでない人も実行できるが、その場合はチャンネル名を指定する必要がある String cname = null; - if ( player != null && args.length <= 1 ) { - Channel def = api.getDefaultChannel(player.getName()); + if ( args.length <= 1 ) { + Channel def = api.getDefaultChannel(sender.getName()); if ( def != null ) { cname = def.getName(); } } else if ( args.length >= 2 ) { cname = args[1]; } else { - sendResourceMessage(sender, PREERR, "errmsgCommand"); + sender.sendMessage(Messages.errmsgCommand()); return true; } // チャンネルが存在するかどうか確認する Channel channel = api.getChannel(cname); if ( channel == null ) { - sendResourceMessage(sender, PREERR, "errmsgNotExist"); + sender.sendMessage(Messages.errmsgNotExist()); return true; } // モデレーターかどうか確認する if ( !channel.hasModeratorPermission(sender) ) { - sendResourceMessage(sender, PREERR, "errmsgNotModerator"); + sender.sendMessage(Messages.errmsgNotModerator()); return true; } // グローバルチャンネルなら削除できない if ( channel.isGlobalChannel() ) { - sendResourceMessage(sender, PREERR, "errmsgCannotRemoveGlobal", channel.getName()); + sender.sendMessage(Messages.errmsgCannotRemoveGlobal(channel.getName())); return true; } // チャンネル削除 if ( api.removeChannel(cname) ) { - sendResourceMessage(sender, PREINFO, "cmdmsgRemove", cname); + sender.sendMessage(Messages.cmdmsgRemove(cname)); } return true; } diff --git a/src/main/java/com/github/ucchyocean/lc/command/SetCommand.java b/src/main/java/com/github/ucchyocean/lc3/command/SetCommand.java similarity index 57% rename from src/main/java/com/github/ucchyocean/lc/command/SetCommand.java rename to src/main/java/com/github/ucchyocean/lc3/command/SetCommand.java index bf0d843a..c9ebc5d1 100644 --- a/src/main/java/com/github/ucchyocean/lc/command/SetCommand.java +++ b/src/main/java/com/github/ucchyocean/lc3/command/SetCommand.java @@ -1,21 +1,18 @@ -package com.github.ucchyocean.lc.command; +package com.github.ucchyocean.lc3.command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; +import com.github.ucchyocean.lc3.Messages; +import com.github.ucchyocean.lc3.channel.Channel; +import com.github.ucchyocean.lc3.member.ChannelMember; -import com.github.ucchyocean.lc.Utility; -import com.github.ucchyocean.lc.channel.Channel; - -public class SetCommand extends SubCommandAbst { +public class SetCommand extends LunaChatSubCommand { private static final String COMMAND_NAME = "set"; private static final String PERMISSION_NODE = "lunachat-admin." + COMMAND_NAME; - private static final String USAGE_KEY1 = "usageSet1"; /** * コマンドを取得します。 * @return コマンド - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandName() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandName() */ @Override public String getCommandName() { @@ -25,7 +22,7 @@ public String getCommandName() { /** * パーミッションノードを取得します。 * @return パーミッションノード - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getPermissionNode() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getPermissionNode() */ @Override public String getPermissionNode() { @@ -35,7 +32,7 @@ public String getPermissionNode() { /** * コマンドの種別を取得します。 * @return コマンド種別 - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandType() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandType() */ @Override public CommandType getCommandType() { @@ -46,11 +43,11 @@ public CommandType getCommandType() { * 使用方法に関するメッセージをsenderに送信します。 * @param sender コマンド実行者 * @param label 実行ラベル - * @see com.github.ucchyocean.lc.command.SubCommandAbst#sendUsageMessage() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#sendUsageMessage() */ @Override - public void sendUsageMessage(CommandSender sender, String label) { - sendResourceMessage(sender, "", USAGE_KEY1, label); + public void sendUsageMessage(ChannelMember sender, String label) { + sender.sendMessage(Messages.usageSet1(label)); } /** @@ -59,10 +56,10 @@ public void sendUsageMessage(CommandSender sender, String label) { * @param label 実行ラベル * @param args 実行時の引数 * @return コマンドが実行されたかどうか - * @see com.github.ucchyocean.lc.command.SubCommandAbst#runCommand(java.lang.String[]) + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#runCommand(java.lang.String[]) */ @Override - public boolean runCommand(CommandSender sender, String label, String[] args) { + public boolean runCommand(ChannelMember sender, String label, String[] args) { // 引数チェック // このコマンドは、コンソールでも実行できる @@ -75,25 +72,25 @@ public boolean runCommand(CommandSender sender, String label, String[] args) { Channel targetChannel = null; if ( args.length >= 4 ) { targetChannel = api.getChannel(args[3]); - } else if ( sender instanceof Player ) { - Player player = (Player)sender; - targetChannel = api.getDefaultChannel(player.getName()); + } else { + targetChannel = api.getDefaultChannel(sender.getName()); } if ( targetChannel == null ) { // チャンネルが正しく指定されなかった - sendResourceMessage(sender, PREERR, "errmsgNotExistOrNotSpecified"); + sender.sendMessage(Messages.errmsgNotExistOrNotSpecified()); return true; } // 発言先を設定 api.setDefaultChannel(targetPlayer, targetChannel.getName()); - sendResourceMessage(sender, PREINFO, "cmdmsgSetDefault", targetPlayer, targetChannel.getName()); + sender.sendMessage(Messages.cmdmsgSetDefault(targetPlayer, targetChannel.getName())); - Player target = Utility.getPlayerExact(targetPlayer); + // setされる相手のプレイヤーにも通知する + ChannelMember target = ChannelMember.getChannelMember(targetPlayer); if ( target != null ) { - sendResourceMessage(target, PREINFO, "cmdmsgSet", targetChannel.getName()); + target.sendMessage(Messages.cmdmsgSet(targetChannel.getName())); } return true; diff --git a/src/main/java/com/github/ucchyocean/lc/command/TemplateCommand.java b/src/main/java/com/github/ucchyocean/lc3/command/TemplateCommand.java similarity index 63% rename from src/main/java/com/github/ucchyocean/lc/command/TemplateCommand.java rename to src/main/java/com/github/ucchyocean/lc3/command/TemplateCommand.java index 428b1852..0959812f 100644 --- a/src/main/java/com/github/ucchyocean/lc/command/TemplateCommand.java +++ b/src/main/java/com/github/ucchyocean/lc3/command/TemplateCommand.java @@ -1,26 +1,26 @@ /* * @author ucchy * @license LGPLv3 - * @copyright Copyright ucchy 2013 + * @copyright Copyright ucchy 2020 */ -package com.github.ucchyocean.lc.command; +package com.github.ucchyocean.lc3.command; -import org.bukkit.command.CommandSender; +import com.github.ucchyocean.lc3.Messages; +import com.github.ucchyocean.lc3.member.ChannelMember; /** * templateコマンドの実行クラス * @author ucchy */ -public class TemplateCommand extends SubCommandAbst { +public class TemplateCommand extends LunaChatSubCommand { private static final String COMMAND_NAME = "template"; private static final String PERMISSION_NODE = "lunachat-admin." + COMMAND_NAME; - private static final String USAGE_KEY = "usageTemplate"; /** * コマンドを取得します。 * @return コマンド - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandName() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandName() */ @Override public String getCommandName() { @@ -30,7 +30,7 @@ public String getCommandName() { /** * パーミッションノードを取得します。 * @return パーミッションノード - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getPermissionNode() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getPermissionNode() */ @Override public String getPermissionNode() { @@ -40,7 +40,7 @@ public String getPermissionNode() { /** * コマンドの種別を取得します。 * @return コマンド種別 - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandType() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandType() */ @Override public CommandType getCommandType() { @@ -51,12 +51,12 @@ public CommandType getCommandType() { * 使用方法に関するメッセージをsenderに送信します。 * @param sender コマンド実行者 * @param label 実行ラベル - * @see com.github.ucchyocean.lc.command.SubCommandAbst#sendUsageMessage() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#sendUsageMessage() */ @Override public void sendUsageMessage( - CommandSender sender, String label) { - sendResourceMessage(sender, "", USAGE_KEY, label); + ChannelMember sender, String label) { + sender.sendMessage(Messages.usageTemplate(label)); } /** @@ -65,22 +65,22 @@ public void sendUsageMessage( * @param label 実行ラベル * @param args 実行時の引数 * @return コマンドが実行されたかどうか - * @see com.github.ucchyocean.lc.command.SubCommandAbst#runCommand(java.lang.String[]) + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#runCommand(java.lang.String[]) */ @Override public boolean runCommand( - CommandSender sender, String label, String[] args) { + ChannelMember sender, String label, String[] args) { // 引数チェック // このコマンドは、コンソールでも実行できる if ( args.length <= 1 ) { - sendResourceMessage(sender, PREERR, "errmsgCommand"); + sender.sendMessage(Messages.errmsgCommand()); return true; } if ( !args[1].matches("[0-9]") ) { - sendResourceMessage(sender, PREERR, "errmsgInvalidTemplateNumber"); - sendResourceMessage(sender, PREERR, "usageTemplate"); + sender.sendMessage(Messages.errmsgInvalidTemplateNumber()); + sender.sendMessage(Messages.usageTemplate(label)); return true; } @@ -96,12 +96,10 @@ public boolean runCommand( // 登録を実行 if ( format.equals("") ) { api.removeTemplate(id); - sendResourceMessage(sender, PREINFO, - "cmdmsgTemplateRemove", id); + sender.sendMessage(Messages.cmdmsgTemplateRemove(id)); } else { api.setTemplate(id, format); - sendResourceMessage(sender, PREINFO, - "cmdmsgTemplate", id, format); + sender.sendMessage(Messages.cmdmsgTemplate(id, format)); } return true; diff --git a/src/main/java/com/github/ucchyocean/lc/command/UnhideCommand.java b/src/main/java/com/github/ucchyocean/lc3/command/UnhideCommand.java similarity index 59% rename from src/main/java/com/github/ucchyocean/lc/command/UnhideCommand.java rename to src/main/java/com/github/ucchyocean/lc3/command/UnhideCommand.java index 4f88e399..0c69ecf0 100644 --- a/src/main/java/com/github/ucchyocean/lc/command/UnhideCommand.java +++ b/src/main/java/com/github/ucchyocean/lc3/command/UnhideCommand.java @@ -1,32 +1,28 @@ /* * @author ucchy * @license LGPLv3 - * @copyright Copyright ucchy 2013 + * @copyright Copyright ucchy 2020 */ -package com.github.ucchyocean.lc.command; +package com.github.ucchyocean.lc3.command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import com.github.ucchyocean.lc.Utility; -import com.github.ucchyocean.lc.channel.Channel; -import com.github.ucchyocean.lc.channel.ChannelPlayer; +import com.github.ucchyocean.lc3.Messages; +import com.github.ucchyocean.lc3.Utility; +import com.github.ucchyocean.lc3.channel.Channel; +import com.github.ucchyocean.lc3.member.ChannelMember; /** * unhideコマンドの実行クラス * @author ucchy */ -public class UnhideCommand extends SubCommandAbst { +public class UnhideCommand extends LunaChatSubCommand { private static final String COMMAND_NAME = "unhide"; private static final String PERMISSION_NODE = "lunachat." + COMMAND_NAME; - private static final String USAGE_KEY1 = "usageUnhide"; - private static final String USAGE_KEY2 = "usageUnhidePlayer"; /** * コマンドを取得します。 * @return コマンド - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandName() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandName() */ @Override public String getCommandName() { @@ -36,7 +32,7 @@ public String getCommandName() { /** * パーミッションノードを取得します。 * @return パーミッションノード - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getPermissionNode() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getPermissionNode() */ @Override public String getPermissionNode() { @@ -46,7 +42,7 @@ public String getPermissionNode() { /** * コマンドの種別を取得します。 * @return コマンド種別 - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandType() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandType() */ @Override public CommandType getCommandType() { @@ -57,13 +53,13 @@ public CommandType getCommandType() { * 使用方法に関するメッセージをsenderに送信します。 * @param sender コマンド実行者 * @param label 実行ラベル - * @see com.github.ucchyocean.lc.command.SubCommandAbst#sendUsageMessage() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#sendUsageMessage() */ @Override public void sendUsageMessage( - CommandSender sender, String label) { - sendResourceMessage(sender, "", USAGE_KEY1, label); - sendResourceMessage(sender, "", USAGE_KEY2, label); + ChannelMember sender, String label) { + sender.sendMessage(Messages.usageUnhide(label)); + sender.sendMessage(Messages.usageUnhidePlayer(label)); } /** @@ -72,25 +68,18 @@ public void sendUsageMessage( * @param label 実行ラベル * @param args 実行時の引数 * @return コマンドが実行されたかどうか - * @see com.github.ucchyocean.lc.command.SubCommandAbst#runCommand(java.lang.String[]) + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#runCommand(java.lang.String[]) */ @Override public boolean runCommand( - CommandSender sender, String label, String[] args) { - - // プレイヤーでなければ終了する - if (!(sender instanceof Player)) { - sendResourceMessage(sender, PREERR, "errmsgIngame"); - return true; - } - ChannelPlayer player = ChannelPlayer.getChannelPlayer(sender); + ChannelMember sender, String label, String[] args) { // 引数チェック String cname = null; boolean isPlayerCommand = false; boolean isChannelCommand = false; if ( args.length <= 1 ) { - Channel def = api.getDefaultChannel(player.getName()); + Channel def = api.getDefaultChannel(sender.getName()); if ( def != null ) { cname = def.getName(); } @@ -117,8 +106,8 @@ public boolean runCommand( Channel channel = api.getChannel(cname); if ( !isPlayerCommand && channel != null ) { isChannelCommand = true; - } else if ( Utility.getOfflinePlayer(cname) == null ) { - sendResourceMessage(sender, PREERR, "errmsgNotExistChannelAndPlayer"); + } else if ( Utility.existsOfflinePlayer(cname) ) { + sender.sendMessage(Messages.errmsgNotExistChannelAndPlayer()); return true; } @@ -126,15 +115,15 @@ public boolean runCommand( // チャンネルが対象の場合の処理 // 非表示になっているかどうかをチェックする - if ( !channel.getHided().contains(player) ) { - sendResourceMessage(sender, PREERR, "errmsgAlreadyUnhided"); + if ( !channel.getHided().contains(sender) ) { + sender.sendMessage(Messages.errmsgAlreadyUnhided()); return true; } // 設定する - channel.getHided().remove(player); + channel.getHided().remove(sender); channel.save(); - sendResourceMessage(sender, PREINFO, "cmdmsgUnhided", channel.getName()); + sender.sendMessage(Messages.cmdmsgUnhided(channel.getName())); return true; @@ -142,15 +131,15 @@ public boolean runCommand( // プレイヤーが対象の場合の処理 // 既に表示になっていないかどうかをチェックする - ChannelPlayer hided = ChannelPlayer.getChannelPlayer(cname); - if ( !api.getHidelist(hided).contains(player) ) { - sendResourceMessage(sender, PREERR, "errmsgAlreadyUnhidedPlayer"); + ChannelMember hided = ChannelMember.getChannelMember(cname); + if ( !api.getHidelist(hided).contains(sender) ) { + sender.sendMessage(Messages.errmsgAlreadyUnhidedPlayer()); return true; } // 設定する - api.removeHidelist(player, hided); - sendResourceMessage(sender, PREINFO, "cmdmsgUnhidedPlayer", hided.getDisplayName()); + api.removeHidelist(sender, hided); + sender.sendMessage(Messages.cmdmsgUnhidedPlayer(hided.getDisplayName())); return true; } diff --git a/src/main/java/com/github/ucchyocean/lc/command/UnmuteCommand.java b/src/main/java/com/github/ucchyocean/lc3/command/UnmuteCommand.java similarity index 61% rename from src/main/java/com/github/ucchyocean/lc/command/UnmuteCommand.java rename to src/main/java/com/github/ucchyocean/lc3/command/UnmuteCommand.java index d894dbc6..745c1886 100644 --- a/src/main/java/com/github/ucchyocean/lc/command/UnmuteCommand.java +++ b/src/main/java/com/github/ucchyocean/lc3/command/UnmuteCommand.java @@ -1,30 +1,27 @@ /* * @author ucchy * @license LGPLv3 - * @copyright Copyright ucchy 2013 + * @copyright Copyright ucchy 2020 */ -package com.github.ucchyocean.lc.command; +package com.github.ucchyocean.lc3.command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import com.github.ucchyocean.lc.channel.Channel; -import com.github.ucchyocean.lc.channel.ChannelPlayer; +import com.github.ucchyocean.lc3.Messages; +import com.github.ucchyocean.lc3.channel.Channel; +import com.github.ucchyocean.lc3.member.ChannelMember; /** * unmuteコマンドの実行クラス * @author ucchy */ -public class UnmuteCommand extends SubCommandAbst { +public class UnmuteCommand extends LunaChatSubCommand { private static final String COMMAND_NAME = "unmute"; private static final String PERMISSION_NODE = "lunachat." + COMMAND_NAME; - private static final String USAGE_KEY = "usageUnmute"; /** * コマンドを取得します。 * @return コマンド - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandName() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandName() */ @Override public String getCommandName() { @@ -34,7 +31,7 @@ public String getCommandName() { /** * パーミッションノードを取得します。 * @return パーミッションノード - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getPermissionNode() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getPermissionNode() */ @Override public String getPermissionNode() { @@ -44,7 +41,7 @@ public String getPermissionNode() { /** * コマンドの種別を取得します。 * @return コマンド種別 - * @see com.github.ucchyocean.lc.command.SubCommandAbst#getCommandType() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#getCommandType() */ @Override public CommandType getCommandType() { @@ -55,12 +52,12 @@ public CommandType getCommandType() { * 使用方法に関するメッセージをsenderに送信します。 * @param sender コマンド実行者 * @param label 実行ラベル - * @see com.github.ucchyocean.lc.command.SubCommandAbst#sendUsageMessage() + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#sendUsageMessage() */ @Override public void sendUsageMessage( - CommandSender sender, String label) { - sendResourceMessage(sender, "", USAGE_KEY, label); + ChannelMember sender, String label) { + sender.sendMessage(Messages.usageUnmute(label)); } /** @@ -69,18 +66,18 @@ public void sendUsageMessage( * @param label 実行ラベル * @param args 実行時の引数 * @return コマンドが実行されたかどうか - * @see com.github.ucchyocean.lc.command.SubCommandAbst#runCommand(java.lang.String[]) + * @see com.github.ucchyocean.lc3.command.LunaChatSubCommand#runCommand(java.lang.String[]) */ @Override public boolean runCommand( - CommandSender sender, String label, String[] args) { + ChannelMember sender, String label, String[] args) { // 実行引数から、Mute解除するユーザーを取得する String kickedName = ""; if (args.length >= 2) { kickedName = args[1]; } else { - sendResourceMessage(sender, PREERR, "errmsgCommand"); + sender.sendMessage(Messages.errmsgCommand()); return true; } @@ -88,25 +85,24 @@ public boolean runCommand( Channel channel = null; if (args.length >= 3) { channel = api.getChannel(args[2]); - } else if (sender instanceof Player) { - Player kicker = (Player) sender; - channel = api.getDefaultChannel(kicker.getName()); + } else { + channel = api.getDefaultChannel(sender.getName()); } if (channel == null) { - sendResourceMessage(sender, PREERR, "errmsgNoJoin"); + sender.sendMessage(Messages.errmsgNoJoin()); return true; } // モデレーターかどうか確認する if ( !channel.hasModeratorPermission(sender) ) { - sendResourceMessage(sender, PREERR, "errmsgNotModerator"); + sender.sendMessage(Messages.errmsgNotModerator()); return true; } // Mute解除されるプレイヤーがMuteされているかどうかチェックする - ChannelPlayer kicked = ChannelPlayer.getChannelPlayer(kickedName); + ChannelMember kicked = ChannelMember.getChannelMember(kickedName); if (!channel.getMuted().contains(kicked)) { - sendResourceMessage(sender, PREERR, "errmsgNotMuted"); + sender.sendMessage(Messages.errmsgNotMuted()); return true; } @@ -118,16 +114,16 @@ public boolean runCommand( channel.save(); // senderに通知メッセージを出す - sendResourceMessage(sender, PREINFO, - "cmdmsgUnmute", kickedName, channel.getName()); + sender.sendMessage(Messages.cmdmsgUnmute(kickedName, channel.getName())); // チャンネルに通知メッセージを出す - sendResourceMessageWithKeyword(channel, "unmuteMessage", kicked); + channel.sendSystemMessage(Messages.unmuteMessage( + channel.getColorCode(), channel.getName(), kicked.getName()), + true, "system"); // BANされていた人に通知メッセージを出す if ( kicked != null && kicked.isOnline() ) { - sendResourceMessage(kicked, PREINFO, - "cmdmsgUnmuted", channel.getName()); + kicked.sendMessage(Messages.cmdmsgUnmuted(channel.getName())); } return true; diff --git a/src/main/java/com/github/ucchyocean/lc3/event/EventResult.java b/src/main/java/com/github/ucchyocean/lc3/event/EventResult.java new file mode 100644 index 00000000..dd5cf98e --- /dev/null +++ b/src/main/java/com/github/ucchyocean/lc3/event/EventResult.java @@ -0,0 +1,148 @@ +/* + * @author ucchy + * @license LGPLv3 + * @copyright Copyright ucchy 2020 + */ +package com.github.ucchyocean.lc3.event; + +import java.util.List; +import java.util.Map; + +import com.github.ucchyocean.lc3.LunaChat; +import com.github.ucchyocean.lc3.channel.Channel; +import com.github.ucchyocean.lc3.member.ChannelMember; + +/** + * イベントの実行結果を格納するクラス + * @author ucchy + */ +public class EventResult { + + private boolean isCancelled = false; + private String message; + private String messageFormat; + private String ngMaskedMessage; + private String channelName; + private List recipients; + private String japanized; + private Map options; + + /** + * @return + */ + public Channel getChannel() { + return LunaChat.getAPI().getChannel(channelName); + } + + /** + * @param cancelled + */ + public void setCancelled(boolean cancelled) { + this.isCancelled = cancelled; + } + + /** + * @return + */ + public boolean isCancelled() { + return isCancelled; + } + + /** + * @return message + */ + public String getMessage() { + return message; + } + + /** + * @param message message + */ + public void setMessage(String message) { + this.message = message; + } + + /** + * @return messageFormat + */ + public String getMessageFormat() { + return messageFormat; + } + + /** + * @param messageFormat messageFormat + */ + public void setMessageFormat(String messageFormat) { + this.messageFormat = messageFormat; + } + + /** + * @return ngMaskedMessage + */ + public String getNgMaskedMessage() { + return ngMaskedMessage; + } + + /** + * @param ngMaskedMessage ngMaskedMessage + */ + public void setNgMaskedMessage(String ngMaskedMessage) { + this.ngMaskedMessage = ngMaskedMessage; + } + + /** + * @return channelName + */ + public String getChannelName() { + return channelName; + } + + /** + * @param channelName channelName + */ + public void setChannelName(String channelName) { + this.channelName = channelName; + } + + /** + * @return recipients + */ + public List getRecipients() { + return recipients; + } + + /** + * @param recipients recipients + */ + public void setRecipients(List recipients) { + this.recipients = recipients; + } + + /** + * @return japanized + */ + public String getJapanized() { + return japanized; + } + + /** + * @param japanized japanized + */ + public void setJapanized(String japanized) { + this.japanized = japanized; + } + + /** + * @return options + */ + public Map getOptions() { + return options; + } + + /** + * @param options options + */ + public void setOptions(Map options) { + this.options = options; + } +} \ No newline at end of file diff --git a/src/main/java/com/github/ucchyocean/lc3/event/EventSenderInterface.java b/src/main/java/com/github/ucchyocean/lc3/event/EventSenderInterface.java new file mode 100644 index 00000000..af16f757 --- /dev/null +++ b/src/main/java/com/github/ucchyocean/lc3/event/EventSenderInterface.java @@ -0,0 +1,109 @@ +/* + * @author ucchy + * @license LGPLv3 + * @copyright Copyright ucchy 2020 + */ +package com.github.ucchyocean.lc3.event; + +import java.util.List; +import java.util.Map; + +import com.github.ucchyocean.lc3.member.ChannelMember; + +/** + * LunaChatのイベント実行インターフェイス + * @author ucchy + */ +public interface EventSenderInterface { + + /** + * チャンネルチャットのチャットイベント + * @param channelName チャンネル名 + * @param player 発言者 + * @param originalMessage 発言内容 + * @param ngMaskedMessage 発言内容(NGマスク後) + * @param messageFormat 発言に適用されるフォーマット + * @return イベント実行結果 + */ + public EventResult sendLunaChatChannelChatEvent( + String channelName, ChannelMember member, + String originalMessage, String ngMaskedMessage, + String messageFormat); + + /** + * チャンネル作成イベント + * @param channelName チャンネル名 + * @param member 作成した人 + * @return イベント実行結果 + */ + public EventResult sendLunaChatChannelCreateEvent( + String channelName, ChannelMember member); + + /** + * メンバー変更イベント + * @param channelName チャンネル名 + * @param before 変更前のメンバー + * @param after 変更後のメンバー + * @return イベント実行結果 + */ + public EventResult sendLunaChatChannelMemberChangedEvent( + String channelName, List before, + List after); + + /** + * チャンネルチャットのメッセージイベント。このイベントはキャンセルできない。 + * @param channelName チャンネル名 + * @param member 発言者 + * @param message 発言内容(NGマスクやJapanizeされた後の内容) + * @param recipients 受信者 + * @param displayName 発言者の表示名 + * @param originalMessage 発言内容(元々の内容) + * @return イベント実行結果 + */ + public EventResult sendLunaChatChannelMessageEvent( + String channelName, ChannelMember member, String message, + List recipients, String displayName, + String originalMessage); + + /** + * オプション変更イベント + * @param channelName チャンネル名 + * @param member オプションを変更した人 + * @param options 変更後のオプション + * @return イベント実行結果 + */ + public EventResult sendLunaChatChannelOptionChangedEvent( + String channelName, ChannelMember member, + Map options); + + /** + * チャンネル削除イベント + * @param channelName チャンネル名 + * @param member 削除を実行した人 + * @return イベント実行結果 + */ + public EventResult sendLunaChatChannelRemoveEvent( + String channelName, ChannelMember member); + + /** + * Japanize変換が行われた後に呼び出されるイベント + * @param channelName チャンネル名 + * @param member 発言したメンバー + * @param original 変換前の文字列 + * @param japanized 変換後の文字列 + * @return イベント実行結果 + */ + public EventResult sendLunaChatPostJapanizeEvent( + String channelName, ChannelMember member, + String original, String japanized); + + /** + * チャンネルチャットへの発言前に発生するイベント + * @param channelName チャンネル名 + * @param member 発言したメンバー + * @param message 発言内容 + * @return イベント実行結果 + */ + public EventResult sendLunaChatPreChatEvent( + String channelName, ChannelMember member, String message); +} diff --git a/src/main/java/com/github/ucchyocean/lc/japanize/GoogleIME.java b/src/main/java/com/github/ucchyocean/lc3/japanize/GoogleIME.java similarity index 94% rename from src/main/java/com/github/ucchyocean/lc/japanize/GoogleIME.java rename to src/main/java/com/github/ucchyocean/lc3/japanize/GoogleIME.java index 19bfbc45..fdf47dee 100644 --- a/src/main/java/com/github/ucchyocean/lc/japanize/GoogleIME.java +++ b/src/main/java/com/github/ucchyocean/lc3/japanize/GoogleIME.java @@ -1,4 +1,4 @@ -package com.github.ucchyocean.lc.japanize; +package com.github.ucchyocean.lc3.japanize; import com.google.gson.Gson; import com.google.gson.JsonArray; diff --git a/src/main/java/com/github/ucchyocean/lc/japanize/IMEConverter.java b/src/main/java/com/github/ucchyocean/lc3/japanize/IMEConverter.java similarity index 93% rename from src/main/java/com/github/ucchyocean/lc/japanize/IMEConverter.java rename to src/main/java/com/github/ucchyocean/lc3/japanize/IMEConverter.java index 1ae4748c..a4a27ea5 100644 --- a/src/main/java/com/github/ucchyocean/lc/japanize/IMEConverter.java +++ b/src/main/java/com/github/ucchyocean/lc3/japanize/IMEConverter.java @@ -1,9 +1,9 @@ /* * @author ucchy * @license LGPLv3 - * @copyright Copyright ucchy 2013 + * @copyright Copyright ucchy 2020 */ -package com.github.ucchyocean.lc.japanize; +package com.github.ucchyocean.lc3.japanize; import java.io.BufferedReader; import java.io.IOException; @@ -14,7 +14,6 @@ import java.net.URL; import java.net.URLEncoder; -import com.github.ucchyocean.lc.Utility; import com.google.common.io.CharStreams; /** @@ -80,9 +79,9 @@ private static String conv(String org, boolean isGoogleIME) { String json = CharStreams.toString(reader); String parsed = GoogleIME.parseJson(json); - if ( !Utility.isCB19orLater() ) { - parsed = YukiKanaConverter.fixBrackets(parsed); - } +// if ( !Utility.isCB19orLater() ) { +// parsed = YukiKanaConverter.fixBrackets(parsed); +// } return parsed; diff --git a/src/main/java/com/github/ucchyocean/lc3/japanize/JapanizeType.java b/src/main/java/com/github/ucchyocean/lc3/japanize/JapanizeType.java new file mode 100644 index 00000000..d246598e --- /dev/null +++ b/src/main/java/com/github/ucchyocean/lc3/japanize/JapanizeType.java @@ -0,0 +1,51 @@ +package com.github.ucchyocean.lc3.japanize; + +/** + * 日本語変換タイプ + * @author ucchy + */ +public enum JapanizeType { + + /** 日本語変換をしない */ + NONE("none"), + + /** カナ変換のみする */ + KANA("kana"), + + /** カナ変換後、GoogleIMEで漢字変換 */ + GOOGLE_IME("googleime"); + + private String id; + + /** + * コンストラクタ + * @param id + */ + JapanizeType(String id) { + this.id = id; + } + + /** + * 文字列表記を返す + * @see java.lang.Enum#toString() + */ + public String toString() { + return id; + } + + /** + * 文字列表記からJapanizeTypeを作成して返す + * @param id ID + * @param def デフォルト + * @return + */ + public static JapanizeType fromID(String id, JapanizeType def) { + if ( id == null ) return def; + for ( JapanizeType type : values() ) { + if ( type.id.equalsIgnoreCase(id) ) { + return type; + } + } + return def; + } +} diff --git a/src/main/java/com/github/ucchyocean/lc3/japanize/Japanizer.java b/src/main/java/com/github/ucchyocean/lc3/japanize/Japanizer.java new file mode 100644 index 00000000..237f5d99 --- /dev/null +++ b/src/main/java/com/github/ucchyocean/lc3/japanize/Japanizer.java @@ -0,0 +1,104 @@ +/* + * @author ucchy + * @license LGPLv3 + * @copyright Copyright ucchy 2014 + */ +package com.github.ucchyocean.lc3.japanize; + +import java.util.HashMap; +import java.util.Map; + +/** + * ローマ字表記を漢字変換して返すユーティリティ + * @author ucchy + */ +public class Japanizer { + + private static final String REGEX_URL = "https?://[\\w/:%#\\$&\\?\\(\\)~\\.=\\+\\-]+"; + + /** + * メッセージの日本語化をする + * @param org + * @param type + * @param dictionary + * @return + */ + public static String japanize(String org, JapanizeType type, + Map dictionary) { + + // 変換不要なら空文字列を返す + if ( type == JapanizeType.NONE || !isNeedToJapanize(org) ) { + return ""; + } + + // URL削除 + String deletedURL = org.replaceAll(REGEX_URL, " "); + + // キーワードをロック + HashMap keywordMap = new HashMap(); + int index = 0; + String keywordLocked = deletedURL; + for ( String dickey : dictionary.keySet() ) { + if ( keywordLocked.contains(dickey) ) { + index++; + String key = "<" + makeMultibytesDigit(index) + ">"; + keywordLocked = keywordLocked.replace(dickey, key); + keywordMap.put(key, dictionary.get(dickey)); + } + } + + // カナ変換 + String japanized = YukiKanaConverter.conv(keywordLocked); + + // IME変換 + if ( type == JapanizeType.GOOGLE_IME ) { + japanized = IMEConverter.convByGoogleIME(japanized); +// } else if ( type == JapanizeType.SOCIAL_IME ) { +// japanized = IMEConverter.convBySocialIME(japanized); + } + + // キーワードのアンロック + for ( String key : keywordMap.keySet() ) { + japanized = japanized.replace(key, keywordMap.get(key)); + } + + // 返す + return japanized.trim(); + } + + /** + * 日本語化が必要かどうかを判定する + * @param org + * @return + */ + private static boolean isNeedToJapanize(String org) { + return ( org.getBytes().length == org.length() + && !org.matches("[ \\uFF61-\\uFF9F]+") ); + } + + /** + * 数値を、全角文字の文字列に変換して返す + * @param digit + * @return + */ + private static String makeMultibytesDigit(int digit) { + + String half = Integer.toString(digit); + StringBuilder result = new StringBuilder(); + for ( int index=0; index < half.length(); index++ ) { + switch ( half.charAt(index) ) { + case '0' : result.append("0"); break; + case '1' : result.append("1"); break; + case '2' : result.append("2"); break; + case '3' : result.append("3"); break; + case '4' : result.append("4"); break; + case '5' : result.append("5"); break; + case '6' : result.append("6"); break; + case '7' : result.append("7"); break; + case '8' : result.append("8"); break; + case '9' : result.append("9"); break; + } + } + return result.toString(); + } +} diff --git a/src/main/java/com/github/ucchyocean/lc/japanize/YukiKanaConverter.java b/src/main/java/com/github/ucchyocean/lc3/japanize/YukiKanaConverter.java similarity index 98% rename from src/main/java/com/github/ucchyocean/lc/japanize/YukiKanaConverter.java rename to src/main/java/com/github/ucchyocean/lc3/japanize/YukiKanaConverter.java index 1458494f..5ec5b8b2 100644 --- a/src/main/java/com/github/ucchyocean/lc/japanize/YukiKanaConverter.java +++ b/src/main/java/com/github/ucchyocean/lc3/japanize/YukiKanaConverter.java @@ -1,4 +1,4 @@ -package com.github.ucchyocean.lc.japanize; +package com.github.ucchyocean.lc3.japanize; import java.util.Map; @@ -40,9 +40,9 @@ protected YukiKanaConverter() { builder.put("who", "うぉ"); // - builder.put("wyi", "ゐ"); // + + builder.put("wyi", "ゐ"); // - builder.put("wye", "ゑ"); // + + builder.put("wye", "ゑ"); // builder.put("la", "ぁ").put("xa", "ぁ"); @@ -52,7 +52,7 @@ protected YukiKanaConverter() { builder.put("lo", "ぉ").put("xo", "ぉ"); // - builder.put("ye", "いぇ"); // + + builder.put("ye", "いぇ"); // // // @@ -79,7 +79,7 @@ protected YukiKanaConverter() { builder.put("qwi", "くぃ").put("qi", "くぃ").put("qyi", "くぃ"); builder.put("qwu", "くぅ"); builder.put("qwe", "くぇ").put("qe", "くぇ").put("qye", "くぇ"); - builder.put("qwo", "くぉ").put("qo", "くぉ").put("kwo", "くぉ"); // + + builder.put("qwo", "くぉ").put("qo", "くぉ").put("kwo", "くぉ"); builder.put("ga", "が"); builder.put("gi", "ぎ"); @@ -191,7 +191,7 @@ protected YukiKanaConverter() { // // - builder.put("ltu", "っ").put("xtu", "っ").put("ltsu", "っ").put("xtsu", "っ"); // + + builder.put("ltu", "っ").put("xtu", "っ").put("ltsu", "っ").put("xtsu", "っ"); // // diff --git a/src/main/java/com/github/ucchyocean/lc3/member/ChannelMember.java b/src/main/java/com/github/ucchyocean/lc3/member/ChannelMember.java new file mode 100644 index 00000000..8c21a8d7 --- /dev/null +++ b/src/main/java/com/github/ucchyocean/lc3/member/ChannelMember.java @@ -0,0 +1,141 @@ +/* + * @author ucchy + * @license LGPLv3 + * @copyright Copyright ucchy 2020 + */ +package com.github.ucchyocean.lc3.member; + +import com.github.ucchyocean.lc3.LunaChat; +import com.github.ucchyocean.lc3.LunaChatMode; + +/** + * チャンネルメンバーの抽象クラス + * @author ucchy + */ +public abstract class ChannelMember implements Comparable { + + /** + * オンラインかどうか + * @return オンラインかどうか + */ + public abstract boolean isOnline(); + + /** + * プレイヤー名を返す + * @return プレイヤー名 + */ + public abstract String getName(); + + /** + * プレイヤー表示名を返す + * @return プレイヤー表示名 + */ + public abstract String getDisplayName(); + + /** + * プレフィックスを返す + * @return プレフィックス + */ + public abstract String getPrefix(); + + /** + * サフィックスを返す + * @return サフィックス + */ + public abstract String getSuffix(); + + /** + * メッセージを送る + * @param message 送るメッセージ + */ + public abstract void sendMessage(String message); + + /** + * 発言者が今いるワールドのワールド名を取得する + * @return ワールド名 + */ + public abstract String getWorldName(); + + /** + * 指定されたパーミッションノードの権限を持っているかどうかを取得する + * @param node パーミッションノード + * @return 権限を持っているかどうか + */ + public abstract boolean hasPermission(String node); + + /** + * 文字列表現を返す + * @return 名前管理なら名前、UUID管理なら "$" + UUID を返す + */ + @Override + public abstract String toString(); + + /** + * 指定されたパーミッションノードが定義されているかどうかを取得する + * @param node パーミッションノード + * @return 定義を持っているかどうか + */ + public abstract boolean isPermissionSet(String node); + + /** + * 指定されたメッセージの内容を発言する + * @param message メッセージ + */ + public abstract void chat(String message); + + /** + * 同一のオブジェクトかどうかを返す + * @param other 他方のオブジェクト + * @return 同一かどうか + */ + @Override + public boolean equals(Object other) { + if ( !(other instanceof ChannelMember) ) { + return false; + } + return this.toString().equals(other.toString()); + } + + /** + * インスタンス同士の比較を行う。このメソッドを実装しておくことで、 + * Java8でのHashMapのキー挿入における高速化が期待できる(らしい)。 + * @param other + * @return + * @see java.lang.Comparable#compareTo(java.lang.Object) + */ + @Override + public int compareTo(ChannelMember other) { + return this.toString().compareTo(other.toString()); + } + + /** + * 名前またはUUIDから、ChannelMemberを作成して返す + * @param nameOrUuid 名前、または、"$" + UUID + * @return ChannelMember + */ + public static ChannelMember getChannelMember(String nameOrUuid) { + if ( LunaChat.getMode() == LunaChatMode.BUKKIT ) { + return ChannelMemberPlayer.getChannelMember(nameOrUuid); + } else if ( LunaChat.getMode() == LunaChatMode.BUNGEE ) { + return ChannelMemberProxiedPlayer.getChannelMember(nameOrUuid); + } + return null; // TODO standalone用のChannelMemberを返す + } + + /** + * オブジェクトから、ChannelMemberを作成して返す + * @param obj + * @return ChannelMember + */ + public static ChannelMember getChannelMember(Object obj) { + + if ( obj != null && obj instanceof ChannelMember ) return (ChannelMember)obj; + + if ( LunaChat.getMode() == LunaChatMode.BUKKIT ) { + return ChannelMemberBukkit.getChannelMemberBukkit(obj); + } else if ( LunaChat.getMode() == LunaChatMode.BUNGEE ) { + return ChannelMemberBungee.getChannelMemberBungee(obj); + } + return null; // TODO standalone用のChannelMemberを返す + } +} diff --git a/src/main/java/com/github/ucchyocean/lc3/member/ChannelMemberBlock.java b/src/main/java/com/github/ucchyocean/lc3/member/ChannelMemberBlock.java new file mode 100644 index 00000000..38523ee8 --- /dev/null +++ b/src/main/java/com/github/ucchyocean/lc3/member/ChannelMemberBlock.java @@ -0,0 +1,172 @@ +/* + * @author ucchy + * @license LGPLv3 + * @copyright Copyright ucchy 2020 + */ +package com.github.ucchyocean.lc3.member; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.command.BlockCommandSender; +import org.bukkit.entity.Player; + +/** + * ChannelMemberのBukkit-BlockCommandSender実装 + * @author ucchy + */ +public class ChannelMemberBlock extends ChannelMemberBukkit { + + BlockCommandSender sender; + + /** + * コンストラクタ + * @param sender コマンドブロック + */ + public ChannelMemberBlock(BlockCommandSender sender) { + this.sender = sender; + } + + /** + * オンラインかどうか + * @return 常にtrue + * @see com.github.ucchyocean.lc.channel.ChannelPlayer#isOnline() + */ + @Override + public boolean isOnline() { + return true; + } + + /** + * プレイヤー名を返す + * @return プレイヤー名 + * @see com.github.ucchyocean.lc.channel.ChannelPlayer#getName() + */ + @Override + public String getName() { + return sender.getName(); + } + + /** + * プレイヤー表示名を返す + * @return プレイヤー表示名 + * @see com.github.ucchyocean.lc.channel.ChannelPlayer#getDisplayName() + */ + @Override + public String getDisplayName() { + return sender.getName(); + } + + /** + * プレフィックスを返す + * @return 常に空文字列 + * @see com.github.ucchyocean.lc.channel.ChannelPlayer#getPrefix() + */ + @Override + public String getPrefix() { + return ""; + } + + /** + * サフィックスを返す + * @return 常に空文字列 + * @see com.github.ucchyocean.lc.channel.ChannelPlayer#getSuffix() + */ + @Override + public String getSuffix() { + return ""; + } + + /** + * メッセージを送る、実際は何もせずにメッセージを捨てる + * @param message + * @see com.github.ucchyocean.lc.channel.ChannelPlayer#sendMessage(java.lang.String) + */ + @Override + public void sendMessage(String message) { + // do nothing. + } + + /** + * BukkitのPlayerを取得する + * @return 常にnullが返される + * @see com.github.ucchyocean.lc.channel.ChannelPlayer#getPlayer() + */ + @Override + public Player getPlayer() { + return null; + } + + /** + * 発言者が今いるワールドのワールド名を取得する + * @return 常に "-" が返される。 + * @see com.github.ucchyocean.lc.channel.ChannelPlayer#getWorldName() + */ + @Override + public String getWorldName() { + return "-"; + } + + /** + * 発言者が今いる位置を取得する + * @return 発言者の位置 + * @see com.github.ucchyocean.lc.channel.ChannelPlayer#getLocation() + */ + @Override + public Location getLocation() { + if ( sender != null ) { + return sender.getBlock().getLocation(); + } + return null; + } + + /** + * 指定されたパーミッションノードの権限を持っているかどうかを取得する + * @param node パーミッションノード + * @return 権限を持っているかどうか + * @see com.github.ucchyocean.lc.channel.ChannelPlayer#hasPermission(java.lang.String) + */ + @Override + public boolean hasPermission(String node) { + return sender.hasPermission(node); + } + + /** + * 指定されたパーミッションノードが定義されているかどうかを取得する + * @param node パーミッションノード + * @return 定義を持っているかどうか + * @see com.github.ucchyocean.lc.channel.ChannelPlayer#isPermissionSet(java.lang.String) + */ + @Override + public boolean isPermissionSet(String node) { + return sender.isPermissionSet(node); + } + + /** + * 指定されたメッセージの内容を発言する + * @param message メッセージ + * @see com.github.ucchyocean.lc3.member.ChannelMember#chat(java.lang.String) + */ + public void chat(String message) { + Bukkit.broadcastMessage("<" + getName() + ">" + message); + } + + /** + * IDを返す + * @return 名前をそのまま返す + * @see com.github.ucchyocean.lc.channel.ChannelPlayer#getID() + */ + @Override + public String toString() { + return getName(); + } + + @Override + public World getWorld() { + return sender.getBlock().getWorld(); + } + + public BlockCommandSender getBlockCommandSender() { + return sender; + } +} diff --git a/src/main/java/com/github/ucchyocean/lc3/member/ChannelMemberBukkit.java b/src/main/java/com/github/ucchyocean/lc3/member/ChannelMemberBukkit.java new file mode 100644 index 00000000..e4735db6 --- /dev/null +++ b/src/main/java/com/github/ucchyocean/lc3/member/ChannelMemberBukkit.java @@ -0,0 +1,54 @@ +/* + * @author ucchy + * @license LGPLv3 + * @copyright Copyright ucchy 2020 + */ +package com.github.ucchyocean.lc3.member; + +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.command.BlockCommandSender; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.entity.Player; + +/** + * チャンネルメンバーのBukkit抽象クラス + * @author ucchy + */ +public abstract class ChannelMemberBukkit extends ChannelMember { + + /** + * BukkitのPlayerを取得する + * @return Player + */ + public abstract Player getPlayer(); + + /** + * 発言者が今いる位置を取得する + * @return 発言者の位置 + */ + public abstract Location getLocation(); + + /** + * 発言者が今いるワールドを取得する + * @return 発言者の位置 + */ + public abstract World getWorld(); + + /** + * CommandSenderから、ChannelMemberを作成して返す + * @param sender + * @return ChannelMember + */ + public static ChannelMemberBukkit getChannelMemberBukkit(Object sender) { + if ( sender == null || !(sender instanceof CommandSender) ) return null; + if ( sender instanceof BlockCommandSender ) { + return new ChannelMemberBlock((BlockCommandSender)sender); + } else if ( sender instanceof ConsoleCommandSender ) { + return new ChannelMemberBukkitConsole((ConsoleCommandSender)sender); + } else { + return ChannelMemberPlayer.getChannelPlayer((CommandSender)sender); + } + } +} diff --git a/src/main/java/com/github/ucchyocean/lc3/member/ChannelMemberBukkitConsole.java b/src/main/java/com/github/ucchyocean/lc3/member/ChannelMemberBukkitConsole.java new file mode 100644 index 00000000..c5496d25 --- /dev/null +++ b/src/main/java/com/github/ucchyocean/lc3/member/ChannelMemberBukkitConsole.java @@ -0,0 +1,166 @@ +/* + * @author ucchy + * @license LGPLv3 + * @copyright Copyright ucchy 2020 + */ +package com.github.ucchyocean.lc3.member; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.entity.Player; + +/** + * ChannelMemberのBukkit-ConsoleCommandSender実装 + * @author ucchy + */ +public class ChannelMemberBukkitConsole extends ChannelMemberBukkit { + + ConsoleCommandSender sender; + + /** + * コンストラクタ + * @param sender コンソール + */ + public ChannelMemberBukkitConsole(ConsoleCommandSender sender) { + this.sender = sender; + } + + /** + * オンラインかどうか + * @return 常にtrue + * @see com.github.ucchyocean.lc.channel.ChannelPlayer#isOnline() + */ + @Override + public boolean isOnline() { + return true; + } + + /** + * プレイヤー名を返す + * @return プレイヤー名 + * @see com.github.ucchyocean.lc.channel.ChannelPlayer#getName() + */ + @Override + public String getName() { + return sender.getName(); + } + + /** + * プレイヤー表示名を返す + * @return プレイヤー表示名 + * @see com.github.ucchyocean.lc.channel.ChannelPlayer#getDisplayName() + */ + @Override + public String getDisplayName() { + return sender.getName(); + } + + /** + * プレフィックスを返す + * @return 常に空文字列 + * @see com.github.ucchyocean.lc.channel.ChannelPlayer#getPrefix() + */ + @Override + public String getPrefix() { + return ""; + } + + /** + * サフィックスを返す + * @return 常に空文字列 + * @see com.github.ucchyocean.lc.channel.ChannelPlayer#getSuffix() + */ + @Override + public String getSuffix() { + return ""; + } + + /** + * メッセージを送る + * @param message 送信するメッセージ + * @see com.github.ucchyocean.lc.channel.ChannelPlayer#sendMessage(java.lang.String) + */ + @Override + public void sendMessage(String message) { + if ( message == null || message.isEmpty() ) return; + sender.sendMessage(message); + } + + /** + * BukkitのPlayerを取得する + * @return 常にnullが返される + * @see com.github.ucchyocean.lc.channel.ChannelPlayer#getPlayer() + */ + @Override + public Player getPlayer() { + return null; + } + + /** + * 発言者が今いるワールドのワールド名を取得する + * @return 常に "-" が返される。 + * @see com.github.ucchyocean.lc.channel.ChannelPlayer#getWorldName() + */ + @Override + public String getWorldName() { + return "-"; + } + + /** + * 発言者が今いる位置を取得する + * @return 常にnullが返される + * @see com.github.ucchyocean.lc.channel.ChannelPlayer#getLocation() + */ + @Override + public Location getLocation() { + return null; + } + + /** + * 指定されたパーミッションノードの権限を持っているかどうかを取得する + * @param node パーミッションノード + * @return 権限を持っているかどうか + * @see com.github.ucchyocean.lc.channel.ChannelPlayer#hasPermission(java.lang.String) + */ + @Override + public boolean hasPermission(String node) { + return sender.hasPermission(node); + } + + /** + * 指定されたパーミッションノードが定義されているかどうかを取得する + * @param node パーミッションノード + * @return 定義を持っているかどうか + * @see com.github.ucchyocean.lc.channel.ChannelPlayer#isPermissionSet(java.lang.String) + */ + @Override + public boolean isPermissionSet(String node) { + return sender.isPermissionSet(node); + } + + /** + * 指定されたメッセージの内容を発言する + * @param message メッセージ + * @see com.github.ucchyocean.lc3.member.ChannelMember#chat(java.lang.String) + */ + public void chat(String message) { + Bukkit.broadcastMessage("<" + getName() + ">" + message); + } + + /** + * IDを返す + * @return 名前をそのまま返す + * @see com.github.ucchyocean.lc.channel.ChannelPlayer#getID() + */ + @Override + public String toString() { + return getName(); + } + + @Override + public World getWorld() { + return null; + } +} diff --git a/src/main/java/com/github/ucchyocean/lc3/member/ChannelMemberBungee.java b/src/main/java/com/github/ucchyocean/lc3/member/ChannelMemberBungee.java new file mode 100644 index 00000000..91ffb8e4 --- /dev/null +++ b/src/main/java/com/github/ucchyocean/lc3/member/ChannelMemberBungee.java @@ -0,0 +1,44 @@ +/* + * @author ucchy + * @license LGPLv3 + * @copyright Copyright ucchy 2020 + */ +package com.github.ucchyocean.lc3.member; + +import net.md_5.bungee.api.CommandSender; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import net.md_5.bungee.api.connection.Server; + +/** + * チャンネルメンバーのBungee抽象クラス + * @author ucchy + */ +public abstract class ChannelMemberBungee extends ChannelMember { + + /** + * BungeeのProxiedPlayerを取得する + * @return ProxiedPlayer + */ + public abstract ProxiedPlayer getPlayer(); + + /** + * 発言者が今いるサーバーを取得する + * @return サーバー + */ + public abstract Server getServer(); + + /** + * CommandSenderから、ChannelMemberを作成して返す + * @param sender + * @return ChannelMember + */ + public static ChannelMemberBungee getChannelMemberBungee(Object sender) { + if ( sender == null || !(sender instanceof CommandSender) ) return null; + if ( sender instanceof ProxiedPlayer ) { + return new ChannelMemberProxiedPlayer(((ProxiedPlayer)sender).getUniqueId()); + } else { + // ProxiedPlayer以外のCommandSenderは、ConsoleSenderしかないはず + return new ChannelMemberBungeeConsole((CommandSender)sender); + } + } +} diff --git a/src/main/java/com/github/ucchyocean/lc3/member/ChannelMemberBungeeConsole.java b/src/main/java/com/github/ucchyocean/lc3/member/ChannelMemberBungeeConsole.java new file mode 100644 index 00000000..cbaa7857 --- /dev/null +++ b/src/main/java/com/github/ucchyocean/lc3/member/ChannelMemberBungeeConsole.java @@ -0,0 +1,160 @@ +/* + * @author ucchy + * @license LGPLv3 + * @copyright Copyright ucchy 2020 + */ +package com.github.ucchyocean.lc3.member; + +import net.md_5.bungee.api.CommandSender; +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.chat.TextComponent; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import net.md_5.bungee.api.connection.Server; + +/** + * ChannelMemberのBungee-ConsoleCommandSender実装 + * @author ucchy + */ +public class ChannelMemberBungeeConsole extends ChannelMemberBungee { + + private CommandSender sender; + + /** + * コンストラクタ + * @param sender ConsoleのCommandSender + */ + public ChannelMemberBungeeConsole(CommandSender sender) { + this.sender = sender; + } + + /** + * BungeeのProxiedPlayerを取得する + * @return 常にnullが返される + * @see com.github.ucchyocean.lc3.member.ChannelMemberBungee#getPlayer() + */ + @Override + public ProxiedPlayer getPlayer() { + return null; + } + + /** + * 発言者が今いるサーバーを取得する + * @return 常にnullが返される + * @see com.github.ucchyocean.lc3.member.ChannelMemberBungee#getServer() + */ + @Override + public Server getServer() { + return null; + } + + /** + * 発言者がオンラインかどうかを取得する + * @return 常にtrueが返される + * @see com.github.ucchyocean.lc3.member.ChannelMember#isOnline() + */ + @Override + public boolean isOnline() { + return true; + } + + /** + * 発言者名を取得する + * @return 発言者名 + * @see com.github.ucchyocean.lc3.member.ChannelMember#getName() + */ + @Override + public String getName() { + return sender.getName(); + } + + /** + * 発言者の表示名を取得する + * @return 発言者の表示名 + * @see com.github.ucchyocean.lc3.member.ChannelMember#getDisplayName() + */ + @Override + public String getDisplayName() { + return sender.getName(); + } + + /** + * プレフィックスを返す + * @return 常に空文字列 + * @see com.github.ucchyocean.lc3.member.ChannelMember#getPrefix() + */ + @Override + public String getPrefix() { + return null; + } + + /** + * サフィックスを返す + * @return 常に空文字列 + * @see com.github.ucchyocean.lc3.member.ChannelMember#getSuffix() + */ + @Override + public String getSuffix() { + return null; + } + + /** + * 発言者にメッセージを送信する + * @param message メッセージ + * @see com.github.ucchyocean.lc3.member.ChannelMember#sendMessage(java.lang.String) + */ + @Override + public void sendMessage(String message) { + sender.sendMessage(TextComponent.fromLegacyText(message)); + } + + /** + * 発言者が今いるワールド名を返す + * @return 常に"-"が返される + * @see com.github.ucchyocean.lc3.member.ChannelMember#getWorldName() + */ + @Override + public String getWorldName() { + return "-"; + } + + /** + * 指定されたパーミッションノードの権限を持っているかどうかを取得する + * @param node パーミッションノード + * @return 権限を持っているかどうか + * @see com.github.ucchyocean.lc3.member.ChannelMember#hasPermission(java.lang.String) + */ + @Override + public boolean hasPermission(String node) { + return sender.hasPermission(node); + } + + /** + * 指定されたパーミッションノードが定義されているかどうかを取得する + * @param node パーミッションノード + * @return 定義を持っているかどうか + * @see com.github.ucchyocean.lc3.member.ChannelMember#isPermissionSet(java.lang.String) + */ + @Override + public boolean isPermissionSet(String node) { + return sender.getPermissions().contains(node); + } + + /** + * 指定されたメッセージの内容を発言する + * @param message メッセージ + * @see com.github.ucchyocean.lc3.member.ChannelMember#chat(java.lang.String) + */ + public void chat(String message) { + ProxyServer.getInstance().broadcast(TextComponent.fromLegacyText("<" + getName() + ">" + message)); + } + + /** + * IDを返す + * @return 名前をそのまま返す + * @see com.github.ucchyocean.lc3.member.ChannelMember#toString() + */ + @Override + public String toString() { + return getName(); + } +} diff --git a/src/main/java/com/github/ucchyocean/lc3/member/ChannelMemberPlayer.java b/src/main/java/com/github/ucchyocean/lc3/member/ChannelMemberPlayer.java new file mode 100644 index 00000000..804e4f19 --- /dev/null +++ b/src/main/java/com/github/ucchyocean/lc3/member/ChannelMemberPlayer.java @@ -0,0 +1,281 @@ +/* + * @author ucchy + * @license LGPLv3 + * @copyright Copyright ucchy 2020 + */ +package com.github.ucchyocean.lc3.member; + +import java.util.UUID; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import com.github.ucchyocean.lc3.LunaChat; +import com.github.ucchyocean.lc3.LunaChatBukkit; +import com.github.ucchyocean.lc3.bridge.VaultChatBridge; + +/** + * ChannelMemberのBukkitPlayer実装 + * @author ucchy + */ +public class ChannelMemberPlayer extends ChannelMemberBukkit { + + private UUID id; + + /** + * コンストラクタ + * @param id プレイヤーID + */ + public ChannelMemberPlayer(String id) { + this.id = UUID.fromString(id); + } + + /** + * コンストラクタ + * @param id UUID + */ + public ChannelMemberPlayer(UUID id) { + this.id = id; + } + + /** + * プレイヤー名からUUIDを取得してChannelMemberPlayerを作成して返す + * @param name プレイヤー名 + * @return ChannelMemberPlayer + */ + public static ChannelMemberPlayer getChannelMemberPlayerFromName(String name) { + Player player = Bukkit.getPlayerExact(name); + if ( player != null ) { + return new ChannelMemberPlayer(player.getUniqueId()); + } + @SuppressWarnings("deprecation") + OfflinePlayer offline = Bukkit.getOfflinePlayer(name); + if ( offline != null && offline.getUniqueId() != null ) { + return new ChannelMemberPlayer(offline.getUniqueId()); + } + return null; + } + + /** + * CommandSenderから、ChannelPlayerを作成して返す + * @param sender + * @return ChannelPlayer + */ + public static ChannelMemberPlayer getChannelPlayer(CommandSender sender) { + if ( sender instanceof Player ) { + return new ChannelMemberPlayer(((Player)sender).getUniqueId()); + } + return new ChannelMemberPlayer(sender.getName()); + } + + /** + * オンラインかどうか + * @return オンラインかどうか + */ + @Override + public boolean isOnline() { + Player player = Bukkit.getPlayer(id); + return (player != null); + } + + /** + * プレイヤー名を返す + * @return プレイヤー名 + * @see com.github.ucchyocean.lc.channel.ChannelPlayer#getName() + */ + @Override + public String getName() { + String cache = LunaChat.getUUIDCacheData().get(id.toString()); + if ( cache != null ) { + return cache; + } + Player player = Bukkit.getPlayer(id); + if ( player != null ) { + return player.getName(); + } + OfflinePlayer offlineplayer = Bukkit.getOfflinePlayer(id); + if ( offlineplayer != null ) { + String name = offlineplayer.getName(); + return name; + } + return id.toString(); + } + + /** + * プレイヤー表示名を返す + * @return プレイヤー表示名 + * @see com.github.ucchyocean.lc.channel.ChannelPlayer#getDisplayName() + */ + @Override + public String getDisplayName() { + Player player = getPlayer(); + if ( player != null ) { + return player.getDisplayName(); + } + return getName(); + } + + /** + * プレフィックスを返す + * @return プレフィックス + * @see com.github.ucchyocean.lc.channel.ChannelPlayer#getPrefix() + */ + @Override + public String getPrefix() { + VaultChatBridge vault = LunaChatBukkit.getInstance().getVaultChat(); + if ( vault == null ) { + return ""; + } + Player player = getPlayer(); + if ( player != null ) { + return vault.getPlayerPrefix(player); + } + return ""; + } + + /** + * サフィックスを返す + * @return サフィックス + * @see com.github.ucchyocean.lc.channel.ChannelPlayer#getSuffix() + */ + @Override + public String getSuffix() { + VaultChatBridge vault = LunaChatBukkit.getInstance().getVaultChat(); + if ( vault == null ) { + return ""; + } + Player player = getPlayer(); + if ( player != null ) { + return vault.getPlayerSuffix(player); + } + return ""; + } + + /** + * メッセージを送る + * @param message 送るメッセージ + * @see com.github.ucchyocean.lc.channel.ChannelPlayer#sendMessage(java.lang.String) + */ + @Override + public void sendMessage(String message) { + if ( message == null || message.isEmpty() ) return; + Player player = getPlayer(); + if ( player != null ) { + player.sendMessage(message); + } + } + + /** + * BukkitのPlayerを取得する + * @return Player + * @see com.github.ucchyocean.lc.channel.ChannelPlayer#getPlayer() + */ + @Override + public Player getPlayer() { + return Bukkit.getPlayer(id); + } + + /** + * 発言者が今いるワールドのワールド名を取得する + * @return ワールド名 + * @see com.github.ucchyocean.lc.channel.ChannelPlayer#getWorldName() + */ + @Override + public String getWorldName() { + Player player = getPlayer(); + if ( player != null ) { + return player.getWorld().getName(); + } + return "-"; + } + + /** + * 発言者が今いる位置を取得する + * @return 発言者の位置 + * @see com.github.ucchyocean.lc.channel.ChannelPlayer#getLocation() + */ + @Override + public Location getLocation() { + Player player = getPlayer(); + if ( player != null ) { + return player.getLocation(); + } + return null; + } + + /** + * 指定されたパーミッションノードの権限を持っているかどうかを取得する + * @param node パーミッションノード + * @return 権限を持っているかどうか + * @see com.github.ucchyocean.lc.channel.ChannelPlayer#hasPermission(java.lang.String) + */ + @Override + public boolean hasPermission(String node) { + Player player = getPlayer(); + if ( player == null ) { + return false; + } else { + return player.hasPermission(node); + } + } + + /** + * 指定されたパーミッションノードが定義されているかどうかを取得する + * @param node パーミッションノード + * @return 定義を持っているかどうか + * @see com.github.ucchyocean.lc.channel.ChannelPlayer#isPermissionSet(java.lang.String) + */ + @Override + public boolean isPermissionSet(String node) { + Player player = getPlayer(); + if ( player == null ) { + return false; + } else { + return player.isPermissionSet(node); + } + } + + /** + * 指定されたメッセージの内容を発言する + * @param message メッセージ + * @see com.github.ucchyocean.lc3.member.ChannelMember#chat(java.lang.String) + */ + public void chat(String message) { + Player player = getPlayer(); + if ( player != null ) { + player.chat(message); + } + } + + /** + * IDを返す + * @return "$" + UUID を返す + * @see com.github.ucchyocean.lc.channel.ChannelPlayer#getID() + */ + @Override + public String toString() { + return "$" + id.toString(); + } + + @Override + public World getWorld() { + Player player = getPlayer(); + if ( player != null ) return player.getWorld(); + return null; + } + + public static ChannelMemberPlayer getChannelMember(String nameOrUuid) { + if ( nameOrUuid.startsWith("$") ) { + return new ChannelMemberPlayer(nameOrUuid.substring(1)); + } else { + @SuppressWarnings("deprecation") + OfflinePlayer op = Bukkit.getOfflinePlayer(nameOrUuid); + if ( op == null ) return null; + return new ChannelMemberPlayer(op.getUniqueId()); + } + } +} diff --git a/src/main/java/com/github/ucchyocean/lc3/member/ChannelMemberProxiedPlayer.java b/src/main/java/com/github/ucchyocean/lc3/member/ChannelMemberProxiedPlayer.java new file mode 100644 index 00000000..b7334d5e --- /dev/null +++ b/src/main/java/com/github/ucchyocean/lc3/member/ChannelMemberProxiedPlayer.java @@ -0,0 +1,226 @@ +/* + * @author ucchy + * @license LGPLv3 + * @copyright Copyright ucchy 2020 + */ +package com.github.ucchyocean.lc3.member; + +import java.util.UUID; + +import org.jetbrains.annotations.Nullable; + +import com.github.ucchyocean.lc3.LunaChat; + +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.chat.TextComponent; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import net.md_5.bungee.api.connection.Server; + +/** + * ChannelMemberのBungeeCord-ProxiedPlayer実装 + * @author ucchy + */ +public class ChannelMemberProxiedPlayer extends ChannelMemberBungee { + + private UUID id; + + /** + * コンストラクタ + * @param id プレイヤーID + */ + public ChannelMemberProxiedPlayer(String id) { + this.id = UUID.fromString(id); + } + + /** + * コンストラクタ + * @param id UUID + */ + public ChannelMemberProxiedPlayer(UUID id) { + this.id = id; + } + + /** + * プレイヤー名からUUIDを取得してChannelMemberProxiedPlayerを作成して返す + * @param nameOrUuid 名前、または、"$" + UUID + * @return ChannelMemberProxiedPlayer + */ + public static ChannelMemberProxiedPlayer getChannelMember(String nameOrUuid) { + if ( nameOrUuid.startsWith("$") ) { + return new ChannelMemberProxiedPlayer(UUID.fromString(nameOrUuid.substring(1))); + } else { + // TODO オフラインのプレイヤー取得について検討する + ProxiedPlayer player = ProxyServer.getInstance().getPlayer(nameOrUuid); + if ( player != null ) return new ChannelMemberProxiedPlayer(player.getUniqueId()); + } + return null; + } + + /** + * オンラインかどうか + * @return オンラインかどうか + */ + @Override + public boolean isOnline() { + return (ProxyServer.getInstance().getPlayer(id) != null); + } + + /** + * プレイヤー名を返す + * @return プレイヤー名 + * @see com.github.ucchyocean.lc.channel.ChannelPlayer#getName() + */ + @Override + public String getName() { + String cache = LunaChat.getUUIDCacheData().get(id.toString()); + if ( cache != null ) { + return cache; + } + ProxiedPlayer player = getPlayer(); + if ( player != null ) { + return player.getName(); + } + return id.toString(); + } + + /** + * プレイヤー表示名を返す + * @return プレイヤー表示名 + * @see com.github.ucchyocean.lc.channel.ChannelPlayer#getDisplayName() + */ + @Override + public String getDisplayName() { + ProxiedPlayer player = getPlayer(); + if ( player != null ) { + return player.getDisplayName(); + } + return getName(); + } + + /** + * プレフィックスを返す + * @return プレフィックス + * @see com.github.ucchyocean.lc.channel.ChannelPlayer#getPrefix() + */ + @Override + public String getPrefix() { + + // TODO 未実装 + + return ""; + } + + /** + * サフィックスを返す + * @return サフィックス + * @see com.github.ucchyocean.lc.channel.ChannelPlayer#getSuffix() + */ + @Override + public String getSuffix() { + + // TODO 未実装 + + return ""; + } + + /** + * メッセージを送る + * @param message 送るメッセージ + * @see com.github.ucchyocean.lc.channel.ChannelPlayer#sendMessage(java.lang.String) + */ + @Override + public void sendMessage(String message) { + if ( message == null || message.isEmpty() ) return; + ProxiedPlayer player = getPlayer(); + if ( player != null ) { + player.sendMessage(TextComponent.fromLegacyText(message)); + } + } + + /** + * 発言者が今いるワールドのワールド名を取得する + * @return ワールド名 + * @see com.github.ucchyocean.lc.channel.ChannelPlayer#getWorldName() + */ + @Override + public String getWorldName() { + return "-"; + } + + /** + * 指定されたパーミッションノードの権限を持っているかどうかを取得する + * @param node パーミッションノード + * @return 権限を持っているかどうか + * @see com.github.ucchyocean.lc.channel.ChannelPlayer#hasPermission(java.lang.String) + */ + @Override + public boolean hasPermission(String node) { + ProxiedPlayer player = getPlayer(); + if ( player == null ) { + return false; + } else { + return player.hasPermission(node); + } + } + + /** + * 指定されたパーミッションノードが定義されているかどうかを取得する + * @param node パーミッションノード + * @return 定義を持っているかどうか + * @see com.github.ucchyocean.lc3.member.ChannelMember#isPermissionSet(java.lang.String) + */ + @Override + public boolean isPermissionSet(String node) { + // TODO 要テスト + ProxiedPlayer player = getPlayer(); + if ( player != null ) { + return player.getPermissions().contains(node); + } + return false; + } + + /** + * 指定されたメッセージの内容を発言する + * @param message メッセージ + * @see com.github.ucchyocean.lc3.member.ChannelMember#chat(java.lang.String) + */ + public void chat(String message) { + ProxiedPlayer player = getPlayer(); + if ( player != null ) { + player.chat(message); + } + } + + /** + * IDを返す + * @return "$" + UUID を返す + * @see com.github.ucchyocean.lc.channel.ChannelPlayer#getID() + */ + @Override + public String toString() { + return "$" + id.toString(); + } + + /** + * ProxiedPlayerを取得して返す + * @return ProxiedPlayer + */ + @Override + public @Nullable ProxiedPlayer getPlayer() { + return ProxyServer.getInstance().getPlayer(id); + } + + /** + * 発言者が今いるサーバーを取得する + * @return サーバー + * @see com.github.ucchyocean.lc3.member.ChannelMemberBungee#getServer() + */ + @Override + public @Nullable Server getServer() { + ProxiedPlayer player = getPlayer(); + if ( player != null ) { + return player.getServer(); + } + return null; + } +} diff --git a/src/main/java/com/github/ucchyocean/lc3/tool/MessageParser.java b/src/main/java/com/github/ucchyocean/lc3/tool/MessageParser.java new file mode 100644 index 00000000..2223ea8f --- /dev/null +++ b/src/main/java/com/github/ucchyocean/lc3/tool/MessageParser.java @@ -0,0 +1,153 @@ +/* + * @author ucchy + * @license LGPLv3 + * @copyright Copyright ucchy 2020 + */ +package com.github.ucchyocean.lc3.tool; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import com.github.ucchyocean.lc3.YamlConfig; + +/** + * messages_ja.yml を読んで、Messagesクラス用のメソッドを生成するツール + * @author ucchy + */ +public class MessageParser { + + private static final String INPUT_FILE_PATH = "src/main/resources/messages_ja.yml"; + private static final String OUTPUT_FILE_PATH = "src/main/java/com/github/ucchyocean/lc3/Messages.java"; + + private static final String START_MARKER = " // === Auto-generated methods area start. ==="; + private static final String END_MARKER = " // === Auto-generated methods area end. ==="; + + public static void main(String[] args) { + + // 自動生成メソッドを作成する + List methods = makeAutoGeneratedMethods(); + + // 出力ファイルを全行読み取る + File file = new File(OUTPUT_FILE_PATH); + List contents = readAllLines(file); + + // START_MARKERが出てくるまで読み進める + List result = new ArrayList<>(); + int index = 0; + while ( !contents.get(index).equals(START_MARKER) ) { + result.add(contents.get(index)); + index++; + if ( contents.size() <= index ) { + System.err.println("ERROR! : START_MARKER not found."); + return; + } + } + result.add(contents.get(index)); + index++; + + // 自動生成メソッドを挿入する + result.addAll(methods); + + // END_MARKERが出てくるまで読み捨てる + while ( !contents.get(index).equals(END_MARKER) ) { + index++; + if ( contents.size() <= index ) { + System.err.println("ERROR! : END_MARKER not found."); + return; + } + } + + // 残りをそのまま読み込む + while ( contents.size() > index ) { + result.add(contents.get(index)); + index++; + } + + // ファイルへ出力 + writeAllLines(file, result); + } + + private static List makeAutoGeneratedMethods() { + + List result = new ArrayList<>(); + + YamlConfig yaml = YamlConfig.load(new File(INPUT_FILE_PATH)); + for ( String key : yaml.getKeys(false) ) { + String value = yaml.getString(key); + + ArrayList keywords = new ArrayList<>(); + + Pattern pattern = Pattern.compile("%([^%]*)%"); + Matcher matcher = pattern.matcher(value); + + while ( matcher.find() ) { + keywords.add(matcher.group(1)); + } + + String arguments = ""; + for ( String keyword : keywords ) { + if ( arguments.length() > 0 ) arguments += ", "; + arguments += "Object " + keyword; + } + + // 出力 + result.add(""); + result.add(" /**"); + result.add(" * " + value); + result.add(" */"); + result.add(String.format( + " public static String %s(%s) {", key, arguments)); + result.add(String.format( + " String msg = resources.getString(\"%s\");", key)); + result.add(String.format( + " if ( msg == null ) return \"\";", key)); + + for ( String keyword : keywords ) { + result.add(String.format( + " msg = msg.replace(\"%%%s%%\", %s.toString());", keyword, keyword)); + } + if ( key.startsWith("errmsg") ) { + result.add(" return Utility.replaceColorCode(resources.getString(\"errorPrefix\", \"\") + msg);"); + } else if ( key.startsWith("cmdmsg") ) { + result.add(" return Utility.replaceColorCode(resources.getString(\"infoPrefix\", \"\") + msg);"); + } else { + result.add(" return Utility.replaceColorCode(msg);"); + } + result.add(" }"); + } + + return result; + } + + private static List readAllLines(File file) { + List lines = new ArrayList<>(); + try ( BufferedReader reader = new BufferedReader(new FileReader(file)) ) { + String line; + while ( (line = reader.readLine()) != null ) { + lines.add(line); + } + } catch (IOException e) { + e.printStackTrace(); + } + return lines; + } + + private static void writeAllLines(File file, List lines) { + try ( BufferedWriter writer = new BufferedWriter(new FileWriter(file)) ) { + for ( String line : lines ) { + writer.write(line); + writer.newLine(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/resources/bungee.yml b/src/main/resources/bungee.yml new file mode 100644 index 00000000..05e816c1 --- /dev/null +++ b/src/main/resources/bungee.yml @@ -0,0 +1,5 @@ +name: ${project.name} +main: com.github.ucchyocean.lc3.LunaChatBungee +version: ${project.version} +author: ucchy, YukiLeafX, LazyGon +description: ${project.description} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml new file mode 100644 index 00000000..777eb866 --- /dev/null +++ b/src/main/resources/config.yml @@ -0,0 +1,206 @@ +# ${project.name} v${project.version} +# @author ucchy +# @license LGPLv3 +# @copyright Copyright ucchy 2020 + + +# -------------------- General settings -------------------- + +#Language setting +lang: en + +# Whether to enable channel chat function +enableChannelChat: true + +# You can set the priority of event processing. +# Use this when it doesn't work well in combination with other plugins. +# You can specify one of LOWEST, LOW, NORMAL, HIGH, HIGHEST. +# Leave the default HIGH if you're not sure. +playerChatEventListenerPriority: 'HIGH' + + +# -------------------- Channel chat settings -------------------- + +# Whether to treat the remarks of people who are not in channel chat as global +noJoinAsGlobal: true + +# Whether to leave the contents of channel chat remarks in the log +loggingChat: true + +# Whether to show the contents of channel chat on the server console +displayChatOnConsole: true + +# Global marker. +# If this is in the head of a statement, it temporarily becomes a global statement. +globalMarker: '!' + +# Whether to delete the channel when all members leave +zeroMemberRemove: false + +# Whether to show participating channels when logging in +showListOnJoin: false + +# When someone specifies a channel that does not exist with the "/ch join" command, +# whether to create a new channel and enter +createChannelOnJoinCommand: false + +# Global channel to use as default instead of regular chat. +# If you use regular chat without creating a global channel, +# specify the empty string ''. +globalChannel: '' + +# A channel(s) that users who join the server must join. +# Can be specified separately from the global channel. +# Multiple channels can be set. Example) forceJoinChannels: ['L','M','N'] +forceJoinChannels: [] + +# A keyword that must be included when executing the format command. +formatConstraint: ['%username','%msg'] + +# The format settings that are set by default when you create a channel. +# The following keywords can be used for formatting. +# %ch: Channel name +# %color: Channel color +# %username: Speaker display name +# %player: Speaker ID +# %world: world name +# %prefix: prefix (replaced if Vault and Prefix/Suffix plugin are installed) +# %suffix: suffix (replaced if Vault and Prefix/Suffix plugin are installed) +# %date: date +# %time: time +# %msg: Content of statement +defaultFormat: '&f[%color%ch&f]%prefix%username%suffix&a:&f %msg' + +# Setting to display the content of all channels on the OP screen. +opListenAllChannel: false + +# The minimum string length that the channel name must satisfy when creating a new channel. +# If the specified channel name is less than this number of characters, an error occurs and the channel cannot be created. +minChannelNameLength: 4 + +# Maximum string length that the channel name must satisfy when creating a new channel. +# If the specified channel name exceeds this number of characters, an error occurs and the channel cannot be created. +maxChannelNameLength: 20 + +# Whether to enable the quick channel chat feature. +# You can use Quick Channel Chat by saying "(Channel Name or Alias) + (Dedicated Symbol) + (Message)". +# For example, if you set the alias m to the main channel, you do not have to speak to the main channel +# m:Hello! +# You can say to the main channel by saying. +enableQuickChannelChat: true + +# Symbol used for quick channel chat feature. +quickChannelChatSeparator: ':' + + +# -------------------- Private message settings -------------------- + +# When sending a private message with the # /tell, /msg or /r command, applied formatting. +# The following keywords can be used for formatting. +# %ch: Channel name (same as "%player>%to") +# %username: Speaker display name +# %player: Speaker ID +# %server: Speaker's connection server name (valid when installed on BungeeCord side.) +# %to: ID of the person (recipient) who speaks +# %recieverserver: Recipient's connection server name (valid when installed on BungeeCord side) +# %world: Name of the world you said (Valid when it is installed on the spigot side. When MultiVerse is installed, the display name of the world is acquired and used.) +# %prefix: prefix (replaced if Vault and Prefix/Suffix plugin are installed) +# %suffix: suffix (replaced if Vault and Prefix/Suffix plugin are installed) +# %date: date +# %time: time +# %msg: Content of statement (When converted to Japanize, the result of Japanize is included.) +defaultFormatForPrivateMessage: '&7[%player -> %to]&f %msg' +#defaultFormatForPrivateMessage: '&7[%player@%server >%to@%recieverserver] %msg' + + +# -------------------- dynmap linkage setting -------------------- + +# Whether to send the contents of the broadcast channel to dynmap. +# This setting is ignored (handled as false) if dynmap is not loaded. +sendBroadcastChannelChatToDynmap: true + +# Whether to reflect the channel format when sending to dynmap. +# If set to true, a message reflecting the channel format will be displayed on the dynmap. +# If set to false, only messages will be displayed on dynmap. +# Reference: https://github.com/ucchyocean/LunaChat/issues/68 +sendFormattedMessageToDynmap: false + +# A channel that displays the content of the speech made from the dynmap Web UI. +# If dynmapChannel is not specified and globalChannel is specified, +# If dynmapChannel is not specified and globalChannel is not specified, the chat is usually done. +dynmapChannel: '' + + +# -------------------- NG word setting -------------------- + +# NG word setting. You can specify a regular expression. +#The NG word part is masked by the player who speaks the word set here. +ngword: [] + +# NG Word operation setting when speaking. You can set any of four: mask, mute, kick, ban. +# mask: mask NG words +# mute: Mute the speaking player from the channel after masking the NG word +# kick: After masking the NG word, kick the speaking player from the channel +# ban: After masking the NG word, ban the player who said it from the channel +# For regular chat (non-channel chat), +# Even if you set # kick or ban, only the mask is executed. +ngwordAction: mask + + +# -------------------- Chat decoration settings -------------------- + +# Whether to decorate normal chat (non-channel chat) from LunaChat. +enableNormalChatMessageFormat: true + +# Chat decoration formatting. +# The following keywords can be used for formatting. +# %username: Speaker display name +# %player: Speaker ID +# %world: Name of the world you said (Valid when it is installed on the spigot side. When MultiVerse is installed, the display name of the world is acquired and used.) +# %server: Speaker's connection server name (valid when installed on BungeeCord side.) +# %prefix: prefix (replaced if Vault and Prefix/Suffix plugins are installed) +# %suffix: suffix (replaced if Vault and Prefix/Suffix plugins are installed) +# %date: date +# %time: time +# %msg: Content of statement (When converted to Japanize, the result of Japanize is included.) +normalChatMessageFormat: '&f%prefix%username%suffix&a:&f %msg' +#normalChatMessageFormat: '&f%username@%server&a:&f %msg' + +# Color code (&a, &b, etc.) in normal chat (non-channel chat) +# Whether to enable. If set to false, color codes will not be converted. +enableNormalChatColorCode: true + + + +# -------------------- Japanize conversion settings -------------------- + +# Settings for converting Roman characters to Kana or Kanji. +# You can set any one of none/kana/GoogleIME. +# none: No conversion. +# kana: Kana conversion only. +# GoogleIME: After converting kana, convert kanji using GoogleIME. +japanizeType: none + +# When converting kana or kanji, +# Display the conversion result in a single line with the original statement content, or +# Set whether to display only the conversion result on the second line. +japanizeDisplayLine: 1 + +# Set the display format when japanizeDisplayLine is 1. +# The following keywords can be used for formatting. +# %msg: Original content +# %japanize: Japanize Within the converted statement +japanizeLine1Format: '%msg &6(%japanize)' + +# Sets the display format for the second line when japanizeDisplayLine is 2. +# The following keywords can be used for formatting. +# %msg: Original content +# %japanize: Japanize Converted remark contents +japanizeLine2Format: '&6[JP] %japanize' + +# Set whether to exclude the player name included in the statement from Japanize conversion. +japanizeIgnorePlayerName: true + +# Non-Japanese marker. +# If this is at the beginning of your remark, do not temporarily perform Japanize conversion. +noneJapanizeMarker: '#' diff --git a/src/main/resources/config_ja.yml b/src/main/resources/config_ja.yml index 51615bd0..c0b17eec 100644 --- a/src/main/resources/config_ja.yml +++ b/src/main/resources/config_ja.yml @@ -1,11 +1,14 @@ # ${project.name} v${project.version} # @author ucchy # @license LGPLv3 -# @copyright Copyright ucchy 2013 +# @copyright Copyright ucchy 2020 # -------------------- 全般設定 -------------------- +# 言語設定 +lang: ja + # チャンネルチャット機能を利用可能にするかどうか # Japanize機能のみを利用したい場合は、falseにしてください。 enableChannelChat: true @@ -25,15 +28,6 @@ noJoinAsGlobal: true # チャンネルチャットの発言内容を、ログに残すかどうか loggingChat: true -# チャンネルチャットの発言内容を、HawkEyeに記録するかどうか -# この設定を利用する場合は、HawkEyeのconfig.ymlで、log: セクションの chat の設定を true にしてください。 -loggingChatToHawkEye: true - -# チャンネルチャットの発言内容を、Prismに記録するかどうか -# この設定を利用する場合は、Prismのconfig.ymlで、 -# tracking: セクションの player-chat の設定を true にしてください。 -loggingChatToPrism: true - # チャンネルチャットの発言内容を、サーバーコンソールに表示するかどうか displayChatOnConsole: true @@ -108,14 +102,17 @@ quickChannelChatSeparator: ':' # %ch : チャンネル名(「%player>%to」と同一です。) # %username : 発言者表示名 # %player : 発言者ID +# %server : 発言者の接続サーバー名(BungeeCord側に導入したときに有効です。) # %to : 発言の相手(受信者)のID -# %world : 発言したワールド名 +# %recieverserver : 受信者の接続サーバー名(BungeeCord側に導入したときに有効です。) +# %world : 発言したワールド名(spigot側に導入したときに有効です。MultiVerseが導入されている場合は、ワールドの表示名を取得して使用します。) # %prefix : プレフィックス(VaultとPermissionsExが導入されている場合に置き換えられます) # %suffix : サフィックス(VaultとPermissionsExが導入されている場合に置き換えられます) # %date : 日付 # %time : 時刻 # %msg : 発言内容(Japanize変換された場合は、Japanize結果を含みます。) defaultFormatForPrivateMessage: '&7[%player -> %to]&f %msg' +#defaultFormatForPrivateMessage: '&7[%player@%server > %to@%recieverserver] %msg' # -------------------- dynmap連携設定 -------------------- @@ -141,7 +138,8 @@ dynmapChannel: '' # NGワード設定。正規表現が指定可能です。 # ここに設定されたワードを発言したプレイヤーは、NGワード部分がマスクされます。 -ngword: ['ちん(こ|ぽ|ちん)'] +ngword: +- 'ちん(こ|ぽ|ちん)' # NGワード発言時の動作設定。mask、mute、kick、ban の4つのいずれかが設定可能。 # mask : NGワードをマスクする @@ -156,23 +154,22 @@ ngwordAction: mask # -------------------- チャット装飾設定 -------------------- -# チャンネルチャット機能を利用しないユーザーのための設定です。 - # 通常チャット(非チャンネルチャット)の装飾を、LunaChatから行うかどうか。 -# Vault がロードされていない場合は、この設定は無視される(false扱い)。 enableNormalChatMessageFormat: true # チャット装飾のフォーマット設定。 # フォーマット設定には、下記のキーワードが使用できます。 # %username : 発言者表示名 # %player : 発言者ID -# %world : 発言したワールド名 -# %prefix : プレフィックス(VaultとPermissionsExが導入されている場合に置き換えられます) -# %suffix : サフィックス(VaultとPermissionsExが導入されている場合に置き換えられます) +# %world : 発言したワールド名(spigot側に導入したときに有効です。MultiVerseが導入されている場合は、ワールドの表示名を取得して使用します。) +# %server : 発言者の接続サーバー名(BungeeCord側に導入したときに有効です。) +# %prefix : プレフィックス(VaultとPrefix/Suffixプラグインが導入されている場合に置き換えられます) +# %suffix : サフィックス(VaultとPrefix/Suffixプラグインが導入されている場合に置き換えられます) # %date : 日付 # %time : 時刻 # %msg : 発言内容(Japanize変換された場合は、Japanize結果を含みます。) normalChatMessageFormat: '&f%prefix%username%suffix&a:&f %msg' +#normalChatMessageFormat: '&f%username@%server&a:&f %msg' # 通常チャット(非チャンネルチャット)で、カラーコード(&aや&bなど)を # 使用可能にするかどうか。falseに設定すると、カラーコードは変換されません。 @@ -217,3 +214,6 @@ japanizeIgnorePlayerName: true # ノンジャパナイズマーカー。 # これが発言の頭に入っている場合は、一時的にJapanize変換を実行しない。 noneJapanizeMarker: '#' + + +# -------------------- BungeeCord用設定 -------------------- diff --git a/src/main/resources/messages.yml b/src/main/resources/messages.yml deleted file mode 100644 index a9905947..00000000 --- a/src/main/resources/messages.yml +++ /dev/null @@ -1,212 +0,0 @@ -# ${project.name} v${project.version} -# @author ucchy -# @license LGPLv3 -# @copyright Copyright ucchy 2013 - -joinMessage: '&f[%color%ch&f]&7%player さんがチャンネルに参加しました。' -quitMessage: '&f[%color%ch&f]&7%player さんがチャンネルから退出しました。' -breakupMessage: '&f[%color%ch&f]&7チャンネルが削除されました。' -banMessage: '&f[%color%ch&f]&7%player さんをチャンネルからBANしました。' -kickMessage: '&f[%color%ch&f]&7%player さんをチャンネルからキックしました。' -muteMessage: '&f[%color%ch&f]&7%player さんをチャンネルからMuteしました。' -banNGWordMessage: '&f[%color%ch&f]&7NGワード発言により、%player さんをチャンネルから自動BANしました。' -kickNGWordMessage: '&f[%color%ch&f]&7NGワード発言により、%player さんをチャンネルから自動キックしました。' -muteNGWordMessage: '&f[%color%ch&f]&7NGワード発言により、%player さんをチャンネルから自動Muteしました。' -banWithExpireMessage: '&f[%color%ch&f]&7%player さんを期限 %d 分でチャンネルからBANしました。' -muteWithExpireMessage: '&f[%color%ch&f]&7%player さんを期限 %d 分でチャンネルからMuteしました。' -pardonMessage: '&f[%color%ch&f]&7%player さんのBANが解除されました。' -unmuteMessage: '&f[%color%ch&f]&7%player さんのMuteが解除されました。' -expiredBanMessage: '&f[%color%ch&f]&7%player さんの期限付きBANが解除されました。' -expiredMuteMessage: '&f[%color%ch&f]&7%player さんの期限付きMuteが解除されました。' - -addModeratorMessage: '&f[%color%ch&f]&7%player さんがチャンネルのモデレーターになりました。' -removeModeratorMessage: '&f[%color%ch&f]&7%player さんがチャンネルのモデレーターから外れました。' - -noRecipientMessage: '&f[%color%ch&f]&7あなたの発言は、誰にも届きませんでした。' - -listFirstLine: '&7---------- &bチャンネルリスト &7----------' -listFirstLinePaging: '&7---------- &bチャンネルリスト&7(&c%d&7/&c%d&7) ----------' -listEndLine: '&7----------------------------------' -listFormat: '&7| &f%s&7(&c%d&7/&c%d&7) &a%s' -listPlainPrefix: '&7| ' - -channelInfoFirstLine: '&7---------- &bチャンネル情報 &7----------' -channelInfoPrefix: '&7| ' -channelInfoAlias: '&7| &cチャンネル別名:&f' -channelInfoGlobal: '&7| &cグローバルチャンネル' -channelInfoBroadcast: '&7| &cブロードキャストチャンネル' -channelInfoSecret: '&7| &cシークレットチャンネル' -channelInfoPassword: '&7| &cパスワード設定あり' -channelInfoWorldChat: '&7| &cワールドチャット' -channelInfoRangeChat: '&7| &c範囲チャット:%d ブロック' -channelInfoFormat: '&7| &cフォーマット設定:' -channelInfoBanned: '&7| &cBANリスト:' -channelInfoMuted: '&7| &cMuteリスト:' - -motdFirstLine: '&7----- &b参加中のチャット &7-----' -hideChannelFirstLine: '&7----- &b非表示にしているチャット &7-----' -hidePlayerFirstLine: '&7----- &b非表示にしているプレイヤー &7-----' - -logDisplayFirstLine: '&7----- &b%sの発言ログ &7-----' -logDisplayEndLine: '&7----------------------------------' -logDisplayFormat: '&7| &c%s&7, &f%s&7: &f%s' - -infoPrefix: '&f[&aChat&f]' -errorPrefix: '&f[&cChat&f]' - -cmdmsgJoin: 'チャンネル %s に参加しました。' -cmdmsgSet: 'デフォルトの発言先を %s に設定しました。' -cmdmsgSetTopic: 'トピック: &a%s' -cmdmsgSetHide: '<注意> 現在このチャンネルを非表示に設定しています。' -cmdmsgLeave: 'チャンネル %s から退出しました。' -cmdmsgInvite: '%s さんを、チャンネル %s に招待しました。' -cmdmsgInvited1: '%s さんから、チャンネル %s に招待されました。' -cmdmsgInvited2: '入室するには /ch accept、拒否するには /ch deny を実行してください。' -cmdmsgDeny: '招待を拒否しました。' -cmdmsgDenyed: '招待が拒否されました。' -cmdmsgKick: '%s さんを、チャンネル %s からキックしました。' -cmdmsgKicked: 'チャンネル %s からキックされました。' -cmdmsgBan: '%s さんを、チャンネル %s からBANしました。' -cmdmsgBanWithExpire: '%s さんを、チャンネル %s から期限 %d 分でBANしました。' -cmdmsgBanned: 'チャンネル %s からBANされました。' -cmdmsgPardon: '%s さんの、チャンネル %s のBANを解除しました。' -cmdmsgPardoned: 'チャンネル %s のBANが解除されました。' -cmdmsgMute: '%s さんを、チャンネル %s でMuteしました。' -cmdmsgMuteWithExpire: '%s さんを、チャンネル %s から期限 %d 分でMuteしました。' -cmdmsgMuted: 'チャンネル %s からMuteされました。' -cmdmsgUnmute: '%s さんの、チャンネル %s のMuteを解除しました。' -cmdmsgUnmuted: 'チャンネル %s のMuteが解除されました。' -cmdmsgHided: 'チャンネル %s を非表示に設定しました。' -cmdmsgHidedPlayer: 'プレイヤー %s を非表示に設定しました。' -cmdmsgUnhided: 'チャンネル %s を表示に設定しました。' -cmdmsgUnhidedPlayer: 'プレイヤー %s を表示に設定しました。' - -cmdmsgReload: 'LunaChatの設定を再読み込みしました。' -cmdmsgCreate: 'チャンネル %s を新規作成しました。' -cmdmsgRemove: 'チャンネル %s を削除しました。' -cmdmsgFormat: 'メッセージフォーマットを %s に設定しました。' -cmdmsgModerator: '%s さんをチャンネル %s のモデレーターに設定しました。' -cmdmsgModeratorMinus: '%s さんをチャンネル %s のモデレーターから外しました。' -cmdmsgDictionaryAdd: '%s を %s と覚えました。' -cmdmsgDictionaryRemove: '%s を忘れました。' -cmdmsgOption: '%s を %s に設定しました。' -cmdmsgTemplate: 'テンプレート %s番を、%s に設定しました。' -cmdmsgTemplateRemove: 'テンプレート %s番を削除しました。' -cmdmsgCheck: '削除対象のチャンネルは %d 個です。' -cmdmsgCheckConfirm: '全て削除する場合は、/%s check remove を実行してください。' -cmdmsgCheckRemove: '%d 個のチャンネルを削除しました。' -cmdmsgSetDefault: '%s さんの発言先を %s に設定しました。' - -cmdmsgPlayerJapanize: 'Your chat''s Japanize conversion was turned %s.' -cmdmsgPlayerJapanizeOther: '%s さんのJapanize変換を %s にしました。' - -cmdmsgReplyInviter: '%sの現在の会話相手 : %s' -cmdmsgReplyInviterNone: '%sの現在の会話相手 : 相手がいません。' - -errmsgIngame: 'このコマンドはゲーム内からしか実行できません。' -errmsgCommand: 'コマンドの指定が正しくありません。' -errmsgNotExist: '指定されたチャンネルが存在しません。' -errmsgNotExistChannelAndPlayer: '指定されたチャンネルもプレイヤーも存在しません。' -errmsgNotExistOrNotSpecified: '指定されたチャンネルが存在しないか、チャンネルが指定されませんでした。' -errmsgExist: '指定されたチャンネル名が既に存在します。' -errmsgNomember: '指定されたチャンネルに参加していません。' -errmsgNomemberOther: '指定されたプレイヤーはチャンネルに参加していません。' -errmsgNotfoundPlayer: '指定されたプレイヤー %s が見つかりません。' -errmsgNotInvited: '招待を受けたプレイヤーではありません。' -errmsgNotfoundChannel: 'チャンネルが無くなってしまったため、参加できませんでした。' -errmsgInvitedAlreadyExist: '招待された %s さんは、既にチャンネルに参加しています。' -errmsgInvitedAlreadyJoin: '既にチャンネルに参加しています。' -errmsgNoJoin: '現在チャンネルに参加していません。' -errmsgBanned: 'あなたはこのチャンネルからBANされています。' -errmsgMuted: 'あなたはこのチャンネルからMuteされているため、発言できません。' -errmsgAlreadyBanned: '指定されたプレイヤーは既にBANリストに含まれています。' -errmsgAlreadyMuted: '指定されたプレイヤーは既にMuteリストに含まれています。' -errmsgAlreadyHided: 'このチャンネルは既に非表示になっています。' -errmsgAlreadyHidedPlayer: 'このプレイヤーは既に非表示になっています。' -errmsgAlreadyUnhided: 'このチャンネルは非表示になっていません。' -errmsgAlreadyUnhidedPlayer: 'このプレイヤーは非表示になっていません。' -errmsgCannotJoinPersonal: '個人チャットチャンネルには参加できません。' -errmsgNotModerator: 'あなたはモデレーターではないため、そのコマンドを実行できません。' -errmsgNotBanned: '指定されたプレイヤーはBANリストに含まれていません。' -errmsgNotMuted: '指定されたプレイヤーはMuteリストに含まれていません。' -errmsgInvalidOptions: '有効なオプション指定が1つもありませんでした。' -errmsgPassword1: 'このチャンネルはパスワードが設定されているため入れません。' -errmsgPassword2: 'パスワードを指定して、チャンネルに入ってください。' -errmsgPassword3: '/ch (channel) (password)' -errmsgPasswordNotmatch: 'パスワードが正しくないため、チャンネルに入れません。' -errmsgPermission: '権限 "%s" が無いため、実行できません。' -errmsgCannotLeaveGlobal: 'チャンネル %s はグローバルチャンネルなので、退出できません。' -errmsgCannotKickGlobal: 'チャンネル %s はグローバルチャンネルなので、キックできません。' -errmsgCannotBANGlobal: 'チャンネル %s はグローバルチャンネルなので、BANできません。' -errmsgCannotRemoveGlobal: 'チャンネル %s はグローバルチャンネルなので、削除できません。' -errmsgCannotModeratorGlobal: 'チャンネル %s はグローバルチャンネルなので、モデレーターを設定できません。' -errmsgCannotLeaveForceJoin: 'チャンネル %s は強制参加チャンネルなので、退出できません。' -errmsgNotfoundPM: 'あなたが受信したプライベートメッセージがありません。' -errmsgCannotSendPMSelf: '自分自身にプライベートメッセージを送ることはできません。' -errmsgCannotUseForChannel: '%s はチャンネル名に使用できない文字を含んでいます。' -errmsgCannotUseForChannelTooShort: '%s は短すぎてチャンネル名に使用できません。%d 文字以上にしてください。' -errmsgCannotUseForChannelTooLong: '%s は長すぎてチャンネル名に使用できません。%d 文字以下にしてください。' -errmsgCannotUseForGlobal: '%s はグローバルチャンネル名に使用できない文字を含んでいます。' -errmsgInvalidColorCode: '%s はカラーコードとして正しくありません。' -errmsgInvalidTemplateNumber: 'テンプレート番号は、0から9までの数字を指定してください。' -errmsgToolongDescription: '説明文は %d 文字以下にしてください。' -errmsgToolongAlias: 'チャンネル別名は %d 文字以下にしてください。' -errmsgToolongPassword: 'パスワードは %d 文字以下にしてください。' -errmsgInvalidBooleanOption: '%s は true/false で指定してください。' -errmsgInvalidRangeOption: 'range に正しくない値が指定されました。' -errmsgInvalidJapanizeOption: '%s に指定された %s は、Japanize変換タイプとして正しくありません。' -errmsgCannotOffGlobalBroadcast: 'このチャンネルはグローバルチャンネルのため、ブロードキャストをオフにできません。' -errmsgFormatConstraint: '必須キーワード %s が指定されていません。' -errmsgInvalidBanExpireParameter: 'BAN期限(分)の指定が正しくありません。1 から 43200 の間の数値を指定してください。' -errmsgInvalidMuteExpireParameter: 'Mute期限(分)の指定が正しくありません。1 から 43200 の間の数値を指定してください。' -errmsgNotInCheckRemoveConfirm: 'あなたはクリーンアップモードに入っていません。先に、/%s check を実行してください。' -errmsgCannotHideSelf: '自分の発言を非表示にすることはできません。' -errmsgDuplicatedAlias: '指定されたチャンネル別名 %s は、チャンネル %s と重複するので設定できません。' - -errmsgNotPermission: '権限がありません&7(%s)' -errmsgChannelChatDisabled: 'このサーバーでは、チャンネルチャットは動作しません。' - -usageJoin: '&6/%s join (channel) &7- チャンネルに参加します。' -usageLeave: '&6/%s leave &7- 参加しているチャンネルから退出します。' -usageList: '&6/%s list &7- チャンネルのリストを表示します。' -usageInvite: '&6/%s invite (name) &7- 指定したプレイヤーをチャンネルチャットに招待します。' -usageAccept: '&6/%s accept &7- 招待を受けてチャンネルチャットに入室します。' -usageDeny: '&6/%s deny &7- 招待を拒否します。' -usageKick: '&6/%s kick (name) &7- 指定したプレイヤーをチャンネルチャットからキックします。' -usageBan: '&6/%s ban (name) &7- 指定したプレイヤーをチャンネルチャットからBANします。' -usageBan2: '&6/%s ban (name) [minutes] &7- 指定したプレイヤーを指定した分の間、BANします。' -usagePardon: '&6/%s pardon (name) &7- 指定したプレイヤーのBANを解除します。' -usageMute: '&6/%s mute (name) &7- 指定したプレイヤーのチャンネルでの発言権を剥奪します。' -usageMute2: '&6/%s mute (name) [minutes] &7- 指定したプレイヤーを指定した分の間、発言権剥奪します。' -usageUnmute: '&6/%s unmute (name) &7- 指定したプレイヤーのチャンネルでの発言権剥奪を解除します。' -usageHide: '&6/%s hide [channel] &7- 指定したチャンネルの発言内容を非表示にします。' -usageHidePlayer: '&6/%s hide (player) &7- 指定したプレイヤーの発言内容を非表示にします。' -usageUnhide: '&6/%s unhide [channel] &7- 指定したチャンネルの発言内容を非表示から表示に戻します。' -usageUnhidePlayer: '&6/%s unhide (player) &7- 指定したプレイヤーの発言内容を非表示から表示に戻します。' -usageInfo: '&6/%s info [channel] &7- チャンネルの情報を表示します。' -usageLog: '&6/%s log [channel] [p=player] [f=filter] [d=date] [r] &7- チャンネルの発言ログを表示します。' - -usageCreate: '&6/%s create (channel) [description] &7- チャンネルを作成します。' -usageRemove: '&6/%s remove [channel] &7- チャンネルを削除します。' -usageFormat: '&6/%s format [channel] (format...) &7- チャンネルのメッセージフォーマットを設定します。' -usageModerator: '&6/%s moderator [channel] (player) &7- チャンネルのモデレーターを指定したプレイヤーに設定します。' -usageMod: '&6/%s mod [channel] (player) &7- チャンネルのモデレーターを指定したプレイヤーに設定します。' -usageDictionary: '&6/%s dictionary (add (word) (value)|remove (word)) &7- Japanize変換辞書に新しいワードを登録したり、指定したワードを削除したりします。' -usageDic: '&6/%s dic (add (word) (value)|remove (word)) &7- Japanize変換辞書に新しいワードを登録したり、指定したワードを削除したりします。' -usageOption: '&6/%s option [channel] (key=value...) &7- チャンネルのオプションを設定します。' -usageTemplate: '&6/%s template (number) (template...) &7- メッセージフォーマットのテンプレートを登録します。' -usageCheck1: '&6/%s check &7- モデレーターがいないチャンネルを一覧します。' -usageCheck2: '&6/%s check remove &7- /ch check で一覧されたチャンネルを全て削除します。' -usageReload: '&6/%s reload &7- config.ymlの再読み込みをします。' -usageHelp: '&6/%s help [user|mod|admin] [page] &7- ヘルプを表示します。' -usageSet1: '&6/%s set default (player) [channel] &7- 指定したプレイヤーの発言先チャンネルを、指定したチャンネルに設定します。' - -usageMessage: '&6/%s (name) [message] &7- 指定したプレイヤーとの個人チャットを開始します。' -usageReply: '&6/%s [message] &7- 受信した個人チャットに返信します。' - -usageJapanize: '&6/%s on|off &7- Turn on/off the Japanize conversion of your chat.' -usageJapanizeOther: '&6/%s (player) on|off &7- Turn on/off the Japanize conversion of other player''s chat.' - -usageTop: '&e----- &6LunaChat %s command (&c%d&6/&c%d&6) &e-----' -usageFoot: '&e-----------------------------------------' -usageNoticeNextPage: '&6次のページを見るには、&c/ch help %s %d&6 と実行してください。' diff --git a/src/main/resources/messages_en.yml b/src/main/resources/messages_en.yml new file mode 100644 index 00000000..388b81c7 --- /dev/null +++ b/src/main/resources/messages_en.yml @@ -0,0 +1,208 @@ +# ${project.name} v${project.version} +# @author ucchy +# @license LGPLv3 +# @copyright Copyright ucchy 2020 + +joinMessage: '&f[%color%%channel%&f]&7%player% has joined the channel.' +quitMessage: '&f[%color%%channel%&f]&7%player% has left the channel.' +breakupMessage: '&f[%color%%channel%&f]&7The channel has been deleted.' +banMessage: '&f[%color%%channel%&f]&7%player% was banned from the channel.' +kickMessage: '&f[%color%%channel%&f]&7%player% was kicked from the channel.' +muteMessage: '&f[%color%%channel%&f]&7%player% has been deprived the voice of this channel.' +banNGWordMessage: '&f[%color%%channel%&f]&7%player% was banned from the channel, caused by saying NG word.' +kickNGWordMessage: '&f[%color%%channel%&f]&7%player% was kicked from the channel, caused by saying NG word.' +muteNGWordMessage: '&f[%color%%channel%&f]&7%player% has been deprived the voice of this channel, caused by saying NG word.' +banWithExpireMessage: '&f[%color%%channel%&f]&7%player% was banned from the channel, with an expiration of %minutes% minutes.' +muteWithExpireMessage: '&f[%color%%channel%&f]&7%player% was kicked from the channel, with an expiration of %minutes% minutes.' +pardonMessage: '&f[%color%%channel%&f]&7%player%''s ban has been removed.' +unmuteMessage: '&f[%color%%channel%&f]&7%player% has regained the voice of this channel.' +expiredBanMessage: '&f[%color%%channel%&f]&7%player%''s ban has been exired.' +expiredMuteMessage: '&f[%color%%channel%&f]&7%player% has regained the voice of this channel.' + +addModeratorMessage: '&f[%color%%channel%&f]&7%player% became the channel moderator.' +removeModeratorMessage: '&f[%color%%channel%&f]&7%player% is no longer the channel moderator.' + +noRecipientMessage: '&f[%color%%channel%&f]&7Your chat did not reach anyone.' + +listFirstLine: '&7---------- &bChannel List &7----------' +listFirstLinePaging: '&7---------- &bChannel List&7(&c%page%&7/&c%max%&7) ----------' +listEndLine: '&7----------------------------------' +listFormat: '&7| &f%channel%&7(&c%online%&7/&c%total%&7) &a%topic%' +listPlainPrefix: '&7| ' + +channelInfoFirstLine: '&7---------- &bChannel Info &7----------' +channelInfoPrefix: '&7| ' +channelInfoAlias: '&7| &cAliase:&f' +channelInfoGlobal: '&7| &cGlobal Channel' +channelInfoBroadcast: '&7| &cBroadcast Channel' +channelInfoSecret: '&7| &cSecret Channel' +channelInfoPassword: '&7| &cWith Password' +channelInfoWorldChat: '&7| &cWorld Chat' +channelInfoRangeChat: '&7| &cRange Chat:%block% Block distance' +channelInfoFormat: '&7| &cFormat: ' +channelInfoBanned: '&7| &cBAN List:' +channelInfoMuted: '&7| &cMute List:' + +motdFirstLine: '&7----- &bYour Joined Channels &7-----' +hideChannelFirstLine: '&7----- &bYour Hided Channels &7-----' +hidePlayerFirstLine: '&7----- &bYour Hided Players &7-----' + +logDisplayFirstLine: '&7----- &b%s Chat Log &7-----' +logDisplayEndLine: '&7----------------------------------' +logDisplayFormat: '&7| &c%date%&7, &f%player%&7: &f%message%' + +infoPrefix: '&f[&aLC&f]' +errorPrefix: '&f[&cLC&f]' + +cmdmsgJoin: 'You joined channel %channel%.' +cmdmsgSet: 'You set %channel% as the default channel.' +cmdmsgSetTopic: 'Topic; &a%topic%' +cmdmsgSetHide: ' You set this channel muted.' +cmdmsgLeave: 'You left channel %channel%.' +cmdmsgInvite: 'You invited %player% to channel %channel%.' +cmdmsgInvited1: '%player% invited you to channel %channel%.' +cmdmsgInvited2: 'If you want to join channel, do "/ch accept". If you want to deny the invitation, do "/ch deny".' +cmdmsgDeny: 'You denied the invitation.' +cmdmsgDenyed: 'The invitation was denied.' +cmdmsgKick: '%player% was kicked from channel %channel%.' +cmdmsgKicked: 'You were kicked from channel %channel%.' +cmdmsgBan: '%player% was banned from channel %channel%.' +cmdmsgBanWithExpire: '%player% was banned from channel %channel% with an expiration of %minutes% minutes.' +cmdmsgBanned: 'You were banned from channel %channel%.' +cmdmsgPardon: '%player%''s ban of channel %channel% has been removed.' +cmdmsgPardoned: 'Your ban of channel %channel% has been removed.' +cmdmsgMute: 'You deprived the %player%''s voice of channel %channel%.' +cmdmsgMuteWithExpire: 'You deprived the %player%''s voice of channel %channel% with an expiration of %minutes% minutes.' +cmdmsgMuted: 'You were banned from channel %channel%.' +cmdmsgUnmute: '%player% has regained the voice of channel %channel%.' +cmdmsgUnmuted: 'You have regained the voice of channel %channel%.' +cmdmsgHided: 'You hided channel %channel%.' +cmdmsgHidedPlayer: 'You hided player %player%.' +cmdmsgUnhided: 'You unhided channel %channel%.' +cmdmsgUnhidedPlayer: 'You unhided player %channel%.' + +cmdmsgReload: 'You reloaded the configuration of LunaChat.' +cmdmsgCreate: 'You created new channel %channel%.' +cmdmsgRemove: 'You removed channel %channel%.' +cmdmsgFormat: 'You set %format% as message format.' +cmdmsgModerator: 'You have set %player% as a moderator for the channel %channel%.' +cmdmsgModeratorMinus: 'You Removed %player% from moderator of channel %channel%.' +cmdmsgDictionaryAdd: 'Remembered %key% as %value%.' +cmdmsgDictionaryRemove: 'Forgot %key%.' +cmdmsgOption: 'You have set %key% to %value%.' +cmdmsgTemplate: 'Set template %index% to %value%.' +cmdmsgTemplateRemove: 'Deleted template %index%.' +cmdmsgSetDefault: '%player%''s default channel has been set to %channel%.' + +cmdmsgPlayerJapanize: 'Your chat''s Japanize conversion was turned %value%.' +cmdmsgPlayerJapanizeOther: 'Made %player%''s Japanize conversion into %value%.' + +cmdmsgReplyInviter: '%inviter%''s current conversation partner: %invited%' +cmdmsgReplyInviterNone: '%inviter%''s current conversation partner: There is no partner.' + +errmsgIngame: 'This command can only be executed from within the game.' +errmsgCommand: 'The command is specified incorrectly.' +errmsgNotExist: 'The specified channel does not exist.' +errmsgNotExistChannelAndPlayer: 'The specified channel or player does not exist.' +errmsgNotExistOrNotSpecified: 'Either the specified channel does not exist or the channel was not specified.' +errmsgExist: 'The specified channel name already exists.' +errmsgNomember: 'You have not joined the specified channel.' +errmsgNomemberOther: 'The specified player has not joined the channel.' +errmsgNotfoundPlayer: 'The specified player %player% cannot be found.' +errmsgNotInvited: 'You are not the invited player.' +errmsgNotfoundChannel: 'You couldn''t join because the channels are gone.' +errmsgInvitedAlreadyExist: 'The invited %player% is already on the channel.' +errmsgInvitedAlreadyJoin: 'I have already joined the channel.' +errmsgNoJoin: 'You are not currently on a channel. ' +errmsgBanned: 'You are banned from this channel. ' +errmsgMuted: 'You cannot speak because you are muted from this channel. ' +errmsgAlreadyBanned: 'The specified player is already in the BAN list. ' +errmsgAlreadyMuted: 'The specified player is already in the Mute list. ' +errmsgAlreadyHided: 'This channel is already hidden. ' +errmsgAlreadyHidedPlayer: 'This player is already hidden. ' +errmsgAlreadyUnhided: 'This channel is not hidden. ' +errmsgAlreadyUnhidedPlayer: 'This player is not hidden. ' +errmsgCannotJoinPersonal: 'Cannot join the personal chat channel. ' +errmsgNotModerator: 'You cannot run the command because you are not a moderator. ' +errmsgNotBanned: 'The specified player is not in the BAN list. ' +errmsgNotMuted: 'The specified player is not included in the Mute list. ' +errmsgInvalidOptions: 'There were no valid option specifications. ' +errmsgPassword1: 'This channel cannot be entered because a password has been set. ' +errmsgPassword2: 'Specify your password to enter the channel. ' +errmsgPassword3: '/ch (channel) (password)' +errmsgPasswordNotmatch: 'Cannot enter the channel because the password is incorrect. ' +errmsgPermission: 'Cannot execute because you do not have permission "%permission%". ' +errmsgCannotLeaveGlobal: 'Cannot leave because channel %channel% is a global channel. ' +errmsgCannotKickGlobal: 'Cannot kick because channel %channel% is a global channel. ' +errmsgCannotBANGlobal: 'Cannot BAN channel %channel% as it is a global channel. ' +errmsgCannotRemoveGlobal: 'Channel %channel% is a global channel and cannot be deleted. ' +errmsgCannotModeratorGlobal: 'Cannot set moderator because channel %channel% is a global channel. ' +errmsgCannotLeaveForceJoin: 'Channel %channel% is a forced channel and cannot leave. ' +errmsgNotfoundPM: 'There are no private messages you received. ' +errmsgCannotSendPMSelf: 'Can''t send a private message to yourself. ' +errmsgCannotUseForChannel: '%channel% contains characters that cannot be used in the channel name. ' +errmsgCannotUseForChannelTooShort: '%channel% is too short to be used in the channel name. It must be at least %min% characters. ' +errmsgCannotUseForChannelTooLong: '%channel% is too long to be used in the channel name. Must be less than or equal to %max% characters. ' +errmsgCannotUseForGlobal: '%word% contains unusable characters in global channel name. ' +errmsgInvalidColorCode: '%value% is not a valid color code. ' +errmsgInvalidTemplateNumber: 'Specify a number from 0 to 9 as the template number. ' +errmsgToolongDescription: 'The description should be less than or equal to %max% characters. ' +errmsgToolongAlias: 'Channel alias must be less than or equal to %max% characters. ' +errmsgToolongPassword: 'Password must be less than or equal to %max% characters. ' +errmsgInvalidBooleanOption: 'Specify %key% as true/false. ' +errmsgInvalidRangeOption: 'Invalid value specified for range. ' +errmsgInvalidJapanizeOption: 'The %value% specified for %key% is not a valid Japanize conversion type. ' +errmsgCannotOffGlobalBroadcast: 'Cannot turn off broadcast as this channel is a global channel. ' +errmsgFormatConstraint: 'The required keyword %key% is missing. ' +errmsgInvalidBanExpireParameter: 'BAN expiration (minutes) is not specified correctly. Specify a number between 1 and 43200. ' +errmsgInvalidMuteExpireParameter: 'Mute expiration (minutes) is not specified correctly. Specify a number between 1 and 43200. ' +errmsgCannotHideSelf: 'You cannot hide your statement. ' +errmsgDuplicatedAlias: 'The specified channel alias %aliase% cannot be set because it overlaps with the channel %channel%. ' + +errmsgNotPermission: 'No permission &7(%permission%)' +errmsgChannelChatDisabled: 'Channel chat does not work on this server. ' + +usageJoin: '&6/%label% join (channel) &7- Join the channel. ' +usageLeave: '&6/%label% leave &7- Leave the participating channel. ' +usageList: '&6/%label% list &7- Display a list of channels. ' +usageInvite: '&6/%label% invite (name) &7- Invite the specified player to the channel chat. ' +usageAccept: '&6/%label% accept &7- You will be invited to join the channel chat. ' +usageDeny: '&6/%label% deny &7- Reject the invitation. ' +usageKick: '&6/%label% kick (name) &7- Kick the specified player from channel chat. ' +usageBan: '&6/%label% ban (name) &7- BAN the specified player from channel chat. ' +usageBan2: '&6/%label% ban (name) [minutes] &7- BAN the specified player for the specified number of minutes. ' +usagePardon: '&6/%label% pardon (name) &7- Removes the ban for the specified player. ' +usageMute: '&6/%label% mute (name) &7- Removes the right to speak the specified player''s channel. ' +usageMute2: '&6/%label% mute (name) [minutes] &7- Strips the specified player for the specified number of minutes. ' +usageUnmute: '&6/%label% unmute (name) &7- Cancels the deprivation of the specified player''s channel. ' +usageHide: '&6/%label% hide [channel] &7- Hides the message contents of the specified channel. ' +usageHidePlayer: '&6/%label% hide (player) &7- Hides the speech of the specified player. ' +usageUnhide: '&6/%label% unhide [channel] &7- Restores the message contents of the specified channel from being hidden to being displayed. ' +usageUnhidePlayer: '&6/%label% unhide (player) &7- Restores the message of the specified player from hidden to visible. ' +usageInfo: '&6/%label% info [channel] &7- Displays channel information. ' +usageLog: '&6/%label% log [channel] [p=player] [f=filter] [d=date] [r] &7- Show the channel log. ' + +usageCreate: '&6/%label% create (channel) [description] &7- Create a channel. ' +usageRemove: '&6/%label% remove [channel] &7- Remove the channel. ' +usageFormat: '&6/%label% format [channel] (format...) &7- Sets the message format of the channel. ' +usageModerator: '&6/%label% moderator [channel] (player) &7- Sets the moderator of the channel to the specified player. ' +usageMod: '&6/%label% mod [channel] (player) &7- Sets the channel moderator to the specified player. ' +usageDictionary: '&6/%label% dictionary (add (word) (value)|remove (word)) &7- Japanize Adds a new word to the conversion dictionary or deletes the specified word. ' +usageDic: '&6/%label% dic (add (word) (value)|remove (word)) &7- Japanize Adds a new word to the conversion dictionary or deletes the specified word. ' +usageOption: '&6/%label% option [channel] (key=value...) &7- Set channel options. ' +usageTemplate: '&6/%label% template (number) (template...) &7- Register the template of message format. ' +usageCheck1: '&6/%label% check &7- Lists channels without moderators. ' +usageCheck2: '&6/%label% check remove &7- /ch Remove all channels listed by check. ' +usageReload: '&6/%label% reload &7- Reload config.yml. ' +usageHelp: '&6/%label% help [user|mod|admin] [page] &7- Display help. ' +usageSet1: '&6/%label% set default (player) [channel] &7- Sets the specified player''s channel to the specified channel. ' + +usageMessage: '&6/%label% (name) [message] &7- Starts a private chat with the specified player. ' +usageReply: '&6/%label% [message] &7- Reply to the received personal chat. ' + +usageJapanize: '&6/%label% on|off &7- Turn on/off the Japanize conversion of your chat.' +usageJapanizeOther: '&6/%label% (player) on|off &7- Turn on/off the Japanize conversion of other player``s chat.' + +usageTop: '&e----- &6LunaChat %type% command (&c%num%&6/&c%max%&6) &e-----' +usageFoot: '&e-----------------------------------------' +usageNoticeNextPage: '&6 To see the next page, run &c/%label% help %type% %next%&6. ' diff --git a/src/main/resources/messages_ja.yml b/src/main/resources/messages_ja.yml new file mode 100644 index 00000000..f56a742c --- /dev/null +++ b/src/main/resources/messages_ja.yml @@ -0,0 +1,208 @@ +# ${project.name} v${project.version} +# @author ucchy +# @license LGPLv3 +# @copyright Copyright ucchy 2020 + +joinMessage: '&f[%color%%channel%&f]&7%player% さんがチャンネルに参加しました。' +quitMessage: '&f[%color%%channel%&f]&7%player% さんがチャンネルから退出しました。' +breakupMessage: '&f[%color%%channel%&f]&7チャンネルが削除されました。' +banMessage: '&f[%color%%channel%&f]&7%player% さんをチャンネルからBANしました。' +kickMessage: '&f[%color%%channel%&f]&7%player% さんをチャンネルからキックしました。' +muteMessage: '&f[%color%%channel%&f]&7%player% さんをチャンネルからMuteしました。' +banNGWordMessage: '&f[%color%%channel%&f]&7NGワード発言により、%player% さんをチャンネルから自動BANしました。' +kickNGWordMessage: '&f[%color%%channel%&f]&7NGワード発言により、%player% さんをチャンネルから自動キックしました。' +muteNGWordMessage: '&f[%color%%channel%&f]&7NGワード発言により、%player% さんをチャンネルから自動Muteしました。' +banWithExpireMessage: '&f[%color%%channel%&f]&7%player% さんを期限 %minutes% 分でチャンネルからBANしました。' +muteWithExpireMessage: '&f[%color%%channel%&f]&7%player% さんを期限 %minutes% 分でチャンネルからMuteしました。' +pardonMessage: '&f[%color%%channel%&f]&7%player% さんのBANが解除されました。' +unmuteMessage: '&f[%color%%channel%&f]&7%player% さんのMuteが解除されました。' +expiredBanMessage: '&f[%color%%channel%&f]&7%player% さんの期限付きBANが解除されました。' +expiredMuteMessage: '&f[%color%%channel%&f]&7%player% さんの期限付きMuteが解除されました。' + +addModeratorMessage: '&f[%color%%channel%&f]&7%player% さんがチャンネルのモデレーターになりました。' +removeModeratorMessage: '&f[%color%%channel%&f]&7%player% さんがチャンネルのモデレーターから外れました。' + +noRecipientMessage: '&f[%color%%channel%&f]&7あなたの発言は、誰にも届きませんでした。' + +listFirstLine: '&7---------- &bチャンネルリスト &7----------' +listFirstLinePaging: '&7---------- &bチャンネルリスト&7(&c%page%&7/&c%max%&7) ----------' +listEndLine: '&7----------------------------------' +listFormat: '&7| &f%channel%&7(&c%online%&7/&c%total%&7) &a%topic%' +listPlainPrefix: '&7| ' + +channelInfoFirstLine: '&7---------- &bチャンネル情報 &7----------' +channelInfoPrefix: '&7| ' +channelInfoAlias: '&7| &cチャンネル別名:&f' +channelInfoGlobal: '&7| &cグローバルチャンネル' +channelInfoBroadcast: '&7| &cブロードキャストチャンネル' +channelInfoSecret: '&7| &cシークレットチャンネル' +channelInfoPassword: '&7| &cパスワード設定あり' +channelInfoWorldChat: '&7| &cワールドチャット' +channelInfoRangeChat: '&7| &c範囲チャット:%block% ブロック' +channelInfoFormat: '&7| &cフォーマット設定:' +channelInfoBanned: '&7| &cBANリスト:' +channelInfoMuted: '&7| &cMuteリスト:' + +motdFirstLine: '&7----- &b参加中のチャット &7-----' +hideChannelFirstLine: '&7----- &b非表示にしているチャット &7-----' +hidePlayerFirstLine: '&7----- &b非表示にしているプレイヤー &7-----' + +logDisplayFirstLine: '&7----- &b%channel%の発言ログ &7-----' +logDisplayEndLine: '&7----------------------------------' +logDisplayFormat: '&7| &c%date%&7, &f%player%&7: &f%message%' + +infoPrefix: '&f[&aLC&f]' +errorPrefix: '&f[&cLC&f]' + +cmdmsgJoin: 'チャンネル %channel% に参加しました。' +cmdmsgSet: 'デフォルトの発言先を %channel% に設定しました。' +cmdmsgSetTopic: 'トピック: &a%topic%' +cmdmsgSetHide: '<注意> 現在このチャンネルを非表示に設定しています。' +cmdmsgLeave: 'チャンネル %channel% から退出しました。' +cmdmsgInvite: '%player% さんを、チャンネル %channel% に招待しました。' +cmdmsgInvited1: '%player% さんから、チャンネル %channel% に招待されました。' +cmdmsgInvited2: '入室するには /ch accept、拒否するには /ch deny を実行してください。' +cmdmsgDeny: '招待を拒否しました。' +cmdmsgDenyed: '招待が拒否されました。' +cmdmsgKick: '%player% さんを、チャンネル %channel% からキックしました。' +cmdmsgKicked: 'チャンネル %channel% からキックされました。' +cmdmsgBan: '%player% さんを、チャンネル %channel% からBANしました。' +cmdmsgBanWithExpire: '%player% さんを、チャンネル %channel% から期限 %minutes% 分でBANしました。' +cmdmsgBanned: 'チャンネル %channel% からBANされました。' +cmdmsgPardon: '%player% さんの、チャンネル %channel% のBANを解除しました。' +cmdmsgPardoned: 'チャンネル %channel% のBANが解除されました。' +cmdmsgMute: '%player% さんを、チャンネル %channel% でMuteしました。' +cmdmsgMuteWithExpire: '%player% さんを、チャンネル %channel% から期限 %minutes% 分でMuteしました。' +cmdmsgMuted: 'チャンネル %channel% からMuteされました。' +cmdmsgUnmute: '%player% さんの、チャンネル %channel% のMuteを解除しました。' +cmdmsgUnmuted: 'チャンネル %channel% のMuteが解除されました。' +cmdmsgHided: 'チャンネル %channel% を非表示に設定しました。' +cmdmsgHidedPlayer: 'プレイヤー %player% を非表示に設定しました。' +cmdmsgUnhided: 'チャンネル %channel% を表示に設定しました。' +cmdmsgUnhidedPlayer: 'プレイヤー %channel% を表示に設定しました。' + +cmdmsgReload: 'LunaChatの設定を再読み込みしました。' +cmdmsgCreate: 'チャンネル %channel% を新規作成しました。' +cmdmsgRemove: 'チャンネル %channel% を削除しました。' +cmdmsgFormat: 'メッセージフォーマットを %format% に設定しました。' +cmdmsgModerator: '%player% さんをチャンネル %channel% のモデレーターに設定しました。' +cmdmsgModeratorMinus: '%player% さんをチャンネル %channel% のモデレーターから外しました。' +cmdmsgDictionaryAdd: '%key% を %value% と覚えました。' +cmdmsgDictionaryRemove: '%key% を忘れました。' +cmdmsgOption: '%key% を %value% に設定しました。' +cmdmsgTemplate: 'テンプレート %index% を、%value% に設定しました。' +cmdmsgTemplateRemove: 'テンプレート %index% を削除しました。' +cmdmsgSetDefault: '%player% さんの発言先を %channel% に設定しました。' + +cmdmsgPlayerJapanize: 'Your chat''s Japanize conversion was turned %value%.' +cmdmsgPlayerJapanizeOther: '%player% さんのJapanize変換を %value% にしました。' + +cmdmsgReplyInviter: '%inviter%の現在の会話相手 : %invited%' +cmdmsgReplyInviterNone: '%inviter%の現在の会話相手 : 相手がいません。' + +errmsgIngame: 'このコマンドはゲーム内からしか実行できません。' +errmsgCommand: 'コマンドの指定が正しくありません。' +errmsgNotExist: '指定されたチャンネルが存在しません。' +errmsgNotExistChannelAndPlayer: '指定されたチャンネルもプレイヤーも存在しません。' +errmsgNotExistOrNotSpecified: '指定されたチャンネルが存在しないか、チャンネルが指定されませんでした。' +errmsgExist: '指定されたチャンネル名が既に存在します。' +errmsgNomember: '指定されたチャンネルに参加していません。' +errmsgNomemberOther: '指定されたプレイヤーはチャンネルに参加していません。' +errmsgNotfoundPlayer: '指定されたプレイヤー %player% が見つかりません。' +errmsgNotInvited: '招待を受けたプレイヤーではありません。' +errmsgNotfoundChannel: 'チャンネルが無くなってしまったため、参加できませんでした。' +errmsgInvitedAlreadyExist: '招待された %player% さんは、既にチャンネルに参加しています。' +errmsgInvitedAlreadyJoin: '既にチャンネルに参加しています。' +errmsgNoJoin: '現在チャンネルに参加していません。' +errmsgBanned: 'あなたはこのチャンネルからBANされています。' +errmsgMuted: 'あなたはこのチャンネルからMuteされているため、発言できません。' +errmsgAlreadyBanned: '指定されたプレイヤーは既にBANリストに含まれています。' +errmsgAlreadyMuted: '指定されたプレイヤーは既にMuteリストに含まれています。' +errmsgAlreadyHided: 'このチャンネルは既に非表示になっています。' +errmsgAlreadyHidedPlayer: 'このプレイヤーは既に非表示になっています。' +errmsgAlreadyUnhided: 'このチャンネルは非表示になっていません。' +errmsgAlreadyUnhidedPlayer: 'このプレイヤーは非表示になっていません。' +errmsgCannotJoinPersonal: '個人チャットチャンネルには参加できません。' +errmsgNotModerator: 'あなたはモデレーターではないため、そのコマンドを実行できません。' +errmsgNotBanned: '指定されたプレイヤーはBANリストに含まれていません。' +errmsgNotMuted: '指定されたプレイヤーはMuteリストに含まれていません。' +errmsgInvalidOptions: '有効なオプション指定が1つもありませんでした。' +errmsgPassword1: 'このチャンネルはパスワードが設定されているため入れません。' +errmsgPassword2: 'パスワードを指定して、チャンネルに入ってください。' +errmsgPassword3: '/ch (channel) (password)' +errmsgPasswordNotmatch: 'パスワードが正しくないため、チャンネルに入れません。' +errmsgPermission: '権限 "%permission%" が無いため、実行できません。' +errmsgCannotLeaveGlobal: 'チャンネル %channel% はグローバルチャンネルなので、退出できません。' +errmsgCannotKickGlobal: 'チャンネル %channel% はグローバルチャンネルなので、キックできません。' +errmsgCannotBANGlobal: 'チャンネル %channel% はグローバルチャンネルなので、BANできません。' +errmsgCannotRemoveGlobal: 'チャンネル %channel% はグローバルチャンネルなので、削除できません。' +errmsgCannotModeratorGlobal: 'チャンネル %channel% はグローバルチャンネルなので、モデレーターを設定できません。' +errmsgCannotLeaveForceJoin: 'チャンネル %channel% は強制参加チャンネルなので、退出できません。' +errmsgNotfoundPM: 'あなたが受信したプライベートメッセージがありません。' +errmsgCannotSendPMSelf: '自分自身にプライベートメッセージを送ることはできません。' +errmsgCannotUseForChannel: '%channel% はチャンネル名に使用できない文字を含んでいます。' +errmsgCannotUseForChannelTooShort: '%channel% は短すぎてチャンネル名に使用できません。%min% 文字以上にしてください。' +errmsgCannotUseForChannelTooLong: '%channel% は長すぎてチャンネル名に使用できません。%max% 文字以下にしてください。' +errmsgCannotUseForGlobal: '%word% はグローバルチャンネル名に使用できない文字を含んでいます。' +errmsgInvalidColorCode: '%value% はカラーコードとして正しくありません。' +errmsgInvalidTemplateNumber: 'テンプレート番号は、0から9までの数字を指定してください。' +errmsgToolongDescription: '説明文は %max% 文字以下にしてください。' +errmsgToolongAlias: 'チャンネル別名は %max% 文字以下にしてください。' +errmsgToolongPassword: 'パスワードは %max% 文字以下にしてください。' +errmsgInvalidBooleanOption: '%key% は true/false で指定してください。' +errmsgInvalidRangeOption: 'range に正しくない値が指定されました。' +errmsgInvalidJapanizeOption: '%key% に指定された %value% は、Japanize変換タイプとして正しくありません。' +errmsgCannotOffGlobalBroadcast: 'このチャンネルはグローバルチャンネルのため、ブロードキャストをオフにできません。' +errmsgFormatConstraint: '必須キーワード %key% が指定されていません。' +errmsgInvalidBanExpireParameter: 'BAN期限(分)の指定が正しくありません。1 から 43200 の間の数値を指定してください。' +errmsgInvalidMuteExpireParameter: 'Mute期限(分)の指定が正しくありません。1 から 43200 の間の数値を指定してください。' +errmsgCannotHideSelf: '自分の発言を非表示にすることはできません。' +errmsgDuplicatedAlias: '指定されたチャンネル別名 %aliase% は、チャンネル %channel% と重複するので設定できません。' + +errmsgNotPermission: '権限がありません&7(%permission%)' +errmsgChannelChatDisabled: 'このサーバーでは、チャンネルチャットは動作しません。' + +usageJoin: '&6/%label% join (channel) &7- チャンネルに参加します。' +usageLeave: '&6/%label% leave &7- 参加しているチャンネルから退出します。' +usageList: '&6/%label% list &7- チャンネルのリストを表示します。' +usageInvite: '&6/%label% invite (name) &7- 指定したプレイヤーをチャンネルチャットに招待します。' +usageAccept: '&6/%label% accept &7- 招待を受けてチャンネルチャットに入室します。' +usageDeny: '&6/%label% deny &7- 招待を拒否します。' +usageKick: '&6/%label% kick (name) &7- 指定したプレイヤーをチャンネルチャットからキックします。' +usageBan: '&6/%label% ban (name) &7- 指定したプレイヤーをチャンネルチャットからBANします。' +usageBan2: '&6/%label% ban (name) [minutes] &7- 指定したプレイヤーを指定した分の間、BANします。' +usagePardon: '&6/%label% pardon (name) &7- 指定したプレイヤーのBANを解除します。' +usageMute: '&6/%label% mute (name) &7- 指定したプレイヤーのチャンネルでの発言権を剥奪します。' +usageMute2: '&6/%label% mute (name) [minutes] &7- 指定したプレイヤーを指定した分の間、発言権剥奪します。' +usageUnmute: '&6/%label% unmute (name) &7- 指定したプレイヤーのチャンネルでの発言権剥奪を解除します。' +usageHide: '&6/%label% hide [channel] &7- 指定したチャンネルの発言内容を非表示にします。' +usageHidePlayer: '&6/%label% hide (player) &7- 指定したプレイヤーの発言内容を非表示にします。' +usageUnhide: '&6/%label% unhide [channel] &7- 指定したチャンネルの発言内容を非表示から表示に戻します。' +usageUnhidePlayer: '&6/%label% unhide (player) &7- 指定したプレイヤーの発言内容を非表示から表示に戻します。' +usageInfo: '&6/%label% info [channel] &7- チャンネルの情報を表示します。' +usageLog: '&6/%label% log [channel] [p=player] [f=filter] [d=date] [r] &7- チャンネルの発言ログを表示します。' + +usageCreate: '&6/%label% create (channel) [description] &7- チャンネルを作成します。' +usageRemove: '&6/%label% remove [channel] &7- チャンネルを削除します。' +usageFormat: '&6/%label% format [channel] (format...) &7- チャンネルのメッセージフォーマットを設定します。' +usageModerator: '&6/%label% moderator [channel] (player) &7- チャンネルのモデレーターを指定したプレイヤーに設定します。' +usageMod: '&6/%label% mod [channel] (player) &7- チャンネルのモデレーターを指定したプレイヤーに設定します。' +usageDictionary: '&6/%label% dictionary (add (word) (value)|remove (word)) &7- Japanize変換辞書に新しいワードを登録したり、指定したワードを削除したりします。' +usageDic: '&6/%label% dic (add (word) (value)|remove (word)) &7- Japanize変換辞書に新しいワードを登録したり、指定したワードを削除したりします。' +usageOption: '&6/%label% option [channel] (key=value...) &7- チャンネルのオプションを設定します。' +usageTemplate: '&6/%label% template (number) (template...) &7- メッセージフォーマットのテンプレートを登録します。' +usageCheck1: '&6/%label% check &7- モデレーターがいないチャンネルを一覧します。' +usageCheck2: '&6/%label% check remove &7- /ch check で一覧されたチャンネルを全て削除します。' +usageReload: '&6/%label% reload &7- config.ymlの再読み込みをします。' +usageHelp: '&6/%label% help [user|mod|admin] [page] &7- ヘルプを表示します。' +usageSet1: '&6/%label% set default (player) [channel] &7- 指定したプレイヤーの発言先チャンネルを、指定したチャンネルに設定します。' + +usageMessage: '&6/%label% (name) [message] &7- 指定したプレイヤーとの個人チャットを開始します。' +usageReply: '&6/%label% [message] &7- 受信した個人チャットに返信します。' + +usageJapanize: '&6/%label% on|off &7- Turn on/off the Japanize conversion of your chat.' +usageJapanizeOther: '&6/%label% (player) on|off &7- Turn on/off the Japanize conversion of other player''s chat.' + +usageTop: '&e----- &6LunaChat %type% command (&c%num%&6/&c%max%&6) &e-----' +usageFoot: '&e-----------------------------------------' +usageNoticeNextPage: '&6次のページを見るには、&c/%label% help %type% %next%&6 と実行してください。' diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index f18e0d64..1f32fddd 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,149 +1,153 @@ name: ${project.name} -main: com.github.ucchyocean.lc.LunaChat +main: com.github.ucchyocean.lc3.LunaChatBukkit version: ${project.version} authors: [ucchy, YukiLeafX, LazyGon] description: ${project.description} -softdepend: [Vault, dynmap, HawkEye, Multiverse-Core, mcMMO, Prism] +softdepend: [Vault, dynmap, Multiverse-Core, mcMMO] commands: lunachat: - description: lunachatのユーザーコマンド + description: lunachat command aliases: [ch, lc] usage: | - / join (channel) - チャンネルに参加します。 - / leave - 参加しているチャンネルから退出します。 - / list - チャンネルのリストを表示します。 - / invite (name) [force] - 指定した人をチャンネルチャットに招待します。 - / accept - 招待を受けてチャンネルチャットに入室します。 - / deny - 招待を拒否します。 - / kick (name) [channel] - 指定した人をチャンネルチャットからキックします。 - / ban (name) [channel] - 指定した人をチャンネルチャットからBANします。 - / ban (name) [minutes] - 指定した人を指定した分間、BANします。 - / pardon (name) [channel] - 指定した人のBANを解除します。 - / mute (name) [channel] - 指定した人をチャンネルチャットからMuteします。 - / mute (name) [minutes] - 指定した人を指定した分間、Muteします。 - / unmute (name) [channel] - 指定した人のMuteを解除します。 - / hide (channel) - 指定したチャンネルの発言内容を非表示にします。 - / hide channel (channel) - 指定したチャンネルの発言内容を非表示にします。 - / hide (player) - 指定したプレイヤーの発言内容を非表示にします。 - / hide player (player) - 指定したプレイヤーの発言内容を非表示にします。 - / unhide (channel) - 指定したチャンネルの発言内容を非表示から表示に戻します。 - / unhide channel (channel) - 指定したチャンネルの発言内容を非表示から表示に戻します。 - / unhide (player) - 指定したプレイヤーの発言内容を非表示から表示に戻します。 - / unhide player (player) - 指定したプレイヤーの発言内容を非表示から表示に戻します。 - / info [channel] - チャンネルの情報を表示します。 - / log [channel] [key=value...] - チャンネルのログを表示します。 - / create (channel) - チャンネルを作成します。 - / remove [channel] - チャンネルを削除します。 - / format [channel] (format...) - チャンネルのメッセージフォーマットを設定します。 - / moderator [channel] (player...) - チャンネルのモデレーターを指定したプレイヤーに設定します。 - / dictionary (add (word) (value)|remove (word)) - Japanize変換辞書に新しいワードを登録したり、指定したワードを削除したりします。 - / option (key=value...) - チャンネルのオプションを設定します。 - / template (number) (template...) - メッセージフォーマットのテンプレートを登録します。 - / check - モデレータがいないチャンネルを一覧します。 - / check remove - / check で一覧されたチャンネルを全て削除します。 - / set default (player) [channel] - 指定したプレイヤーの発言先チャンネルを、指定したチャンネルに設定します。 - / reload - config.ymlの再読み込みをします。 - / help [user|mod|admin] [page] - ヘルプを表示します。 + / join (channel) - join channel. + / leave - leave channel. + / list - display channel list. + / invite (name) [force] - invite the specified player to channel. + / accept - accept the invitation. + / deny - deny the invitation. + / kick (name) [channel] - kick the specified player. + / ban (name) [channel] - ban the specified player. + / ban (name) [minutes] - ban the specified player with expiration. + / pardon (name) [channel] - remove the ban of the specified player. + / mute (name) [channel] - deprive the voice of the specified player. + / mute (name) [minutes] - deprive the voice of the specified player with expiration. + / unmute (name) [channel] - remove the voice deprivation of the specified player. + / hide (channel) - mute the specified channel. + / hide channel (channel) - mute the specified channel. + / hide (player) - mute the specified player. + / hide player (player) - mute the specified player. + / unhide (channel) - remove the mute of the specified channel. + / unhide channel (channel) - remove the mute of the specified channel. + / unhide (player) - remove the mute of the specified player. + / unhide player (player) - remove the mute of the specified player. + / info [channel] - display the information of the channel. + / log [channel] [key=value...] - display the logs of the channel. + / create (channel) - create the channel. + / remove [channel] - remove the channel. + / format [channel] (format...) - set the message format of the channel. + / moderator [channel] (player...) - set the specified player as the moderator. + / dictionary (add (word) (value)|remove (word)) - add/remove the word into the japanize dictionary. + / option (key=value...) - set the options of the channel. + / template (number) (template...) - set the template of the message format. + / set default (player) [channel] - set the channel to which the specified player speaks to the specified channel. + / reload - reload config.yml. + / help [user|mod|admin] [page] - display the usage. + permission: lunachat.command + permission-message: You don't have the permission "". tell: - description: 1:1チャット送信コマンド - aliases: [msg, message, m, t, w] - usage: / (name) [message] - 指定した人との1:1チャットを開始します。 + description: 1 on 1 chat command + aliases: [msg, message, m, t] + usage: / (name) [message] - send 1 on 1 chat to the specified player. permission: lunachat.message - permission-message: パーミッション "" が無いため、実行できません。 + permission-message: You don't have the permission "". reply: - description: 1:1チャット返信コマンド + description: 1 on 1 chat reply command aliases: [r] - usage: / [message] - 受信した1:1チャットに返信します。 + usage: / [message] - reply to the recieved 1 on 1 chat. permission: lunachat.reply - permission-message: パーミッション "" が無いため、実行できません。 - lcjapanize: - description: lunachatのjapanizeオンオフ設定コマンド - aliases: [japanize, jp] + permission-message: You don't have the permission "". + japanize: + description: turn on/off the japanize conversion + aliases: [jp] usage: | - / on|off - Turn on/off the Japanize conversion of your chat. - / (player) (on|off) - Turn on/off the Japanize conversion of other player's chat. + / on|off - turn on/off the japanize conversion of your chat. + / (player) (on|off) - turn on/off the japanize conversion of the specified player's chat. permission: lunachat.japanize permission-message: You don't have the permission "". permissions: + lunachat.command: + description: lunachat command permission + default: true lunachat.join: - description: joinコマンドの使用権限 + description: join command permission default: true lunachat.leave: - description: leaveコマンドの使用権限 + description: leave command permission default: true lunachat.list: - description: listコマンドの使用権限 + description: list command permission default: true lunachat.invite: - description: inviteコマンドの使用権限 + description: invite command permission default: true lunachat.accept: - description: acceptコマンドの使用権限 + description: accept command permission default: true lunachat.deny: - description: denyコマンドの使用権限 + description: deny command permission default: true lunachat.kick: - description: kickコマンドの使用権限 + description: kick command permission default: true lunachat.ban: - description: banコマンドの使用権限 + description: ban command permission default: true lunachat.pardon: - description: pardonコマンドの使用権限 + description: pardon command permission default: true lunachat.mute: - description: muteコマンドの使用権限 + description: mute command permission default: true lunachat.unmute: - description: unmuteコマンドの使用権限 + description: unmute command permission default: true lunachat.hide: - description: hideコマンドの使用権限 + description: hide command permission default: true lunachat.unhide: - description: unhideコマンドの使用権限 + description: unhide command permission default: true lunachat.info: - description: infoコマンドの使用権限 + description: info command permission default: true lunachat.log: - description: logコマンドの使用権限 + description: log command permission default: true lunachat.create: - description: createコマンドの使用権限 + description: create command permission default: true lunachat.remove: - description: removeコマンドの使用権限 + description: remove command permission default: true lunachat.format: - description: formatコマンドの使用権限 + description: format command permission default: true lunachat.moderator: - description: moderatorコマンドの使用権限 + description: moderator command permission default: true lunachat.option: - description: optionコマンドの使用権限 + description: option command permission default: true lunachat.message: - description: messageコマンドの使用権限 + description: message command permission default: true lunachat.reply: - description: replyコマンドの使用権限 + description: reply command permission default: true lunachat.help: - description: helpコマンドの使用権限 + description: help command permission default: true lunachat.japanize: - description: lunachatのjapanizeオンオフ設定コマンドの使用権限 + description: japanize command permission default: true lunachat.allowcc: - description: チャットにおけるカラーコードの使用権限 + description: premission to use the color codes default: true lunachat.*: children: + lunachat.command: true lunachat.join: true lunachat.leave: true lunachat.list: true @@ -169,34 +173,34 @@ permissions: lunachat.help: true lunachat.japanize: true lunachat.allowcc: true - description: 一般ユーザー向けの全コマンドの使用権限 + description: permissions for the general players lunachat.option.description: - description: descriptionオプション設定コマンドの使用権限 + description: description command permission default: true lunachat.option.alias: - description: aliasオプション設定コマンドの使用権限 + description: alias command permission default: true lunachat.option.color: - description: colorオプション設定コマンドの使用権限 + description: color command permission default: true lunachat.option.broadcast: - description: broadcastオプション設定コマンドの使用権限 + description: broadcast command permission default: op lunachat.option.range: - description: rangeオプション設定コマンドの使用権限 + description: range command permission default: op lunachat.option.password: - description: passwordオプション設定コマンドの使用権限 + description: password command permission default: true lunachat.option.visible: - description: visibleオプション設定コマンドの使用権限 + description: visible command permission default: true lunachat.option.allowcc: - description: allowccオプション設定コマンドの使用権限 + description: allowcc command permission default: true lunachat.option.japanize: - description: japanizeオプション設定コマンドの使用権限 + description: japanize command permission default: true lunachat.option.*: children: @@ -209,34 +213,31 @@ permissions: lunachat.option.visible: true lunachat.option.allowcc: true lunachat.option.japanize: true - description: オプション設定の全コマンドの使用権限 + description: permissions of the option command lunachat-admin.mod-all-channels: - description: 全チャンネルのモデレータ権限 + description: permission of the moderation all channels default: op lunachat-admin.listen-all-channels: - description: 全チャンネルのチャット表示権限 + description: premission to display the chats of all channels default: op lunachat-admin.template: - description: templateコマンドの使用権限 + description: template command permission default: op lunachat-admin.dictionary: - description: dictionaryコマンドの使用権限 - default: op - lunachat-admin.check: - description: checkコマンドの使用権限 + description: dictionary command permission default: op lunachat-admin.set: - description: setコマンドの使用権限 + description: set command permission default: op lunachat-admin.reload: - description: reloadコマンドの使用権限 + description: reload command permission default: op lunachat-admin.japanize-other: - description: 他者のjapanizeオンオフ設定コマンドの使用権限 + description: japanize other command permission default: op lunachat-admin.force-invite: - description: 強制入室コマンドの使用権限 + description: force invite command permission default: op lunachat-admin.*: children: @@ -244,9 +245,9 @@ permissions: lunachat-admin.listen-all-channels: true lunachat-admin.template: true lunachat-admin.dictionary: true - lunachat-admin.check: true lunachat-admin.set: true lunachat-admin.reload: true lunachat-admin.japanize-other: true lunachat-admin.force-invite: true - description: 管理者向けの全コマンドの使用権限 + description: permissions for the administrator + \ No newline at end of file