83 lines
2.2 KiB
Go
Raw Normal View History

2021-11-07 21:10:24 -08:00
package scraper
import (
2022-03-13 17:09:43 -07:00
"net/url"
"strconv"
"strings"
2021-11-07 21:10:24 -08:00
)
2021-12-12 18:42:27 -08:00
type PollID int64
2021-11-07 21:10:24 -08:00
type Poll struct {
ID PollID `db:"id"`
TweetID TweetID `db:"tweet_id"`
NumChoices int `db:"num_choices"`
Choice1 string `db:"choice1"`
Choice1_Votes int `db:"choice1_votes"`
Choice2 string `db:"choice2"`
Choice2_Votes int `db:"choice2_votes"`
Choice3 string `db:"choice3"`
Choice3_Votes int `db:"choice3_votes"`
Choice4 string `db:"choice4"`
Choice4_Votes int `db:"choice4_votes"`
VotingDuration int `db:"voting_duration"` // In seconds
VotingEndsAt Timestamp `db:"voting_ends_at"`
2021-11-07 21:10:24 -08:00
2022-03-13 17:09:43 -07:00
LastUpdatedAt Timestamp `db:"last_scraped_at"`
2021-11-07 21:10:24 -08:00
}
func ParseAPIPoll(apiCard APICard) Poll {
2022-03-13 17:09:43 -07:00
card_url, err := url.Parse(apiCard.ShortenedUrl)
if err != nil {
panic(err)
}
id := int_or_panic(card_url.Hostname())
2021-12-12 18:42:27 -08:00
2022-03-13 17:09:43 -07:00
ret := Poll{}
ret.ID = PollID(id)
ret.NumChoices = parse_num_choices(apiCard.Name)
ret.VotingDuration = int_or_panic(apiCard.BindingValues.DurationMinutes.StringValue) * 60
ret.VotingEndsAt, err = TimestampFromString(apiCard.BindingValues.EndDatetimeUTC.StringValue)
if err != nil {
panic(err)
}
ret.LastUpdatedAt, err = TimestampFromString(apiCard.BindingValues.LastUpdatedAt.StringValue)
if err != nil {
panic(err)
}
2021-11-07 21:10:24 -08:00
2022-03-13 17:09:43 -07:00
ret.Choice1 = apiCard.BindingValues.Choice1.StringValue
ret.Choice1_Votes = int_or_panic(apiCard.BindingValues.Choice1_Count.StringValue)
ret.Choice2 = apiCard.BindingValues.Choice2.StringValue
ret.Choice2_Votes = int_or_panic(apiCard.BindingValues.Choice2_Count.StringValue)
2021-11-07 21:10:24 -08:00
2022-03-13 17:09:43 -07:00
if ret.NumChoices > 2 {
ret.Choice3 = apiCard.BindingValues.Choice3.StringValue
ret.Choice3_Votes = int_or_panic(apiCard.BindingValues.Choice3_Count.StringValue)
}
if ret.NumChoices > 3 {
ret.Choice4 = apiCard.BindingValues.Choice4.StringValue
ret.Choice4_Votes = int_or_panic(apiCard.BindingValues.Choice4_Count.StringValue)
}
2021-11-07 21:10:24 -08:00
2022-03-13 17:09:43 -07:00
return ret
2021-11-07 21:10:24 -08:00
}
func parse_num_choices(card_name string) int {
2022-03-13 17:09:43 -07:00
if strings.Index(card_name, "poll") != 0 || strings.Index(card_name, "choice") != 5 {
panic("Not valid card name: " + card_name)
}
2021-11-07 21:10:24 -08:00
2022-03-13 17:09:43 -07:00
return int_or_panic(card_name[4:5])
2021-11-07 21:10:24 -08:00
}
func int_or_panic(s string) int {
2022-03-13 17:09:43 -07:00
result, err := strconv.Atoi(s)
if err != nil {
panic(err)
}
return result
2021-11-07 21:10:24 -08:00
}