package snapchat import ( "crypto/sha256" "encoding/hex" "encoding/json" "errors" "io" "io/ioutil" "log" "os" "github.com/disintegration/imaging" "git.1750studios.com/AniNite/SocialDragon/config" ) type Conversations struct { ConversationsResponse []ConversationsResponse `json:"conversations_response"` } type ConversationsResponse struct { PendingReceivedSnaps []Snap `json:"pending_received_snaps"` } type Snap struct { Id string `json:"id"` Username string `json:"sn"` Movie int `json:"m"` Rotation int `json:"mo"` } func GetConversations() (*Conversations, error) { var conversations Conversations headers := map[string]string{ "X-Snapchat-UUID": config.C.Snapchat.GetConversations.Uuid, "X-Snapchat-Client-Auth-Token": config.C.Snapchat.GetConversations.ClientAuthToken, } data := map[string]string{ "checksum_dict": "{}", "friends_request": "{\"friends_sync_token\":\"3\"}", "req_token": config.C.Snapchat.GetConversations.RequestToken, "timestamp": config.C.Snapchat.GetConversations.Timestamp, "username": config.C.Snapchat.UserName, } res, err := GetHTTPResource("/loq/conversations", headers, data) if err != nil { return nil, err } defer res.Body.Close() body, err := ioutil.ReadAll(res.Body) if err != nil { return nil, err } jerr := json.Unmarshal(body, &conversations) if jerr != nil { return nil, jerr } return &conversations, nil } func GetBlob(snap Snap) (string, error) { headers := map[string]string{ "X-Snapchat-UUID": config.C.Snapchat.GetBlob.Uuid, "X-Snapchat-Client-Auth-Token": config.C.Snapchat.GetBlob.ClientAuthToken, } data := map[string]string{ "id": snap.Id, "req_token": config.C.Snapchat.GetBlob.RequestToken, "timestamp": config.C.Snapchat.GetBlob.Timestamp, "username": config.C.Snapchat.UserName, } res, err := GetHTTPResource("/bq/blob", headers, data) if err != nil { return "", err } name, uname := ImageNameGenerator(snap.Id) defer res.Body.Close() ext, err := RotateImage(snap, res.Body, name) if err != nil { return "", err } return uname + ext, nil } func MarkAsSeen(snap Snap, screenshotted bool) error { headers := map[string]string{ "X-Snapchat-UUID": config.C.Snapchat.MarkAsSeen.Uuid, "X-Snapchat-Client-Auth-Token": config.C.Snapchat.MarkAsSeen.ClientAuthToken, } data := map[string]string{ "req_token": config.C.Snapchat.MarkAsSeen.RequestToken, "timestamp": config.C.Snapchat.MarkAsSeen.Timestamp, "username": config.C.Snapchat.UserName, } if screenshotted { data["json"] = "{\"" + snap.Id + "\":{\"t\":1467469712.44128,\"replayed\":0,\"c\":1,\"stack_id\":\"E437851F-2AA8-4C6C-AE11-5FB49FBF93C0\",\"sv\":0,\"es_id\":\"cssek-0::TgcQVwLCU3kHIEj+o6s2CQ==:QTm2VyfemhN5owtHmVuMpik4hwFNz4gSpUQ9D9zlWxatYA==\"}}" } else { data["json"] = "{\"" + snap.Id + "\":{\"t\":1467469712.44128,\"replayed\":0,\"stack_id\":\"E437851F-2AA8-4C6C-AE11-5FB49FBF93C0\",\"sv\":0,\"es_id\":\"cssek-0::TgcQVwLCU3kHIEj+o6s2CQ==:QTm2VyfemhN5owtHmVuMpik4hwFNz4gSpUQ9D9zlWxatYA==\"}}" } res, err := GetHTTPResource("/bq/update_snaps", headers, data) if err != nil { return err } defer res.Body.Close() return nil } func ImageNameGenerator(seed string) (string, string) { seedBytes := []byte(seed) sha256Bytes := sha256.Sum256(seedBytes) hash := hex.EncodeToString(sha256Bytes[:]) folders := config.C.ContentDirectory + "/" + hash[0:2] + "/" + hash[0:4] + "/" urls := config.C.ContentWebDirectory + "/" + hash[0:2] + "/" + hash[0:4] + "/" if err := os.MkdirAll(folders, 0775); err != nil { log.Fatalf("FAT Could not create ContentDirectory, error: %+v", err) } finalPath := folders + hash finalUrl := urls + hash return finalPath, finalUrl } func RotateImage(snap Snap, data io.Reader, path string) (string, error) { if snap.Movie == 1 { ext := ".mp4" blob, err := ioutil.ReadAll(data) if err != nil { return "", err } if len(blob) == 0 { return "", errors.New("Empty response") } err = ioutil.WriteFile(path+ext, blob, 0644) if err != nil { return "", err } return ext, nil } else { ext := ".jpg" image, err := imaging.Decode(data) if err != nil { return "", err } switch snap.Rotation { case 1: image = imaging.Rotate180(image) break case 2: image = imaging.Rotate90(image) break case 3: image = imaging.Rotate270(image) break default: break } err = imaging.Save(image, path+ext) if err != nil { return "", err } return ext, nil } }