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.") }