Andreas Mieke
0a69d4a9f2
Implemented getters for: * Snapchat * Twitter * Instagram Also implemented config and database modules.
121 lines
3.5 KiB
Go
121 lines
3.5 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
|
|
|
|
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
|
|
}
|
|
|
|
func Stop() {
|
|
log.Printf("Stopping twitter stream...")
|
|
stream.Stop()
|
|
log.Printf("Stopped twitter stream.")
|
|
}
|