summaryrefslogtreecommitdiffstats
path: root/matterclient/messages.go
diff options
context:
space:
mode:
Diffstat (limited to 'matterclient/messages.go')
-rw-r--r--matterclient/messages.go203
1 files changed, 203 insertions, 0 deletions
diff --git a/matterclient/messages.go b/matterclient/messages.go
new file mode 100644
index 00000000..28e3ec28
--- /dev/null
+++ b/matterclient/messages.go
@@ -0,0 +1,203 @@
+package matterclient
+
+import (
+ "strings"
+
+ "github.com/mattermost/mattermost-server/model"
+)
+
+func (m *MMClient) parseActionPost(rmsg *Message) {
+ // add post to cache, if it already exists don't relay this again.
+ // this should fix reposts
+ if ok, _ := m.lruCache.ContainsOrAdd(digestString(rmsg.Raw.Data["post"].(string)), true); ok {
+ m.log.Debugf("message %#v in cache, not processing again", rmsg.Raw.Data["post"].(string))
+ rmsg.Text = ""
+ return
+ }
+ data := model.PostFromJson(strings.NewReader(rmsg.Raw.Data["post"].(string)))
+ // we don't have the user, refresh the userlist
+ if m.GetUser(data.UserId) == nil {
+ m.log.Infof("User '%v' is not known, ignoring message '%#v'",
+ data.UserId, data)
+ return
+ }
+ rmsg.Username = m.GetUserName(data.UserId)
+ rmsg.Channel = m.GetChannelName(data.ChannelId)
+ rmsg.UserID = data.UserId
+ rmsg.Type = data.Type
+ teamid, _ := rmsg.Raw.Data["team_id"].(string)
+ // edit messsages have no team_id for some reason
+ if teamid == "" {
+ // we can find the team_id from the channelid
+ teamid = m.GetChannelTeamId(data.ChannelId)
+ rmsg.Raw.Data["team_id"] = teamid
+ }
+ if teamid != "" {
+ rmsg.Team = m.GetTeamName(teamid)
+ }
+ // direct message
+ if rmsg.Raw.Data["channel_type"] == "D" {
+ rmsg.Channel = m.GetUser(data.UserId).Username
+ }
+ rmsg.Text = data.Message
+ rmsg.Post = data
+}
+
+func (m *MMClient) parseMessage(rmsg *Message) {
+ switch rmsg.Raw.Event {
+ case model.WEBSOCKET_EVENT_POSTED, model.WEBSOCKET_EVENT_POST_EDITED, model.WEBSOCKET_EVENT_POST_DELETED:
+ m.parseActionPost(rmsg)
+ case "user_updated":
+ user := rmsg.Raw.Data["user"].(map[string]interface{})
+ if _, ok := user["id"].(string); ok {
+ m.UpdateUser(user["id"].(string))
+ }
+ case "group_added":
+ m.UpdateChannels()
+ /*
+ case model.ACTION_USER_REMOVED:
+ m.handleWsActionUserRemoved(&rmsg)
+ case model.ACTION_USER_ADDED:
+ m.handleWsActionUserAdded(&rmsg)
+ */
+ }
+}
+
+func (m *MMClient) parseResponse(rmsg model.WebSocketResponse) {
+ if rmsg.Data != nil {
+ // ping reply
+ if rmsg.Data["text"].(string) == "pong" {
+ m.WsPingChan <- &rmsg
+ }
+ }
+}
+
+func (m *MMClient) DeleteMessage(postId string) error { //nolint:golint
+ _, resp := m.Client.DeletePost(postId)
+ if resp.Error != nil {
+ return resp.Error
+ }
+ return nil
+}
+
+func (m *MMClient) EditMessage(postId string, text string) (string, error) { //nolint:golint
+ post := &model.Post{Message: text}
+ res, resp := m.Client.UpdatePost(postId, post)
+ if resp.Error != nil {
+ return "", resp.Error
+ }
+ return res.Id, nil
+}
+
+func (m *MMClient) GetFileLinks(filenames []string) []string {
+ uriScheme := "https://"
+ if m.NoTLS {
+ uriScheme = "http://"
+ }
+
+ var output []string
+ for _, f := range filenames {
+ res, resp := m.Client.GetFileLink(f)
+ if resp.Error != nil {
+ // public links is probably disabled, create the link ourselves
+ output = append(output, uriScheme+m.Credentials.Server+model.API_URL_SUFFIX_V4+"/files/"+f)
+ continue
+ }
+ output = append(output, res)
+ }
+ return output
+}
+
+func (m *MMClient) GetPosts(channelId string, limit int) *model.PostList { //nolint:golint
+ res, resp := m.Client.GetPostsForChannel(channelId, 0, limit, "")
+ if resp.Error != nil {
+ return nil
+ }
+ return res
+}
+
+func (m *MMClient) GetPostsSince(channelId string, time int64) *model.PostList { //nolint:golint
+ res, resp := m.Client.GetPostsSince(channelId, time)
+ if resp.Error != nil {
+ return nil
+ }
+ return res
+}
+
+func (m *MMClient) GetPublicLink(filename string) string {
+ res, resp := m.Client.GetFileLink(filename)
+ if resp.Error != nil {
+ return ""
+ }
+ return res
+}
+
+func (m *MMClient) GetPublicLinks(filenames []string) []string {
+ var output []string
+ for _, f := range filenames {
+ res, resp := m.Client.GetFileLink(f)
+ if resp.Error != nil {
+ continue
+ }
+ output = append(output, res)
+ }
+ return output
+}
+
+func (m *MMClient) PostMessage(channelId string, text string) (string, error) { //nolint:golint
+ post := &model.Post{ChannelId: channelId, Message: text}
+ res, resp := m.Client.CreatePost(post)
+ if resp.Error != nil {
+ return "", resp.Error
+ }
+ return res.Id, nil
+}
+
+func (m *MMClient) PostMessageWithFiles(channelId string, text string, fileIds []string) (string, error) { //nolint:golint
+ post := &model.Post{ChannelId: channelId, Message: text, FileIds: fileIds}
+ res, resp := m.Client.CreatePost(post)
+ if resp.Error != nil {
+ return "", resp.Error
+ }
+ return res.Id, nil
+}
+
+func (m *MMClient) SearchPosts(query string) *model.PostList {
+ res, resp := m.Client.SearchPosts(m.Team.Id, query, false)
+ if resp.Error != nil {
+ return nil
+ }
+ return res
+}
+
+// SendDirectMessage sends a direct message to specified user
+func (m *MMClient) SendDirectMessage(toUserId string, msg string) { //nolint:golint
+ m.SendDirectMessageProps(toUserId, msg, nil)
+}
+
+func (m *MMClient) SendDirectMessageProps(toUserId string, msg string, props map[string]interface{}) { //nolint:golint
+ m.log.Debugf("SendDirectMessage to %s, msg %s", toUserId, msg)
+ // create DM channel (only happens on first message)
+ _, resp := m.Client.CreateDirectChannel(m.User.Id, toUserId)
+ if resp.Error != nil {
+ m.log.Debugf("SendDirectMessage to %#v failed: %s", toUserId, resp.Error)
+ return
+ }
+ channelName := model.GetDMNameFromIds(toUserId, m.User.Id)
+
+ // update our channels
+ m.UpdateChannels()
+
+ // build & send the message
+ msg = strings.Replace(msg, "\r", "", -1)
+ post := &model.Post{ChannelId: m.GetChannelId(channelName, m.Team.Id), Message: msg, Props: props}
+ m.Client.CreatePost(post)
+}
+
+func (m *MMClient) UploadFile(data []byte, channelId string, filename string) (string, error) { //nolint:golint
+ f, resp := m.Client.UploadFile(data, channelId, filename)
+ if resp.Error != nil {
+ return "", resp.Error
+ }
+ return f.FileInfos[0].Id, nil
+}