Skip to content

Commit b72a813

Browse files
authored
update 17.9.0 (#682)
1 parent 8923f46 commit b72a813

File tree

66 files changed

+566
-457
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

66 files changed

+566
-457
lines changed

.github/workflows/ci.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ jobs:
2222

2323
# set env variables
2424
- name: set variables
25-
run: |
26-
echo "APK_URL=https://www.dropbox.com/scl/fi/jc7uhpvb2xa5094lcv0gr/twitch-17.0.0.apk\?rlkey=4wkiikz6wfbvvh9kiywvmivfb\&st=1fzwygd9\&dl=1" >> $GITHUB_ENV
25+
run: |
26+
echo "APK_URL=https://www.dropbox.com/scl/fi/mlm7vzjy7da4g9wp72gzl/twitch-17.9.0.apk\?rlkey=b5fedom0wslvlyxkjkmrf9xt3\&st=kjpp5ly3\&dl=1" >> $GITHUB_ENV
2727
2828
# get keystore.kjs from secret
2929
- name: create keystore.kjs from secret

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ A mod of the Twitch Android Mobile<sup><a href="#no-tv">1</a></sup> App adding B
4545

4646
# Build it yourself
4747

48-
> This patch is meant to be applied to version **16.9.1** of the official twitch app
48+
> This patch is meant to be applied to version **17.9.0** of the official twitch app
4949
> Make sure you use this version before you create an issue!
5050
5151
## Easy way: Docker
@@ -128,7 +128,7 @@ Made with ♥️ by [@FoseFx](https://github.com/FoseFx) and contributors. MIT L
128128
[license-badge]: https://img.shields.io/github/license/bttv-android/bttv?style=flat-square
129129
[license-file]: ./LICENSE
130130
[bttv-version]: https://img.shields.io/github/v/release/bttv-android/bttv?style=flat-square
131-
[base-version]: https://img.shields.io/badge/build%20on-v16.9.1-blueviolet?style=flat-square
131+
[base-version]: https://img.shields.io/badge/build%20on-v17.9.0-blueviolet?style=flat-square
132132
[downloads-latest]: https://img.shields.io/github/downloads/bttv-android/bttv/latest/total?color=yellow&style=flat-square
133133
[downloads-total]: https://img.shields.io/github/downloads/bttv-android/bttv/total?color=yellowgreen&label=downloads%20total&style=flat-square
134134
[latest-release]: https://github.com/bttv-android/bttv/releases/latest

mod/app/src/main/java/bttv/Badges.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import okhttp3.Response;
2020
import okhttp3.ResponseBody;
2121
import tv.twitch.android.models.chat.MessageBadge;
22-
import tv.twitch.chat.ChatMessageInfo;
22+
import tv.twitch.chat.library.model.ChatMessageInfo;
2323

2424
public class Badges {
2525
public static final String TAG = "LBTTVBadges";
@@ -32,7 +32,7 @@ public class Badges {
3232
* Appends our badges to the list of badges if the user has any
3333
*/
3434
public static void appendToBadges(ChatMessageInfo chatMessageInfo, List<MessageBadge> originalBadges) {
35-
String userId = String.valueOf(chatMessageInfo.userId);
35+
String userId = String.valueOf(chatMessageInfo.getUserInfo().getUserId());
3636

3737
List<BTTVBadge> ourBadges = userToBadgesMap.get(userId);
3838

mod/app/src/main/java/bttv/ChommentModelDelegateWrapper.java

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@
66

77
import java.util.List;
88

9+
import javax.inject.Provider;
10+
911
import bttv.highlight.Highlight;
12+
import tv.twitch.android.shared.chat.ChatMessageParserSdk;
1013
import tv.twitch.android.shared.chat.pub.model.messages.MessageToken;
1114
import tv.twitch.android.models.chomments.ChommentModel;
1215
import tv.twitch.android.shared.chat.pub.model.ChatMessageTokenizerWrapper;
@@ -20,16 +23,16 @@ public class ChommentModelDelegateWrapper extends ChommentModelDelegate {
2023
private Boolean BTTVshouldHighlightB = null;
2124

2225
public ChommentModelDelegateWrapper(ChommentModel chommentModel,
23-
SDKServicesController sdkServicesController,
24-
ChatMessageParser chatMessageParser,
25-
ExperimentHelper experimentHelper,
26-
ChatMessageTokenizerWrapper chatMessageTokenizerWrapper) {
26+
Provider<ChatMessageParserSdk> chatMessageParserSdkProvider,
27+
Provider<tv.twitch.android.shared.chat.ChatMessageParser> chatMessageParserProvider,
28+
ChatMessageTokenizerWrapper chatMessageTokenizerWrapper,
29+
tv.twitch.android.shared.chat.KmpChatExperiment kpmChatExperiment) {
2730
super(
2831
chommentModel,
29-
sdkServicesController,
30-
chatMessageParser,
31-
experimentHelper,
32-
chatMessageTokenizerWrapper
32+
chatMessageParserSdkProvider,
33+
chatMessageParserProvider,
34+
chatMessageTokenizerWrapper,
35+
kpmChatExperiment
3336
);
3437
}
3538

mod/app/src/main/java/bttv/Tokenizer.java

Lines changed: 140 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@
2222
import tv.twitch.android.shared.chat.ChatMessageDelegate;
2323
import tv.twitch.chat.AutoModFlags;
2424
import tv.twitch.chat.ChatEmoticonToken;
25-
import tv.twitch.chat.ChatMessageInfo;
2625
import tv.twitch.chat.ChatMessageToken;
2726
import tv.twitch.chat.ChatMessageTokenType;
2827
import tv.twitch.chat.ChatTextToken;
28+
import tv.twitch.chat.library.model.ChatMessageInfo;
2929

3030
public class Tokenizer {
3131

@@ -45,7 +45,7 @@ public static Pair<List<MessageToken>, Boolean> tokenize(List<MessageToken> orig
4545
for (MessageToken token : orig) {
4646
// possible issue: emotes won't work in e.g. MentionToken or BitsToken
4747
if (!(token instanceof TextToken)) {
48-
if (token instanceof EmoticonToken && newTokens.size() > 0) {
48+
if (token instanceof EmoticonToken && !newTokens.isEmpty()) {
4949
if (newTokens.get(newTokens.size() - 1) instanceof EmoticonToken) {
5050
newTokens.add(new TextToken(" ", new AutoModMessageFlags()));
5151
}
@@ -94,10 +94,11 @@ public static Pair<List<MessageToken>, Boolean> tokenize(List<MessageToken> orig
9494
return new Pair<>(newTokens, shouldHighlight);
9595
}
9696

97+
/** @noinspection unused */
9798
public static void retokenizeLiveChatMessage(ChatMessageInterface chatMessageInterface) {
9899
if (chatMessageInterface instanceof ChatMessageDelegate) {
99100
ChatMessageDelegate delegate = (ChatMessageDelegate) chatMessageInterface;
100-
retokenizeLiveChatMessage(delegate.mChatMessage);
101+
retokenizeLiveChatMessage(delegate.chatMessage);
101102
} else {
102103
Log.w(
103104
"LBTTV",
@@ -106,33 +107,123 @@ public static void retokenizeLiveChatMessage(ChatMessageInterface chatMessageInt
106107
}
107108
}
108109

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+
109199
public static void retokenizeLiveChatMessage(ChatMessageInfo info) {
110200
Context ctx = Data.ctx;
111201
int channel = Data.currentBroadcasterId;
112202

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);
114204

115205
boolean shouldHighlight = false;
116206
boolean shouldBlock = false;
117207

118-
for (ChatMessageToken token : info.tokens) {
208+
for (tv.twitch.chat.library.model.MessageToken token : info.tokens) {
119209
Log.d("LBTTV", "retokenizeLiveChatMessage: " + token);
120210
if (!isTextToken(token)) {
121211
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);
123213
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+
);
127218
newTokens.add(spaceToken);
128219
}
129220
}
130221
newTokens.add(token);
131222
continue;
132223
}
133224

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();
136227

137228
if (text.equals(" ")) {
138229
// " ".split(" ") will produce an empty array
@@ -158,14 +249,10 @@ public static void retokenizeLiveChatMessage(ChatMessageInfo info) {
158249
// emote found
159250
String before = currentText.toString();
160251
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());
164253
newTokens.add(everythingBeforeEmote);
165254
}
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);
169256
newTokens.add(emoteToken);
170257

171258
// prepare next TextToken
@@ -174,14 +261,14 @@ public static void retokenizeLiveChatMessage(ChatMessageInfo info) {
174261
}
175262
String before = currentText.toString();
176263
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+
);
180267
newTokens.add(everything);
181268
}
182269
}
183270

184-
info.tokens = newTokens.toArray(new ChatMessageToken[0]);
271+
info.tokens = newTokens;
185272

186273
if (shouldBlock) {
187274
info.messageType = "bttv-blocked-message";
@@ -190,27 +277,55 @@ public static void retokenizeLiveChatMessage(ChatMessageInfo info) {
190277
}
191278
}
192279

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) {
194294
if (token.type.getValue() != ChatMessageTokenType.Text.getValue()) {
195295
return false;
196296
}
197297
ChatTextToken textToken = (ChatTextToken) token;
198298
String text = textToken.text;
199-
if (text.length() == 0) {
299+
if (text.isEmpty()) {
200300
return false;
201301
}
202302
char lastChar = text.charAt(text.length() - 1);
203303
return lastChar == ' ';
204304
}
205305

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) {
207314
if (token == null) {
208315
return false;
209316
}
210317
return token.type.getValue() == ChatMessageTokenType.Text.getValue();
211318
}
212319

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) {
214329
if (token == null) {
215330
return false;
216331
}

mod/app/src/main/java/bttv/api/Badges.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@
55
import java.util.List;
66

77
import tv.twitch.android.models.chat.MessageBadge;
8-
import tv.twitch.chat.ChatMessageInfo;
8+
import tv.twitch.chat.library.model.ChatMessageInfo;
99

1010
public class Badges {
1111
public static final String TAG = "LBTTVBadges";
12+
/** @noinspection unused */
1213
public static void appendToBadges(ChatMessageInfo chatMessageInfo, List<MessageBadge> originalBadges) {
1314
try {
1415
bttv.Badges.appendToBadges(chatMessageInfo, originalBadges);
@@ -17,6 +18,7 @@ public static void appendToBadges(ChatMessageInfo chatMessageInfo, List<MessageB
1718
}
1819
}
1920

21+
/** @noinspection unused */
2022
public static String getUrl(int channelId, String badgeName, String badgeVersion) {
2123
try {
2224
return bttv.Badges.getUrl(channelId, badgeName, badgeVersion);

mod/app/src/main/java/bttv/api/Blacklist.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,18 @@
66
import tv.twitch.android.shared.chat.pub.messages.ui.ChatMessageInterface;
77
import tv.twitch.android.shared.chat.ChatMessageDelegate;
88

9+
/** @noinspection ALL */
910
public class Blacklist {
11+
/** @noinspection unused*/
1012
public static boolean isBlocked(ChatMessageInterface chatMessageInterface) {
1113
if (chatMessageInterface instanceof ChatMessageDelegate) {
1214
ChatMessageDelegate delegate = (ChatMessageDelegate) chatMessageInterface;
13-
return delegate.mChatMessage.messageType.equals("bttv-blocked-message");
15+
if (delegate.chatMessage.messageType != null) {
16+
return delegate.chatMessage.messageType.equals("bttv-blocked-message");
17+
} else {
18+
Log.w("LBTTV", "isBlocked: messageType == null");
19+
return false;
20+
}
1421
} else {
1522
Log.w(
1623
"LBTTV",

0 commit comments

Comments
 (0)