matrix.go 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package bridge
  2. import (
  3. "maunium.net/go/maulogger/v2"
  4. "maunium.net/go/mautrix"
  5. "maunium.net/go/mautrix/appservice"
  6. "maunium.net/go/mautrix/event"
  7. "maunium.net/go/mautrix/id"
  8. )
  9. type matrixHandler struct {
  10. as *appservice.AppService
  11. bridge *Bridge
  12. log maulogger.Logger
  13. }
  14. func (b *Bridge) setupEvents() {
  15. b.eventProcessor = appservice.NewEventProcessor(b.as)
  16. b.matrixHandler = &matrixHandler{
  17. as: b.as,
  18. bridge: b,
  19. log: b.log.Sub("Matrix"),
  20. }
  21. b.eventProcessor.On(event.EventMessage, b.matrixHandler.handleMessage)
  22. b.eventProcessor.On(event.StateMember, b.matrixHandler.handleMembership)
  23. }
  24. func (mh *matrixHandler) join(evt *event.Event, intent *appservice.IntentAPI) *mautrix.RespJoinedMembers {
  25. resp, err := intent.JoinRoomByID(evt.RoomID)
  26. if err != nil {
  27. mh.log.Debugfln("Failed to join room %s as %s with invite from %s: %v", evt.RoomID, intent.UserID, evt.Sender, err)
  28. return nil
  29. }
  30. members, err := intent.JoinedMembers(resp.RoomID)
  31. if err != nil {
  32. intent.LeaveRoom(resp.RoomID)
  33. mh.log.Debugfln("Failed to get members in room %s after accepting invite from %s as %s: %v", resp.RoomID, evt.Sender, intent.UserID, err)
  34. return nil
  35. }
  36. if len(members.Joined) < 2 {
  37. intent.LeaveRoom(resp.RoomID)
  38. mh.log.Debugln("Leaving empty room", resp.RoomID, "after accepting invite from", evt.Sender, "as", intent.UserID)
  39. return nil
  40. }
  41. return members
  42. }
  43. func (mh *matrixHandler) ignoreEvent(evt *event.Event) bool {
  44. return false
  45. }
  46. func (mh *matrixHandler) handleMessage(evt *event.Event) {
  47. if mh.ignoreEvent(evt) {
  48. return
  49. }
  50. mh.log.Debugfln("received message from %q: %q", evt.Sender, evt.Content.AsMessage())
  51. }
  52. func (mh *matrixHandler) handleMembership(evt *event.Event) {
  53. mh.log.Debugfln("recevied invite %#v\n", evt)
  54. // Return early if we're supposed to ignore the event.
  55. if mh.ignoreEvent(evt) {
  56. return
  57. }
  58. // Grab the content of the event.
  59. content := evt.Content.AsMember()
  60. // TODO: handle invites from ourselfs?
  61. isSelf := id.UserID(evt.GetStateKey()) == evt.Sender
  62. // Handle matrix invites.
  63. if content.Membership == event.MembershipInvite && !isSelf {
  64. //
  65. }
  66. }