Hi,

we're evaluating akka-stream for the usage in a future project of ours. The 
IRC client spec (https://tools.ietf.org/html/rfc2812) is somewhat 
comparable to what we will need to be able to do in our real project. I'm 
struggling with the design of a graph in which the source has to emit 
outbound messages on certain inbound messages from the sink. 

The goal is to provide an API that look something like this:

def join(network: String, port: Int, channels: Seq[String]): Source[
ChannelMessage, ...]

where the ChannelMessages that this source emits are messages sent in the 
specified channels.

This is my very simple implementation, but it's enough to send and receive 
messages to an IRC network:

import java.net.InetSocketAddress
import akka.actor.ActorSystem
import akka.stream.ActorFlowMaterializer
import akka.stream.scaladsl.{BidiFlow, Source, StreamTcp}
import akka.util.ByteString

object ReactiveIRC extends App {

  implicit val system = ActorSystem("reactive-irc")
  implicit val materializer = ActorFlowMaterializer()

  val connection = StreamTcp().outgoingConnection(new 
InetSocketAddress("irc.freenode.net", 6666))

  val convertToByteString = (s: String) => ByteString(s)
  val convertToString = (b: ByteString) => b.utf8String

  val codec = BidiFlow(convertToByteString, 
convertToString).join(connection)

  Source(() => scala.io.Source.stdin.getLines()).map(_ + 
"\r\n").via(codec).runForeach { s =>
    println(s"response: $s")
  }

}

The messages needed to join the #akka channel on freenode are:

PASS foobar
NICK reactive-tester
USER guest 0 * :Reactive Tester
JOIN #akka

Now on to my problem:

I need to handle the messages from the IRC network in the following way: 

* There are messages the Source needs to answer to (e.g. the responses to 
the message above and PING messages)
* There are the messages that I want to sent to the user of the API (user 
messages in a Channel: something like Source[ChannelMessage,...])

So what I am looking for is a cyclic graph with the ability to 'pipe' 
certain messages in to another Source.

I thought I could use an ActorPublisher as a Source that would initiate the 
connection by sending the commands above on start, but I have no Idea how 
to reference it on the inbound side of the flow in order to pass the 
responses and PING messages to it.

Could anyone give me a hint on how to solve problems like this?

Thanks in advance!

Jonas 

-- 
>>>>>>>>>>      Read the docs: http://akka.io/docs/
>>>>>>>>>>      Check the FAQ: 
>>>>>>>>>> http://doc.akka.io/docs/akka/current/additional/faq.html
>>>>>>>>>>      Search the archives: https://groups.google.com/group/akka-user
--- 
You received this message because you are subscribed to the Google Groups "Akka 
User List" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/akka-user.
For more options, visit https://groups.google.com/d/optout.

Reply via email to