diff --git a/cmd/twitter/main.go b/cmd/twitter/main.go index e636ad3..a4bfd2c 100644 --- a/cmd/twitter/main.go +++ b/cmd/twitter/main.go @@ -215,6 +215,15 @@ func main() { } send_dm(target, args[2], val) } + case "send_dm_reacc": + if len(args) != 4 { + die("", true, 1) + } + val, err := strconv.Atoi(args[2]) + if err != nil { + panic(err) + } + send_dm_reacc(args[1], val, args[3]) // room, message, emoji default: die(fmt.Sprintf("Invalid operation: %s", operation), true, 3) } @@ -546,3 +555,20 @@ func send_dm(room_id string, text string, in_reply_to_id int) { profile.SaveTweetTrove(trove, true) happy_exit(fmt.Sprintf("Saved %d messages from %d chats", len(trove.Messages), len(trove.Rooms)), nil) } + +func send_dm_reacc(room_id string, in_reply_to_id int, reacc string) { + room, err := profile.GetChatRoom(scraper.DMChatRoomID(room_id)) + if err != nil { + die(fmt.Sprintf("No such chat room: %d", in_reply_to_id), false, 1) + } + _, err = profile.GetChatMessage(scraper.DMMessageID(in_reply_to_id)) + if err != nil { + die(fmt.Sprintf("No such message: %d", in_reply_to_id), false, 1) + } + err = scraper.SendDMReaction(room.ID, scraper.DMMessageID(in_reply_to_id), reacc) + if err != nil { + die(fmt.Sprintf("Failed to react to message:\n %s", err.Error()), false, 1) + } + + happy_exit("Sent the reaction", nil) +} diff --git a/internal/webserver/handler_messages.go b/internal/webserver/handler_messages.go index 16161c2..e2c9ca5 100644 --- a/internal/webserver/handler_messages.go +++ b/internal/webserver/handler_messages.go @@ -8,6 +8,7 @@ import ( "net/http" "strconv" "strings" + "time" "gitlab.com/offline-twitter/twitter_offline_engine/pkg/persistence" "gitlab.com/offline-twitter/twitter_offline_engine/pkg/scraper" @@ -77,6 +78,30 @@ func (app *Application) message_detail(w http.ResponseWriter, r *http.Request) { return } + // Handle reactions + if len(parts) == 1 && parts[0] == "reacc" { + var data struct { + MessageID scraper.DMMessageID `json:"message_id,string"` + Reacc string `json:"reacc"` + } + data_, err := io.ReadAll(r.Body) + panic_if(err) + panic_if(json.Unmarshal(data_, &data)) + panic_if(scraper.SendDMReaction(room_id, data.MessageID, data.Reacc)) + + dm_message := global_data.Messages[data.MessageID] + dm_message.Reactions[app.ActiveUser.ID] = scraper.DMReaction{ + ID: 0, // Hopefully will be OK temporarily + DMMessageID: dm_message.ID, + SenderID: app.ActiveUser.ID, + SentAt: scraper.Timestamp{time.Now()}, + Emoji: data.Reacc, + } + global_data.Messages[dm_message.ID] = dm_message + app.buffered_render_htmx(w, "message", global_data, dm_message) + return + } + // First send a message, if applicable if is_sending { app.message_send(w, r) diff --git a/internal/webserver/tpl/tweet_page_includes/chat_view.tpl b/internal/webserver/tpl/tweet_page_includes/chat_view.tpl index 25dd415..6209538 100644 --- a/internal/webserver/tpl/tweet_page_includes/chat_view.tpl +++ b/internal/webserver/tpl/tweet_page_includes/chat_view.tpl @@ -1,7 +1,7 @@ {{define "message"}} {{$user := (user .SenderID)}} {{$is_us := (eq .SenderID (active_user).ID)}} -