From 8e015fb9f6d7cde199865efada4385c1a7f4ed23 Mon Sep 17 00:00:00 2001 From: YipZong Date: Sun, 1 Aug 2021 00:17:34 +0800 Subject: [PATCH 1/5] add build.sbt dependency mgt --- build.sbt | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 build.sbt diff --git a/build.sbt b/build.sbt new file mode 100644 index 0000000..251d2c8 --- /dev/null +++ b/build.sbt @@ -0,0 +1,10 @@ +name := "scala-sbt-wechaty-getting-started" + +version := "0.1" + +scalaVersion := "2.12.14" + +val wechaty = "io.github.wechaty" %% "wechaty" % "0.0.15" +val apacheCommons = "org.apache.commons" % "commons-text" % "1.9" + +libraryDependencies ++= Seq(wechaty, apacheCommons) \ No newline at end of file From 87cbb11085aa817deecd9ed02a366bc108e34970 Mon Sep 17 00:00:00 2001 From: YipZong Date: Sun, 1 Aug 2021 00:18:24 +0800 Subject: [PATCH 2/5] check token format --- examples/ding-dong-bot.scala | 36 ---------------- src/main/scala/ding-dong-bot.scala | 67 ++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 36 deletions(-) delete mode 100755 examples/ding-dong-bot.scala create mode 100644 src/main/scala/ding-dong-bot.scala diff --git a/examples/ding-dong-bot.scala b/examples/ding-dong-bot.scala deleted file mode 100755 index f1448c8..0000000 --- a/examples/ding-dong-bot.scala +++ /dev/null @@ -1,36 +0,0 @@ -package wechaty - -import wechaty.puppet.schemas.Message.MessageType - -/** - * - * @author Jun Tsai - * @since 2020-06-02 - */ -object DingDongBot { - def main(args: Array[String]): Unit = { - val option = new WechatyOptions - val bot = Wechaty.instance(option) - bot - .onScan(payload => { - println("Scan QR Code to login: %s\nhttps://api.qrserver.com/v1/create-qr-code/?data=%s\n".format(payload.status, payload.qrcode)) - }) - .onLogin(payload => { - println("User %s logined\n".format(payload.id)) - }) - .onMessage(message=>{ - println(message) - if(message.payload.`type` != MessageType.MessageTypeText || message.payload.text != "ding" ){ - println("Message discarded because it does not match ding") - }else { - message.say("dong") - println("dong") - } - }) - - - bot.start() - - Thread.currentThread().join() - } -} diff --git a/src/main/scala/ding-dong-bot.scala b/src/main/scala/ding-dong-bot.scala new file mode 100644 index 0000000..9065e39 --- /dev/null +++ b/src/main/scala/ding-dong-bot.scala @@ -0,0 +1,67 @@ +import org.apache.commons.lang3.StringUtils +import wechaty.{Wechaty, WechatyOptions} + +/** + * + * @author Jun Tsai + * @since 2020-06-02 + */ +object DingDongBot { + def main(args: Array[String]): Unit = { + val token: String = System.getenv("WECHATY_PUPPET_HOSTIE_TOKEN") + if (!TokenValidator.isValidToken(token)) { + throw new Exception("Error: Wrong token format, WECHATY_PUPPET_HOSTIE_TOKEN should be in UUID v4 format!") + } else { + System.out.println("token format correct, creating Wechaty instance...") + } + + val option = new WechatyOptions + val bot = Wechaty.instance(option) + bot + .onScan(payload => { + println("Scan QR Code to login: %s\nhttps://api.qrserver.com/v1/create-qr-code/?data=%s\n".format(payload.status, payload.qrcode)) + }) + .onLogin(payload => { + println("User %s logined\n".format(payload.id)) + }) + .onMessage(message => { + println(message) + if (message.payload.`type` != wechaty.puppet.schemas.Message.MessageType || message.payload.text != "ding") { + println("Message discarded because it does not match ding") + } else { + message.say("dong") + println("dong") + } + }) + + + bot.start() + + Thread.currentThread().join() + + + } +} + +object TokenValidator { + + import java.util.UUID + + def isValidToken(token: String): Boolean = { + if (StringUtils.isBlank(token)) { + System.out.println("Error: WECHATY_PUPPET_HOSTIE_TOKEN is not found in the environment variables") + System.out.println("You need a TOKEN to run the Scala Wechaty. Please goto our README for details") + System.out.println("https://wechaty.js.org/docs/puppet-services/padlocal/") + false + + } else { + try { + UUID.fromString(token) + token.length == 36 + } catch { + case _: IllegalArgumentException => + false + } + } + } +} From df07fbaea105061c41be0b8e12c00a02d7942794 Mon Sep 17 00:00:00 2001 From: YipZong Date: Sun, 1 Aug 2021 01:06:34 +0800 Subject: [PATCH 3/5] update validate token --- src/main/scala/ding-dong-bot.scala | 35 ++++++++++++------------------ 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/src/main/scala/ding-dong-bot.scala b/src/main/scala/ding-dong-bot.scala index 9065e39..c530b84 100644 --- a/src/main/scala/ding-dong-bot.scala +++ b/src/main/scala/ding-dong-bot.scala @@ -8,12 +8,11 @@ import wechaty.{Wechaty, WechatyOptions} */ object DingDongBot { def main(args: Array[String]): Unit = { - val token: String = System.getenv("WECHATY_PUPPET_HOSTIE_TOKEN") - if (!TokenValidator.isValidToken(token)) { - throw new Exception("Error: Wrong token format, WECHATY_PUPPET_HOSTIE_TOKEN should be in UUID v4 format!") - } else { - System.out.println("token format correct, creating Wechaty instance...") - } + val token: String = sys.props.getOrElse("WECHATY_PUPPET_HOSTIE_TOKEN", + throw new Exception(s"Error: WECHATY_PUPPET_HOSTIE_TOKEN is not found in the environment variable!" + + s"You need a TOKEN to run the Scala Wechaty." + + s"Please goto our README for details https://wechaty.js.org/docs/puppet-services/padlocal/")) + TokenValidator.isValidToken(token) val option = new WechatyOptions val bot = Wechaty.instance(option) @@ -44,24 +43,18 @@ object DingDongBot { } object TokenValidator { + def isValidToken(token: String): Unit = { + import java.util.regex.Pattern + val p = Pattern.compile("[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$") + val valid = p.matcher(token).matches() - import java.util.UUID - - def isValidToken(token: String): Boolean = { - if (StringUtils.isBlank(token)) { - System.out.println("Error: WECHATY_PUPPET_HOSTIE_TOKEN is not found in the environment variables") - System.out.println("You need a TOKEN to run the Scala Wechaty. Please goto our README for details") - System.out.println("https://wechaty.js.org/docs/puppet-services/padlocal/") - false + if (valid) { + System.out.println("token format correct, creating Wechaty instance...") } else { - try { - UUID.fromString(token) - token.length == 36 - } catch { - case _: IllegalArgumentException => - false - } + throw new Exception(s"Error: Wrong token format, WECHATY_PUPPET_HOSTIE_TOKEN should be in UUID v4 format!") } } + + } From c3c25035166a6c7a1445be557770d6e9935e7809 Mon Sep 17 00:00:00 2001 From: YipZong Date: Sun, 1 Aug 2021 01:16:33 +0800 Subject: [PATCH 4/5] update makeFile and README --- Makefile | 4 ++-- README.md | 21 +++++++++------------ 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/Makefile b/Makefile index 51e0fa4..12bda87 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,7 @@ lint: .PHONY: install install: - echo install scala + sbt .PHONY: test test: @@ -25,7 +25,7 @@ test: .PHONY: bot bot: - scala examples/ding-dong-bot.scala + sbt .PHONY: version version: diff --git a/README.md b/README.md index 6799fcd..51f8723 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,10 @@ Wechaty is a RPA SDK for Wechat **Individual** Account that can help you create ## Requirements -1. Scala +1. sbt + https://www.scala-sbt.org/1.x/docs/Setup.html +2. Scala 2.12.x + https://www.scala-lang.org/download/scala2.html ## Quick Start @@ -32,20 +35,14 @@ Wechaty is a RPA SDK for Wechat **Individual** Account that can help you create make install ``` -3. Set token for your bot - - ```sh - # it must be hostie token - export WECHATY_PUPPET=wechaty-puppet-hostie - export WECHATY_PUPPET_HOSTIE_TOKEN=your_token_at_here - ``` - -4. Run the bot +4. Set token and Run the bot ```shell make bot - # or - scala examples/ding-dong-bot.scala + # Make sure you are in the sbt console + # It must be hostie token + eval System.setProperty("WECHATY_PUPPET_HOSTIE_TOKEN", "your_token_at_here") + run ``` ## The World's Shortest Scala ChatBot: 6 lines of Code From 678fc6939cc06fecddd03d8b5f6a4939ac31c895 Mon Sep 17 00:00:00 2001 From: YipZong Date: Sun, 1 Aug 2021 01:26:20 +0800 Subject: [PATCH 5/5] add invalid token registration error handling --- src/main/scala/ding-dong-bot.scala | 52 +++++++++++++++++------------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/src/main/scala/ding-dong-bot.scala b/src/main/scala/ding-dong-bot.scala index c530b84..f7cf6c1 100644 --- a/src/main/scala/ding-dong-bot.scala +++ b/src/main/scala/ding-dong-bot.scala @@ -15,29 +15,37 @@ object DingDongBot { TokenValidator.isValidToken(token) val option = new WechatyOptions - val bot = Wechaty.instance(option) - bot - .onScan(payload => { - println("Scan QR Code to login: %s\nhttps://api.qrserver.com/v1/create-qr-code/?data=%s\n".format(payload.status, payload.qrcode)) - }) - .onLogin(payload => { - println("User %s logined\n".format(payload.id)) - }) - .onMessage(message => { - println(message) - if (message.payload.`type` != wechaty.puppet.schemas.Message.MessageType || message.payload.text != "ding") { - println("Message discarded because it does not match ding") - } else { - message.say("dong") - println("dong") - } - }) - - - bot.start() - - Thread.currentThread().join() + try { + val bot = Wechaty.instance(option) + + bot + .onScan(payload => { + println("Scan QR Code to login: %s\nhttps://api.qrserver.com/v1/create-qr-code/?data=%s\n".format(payload.status, payload.qrcode)) + }) + .onLogin(payload => { + println("User %s logined\n".format(payload.id)) + }) + .onMessage(message => { + println(message) + if (message.payload.`type` != wechaty.puppet.schemas.Message.MessageType || message.payload.text != "ding") { + println("Message discarded because it does not match ding") + } else { + message.say("dong") + println("dong") + } + }) + + + bot.start() + + Thread.currentThread().join() + + + } catch { + case _: java.io.FileNotFoundException => + System.out.println(s"TOKEN is NOT registered successfully, please refer to https://wechaty.js.org/docs/puppet-services/diy/") + } } }