Skip to content

Commit

Permalink
Send recived tweet to channel.
Browse files Browse the repository at this point in the history
  • Loading branch information
NOX73 committed Jul 14, 2013
1 parent 9006039 commit d3efc17
Show file tree
Hide file tree
Showing 3 changed files with 82 additions and 15 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
*.o
*.a
*.so
*.test

# Folders
_obj
Expand Down
84 changes: 72 additions & 12 deletions twitter_api.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,40 +3,100 @@ package twitter_api
import (
"github.com/NOX73/go-oauth"
"net/http"
"fmt"
"bufio"
"bytes"
)

type Tweet struct {
id int
text string
}

type Credentials struct {
oauth_consumer_key string
oauth_token string
oauth_consumer_secret string
oauth_token_secret string
}

func TwitterStream (ch chan Tweet, credentials *Credentials, params map[string]string){
const (
StatusMessageKind = 0
TweetMessageKind = 1
)

type Messager interface {
Kind() int
Tweet() *TweetMessage
Status() *StatusMessage
}

type StatusMessage struct {
StatusCode int
Error bool
}

func (m *StatusMessage) Kind() int {
return StatusMessageKind
}

func (m *StatusMessage) Status() *StatusMessage {
return m
}

func (m *StatusMessage) Tweet() *TweetMessage {
return &TweetMessage{}
}



type TweetMessage struct {
Body string
}

func (m *TweetMessage) Kind() int {
return TweetMessageKind
}

func (m *TweetMessage) Tweet() *TweetMessage {
return m
}

func (m *TweetMessage) Status() *StatusMessage {
return &StatusMessage{}
}

func TwitterStream (ch chan Messager, credentials *Credentials, params map[string]string){
c := oauth.NewCredentials(credentials.oauth_consumer_key, credentials.oauth_token, credentials.oauth_consumer_secret, credentials.oauth_token_secret)

r, _ := oauth.NewRequest("POST", "https://stream.twitter.com/1.1/statuses/filter.json", params, c)

client := http.Client{}
resp, _ := client.Do(r.HttpRequest())

fmt.Println(resp.Status)
message := &StatusMessage{
StatusCode: resp.StatusCode,
Error: false,
}

ch <- message

body_reader := bufio.NewReader(resp.Body)
for {
line, prefix, err := body_reader.ReadLine()
var part []byte //Part of line
var prefix bool //Flag. Readln readed only part of line.
var sep []byte // Separator for Join function

parts := make([][]byte, 0, 5)

part, prefix, err := body_reader.ReadLine()
parts = append(parts, part)

for !prefix {
part, prefix, err = body_reader.ReadLine()
parts = append(parts, part)
}

if err != nil { break }

fmt.Print(string(line))
if !prefix {
fmt.Println("\n----------------------------")
tweet := &TweetMessage{
Body: string(bytes.Join(parts, sep)),
}

ch <- tweet
}
}
12 changes: 9 additions & 3 deletions twitter_api_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ type OAuthSuite struct{}
var _ = Suite(&OAuthSuite{})

func (s *OAuthSuite) TestCreateClient(c *C) {
ch := make(chan Tweet)
ch := make(chan Messager)
params := make(map[string]string, 1)

credentials := Credentials{
Expand All @@ -22,12 +22,18 @@ func (s *OAuthSuite) TestCreateClient(c *C) {
oauth_token_secret: "tO5hW1ye3myBnT78DspVbTKWFgadvKeU1EOiV3o5Tg",
}

params["track"] = "golang"
params["track"] = "twitter"

go TwitterStream(ch, &credentials, params)

for {
t := <- ch
fmt.Println("Recieve tweet: ", t.text)
fmt.Println("Recieve message with kind = ", t.Kind())
switch t.Kind() {
case StatusMessageKind:
fmt.Println("Status = ", t.Status().StatusCode)
case TweetMessageKind:
fmt.Println("Tweet body = ", t.Tweet().Body)
}
}
}

0 comments on commit d3efc17

Please sign in to comment.