114 lines
2.9 KiB
Go
114 lines
2.9 KiB
Go
package scraper
|
|
|
|
import (
|
|
log "github.com/sirupsen/logrus"
|
|
)
|
|
|
|
type DMTrove struct {
|
|
Rooms map[DMChatRoomID]DMChatRoom
|
|
Messages map[DMMessageID]DMMessage
|
|
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)
|
|
}
|
|
|
|
func (t DMTrove) GetOldestMessage(id DMChatRoomID) DMMessageID {
|
|
oldest := DMMessageID(^uint(0) >> 1) // Max integer
|
|
for _, m := range t.Messages {
|
|
if m.ID < oldest && m.DMChatRoomID == id {
|
|
oldest = m.ID
|
|
}
|
|
}
|
|
return oldest
|
|
}
|
|
|
|
// Returns a DMTrove and the cursor for the next update
|
|
func GetInbox(how_many int) (DMTrove, string) {
|
|
if !the_api.IsAuthenticated {
|
|
log.Fatalf("Fetching DMs can only be done when authenticated. Please provide `--session [user]`")
|
|
}
|
|
dm_response, err := the_api.GetDMInbox()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
trove := dm_response.ToDMTrove()
|
|
cursor := dm_response.Cursor
|
|
next_cursor_id := dm_response.InboxTimelines.Trusted.MinEntryID
|
|
for len(trove.Rooms) < how_many && dm_response.Status != "AT_END" {
|
|
dm_response, err = the_api.GetInboxTrusted(next_cursor_id)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
next_trove := dm_response.ToDMTrove()
|
|
next_cursor_id = dm_response.MinEntryID
|
|
trove.MergeWith(next_trove)
|
|
}
|
|
|
|
return trove, cursor
|
|
}
|
|
|
|
func GetConversation(id DMChatRoomID, max_id DMMessageID, how_many int) DMTrove {
|
|
if !the_api.IsAuthenticated {
|
|
log.Fatalf("Fetching DMs can only be done when authenticated. Please provide `--session [user]`")
|
|
}
|
|
dm_response, err := the_api.GetDMConversation(id, max_id)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
trove := dm_response.ToDMTrove()
|
|
oldest := trove.GetOldestMessage(id)
|
|
for len(trove.Messages) < how_many && dm_response.Status != "AT_END" {
|
|
dm_response, err = the_api.GetDMConversation(id, oldest)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
next_trove := dm_response.ToDMTrove()
|
|
oldest = next_trove.GetOldestMessage(id)
|
|
trove.MergeWith(next_trove)
|
|
}
|
|
|
|
return trove
|
|
}
|
|
|
|
// Returns a DMTrove and the cursor for the next update
|
|
func PollInboxUpdates(cursor string) (DMTrove, string) {
|
|
if !the_api.IsAuthenticated {
|
|
log.Fatalf("Fetching DMs can only be done when authenticated. Please provide `--session [user]`")
|
|
}
|
|
dm_response, err := the_api.PollInboxUpdates(cursor)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
return dm_response.ToDMTrove(), dm_response.Cursor
|
|
}
|
|
|
|
func SendDMMessage(room_id DMChatRoomID, text string, in_reply_to_id DMMessageID) DMTrove {
|
|
if !the_api.IsAuthenticated {
|
|
log.Fatalf("Fetching DMs can only be done when authenticated. Please provide `--session [user]`")
|
|
}
|
|
dm_response, err := the_api.SendDMMessage(room_id, text, in_reply_to_id)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
return dm_response.ToDMTrove()
|
|
}
|