Tyrian

A Tyrian-based implementation implementation of ShowdownClient.

Connecting to the server

You can use TyrianShowdownClient#openConnection to connect to the Pokemon Showdown server. It uses Tyrian's Cmd system

case class Model(connection: Option[TyrianShowdownConnection[F]])
enum Msg:
  case Connected(connection: Either[String, TyrianShowdownConnection[F]])
  case ShowdownEvent(event: TyrianConnectionEvent[Either[ProtocolError, ServerMessage]])
object Main extends TyrianAppF[F, Msg, Model]:

  def init(flags: Map[String, String]): (Model, Cmd[F, Msg]) =
    (
      Model.init,
      TyrianShowdownConnection[F].openConnection().map(Connected.apply)
    )

  def update(model: Model): Msg => (Model, Cmd[F, Model]) =
    case Connected(Right(connection)) => (model.copy(connection = Some(connection)), Cmd.None)
    case Connected(Left(error)) =>
      println(s"Error: $error")
      (model, Cmd.None)
      
    case ShowdownEvent(_) => (model, Cmd.None)

Receiving messages

Socket events, including messages, can be received using Tyrian's subscription system.

def subscriptions(model: Model): Sub[F, Msg] =
  model.connection.fold(Sub.None)(_.serverMessages.map(Msg.ShowdownEvent.apply))