mirror of
https://github.com/dyrkin/luxmed-bot.git
synced 2025-12-21 13:23:05 +01:00
Initial commit
This commit is contained in:
5
bot/build.gradle
Normal file
5
bot/build.gradle
Normal file
@@ -0,0 +1,5 @@
|
||||
dependencies {
|
||||
compile project(':common')
|
||||
|
||||
compile group: "info.mukel", name: "telegrambot4s_2.12", version: "3.0.14"
|
||||
}
|
||||
49
bot/src/main/scala/com/lbs/bot/Bot.scala
Normal file
49
bot/src/main/scala/com/lbs/bot/Bot.scala
Normal file
@@ -0,0 +1,49 @@
|
||||
/**
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2018 Yevhen Zadyra
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
package com.lbs.bot
|
||||
|
||||
import com.lbs.bot.model._
|
||||
import com.lbs.bot.telegram.TelegramBot
|
||||
import com.lbs.common.Logger
|
||||
|
||||
class Bot(telegram: TelegramBot /* other bots */) extends Logger {
|
||||
def sendMessage(source: MessageSource, text: String): Unit =
|
||||
resolveAdapter(source).sendMessage(source.chatId, text)
|
||||
|
||||
def sendMessage(source: MessageSource, text: String, inlineKeyboard: Option[InlineKeyboard] = None): Unit =
|
||||
resolveAdapter(source).sendMessage(source.chatId, text, inlineKeyboard)
|
||||
|
||||
def sendEditMessage(source: MessageSource, messageId: String, inlineKeyboard: Option[InlineKeyboard]): Unit =
|
||||
resolveAdapter(source).sendEditMessage(source.chatId, messageId, inlineKeyboard)
|
||||
|
||||
def sendEditMessage(source: MessageSource, messageId: String, text: String, inlineKeyboard: Option[InlineKeyboard] = None): Unit =
|
||||
resolveAdapter(source).sendEditMessage(source.chatId, messageId, text, inlineKeyboard)
|
||||
|
||||
private def resolveAdapter(source: MessageSource): PollBot[_] =
|
||||
source.sourceSystem match {
|
||||
case TelegramMessageSourceSystem => telegram
|
||||
case sourceSystem =>
|
||||
sys.error(s"Unsupported source system $sourceSystem")
|
||||
}
|
||||
}
|
||||
38
bot/src/main/scala/com/lbs/bot/PollBot.scala
Normal file
38
bot/src/main/scala/com/lbs/bot/PollBot.scala
Normal file
@@ -0,0 +1,38 @@
|
||||
/**
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2018 Yevhen Zadyra
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
package com.lbs.bot
|
||||
|
||||
import com.lbs.bot.model.{Event, InlineKeyboard}
|
||||
|
||||
trait PollBot[In <: Event] {
|
||||
def sendMessage(chatId: String, text: String): Unit
|
||||
|
||||
def sendMessage(chatId: String, text: String, buttons: Option[InlineKeyboard] = None): Unit
|
||||
|
||||
def sendEditMessage(chatId: String, messageId: String, buttons: Option[InlineKeyboard]): Unit
|
||||
|
||||
def sendEditMessage(chatId: String, messageId: String, text: String, buttons: Option[InlineKeyboard] = None): Unit
|
||||
|
||||
protected def onReceive(command: In): Unit
|
||||
}
|
||||
30
bot/src/main/scala/com/lbs/bot/WebhookBot.scala
Normal file
30
bot/src/main/scala/com/lbs/bot/WebhookBot.scala
Normal file
@@ -0,0 +1,30 @@
|
||||
/**
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2018 Yevhen Zadyra
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
package com.lbs.bot
|
||||
|
||||
import com.lbs.bot.model.Event
|
||||
|
||||
trait WebhookBot[In <: Event] extends PollBot[In] {
|
||||
def processPayload(payload: String, signature: Option[String]): Unit
|
||||
}
|
||||
38
bot/src/main/scala/com/lbs/bot/model/Button.scala
Normal file
38
bot/src/main/scala/com/lbs/bot/model/Button.scala
Normal file
@@ -0,0 +1,38 @@
|
||||
/**
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2018 Yevhen Zadyra
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
package com.lbs.bot.model
|
||||
|
||||
object Button {
|
||||
def apply(label: String, id: Long) = new TaggedButton(label, id.toString)
|
||||
|
||||
def apply(label: String, id: String) = new TaggedButton(label, id)
|
||||
|
||||
def apply(label: String) = new LabeledButton(label)
|
||||
}
|
||||
|
||||
trait Button
|
||||
|
||||
class TaggedButton(val label: String, val tag: String) extends Button
|
||||
|
||||
class LabeledButton(val label: String) extends Button
|
||||
28
bot/src/main/scala/com/lbs/bot/model/Command.scala
Normal file
28
bot/src/main/scala/com/lbs/bot/model/Command.scala
Normal file
@@ -0,0 +1,28 @@
|
||||
/**
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2018 Yevhen Zadyra
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
package com.lbs.bot.model
|
||||
|
||||
case class Message(messageId: String, text: Option[String] = None)
|
||||
|
||||
case class Command(source: MessageSource, message: Message, callbackData: Option[String] = None)
|
||||
26
bot/src/main/scala/com/lbs/bot/model/Event.scala
Normal file
26
bot/src/main/scala/com/lbs/bot/model/Event.scala
Normal file
@@ -0,0 +1,26 @@
|
||||
/**
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2018 Yevhen Zadyra
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
package com.lbs.bot.model
|
||||
|
||||
trait Event
|
||||
26
bot/src/main/scala/com/lbs/bot/model/InlineKeyboard.scala
Normal file
26
bot/src/main/scala/com/lbs/bot/model/InlineKeyboard.scala
Normal file
@@ -0,0 +1,26 @@
|
||||
/**
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2018 Yevhen Zadyra
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
package com.lbs.bot.model
|
||||
|
||||
case class InlineKeyboard(buttons: Seq[Seq[Button]])
|
||||
26
bot/src/main/scala/com/lbs/bot/model/MessageSource.scala
Normal file
26
bot/src/main/scala/com/lbs/bot/model/MessageSource.scala
Normal file
@@ -0,0 +1,26 @@
|
||||
/**
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2018 Yevhen Zadyra
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
package com.lbs.bot.model
|
||||
|
||||
case class MessageSource(sourceSystem: MessageSourceSystem, chatId: String)
|
||||
@@ -0,0 +1,57 @@
|
||||
/**
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2018 Yevhen Zadyra
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
package com.lbs.bot.model
|
||||
|
||||
trait MessageSourceSystem {
|
||||
def id: Long
|
||||
|
||||
def name: String
|
||||
|
||||
override def toString: String = name
|
||||
}
|
||||
|
||||
object MessageSourceSystem {
|
||||
val MessageSourceSystems: Seq[MessageSourceSystem] = Seq(
|
||||
TelegramMessageSourceSystem,
|
||||
FacebookMessageSourceSystem
|
||||
)
|
||||
|
||||
private val MessageSourceSystemsMap = MessageSourceSystems.map(e => e.id -> e).toMap
|
||||
|
||||
def apply(id: Long): MessageSourceSystem = {
|
||||
MessageSourceSystemsMap.getOrElse(id, sys.error(s"Unsupported source system $id"))
|
||||
}
|
||||
}
|
||||
|
||||
object TelegramMessageSourceSystem extends MessageSourceSystem {
|
||||
override def id: Long = 1
|
||||
|
||||
override def name: String = "Telegram"
|
||||
}
|
||||
|
||||
object FacebookMessageSourceSystem extends MessageSourceSystem {
|
||||
override def id: Long = 2
|
||||
|
||||
override def name: String = "Facebook"
|
||||
}
|
||||
36
bot/src/main/scala/com/lbs/bot/package.scala
Normal file
36
bot/src/main/scala/com/lbs/bot/package.scala
Normal file
@@ -0,0 +1,36 @@
|
||||
/**
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2018 Yevhen Zadyra
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
package com.lbs
|
||||
|
||||
import com.lbs.bot.model.{Button, InlineKeyboard}
|
||||
|
||||
package object bot {
|
||||
def createInlineKeyboard(buttons: Seq[Button], columns: Int = 2): Option[InlineKeyboard] = {
|
||||
Option(buttons).filterNot(_.isEmpty).map(b => InlineKeyboard(b.grouped(columns).toSeq))
|
||||
}
|
||||
|
||||
def createInlineKeyboard(buttons: Seq[Seq[Button]]): Option[InlineKeyboard] = {
|
||||
Option(buttons).filterNot(_.isEmpty).map(InlineKeyboard)
|
||||
}
|
||||
}
|
||||
51
bot/src/main/scala/com/lbs/bot/telegram/TelegramBot.scala
Normal file
51
bot/src/main/scala/com/lbs/bot/telegram/TelegramBot.scala
Normal file
@@ -0,0 +1,51 @@
|
||||
/**
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2018 Yevhen Zadyra
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
package com.lbs.bot.telegram
|
||||
|
||||
import com.lbs.bot.PollBot
|
||||
import com.lbs.bot.model._
|
||||
import com.lbs.bot.telegram.TelegramModelConverters._
|
||||
import info.mukel.telegrambot4s.models.InlineKeyboardMarkup
|
||||
|
||||
class TelegramBot(onCommand: Command => Unit, botToken: String) extends PollBot[TelegramEvent] {
|
||||
|
||||
private val telegramBot = new TelegramClient(onReceive, botToken)
|
||||
telegramBot.run()
|
||||
|
||||
def sendMessage(chatId: String, text: String): Unit =
|
||||
telegramBot.sendMessage(chatId.toLong, text)
|
||||
|
||||
def sendMessage(chatId: String, text: String, buttons: Option[InlineKeyboard] = None): Unit =
|
||||
telegramBot.sendMessage(chatId.toLong, text, replyMarkup = buttons.map(_.mapTo[InlineKeyboardMarkup]))
|
||||
|
||||
def sendEditMessage(chatId: String, messageId: String, buttons: Option[InlineKeyboard]): Unit =
|
||||
telegramBot.sendEditMessage(chatId.toLong, messageId.toInt, replyMarkup = buttons.map(_.mapTo[InlineKeyboardMarkup]))
|
||||
|
||||
def sendEditMessage(chatId: String, messageId: String, text: String, buttons: Option[InlineKeyboard] = None): Unit =
|
||||
telegramBot.sendEditMessage(chatId.toLong, messageId.toInt, text, replyMarkup = buttons.map(_.mapTo[InlineKeyboardMarkup]))
|
||||
|
||||
override protected def onReceive(command: TelegramEvent): Unit = {
|
||||
onCommand(command.mapTo[Command])
|
||||
}
|
||||
}
|
||||
66
bot/src/main/scala/com/lbs/bot/telegram/TelegramClient.scala
Normal file
66
bot/src/main/scala/com/lbs/bot/telegram/TelegramClient.scala
Normal file
@@ -0,0 +1,66 @@
|
||||
/**
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2018 Yevhen Zadyra
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
package com.lbs.bot.telegram
|
||||
|
||||
import com.lbs.common.Logger
|
||||
import info.mukel.telegrambot4s.api.declarative.{Callbacks, Commands}
|
||||
import info.mukel.telegrambot4s.api.{Polling, TelegramBot => TelegramBotBase}
|
||||
import info.mukel.telegrambot4s.methods.{EditMessageReplyMarkup, EditMessageText, ParseMode, SendMessage}
|
||||
import info.mukel.telegrambot4s.models._
|
||||
|
||||
import scala.concurrent.Future
|
||||
|
||||
class TelegramClient(onReceive: TelegramEvent => Unit, botToken: String) extends TelegramBotBase with Polling with Commands with Callbacks with Logger {
|
||||
|
||||
override def token: String = botToken
|
||||
|
||||
def sendMessage(chatId: Long, text: String): Future[Message] =
|
||||
request(SendMessage(chatId, text, parseMode = Some(ParseMode.HTML)))
|
||||
|
||||
def sendMessage(chatId: Long, text: String, replyMarkup: Option[InlineKeyboardMarkup] = None): Future[Message] =
|
||||
request(SendMessage(chatId, text, parseMode = Some(ParseMode.HTML), replyMarkup = replyMarkup))
|
||||
|
||||
def sendEditMessage(chatId: Long, messageId: Int, replyMarkup: Option[InlineKeyboardMarkup]): Future[Either[Boolean, Message]] =
|
||||
request(EditMessageReplyMarkup(Some(chatId), Some(messageId), replyMarkup = replyMarkup))
|
||||
|
||||
def sendEditMessage(chatId: Long, messageId: Int, text: String, replyMarkup: Option[InlineKeyboardMarkup] = None): Future[Either[Boolean, Message]] =
|
||||
request(EditMessageText(Some(chatId), Some(messageId), text = text, parseMode = Some(ParseMode.HTML), replyMarkup = replyMarkup))
|
||||
|
||||
|
||||
override def receiveMessage(msg: Message): Unit = {
|
||||
LOG.debug(s"Received telegram message: $msg")
|
||||
onReceive(TelegramEvent(msg, None))
|
||||
}
|
||||
|
||||
onCallbackWithTag(TagPrefix) { implicit cbq =>
|
||||
LOG.debug(s"Received telegram callback: $cbq")
|
||||
ackCallback()
|
||||
for {
|
||||
data <- cbq.data.map(_.stripPrefix(TagPrefix))
|
||||
msg <- cbq.message
|
||||
} {
|
||||
onReceive(TelegramEvent(msg, Some(data)))
|
||||
}
|
||||
}
|
||||
}
|
||||
29
bot/src/main/scala/com/lbs/bot/telegram/TelegramEvent.scala
Normal file
29
bot/src/main/scala/com/lbs/bot/telegram/TelegramEvent.scala
Normal file
@@ -0,0 +1,29 @@
|
||||
/**
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2018 Yevhen Zadyra
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
package com.lbs.bot.telegram
|
||||
|
||||
import com.lbs.bot.model.Event
|
||||
import info.mukel.telegrambot4s.models.Message
|
||||
|
||||
case class TelegramEvent(msg: Message, callbackData: Option[String]) extends Event
|
||||
77
bot/src/main/scala/com/lbs/bot/telegram/package.scala
Normal file
77
bot/src/main/scala/com/lbs/bot/telegram/package.scala
Normal file
@@ -0,0 +1,77 @@
|
||||
/**
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2018 Yevhen Zadyra
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
package com.lbs.bot
|
||||
|
||||
import com.lbs.bot.model._
|
||||
import com.lbs.common.ModelConverters
|
||||
import info.mukel.telegrambot4s.models
|
||||
import info.mukel.telegrambot4s.models.{InlineKeyboardButton, InlineKeyboardMarkup}
|
||||
|
||||
package object telegram {
|
||||
|
||||
protected[bot] val TagPrefix = "callback"
|
||||
|
||||
object TelegramModelConverters extends ModelConverters {
|
||||
implicit val TelegramCommandToCommandConverter:
|
||||
ObjectConverter[TelegramEvent, Command] =
|
||||
new ObjectConverter[TelegramEvent, Command] {
|
||||
override def convert[Z <: TelegramEvent](data: Z): Command = {
|
||||
Command(
|
||||
source = MessageSource(TelegramMessageSourceSystem, data.msg.chat.id.toString),
|
||||
message = Message(data.msg.messageId.toString, data.msg.text),
|
||||
callbackData = data.callbackData
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
implicit val TelegramMessageToMessageConverter:
|
||||
ObjectConverter[models.Message, Message] =
|
||||
new ObjectConverter[models.Message, Message] {
|
||||
override def convert[Z <: models.Message](data: Z): Message = {
|
||||
Message(data.messageId.toString, data.text)
|
||||
}
|
||||
}
|
||||
|
||||
implicit val InlineKeyboardToInlineKeyboardMarkup:
|
||||
ObjectConverter[InlineKeyboard, InlineKeyboardMarkup] =
|
||||
new ObjectConverter[InlineKeyboard, InlineKeyboardMarkup] {
|
||||
override def convert[Z <: InlineKeyboard](inlineKeyboard: Z): InlineKeyboardMarkup = {
|
||||
val buttons = inlineKeyboard.buttons.map { row =>
|
||||
row.map(createInlineKeyboardButton)
|
||||
}
|
||||
InlineKeyboardMarkup(buttons)
|
||||
}
|
||||
}
|
||||
|
||||
private def createInlineKeyboardButton(button: Button) = {
|
||||
button match {
|
||||
case b: TaggedButton => InlineKeyboardButton.callbackData(b.label, tag(b.tag))
|
||||
case b: LabeledButton => InlineKeyboardButton.callbackData(b.label, b.label)
|
||||
}
|
||||
}
|
||||
|
||||
private def tag(name: String): String = TagPrefix + name
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user