Skip to content

Commit 4c59b3d

Browse files
committed
Message api
1 parent d68366c commit 4c59b3d

File tree

11 files changed

+148
-19
lines changed

11 files changed

+148
-19
lines changed

library/src/main/kotlin/one/mixin/bot/HttpClient.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import one.mixin.bot.Constants.API.CN_URL
1111
import one.mixin.bot.Constants.API.URL
1212
import one.mixin.bot.api.AddressService
1313
import one.mixin.bot.api.AssetService
14+
import one.mixin.bot.api.MessageService
1415
import one.mixin.bot.api.SnapshotService
1516
import one.mixin.bot.api.UserService
1617
import one.mixin.bot.api.exception.ClientErrorException
@@ -129,6 +130,10 @@ class HttpClient private constructor(
129130
retrofit.create(SnapshotService::class.java)
130131
}
131132

133+
val messageService: MessageService by lazy {
134+
retrofit.create(MessageService::class.java)
135+
}
136+
132137
class Builder {
133138
private lateinit var clientToken: SessionToken
134139
private var cnServer: Boolean = false
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package one.mixin.bot.api
2+
3+
import com.sun.xml.internal.ws.protocol.soap.MessageCreationException
4+
import one.mixin.bot.api.call.AddressCallService
5+
import one.mixin.bot.api.call.MessageCallService
6+
import one.mixin.bot.api.coroutine.AddressCoroutineService
7+
import one.mixin.bot.api.coroutine.MessageCoroutineService
8+
9+
interface MessageService : MessageCallService, MessageCoroutineService
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package one.mixin.bot.api.call
2+
3+
import one.mixin.bot.api.MixinResponse
4+
import one.mixin.bot.vo.MessageRequest
5+
import retrofit2.Call
6+
import retrofit2.http.Body
7+
import retrofit2.http.POST
8+
9+
interface MessageCallService {
10+
@POST("messages")
11+
fun postMessageCall(@Body messageRequests: List<MessageRequest>): Call<MixinResponse<Unit>>
12+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package one.mixin.bot.api.coroutine
2+
3+
import one.mixin.bot.api.MixinResponse
4+
import one.mixin.bot.vo.MessageRequest
5+
import one.mixin.bot.vo.Pin
6+
import retrofit2.http.Body
7+
import retrofit2.http.POST
8+
import retrofit2.http.Path
9+
10+
interface MessageCoroutineService {
11+
@POST("messages")
12+
suspend fun postMessage(@Body messageRequests: List<MessageRequest>): MixinResponse<Unit>
13+
}

library/src/main/kotlin/one/mixin/bot/util/Base64Util.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ package one.mixin.bot.util
22

33
import java.util.Base64
44

5-
private fun base64Encode(src: ByteArray): String? {
5+
fun base64Encode(src: ByteArray): String? {
66
return Base64.getEncoder().encodeToString(src)
77
}
88

9-
private fun base64Decode(src: String): ByteArray? {
9+
fun base64Decode(src: String): ByteArray? {
1010
return Base64.getDecoder().decode(src)
1111
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package one.mixin.bot.util
2+
3+
import java.util.UUID
4+
5+
class ConversationUtil {
6+
companion object {
7+
fun generateConversationId(senderId: String, recipientId: String): String {
8+
val mix = minOf(senderId, recipientId) + maxOf(senderId, recipientId)
9+
return UUID.nameUUIDFromBytes(mix.toByteArray()).toString()
10+
}
11+
}
12+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package one.mixin.bot.vo
2+
3+
import com.google.gson.annotations.SerializedName
4+
import one.mixin.bot.util.ConversationUtil.Companion.generateConversationId
5+
import one.mixin.bot.util.base64Encode
6+
7+
data class MessageRequest(
8+
@SerializedName("conversation_id")
9+
val conversationId: String,
10+
@SerializedName("recipient_id")
11+
val recipientId: String,
12+
@SerializedName("message_id")
13+
val messageId: String,
14+
@SerializedName("category")
15+
val category: String,
16+
@SerializedName("data")
17+
val data: String,
18+
@SerializedName("representative_id")
19+
val representativeId: String? = null,
20+
@SerializedName("quote_message_id")
21+
val quoteMessageId: String? = null
22+
)
23+
24+
fun generateTextMessageRequest(
25+
senderId: String, recipientId: String, messageId: String,
26+
text: String,
27+
representativeId: String? = null, quoteMessageId: String? = null
28+
) = MessageRequest(
29+
generateConversationId(senderId, recipientId),
30+
recipientId,
31+
messageId,
32+
"PLAIN_TEXT",
33+
requireNotNull(base64Encode(text.toByteArray())),
34+
representativeId,
35+
quoteMessageId
36+
)
37+
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package jvmMain.java;
22

33
final class Config {
4-
final static String pin = "319693";
5-
final static String userId = "d066f2d2-1a91-416b-9241-f3547d99a753";
6-
final static String sessionId = "7a853888-2b28-47e5-9970-8c2117872ca2";
7-
final static String privateKey = "-0w4L6Ju2h0_feLkemSQ3TBCebmzxWrr1We4kva5zBX0vaEH7z9zjY5oyFkqHwOPg_2QFdZ9-8_55UnsYXbdfA";
8-
final static String pinTokenPem = "k5V3eL5iI-5pHnSRPJxtgdFNqaE_Vy4aA6u7IPWHz24";
4+
final static String pin = "538128";
5+
final static String userId = "24888245-d200-4907-aff0-1303d94217d5";
6+
final static String sessionId = "7a511421-65ed-4475-825e-550eaea847f8";
7+
final static String privateKey = "bQ4fXlU-AFwhb5tbr3n3sJTd_5GJJylYQybQOXArf1CwsXUYms9S2stQAiQb_4oStPsZvkokX6drZiiBk4TmGA";
8+
final static String pinTokenPem = "kCIUWq-UX6QNXVOaeS7KpZoZSN61HlC2PLr5-c8FcEs";
99
}

samples/src/main/java/jvmMain/java/Sample.java

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,17 @@
66
import one.mixin.bot.HttpClient;
77
import one.mixin.bot.SessionToken;
88
import one.mixin.bot.api.MixinResponse;
9+
import one.mixin.bot.util.ConversationUtil;
910
import one.mixin.bot.vo.*;
1011

1112
import java.io.IOException;
1213
import java.security.KeyPair;
13-
import java.util.List;
14-
import java.util.Objects;
15-
import java.util.Random;
16-
import java.util.UUID;
14+
import java.util.*;
1715

1816
import static jvmMain.java.Config.*;
1917
import static one.mixin.bot.SessionKt.encryptPin;
20-
import static one.mixin.bot.extension.Base64ExtensionKt.base64Decode;
2118
import static one.mixin.bot.extension.Base64ExtensionKt.base64Encode;
19+
import static one.mixin.bot.util.Base64UtilKt.base64Decode;
2220
import static one.mixin.bot.util.CryptoUtilKt.*;
2321

2422
public class Sample {
@@ -72,7 +70,12 @@ public static void main(String[] args) {
7270
withdrawalToAddress(client, addressId, userAesKey);
7371

7472
// Delete address
75-
deleteAddress(client, addressId,userAesKey);
73+
deleteAddress(client, addressId, userAesKey);
74+
75+
//Use bot's token
76+
client.setUserToken(null);
77+
// Send text message
78+
sendTextMessage(client, "639ec50a-d4f1-4135-8624-3c71189dcdcc", "Test message");
7679
} catch (InterruptedException | IOException e) {
7780
System.out.println(e.getMessage());
7881
}
@@ -205,6 +208,21 @@ private static void getFee(HttpClient client) throws IOException {
205208
}
206209
}
207210

211+
private static void sendTextMessage(HttpClient client, String recipientId, String text) throws IOException {
212+
List<MessageRequest> messageRequests = new ArrayList<>();
213+
messageRequests.add(new MessageRequest(
214+
ConversationUtil.Companion.generateConversationId(userId, recipientId),
215+
recipientId, UUID.randomUUID().toString(), "PLAIN_TEXT",
216+
Base64.getEncoder().encodeToString(text.getBytes()), null, null
217+
));
218+
MixinResponse messageResponse = client.getMessageService().postMessageCall(messageRequests).execute().body();
219+
if (messageResponse.isSuccess()) {
220+
System.out.println("Send success");
221+
} else {
222+
System.out.println("Send fail");
223+
}
224+
}
225+
208226
private static SessionToken getUserToken(User user, KeyPair sessionKey, boolean isRsa) {
209227
if (isRsa) {
210228
return new SessionToken.RSA(user.getUserId(), user.getSessionId(), sessionKey.getPrivate());
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package jvmMain.kotlin
22

33
object Config {
4-
const val pin = "319693"
5-
const val userId = "d066f2d2-1a91-416b-9241-f3547d99a753"
6-
const val sessionId = "7a853888-2b28-47e5-9970-8c2117872ca2"
4+
const val pin = "538128"
5+
const val userId = "24888245-d200-4907-aff0-1303d94217d5"
6+
const val sessionId = "7a511421-65ed-4475-825e-550eaea847f8"
77
const val privateKey =
8-
"-0w4L6Ju2h0_feLkemSQ3TBCebmzxWrr1We4kva5zBX0vaEH7z9zjY5oyFkqHwOPg_2QFdZ9-8_55UnsYXbdfA"
9-
const val pinTokenPem = "k5V3eL5iI-5pHnSRPJxtgdFNqaE_Vy4aA6u7IPWHz24"
8+
"bQ4fXlU-AFwhb5tbr3n3sJTd_5GJJylYQybQOXArf1CwsXUYms9S2stQAiQb_4oStPsZvkokX6drZiiBk4TmGA"
9+
const val pinTokenPem = "kCIUWq-UX6QNXVOaeS7KpZoZSN61HlC2PLr5-c8FcEs"
1010
}

0 commit comments

Comments
 (0)