Add current user ID to notifications' UserID field (notification recient) when parsing

- also make an enum for notification types instead of magic numbers in the code
This commit is contained in:
Alessio 2024-08-25 22:48:09 -07:00
parent fae23cc243
commit e94327b153
3 changed files with 34 additions and 9 deletions

View File

@ -7,7 +7,8 @@ import (
"strings" "strings"
) )
func (api API) GetNotifications(cursor string) (TweetResponse, error) { // TODO: pagination
func (api *API) GetNotifications(cursor string) (TweetResponse, error) {
url, err := url.Parse("https://api.twitter.com/2/notifications/all.json") url, err := url.Parse("https://api.twitter.com/2/notifications/all.json")
if err != nil { if err != nil {
panic(err) panic(err)
@ -23,7 +24,7 @@ func (api API) GetNotifications(cursor string) (TweetResponse, error) {
return result, err return result, err
} }
func (t *TweetResponse) ToTweetTroveAsNotifications() (TweetTrove, error) { func (t *TweetResponse) ToTweetTroveAsNotifications(current_user_id UserID) (TweetTrove, error) {
ret, err := t.ToTweetTrove() ret, err := t.ToTweetTrove()
if err != nil { if err != nil {
return TweetTrove{}, err return TweetTrove{}, err
@ -45,11 +46,12 @@ func (t *TweetResponse) ToTweetTroveAsNotifications() (TweetTrove, error) {
// Tweet entry (e.g., someone replied to you) // Tweet entry (e.g., someone replied to you)
notification = Notification{ID: NotificationID(notification_id)} notification = Notification{ID: NotificationID(notification_id)}
} }
notification.UserID = current_user_id
notification.SortIndex = entry.SortIndex notification.SortIndex = entry.SortIndex
if strings.Contains(entry.Content.Item.ClientEventInfo.Element, "replied") { if strings.Contains(entry.Content.Item.ClientEventInfo.Element, "replied") {
notification.Type = 4 notification.Type = NOTIFICATION_TYPE_REPLY
} else if strings.Contains(entry.Content.Item.ClientEventInfo.Element, "recommended") { } else if strings.Contains(entry.Content.Item.ClientEventInfo.Element, "recommended") {
notification.Type = 11 notification.Type = NOTIFICATION_TYPE_RECOMMENDED_POST
} }
if entry.Content.Item.Content.Tweet.ID != 0 { if entry.Content.Item.Content.Tweet.ID != 0 {
notification.ActionTweetID = TweetID(entry.Content.Item.Content.Tweet.ID) notification.ActionTweetID = TweetID(entry.Content.Item.Content.Tweet.ID)
@ -90,13 +92,13 @@ func ParseSingleNotification(n APINotification) Notification {
// t.Entities.ReplyMentions = strings.TrimSpace(string([]rune(t.FullText)[0:t.DisplayTextRange[0]])) // t.Entities.ReplyMentions = strings.TrimSpace(string([]rune(t.FullText)[0:t.DisplayTextRange[0]]))
if strings.HasSuffix(n.Message.Text, "followed you") { if strings.HasSuffix(n.Message.Text, "followed you") {
ret.Type = 5 ret.Type = NOTIFICATION_TYPE_FOLLOW
} else if strings.Contains(n.Message.Text, "liked") { } else if strings.Contains(n.Message.Text, "liked") {
ret.Type = 1 ret.Type = NOTIFICATION_TYPE_LIKE
} else if strings.Contains(n.Message.Text, "reposted") { } else if strings.Contains(n.Message.Text, "reposted") {
ret.Type = 2 ret.Type = NOTIFICATION_TYPE_RETWEET
} else if strings.Contains(n.Message.Text, "There was a login to your account") { } else if strings.Contains(n.Message.Text, "There was a login to your account") {
ret.Type = 9 ret.Type = NOTIFICATION_TYPE_LOGIN
} }
// TODO: more types? // TODO: more types?

View File

@ -22,16 +22,19 @@ func TestParseNotificationsPage(t *testing.T) {
err = json.Unmarshal(data, &resp) err = json.Unmarshal(data, &resp)
require.NoError(err) require.NoError(err)
tweet_trove, err := resp.ToTweetTroveAsNotifications() current_user_id := UserID(12345678)
tweet_trove, err := resp.ToTweetTroveAsNotifications(current_user_id)
require.NoError(err) require.NoError(err)
notif1, is_ok := tweet_trove.Notifications["FKncQJGVgAQAAAABSQ3bEYsN6BFN3re-ZsU"] notif1, is_ok := tweet_trove.Notifications["FKncQJGVgAQAAAABSQ3bEYsN6BFN3re-ZsU"]
assert.True(is_ok) assert.True(is_ok)
assert.Equal(9, notif1.Type) // login assert.Equal(9, notif1.Type) // login
assert.Equal(current_user_id, notif1.UserID)
notif2, is_ok := tweet_trove.Notifications["FKncQJGVgAQAAAABSQ3bEYsN6BFaOkNV8aw"] notif2, is_ok := tweet_trove.Notifications["FKncQJGVgAQAAAABSQ3bEYsN6BFaOkNV8aw"]
assert.True(is_ok) assert.True(is_ok)
assert.Equal(2, notif2.Type) // retweet assert.Equal(2, notif2.Type) // retweet
assert.Equal(current_user_id, notif2.UserID)
assert.Equal(UserID(1458284524761075714), notif2.ActionUserID) assert.Equal(UserID(1458284524761075714), notif2.ActionUserID)
assert.Equal(TweetID(1824915465275392037), notif2.ActionTweetID) assert.Equal(TweetID(1824915465275392037), notif2.ActionTweetID)
assert.Equal(TimestampFromUnixMilli(1723928739342), notif2.SentAt) assert.Equal(TimestampFromUnixMilli(1723928739342), notif2.SentAt)
@ -39,21 +42,25 @@ func TestParseNotificationsPage(t *testing.T) {
notif3, is_ok := tweet_trove.Notifications["FKncQJGVgAQAAAABSQ3bEYsN6BE-OY688aw"] notif3, is_ok := tweet_trove.Notifications["FKncQJGVgAQAAAABSQ3bEYsN6BE-OY688aw"]
assert.True(is_ok) assert.True(is_ok)
assert.Equal(1, notif3.Type) // like assert.Equal(1, notif3.Type) // like
assert.Equal(current_user_id, notif3.UserID)
assert.Equal(UserID(1458284524761075714), notif3.ActionUserID) assert.Equal(UserID(1458284524761075714), notif3.ActionUserID)
assert.Equal(TweetID(1824915465275392037), notif3.ActionTweetID) assert.Equal(TweetID(1824915465275392037), notif3.ActionTweetID)
notif4, is_ok := tweet_trove.Notifications["FKncQJGVgAQAAAABSQ3bEYsN6BGLlh8UIQs"] notif4, is_ok := tweet_trove.Notifications["FKncQJGVgAQAAAABSQ3bEYsN6BGLlh8UIQs"]
assert.True(is_ok) assert.True(is_ok)
assert.Equal(11, notif4.Type) // recommended assert.Equal(11, notif4.Type) // recommended
assert.Equal(current_user_id, notif4.UserID)
notif5, is_ok := tweet_trove.Notifications["FKncQJGVgAQAAAABSQ3bEYsN6BHS11EvITw"] notif5, is_ok := tweet_trove.Notifications["FKncQJGVgAQAAAABSQ3bEYsN6BHS11EvITw"]
assert.True(is_ok) assert.True(is_ok)
assert.Equal(5, notif5.Type) // followed you assert.Equal(5, notif5.Type) // followed you
assert.Equal(current_user_id, notif5.UserID)
assert.Equal(UserID(28815778), notif5.ActionUserID) assert.Equal(UserID(28815778), notif5.ActionUserID)
notif6, is_ok := tweet_trove.Notifications["FKncQJGVgAQAAAABSQ3bEYsN6BE5ujkCepo"] notif6, is_ok := tweet_trove.Notifications["FKncQJGVgAQAAAABSQ3bEYsN6BE5ujkCepo"]
assert.True(is_ok) assert.True(is_ok)
assert.Equal(1, notif6.Type) assert.Equal(1, notif6.Type)
assert.Equal(current_user_id, notif6.UserID)
assert.Equal(UserID(1458284524761075714), notif6.ActionUserID) assert.Equal(UserID(1458284524761075714), notif6.ActionUserID)
assert.Equal(TweetID(1826778617705115868), notif6.ActionTweetID) assert.Equal(TweetID(1826778617705115868), notif6.ActionTweetID)
assert.Contains(notif6.UserIDs, UserID(1458284524761075714)) assert.Contains(notif6.UserIDs, UserID(1458284524761075714))

View File

@ -2,6 +2,22 @@ package scraper
type NotificationID string type NotificationID string
type NotificationType int
const (
NOTIFICATION_TYPE_LIKE = iota + 1
NOTIFICATION_TYPE_RETWEET
NOTIFICATION_TYPE_QUOTE_TWEET
NOTIFICATION_TYPE_REPLY
NOTIFICATION_TYPE_FOLLOW
NOTIFICATION_TYPE_MENTION
NOTIFICATION_TYPE_USER_IS_LIVE
NOTIFICATION_TYPE_POLL_ENDED
NOTIFICATION_TYPE_LOGIN
NOTIFICATION_TYPE_COMMUNITY_PINNED_POST
NOTIFICATION_TYPE_RECOMMENDED_POST
)
type Notification struct { type Notification struct {
ID NotificationID ID NotificationID
Type int Type int