Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ class HttpReceptionist(brain: ActorRef) extends Actor with ActorLogging {

override def receive: Receive = {
case message@PluginAdded(plugin, _) =>
plugin ! InitializePlugin(HttpReceptionist.State, brain, pluginRegistry)
plugin ! InitializePlugin(HttpReceptionist.State, brain, pluginRegistry, self)
pluginRegistry ! message

case message@PluginRemoved(_) =>
Expand Down
9 changes: 5 additions & 4 deletions src/main/scala/com/sumologic/sumobot/core/Receptionist.scala
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,11 @@ import com.sumologic.sumobot.core.Receptionist.{RtmStateRequest, RtmStateRespons
import com.sumologic.sumobot.core.model.{IncomingMessageAttachment, _}
import com.sumologic.sumobot.plugins.BotPlugin.{InitializePlugin, PluginAdded, PluginRemoved}
import slack.api.{BlockingSlackApiClient, SlackApiClient}
import slack.models.{ImOpened, Message, MessageChanged, ReactionAdded, ReactionItemMessage, Attachment => SAttachment}
import slack.models.{ImOpened, Message, MessageChanged, ReactionAdded, ReactionItemMessage, User, Attachment => SAttachment}
import slack.rtm.{RtmState, SlackRtmClient}

import scala.concurrent.ExecutionContext.Implicits.global
import scala.util.{Failure, Success}

object Receptionist {

Expand All @@ -38,7 +39,7 @@ object Receptionist {
syncClient: BlockingSlackApiClient,
asyncClient: SlackApiClient,
brain: ActorRef): Props =
Props(classOf[Receptionist], rtmClient, syncClient, asyncClient, brain)
Props(new Receptionist(rtmClient, syncClient, asyncClient, brain))
}

class Receptionist(rtmClient: SlackRtmClient,
Expand Down Expand Up @@ -82,7 +83,7 @@ class Receptionist(rtmClient: SlackRtmClient,
override def receive: Receive = {

case message@PluginAdded(plugin, _) =>
plugin ! InitializePlugin(rtmClient.state, brain, pluginRegistry)
plugin ! InitializePlugin(rtmClient.state, brain, pluginRegistry, self)
pluginRegistry ! message

case message@PluginRemoved(_) =>
Expand All @@ -106,7 +107,7 @@ class Receptionist(rtmClient: SlackRtmClient,
f => log.info(s"Sending image ended with $f")
}

case ImOpened(user, channel) =>
case ImOpened(user, _) =>
pendingIMSessionsByUserId.get(user).foreach {
tpl =>
tpl._1 ! tpl._2
Expand Down
15 changes: 9 additions & 6 deletions src/main/scala/com/sumologic/sumobot/plugins/BotPlugin.scala
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ import com.sumologic.sumobot.quartz.QuartzExtension
import com.typesafe.config.Config
import org.apache.http.HttpResponse
import org.apache.http.client.methods.{HttpGet, HttpUriRequest}
import slack.models.{Group, Im, User, Channel => ClientChannel}
import slack.models.{Group, User, Channel => ClientChannel}
import slack.rtm.RtmState

import java.net.URLEncoder
Expand All @@ -46,7 +46,7 @@ object BotPlugin {

case class PluginRemoved(plugin: ActorRef)

case class InitializePlugin(state: RtmState, brain: ActorRef, pluginRegistry: ActorRef)
case class InitializePlugin(state: RtmState, brain: ActorRef, pluginRegistry: ActorRef, receptionist: ActorRef)

def matchText(regex: String): Regex = ("(?i)(?s)" + regex).r
}
Expand All @@ -65,6 +65,8 @@ abstract class BotPlugin

protected var pluginRegistry: ActorRef = _

protected var receptionist: ActorRef = _

// For plugins to implement.

protected def receiveIncomingMessage: ReceiveIncomingMessage
Expand All @@ -74,9 +76,9 @@ abstract class BotPlugin

// Helpers for plugins to use.

protected def sendMessage(msg: OutgoingMessage): Unit = context.system.eventStream.publish(msg)
protected def sendMessage(msg: OutgoingMessageWithAttachments): Unit = context.system.eventStream.publish(msg)
protected def sendImage(im: OutgoingImage): Unit = context.system.eventStream.publish(im)
protected def sendMessage(msg: OutgoingMessage): Unit = receptionist ! msg
protected def sendMessage(msg: OutgoingMessageWithAttachments): Unit = receptionist ! msg
protected def sendImage(im: OutgoingImage): Unit = receptionist ! im

protected def responseConcurrency = 10

Expand Down Expand Up @@ -200,10 +202,11 @@ abstract class BotPlugin
override def receive: Receive = uninitialized orElse pluginReceive

private def uninitialized: Receive = {
case InitializePlugin(newState, newBrain, newPluginRegistry) =>
case InitializePlugin(newState, newBrain, newPluginRegistry, receptionist) =>
this.state = newState
this.brain = newBrain
this.pluginRegistry = newPluginRegistry
this.receptionist = receptionist
this.initialize()
context.become(initialized orElse pluginReceive)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ class SumoBotHttpServerTest
private val brain = TestActorRef(Props[InMemoryBrain]())
private val httpReceptionist = TestActorRef(new HttpReceptionist(brain))

private val pluginCollection = PluginsFromProps(Array(Props(classOf[Help]), Props(classOf[System])))
private val pluginCollection: PluginsFromProps = PluginsFromProps(Array(Props(classOf[Help]), Props(classOf[System])))

override def beforeAll: Unit = {
Bootstrap.receptionist = Some(httpReceptionist)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ import scala.concurrent.duration._
class AdviceTest extends BotPluginTestKit(ActorSystem("AdviceTest")) {

val adviceRef = system.actorOf(Props[Advice](), "advice")
adviceRef ! InitializePlugin(null, null, null)
adviceRef ! InitializePlugin(null, null, null, outgoingMessageProbe.testActor)

"advice" should {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ class AliasTest

val aliasRef = system.actorOf(Props(classOf[Alias]), "alias")
val brainRef = system.actorOf(Props(classOf[InMemoryBrain]), "brain")
aliasRef ! InitializePlugin(null, brainRef, null)
aliasRef ! InitializePlugin(null, brainRef, null, outgoingMessageProbe.testActor)

"alias" should {
"allow aliasing messages to the bot" in {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ class HelpTest extends BotPluginTestKit(ActorSystem("HelpTest")) {
reg ! PluginAdded(mock, "mock help")
reg ! PluginAdded(helpRef, "help help")

helpRef ! InitializePlugin(null, null, reg)
helpRef ! InitializePlugin(null, null, reg, outgoingMessageProbe.testActor)

val user = mockUser("123", "jshmoe")

Expand Down