1
1
package com .eternalcode .formatter ;
2
2
3
3
import com .eternalcode .formatter .legacy .Legacy ;
4
+ import com .eternalcode .formatter .legacy .LegacyPostMessageProcessor ;
5
+ import com .eternalcode .formatter .legacy .LegacyPreProcessor ;
4
6
import com .eternalcode .formatter .placeholder .PlaceholderRegistry ;
5
7
import com .eternalcode .formatter .preparatory .ChatPreparatoryService ;
6
8
import com .eternalcode .formatter .preparatory .ChatPrepareResult ;
9
+ import com .eternalcode .formatter .adventure .PlayerSignedMessage ;
7
10
import com .eternalcode .formatter .template .TemplateService ;
11
+ import com .google .common .collect .ImmutableMap ;
8
12
import net .kyori .adventure .audience .Audience ;
13
+ import net .kyori .adventure .chat .ChatType ;
9
14
import net .kyori .adventure .identity .Identity ;
10
15
import net .kyori .adventure .platform .AudienceProvider ;
11
16
import net .kyori .adventure .text .Component ;
17
+ import net .kyori .adventure .text .format .TextDecoration ;
12
18
import net .kyori .adventure .text .minimessage .MiniMessage ;
13
19
import net .kyori .adventure .text .minimessage .tag .resolver .Placeholder ;
14
20
import net .kyori .adventure .text .minimessage .tag .resolver .TagResolver ;
21
+ import net .kyori .adventure .text .minimessage .tag .standard .StandardTags ;
15
22
import net .kyori .adventure .text .serializer .gson .GsonComponentSerializer ;
16
23
import org .bukkit .entity .Player ;
17
24
import org .bukkit .event .EventHandler ;
18
25
import org .bukkit .event .EventPriority ;
19
26
import org .bukkit .event .Listener ;
20
27
import org .bukkit .event .player .AsyncPlayerChatEvent ;
21
28
29
+ import java .util .ArrayList ;
30
+ import java .util .List ;
31
+ import java .util .Map ;
22
32
import java .util .Set ;
23
33
24
34
class ChatController implements Listener {
25
35
36
+ private static final String PERMISSION_ALL = "chatformatter.*" ;
37
+ private static final String PERMISSION_LEGACY = "chatformatter.legacycolor" ;
38
+ private static final Map <String , TagResolver > TAG_RESOLVERS_BY_PERMISSION = new ImmutableMap .Builder <String , TagResolver >()
39
+ .put ("chatformatter.color" , StandardTags .color ())
40
+ .put ("chatformatter.decorations.*" , StandardTags .decorations ())
41
+ .put ("chatformatter.decorations.bold" , StandardTags .decorations (TextDecoration .BOLD ))
42
+ .put ("chatformatter.decorations.italic" , StandardTags .decorations (TextDecoration .ITALIC ))
43
+ .put ("chatformatter.decorations.underlined" , StandardTags .decorations (TextDecoration .UNDERLINED ))
44
+ .put ("chatformatter.decorations.strikethrough" , StandardTags .decorations (TextDecoration .STRIKETHROUGH ))
45
+ .put ("chatformatter.decorations.obfuscated" , StandardTags .decorations (TextDecoration .OBFUSCATED ))
46
+ .put ("chatformatter.reset" , StandardTags .reset ())
47
+ .put ("chatformatter.gradient" , StandardTags .gradient ())
48
+ .put ("chatformatter.hover" , StandardTags .hoverEvent ())
49
+ .put ("chatformatter.click" , StandardTags .clickEvent ())
50
+ .put ("chatformatter.insertion" , StandardTags .insertion ())
51
+ .put ("chatformatter.font" , StandardTags .font ())
52
+ .put ("chatformatter.transition" , StandardTags .transition ())
53
+ .put ("chatformatter.translatable" , StandardTags .translatable ())
54
+ .put ("chatformatter.selector" , StandardTags .selector ())
55
+ .put ("chatformatter.keybind" , StandardTags .keybind ())
56
+ .put ("chatformatter.newline" , StandardTags .newline ())
57
+ .build ();
58
+
26
59
private static final GsonComponentSerializer GSON = GsonComponentSerializer .gson ();
60
+ private static final MiniMessage MESSAGE_DESERIALIZER = MiniMessage .builder ()
61
+ .tags (TagResolver .empty ())
62
+ .preProcessor (new LegacyPreProcessor ())
63
+ .postProcessor (new LegacyPostMessageProcessor ())
64
+ .build ();
27
65
28
66
private final AudienceProvider audienceProvider ;
29
67
private final MiniMessage miniMessage ;
@@ -71,7 +109,7 @@ void onChat(AsyncPlayerChatEvent event) {
71
109
message = this .templateService .applyTemplates (message );
72
110
message = this .placeholderRegistry .format (message , player );
73
111
74
- Component messageComponent = miniMessage .deserialize (message , this .messageTag ( event ), this . displaynameTag (event ));
112
+ Component messageComponent = miniMessage .deserialize (message , this .createTagResolvers (event ));
75
113
76
114
Set <Player > recipients = event .getRecipients ();
77
115
@@ -86,27 +124,48 @@ void onChat(AsyncPlayerChatEvent event) {
86
124
recipients = result .getReceivers ();
87
125
}
88
126
127
+ PlayerSignedMessage signedMessage = new PlayerSignedMessage (messageComponent , identity );
128
+ ChatType .Bound chatType = ChatType .CHAT .bind (Component .text ("chat" ));
129
+
89
130
for (Player recipient : recipients ) {
90
131
Audience recipientAudience = this .audienceProvider .player (recipient .getUniqueId ());
91
132
92
- recipientAudience .sendMessage (identity , messageComponent );
133
+ recipientAudience .sendMessage (signedMessage , chatType );
93
134
}
94
135
95
- this .audienceProvider .console ().sendMessage (identity , messageComponent );
136
+ this .audienceProvider .console ().sendMessage (signedMessage , chatType );
96
137
}
97
138
98
- private TagResolver . Single messageTag (AsyncPlayerChatEvent event ) {
139
+ private TagResolver createTagResolvers (AsyncPlayerChatEvent event ) {
99
140
String message = event .getMessage ();
100
141
Player player = event .getPlayer ();
101
142
102
- return player .hasPermission ("chatformatter.chat.color" )
103
- ? Placeholder .parsed ("message" , message )
104
- : Placeholder .unparsed ("message" , Legacy .shadow (message ));
143
+ TagResolver .Single displayNamePlaceholder = Placeholder .parsed ("displayname" , Legacy .clearSection (event .getPlayer ().getDisplayName ()));
144
+
145
+ String safeMessage = player .hasPermission (PERMISSION_LEGACY )
146
+ ? message
147
+ : Legacy .ampersandToPlaceholder (message );
148
+ Component componentMessage = MESSAGE_DESERIALIZER .deserialize (safeMessage , this .messageResolver (player ));
149
+ TagResolver .Single messagePlaceholder = Placeholder .component ("message" , componentMessage );
150
+
151
+ return TagResolver .resolver (displayNamePlaceholder , messagePlaceholder );
105
152
}
106
153
154
+ private TagResolver messageResolver (Player player ) {
155
+ List <TagResolver > tagResolvers = new ArrayList <>();
156
+
157
+ if (player .hasPermission (PERMISSION_ALL )) {
158
+ tagResolvers .addAll (TAG_RESOLVERS_BY_PERMISSION .values ());
159
+ return TagResolver .resolver (tagResolvers );
160
+ }
161
+
162
+ for (Map .Entry <String , TagResolver > entry : TAG_RESOLVERS_BY_PERMISSION .entrySet ()) {
163
+ if (player .hasPermission (entry .getKey ())) {
164
+ tagResolvers .add (entry .getValue ());
165
+ }
166
+ }
107
167
108
- private TagResolver .Single displaynameTag (AsyncPlayerChatEvent event ) {
109
- return Placeholder .parsed ("displayname" , Legacy .clearSection (event .getPlayer ().getDisplayName ()));
168
+ return TagResolver .resolver (tagResolvers );
110
169
}
111
170
112
171
}
0 commit comments