Implement parsing of whole inbox state
This commit is contained in:
parent
7c25648cbf
commit
369616aeec
@ -55,3 +55,24 @@ type APIInbox struct {
|
||||
type APIDMResponse struct {
|
||||
InboxInitialState APIInbox `json:"inbox_initial_state"`
|
||||
}
|
||||
|
||||
func (r APIDMResponse) ToDMTrove() DMTrove {
|
||||
ret := NewDMTrove()
|
||||
for _, entry := range r.InboxInitialState.Entries {
|
||||
result := ParseAPIDMMessage(entry.Message)
|
||||
ret.Messages[result.ID] = result
|
||||
// TODO: parse Tweet attachments
|
||||
}
|
||||
for _, room := range r.InboxInitialState.Conversations {
|
||||
result := ParseAPIDMChatRoom(room)
|
||||
ret.Rooms[result.ID] = result
|
||||
}
|
||||
for _, u := range r.InboxInitialState.Users {
|
||||
result, err := ParseSingleUser(u)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
ret.TweetTrove.Users[result.ID] = result
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
@ -57,9 +57,8 @@ func TestParseAPIDMMessageWithReaction(t *testing.T) {
|
||||
func TestParseAPIDMConversation(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
data, err := os.ReadFile("test_responses/dms/dm_chat_room.json")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
require.NoError(t, err)
|
||||
|
||||
var api_room APIDMConversation
|
||||
err = json.Unmarshal(data, &api_room)
|
||||
require.NoError(t, err)
|
||||
@ -90,3 +89,30 @@ func TestParseAPIDMConversation(t *testing.T) {
|
||||
assert.Equal(DMMessageID(1663623062195957773), p2.LastReadEventID)
|
||||
assert.False(p2.IsChatSettingsValid)
|
||||
}
|
||||
|
||||
func TestParseInbox(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
data, err := os.ReadFile("test_responses/dms/inbox.json")
|
||||
require.NoError(t, err)
|
||||
|
||||
var inbox APIDMResponse
|
||||
err = json.Unmarshal(data, &inbox)
|
||||
require.NoError(t, err)
|
||||
|
||||
trove := inbox.ToDMTrove()
|
||||
|
||||
for _, id := range []DMMessageID{1663623062195957773, 1663623203644751885, 1665922180176044037, 1665936253483614212} {
|
||||
m, is_ok := trove.Messages[id]
|
||||
assert.True(is_ok, "Message with ID %d not in the trove!")
|
||||
assert.Equal(m.ID, id)
|
||||
}
|
||||
for _, id := range []UserID{1458284524761075714, 1488963321701171204} {
|
||||
u, is_ok := trove.TweetTrove.Users[id]
|
||||
assert.True(is_ok, "User with ID %d not in the trove!")
|
||||
assert.Equal(u.ID, id)
|
||||
}
|
||||
room_id := DMChatRoomID("1458284524761075714-1488963321701171204")
|
||||
room, is_ok := trove.Rooms[room_id]
|
||||
assert.True(is_ok)
|
||||
assert.Equal(room.ID, room_id)
|
||||
}
|
||||
|
25
scraper/dm_trove.go
Normal file
25
scraper/dm_trove.go
Normal file
@ -0,0 +1,25 @@
|
||||
package scraper
|
||||
|
||||
type DMTrove struct {
|
||||
Rooms map[DMChatRoomID]DMChatRoom
|
||||
Messages map[DMMessageID]DMMessage
|
||||
TweetTrove TweetTrove
|
||||
}
|
||||
|
||||
func NewDMTrove() DMTrove {
|
||||
ret := DMTrove{}
|
||||
ret.Rooms = make(map[DMChatRoomID]DMChatRoom)
|
||||
ret.Messages = make(map[DMMessageID]DMMessage)
|
||||
ret.TweetTrove = NewTweetTrove()
|
||||
return ret
|
||||
}
|
||||
|
||||
func (t1 *DMTrove) MergeWith(t2 DMTrove) {
|
||||
for id, val := range t2.Rooms {
|
||||
t1.Rooms[id] = val
|
||||
}
|
||||
for id, val := range t2.Messages {
|
||||
t1.Messages[id] = val
|
||||
}
|
||||
t1.TweetTrove.MergeWith(t2.TweetTrove)
|
||||
}
|
1
scraper/test_responses/dms/inbox.json
Normal file
1
scraper/test_responses/dms/inbox.json
Normal file
File diff suppressed because one or more lines are too long
Loading…
x
Reference in New Issue
Block a user