ID fields are now Hungarian-notated
- tweet.User is now a pointer to a User object; tweet.UserID holds the user id
This commit is contained in:
parent
741c508017
commit
96e2edfb8a
@ -47,14 +47,14 @@ func display_feed(user scraper.User, tweets []scraper.Tweet, retweets []scraper.
|
||||
for i < len(tweets) && j < len(retweets) {
|
||||
if !tweets[i].PostedAt.Before(retweets[j].RetweetedAt) {
|
||||
tweet := tweets[i]
|
||||
if tweet.User != user.ID {
|
||||
if tweet.UserID != user.ID {
|
||||
i += 1
|
||||
continue
|
||||
}
|
||||
|
||||
user, ok := users_dict[tweet.User]
|
||||
user, ok := users_dict[tweet.UserID]
|
||||
if !ok {
|
||||
log.Fatalf("User not found: %q", tweet.User)
|
||||
log.Fatalf("User not found: %q", tweet.UserID)
|
||||
}
|
||||
|
||||
print_tweet(tweets[i], user)
|
||||
@ -69,9 +69,9 @@ func display_feed(user scraper.User, tweets []scraper.Tweet, retweets []scraper.
|
||||
if !ok {
|
||||
log.Fatalf("Tweet not found: %q", retweet.TweetID)
|
||||
}
|
||||
original_poster, ok := users_dict[tweet.User]
|
||||
original_poster, ok := users_dict[tweet.UserID]
|
||||
if !ok {
|
||||
log.Fatalf("User not found: %q", tweet.User)
|
||||
log.Fatalf("User not found: %q", tweet.UserID)
|
||||
}
|
||||
retweeter, ok := users_dict[retweet.RetweetedBy]
|
||||
if !ok {
|
||||
@ -83,14 +83,14 @@ func display_feed(user scraper.User, tweets []scraper.Tweet, retweets []scraper.
|
||||
}
|
||||
for i < len(tweets) {
|
||||
tweet := tweets[i]
|
||||
if tweet.User != user.ID {
|
||||
if tweet.UserID != user.ID {
|
||||
i += 1
|
||||
continue
|
||||
}
|
||||
|
||||
user, ok := users_dict[tweet.User]
|
||||
user, ok := users_dict[tweet.UserID]
|
||||
if !ok {
|
||||
log.Fatalf("User not found: %q", tweet.User)
|
||||
log.Fatalf("User not found: %q", tweet.UserID)
|
||||
}
|
||||
|
||||
print_tweet(tweets[i], user)
|
||||
@ -106,9 +106,9 @@ func display_feed(user scraper.User, tweets []scraper.Tweet, retweets []scraper.
|
||||
if !ok {
|
||||
log.Fatalf("Tweet not found: %q", retweet.TweetID)
|
||||
}
|
||||
original_poster, ok := users_dict[tweet.User]
|
||||
original_poster, ok := users_dict[tweet.UserID]
|
||||
if !ok {
|
||||
log.Fatalf("User not found: %q", tweet.User)
|
||||
log.Fatalf("User not found: %q", tweet.UserID)
|
||||
}
|
||||
retweeter, ok := users_dict[retweet.RetweetedBy]
|
||||
if !ok {
|
||||
|
@ -21,6 +21,7 @@ curl \
|
||||
|
||||
#
|
||||
# A tweet and replies (conversation):
|
||||
-----------------------------------NOTE: this one doesn't work, because it's missing a lot of GET params!-----------------------------------
|
||||
curl \
|
||||
-H "Authorization: Bearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA" \
|
||||
-H "X-Guest-Token: 1396177150890348547" \
|
||||
|
@ -14,12 +14,14 @@ create table users (rowid integer primary key,
|
||||
is_verified boolean default 0,
|
||||
profile_image_url text,
|
||||
banner_image_url text,
|
||||
pinned_tweet integer
|
||||
pinned_tweet_id integer
|
||||
|
||||
-- foreign key(pinned_tweet_id) references tweets(id)
|
||||
);
|
||||
|
||||
create table tweets (rowid integer primary key,
|
||||
id integer unique not null,
|
||||
user integer not null,
|
||||
user_id integer not null,
|
||||
text text not null,
|
||||
posted_at integer,
|
||||
num_likes integer,
|
||||
@ -32,9 +34,9 @@ create table tweets (rowid integer primary key,
|
||||
mentions text, -- comma-separated
|
||||
hashtags text, -- comma-separated
|
||||
|
||||
foreign key(user) references users(id),
|
||||
foreign key(in_reply_to) references tweets(id),
|
||||
foreign key(quoted_tweet) references tweets(id)
|
||||
foreign key(user_id) references users(id)
|
||||
-- foreign key(in_reply_to) references tweets(id),
|
||||
-- foreign key(quoted_tweet) references tweets(id)
|
||||
);
|
||||
|
||||
create table retweets(rowid integer primary key,
|
||||
|
@ -5,16 +5,18 @@ import (
|
||||
)
|
||||
|
||||
type Retweet struct {
|
||||
RetweetID TweetID
|
||||
TweetID TweetID
|
||||
RetweetedBy UserID
|
||||
RetweetedAt time.Time
|
||||
RetweetID TweetID
|
||||
TweetID TweetID
|
||||
Tweet *Tweet
|
||||
RetweetedByID UserID
|
||||
RetweetedBy *User
|
||||
RetweetedAt time.Time
|
||||
}
|
||||
|
||||
func ParseSingleRetweet(apiTweet APITweet) (ret Retweet, err error) {
|
||||
ret.RetweetID = TweetID(apiTweet.ID)
|
||||
ret.TweetID = TweetID(apiTweet.RetweetedStatusIDStr)
|
||||
ret.RetweetedBy = UserID(apiTweet.UserIDStr)
|
||||
ret.RetweetedByID = UserID(apiTweet.UserIDStr)
|
||||
ret.RetweetedAt, err = time.Parse(time.RubyDate, apiTweet.CreatedAt)
|
||||
return
|
||||
}
|
||||
|
@ -11,7 +11,8 @@ type TweetID string
|
||||
|
||||
type Tweet struct {
|
||||
ID TweetID
|
||||
User UserID
|
||||
UserID UserID
|
||||
User *User
|
||||
Text string
|
||||
PostedAt time.Time
|
||||
NumLikes int
|
||||
@ -32,7 +33,7 @@ func (t Tweet) String() string {
|
||||
return fmt.Sprintf(
|
||||
`ID %s, User %s: %q (%s). Likes: %d, Retweets: %d, QTs: %d, Replies: %d.
|
||||
Urls: %v Images: %v Mentions: %v Hashtags: %v`,
|
||||
t.ID, t.User, t.Text, t.PostedAt, t.NumLikes, t.NumRetweets, t.NumQuoteTweets, t.NumReplies, t.Urls, t.Images, t.Mentions, t.Hashtags)
|
||||
t.ID, t.UserID, t.Text, t.PostedAt, t.NumLikes, t.NumRetweets, t.NumQuoteTweets, t.NumReplies, t.Urls, t.Images, t.Mentions, t.Hashtags)
|
||||
}
|
||||
|
||||
// Turn an APITweet, as returned from the scraper, into a properly structured Tweet object
|
||||
@ -40,7 +41,7 @@ func ParseSingleTweet(apiTweet APITweet) (ret Tweet, err error) {
|
||||
apiTweet.NormalizeContent()
|
||||
|
||||
ret.ID = TweetID(apiTweet.ID)
|
||||
ret.User = UserID(apiTweet.UserIDStr)
|
||||
ret.UserID = UserID(apiTweet.UserIDStr)
|
||||
ret.Text = apiTweet.FullText
|
||||
|
||||
ret.PostedAt, err = time.Parse(time.RubyDate, apiTweet.CreatedAt)
|
||||
|
@ -31,7 +31,8 @@ type User struct {
|
||||
IsVerified bool
|
||||
ProfileImageUrl string
|
||||
BannerImageUrl string
|
||||
PinnedTweet TweetID
|
||||
PinnedTweetID TweetID
|
||||
PinnedTweet *Tweet
|
||||
}
|
||||
|
||||
func (u User) String() string {
|
||||
@ -59,7 +60,7 @@ func ParseSingleUser(apiUser APIUser) (ret User, err error) {
|
||||
ret.ProfileImageUrl = apiUser.ProfileImageURLHTTPS
|
||||
ret.BannerImageUrl = apiUser.ProfileBannerURL
|
||||
if len(apiUser.PinnedTweetIdsStr) > 0 {
|
||||
ret.PinnedTweet = TweetID(apiUser.PinnedTweetIdsStr[0])
|
||||
ret.PinnedTweetID = TweetID(apiUser.PinnedTweetIdsStr[0])
|
||||
}
|
||||
return
|
||||
}
|
||||
|
@ -67,7 +67,7 @@ func TestParseSingleUser(t *testing.T) {
|
||||
if user.BannerImageUrl != expectedBannerImage {
|
||||
t.Errorf("Expected %q, got %q", expectedBannerImage, user.BannerImageUrl)
|
||||
}
|
||||
if user.PinnedTweet != scraper.TweetID("1403835414373339136") {
|
||||
if user.PinnedTweetID != scraper.TweetID("1403835414373339136") {
|
||||
t.Errorf("Expected %q, got %q", scraper.TweetID("1403835414373339136"), user.PinnedTweet)
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user