Implement parsing of whole inbox state

This commit is contained in:
Alessio 2023-06-22 19:42:16 -03:00
parent 7c25648cbf
commit 369616aeec
4 changed files with 76 additions and 3 deletions

View File

@ -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
}

View File

@ -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
View 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)
}

File diff suppressed because one or more lines are too long