Skip to content

Commit 86db3f4

Browse files
committed
#21 success to run DingDongPadplusBot !
1 parent 496fb57 commit 86db3f4

File tree

17 files changed

+449
-60
lines changed

17 files changed

+449
-60
lines changed

Makefile

+7
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,14 @@ test:
2727
bot:
2828
mvn \
2929
-DWECHATY_PUPPET_HOSTIE_TOKEN=$$WECHATY_PUPPET_HOSTIE_TOKEN \
30+
-Dmaven.test.skip=true \
3031
-P run verify
32+
.PHONY: padbot
33+
padbot:
34+
mvn \
35+
-DWECHATY_PUPPET_PADPLUS_TOKEN=$$WECHATY_PUPPET_PADPLUS_TOKEN \
36+
-Dmaven.test.skip=true \
37+
-P run-pad verify
3138

3239
.PHONY: version
3340
version:

pom.xml

+5
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,11 @@
3939
<artifactId>wechaty-hostie_${scala-binary-version}</artifactId>
4040
<version>${project.version}</version>
4141
</dependency>
42+
<dependency>
43+
<groupId>io.github.wechaty</groupId>
44+
<artifactId>wechaty-puppet-padplus_${scala-binary-version}</artifactId>
45+
<version>${project.version}</version>
46+
</dependency>
4247
<dependency>
4348
<groupId>commons-io</groupId>
4449
<artifactId>commons-io</artifactId>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package wechaty.padplus
2+
3+
/**
4+
*
5+
* @author <a href="mailto:[email protected]">Jun Tsai</a>
6+
* @since 2020-06-02
7+
*/
8+
object Configuration {
9+
lazy val WECHATY_PUPPET_HOSTIE_TOKEN: Option[String] = {
10+
var value=sys.props.get("WECHATY_PUPPET_PADPLUS_TOKEN")
11+
if(value.isEmpty) value = sys.env.get("WECHATY_PUPPET_HOSTIE_TOKEN")
12+
value
13+
}
14+
lazy val WECHATY_PUPPET_HOSTIE_ENDPOINT: Option[String] = {
15+
var value = sys.props.get("WECHATY_PUPPET_PADPLUS_ENDPOINT")
16+
if(value.isEmpty) value = sys.env.get("WECHATY_PUPPET_HOSTIE_ENDPOINT")
17+
value
18+
}
19+
}

wechaty-puppet-padplus/src/main/scala/wechaty/padplus/PuppetPadplus.scala

+18-50
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@ package wechaty.padplus
22

33
import com.typesafe.scalalogging.LazyLogging
44
import wechaty.padplus.grpc.PadPlusServerOuterClass.ApiType
5-
import wechaty.padplus.support.{ContactRawSupport, GrpcEventSupport, GrpcSupport, LocalStoreSupport}
6-
import wechaty.puppet.schemas.Image.ImageType.Type
5+
import wechaty.padplus.support._
76
import wechaty.puppet.schemas.Puppet.PuppetOptions
87
import wechaty.puppet.schemas._
98
import wechaty.puppet.support.ContactSupport
@@ -17,12 +16,15 @@ import wechaty.puppet.{Puppet, ResourceBox}
1716
class PuppetPadplus(val option:PuppetOptions,val storePath:String="/tmp/padplus")
1817
extends Puppet
1918
with ContactRawSupport
19+
with ContactSelfRawSupport
2020
with ContactSupport
21+
with MessageRawSupport
22+
with PadplusHelper
2123
with GrpcSupport
2224
with GrpcEventSupport
2325
with LocalStoreSupport
2426
with LazyLogging {
25-
private var selfUni:Option[String] = None
27+
protected var uinOpt:Option[String]=None
2628
def start(): Unit ={
2729
startGrpc(option.endPoint.get)
2830
//waiting stream start....
@@ -31,8 +33,8 @@ class PuppetPadplus(val option:PuppetOptions,val storePath:String="/tmp/padplus"
3133
startLocalStore()
3234
getUin match{
3335
case Some(str) =>
34-
selfUni = Some(str)
35-
logger.debug("found uin in local store:{}",selfUni)
36+
uinOpt = Some(str)
37+
logger.debug("found uin in local store:{}",str)
3638
request(ApiType.INIT)
3739
case _ =>
3840
request(ApiType.GET_QRCODE)
@@ -43,7 +45,7 @@ class PuppetPadplus(val option:PuppetOptions,val storePath:String="/tmp/padplus"
4345
stopLocalStore()
4446
}
4547

46-
override def selfIdOpt(): Option[String] = selfUni
48+
override def selfIdOpt(): Option[String] = selfId
4749

4850
override def roomAdd(roomId: String, contactId: String): Unit = ???
4951

@@ -63,7 +65,12 @@ class PuppetPadplus(val option:PuppetOptions,val storePath:String="/tmp/padplus"
6365

6466
override def roomTopic(roomId: String, topic: String): Unit = ???
6567

66-
override protected def roomRawPayload(roomId: String): Room.RoomPayload = ???
68+
override protected def roomRawPayload(roomId: String): Room.RoomPayload = {
69+
val payload=new Room.RoomPayload
70+
payload.id = roomId
71+
//TODO
72+
payload
73+
}
6774

6875
/**
6976
*
@@ -91,38 +98,12 @@ class PuppetPadplus(val option:PuppetOptions,val storePath:String="/tmp/padplus"
9198

9299
override def roomMemberList(roomId: String): Array[String] = ???
93100

94-
override protected def roomMemberRawPayload(roomId: String, contactId: String): Room.RoomMemberPayload = ???
95-
96-
/**
97-
* message
98-
*/
99-
override def messageContact(messageId: String): String = ???
100-
101-
override def messageFile(messageId: String): ResourceBox = ???
102-
103-
override def messageImage(messageId: String, imageType: Type): ResourceBox = ???
104-
105-
override def messageMiniProgram(messageId: String): MiniProgram.MiniProgramPayload = ???
106-
107-
override def messageUrl(messageId: String): UrlLink.UrlLinkPayload = ???
108-
109-
override def messageSendContact(conversationId: String, contactId: String): String = ???
110-
111-
override def messageSendFile(conversationId: String, file: ResourceBox): String = ???
112-
113-
override def messageSendMiniProgram(conversationId: String, miniProgramPayload: MiniProgram.MiniProgramPayload): String = ???
114-
115-
override def messageSendText(conversationId: String, text: String, mentionIdList: Array[String]): String = ???
116-
117-
override def messageSendUrl(conversationId: String, urlLinkPayload: UrlLink.UrlLinkPayload): String = ???
118-
119-
override def messageRecall(messageId: String): Boolean = ???
120-
121-
override def messageSendText(conversationID: String, text: String, mentionIDList: String*): String = ???
101+
override protected def roomMemberRawPayload(roomId: String, contactId: String): Room.RoomMemberPayload = {
102+
//TODO
103+
null
104+
}
122105

123-
override protected def messageRawPayload(messageId: String): Message.MessagePayload = ???
124106

125-
override protected def ding(data: String): Unit = ???
126107

127108
override def roomInvitationAccept(roomInvitationId: String): Unit = ???
128109

@@ -138,17 +119,4 @@ class PuppetPadplus(val option:PuppetOptions,val storePath:String="/tmp/padplus"
138119

139120
override def tagContactRemove(tagId: String, contactId: String): Unit = ???
140121

141-
/**
142-
*
143-
* ContactSelf
144-
*
145-
*/
146-
override def contactSelfName(name: String): Unit = ???
147-
148-
override def contactSelfQRCode(): String = ???
149-
150-
override def contactSelfSignature(signature: String): Unit = ???
151-
152-
override def logout(): Unit = ???
153-
154122
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ class GrpcMessagePayload {
4545
var MsgId:String = _
4646
var MsgSource:String = _
4747
var msgSourceCd:Number = _
48-
var MsgType:Number = _
48+
var MsgType:Int= _
4949
var NewMsgId:Number = _
5050
var PushContent:String = _
5151
var Status:Number = _

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ class GetContactSelfInfoGrpcResponse {
119119
var nickName:String = _
120120
var province:String = _
121121
var queueName:String = _
122-
var sex:Number = _
122+
var sex:Int= _
123123
var signature:String = _
124124
var smallHeadImg:String = _
125125
var snsBGImg:String = _
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package wechaty.padplus.support
2+
3+
import com.typesafe.scalalogging.LazyLogging
4+
import wechaty.padplus.grpc.PadPlusServerOuterClass.ApiType
5+
import wechaty.padplus.schemas.ModelContact.{GetContactSelfInfoGrpcResponse, PadplusContactPayload}
6+
import wechaty.puppet.schemas.Contact.ContactGender
7+
import wechaty.puppet.support.ContactSelfSupport
8+
9+
/**
10+
*
11+
* @author <a href="mailto:[email protected]">Jun Tsai</a>
12+
* @since 2020-06-22
13+
*/
14+
trait ContactSelfRawSupport {
15+
self :GrpcSupport with LazyLogging with ContactSelfSupport =>
16+
/**
17+
*
18+
* ContactSelf
19+
*
20+
*/
21+
override def contactSelfName(name: String): Unit = ???
22+
23+
override def contactSelfQRCode(): String = ???
24+
25+
override def contactSelfSignature(signature: String): Unit = ???
26+
27+
override def logout(): Unit = ???
28+
29+
def contactSelfInfo(): PadplusContactPayload ={
30+
val contactPayload:GetContactSelfInfoGrpcResponse=requestForObject(ApiType.GET_CONTACT_SELF_INFO)
31+
val payload = new PadplusContactPayload
32+
payload.alias = contactPayload.alias;
33+
payload.bigHeadUrl = contactPayload.bigHeadImg;
34+
payload.city = contactPayload.city
35+
payload.contactFlag = 3
36+
payload.contactType = 0
37+
payload.country = contactPayload.country
38+
payload.nickName = contactPayload.nickName
39+
payload.province = contactPayload.province
40+
payload.remark = ""
41+
payload.sex = ContactGender(contactPayload.sex)
42+
payload.signature = contactPayload.signature
43+
payload.smallHeadUrl = contactPayload.smallHeadImg
44+
payload.stranger = ""
45+
payload.tagList = ""
46+
payload.ticket = ""
47+
payload.userName = contactPayload.userName
48+
payload.verifyFlag = 0
49+
50+
payload
51+
}
52+
}

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

+39-5
Original file line numberDiff line numberDiff line change
@@ -7,32 +7,37 @@ import java.util.concurrent.{CountDownLatch, TimeUnit}
77
import com.google.zxing.client.j2se.BufferedImageLuminanceSource
88
import com.google.zxing.common.HybridBinarizer
99
import com.google.zxing.{BinaryBitmap, DecodeHintType, MultiFormatReader}
10-
import com.typesafe.scalalogging.LazyLogging
1110
import io.grpc.stub.StreamObserver
1211
import javax.imageio.ImageIO
1312
import org.apache.commons.io.IOUtils
13+
import wechaty.padplus.PuppetPadplus
1414
import wechaty.padplus.grpc.PadPlusServerOuterClass.{ResponseType, StreamResponse}
15+
import wechaty.padplus.schemas.GrpcSchemas.GrpcMessagePayload
16+
import wechaty.padplus.schemas.ModelContact.PadplusContactPayload
1517
import wechaty.padplus.schemas.ModelUser.ScanData
1618
import wechaty.padplus.schemas.PadplusEnums.QrcodeStatus
17-
import wechaty.puppet.schemas.Event.EventScanPayload
19+
import wechaty.puppet.ResourceBox
20+
import wechaty.puppet.schemas.Contact.ContactGender
21+
import wechaty.puppet.schemas.Event.{EventLoginPayload, EventMessagePayload, EventScanPayload}
1822
import wechaty.puppet.schemas.Puppet.{PuppetEventName, isBlank, objectMapper}
19-
import wechaty.puppet.{Puppet, ResourceBox}
2023

2124
/**
2225
*
2326
* @author <a href="mailto:[email protected]">Jun Tsai</a>
2427
* @since 2020-06-21
2528
*/
2629
trait GrpcEventSupport extends StreamObserver[StreamResponse]{
27-
self: GrpcSupport with LocalStoreSupport with Puppet with LazyLogging=>
30+
self: PuppetPadplus =>
2831

32+
protected var selfId:Option[String] = None
2933
private val countDownLatch = new CountDownLatch(1)
3034

3135

3236
protected def awaitStreamStart()=countDownLatch.await(10,TimeUnit.SECONDS)
3337
override def onNext(response: StreamResponse): Unit = {
3438
logger.debug("stream response:{}",response)
3539
countDownLatch.countDown()
40+
saveUin(response.getUinBytes)
3641

3742
val traceId = response.getTraceId
3843
if(!isBlank(traceId)){
@@ -66,8 +71,37 @@ trait GrpcEventSupport extends StreamObserver[StreamResponse]{
6671
payload.qrcode = result.getText
6772
logger.debug("Scan QR Code to login: %s\nhttps://api.qrserver.com/v1/create-qr-code/?data=%s\n".format(payload.status, payload.qrcode))
6873
emit(PuppetEventName.SCAN,payload)
74+
case ResponseType.MESSAGE_RECEIVE =>
75+
val rawMessageStr = response.getData()
76+
val payload = objectMapper.readValue(rawMessageStr,classOf[GrpcMessagePayload])
77+
val eventMessagePayload: EventMessagePayload = new EventMessagePayload
78+
eventMessagePayload.messageId = payload.MsgId
79+
saveRawMessagePayload(payload.MsgId,rawMessageStr)
80+
this.emit(PuppetEventName.MESSAGE, eventMessagePayload)
81+
case ResponseType.AUTO_LOGIN =>
82+
logger.debug("response data:{}",response.getData)
83+
val autoLoginData = objectMapper.readTree(response.getData)
84+
val wechatUser = autoLoginData.get("wechatUser")
85+
86+
val rawContactPayload = new PadplusContactPayload
87+
if(wechatUser.has("alias"))
88+
rawContactPayload.alias=wechatUser.get("alias").asText("")
89+
rawContactPayload.bigHeadUrl = wechatUser.get("headImgUrl").asText()
90+
rawContactPayload.nickName = wechatUser.get("nickName").asText()
91+
rawContactPayload.sex = ContactGender.Unknown
92+
rawContactPayload.userName = wechatUser.get("userName").asText()
93+
saveRawContactPayload(rawContactPayload.userName,rawContactPayload)
94+
// "{\"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}}"
95+
selfId = Some(rawContactPayload.userName)
96+
97+
// val padplusContact = contactSelfInfo()
98+
// selfId = Some(padplusContact.userName)
99+
// logger.debug("contactSelf:{}",padplusContact)
100+
// saveRawContactPayload(padplusContact.userName,padplusContact)
101+
val eventLoginPayload = new EventLoginPayload
102+
eventLoginPayload.contactId = rawContactPayload.userName
103+
emit(PuppetEventName.LOGIN,eventLoginPayload)
69104
case _ =>
70-
saveUin(response.getUinBytes)
71105
// val user = objectMapper.readTree(response.getData())
72106
// val userName = user.get("userName").asText()
73107

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

+10-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import wechaty.padplus.grpc.PadPlusServerGrpc
1111
import wechaty.padplus.grpc.PadPlusServerOuterClass.{ApiType, InitConfig, RequestObject, ResponseObject, StreamResponse}
1212
import wechaty.puppet.schemas.Puppet
1313

14+
import scala.reflect.ClassTag
15+
1416
/**
1517
*
1618
* @author <a href="mailto:[email protected]">Jun Tsai</a>
@@ -114,16 +116,22 @@ trait GrpcSupport {
114116
private def stopStream(): Unit = {
115117
//do nothing
116118
}
119+
protected def requestForObject[T](apiType:ApiType,data:Option[Any]=None)(implicit classTag: ClassTag[T]):T={
120+
val response = request(apiType,data)
121+
Puppet.objectMapper.readValue(response.getResult,classTag.runtimeClass).asInstanceOf[T]
122+
}
117123
protected def request(apiType: ApiType,data:Option[Any]=None): ResponseObject ={
118124
val request = RequestObject.newBuilder()
119125
request.setToken(option.token.get)
120-
selfIdOpt() match{
126+
uinOpt match{
121127
case Some(id) =>
122128
request.setUin(id)
123129
case _ =>
124130
}
125131
request.setApiType(apiType)
126132
data match{
133+
case Some(str:String) =>
134+
request.setParams(str)
127135
case Some(d) =>
128136
request.setParams(Puppet.objectMapper.writeValueAsString(d))
129137
case _ =>
@@ -132,6 +140,7 @@ trait GrpcSupport {
132140
request.setRequestId(requestId)
133141
val traceId= UUID.randomUUID().toString
134142
request.setTraceId(traceId)
143+
logger.debug("request:{}",request.build())
135144
val response = grpcClient.request(request.build())
136145
logger.debug("request->response:{}",response)
137146
response

0 commit comments

Comments
 (0)