SkillAgentSearch skills...

Bison

When Code Reacts to Data: demonstrating a dataflow programming style with scalaz-streams

Install / Use

/learn @jessitron/Bison
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

"The bison's temperament is often unpredictable. They usually appear peaceful, unconcerned, even lazy, yet they may attack anything, often without warning or apparent reason." - wikipedia

Perfect for a twitterbot

Bison

A scalaz-stream implementation of twitterbot, written for a talk at CodeMesh.io, also CodePaLOUsa and KCDC

Notes for using it

To make your own twitterbot, you'll need to create a twitter application. Once you've done that, and have the keys for it, do sbt test:run and choose AuthorizationSetup. This will step you through authorizing your twitter user on the app, and also create the keys.json file that the application will look for.

The demo code

Here's what I ran during the talk, in the repl:

import scalaz.stream._
import Process._
import scalaz.concurrent.Task
import scala.concurrent.duration._
import jessitron.bison._

val triggerTimes: Process[Task, Duration] = Process.awakeEvery(1.second)
val triggers: Process[Task, Message] = triggerTimes.map{ d => println(s"triggering at $d"); TimeToTweet }.take(10)

val randomTweets: Process[Task, IncomingTweet] = Process.eval{ Task.delay{ ranker.RankerSpec.realisticTweet.sample.get }}.repeat.take(50)

val slowTweets: Process[Task,Message] = Process.every(400.millis).tee(randomTweets)(tee.when)

def chooserInput: Process[Task, Message] = slowTweets.wye(triggers)(wye.merge[Message])

import ranker._
val allRankers = Rankers.randomo |> iDoThisToo.opinionate() |>
Rankers.shortIsBetter |> Rankers.retweetsAreRightOut

def rankedChooserInput = (slowTweets |> allRankers).merge(triggers)

val chooseAndRespond = Chooser.tweetPicker(5) |> Respond.responder

def randomTweets = rankedChooserInput |> chooseAndRespond

// the following requires real twitter auth codes in keys.json
val realInput = SearchInput("#codemesh") |> SearchInput.jsonToTweets

def realTweetChoices = realInput.take(50).pipe(allRankers).merge(triggers).pipe(chooseAndRespond)

def goBisonGo = realTweetChoices through TwitterConnection.outputChannel()
View on GitHub
GitHub Stars11
CategoryDevelopment
Updated7y ago
Forks1

Languages

Scala

Security Score

60/100

Audited on Apr 28, 2018

No findings