22
22
import tv .twitch .android .shared .chat .ChatMessageDelegate ;
23
23
import tv .twitch .chat .AutoModFlags ;
24
24
import tv .twitch .chat .ChatEmoticonToken ;
25
- import tv .twitch .chat .ChatMessageInfo ;
26
25
import tv .twitch .chat .ChatMessageToken ;
27
26
import tv .twitch .chat .ChatMessageTokenType ;
28
27
import tv .twitch .chat .ChatTextToken ;
28
+ import tv .twitch .chat .library .model .ChatMessageInfo ;
29
29
30
30
public class Tokenizer {
31
31
@@ -45,7 +45,7 @@ public static Pair<List<MessageToken>, Boolean> tokenize(List<MessageToken> orig
45
45
for (MessageToken token : orig ) {
46
46
// possible issue: emotes won't work in e.g. MentionToken or BitsToken
47
47
if (!(token instanceof TextToken )) {
48
- if (token instanceof EmoticonToken && newTokens .size () > 0 ) {
48
+ if (token instanceof EmoticonToken && ! newTokens .isEmpty () ) {
49
49
if (newTokens .get (newTokens .size () - 1 ) instanceof EmoticonToken ) {
50
50
newTokens .add (new TextToken (" " , new AutoModMessageFlags ()));
51
51
}
@@ -94,10 +94,11 @@ public static Pair<List<MessageToken>, Boolean> tokenize(List<MessageToken> orig
94
94
return new Pair <>(newTokens , shouldHighlight );
95
95
}
96
96
97
+ /** @noinspection unused */
97
98
public static void retokenizeLiveChatMessage (ChatMessageInterface chatMessageInterface ) {
98
99
if (chatMessageInterface instanceof ChatMessageDelegate ) {
99
100
ChatMessageDelegate delegate = (ChatMessageDelegate ) chatMessageInterface ;
100
- retokenizeLiveChatMessage (delegate .mChatMessage );
101
+ retokenizeLiveChatMessage (delegate .chatMessage );
101
102
} else {
102
103
Log .w (
103
104
"LBTTV" ,
@@ -106,33 +107,123 @@ public static void retokenizeLiveChatMessage(ChatMessageInterface chatMessageInt
106
107
}
107
108
}
108
109
110
+ /** @noinspection unused */
111
+ public static void retokenizeLiveChatMessage (tv .twitch .chat .ChatMessageInfo info ) {
112
+ try {
113
+ Context ctx = Data .ctx ;
114
+ int channel = Data .currentBroadcasterId ;
115
+
116
+ ArrayList <tv .twitch .chat .ChatMessageToken > newTokens = new ArrayList <>(info .tokens .length + 10 );
117
+
118
+ boolean shouldHighlight = false ;
119
+ boolean shouldBlock = false ;
120
+
121
+ for (tv .twitch .chat .ChatMessageToken token : info .tokens ) {
122
+ Log .d ("LBTTV" , "retokenizeLiveChatMessage: " + token );
123
+ if (!isTextTokenOld (token )) {
124
+ if (isEmoteTokenOld (token ) && !newTokens .isEmpty ()) {
125
+ tv .twitch .chat .ChatMessageToken prevToken = newTokens .get (newTokens .size () - 1 );
126
+ if (prevToken != null && !endsWithSpaceOld (prevToken )) {
127
+ ChatTextToken spaceToken = new ChatTextToken ();
128
+ spaceToken .text = " " ;
129
+ spaceToken .autoModFlags = new AutoModFlags ();
130
+ newTokens .add (spaceToken );
131
+ }
132
+ }
133
+ newTokens .add (token );
134
+ continue ;
135
+ }
136
+
137
+ ChatTextToken textToken = (ChatTextToken ) token ;
138
+ String text = textToken .text ;
139
+
140
+ if (text .equals (" " )) {
141
+ // " ".split(" ") will produce an empty array
142
+ // this is why we need to handle this edge-case
143
+ newTokens .add (textToken );
144
+ continue ;
145
+ }
146
+ String [] tokens = text .split (" " );
147
+
148
+ StringBuilder currentText = new StringBuilder ();
149
+ for (String word : tokens ) {
150
+ if (Blacklist .shouldBlock (word )) {
151
+ shouldBlock = true ;
152
+ }
153
+ if (Highlight .shouldHighlight (word )) {
154
+ shouldHighlight = true ;
155
+ }
156
+ Emote emote = Emotes .getEmote (ctx , word , channel );
157
+ if (emote == null ) {
158
+ currentText .append (word ).append (" " );
159
+ continue ;
160
+ }
161
+ // emote found
162
+ String before = currentText .toString ();
163
+ if (!before .isEmpty ()) {
164
+ ChatTextToken everythingBeforeEmote = new ChatTextToken ();
165
+ everythingBeforeEmote .text = before ;
166
+ everythingBeforeEmote .autoModFlags = textToken .autoModFlags ;
167
+ newTokens .add (everythingBeforeEmote );
168
+ }
169
+ ChatEmoticonToken emoteToken = new ChatEmoticonToken ();
170
+ emoteToken .emoticonText = word ;
171
+ emoteToken .emoticonId = "BTTV-" + emote .id ;
172
+ newTokens .add (emoteToken );
173
+
174
+ // prepare next TextToken
175
+ currentText .setLength (0 );
176
+ currentText .append (' ' );
177
+ }
178
+ String before = currentText .toString ();
179
+ if (!before .trim ().isEmpty ()) {
180
+ ChatTextToken everything = new ChatTextToken ();
181
+ everything .text = before ;
182
+ everything .autoModFlags = textToken .autoModFlags ;
183
+ newTokens .add (everything );
184
+ }
185
+ }
186
+
187
+ info .tokens = newTokens .toArray (new ChatMessageToken [0 ]);
188
+
189
+ if (shouldBlock ) {
190
+ info .messageType = "bttv-blocked-message" ;
191
+ } else if (shouldHighlight ) {
192
+ info .messageType = "bttv-highlighted-message" ;
193
+ }
194
+ } catch (Throwable throwable ) {
195
+ Log .e ("LBTTV" , "retokenizeLiveChatMessage: " + throwable .getMessage ());
196
+ }
197
+ }
198
+
109
199
public static void retokenizeLiveChatMessage (ChatMessageInfo info ) {
110
200
Context ctx = Data .ctx ;
111
201
int channel = Data .currentBroadcasterId ;
112
202
113
- ArrayList <ChatMessageToken > newTokens = new ArrayList <>(info .tokens .length + 10 );
203
+ ArrayList <tv . twitch . chat . library . model . MessageToken > newTokens = new ArrayList <>(info .tokens .size () + 10 );
114
204
115
205
boolean shouldHighlight = false ;
116
206
boolean shouldBlock = false ;
117
207
118
- for (ChatMessageToken token : info .tokens ) {
208
+ for (tv . twitch . chat . library . model . MessageToken token : info .tokens ) {
119
209
Log .d ("LBTTV" , "retokenizeLiveChatMessage: " + token );
120
210
if (!isTextToken (token )) {
121
211
if (isEmoteToken (token ) && !newTokens .isEmpty ()) {
122
- ChatMessageToken prevToken = newTokens .get (newTokens .size () - 1 );
212
+ tv . twitch . chat . library . model . MessageToken prevToken = newTokens .get (newTokens .size () - 1 );
123
213
if (prevToken != null && !endsWithSpace (prevToken )) {
124
- ChatTextToken spaceToken = new ChatTextToken ();
125
- spaceToken .text = " " ;
126
- spaceToken .autoModFlags = new AutoModFlags ();
214
+ tv .twitch .chat .library .model .MessageToken .TextToken spaceToken = new tv .twitch .chat .library .model .MessageToken .TextToken (
215
+ " " ,
216
+ new tv .twitch .chat .library .model .AutoModFlags ()
217
+ );
127
218
newTokens .add (spaceToken );
128
219
}
129
220
}
130
221
newTokens .add (token );
131
222
continue ;
132
223
}
133
224
134
- ChatTextToken textToken = (ChatTextToken ) token ;
135
- String text = textToken .text ;
225
+ tv . twitch . chat . library . model . MessageToken . TextToken textToken = (tv . twitch . chat . library . model . MessageToken . TextToken ) token ;
226
+ String text = textToken .getText () ;
136
227
137
228
if (text .equals (" " )) {
138
229
// " ".split(" ") will produce an empty array
@@ -158,14 +249,10 @@ public static void retokenizeLiveChatMessage(ChatMessageInfo info) {
158
249
// emote found
159
250
String before = currentText .toString ();
160
251
if (!before .isEmpty ()) {
161
- ChatTextToken everythingBeforeEmote = new ChatTextToken ();
162
- everythingBeforeEmote .text = before ;
163
- everythingBeforeEmote .autoModFlags = textToken .autoModFlags ;
252
+ tv .twitch .chat .library .model .MessageToken .TextToken everythingBeforeEmote = new tv .twitch .chat .library .model .MessageToken .TextToken (before , textToken .getFlags ());
164
253
newTokens .add (everythingBeforeEmote );
165
254
}
166
- ChatEmoticonToken emoteToken = new ChatEmoticonToken ();
167
- emoteToken .emoticonId = "BTTV-" + emote .id ;
168
- emoteToken .emoticonText = word ;
255
+ tv .twitch .chat .library .model .MessageToken .EmoteToken emoteToken = new tv .twitch .chat .library .model .MessageToken .EmoteToken (word , "BTTV-" + emote .id );
169
256
newTokens .add (emoteToken );
170
257
171
258
// prepare next TextToken
@@ -174,14 +261,14 @@ public static void retokenizeLiveChatMessage(ChatMessageInfo info) {
174
261
}
175
262
String before = currentText .toString ();
176
263
if (!before .trim ().isEmpty ()) {
177
- ChatTextToken everything = new ChatTextToken ();
178
- everything . text = before ;
179
- everything . autoModFlags = textToken . autoModFlags ;
264
+ tv . twitch . chat . library . model . MessageToken . TextToken everything = new tv . twitch . chat . library . model . MessageToken . TextToken (
265
+ before , textToken . getFlags ()
266
+ ) ;
180
267
newTokens .add (everything );
181
268
}
182
269
}
183
270
184
- info .tokens = newTokens . toArray ( new ChatMessageToken [ 0 ]) ;
271
+ info .tokens = newTokens ;
185
272
186
273
if (shouldBlock ) {
187
274
info .messageType = "bttv-blocked-message" ;
@@ -190,27 +277,55 @@ public static void retokenizeLiveChatMessage(ChatMessageInfo info) {
190
277
}
191
278
}
192
279
193
- private static boolean endsWithSpace (@ NotNull ChatMessageToken token ) {
280
+ private static boolean endsWithSpace (@ NotNull tv .twitch .chat .library .model .MessageToken token ) {
281
+ if (!(token instanceof tv .twitch .chat .library .model .MessageToken .TextToken )) {
282
+ return false ;
283
+ }
284
+ tv .twitch .chat .library .model .MessageToken .TextToken textToken = (tv .twitch .chat .library .model .MessageToken .TextToken ) token ;
285
+ String text = textToken .getText ();
286
+ if (text .isEmpty ()) {
287
+ return false ;
288
+ }
289
+ char lastChar = text .charAt (text .length () - 1 );
290
+ return lastChar == ' ' ;
291
+ }
292
+
293
+ private static boolean endsWithSpaceOld (@ NotNull tv .twitch .chat .ChatMessageToken token ) {
194
294
if (token .type .getValue () != ChatMessageTokenType .Text .getValue ()) {
195
295
return false ;
196
296
}
197
297
ChatTextToken textToken = (ChatTextToken ) token ;
198
298
String text = textToken .text ;
199
- if (text .length () == 0 ) {
299
+ if (text .isEmpty () ) {
200
300
return false ;
201
301
}
202
302
char lastChar = text .charAt (text .length () - 1 );
203
303
return lastChar == ' ' ;
204
304
}
205
305
206
- private static boolean isTextToken (ChatMessageToken token ) {
306
+ private static boolean isTextToken (tv .twitch .chat .library .model .MessageToken token ) {
307
+ if (token == null ) {
308
+ return false ;
309
+ }
310
+ return token instanceof tv .twitch .chat .library .model .MessageToken .TextToken ;
311
+ }
312
+
313
+ private static boolean isTextTokenOld (tv .twitch .chat .ChatMessageToken token ) {
207
314
if (token == null ) {
208
315
return false ;
209
316
}
210
317
return token .type .getValue () == ChatMessageTokenType .Text .getValue ();
211
318
}
212
319
213
- private static boolean isEmoteToken (ChatMessageToken token ) {
320
+
321
+ private static boolean isEmoteToken (tv .twitch .chat .library .model .MessageToken token ) {
322
+ if (token == null ) {
323
+ return false ;
324
+ }
325
+ return token instanceof tv .twitch .chat .library .model .MessageToken .EmoteToken ;
326
+ }
327
+
328
+ private static boolean isEmoteTokenOld (tv .twitch .chat .ChatMessageToken token ) {
214
329
if (token == null ) {
215
330
return false ;
216
331
}
0 commit comments