Skip to content

Commit 0c17a9a

Browse files
committed
🔧 FIXES #4 调整变量和配置变为webchaty风格
1 parent 64bfa61 commit 0c17a9a

File tree

9 files changed

+113
-79
lines changed

9 files changed

+113
-79
lines changed

wechaty-hostie/src/main/scala/wechaty/hostie/Configuration.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@ package wechaty.hostie
66
* @since 2020-06-02
77
*/
88
object Configuration {
9-
lazy val WechatyPuppetHostieToken = sys.props.get("WECHATY_PUPPET_HOSTIE_TOKEN")
10-
lazy val WechatyPuppetHostieEndpoint= sys.props.get("WECHATY_PUPPET_HOSTIE_ENDPOINT")
9+
lazy val WECHATY_PUPPET_HOSTIE_TOKEN: Option[String] = sys.props.get("WECHATY_PUPPET_HOSTIE_TOKEN")
10+
lazy val WECHATY_PUPPET_HOSTIE_ENDPOINT: Option[String] = sys.props.get("WECHATY_PUPPET_HOSTIE_ENDPOINT")
1111
}

wechaty-hostie/src/main/scala/wechaty/hostie/PuppetHostie.scala

+10-9
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ package wechaty.hostie
22

33
import wechaty.hostie.support.{ContactRawSupport, GrpcEventSupport, GrpcSupport, MessageRawSupport}
44
import wechaty.puppet.schemas.Puppet
5-
import wechaty.puppet.{LoggerSupport, Puppet, PuppetOption}
5+
import wechaty.puppet.schemas.Puppet.PuppetOptions
6+
import wechaty.puppet.{LoggerSupport, Puppet}
67

78
import scala.io.Source
89

@@ -11,7 +12,7 @@ import scala.io.Source
1112
* @author <a href="mailto:[email protected]">Jun Tsai</a>
1213
* @since 2020-06-02
1314
*/
14-
class PuppetHostie(option:PuppetOption) extends Puppet
15+
class PuppetHostie(option:PuppetOptions) extends Puppet
1516
with GrpcSupport
1617
with LoggerSupport
1718
with ContactRawSupport
@@ -21,19 +22,19 @@ class PuppetHostie(option:PuppetOption) extends Puppet
2122
init()
2223
private def init(): Unit ={
2324
if(option.token.isEmpty){
24-
option.token = Configuration.WechatyPuppetHostieToken
25+
option.token = Configuration.WECHATY_PUPPET_HOSTIE_TOKEN
2526
}
26-
if(option.endpoint.isEmpty){
27-
option.endpoint = Configuration.WechatyPuppetHostieEndpoint
27+
if(option.endPoint.isEmpty){
28+
option.endPoint = Configuration.WECHATY_PUPPET_HOSTIE_ENDPOINT
2829
}
29-
if(option.endpoint.isEmpty){
30-
option.endpoint = discoverHostieEndPoint()
30+
if(option.endPoint.isEmpty){
31+
option.endPoint= discoverHostieEndPoint()
3132
}
32-
if(option.endpoint.isEmpty)
33+
if(option.endPoint.isEmpty)
3334
throw new IllegalStateException("hostie endpoint not found")
3435
}
3536
def start(): Unit ={
36-
startGrpc(option.endpoint.get)
37+
startGrpc(option.endPoint.get)
3738
}
3839
def stop(): Unit = {
3940
stopGrpc()

wechaty-hostie/src/main/scala/wechaty/hostie/support/GrpcEventSupport.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ trait GrpcEventSupport extends StreamObserver[EventResponse] {
2121
if (v.getType != EventType.EVENT_TYPE_HEARTBEAT) {
2222
val hearbeat = new EventHeartbeatPayload
2323
hearbeat.data = "onGrpcStreamEvent(%s)".format(v.getType)
24-
EventEmitter.emit(EventName.PuppetEventNameHeartbeat, hearbeat)
24+
EventEmitter.emit(PuppetEventName.HEARTBEAT, hearbeat)
2525
}
2626
v.getType match {
2727
case EventType.EVENT_TYPE_UNSPECIFIED =>

wechaty-puppet/src/main/scala/wechaty/puppet/PuppetOption.scala

-12
This file was deleted.

wechaty-puppet/src/main/scala/wechaty/puppet/events/EventEmitter.scala

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package wechaty.puppet.events
22

3-
import wechaty.puppet.schemas.Events.{EventName, EventPayload}
3+
import wechaty.puppet.schemas.Events.{PuppetEventName, EventPayload}
44

55
/**
66
* global event
@@ -10,9 +10,9 @@ import wechaty.puppet.schemas.Events.{EventName, EventPayload}
1010
*/
1111
object EventEmitter {
1212
type Listener[T<:EventPayload] = T => Unit
13-
private var listeners: Map[EventName.Type, List[Listener[_<:EventPayload]]] = Map()
13+
private var listeners: Map[PuppetEventName.Type, List[Listener[_<:EventPayload]]] = Map()
1414

15-
def emit[T<:EventPayload](event: EventName.Type, data: T):Unit={
15+
def emit[T<:EventPayload](event: PuppetEventName.Type, data: T):Unit={
1616
val eventListenerOpts = listeners.get(event)
1717
eventListenerOpts match {
1818
case Some(eventListeners) =>
@@ -22,7 +22,7 @@ object EventEmitter {
2222
}
2323
}
2424

25-
def addListener[T<:EventPayload](event: EventName.Type, listener: Listener[T]): Unit = {
25+
def addListener[T<:EventPayload](event: PuppetEventName.Type, listener: Listener[T]): Unit = {
2626
listeners.get(event) match {
2727
case Some(eventListeners) => listeners += event -> (eventListeners :+ listener)
2828
case _ => listeners += event -> List(listener)

wechaty-puppet/src/main/scala/wechaty/puppet/schemas/Events.scala

+18-18
Original file line numberDiff line numberDiff line change
@@ -9,25 +9,25 @@ import com.fasterxml.jackson.annotation.{JsonGetter, JsonSetter}
99
*/
1010
object Events {
1111

12-
object EventName extends Enumeration {
12+
object PuppetEventName extends Enumeration {
1313
type Type = Value
14-
val PuppetEventNameUnknown: Value = Value("unkown")
15-
val PuppetEventNameFriendship: Value = Value("friendship")
16-
val PuppetEventNameLogin: Value = Value("login")
17-
val PuppetEventNameLogout: Value = Value("logout")
18-
val PuppetEventNameMessage: Value = Value("message")
19-
val PuppetEventNameRoomInvite: Value = Value("room-invite")
20-
val PuppetEventNameRoomJoin: Value = Value("room-join")
21-
val PuppetEventNameRoomLeave: Value = Value("room-leave")
22-
val PuppetEventNameRoomTopic: Value = Value("room-topic")
23-
val PuppetEventNameScan: Value = Value("scan")
24-
val PuppetEventNameDong: Value = Value("dong")
25-
val PuppetEventNameError: Value = Value("error")
26-
val PuppetEventNameHeartbeat: Value = Value("heartbeat")
27-
val PuppetEventNameReady: Value = Value("ready")
28-
val PuppetEventNameReset: Value = Value("reset")
29-
val PuppetEventNameStop: Value = Value("stop")
30-
val PuppetEventNameStart: Value = Value("start")
14+
val UNKNOWN: Value = Value(0)
15+
val FRIENDSHIP: Value = Value(1)
16+
val LOGIN: Value = Value(2)
17+
val LOGOUT: Value = Value(3)
18+
val MESSAGE: Value = Value(4)
19+
val INVITE: Value = Value(5)
20+
val ROOM_JOIN: Value = Value(6)
21+
val ROOM_LEAVE: Value = Value(7)
22+
val ROOM_TOPIC: Value = Value(8)
23+
val SCAN: Value = Value(9)
24+
val DONG: Value = Value(10)
25+
val ERROR: Value = Value(11)
26+
val HEARTBEAT: Value = Value(12)
27+
val READY: Value = Value(13)
28+
val RESET: Value = Value(14)
29+
val STOP: Value = Value(15)
30+
val START: Value = Value(16)
3131
}
3232

3333
object ScanStatus extends Enumeration {

wechaty-puppet/src/main/scala/wechaty/puppet/schemas/Puppet.scala

+17-17
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package wechaty.puppet.schemas
33
import com.fasterxml.jackson.databind.ObjectMapper
44
import com.fasterxml.jackson.module.scala.DefaultScalaModule
55
import io.github.wechaty.grpc.puppet.Event.EventType
6-
import wechaty.puppet.schemas.Events.EventName
6+
import wechaty.puppet.schemas.Events.PuppetEventName
77

88
/**
99
*
@@ -22,22 +22,22 @@ object Puppet {
2222
om.registerModule(DefaultScalaModule)
2323
}
2424

25-
val pbEventType2PuppetEventName = Map[EventType,EventName.Type](
26-
EventType.EVENT_TYPE_DONG-> EventName.PuppetEventNameDong,
27-
EventType.EVENT_TYPE_ERROR-> EventName.PuppetEventNameError,
28-
EventType.EVENT_TYPE_HEARTBEAT-> EventName.PuppetEventNameHeartbeat,
29-
EventType.EVENT_TYPE_FRIENDSHIP-> EventName.PuppetEventNameFriendship,
30-
EventType.EVENT_TYPE_LOGIN-> EventName.PuppetEventNameLogin,
31-
EventType.EVENT_TYPE_LOGOUT-> EventName.PuppetEventNameLogout,
32-
EventType.EVENT_TYPE_MESSAGE-> EventName.PuppetEventNameMessage,
33-
EventType.EVENT_TYPE_READY-> EventName.PuppetEventNameReady,
34-
EventType.EVENT_TYPE_ROOM_INVITE-> EventName.PuppetEventNameRoomInvite,
35-
EventType.EVENT_TYPE_ROOM_JOIN-> EventName.PuppetEventNameRoomJoin,
36-
EventType.EVENT_TYPE_ROOM_LEAVE-> EventName.PuppetEventNameRoomLeave,
37-
EventType.EVENT_TYPE_ROOM_TOPIC-> EventName.PuppetEventNameRoomTopic,
38-
EventType.EVENT_TYPE_SCAN-> EventName.PuppetEventNameScan,
39-
EventType.EVENT_TYPE_RESET-> EventName.PuppetEventNameReset,
40-
EventType.EVENT_TYPE_UNSPECIFIED-> EventName.PuppetEventNameUnknown
25+
val pbEventType2PuppetEventName = Map[EventType,PuppetEventName.Type](
26+
EventType.EVENT_TYPE_DONG-> PuppetEventName.DONG,
27+
EventType.EVENT_TYPE_ERROR-> PuppetEventName.ERROR,
28+
EventType.EVENT_TYPE_HEARTBEAT-> PuppetEventName.HEARTBEAT,
29+
EventType.EVENT_TYPE_FRIENDSHIP-> PuppetEventName.FRIENDSHIP,
30+
EventType.EVENT_TYPE_LOGIN-> PuppetEventName.LOGIN,
31+
EventType.EVENT_TYPE_LOGOUT-> PuppetEventName.LOGOUT,
32+
EventType.EVENT_TYPE_MESSAGE-> PuppetEventName.MESSAGE,
33+
EventType.EVENT_TYPE_READY-> PuppetEventName.READY,
34+
EventType.EVENT_TYPE_ROOM_INVITE-> PuppetEventName.INVITE,
35+
EventType.EVENT_TYPE_ROOM_JOIN-> PuppetEventName.ROOM_JOIN,
36+
EventType.EVENT_TYPE_ROOM_LEAVE-> PuppetEventName.ROOM_LEAVE,
37+
EventType.EVENT_TYPE_ROOM_TOPIC-> PuppetEventName.ROOM_TOPIC,
38+
EventType.EVENT_TYPE_SCAN-> PuppetEventName.SCAN,
39+
EventType.EVENT_TYPE_RESET-> PuppetEventName.RESET,
40+
EventType.EVENT_TYPE_UNSPECIFIED-> PuppetEventName.UNKNOWN
4141
)
4242

4343
def isBlank(value:String): Boolean = value == null || value.trim.length ==0
+34-16
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,44 @@
11
package wechaty
22

3+
import wechaty.helper.ImplicitHelper._
34
import wechaty.hostie.PuppetHostie
45
import wechaty.puppet.events.EventEmitter
5-
import wechaty.puppet.schemas.Events.{EventLoginPayload, EventMessagePayload, EventName, EventScanPayload}
6+
import wechaty.puppet.schemas.Events._
67
import wechaty.puppet.schemas.Puppet.PuppetOptions
7-
import wechaty.puppet.{LoggerSupport, PuppetOption}
8+
import wechaty.puppet.LoggerSupport
89
import wechaty.user.{Contact, Message}
910

1011
import scala.language.implicitConversions
1112

1213

1314
/**
15+
**
16+
* Main bot class.
1417
*
18+
* A `Bot` is a WeChat client depends on which puppet you use.
19+
*
20+
* See more:
21+
* - [What is a Puppet in Wechaty](https://github.com/wechaty/wechaty-getting-started/wiki/FAQ-EN#31-what-is-a-puppet-in-wechaty)
22+
*
23+
* > If you want to know how to send message, see [Message](#Message) <br>
24+
* > If you want to know how to get contact, see [Contact](#Contact)
25+
*
26+
* @example <caption>The World's Shortest ChatBot Code: 6 lines of Scala</caption>
27+
* val options = new WechaytOptions
28+
* val bot = Wechaty.instance(options)
29+
* bot.onScan(payload => println("['https://api.qrserver.com/v1/create-qr-code/?data=',encodeURIComponent(qrcode),'&size=220x220&margin=20',].join('')"))
30+
* bot.onLogin(user => println("User ${user} logged in"))
31+
* bot.onMessage(message => println("Message: ${message}"))
32+
* bot.start()
1533
* @author <a href="mailto:[email protected]">Jun Tsai</a>
1634
* @since 2020-06-01
1735
*/
1836
object Wechaty {
37+
private var globalInstance:Wechaty = _
1938
def instance(options: WechatyOptions): Wechaty = {
20-
new Wechaty(options)
39+
if (options != null && globalInstance != null) throw new Error("instance can be only initialized once by options !")
40+
if (globalInstance == null) globalInstance = new Wechaty(options)
41+
globalInstance
2142
}
2243
}
2344

@@ -28,28 +49,31 @@ class WechatyOptions {
2849
var ioToken: Option[String] = None
2950
}
3051

31-
class Wechaty(options: WechatyOptions) extends LoggerSupport{
52+
class Wechaty(private val options: WechatyOptions) extends LoggerSupport{
3253
private implicit var hostie:PuppetHostie = _
3354

3455
def onScan(listener: EventScanPayload=>Unit): Wechaty = {
35-
EventEmitter.addListener(EventName.PuppetEventNameScan,listener)
56+
EventEmitter.addListener(PuppetEventName.SCAN,listener)
3657
this
3758
}
3859
def onLogin(listener:Contact =>Unit):Wechaty={
39-
EventEmitter.addListener[EventLoginPayload](EventName.PuppetEventNameLogin,listener)
60+
EventEmitter.addListener[EventLoginPayload](PuppetEventName.LOGIN,listener)
4061
this
4162
}
4263
def onMessage(listener:Message =>Unit):Wechaty={
43-
EventEmitter.addListener[EventMessagePayload](EventName.PuppetEventNameMessage,listener)
64+
EventEmitter.addListener[EventMessagePayload](PuppetEventName.MESSAGE,listener)
4465
this
4566
}
46-
def onLogout(listener:EventLoginPayload=>Unit):Wechaty={
47-
EventEmitter.addListener(EventName.PuppetEventNameLogout,listener)
67+
def onLogout(listener:Contact=>Unit):Wechaty={
68+
EventEmitter.addListener[EventLogoutPayload](PuppetEventName.LOGOUT,listener)
4869
this
4970
}
5071

5172
def start(): Unit = {
52-
val option = new PuppetOption
73+
val option = options.puppetOptions match{
74+
case Some(o) => o
75+
case _ => new PuppetOptions
76+
}
5377
this.hostie = new PuppetHostie(option)
5478
this.hostie.start()
5579
Runtime.getRuntime.addShutdownHook(new Thread(new Runnable {
@@ -60,12 +84,6 @@ class Wechaty(options: WechatyOptions) extends LoggerSupport{
6084
}))
6185

6286
}
63-
implicit def toMessage(messageListener: Message=>Unit):EventMessagePayload=>Unit ={
64-
messagePayload:EventMessagePayload => messageListener(new Message(messagePayload.messageId))
65-
}
66-
implicit def toContact(contactListener: Contact=>Unit):EventLoginPayload=>Unit ={
67-
payload:EventLoginPayload => contactListener(new Contact(payload.contactId))
68-
}
6987
}
7088

7189

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package wechaty.helper
2+
3+
import wechaty.puppet.Puppet
4+
import wechaty.puppet.schemas.Events.{EventLoginPayload, EventLogoutPayload, EventMessagePayload}
5+
import wechaty.user.{Contact, Message}
6+
7+
import scala.language.implicitConversions
8+
9+
/**
10+
* convert event payload to user class
11+
* @author <a href="mailto:[email protected]">Jun Tsai</a>
12+
* @since 2020-06-04
13+
*/
14+
object ImplicitHelper {
15+
private[wechaty] implicit def toMessage(messageListener: Message => Unit)(implicit puppet: Puppet): EventMessagePayload => Unit = {
16+
messagePayload: EventMessagePayload => messageListener(new Message(messagePayload.messageId))
17+
}
18+
19+
private[wechaty] implicit def toContact(contactListener: Contact => Unit)(implicit puppet: Puppet): EventLoginPayload => Unit = {
20+
payload: EventLoginPayload => contactListener(new Contact(payload.contactId))
21+
}
22+
23+
private[wechaty] implicit def logoutToContact(contactListener: Contact => Unit)(implicit puppet: Puppet): EventLogoutPayload => Unit = {
24+
payload: EventLogoutPayload => contactListener(new Contact(payload.contactId))
25+
}
26+
27+
}

0 commit comments

Comments
 (0)