Skip to content

Commit dfd4914

Browse files
authored
Merge pull request #416 from okue/notificationDisabled
Support notificationDisabled option for Multicast, PushMessage, ReplyMessage
2 parents 93b688c + d1a40b2 commit dfd4914

File tree

9 files changed

+164
-20
lines changed

9 files changed

+164
-20
lines changed

line-bot-api-client/src/test/java/com/linecorp/bot/client/LineMessagingClientImplIntegrationTest.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,12 @@
1616

1717
package com.linecorp.bot.client;
1818

19+
import static java.util.Collections.singleton;
20+
1921
import java.io.IOException;
2022
import java.net.URL;
2123
import java.util.Map;
24+
import java.util.concurrent.Callable;
2225

2326
import org.junit.Assume;
2427
import org.junit.Before;
@@ -27,6 +30,10 @@
2730

2831
import com.fasterxml.jackson.databind.ObjectMapper;
2932

33+
import com.linecorp.bot.model.Broadcast;
34+
import com.linecorp.bot.model.Multicast;
35+
import com.linecorp.bot.model.PushMessage;
36+
import com.linecorp.bot.model.message.TextMessage;
3037
import com.linecorp.bot.model.response.GetNumberOfFollowersResponse;
3138
import com.linecorp.bot.model.response.GetNumberOfMessageDeliveriesResponse;
3239
import com.linecorp.bot.model.response.NumberOfMessagesResponse;
@@ -42,6 +49,7 @@
4249
public class LineMessagingClientImplIntegrationTest {
4350
public static final URL TEST_RESOURCE = ClassLoader.getSystemResource("integration_test_settings.yml");
4451
private LineMessagingClient target;
52+
private String userId;
4553

4654
@Before
4755
public void setUp() throws IOException {
@@ -54,6 +62,44 @@ public void setUp() throws IOException {
5462
.builder((String) map.get("token"))
5563
.apiEndPoint((String) map.get("endpoint"))
5664
.build();
65+
66+
userId = (String) map.get("userId");
67+
}
68+
69+
private static void testApiCall(Callable<Object> f) throws Exception {
70+
final Object response = f.call();
71+
log.info(response.toString());
72+
}
73+
74+
@Test
75+
public void broadcast() throws Exception {
76+
testApiCall(
77+
() -> target.broadcast(new Broadcast(new TextMessage("Broadcast"), true)).get()
78+
);
79+
testApiCall(
80+
() -> target.broadcast(new Broadcast(new TextMessage("Broadcast"))).get()
81+
);
82+
}
83+
84+
@Test
85+
public void multicast() throws Exception {
86+
testApiCall(
87+
() -> target.multicast(new Multicast(singleton(userId), new TextMessage("Multicast"), true))
88+
.get()
89+
);
90+
testApiCall(
91+
() -> target.multicast(new Multicast(singleton(userId), new TextMessage("Multicast"))).get()
92+
);
93+
}
94+
95+
@Test
96+
public void pushMessage() throws Exception {
97+
testApiCall(
98+
() -> target.pushMessage(new PushMessage(userId, new TextMessage("Push"), true)).get()
99+
);
100+
testApiCall(
101+
() -> target.pushMessage(new PushMessage(userId, new TextMessage("Push"))).get()
102+
);
57103
}
58104

59105
@Test

line-bot-api-client/src/test/java/com/linecorp/bot/client/LineMessagingClientImplTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import static java.util.Collections.emptyList;
2020
import static java.util.Collections.singleton;
21+
import static java.util.Collections.singletonList;
2122
import static java.util.Collections.singletonMap;
2223
import static org.assertj.core.api.Assertions.assertThat;
2324
import static org.mockito.ArgumentMatchers.any;
@@ -28,7 +29,6 @@
2829

2930
import java.io.IOException;
3031
import java.net.URI;
31-
import java.util.Collections;
3232

3333
import org.junit.Rule;
3434
import org.junit.Test;
@@ -138,7 +138,7 @@ public void multicastTest() throws Exception {
138138
@Test
139139
public void broadcast() {
140140
whenCall(retrofitMock.broadcast(any()), BOT_API_SUCCESS_RESPONSE_BODY);
141-
final Broadcast broadcast = new Broadcast(Collections.singletonList(new TextMessage("text")), true);
141+
final Broadcast broadcast = new Broadcast(singletonList(new TextMessage("text")), true);
142142

143143
final BotApiResponse botApiResponse = target.broadcast(broadcast).join();
144144
verify(retrofitMock).broadcast(broadcast);
@@ -393,7 +393,7 @@ public void linkRichMenuToUsers() {
393393
whenCall(retrofitMock.linkRichMenuToUsers(any()), null);
394394

395395
// Do
396-
final BotApiResponse botApiResponse = target.linkRichMenuIdToUsers(Collections.singletonList("USER_ID"),
396+
final BotApiResponse botApiResponse = target.linkRichMenuIdToUsers(singletonList("USER_ID"),
397397
"RICH_MENU_ID")
398398
.join();
399399

@@ -424,7 +424,7 @@ public void unlinkRichMenuIdFromUsers() throws Exception {
424424
null);
425425

426426
// Do
427-
final BotApiResponse botApiResponse = target.unlinkRichMenuIdFromUsers(Collections.singletonList("ID"))
427+
final BotApiResponse botApiResponse = target.unlinkRichMenuIdFromUsers(singletonList("ID"))
428428
.join();
429429

430430
// Verify

line-bot-model/src/main/java/com/linecorp/bot/model/Broadcast.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package com.linecorp.bot.model;
1818

19+
import static java.util.Collections.singletonList;
20+
1921
import java.util.List;
2022

2123
import com.fasterxml.jackson.annotation.JsonCreator;
@@ -46,6 +48,18 @@ public class Broadcast {
4648
*/
4749
private final boolean notificationDisabled;
4850

51+
public Broadcast(Message messages) {
52+
this(singletonList(messages), false);
53+
}
54+
55+
public Broadcast(List<Message> messages) {
56+
this(messages, false);
57+
}
58+
59+
public Broadcast(Message messages, boolean notificationDisabled) {
60+
this(singletonList(messages), notificationDisabled);
61+
}
62+
4963
@JsonCreator
5064
public Broadcast(@JsonProperty("messages") List<Message> messages,
5165
@JsonProperty("notificationDisabled") boolean notificationDisabled) {

line-bot-model/src/main/java/com/linecorp/bot/model/Multicast.java

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,15 +48,36 @@ public class Multicast {
4848
*/
4949
private final List<Message> messages;
5050

51+
/**
52+
* Whether sends a push notification to message receivers or not. If {@literal true}, the user doesn't
53+
* receive a push notification when the message is sent. And if {@literal false}, the user receives a push
54+
* notification when the message is sent (unless they have disabled push notifications in LINE and/or their
55+
* device).
56+
*/
57+
private final boolean notificationDisabled;
58+
5159
public Multicast(final Set<String> to,
5260
final Message message) {
53-
this(to, Collections.singletonList(message));
61+
this(to, Collections.singletonList(message), false);
62+
}
63+
64+
public Multicast(final Set<String> to,
65+
final List<Message> messages) {
66+
this(to, messages, false);
67+
}
68+
69+
public Multicast(final Set<String> to,
70+
final Message message,
71+
boolean notificationDisabled) {
72+
this(to, Collections.singletonList(message), notificationDisabled);
5473
}
5574

5675
@JsonCreator
5776
public Multicast(@JsonProperty("to") final Set<String> to,
58-
@JsonProperty("messages") final List<Message> messages) {
77+
@JsonProperty("messages") final List<Message> messages,
78+
@JsonProperty("notificationDisabled") boolean notificationDisabled) {
5979
this.to = to;
6080
this.messages = messages;
81+
this.notificationDisabled = notificationDisabled;
6182
}
6283
}

line-bot-model/src/main/java/com/linecorp/bot/model/PushMessage.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,23 @@ public class PushMessage {
4242
*/
4343
private final List<Message> messages;
4444

45+
/**
46+
* Whether sends a push notification to message receivers or not. If {@literal true}, the user doesn't
47+
* receive a push notification when the message is sent. And if {@literal false}, the user receives a push
48+
* notification when the message is sent (unless they have disabled push notifications in LINE and/or their
49+
* device).
50+
*/
51+
private final boolean notificationDisabled;
52+
4553
public PushMessage(String to, Message message) {
46-
this.to = to;
47-
this.messages = Collections.singletonList(message);
54+
this(to, Collections.singletonList(message), false);
55+
}
56+
57+
public PushMessage(String to, List<Message> messages) {
58+
this(to, messages, false);
59+
}
60+
61+
public PushMessage(String to, Message message, boolean notificationDisabled) {
62+
this(to, Collections.singletonList(message), notificationDisabled);
4863
}
4964
}

line-bot-model/src/main/java/com/linecorp/bot/model/ReplyMessage.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,23 @@ public class ReplyMessage {
4949
*/
5050
private final List<Message> messages;
5151

52+
/**
53+
* Whether sends a push notification to message receivers or not. If {@literal true}, the user doesn't
54+
* receive a push notification when the message is sent. And if {@literal false}, the user receives a push
55+
* notification when the message is sent (unless they have disabled push notifications in LINE and/or their
56+
* device).
57+
*/
58+
private final boolean notificationDisabled;
59+
5260
public ReplyMessage(String replyToken, Message message) {
53-
this(replyToken, Collections.singletonList(message));
61+
this(replyToken, Collections.singletonList(message), false);
62+
}
63+
64+
public ReplyMessage(String replyToken, List<Message> messages) {
65+
this(replyToken, messages, false);
66+
}
67+
68+
public ReplyMessage(String replyToken, Message message, boolean notificationDisabled) {
69+
this(replyToken, Collections.singletonList(message), notificationDisabled);
5470
}
5571
}

line-bot-model/src/test/java/com/linecorp/bot/model/message/MessageJsonReconstructionTest.java

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -181,16 +181,34 @@ public void flexMessage() {
181181
@Test
182182
public void multicastTest() {
183183
final Multicast multicast =
184+
new Multicast(singleton("LINE_ID"), singletonList(new TextMessage("text")), true);
185+
test(multicast);
186+
187+
final Multicast multicast2 =
188+
new Multicast(singleton("LINE_ID"), new TextMessage("text"), true);
189+
test(multicast2);
190+
191+
final Multicast multicast3 =
184192
new Multicast(singleton("LINE_ID"), singletonList(new TextMessage("text")));
193+
test(multicast3);
185194

186-
test(multicast);
195+
final Multicast multicast4 = new Multicast(singleton("LINE_ID"), new TextMessage("text"));
196+
test(multicast4);
187197
}
188198

189199
@Test
190200
public void broadcast() {
191-
final Broadcast broadcast = new Broadcast(singletonList(new TextMessage("text")), true);
192-
201+
final Broadcast broadcast = new Broadcast(new TextMessage("text"));
193202
test(broadcast);
203+
204+
final Broadcast broadcast2 = new Broadcast(new TextMessage("text"), true);
205+
test(broadcast2);
206+
207+
final Broadcast broadcast3 = new Broadcast(singletonList(new TextMessage("text")));
208+
test(broadcast3);
209+
210+
final Broadcast broadcast4 = new Broadcast(singletonList(new TextMessage("text")), true);
211+
test(broadcast4);
194212
}
195213

196214
@Test

line-bot-spring-boot/src/test/java/com/linecorp/bot/spring/boot/IntegrationTest.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,14 +157,16 @@ public void validCallbackTest() throws Exception {
157157
assertThat(request1.getHeader("Authorization")).isEqualTo("Bearer TOKEN");
158158
assertThat(request1.getBody().readUtf8())
159159
.isEqualTo("{\"replyToken\":\"nHuyWiB7yP5Zw52FIkcQobQuGDXCTA\","
160-
+ "\"messages\":[{\"type\":\"text\",\"text\":\"Hello, world\"}]}");
160+
+ "\"messages\":[{\"type\":\"text\",\"text\":\"Hello, world\"}],"
161+
+ "\"notificationDisabled\":false}");
161162

162163
// Test request 2
163164
RecordedRequest request2 = server.takeRequest(3, TimeUnit.SECONDS);
164165
assertThat(request2.getPath()).isEqualTo("/v2/bot/message/reply");
165166
assertThat(request2.getHeader("Authorization")).isEqualTo("Bearer TOKEN");
166167
assertThat(request2.getBody().readUtf8())
167168
.isEqualTo("{\"replyToken\":\"nHuyWiB7yP5Zw52FIkcQobQuGDXCTA\","
168-
+ "\"messages\":[{\"type\":\"text\",\"text\":\"follow\"}]}");
169+
+ "\"messages\":[{\"type\":\"text\",\"text\":\"follow\"}],"
170+
+ "\"notificationDisabled\":false}");
169171
}
170172
}

sample-spring-boot-kitchensink/src/main/java/com/example/bot/spring/KitchenSinkController.java

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package com.example.bot.spring;
1818

19+
import static java.util.Collections.singletonList;
20+
1921
import java.io.IOException;
2022
import java.io.OutputStream;
2123
import java.io.UncheckedIOException;
@@ -26,7 +28,6 @@
2628
import java.time.LocalDateTime;
2729
import java.time.LocalTime;
2830
import java.util.Arrays;
29-
import java.util.Collections;
3031
import java.util.List;
3132
import java.util.UUID;
3233
import java.util.concurrent.ExecutionException;
@@ -252,13 +253,19 @@ public void handleOtherEvent(Event event) {
252253
}
253254

254255
private void reply(@NonNull String replyToken, @NonNull Message message) {
255-
reply(replyToken, Collections.singletonList(message));
256+
reply(replyToken, singletonList(message));
256257
}
257258

258259
private void reply(@NonNull String replyToken, @NonNull List<Message> messages) {
260+
reply(replyToken, messages, false);
261+
}
262+
263+
private void reply(@NonNull String replyToken,
264+
@NonNull List<Message> messages,
265+
boolean notificationDisabled) {
259266
try {
260267
BotApiResponse apiResponse = lineMessagingClient
261-
.replyMessage(new ReplyMessage(replyToken, messages))
268+
.replyMessage(new ReplyMessage(replyToken, messages, notificationDisabled))
262269
.get();
263270
log.info("Sent messages: {}", apiResponse);
264271
} catch (InterruptedException | ExecutionException e) {
@@ -297,14 +304,14 @@ private void handleSticker(String replyToken, StickerMessageContent content) {
297304

298305
private void handleTextContent(String replyToken, Event event, TextMessageContent content)
299306
throws Exception {
300-
String text = content.getText();
307+
final String text = content.getText();
301308

302309
log.info("Got text message from replyToken:{}: text:{}", replyToken, text);
303310
switch (text) {
304311
case "profile": {
305312
log.info("Invoking 'profile' command: source:{}",
306313
event.getSource());
307-
String userId = event.getSource().getUserId();
314+
final String userId = event.getSource().getUserId();
308315
if (userId != null) {
309316
if (event.getSource() instanceof GroupSource) {
310317
lineMessagingClient
@@ -528,6 +535,11 @@ private void handleTextContent(String replyToken, Event event, TextMessageConten
528535
case "quickreply":
529536
this.reply(replyToken, new MessageWithQuickReplySupplier().get());
530537
break;
538+
case "no_notify":
539+
this.reply(replyToken,
540+
singletonList(new TextMessage("This message is send without a push notification")),
541+
true);
542+
break;
531543
default:
532544
log.info("Returns echo message {}: {}", replyToken, text);
533545
this.replyText(
@@ -572,7 +584,7 @@ private static DownloadedContent saveContent(String ext, MessageContentResponse
572584
}
573585

574586
private static DownloadedContent createTempFile(String ext) {
575-
String fileName = LocalDateTime.now().toString() + '-' + UUID.randomUUID().toString() + '.' + ext;
587+
String fileName = LocalDateTime.now().toString() + '-' + UUID.randomUUID() + '.' + ext;
576588
Path tempFile = KitchenSinkApplication.downloadedContentDir.resolve(fileName);
577589
tempFile.toFile().deleteOnExit();
578590
return new DownloadedContent(

0 commit comments

Comments
 (0)