package message import ( "fmt" "local/truckstop/config" "log" "regexp" "strings" "time" "github.com/matrix-org/gomatrix" ) type Matrix struct { mock bool homeserver string username string token string room string } func NewMatrix() Matrix { conf := config.Get().Message.Matrix return Matrix{ homeserver: conf.Homeserver, username: conf.Username, token: conf.Token, room: conf.Room, mock: conf.Mock, } } func (m Matrix) getclient() (*gomatrix.Client, error) { return gomatrix.NewClient(m.homeserver, m.username, m.token) } func (m Matrix) Receive() ([]Message, error) { if m.mock { log.Printf("matrix.Receive()") messages := make([]Message, 0) for k := range config.Get().Clients { messages = append(messages, Message{Sender: k, Content: "OH"}) if k == "broc" { messages = append(messages, Message{Sender: k, Content: "pause until 2148-10-" + fmt.Sprint(time.Now().Unix()%28)}) } } return messages, nil } clients := config.Get().Clients matrixIDs := map[string]struct{}{} for k := range clients { matrixIDs[clients[k].IDs.Matrix] = struct{}{} } if len(matrixIDs) == 0 { return nil, nil } c, err := m.getclient() if err != nil { return nil, err } messages := make([]Message, 0) result, err := c.Messages(m.room, "", "", 'b', 50) for _, event := range result.Chunk { if _, ok := matrixIDs[event.Sender]; !ok { continue } switch event.Type { case "m.room.message": b, ok := event.Body() if ok { messages = append(messages, Message{Sender: event.Sender, Content: strings.TrimSpace(b)}) } } } if err != nil { return nil, err } clientChange := regexp.MustCompile("^@[a-z]+") for i := range messages { if found := clientChange.FindString(messages[i].Content); found != "" { messages[i].Content = strings.TrimSpace(strings.ReplaceAll(messages[i].Content, found, "")) messages[i].Sender = found[1:] } else { for k, v := range config.Get().Clients { if v.IDs.Matrix == messages[i].Sender { messages[i].Sender = k } } } } return messages, nil } func (m Matrix) Send(text string) error { if m.mock { log.Printf("matrix.Send(%s)", text) return nil } c, err := m.getclient() if err != nil { return err } _, err = c.SendText(m.room, text) return err }