-
Notifications
You must be signed in to change notification settings - Fork 4
/
PlayerChatListener.java
109 lines (90 loc) · 3.78 KB
/
PlayerChatListener.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/*
* @author ucchy
* @license LGPLv3
* @copyright Copyright ucchy 2013
*/
package com.github.ucchyocean.ct.listener;
import org.bukkit.GameMode;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import com.github.ucchyocean.ct.ColorTeaming;
import com.github.ucchyocean.ct.KanaConverter;
import com.github.ucchyocean.ct.config.ColorTeamingConfig;
/**
* チャットが発生したときに、チームチャットへ転送するためのリスナークラス
* @author ucchy
*/
public class PlayerChatListener implements Listener {
private static final String GLOBAL_CHAT_MARKER = "#GLOBAL#";
private static final String REGEX_URL = "https?://[\\w/:%#\\$&\\?\\(\\)~\\.=\\+\\-]+";
private ColorTeaming plugin;
public PlayerChatListener(ColorTeaming plugin) {
this.plugin = plugin;
}
/**
* Playerがチャットを送信したときに発生するイベント
* @param event
*/
@EventHandler(priority=EventPriority.LOW)
public void onPlayerChat(AsyncPlayerChatEvent event) {
// GLOBALマーカーが付いていたら、/g コマンドを経由してきたので、
// GLOBALマーカーを取り除いてから抜ける。
ColorTeamingConfig config = plugin.getCTConfig();
if ( event.getMessage().startsWith(GLOBAL_CHAT_MARKER) ) {
String newMessage = event.getMessage().substring(GLOBAL_CHAT_MARKER.length());
if ( config.isShowJapanizeGlobalChat() ) {
newMessage = addJapanize(newMessage); // Japanize化
}
event.setMessage(newMessage);
return;
}
// チームチャット無効なら、何もせずに抜ける
if ( !config.isTeamChatMode() ) {
if ( config.isShowJapanizeGlobalChat() ) {
event.setMessage( addJapanize(event.getMessage()) ); // Japanize化
}
return;
}
Player player = event.getPlayer();
// プレイヤーのゲームモードがクリエイティブなら、何もせずに抜ける
if ( player.getGameMode() == GameMode.CREATIVE ) {
if ( config.isShowJapanizeGlobalChat() ) {
event.setMessage( addJapanize(event.getMessage()) ); // Japanize化
}
return;
}
// チームに所属していなければ、何もせずに抜ける
if ( plugin.getAPI().getPlayerTeamName(player) == null ) {
if ( config.isShowJapanizeGlobalChat() ) {
event.setMessage( addJapanize(event.getMessage()) ); // Japanize化
}
return;
}
// チームメンバに送信する
plugin.getAPI().sendTeamChat(player, event.getMessage());
// 元のイベントをキャンセル
event.setCancelled(true);
}
/**
* ローマ字をかな変換して、うしろにくっつける
* @param message 変換元
* @return 変換後
*/
private String addJapanize(String message) {
// 2byteコードを含む場合や、半角カタカナしか含まない場合は、
// 処理しないようにする。
if ( message.getBytes().length == message.length() &&
!message.matches("[ \\uFF61-\\uFF9F]+") ) {
// URL削除
String kana = message.replaceAll(REGEX_URL, " ");
// Japanize化
kana = KanaConverter.conv(kana);
// 元の文字列と合成
message = message + " (" + kana + ")";
}
return message;
}
}