Skip to content

Commit 1da0fcc

Browse files
committed
#21 enhance room and room member feature
1 parent a8f4a3e commit 1da0fcc

File tree

5 files changed

+121
-7
lines changed

5 files changed

+121
-7
lines changed

wechaty-puppet-padplus/src/main/scala/wechaty/padplus/schemas/ModelRoom.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ class GrpcSetAnnouncementData {
126126
}
127127

128128
class PadplusRoomMemberMap {
129-
// [contactId: string]: PadplusRoomMemberPayload
129+
var members:Map[String,PadplusRoomMemberPayload] = _
130130
}
131131

132132
class GrpcAccpetRoomInvitation {

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

+1-4
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,6 @@ trait ContactRawSupport {
6969
case Success(payload) => payload
7070
case Failure(e) => throw e
7171
}
72-
contactPromises.get(contactId,key=>{
73-
List(contactPayloadPromise)
74-
})
7572
val oldValue=contactPromises.getIfPresent(contactId)
7673
if(oldValue != null){
7774
contactPromises.put(contactId, oldValue :+ contactPayloadPromise)
@@ -156,7 +153,7 @@ trait ContactRawSupport {
156153
val data = response.getData
157154
if(!isBlank(data)){
158155
val root = objectMapper.readTree(data)
159-
val userName = root.get("userName").asText()
156+
val userName = root.get("UserName").asText()
160157
if(isRoomId(userName)){
161158
val roomTry=Try {
162159
val grpcRoomPayload = objectMapper.readValue(data, classOf[GrpcRoomPayload])

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

+13-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import wechaty.padplus.PuppetPadplus
55
import wechaty.padplus.internal.LocalStore
66
import wechaty.padplus.schemas.GrpcSchemas.GrpcMessagePayload
77
import wechaty.padplus.schemas.ModelContact.PadplusContactPayload
8-
import wechaty.padplus.schemas.ModelRoom.PadplusRoomPayload
8+
import wechaty.padplus.schemas.ModelRoom.{PadplusRoomMemberMap, PadplusRoomPayload}
99
import wechaty.puppet.schemas.Puppet.objectMapper
1010

1111
/**
@@ -19,6 +19,7 @@ trait LocalStoreSupport {
1919
private val uinKey = ByteString.copyFromUtf8("uin")
2020
private val messageKeyFormat="MSG_%s"
2121
private val contactKeyFormat="CON_%s"
22+
private val roomMemberKeyFormat="RM_%s"
2223
protected def saveUin(uin:ByteString): Unit ={
2324
if(!uin.isEmpty){
2425
store.put(uinKey,uin)
@@ -44,6 +45,17 @@ trait LocalStoreSupport {
4445
protected def saveRoom(roomPayload:PadplusRoomPayload): Unit ={
4546
store.put(roomPayload.chatroomId,objectMapper.writeValueAsString(roomPayload))
4647
}
48+
protected def getPadplusRoomPayload(roomId:String):Option[PadplusRoomPayload]={
49+
store.get(roomId).map(v=>objectMapper.readValue(v.toStringUtf8,classOf[PadplusRoomPayload]))
50+
}
51+
protected def savePadplusRoomMembers(roomId:String,padplusRoomMemberMap: PadplusRoomMemberMap): Unit ={
52+
store.put(roomMemberKeyFormat.format(roomId),objectMapper.writeValueAsString(padplusRoomMemberMap))
53+
}
54+
protected def getPadplusRoomMembers(roomId:String): Option[PadplusRoomMemberMap]={
55+
store.get(roomMemberKeyFormat.format(roomId)).map(v=>{
56+
objectMapper.readValue(v.toStringUtf8,classOf[PadplusRoomMemberMap])
57+
})
58+
}
4759
protected def getGrpcMessagePayload(messageId:String):Option[GrpcMessagePayload] ={
4860
store.get(messageKeyFormat.format(messageId)).map(str=>{
4961
objectMapper.readValue(str.toStringUtf8,classOf[GrpcMessagePayload])
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
package wechaty.padplus.support
2+
3+
import java.util.concurrent.TimeUnit
4+
5+
import com.github.benmanes.caffeine.cache.{Cache, Caffeine}
6+
import com.typesafe.scalalogging.LazyLogging
7+
import wechaty.padplus.grpc.PadPlusServerOuterClass.{ApiType, ResponseType, StreamResponse}
8+
import wechaty.padplus.schemas.ModelRoom.{GrpcRoomMemberList, GrpcRoomMemberPayload, PadplusRoomMemberMap, PadplusRoomMemberPayload}
9+
import wechaty.puppet.schemas.Puppet.objectMapper
10+
import wechaty.puppet.schemas.Room
11+
import wechaty.puppet.schemas.Room.RoomMemberPayload
12+
import wechaty.puppet.support.RoomMemberSupport
13+
14+
import scala.concurrent.duration._
15+
import scala.concurrent.{Await, Future, Promise}
16+
import scala.util.{Failure, Success}
17+
18+
/**
19+
*
20+
* @author <a href="mailto:[email protected]">Jun Tsai</a>
21+
* @since 2020-06-24
22+
*/
23+
trait RoomMemberRawSupport {
24+
self:RoomMemberSupport with GrpcSupport with LocalStoreSupport with LazyLogging=>
25+
protected lazy val roomMemberPayloadPromises: Cache[String, List[Promise[PadplusRoomMemberMap]]] = {
26+
Caffeine.newBuilder().maximumSize(1000).expireAfterWrite(1, TimeUnit.MINUTES).build()
27+
.asInstanceOf[Cache[String, List[Promise[PadplusRoomMemberMap]]]]
28+
}
29+
30+
/**
31+
*
32+
* RoomMember
33+
*
34+
*/
35+
override def roomAnnounce(roomId: String): String = ???
36+
37+
override def roomAnnounce(roomId: String, text: String): Unit = ???
38+
39+
override def roomMemberList(roomId: String): Array[String] = ???
40+
41+
override protected def roomMemberRawPayload(roomId: String, contactId: String): Room.RoomMemberPayload = {
42+
getPadplusRoomMembers(roomId) match{
43+
case Some(padplusRoomMembers) =>
44+
padplusRoomMembers.members.get(contactId).map(convertToPuppetRoomMember).orNull
45+
case _ =>
46+
Future {
47+
val json = objectMapper.createObjectNode()
48+
json.put("OpType", "UPDATE")
49+
json.put("type", "GET_MEMBER")
50+
json.put("roomId", roomId)
51+
request(ApiType.ROOM_OPERATION, Some(json.toString))
52+
}
53+
val roomMemberPayloadPromise = Promise[PadplusRoomMemberMap]()
54+
roomMemberPayloadPromise.future.onComplete {
55+
case Success(payload) => payload
56+
case Failure(e) => throw e
57+
}
58+
val oldValue=roomMemberPayloadPromises.getIfPresent(roomId)
59+
if(oldValue != null){
60+
roomMemberPayloadPromises.put(roomId, oldValue :+ roomMemberPayloadPromise)
61+
}else{
62+
roomMemberPayloadPromises.put(roomId, List(roomMemberPayloadPromise))
63+
}
64+
val map = Await.result(roomMemberPayloadPromise.future, 10 seconds)
65+
map.members.get(contactId).map(convertToPuppetRoomMember).orNull
66+
}
67+
68+
}
69+
private def convertToPuppetRoomMember(input: PadplusRoomMemberPayload): RoomMemberPayload = {
70+
val result = new RoomMemberPayload
71+
result.avatar = input.smallHeadUrl
72+
result.id = input.contactId
73+
result.inviterId = input.inviterId // 'wxid_7708837087612',
74+
result.name = input.nickName
75+
result.roomAlias = input.displayName // '李佳芮-群里设置的备注', `chatroom_nick_name`
76+
result
77+
}
78+
private def convertToPadplusRoomMemberPayload(grpcRoomMemberPayload: GrpcRoomMemberPayload) = {
79+
val padplusRoomMemberPayload=new PadplusRoomMemberPayload
80+
padplusRoomMemberPayload.bigHeadUrl= grpcRoomMemberPayload.HeadImgUrl
81+
padplusRoomMemberPayload.contactId= grpcRoomMemberPayload.UserName
82+
padplusRoomMemberPayload.displayName= grpcRoomMemberPayload.DisplayName
83+
padplusRoomMemberPayload.inviterId= ""
84+
padplusRoomMemberPayload.nickName= grpcRoomMemberPayload.NickName
85+
padplusRoomMemberPayload.smallHeadUrl= grpcRoomMemberPayload.HeadImgUrl
86+
87+
padplusRoomMemberPayload
88+
}
89+
protected def roomMemberPartialFunction(response:StreamResponse):PartialFunction[ResponseType,Unit]={
90+
case ResponseType.ROOM_MEMBER_LIST =>
91+
val roomMemberList= objectMapper.readValue(response.getData,classOf[GrpcRoomMemberList])
92+
val roomId = roomMemberList.roomId
93+
val membersStr = roomMemberList.membersJson
94+
val membersList =objectMapper.readValue(membersStr,classOf[Array[GrpcRoomMemberPayload]])
95+
val data=membersList.map(x=> x.UserName-> convertToPadplusRoomMemberPayload(x)).toMap
96+
val padplusRoomMemberMap = new PadplusRoomMemberMap
97+
padplusRoomMemberMap.members = data
98+
savePadplusRoomMembers(roomId,padplusRoomMemberMap)
99+
100+
val promises = roomMemberPayloadPromises.getIfPresent(roomId)
101+
if(promises != null){
102+
promises.map(_.success(padplusRoomMemberMap))
103+
}
104+
}
105+
}

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

+1-1
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

0 commit comments

Comments
 (0)