@@ -15,6 +15,7 @@ import (
15
15
"github.com/42wim/matterbridge/bridge/helper"
16
16
"github.com/42wim/matterircd/bridge"
17
17
"github.com/davecgh/go-spew/spew"
18
+ lru "github.com/hashicorp/golang-lru"
18
19
prefixed "github.com/matterbridge/logrus-prefixed-formatter"
19
20
"github.com/sirupsen/logrus"
20
21
"github.com/spf13/viper"
@@ -32,6 +33,9 @@ type Matrix struct {
32
33
channels map [id.RoomID ]* Channel
33
34
users map [id.UserID ]* User
34
35
sync.RWMutex
36
+
37
+ msgParentCache * lru.Cache
38
+ msgLastSentCache * lru.Cache
35
39
}
36
40
37
41
var logger * logrus.Entry
@@ -45,6 +49,8 @@ func New(v *viper.Viper, cred bridge.Credentials, eventChan chan *bridge.Event,
45
49
dmChannels : make (map [id.RoomID ][]id.UserID ),
46
50
users : make (map [id.UserID ]* User ),
47
51
}
52
+ m .msgParentCache , _ = lru .New (100 )
53
+ m .msgLastSentCache , _ = lru .New (10 )
48
54
49
55
ourlog := logrus .New ()
50
56
ourlog .SetFormatter (& prefixed.TextFormatter {
@@ -285,23 +291,30 @@ func (m *Matrix) handleMessageEvent(source mautrix.EventSource, ev *event.Event)
285
291
}
286
292
287
293
var text string
288
- var parentID string
294
+ var parentID id. EventID
289
295
290
296
switch {
291
297
case ev .Type .String () == "m.text" || ev .Type .String () == "m.room.message" :
292
298
msgEventContent , _ := ev .Content .Parsed .(* event.MessageEventContent )
293
299
text = msgEventContent .Body
294
300
if msgEventContent .RelatesTo != nil {
295
- parentID = msgEventContent .RelatesTo .EventID . String ()
301
+ parentID = msgEventContent .RelatesTo .EventID
296
302
}
297
303
default :
298
304
logger .Warnf ("handleMessageEvent unsupported event type %s" , ev .Type .String ())
299
305
}
300
306
307
+ if ! m .v .GetBool ("matrix.hidereplies" ) && parentID .String () != "" {
308
+ message , err := m .addParentMsg (ev .RoomID , parentID , text , m .v .GetInt ("matrix.shortenrepliesto" ), "@" , m .v .GetBool ("matrix.unicode" ))
309
+ if err != nil {
310
+ logger .Errorf ("Unable to get parent post for %#v" , ev ) //nolint:govet
311
+ }
312
+ text = message
313
+ }
314
+
301
315
m .RLock ()
302
316
_ , ok := m .dmChannels [ev .RoomID ]
303
317
m .RUnlock ()
304
-
305
318
if ok {
306
319
event := & bridge.Event { //nolint:gocritic
307
320
Type : "direct_message" ,
@@ -313,7 +326,7 @@ func (m *Matrix) handleMessageEvent(source mautrix.EventSource, ev *event.Event)
313
326
// Files: m.getFilesFromData(data),
314
327
MessageID : string (ev .ID ),
315
328
// Event: rmsg.Event,
316
- ParentID : parentID ,
329
+ ParentID : parentID . String () ,
317
330
},
318
331
}
319
332
@@ -331,7 +344,7 @@ func (m *Matrix) handleMessageEvent(source mautrix.EventSource, ev *event.Event)
331
344
// Files: m.getFilesFromData(data),
332
345
MessageID : string (ev .ID ),
333
346
// Event: rmsg.Event,
334
- ParentID : parentID ,
347
+ ParentID : parentID . String () ,
335
348
},
336
349
}
337
350
@@ -348,22 +361,30 @@ func (m *Matrix) handleReactionEvent(source mautrix.EventSource, ev *event.Event
348
361
return
349
362
}
350
363
364
+ var text string
351
365
var reaction string
352
- var parentID string
366
+ var parentID id. EventID
353
367
354
368
switch {
355
369
case ev .Type .String () == "m.reaction" :
356
370
reactionEventContent , _ := ev .Content .Parsed .(* event.ReactionEventContent )
357
371
reaction = reactionEventContent .RelatesTo .Key
358
- parentID = reactionEventContent .RelatesTo .EventID . String ()
372
+ parentID = reactionEventContent .RelatesTo .EventID
359
373
default :
360
374
logger .Warnf ("handleEvent unsupported event type %s" , ev .Type .String ())
361
375
}
362
376
377
+ if ! m .v .GetBool ("matrix.hidereplies" ) {
378
+ message , err := m .addParentMsg (ev .RoomID , parentID , text , m .v .GetInt ("matrix.shortenrepliesto" ), "@" , m .v .GetBool ("matrix.unicode" ))
379
+ if err != nil {
380
+ logger .Errorf ("Unable to get parent post for %#v" , ev ) //nolint:govet
381
+ }
382
+ text = message
383
+ }
384
+
363
385
m .RLock ()
364
386
_ , ok := m .dmChannels [ev .RoomID ]
365
387
m .RUnlock ()
366
-
367
388
channelType := ""
368
389
if ok {
369
390
channelType = "D"
@@ -377,8 +398,8 @@ func (m *Matrix) handleReactionEvent(source mautrix.EventSource, ev *event.Event
377
398
Sender : ghost ,
378
399
Reaction : reaction ,
379
400
ChannelType : channelType ,
380
- Message : "" ,
381
- ParentID : parentID ,
401
+ Message : text ,
402
+ ParentID : parentID . String () ,
382
403
},
383
404
}
384
405
@@ -498,6 +519,7 @@ func (m *Matrix) MsgChannelThread(channelID, parentID, text string) (string, err
498
519
499
520
logger .Trace ("msgchannelthread: error,resp " , err , resp )
500
521
522
+ m .msgLastSentCache .Add (resp .EventID .String (), fmt .Sprintf ("%s: %s" , id .RoomAlias (channelID ), text ))
501
523
return resp .EventID .String (), nil
502
524
}
503
525
@@ -592,7 +614,8 @@ func (m *Matrix) GetChannelUsers(channelID string) ([]*bridge.UserInfo, error) {
592
614
return nil , err
593
615
}
594
616
595
- logger .Tracef ("GetChannelUsers %s %d" , channelID , len (resp .Joined ))
617
+ logger .Debugf ("GetChannelUsers %s %d" , channelID , len (resp .Joined ))
618
+ logger .Tracef ("GetChannelUsers %s" , spew .Sdump (resp .Joined ))
596
619
597
620
for user := range resp .Joined {
598
621
users = append (users , m .createUser (user ))
@@ -606,6 +629,7 @@ func (m *Matrix) GetUsers() []*bridge.UserInfo {
606
629
607
630
logger .Trace ("GetUsers " , m .users )
608
631
logger .Trace ("GetUsers " , spew .Sdump (m .users ))
632
+ logger .Debugf ("GetUsers %d" , len (m .users ))
609
633
610
634
m .RLock ()
611
635
for userID := range m .users {
@@ -625,6 +649,8 @@ func (m *Matrix) GetChannels() []*bridge.ChannelInfo {
625
649
m .RLock ()
626
650
defer m .RUnlock ()
627
651
652
+ logger .Tracef ("GetChannels %s" , spew .Sdump (m .channels ))
653
+
628
654
for roomID , channel := range m .channels {
629
655
channel .RLock ()
630
656
@@ -644,6 +670,8 @@ func (m *Matrix) GetChannels() []*bridge.ChannelInfo {
644
670
Private : false ,
645
671
})
646
672
673
+ logger .Debugf ("GetChannels %s (%s)" , channel .Alias .String (), roomID .String ())
674
+
647
675
channel .RUnlock ()
648
676
}
649
677
@@ -761,6 +789,39 @@ func isValidNick(s string) bool {
761
789
return true
762
790
}
763
791
792
+ func (m * Matrix ) addParentMsg (roomID id.RoomID , parentID id.EventID , msg string , newLen int , uncounted string , unicode bool ) (string , error ) {
793
+ var replyMessage string
794
+
795
+ // Search and use cached reply if it exists.
796
+ // None found, so we'll need to create one and save it for future uses.
797
+ if v , ok := m .msgParentCache .Get (parentID ); ! ok {
798
+ resp , err := m .mc .GetEvent (roomID , parentID )
799
+ // Retry once on failure.
800
+ if err != nil {
801
+ resp , err = m .mc .GetEvent (roomID , parentID )
802
+ }
803
+ if err != nil {
804
+ return msg , err
805
+ }
806
+
807
+ body := ""
808
+ if val , ok := resp .Content .Raw ["body" ]; ok {
809
+ body = val .(string )
810
+ }
811
+
812
+ parentUser := m .GetUser (resp .Sender .String ())
813
+ parentMessage := maybeShorten (body , newLen , uncounted , unicode )
814
+ replyMessage = fmt .Sprintf (" (re @%s: %s)" , parentUser .Nick , parentMessage )
815
+ logger .Debugf ("Created reply for parent post %s:%s" , parentID .String (), replyMessage )
816
+
817
+ m .msgParentCache .Add (parentID , replyMessage )
818
+ } else if replyMessage , ok = v .(string ); ok {
819
+ logger .Debugf ("Found saved reply for parent post %s, using:%s" , parentID , replyMessage )
820
+ }
821
+
822
+ return strings .TrimRight (msg , "\n " ) + replyMessage , nil
823
+ }
824
+
764
825
// maybeShorten returns a prefix of msg that is approximately newLen
765
826
// characters long, followed by "...". Words that start with uncounted
766
827
// are included in the result but are not reckoned against newLen.
@@ -840,7 +901,7 @@ func (m *Matrix) SearchUsers(query string) ([]*bridge.UserInfo, error) {
840
901
return brusers , nil
841
902
}
842
903
843
- func (m * Matrix ) GetPostThread (channelID string ) interface {} {
904
+ func (m * Matrix ) GetPostThread (postID string ) interface {} {
844
905
return nil
845
906
}
846
907
@@ -873,5 +934,14 @@ func (m *Matrix) RemoveReaction(msgID, emoji string) error {
873
934
}
874
935
875
936
func (m * Matrix ) GetLastSentMsgs () []string {
876
- return []string {}
937
+ data := make ([]string , 0 )
938
+
939
+ for _ , k := range m .msgLastSentCache .Keys () {
940
+ if v , ok := m .msgLastSentCache .Get (k ); ok {
941
+ msg , _ := v .(string )
942
+ data = append (data , fmt .Sprintf ("[@@%s] %s" , k , msg ))
943
+ }
944
+ }
945
+
946
+ return data
877
947
}
0 commit comments