timelines.go
author Mikael Berthe <mikael@lilotux.net>
Sat, 29 Apr 2017 17:27:15 +0200
changeset 156 70aadba26338
parent 155 0c581e0108da
child 160 9f7e683b323f
permissions -rw-r--r--
Add field "All" to LimitParams, change Limit behaviour If All is true, the library will send several requests (if needed) until the API server has sent all the results. If not, and if a Limit is set, the library will try to fetch at least this number of results.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
130
c450bb73f59a Update credits
Mikael Berthe <mikael@lilotux.net>
parents: 127
diff changeset
     1
/*
c450bb73f59a Update credits
Mikael Berthe <mikael@lilotux.net>
parents: 127
diff changeset
     2
Copyright 2017 Mikael Berthe
c450bb73f59a Update credits
Mikael Berthe <mikael@lilotux.net>
parents: 127
diff changeset
     3
c450bb73f59a Update credits
Mikael Berthe <mikael@lilotux.net>
parents: 127
diff changeset
     4
Licensed under the MIT license.  Please see the LICENSE file is this directory.
c450bb73f59a Update credits
Mikael Berthe <mikael@lilotux.net>
parents: 127
diff changeset
     5
*/
c450bb73f59a Update credits
Mikael Berthe <mikael@lilotux.net>
parents: 127
diff changeset
     6
138
23d3a518d0ad Update package name in source files
Mikael Berthe <mikael@lilotux.net>
parents: 130
diff changeset
     7
package madon
88
df00ec8423fe Add timelines support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     8
df00ec8423fe Add timelines support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     9
import (
df00ec8423fe Add timelines support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    10
	"fmt"
df00ec8423fe Add timelines support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    11
	"strings"
df00ec8423fe Add timelines support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    12
df00ec8423fe Add timelines support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    13
	"github.com/sendgrid/rest"
df00ec8423fe Add timelines support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    14
)
df00ec8423fe Add timelines support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    15
df00ec8423fe Add timelines support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    16
// GetTimelines returns a timeline (a list of statuses
127
96a7f2432d27 GetTimelines: Allow '#' as hashtag prefix
Mikael Berthe <mikael@lilotux.net>
parents: 120
diff changeset
    17
// timeline can be "home", "public", or a hashtag (use ":hashtag" or "#hashtag")
118
d9c798e09f0a Add an option to get the local timeline
Mikael Berthe <mikael@lilotux.net>
parents: 98
diff changeset
    18
// For the public timelines, you can set 'local' to true to get only the
d9c798e09f0a Add an option to get the local timeline
Mikael Berthe <mikael@lilotux.net>
parents: 98
diff changeset
    19
// local instance.
156
70aadba26338 Add field "All" to LimitParams, change Limit behaviour
Mikael Berthe <mikael@lilotux.net>
parents: 155
diff changeset
    20
// If lopt.All is true, several requests will be made until the API server
70aadba26338 Add field "All" to LimitParams, change Limit behaviour
Mikael Berthe <mikael@lilotux.net>
parents: 155
diff changeset
    21
// has nothing to return.
70aadba26338 Add field "All" to LimitParams, change Limit behaviour
Mikael Berthe <mikael@lilotux.net>
parents: 155
diff changeset
    22
// If lopt.Limit is set (and not All), several queries can be made until the
70aadba26338 Add field "All" to LimitParams, change Limit behaviour
Mikael Berthe <mikael@lilotux.net>
parents: 155
diff changeset
    23
// limit is reached.
149
5f922977d7c7 Add support for limits and paging ({since,max}_id) API parameters
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    24
func (mc *Client) GetTimelines(timeline string, local bool, lopt *LimitParams) ([]Status, error) {
88
df00ec8423fe Add timelines support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    25
	var endPoint string
df00ec8423fe Add timelines support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    26
118
d9c798e09f0a Add an option to get the local timeline
Mikael Berthe <mikael@lilotux.net>
parents: 98
diff changeset
    27
	switch {
d9c798e09f0a Add an option to get the local timeline
Mikael Berthe <mikael@lilotux.net>
parents: 98
diff changeset
    28
	case timeline == "home", timeline == "public":
88
df00ec8423fe Add timelines support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    29
		endPoint = "timelines/" + timeline
127
96a7f2432d27 GetTimelines: Allow '#' as hashtag prefix
Mikael Berthe <mikael@lilotux.net>
parents: 120
diff changeset
    30
	case strings.HasPrefix(timeline, ":"), strings.HasPrefix(timeline, "#"):
94
beee0238a82e Timelines: fix hashtag timelines
Mikael Berthe <mikael@lilotux.net>
parents: 92
diff changeset
    31
		hashtag := timeline[1:]
beee0238a82e Timelines: fix hashtag timelines
Mikael Berthe <mikael@lilotux.net>
parents: 92
diff changeset
    32
		if hashtag == "" {
120
579912e9d0ef Refactor API calls
Mikael Berthe <mikael@lilotux.net>
parents: 118
diff changeset
    33
			return nil, fmt.Errorf("timelines API: empty hashtag")
94
beee0238a82e Timelines: fix hashtag timelines
Mikael Berthe <mikael@lilotux.net>
parents: 92
diff changeset
    34
		}
beee0238a82e Timelines: fix hashtag timelines
Mikael Berthe <mikael@lilotux.net>
parents: 92
diff changeset
    35
		endPoint = "timelines/tag/" + hashtag
118
d9c798e09f0a Add an option to get the local timeline
Mikael Berthe <mikael@lilotux.net>
parents: 98
diff changeset
    36
	default:
120
579912e9d0ef Refactor API calls
Mikael Berthe <mikael@lilotux.net>
parents: 118
diff changeset
    37
		return nil, fmt.Errorf("GetTimelines: bad timelines argument")
118
d9c798e09f0a Add an option to get the local timeline
Mikael Berthe <mikael@lilotux.net>
parents: 98
diff changeset
    38
	}
d9c798e09f0a Add an option to get the local timeline
Mikael Berthe <mikael@lilotux.net>
parents: 98
diff changeset
    39
120
579912e9d0ef Refactor API calls
Mikael Berthe <mikael@lilotux.net>
parents: 118
diff changeset
    40
	params := make(apiCallParams)
579912e9d0ef Refactor API calls
Mikael Berthe <mikael@lilotux.net>
parents: 118
diff changeset
    41
	if timeline == "public" && local {
579912e9d0ef Refactor API calls
Mikael Berthe <mikael@lilotux.net>
parents: 118
diff changeset
    42
		params["local"] = "true"
88
df00ec8423fe Add timelines support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    43
	}
df00ec8423fe Add timelines support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    44
120
579912e9d0ef Refactor API calls
Mikael Berthe <mikael@lilotux.net>
parents: 118
diff changeset
    45
	var tl []Status
155
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 149
diff changeset
    46
	var links apiLinks
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 149
diff changeset
    47
	if err := mc.apiCall(endPoint, rest.Get, params, lopt, &links, &tl); err != nil {
120
579912e9d0ef Refactor API calls
Mikael Berthe <mikael@lilotux.net>
parents: 118
diff changeset
    48
		return nil, err
88
df00ec8423fe Add timelines support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    49
	}
155
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 149
diff changeset
    50
	if lopt != nil { // Fetch more pages to reach our limit
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 149
diff changeset
    51
		var statusSlice []Status
156
70aadba26338 Add field "All" to LimitParams, change Limit behaviour
Mikael Berthe <mikael@lilotux.net>
parents: 155
diff changeset
    52
		for (lopt.All || lopt.Limit > len(tl)) && links.next != nil {
155
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 149
diff changeset
    53
			newlopt := links.next
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 149
diff changeset
    54
			links = apiLinks{}
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 149
diff changeset
    55
			if err := mc.apiCall(endPoint, rest.Get, params, newlopt, &links, &statusSlice); err != nil {
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 149
diff changeset
    56
				return nil, err
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 149
diff changeset
    57
			}
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 149
diff changeset
    58
			tl = append(tl, statusSlice...)
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 149
diff changeset
    59
			statusSlice = statusSlice[:0] // Clear struct
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 149
diff changeset
    60
		}
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 149
diff changeset
    61
	}
88
df00ec8423fe Add timelines support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    62
	return tl, nil
df00ec8423fe Add timelines support
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    63
}