SocialDragon/twitter/main.go

123 lines
3.6 KiB
Go

package twitter
import (
"log"
"git.1750studios.com/AniNite/SocialDragon/config"
"git.1750studios.com/AniNite/SocialDragon/database"
"github.com/dghubble/go-twitter/twitter"
"github.com/dghubble/oauth1"
)
var stream *twitter.Stream
// LoadNewTweets loads new tweets. Endless loop!
func LoadNewTweets() error {
log.Printf("Loading new tweets...")
conf := oauth1.NewConfig(config.C.Twitter.ConsumerKey, config.C.Twitter.ConsumerSecret)
token := oauth1.NewToken(config.C.Twitter.OAuthToken, config.C.Twitter.OAuthTokenSecret)
httpClient := conf.Client(oauth1.NoContext, token)
client := twitter.NewClient(httpClient)
params := &twitter.StreamFilterParams{
Track: config.C.Twitter.Filter,
StallWarnings: twitter.Bool(false),
}
var err error
stream, err = client.Streams.Filter(params)
if err != nil {
return err
}
demux := twitter.NewSwitchDemux()
demux.Tweet = func(tweet *twitter.Tweet) {
if tweet.ExtendedEntities == nil || tweet.RetweetedStatus != nil {
return
}
var count int
var US database.User
if database.Db.Model(database.User{}).Where("name = ? AND service = ?", tweet.User.ScreenName, database.Twitter).First(&US).Count(&count); count == 0 {
US.DisplayName = tweet.User.Name
US.Name = tweet.User.ScreenName
US.Service = database.Twitter
US.Blocked = false
database.Db.Create(&US)
}
for _, media := range tweet.ExtendedEntities.Media {
if media.Type == "video" {
bitrate := 0
index := 0
for i, variant := range media.VideoInfo.Variants {
if variant.Bitrate > bitrate {
index = i
bitrate = variant.Bitrate
}
}
log.Printf("Found video in tweet %s from %s", tweet.IDStr, tweet.User.ScreenName)
name, uname := MediaNameGenerator(media.VideoInfo.Variants[index].URL)
res, err := GetHTTPResource(media.VideoInfo.Variants[index].URL)
if err != nil {
log.Printf("Can't load video from tweet %s: %+v", tweet.IDStr, err)
return
}
defer res.Body.Close()
ext, err := DownloadMedia(res.Body, name, true)
if err != nil {
log.Printf("Can't load video from tweet %s: %+v", tweet.IDStr, err)
return
}
log.Printf("Loaded tweet %s, location %s!", tweet.IDStr, uname+ext)
var IT database.Item
IT.UserID = US.ID
IT.Service = database.Twitter
if US.Blocked {
IT.State = database.Rejected
} else {
IT.State = database.Inbox
}
IT.IsVideo = true
IT.Path = uname + ext
IT.OriginalID = tweet.IDStr
database.Db.Create(&IT)
} else {
log.Printf("Found picture(s) in tweet %s from %s", tweet.IDStr, tweet.User.ScreenName)
name, uname := MediaNameGenerator(media.MediaURLHttps)
res, err := GetHTTPResource(media.MediaURLHttps)
if err != nil {
log.Printf("Can't load picture(s) from tweet %s: %+v", tweet.IDStr, err)
return
}
defer res.Body.Close()
ext, err := DownloadMedia(res.Body, name, false)
if err != nil {
log.Printf("Can't load picture(s) from tweet %s: %+v", tweet.IDStr, err)
return
}
log.Printf("Loaded tweet %s, location %s!", tweet.IDStr, uname+ext)
var IT database.Item
IT.UserID = US.ID
IT.Service = database.Twitter
if US.Blocked {
IT.State = database.Rejected
} else {
IT.State = database.Inbox
}
IT.IsVideo = false
IT.Path = uname + ext
IT.OriginalID = tweet.IDStr
database.Db.Create(&IT)
}
}
}
demux.HandleChan(stream.Messages)
log.Printf("Finished looking for new tweets.")
return nil
}
// Stop stops the LoadNewTweets endless loop
func Stop() {
log.Printf("Stopping twitter stream...")
stream.Stop()
log.Printf("Stopped twitter stream.")
}