Skip to content

Commit 2e6ce39

Browse files
committed
#21 finish PadplusMessagePayload to MessagePayload
1 parent 1da0fcc commit 2e6ce39

File tree

9 files changed

+114
-57
lines changed

9 files changed

+114
-57
lines changed

pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,11 @@
8181
<artifactId>jackson-databind</artifactId>
8282
<version>2.11.0</version>
8383
</dependency>
84+
<dependency>
85+
<groupId>com.fasterxml.jackson.dataformat</groupId>
86+
<artifactId>jackson-dataformat-xml</artifactId>
87+
<version>2.11.0</version>
88+
</dependency>
8489
<dependency>
8590
<groupId>com.fasterxml.jackson.module</groupId>
8691
<artifactId>jackson-module-scala_${scala-binary-version}</artifactId>

wechaty-puppet-padplus/pom.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@
4646
<artifactId>javase</artifactId>
4747
<version>3.4.0</version>
4848
</dependency>
49+
<dependency>
50+
<groupId>com.fasterxml.jackson.dataformat</groupId>
51+
<artifactId>jackson-dataformat-xml</artifactId>
52+
</dependency>
4953
<dependency>
5054
<groupId>org.fusesource.leveldbjni</groupId>
5155
<artifactId>leveldbjni-all</artifactId>

wechaty-puppet-padplus/src/main/scala/wechaty/padplus/internal/LocalStore.scala

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ import java.io.File
55
import com.google.protobuf.ByteString
66
import org.fusesource.leveldbjni.JniDBFactory._
77
import org.iq80.leveldb.{DB, Options}
8+
import wechaty.puppet.schemas.Puppet.objectMapper
9+
10+
import scala.reflect.ClassTag
811

912

1013
/**
@@ -29,6 +32,12 @@ class LocalStore(storePath:String) {
2932
def get(key:String): Option[ByteString]={
3033
get(ByteString.copyFromUtf8(key))
3134
}
35+
def getObject[T](key:String)(implicit classTag: ClassTag[T]): Option[T]={
36+
get(key).map(str=>{
37+
objectMapper.readValue(str.toStringUtf8,classTag.runtimeClass.asInstanceOf[Class[T]])
38+
})
39+
}
40+
3241
def get(key:ByteString): Option[ByteString]={
3342
val value = db.get(key.toByteArray)
3443
if(value != null) Some(ByteString.copyFrom(value))

wechaty-puppet-padplus/src/main/scala/wechaty/padplus/support/ContactRawSupport.scala

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ trait ContactRawSupport {
110110
padplusContactPayload.sex = ContactGender.Unknown
111111
padplusContactPayload.userName = loginData.userName
112112
padplusContactPayload.verifyFlag = 0
113-
saveRawContactPayload(padplusContactPayload.userName, padplusContactPayload)
113+
savePadplusContactPayload( padplusContactPayload)
114114
val eventLoginPayload = new EventLoginPayload
115115
eventLoginPayload.contactId = padplusContactPayload.userName
116116
emit(PuppetEventName.LOGIN, eventLoginPayload)
@@ -132,15 +132,15 @@ trait ContactRawSupport {
132132
rawContactPayload.nickName = wechatUser.get("nickName").asText()
133133
rawContactPayload.sex = ContactGender.Unknown
134134
rawContactPayload.userName = wechatUser.get("userName").asText()
135-
saveRawContactPayload(rawContactPayload.userName, rawContactPayload)
135+
savePadplusContactPayload(rawContactPayload)
136136
// "{\"uin\":1213374243,\"online\":true,\"wechatUser\":{\"headImgUrl\":\"http://wx.qlogo.cn/mmhead/ver_1/iag5D2R2U9ibgTW2eh7XUbPTHqpEMP2DhSpXSBeQYzEPWgEmLIx5IDibwicGh4fTh4IibkL4hNianoiaTzXmVORnm1O4ZjhxfPosKzkMPSwic8Iicylk/0\",\"nickName\":\"\351\230\277\350\224\241\",\"uin\":1213374243,\"userName\":\"wxid_gbk03zsepqny22\",\"alias\":\"\",\"verifyFlag\":0}}"
137137
selfId = Some(rawContactPayload.userName)
138138
}
139139

140140
contactSelfInfo { padplusContact =>
141141
selfId = Some(padplusContact.userName)
142142
logger.debug("contactSelf:{}", padplusContact)
143-
saveRawContactPayload(padplusContact.userName, padplusContact)
143+
savePadplusContactPayload(padplusContact)
144144
val eventLoginPayload = new EventLoginPayload
145145
eventLoginPayload.contactId = padplusContact.userName
146146
emit(PuppetEventName.LOGIN, eventLoginPayload)
@@ -169,7 +169,7 @@ trait ContactRawSupport {
169169
throw new PadplusError(PadplusErrorType.NO_CACHE, `CONTACT_MODIFY`)
170170
}
171171
*/
172-
saveRoom(roomPayload)
172+
savePadplusRoomPayload(roomPayload)
173173

174174
roomPayload
175175
}
@@ -180,7 +180,7 @@ trait ContactRawSupport {
180180
val result:Try[PadplusContactPayload] = Try {
181181
val contact = objectMapper.readValue(data, classOf[GrpcContactPayload])
182182
val padplusContactPayload = convertFromGrpcContact(contact)
183-
saveRawContactPayload(padplusContactPayload.userName, padplusContactPayload)
183+
savePadplusContactPayload(padplusContactPayload)
184184
padplusContactPayload
185185
}
186186
val callbacks =contactPromises.getIfPresent(userName)
@@ -201,7 +201,7 @@ trait ContactRawSupport {
201201
contactSelfInfo { padplusContact =>
202202
selfId = Some(padplusContact.userName)
203203
logger.debug("contactSelf:{}", padplusContact)
204-
saveRawContactPayload(padplusContact.userName, padplusContact)
204+
savePadplusContactPayload(padplusContact)
205205
val eventLoginPayload = new EventLoginPayload
206206
eventLoginPayload.contactId = padplusContact.userName
207207
emit(PuppetEventName.LOGIN, eventLoginPayload)

wechaty-puppet-padplus/src/main/scala/wechaty/padplus/support/LocalStoreSupport.scala

Lines changed: 19 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ package wechaty.padplus.support
33
import com.google.protobuf.ByteString
44
import wechaty.padplus.PuppetPadplus
55
import wechaty.padplus.internal.LocalStore
6-
import wechaty.padplus.schemas.GrpcSchemas.GrpcMessagePayload
76
import wechaty.padplus.schemas.ModelContact.PadplusContactPayload
7+
import wechaty.padplus.schemas.ModelMessage.PadplusMessagePayload
88
import wechaty.padplus.schemas.ModelRoom.{PadplusRoomMemberMap, PadplusRoomPayload}
99
import wechaty.puppet.schemas.Puppet.objectMapper
1010

@@ -17,8 +17,8 @@ trait LocalStoreSupport {
1717
self:PuppetPadplus=>
1818
protected var store:LocalStore = _
1919
private val uinKey = ByteString.copyFromUtf8("uin")
20-
private val messageKeyFormat="MSG_%s"
21-
private val contactKeyFormat="CON_%s"
20+
private val messageKeyFormat="MS_%s"
21+
private val contactKeyFormat="CO_%s"
2222
private val roomMemberKeyFormat="RM_%s"
2323
protected def saveUin(uin:ByteString): Unit ={
2424
if(!uin.isEmpty){
@@ -31,35 +31,32 @@ trait LocalStoreSupport {
3131
protected def deleteUin():Unit ={
3232
store.delete(uinKey)
3333
}
34-
protected def saveRawContactPayload(contactId:String,payload:PadplusContactPayload): Unit ={
35-
store.put(contactKeyFormat.format(contactId),objectMapper.writeValueAsString(payload))
34+
protected def savePadplusContactPayload(payload:PadplusContactPayload): Unit ={
35+
store.put(contactKeyFormat.format(payload.userName),payload)
3636
}
37-
protected def getRawContactPayload(contactId:String):Option[PadplusContactPayload] ={
38-
store.get(contactKeyFormat.format(contactId)).map(str=>{
39-
objectMapper.readValue(str.toStringUtf8,classOf[PadplusContactPayload])
40-
})
37+
protected def getPadplusContactPayload(contactId:String):Option[PadplusContactPayload] ={
38+
store.getObject[PadplusContactPayload](contactKeyFormat.format(contactId))
4139
}
42-
protected def saveRawMessagePayload(messageId:String,rawMessage:String): Unit ={
43-
store.put(messageKeyFormat.format(messageId),rawMessage)
40+
protected def getPadplusMessagePayload(messageId:String): Option[PadplusMessagePayload]={
41+
store.getObject[PadplusMessagePayload](messageKeyFormat.format(messageId))
4442
}
45-
protected def saveRoom(roomPayload:PadplusRoomPayload): Unit ={
46-
store.put(roomPayload.chatroomId,objectMapper.writeValueAsString(roomPayload))
43+
protected def savePadplusMessagePayload(padplusMessagePayload: PadplusMessagePayload): Unit ={
44+
store.put(messageKeyFormat.format(padplusMessagePayload.msgId),padplusMessagePayload)
45+
}
46+
protected def savePadplusRoomPayload(roomPayload:PadplusRoomPayload): Unit ={
47+
store.put(roomPayload.chatroomId,roomPayload)
4748
}
4849
protected def getPadplusRoomPayload(roomId:String):Option[PadplusRoomPayload]={
49-
store.get(roomId).map(v=>objectMapper.readValue(v.toStringUtf8,classOf[PadplusRoomPayload]))
50+
store.getObject[PadplusRoomPayload](roomId)
5051
}
5152
protected def savePadplusRoomMembers(roomId:String,padplusRoomMemberMap: PadplusRoomMemberMap): Unit ={
52-
store.put(roomMemberKeyFormat.format(roomId),objectMapper.writeValueAsString(padplusRoomMemberMap))
53+
store.put(roomMemberKeyFormat.format(roomId),padplusRoomMemberMap)
5354
}
5455
protected def getPadplusRoomMembers(roomId:String): Option[PadplusRoomMemberMap]={
55-
store.get(roomMemberKeyFormat.format(roomId)).map(v=>{
56-
objectMapper.readValue(v.toStringUtf8,classOf[PadplusRoomMemberMap])
57-
})
56+
store.getObject[PadplusRoomMemberMap](roomMemberKeyFormat.format(roomId))
5857
}
59-
protected def getGrpcMessagePayload(messageId:String):Option[GrpcMessagePayload] ={
60-
store.get(messageKeyFormat.format(messageId)).map(str=>{
61-
objectMapper.readValue(str.toStringUtf8,classOf[GrpcMessagePayload])
62-
})
58+
private implicit def payloadToString[T](value:T):String={
59+
objectMapper.writeValueAsString(value)
6360
}
6461

6562
protected def startLocalStore(): Unit ={

wechaty-puppet-padplus/src/main/scala/wechaty/padplus/support/MessageRawSupport.scala

Lines changed: 53 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
package wechaty.padplus.support
22

3+
import com.fasterxml.jackson.dataformat.xml.XmlMapper
34
import com.typesafe.scalalogging.LazyLogging
45
import wechaty.padplus.grpc.PadPlusServerOuterClass.{ApiType, ResponseType, StreamResponse}
56
import wechaty.padplus.schemas.GrpcSchemas.GrpcMessagePayload
7+
import wechaty.padplus.schemas.ModelMessage.PadplusMessagePayload
68
import wechaty.padplus.schemas.PadplusEnums.PadplusMessageType
79
import wechaty.puppet.ResourceBox
810
import wechaty.puppet.events.EventEmitter
911
import wechaty.puppet.schemas.Event.EventMessagePayload
1012
import wechaty.puppet.schemas.Image.ImageType.Type
1113
import wechaty.puppet.schemas.Message.{MessagePayload, MessageType}
12-
import wechaty.puppet.schemas.Puppet.{PuppetEventName, objectMapper}
14+
import wechaty.puppet.schemas.Puppet.{PuppetEventName, isBlank, objectMapper}
1315
import wechaty.puppet.schemas.{Message, MiniProgram, Puppet, UrlLink}
1416
import wechaty.puppet.support.MessageSupport
1517

@@ -56,38 +58,38 @@ trait MessageRawSupport {
5658

5759

5860
override protected def messageRawPayload(messageId: String): Message.MessagePayload = {
59-
getGrpcMessagePayload(messageId) match {
61+
getPadplusMessagePayload(messageId) match {
6062
case Some(rawPayload) =>
6163
val messagePayload = new MessagePayload
62-
messagePayload.id = rawPayload.MsgId
63-
messagePayload.`type` = messageType(PadplusMessageType(rawPayload.MsgType))
64+
messagePayload.id = rawPayload.msgId
65+
messagePayload.`type` = messageType(rawPayload.msgType)
6466

6567
/**
6668
* 1. Set Room Id
6769
*/
68-
if (isRoomId(rawPayload.FromUserName)) {
69-
messagePayload.roomId = rawPayload.FromUserName
70-
} else if (isRoomId(rawPayload.ToUserName)) {
71-
messagePayload.roomId = rawPayload.ToUserName
70+
if (isRoomId(rawPayload.fromUserName)) {
71+
messagePayload.roomId = rawPayload.fromUserName
72+
} else if (isRoomId(rawPayload.toUserName)) {
73+
messagePayload.roomId = rawPayload.toUserName
7274
}
7375

7476
/**
7577
* 2. Set To Contact Id
7678
*/
77-
if (isContactId(rawPayload.ToUserName)) {
79+
if (isContactId(rawPayload.toUserName)) {
7880

79-
messagePayload.toId = rawPayload.ToUserName
81+
messagePayload.toId = rawPayload.toUserName
8082
}
8183

8284
/**
8385
* 3. Set From Contact Id
8486
*/
85-
if (isContactId(rawPayload.FromUserName)) {
87+
if (isContactId(rawPayload.fromUserName)) {
8688

87-
messagePayload.fromId = rawPayload.FromUserName
89+
messagePayload.fromId = rawPayload.fromUserName
8890

8991
} else {
90-
val parts = rawPayload.Content.split(":\n")
92+
val parts = rawPayload.content.split(":\n")
9193
if (parts.length > 1) {
9294
if (isContactId(parts(0))) {
9395
messagePayload.fromId = parts(0)
@@ -99,13 +101,13 @@ trait MessageRawSupport {
99101
*
100102
* 4. Set Text
101103
*/
102-
if (isRoomId(rawPayload.FromUserName)) {
104+
if (isRoomId(rawPayload.fromUserName)) {
103105

104-
val startIndex = rawPayload.Content.indexOf(":\n")
105-
messagePayload.text = rawPayload.Content.substring(if (startIndex != -1) startIndex + 2 else 0)
106+
val startIndex = rawPayload.content.indexOf(":\n")
107+
messagePayload.text = rawPayload.content.substring(if (startIndex != -1) startIndex + 2 else 0)
106108

107109
} else {
108-
messagePayload.text = rawPayload.Content
110+
messagePayload.text = rawPayload.content
109111
}
110112

111113
if (messagePayload.`type` == MessageType.Recalled) {
@@ -116,13 +118,14 @@ trait MessageRawSupport {
116118
/**
117119
* 6. Set mention list, only for room messages
118120
*/
119-
//TODO
120-
// if (roomId) {
121-
// const messageSource = await messageSourceParser(rawPayload.msgSource)
122-
// if (messageSource !== null && messageSource.atUserList) {
123-
// mentionIdList = messageSource.atUserList || []
124-
// }
125-
// }
121+
if (!isBlank(messagePayload.roomId)) {
122+
val xmlMapper = new XmlMapper();
123+
println(rawPayload.msgSource)
124+
val root = xmlMapper.readTree(rawPayload.msgSource)
125+
if(root.has("atuserlist")){
126+
messagePayload.mentionIdList = root.get("atuserlist").asText().split(",")
127+
}
128+
}
126129

127130
/**
128131
* 6. Set Contact for ShareCard
@@ -147,7 +150,32 @@ trait MessageRawSupport {
147150
val payload = objectMapper.readValue(rawMessageStr, classOf[GrpcMessagePayload])
148151
val eventMessagePayload = new EventMessagePayload
149152
eventMessagePayload.messageId = payload.MsgId
150-
saveRawMessagePayload(payload.MsgId, rawMessageStr)
153+
savePadplusMessagePayload(payload)
151154
emit(PuppetEventName.MESSAGE, eventMessagePayload)
152155
}
156+
private implicit def convertMessageFromGrpcToPadplus (rawMessage: GrpcMessagePayload): PadplusMessagePayload= {
157+
val padplusMessagePayload = new PadplusMessagePayload
158+
padplusMessagePayload.appMsgType= rawMessage.AppMsgType
159+
padplusMessagePayload.content= rawMessage.Content
160+
padplusMessagePayload.createTime= rawMessage.CreateTime
161+
padplusMessagePayload.fileName= if(isBlank(rawMessage.FileName)) rawMessage.fileName else rawMessage.FileName
162+
padplusMessagePayload.fromMemberNickName= rawMessage.FromMemberNickName
163+
padplusMessagePayload.fromMemberUserName= rawMessage.FromMemberUserName
164+
padplusMessagePayload.fromUserName= rawMessage.FromUserName
165+
padplusMessagePayload.imgBuf= rawMessage.ImgBuf
166+
padplusMessagePayload.imgStatus= rawMessage.ImgStatus
167+
padplusMessagePayload.l1MsgType= rawMessage.L1MsgType
168+
padplusMessagePayload.msgId= rawMessage.MsgId
169+
padplusMessagePayload.msgSource= rawMessage.MsgSource
170+
padplusMessagePayload.msgSourceCd= rawMessage.msgSourceCd
171+
padplusMessagePayload.msgType= PadplusMessageType(rawMessage.MsgType)
172+
padplusMessagePayload.newMsgId= rawMessage.NewMsgId
173+
padplusMessagePayload.pushContent= rawMessage.PushContent
174+
padplusMessagePayload.status= rawMessage.Status
175+
padplusMessagePayload.toUserName= rawMessage.ToUserName
176+
padplusMessagePayload.uin= rawMessage.Uin
177+
padplusMessagePayload.url= rawMessage.Url
178+
padplusMessagePayload.wechatUserName= rawMessage.wechatUserName
179+
padplusMessagePayload
180+
}
153181
}

wechaty-puppet/src/main/scala/wechaty/puppet/support/RoomMemberSupport.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ trait RoomMemberSupport {
6363
*/
6464
val rawPayload = this.roomMemberRawPayload(roomId, memberId)
6565
if (rawPayload == null) {
66-
// throw new Error("contact(" + memberId + ") is not in the Room(" + roomId + ")")
66+
throw new Error("contact(" + memberId + ") is not in the Room(" + roomId + ")")
6767
}
6868
this.cacheRoomMemberPayload.put(CACHE_KEY, rawPayload)
6969
rawPayload

wechaty/src/main/scala/wechaty/user/Message.scala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package wechaty.user
22

33
import java.util.Date
44

5+
import com.typesafe.scalalogging.LazyLogging
56
import wechaty.Wechaty.PuppetResolver
67
import wechaty.helper.ImplicitHelper._
78
import wechaty.puppet.schemas.Message.MessageType
@@ -15,7 +16,7 @@ import wechaty.puppet.{ResourceBox, schemas}
1516
* @author <a href="mailto:[email protected]">Jun Tsai</a>
1617
* @since 2020-06-02
1718
*/
18-
class Message(messageId:String)(implicit resolver: PuppetResolver) {
19+
class Message(messageId:String)(implicit resolver: PuppetResolver) extends LazyLogging{
1920
private val MENTION_MEMBER_PATTERN= ("@([^\u2005^\u0020^$]+)")
2021
lazy val payload: schemas.Message.MessagePayload = {
2122
resolver
@@ -159,6 +160,7 @@ class Message(messageId:String)(implicit resolver: PuppetResolver) {
159160
room.get.alias(member).getOrElse(member.name)
160161
}
161162

163+
logger.debug(s"message text:$text mentionsList:$list")
162164
val mentionNameList = list.map(toAliasName)
163165

164166
val textWithoutMention = mentionNameList.foldLeft(text)((prev, cur) => {

wechaty/src/test/scala/wechaty/user/MessageTest.scala

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ class MessageTest extends TestBase{
2727
stubFor(unaryMethod(PuppetGrpc.getMessagePayloadMethod)
2828
.willReturn(response))
2929

30-
val method = unaryMethod(PuppetGrpc.getContactPayloadMethod)
3130
memberIds.toList match{
3231
case head::remain=>
32+
val method = unaryMethod(PuppetGrpc.getContactPayloadMethod)
3333
val response = ContactPayloadResponse.newBuilder()
3434
.setName(head)
3535
.build()
@@ -40,9 +40,9 @@ class MessageTest extends TestBase{
4040
.build()
4141
n.nextWillReturn(response)
4242
}}
43+
stubFor(method)
4344
case Nil =>
4445
}
45-
stubFor(method)
4646

4747
val roomMemberPayloadResponse = RoomMemberPayloadResponse.newBuilder().build()
4848
stubFor(unaryMethod(PuppetGrpc.getRoomMemberPayloadMethod)
@@ -98,6 +98,18 @@ class MessageTest extends TestBase{
9898
Assertions.assertEquals("中文中文测试",message.mentionText())
9999
}
100100
@Test
101+
def testMentionAll: Unit ={
102+
//测试名称特殊字符
103+
val wexinText = "@所有人\u2005hello"
104+
constructMessage(wexinText,"所有人")
105+
106+
val message = new Message("messageId")
107+
108+
val mentionList = message.mentionList
109+
Assertions.assertEquals(1,message.mentionList.size)
110+
Assertions.assertEquals("hello",message.mentionText())
111+
}
112+
@Test
101113
def testForward: Unit ={
102114
val roomId = "roomId"
103115
val response = MessagePayloadResponse.newBuilder()

0 commit comments

Comments
 (0)