@@ -15,6 +15,8 @@ import (
1515 "go.mau.fi/util/ptr"
1616 "go.mau.fi/util/variationselector"
1717 "go.mau.fi/whatsmeow"
18+ "go.mau.fi/whatsmeow/appstate"
19+ "go.mau.fi/whatsmeow/proto/waCommon"
1820 "go.mau.fi/whatsmeow/proto/waE2E"
1921 "go.mau.fi/whatsmeow/types"
2022 "golang.org/x/image/draw"
4042 _ bridgev2.RoomNameHandlingNetworkAPI = (* WhatsAppClient )(nil )
4143 _ bridgev2.RoomTopicHandlingNetworkAPI = (* WhatsAppClient )(nil )
4244 _ bridgev2.RoomAvatarHandlingNetworkAPI = (* WhatsAppClient )(nil )
45+ _ bridgev2.MuteHandlingNetworkAPI = (* WhatsAppClient )(nil )
46+ _ bridgev2.TagHandlingNetworkAPI = (* WhatsAppClient )(nil )
47+ _ bridgev2.MarkedUnreadHandlingNetworkAPI = (* WhatsAppClient )(nil )
4348)
4449
4550func (wa * WhatsAppClient ) HandleMatrixPollStart (ctx context.Context , msg * bridgev2.MatrixPollStart ) (* bridgev2.MatrixMessageResponse , error ) {
@@ -566,3 +571,57 @@ func convertRoomAvatar(data []byte) ([]byte, error) {
566571 }
567572 return buf .Bytes (), nil
568573}
574+
575+ func (wa * WhatsAppClient ) HandleMute (ctx context.Context , msg * bridgev2.MatrixMute ) error {
576+ chatJID , err := waid .ParsePortalID (msg .Portal .ID )
577+ if err != nil {
578+ return err
579+ }
580+ mutedUntil := msg .Content .GetMutedUntilTime ()
581+ muted := mutedUntil .After (time .Now ())
582+ muteTS := ptr .Ptr (mutedUntil .UnixMilli ())
583+ if ! muted || mutedUntil == event .MutedForever {
584+ muteTS = nil
585+ }
586+ return wa .Client .SendAppState (ctx , appstate .BuildMuteAbs (chatJID , muted , muteTS ))
587+ }
588+
589+ func (wa * WhatsAppClient ) HandleRoomTag (ctx context.Context , msg * bridgev2.MatrixRoomTag ) error {
590+ chatJID , err := waid .ParsePortalID (msg .Portal .ID )
591+ if err != nil {
592+ return err
593+ }
594+ _ , isFavorite := msg .Content .Tags [event .RoomTagFavourite ]
595+ return wa .Client .SendAppState (ctx , appstate .BuildPin (chatJID , isFavorite ))
596+ }
597+
598+ func (wa * WhatsAppClient ) HandleMarkedUnread (ctx context.Context , msg * bridgev2.MatrixMarkedUnread ) error {
599+ chatJID , err := waid .ParsePortalID (msg .Portal .ID )
600+ if err != nil {
601+ return err
602+ }
603+ msgs , err := wa .Main .Bridge .DB .Message .GetLastNInPortal (ctx , msg .Portal .PortalKey , 1 )
604+ if err != nil {
605+ return fmt .Errorf ("failed to get last message in portal: %w" , err )
606+ }
607+ var lastTS time.Time
608+ var lastKey * waCommon.MessageKey
609+ if len (msgs ) == 1 {
610+ lastTS = msgs [0 ].Timestamp
611+ parsed , _ := waid .ParseMessageID (msgs [0 ].ID )
612+ if parsed != nil {
613+ fromMe := parsed .Sender .ToNonAD () == wa .JID .ToNonAD () || parsed .Sender .ToNonAD () == wa .GetStore ().GetLID ().ToNonAD ()
614+ var participant * string
615+ if chatJID .Server == types .GroupServer {
616+ participant = ptr .Ptr (parsed .Sender .String ())
617+ }
618+ lastKey = & waCommon.MessageKey {
619+ RemoteJID : ptr .Ptr (chatJID .String ()),
620+ FromMe : & fromMe ,
621+ ID : & parsed .ID ,
622+ Participant : participant ,
623+ }
624+ }
625+ }
626+ return wa .Client .SendAppState (ctx , appstate .BuildMarkChatAsRead (chatJID , msg .Content .Unread , lastTS , lastKey ))
627+ }
0 commit comments