Madrox

Distributed Twitter implementation built on Git using content-less commits as tweets.

USAGE

Madrox needs an existing repository with at a single initial commit. "Tweets" are simply commits in a user-specific branch. Use git to push/pull these branches with remote git repositories. Create custom timelines by merging them locally.

$ cd madrox-sample
$ git init
$ touch README
$ git add README
$ git commit -m "initial"

$ madrox rick [email protected] --msg="Hi"
@rick: Hi
8578cec211388123e071eccb1fda2024a44ac4c5

$ madrox bob [email protected] --msg="@rick: sup?"
@bob: @rick: sup?
002e1e01517ef2e5486b696814146d5cca4c07a2

$ madrox rick [email protected] --msg="@bob: nada"
@rick: @bob: nada
178f84a58ab1878d1a995ba9ce16ad11e5e58808

Now, we have three tweets from two different users in their own branch. You can merge these two branches into a single branch to see their commits in one stream:

$ git branch
  bob
* master
  rick

# Create a new branch
$ git checkout -b timeline
$ git merge rick
$ git merge bob

$ madrox rick
@rick: @bob: nada
@rick: Hi

$ madrox timeline
@rick: @bob: nada
@bob: @rick: sup?
@rick: Hi

Importing

You can import tweets with the --import option. You're still bound by Twitter's 3200 tweet limit, unfortunately.

$ madrox --import=twitter --since-id=123 --max-id-456 --email=EMAIL TWITTER_LOGIN

You can also use `rake console` and import the data yourself from other sources.

$ madrox --irb --email=EMAIL TWITTER_LOGIN
>> tweets.each do |tweet|
?>   timeline.post(tweet['text'], :committed_date => Time.parse(tweet['created_at']))
?> end

Ruby API

The Madrox ruby API revolves around two objects: Madrox::Repo and Madrox::Timeline.

Madrox::Repo simply tracks the Git repo. It's used to create Timeline instances.

repo = Madrox::Repo.new "/path/to/repo"
timeline = repo.timeline('rick', '[email protected]')

Madrox::Timeline represents a branch of the Git repo, and lets you post new messages to it. These branches can either represent a user's timeline, a grouped timeline with commits merged from multiple users, or something custom (such as a user's favorites).

timeline.post("Eating a sandwich.")

You can list messages from a timeline. They come out as Grit::Commit instances.

mine = repo.timeline('me', '[email protected]')
rick = repo.timeline('rick')
msg = rick.messages.first
msg.sha            # => 21f1ca7995b46a1008c402c92c4aa074806f92c4
msg.message        # => "Eating a sandwich."
msg.committer      # => #<Grit::Actor "rick ...">
msg.committed_date # => Sat Nov 6 11:48:02 -0700 2010

You can add a message as a favorite:

sha = mine.fave(msg)
commit = mine.grit.commit(sha)
commit.sha            # => b1dfaf30dff279b953abc8b985bb41e247a0e50c
commit.message        # => "Eating a sandwich."
commit.committer      # => #<Grit::Actor "me ...">
commit.committed_date # => Sat Nov 6 12:48:02 -0700 2010
commit.author         # => #<Grit::Actor "rick ...">
commit.authored_date  # => Sat Nov 6 11:48:02 -0700 2010

You can also retweet the message:

sha = mine.retweet(msg)
commit = mine.grit.commit(sha)
commit.sha            # => d1d22036741d0726901b8e555801885018e7c8df
commit.message        # => "Eating a sandwich."
commit.committer      # => #<Grit::Actor "me ...">
commit.committed_date # => Sat Nov 6 12:48:02 -0700 2010
commit.author         # => #<Grit::Actor "rick ...">
commit.authored_date  # => Sat Nov 6 11:48:02 -0700 2010

Add your own snarky comment:

sha = mine.retweet(msg, "TMI, bro!")
commit = mine.grit.commit(sha)
commit.sha            # => 06836ee40595bf06fde3eb276a08b10ac7733a74
commit.message        # => "TMI, bro! RT @rick Eating a sandwich."

TODO

  • Twitter pushing support
  • Git Notes for Twitter (or other) metadata.
  • Better importing.