Skip to content

Commit 792cede

Browse files
committed
Implement chat message retrieval api
1 parent c020f04 commit 792cede

8 files changed

Lines changed: 231 additions & 0 deletions

File tree

library/src/main/java/me/proxer/library/api/chat/ChatApi.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,11 @@ public ChatApi(final Retrofit retrofit) {
2424
public PublicChatRoomsEndpoint publicRooms() {
2525
return new PublicChatRoomsEndpoint(internalApi);
2626
}
27+
28+
/**
29+
* Returns the respective endpoint.
30+
*/
31+
public ChatMessagesEndpoint messages(final String roomId) {
32+
return new ChatMessagesEndpoint(internalApi, roomId);
33+
}
2734
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package me.proxer.library.api.chat;
2+
3+
import lombok.Setter;
4+
import lombok.experimental.Accessors;
5+
import me.proxer.library.api.Endpoint;
6+
import me.proxer.library.api.ProxerCall;
7+
import me.proxer.library.entity.chat.ChatMessage;
8+
9+
import javax.annotation.Nullable;
10+
import java.util.List;
11+
12+
/**
13+
* Endpoint for retrieving messages in a chat room.
14+
* <p>
15+
* This behaves differently based on the parameter messageId:
16+
* 1) messageId = 0: Returns the last messages from the chat room.
17+
* 2) messageId != 0: Returns all messages older than that passed from the chat room.
18+
*
19+
* @author Ruben Gees
20+
*/
21+
@Accessors(fluent = true)
22+
public final class ChatMessagesEndpoint implements Endpoint<List<ChatMessage>> {
23+
24+
private final InternalApi internalApi;
25+
26+
/**
27+
* Sets the id of the room to load.
28+
*/
29+
private final String roomId;
30+
31+
/**
32+
* Sets the message id to load from.
33+
*/
34+
@Nullable
35+
@Setter
36+
private String messageId;
37+
38+
ChatMessagesEndpoint(final InternalApi internalApi, final String roomId) {
39+
this.internalApi = internalApi;
40+
this.roomId = roomId;
41+
}
42+
43+
/**
44+
* {@inheritDoc}
45+
*/
46+
@Override
47+
public ProxerCall<List<ChatMessage>> build() {
48+
return internalApi.messages(roomId, messageId);
49+
}
50+
}

library/src/main/java/me/proxer/library/api/chat/InternalApi.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package me.proxer.library.api.chat;
22

33
import me.proxer.library.api.ProxerCall;
4+
import me.proxer.library.entity.chat.ChatMessage;
45
import me.proxer.library.entity.chat.ChatRoom;
56
import retrofit2.http.GET;
7+
import retrofit2.http.Query;
68

79
import javax.annotation.ParametersAreNullableByDefault;
810
import java.util.List;
@@ -15,4 +17,8 @@ public interface InternalApi {
1517

1618
@GET("chat/publicrooms")
1719
ProxerCall<List<ChatRoom>> publicRooms();
20+
21+
@GET("chat/messages")
22+
ProxerCall<List<ChatMessage>> messages(@Query("room_id") String roomId,
23+
@Query("message_id") String messageId);
1824
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package me.proxer.library.entity.chat;
2+
3+
import com.squareup.moshi.Json;
4+
import lombok.EqualsAndHashCode;
5+
import lombok.Getter;
6+
import lombok.Value;
7+
import me.proxer.library.entity.ProxerDateItem;
8+
import me.proxer.library.entity.ProxerIdItem;
9+
import me.proxer.library.entity.ProxerImageItem;
10+
import me.proxer.library.enums.ChatMessageAction;
11+
import me.proxer.library.enums.MessageAction;
12+
13+
import javax.annotation.Nullable;
14+
import java.util.Date;
15+
16+
/**
17+
* Entity representing a single message.
18+
*
19+
* @author Ruben Gees
20+
*/
21+
@Value
22+
@EqualsAndHashCode(onParam = @__({@Nullable}))
23+
public class ChatMessage implements ProxerIdItem, ProxerDateItem, ProxerImageItem {
24+
25+
/**
26+
* {@inheritDoc}
27+
*/
28+
@Getter(onMethod = @__({@Override}))
29+
@Json(name = "id")
30+
private String id;
31+
32+
/**
33+
* Returns the id of the associated user.
34+
*/
35+
@Json(name = "fromid")
36+
private String userId;
37+
38+
/**
39+
* Returns the username of the author.
40+
*/
41+
@Json(name = "username")
42+
private String username;
43+
44+
/**
45+
* Returns the id of the author's image.
46+
*/
47+
@Getter(onMethod = @__({@Override}))
48+
@Json(name = "avatar")
49+
private String image;
50+
51+
/**
52+
* Returns the actual content of the message.
53+
*/
54+
@Json(name = "message")
55+
private String message;
56+
57+
/**
58+
* Returns the action of this message. If the action is not {@link MessageAction#NONE}, {@link #getMessage()}
59+
* returns associated information, like the name of the user, performing the action.
60+
*/
61+
@Json(name = "action")
62+
private ChatMessageAction action;
63+
64+
/**
65+
* {@inheritDoc}
66+
*/
67+
@Getter(onMethod = @__({@Override}))
68+
@Json(name = "timestamp")
69+
private Date date;
70+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package me.proxer.library.enums;
2+
3+
import com.serjltt.moshi.adapters.FallbackEnum;
4+
import com.squareup.moshi.Json;
5+
import me.proxer.library.entity.chat.ChatMessage;
6+
7+
/**
8+
* Enum holding the possible actions of a {@link ChatMessage}.
9+
*
10+
* @author Ruben Gees
11+
*/
12+
@FallbackEnum(name = "NONE")
13+
public enum ChatMessageAction {
14+
@Json(name = "") NONE,
15+
@Json(name = "removeMessage") REMOVE_MESSAGE,
16+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package me.proxer.library.api.chat;
2+
3+
import me.proxer.library.ProxerTest;
4+
import me.proxer.library.api.ProxerException;
5+
import me.proxer.library.entity.chat.ChatMessage;
6+
import me.proxer.library.enums.ChatMessageAction;
7+
import okhttp3.mockwebserver.MockResponse;
8+
import org.junit.Test;
9+
10+
import java.io.IOException;
11+
import java.util.Date;
12+
import java.util.List;
13+
14+
import static org.assertj.core.api.Assertions.assertThat;
15+
16+
/**
17+
* @author Ruben Gees
18+
*/
19+
public class ChatMessagesEndpointTest extends ProxerTest {
20+
21+
@Test
22+
public void testDefault() throws IOException, ProxerException {
23+
server.enqueue(new MockResponse().setBody(fromResource("chat_messages.json")));
24+
25+
final List<ChatMessage> result = api.chat()
26+
.messages("123")
27+
.build()
28+
.execute();
29+
30+
assertThat(result).first().isEqualTo(buildFirstMessage());
31+
assertThat(result).last().isEqualTo(buildLastMessage());
32+
}
33+
34+
@Test
35+
public void testPath() throws ProxerException, IOException, InterruptedException {
36+
server.enqueue(new MockResponse().setBody(fromResource("chat_messages.json")));
37+
38+
api.chat().messages("12")
39+
.messageId("21")
40+
.build()
41+
.execute();
42+
43+
assertThat(server.takeRequest().getPath()).isEqualTo("/api/v1/chat/messages?room_id=12&message_id=21");
44+
}
45+
46+
private ChatMessage buildFirstMessage() {
47+
return new ChatMessage("777191", "62", "genesis", "62_RvGnYl.png",
48+
"testttt", ChatMessageAction.NONE, new Date(1523608207L * 1000));
49+
}
50+
51+
private ChatMessage buildLastMessage() {
52+
return new ChatMessage("777189", "62", "genesis", "62_RvGnYl.png",
53+
"777186", ChatMessageAction.REMOVE_MESSAGE, new Date(1523608185L * 1000));
54+
}
55+
}

library/src/test/java/me/proxer/library/api/chat/PublicChatRoomsEndpointTest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111

1212
import static org.assertj.core.api.Assertions.assertThat;
1313

14+
/**
15+
* @author Ruben Gees
16+
*/
1417
public class PublicChatRoomsEndpointTest extends ProxerTest {
1518

1619
@Test
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
{
2+
"error": 0,
3+
"message": "Abfrage erfolgreich.",
4+
"data": [
5+
{
6+
"id": "777191",
7+
"fromid": "62",
8+
"message": "testttt",
9+
"timestamp": "1523608207",
10+
"action": "",
11+
"username": "genesis",
12+
"avatar": "62_RvGnYl.png"
13+
},
14+
{
15+
"id": "777189",
16+
"fromid": "62",
17+
"message": "777186",
18+
"timestamp": "1523608185",
19+
"action": "removeMessage",
20+
"username": "genesis",
21+
"avatar": "62_RvGnYl.png"
22+
}
23+
]
24+
}

0 commit comments

Comments
 (0)