mirror of
https://github.com/42wim/matterbridge.git
synced 2024-12-22 19:22:38 +01:00
208 lines
5.9 KiB
Go
208 lines
5.9 KiB
Go
package matterclient
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"github.com/mattermost/mattermost-server/v5/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.logger.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.logger.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":
|
|
if err := m.UpdateChannels(); err != nil {
|
|
m.logger.Errorf("failed to update channels: %#v", err)
|
|
}
|
|
/*
|
|
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, Id: postId}
|
|
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, rootId string) (string, error) { //nolint:golint
|
|
post := &model.Post{ChannelId: channelId, Message: text, RootId: rootId}
|
|
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, rootId string, fileIds []string) (string, error) { //nolint:golint
|
|
post := &model.Post{ChannelId: channelId, Message: text, RootId: rootId, 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, rootId string) { //nolint:golint
|
|
m.SendDirectMessageProps(toUserId, msg, rootId, nil)
|
|
}
|
|
|
|
func (m *MMClient) SendDirectMessageProps(toUserId string, msg string, rootId string, props map[string]interface{}) { //nolint:golint
|
|
m.logger.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.logger.Debugf("SendDirectMessage to %#v failed: %s", toUserId, resp.Error)
|
|
return
|
|
}
|
|
channelName := model.GetDMNameFromIds(toUserId, m.User.Id)
|
|
|
|
// update our channels
|
|
if err := m.UpdateChannels(); err != nil {
|
|
m.logger.Errorf("failed to update channels: %#v", err)
|
|
}
|
|
|
|
// build & send the message
|
|
msg = strings.Replace(msg, "\r", "", -1)
|
|
post := &model.Post{ChannelId: m.GetChannelId(channelName, m.Team.Id), Message: msg, RootId: rootId, 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
|
|
}
|