diff --git a/wechaty-puppet/src/main/kotlin/Puppet.kt b/wechaty-puppet/src/main/kotlin/Puppet.kt index af4dd25..cf12ad1 100644 --- a/wechaty-puppet/src/main/kotlin/Puppet.kt +++ b/wechaty-puppet/src/main/kotlin/Puppet.kt @@ -31,7 +31,7 @@ val PUPPET_COUNT = AtomicLong() * puppet * @author zhengxin */ -abstract class Puppet: EventEmitter{ +abstract class Puppet : EventEmitter { @Volatile protected var state = StateEnum.OFF @@ -52,7 +52,7 @@ abstract class Puppet: EventEmitter{ private var id: String? = null protected var puppetOptions: PuppetOptions? = null - private val watchDog:WatchDog + private val watchDog: WatchDog /** * @@ -63,10 +63,10 @@ abstract class Puppet: EventEmitter{ count.addAndGet(1) this.puppetOptions = puppetOptions - val timeOut = puppetOptions.timeout ?:DEFAULT_WATCHDOG_TIMEOUT - watchDog = WatchDog(1000 * timeOut,"puppet") + val timeOut = puppetOptions.timeout ?: DEFAULT_WATCHDOG_TIMEOUT + watchDog = WatchDog(1000 * timeOut, "puppet") - on("heartbeat",object :PuppetHeartbeatListener{ + on("heartbeat", object : PuppetHeartbeatListener { override fun handler(payload: EventHeartbeatPayload) { log.info("heartbeat -> ${payload.data}") val watchdogFood = WatchdogFood(1000 * timeOut) @@ -77,20 +77,20 @@ abstract class Puppet: EventEmitter{ - this.watchDog.on("reset",object : WatchdogListener{ + this.watchDog.on("reset", object : WatchdogListener { override fun handler(event: WatchdogFood) { val payload = EventResetPayload(JsonUtils.write(event)) - emit("reset",payload) + emit("reset", payload) } }) // 一秒只有一次 val rateLimiter = RateLimiter.create(1.0) - on("reset",object :PuppetResetListener{ + on("reset", object : PuppetResetListener { override fun handler(payload: EventResetPayload) { log.info("get a reset message") - if(rateLimiter.tryAcquire()){ + if (rateLimiter.tryAcquire()) { reset(payload.data) } } @@ -115,15 +115,15 @@ abstract class Puppet: EventEmitter{ cacheMessagePayload = Caffeine.newBuilder().build() } - private fun initHeart(){ + private fun initHeart() { executorService.scheduleAtFixedRate({ - if(state == StateEnum.ON) { + if (state == StateEnum.ON) { val incrementAndGet = HEARTBEAT_COUNTER.incrementAndGet() log.info("HEARTBEAT_COUNTER #{}", incrementAndGet) ding("`recover CPR #${incrementAndGet}") } - },HOSTIE_KEEPALIVE_TIMEOUT,HOSTIE_KEEPALIVE_TIMEOUT,TimeUnit.MILLISECONDS) + }, HOSTIE_KEEPALIVE_TIMEOUT, HOSTIE_KEEPALIVE_TIMEOUT, TimeUnit.MILLISECONDS) // heartbeatTimerId = vertx.setPeriodic(HOSTIE_KEEPALIVE_TIMEOUT) { id -> // if(state == StateEnum.ON) { @@ -141,10 +141,10 @@ abstract class Puppet: EventEmitter{ //dong fun on(event: String, listener: PuppetDongListener) { - super.on(event,object:Listener{ + super.on(event, object : Listener { override fun handler(vararg any: Any) { - log.info("class Type is {}",any[0].javaClass.name) + log.info("class Type is {}", any[0].javaClass.name) listener.handler(any[0] as EventDongPayload) } @@ -152,7 +152,7 @@ abstract class Puppet: EventEmitter{ } fun on(event: String, listener: PuppetFriendshipListener) { - super.on(event,object:Listener{ + super.on(event, object : Listener { override fun handler(vararg any: Any) { listener.handler(any[0] as EventFriendshipPayload) } @@ -161,15 +161,15 @@ abstract class Puppet: EventEmitter{ //dong fun on(event: String, listener: PuppetLogoutListener) { - super.on(event,object:Listener{ + super.on(event, object : Listener { override fun handler(vararg any: Any) { listener.handler(any[0] as EventLogoutPayload) } }) } - fun on(event: String,listener: PuppetRoomInviteListener){ - super.on(event,object:Listener{ + fun on(event: String, listener: PuppetRoomInviteListener) { + super.on(event, object : Listener { override fun handler(vararg any: Any) { listener.handler(any[0] as EventRoomInvitePayload) } @@ -177,16 +177,32 @@ abstract class Puppet: EventEmitter{ } - fun on(event: String,listener: PuppetRoomJoinListerner){ - super.on(event,object :Listener{ + fun on(event: String, listener: PuppetRoomJoinListener) { + super.on(event, object : Listener { override fun handler(vararg any: Any) { listener.handler(any[0] as EventRoomJoinPayload) } }) } - fun on(event: String,listener: PuppetErrorListener){ - super.on(event,object:Listener{ + fun on(event: String, listener: PuppetRoomLeaveListener) { + super.on(event, object : Listener { + override fun handler(vararg any: Any) { + listener.handler(any[0] as EventRoomLeavePayload) + } + }) + } + + fun on(event: String, listener: PuppetRoomTopicListener) { + super.on(event, object : Listener { + override fun handler(vararg any: Any) { + listener.handler(any[0] as EventRoomTopicPayload) + } + }) + } + + fun on(event: String, listener: PuppetErrorListener) { + super.on(event, object : Listener { override fun handler(vararg any: Any) { listener.handler(any[0] as EventErrorPayload) } @@ -194,10 +210,10 @@ abstract class Puppet: EventEmitter{ } fun on(event: String, listener: PuppetScanListener) { - super.on(event,object:Listener{ + super.on(event, object : Listener { override fun handler(vararg any: Any) { - log.info("class Type is {}",any[0].javaClass.name) + log.info("class Type is {}", any[0].javaClass.name) listener.handler(any[0] as EventScanPayload) } @@ -206,7 +222,7 @@ abstract class Puppet: EventEmitter{ } fun on(event: String, listener: PuppetLoginListener) { - super.on(event,object:Listener{ + super.on(event, object : Listener { override fun handler(vararg any: Any) { listener.handler(any[0] as EventLoginPayload) } @@ -214,7 +230,7 @@ abstract class Puppet: EventEmitter{ } fun on(event: String, listener: PuppetReadyListener) { - super.on(event,object:Listener{ + super.on(event, object : Listener { override fun handler(vararg any: Any) { listener.handler(any[0] as EventReadyPayload) } @@ -222,34 +238,34 @@ abstract class Puppet: EventEmitter{ } fun on(event: String, listener: PuppetMessageListener) { - super.on(event,object:Listener{ + super.on(event, object : Listener { override fun handler(vararg any: Any) { listener.handler(any[0] as EventMessagePayload) } }) } - fun on(event:String,listener: PuppetHeartbeatListener){ - super.on(event,object:Listener{ + fun on(event: String, listener: PuppetHeartbeatListener) { + super.on(event, object : Listener { override fun handler(vararg any: Any) { - log.info("class Type is {}",any[0].javaClass.name) + log.info("class Type is {}", any[0].javaClass.name) listener.handler(any[0] as EventHeartbeatPayload) } }) } - fun on(event:String,listener: PuppetResetListener){ - super.on(event,object:Listener{ + fun on(event: String, listener: PuppetResetListener) { + super.on(event, object : Listener { override fun handler(vararg any: Any) { listener.handler(any[0] as EventResetPayload) } }) } - fun on(event: String,listener: WatchdogListener){ - super.on(event,object :Listener{ + fun on(event: String, listener: WatchdogListener) { + super.on(event, object : Listener { override fun handler(vararg any: Any) { listener.handler(any[0] as WatchdogFood) } @@ -259,7 +275,7 @@ abstract class Puppet: EventEmitter{ abstract fun start(): Future abstract fun stop(): Future - open fun unref(){ + open fun unref() { } @@ -352,20 +368,20 @@ abstract class Puppet: EventEmitter{ log.info("contractId is {}", contactId) val roomList = roomList().get() val roomPayloadFuture: List> = roomList - .map { roomId: String -> - roomPayload( - roomId - ) - } - .map(FutureUtils::toCompletable) + .map { roomId: String -> + roomPayload( + roomId + ) + } + .map(FutureUtils::toCompletable) val resultRoomIdList = - FutureUtils.sequence(roomPayloadFuture) + FutureUtils.sequence(roomPayloadFuture) val roomPayloadList = resultRoomIdList.get() val result = - roomPayloadList.filter { t: RoomPayload -> - val memberIdList = t.memberIdList - contactId in memberIdList - }.map(RoomPayload::id) + roomPayloadList.filter { t: RoomPayload -> + val memberIdList = t.memberIdList + contactId in memberIdList + }.map(RoomPayload::id) return CompletableFuture.completedFuture(result) } @@ -401,7 +417,7 @@ abstract class Puppet: EventEmitter{ val contactPayload = cacheContactPayload.getIfPresent(contactId) - log.info("contactPayload is {} by id {}", contactPayload,contactId) + log.info("contactPayload is {} by id {}", contactPayload, contactId) return contactPayload } @@ -499,7 +515,7 @@ abstract class Puppet: EventEmitter{ abstract fun messageContact(messageId: String): Future abstract fun messageFile(messageId: String): Future - abstract fun messageImage(messageId: String,imageType:ImageType): Future + abstract fun messageImage(messageId: String, imageType: ImageType): Future abstract fun messageMiniProgram(messageId: String): Future abstract fun messageUrl(messageId: String): Future diff --git a/wechaty-puppet/src/main/kotlin/io/github/wechaty/listener/Listener.kt b/wechaty-puppet/src/main/kotlin/io/github/wechaty/listener/Listener.kt index 84757cc..81d4ac4 100644 --- a/wechaty-puppet/src/main/kotlin/io/github/wechaty/listener/Listener.kt +++ b/wechaty-puppet/src/main/kotlin/io/github/wechaty/listener/Listener.kt @@ -61,7 +61,7 @@ interface PuppetResetListener{ } @FunctionalInterface -interface PuppetRoomJoinListerner{ +interface PuppetRoomJoinListener{ fun handler(payload: EventRoomJoinPayload) // override fun handler0(vararg any: Any) { // handler(any[0] as EventRoomJoinPayload) @@ -69,7 +69,7 @@ interface PuppetRoomJoinListerner{ } @FunctionalInterface -interface PuppetRoomLeaveListerner{ +interface PuppetRoomLeaveListener{ fun handler(payload: EventRoomLeavePayload) // override fun handler0(vararg any: Any) { // handler(any[0] as EventRoomLeavePayload) diff --git a/wechaty/src/main/java/io/github/wechaty/examples/Main.java b/wechaty/src/main/java/io/github/wechaty/examples/Main.java index 602f25d..771f6f5 100644 --- a/wechaty/src/main/java/io/github/wechaty/examples/Main.java +++ b/wechaty/src/main/java/io/github/wechaty/examples/Main.java @@ -2,23 +2,16 @@ import io.github.wechaty.MessageListener; -import io.github.wechaty.ScanListener; import io.github.wechaty.Wechaty; import io.github.wechaty.filebox.FileBox; import io.github.wechaty.user.Contact; import io.github.wechaty.user.Room; import io.github.wechaty.utils.QrcodeUtils; -import okhttp3.*; -import org.apache.commons.io.FileUtils; +import okhttp3.OkHttpClient; import org.apache.commons.lang3.StringUtils; -import java.io.File; import java.io.IOException; -import java.net.URL; -import java.util.List; import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; -import java.util.stream.Collectors; public class Main { @@ -45,17 +38,10 @@ public static void main(String[] args) throws ExecutionException, InterruptedExc if (StringUtils.equals(text, "#ding")) { if (room != null) { room.say("dong"); - } else { - from.say("dong"); } } }); - bot.on("room-join", (room, inviteeList, inviter, date) -> { - List nameList = inviteeList.stream().map(Contact::name).collect(Collectors.toList()); - room.say("欢迎" + nameList + "加入群聊"); - - }); bot.start(true); // } @@ -78,5 +64,4 @@ public static void main(String[] args) throws ExecutionException, InterruptedExc } - } diff --git a/wechaty/src/main/kotlin/io/github/wechaty/Wechaty.kt b/wechaty/src/main/kotlin/io/github/wechaty/Wechaty.kt index 8761efb..6972d91 100644 --- a/wechaty/src/main/kotlin/io/github/wechaty/Wechaty.kt +++ b/wechaty/src/main/kotlin/io/github/wechaty/Wechaty.kt @@ -29,7 +29,7 @@ class Wechaty private constructor(private var wechatyOptions: WechatyOptions) : @Volatile private var status = StateEnum.OFF - val tagManager:TagManager = TagManager(this) + val tagManager: TagManager = TagManager(this) val contactManager = ContactManager(this) val messageManager = MessageManager(this) val roomManager = RoomManager(this) @@ -94,6 +94,22 @@ class Wechaty private constructor(private var wechatyOptions: WechatyOptions) : }) } + fun on(eventName: String, listener: RoomLeaveListener) { + super.on(eventName, object : Listener { + override fun handler(vararg any: Any) { + listener.handler(any[0] as Room, any[1] as List, any[2] as Contact, any[3] as Date) + } + }) + } + + fun on(eventName: String, listener: RoomTopicListener) { + super.on(eventName, object : Listener { + override fun handler(vararg any: Any) { + listener.handler(any[0] as Room, any[1] as String, any[2] as String, any[3] as Contact, any[4] as Date) + } + }) + } + private fun initPuppet() { this.puppet = GrpcPuppet(puppetOptions) initPuppetEventBridge(puppet) @@ -204,15 +220,15 @@ class Wechaty private constructor(private var wechatyOptions: WechatyOptions) : } "room-join" -> { - puppet.on(it, object : PuppetRoomJoinListerner { + puppet.on(it, object : PuppetRoomJoinListener { override fun handler(payload: EventRoomJoinPayload) { val room = roomManager.load(payload.roomId) room.sync().get() val inviteeList = payload.inviteeIdList.map { id -> - val contact = contactManager.loadSelf(id) - contact.ready() - return@map contact + val contact = contactManager.loadSelf(id) + contact.ready() + return@map contact } val inviter = contactManager.loadSelf(payload.inviterId) @@ -228,17 +244,39 @@ class Wechaty private constructor(private var wechatyOptions: WechatyOptions) : "room-leave" -> { - puppet.on(it, object : PuppetRoomInviteListener { - override fun handler(payload: EventRoomInvitePayload) { - TODO("Not yet implemented") + puppet.on(it, object : PuppetRoomLeaveListener { + override fun handler(payload: EventRoomLeavePayload) { + val room = roomManager.load(payload.roomId) + room.sync() + + val leaverList = payload.removeeIdList.map { id -> + val contact = contactManager.loadSelf(id) + contact.ready() + return@map contact + } + + val remover = contactManager.loadSelf(payload.removerId) + remover.ready() + val date = Date(payload.timestamp * 1000) + + emit("room-leave", room, leaverList, remover, date) + //TODO("room.emit") } }) } "room-topic" -> { - puppet.on(it, object : PuppetRoomInviteListener { - override fun handler(payload: EventRoomInvitePayload) { - TODO("Not yet implemented") + puppet.on(it, object : PuppetRoomTopicListener { + override fun handler(payload: EventRoomTopicPayload) { + val room = roomManager.load(payload.roomId) + room.sync() + + val changer = contactManager.loadSelf(payload.changerId) + changer.ready() + val date = Date(payload.timstamp * 1000) + + emit("room-topic", room, payload.newTopic, payload.oldTopic, changer, date) + //TODO("room.emit") } }) } diff --git a/wechaty/src/main/kotlin/io/github/wechaty/WechatyListener.kt b/wechaty/src/main/kotlin/io/github/wechaty/WechatyListener.kt index 572261d..0788901 100644 --- a/wechaty/src/main/kotlin/io/github/wechaty/WechatyListener.kt +++ b/wechaty/src/main/kotlin/io/github/wechaty/WechatyListener.kt @@ -7,74 +7,73 @@ import io.github.wechaty.user.Room import java.util.* @FunctionalInterface -interface DongListener{ - fun handler(data:String?) +interface DongListener { + fun handler(data: String?) } @FunctionalInterface -interface ErrorListener{ - fun handler(error:String) +interface ErrorListener { + fun handler(error: String) } @FunctionalInterface -interface FriendshipListener{ - fun handler(friendshipId:String) +interface FriendshipListener { + fun handler(friendshipId: String) } @FunctionalInterface -interface HeartbeatListener{ - fun handlder(data:Any) +interface HeartbeatListener { + fun handlder(data: Any) } @FunctionalInterface -interface ScanListener{ +interface ScanListener { fun handler(qrcode: String?, statusScanStatus: ScanStatus, data: String?) } @FunctionalInterface -interface LoginListener{ - fun handler(contactId:String) +interface LoginListener { + fun handler(contactId: String) } @FunctionalInterface -interface LogoutListener{ - fun handler(contactId: String,reason:String?) +interface LogoutListener { + fun handler(contactId: String, reason: String?) } @FunctionalInterface -interface ResetListerner{ - fun handler(reason:String) +interface ResetListerner { + fun handler(reason: String) } @FunctionalInterface -interface RoomJoinListener{ -// fun handler(roomId:String,inviteeIdList:List,inviterId:String,timestamp:Long) - fun handler(room: Room,inviteeList: List,inviter: Contact,date: Date) +interface RoomJoinListener { + fun handler(room: Room, inviteeList: List, inviter: Contact, date: Date) } @FunctionalInterface -interface RoomLeaveListerner{ - fun handler(roomId: String,leaverIdList:List,removerId:String,timestamp:Long) +interface RoomLeaveListener { + fun handler(room: Room, leaverList: List, remover: Contact, date: Date) } @FunctionalInterface -interface RoomTopicListener{ - fun handler(roomId: String,newTopic:String,oldTopic:String,changerId:String,timestamp:Long) +interface RoomTopicListener { + fun handler(room: Room, newTopic: String, oldTopic: String, changer: Contact, date: Date) } @FunctionalInterface -interface RoomInviteListener{ - fun handler(roomInvitationId:String) +interface RoomInviteListener { + fun handler(roomInvitationId: String) } @FunctionalInterface -interface ReadyListener{ +interface ReadyListener { fun handler() } @FunctionalInterface -interface MessageListener{ - fun handler(message:Message) +interface MessageListener { + fun handler(message: Message) }