1package matterclient
2
3import (
4	"errors"
5	"strings"
6
7	"github.com/mattermost/mattermost-server/v5/model"
8)
9
10// GetChannels returns all channels we're members off
11func (m *MMClient) GetChannels() []*model.Channel {
12	m.RLock()
13	defer m.RUnlock()
14	var channels []*model.Channel
15	// our primary team channels first
16	channels = append(channels, m.Team.Channels...)
17	for _, t := range m.OtherTeams {
18		if t.Id != m.Team.Id {
19			channels = append(channels, t.Channels...)
20		}
21	}
22	return channels
23}
24
25func (m *MMClient) GetChannelHeader(channelId string) string { //nolint:golint
26	m.RLock()
27	defer m.RUnlock()
28	for _, t := range m.OtherTeams {
29		for _, channel := range append(t.Channels, t.MoreChannels...) {
30			if channel.Id == channelId {
31				return channel.Header
32			}
33
34		}
35	}
36	return ""
37}
38
39func getNormalisedName(channel *model.Channel) string {
40	if channel.Type == model.CHANNEL_GROUP {
41		// (deprecated in favor of ReplaceAll in go 1.12)
42		res := strings.Replace(channel.DisplayName, ", ", "-", -1) //nolint: gocritic
43		res = strings.Replace(res, " ", "_", -1)                   //nolint: gocritic
44		return res
45	}
46	return channel.Name
47}
48
49func (m *MMClient) GetChannelId(name string, teamId string) string { //nolint:golint
50	m.RLock()
51	defer m.RUnlock()
52	if teamId != "" {
53		return m.getChannelIdTeam(name, teamId)
54	}
55
56	for _, t := range m.OtherTeams {
57		for _, channel := range append(t.Channels, t.MoreChannels...) {
58			if getNormalisedName(channel) == name {
59				return channel.Id
60			}
61		}
62	}
63	return ""
64}
65
66func (m *MMClient) getChannelIdTeam(name string, teamId string) string { //nolint:golint
67	for _, t := range m.OtherTeams {
68		if t.Id == teamId {
69			for _, channel := range append(t.Channels, t.MoreChannels...) {
70				if getNormalisedName(channel) == name {
71					return channel.Id
72				}
73			}
74		}
75	}
76	return ""
77}
78
79func (m *MMClient) GetChannelName(channelId string) string { //nolint:golint
80	m.RLock()
81	defer m.RUnlock()
82	for _, t := range m.OtherTeams {
83		if t == nil {
84			continue
85		}
86		for _, channel := range append(t.Channels, t.MoreChannels...) {
87			if channel.Id == channelId {
88				return getNormalisedName(channel)
89			}
90		}
91	}
92	return ""
93}
94
95func (m *MMClient) GetChannelTeamId(id string) string { //nolint:golint
96	m.RLock()
97	defer m.RUnlock()
98	for _, t := range append(m.OtherTeams, m.Team) {
99		for _, channel := range append(t.Channels, t.MoreChannels...) {
100			if channel.Id == id {
101				return channel.TeamId
102			}
103		}
104	}
105	return ""
106}
107
108func (m *MMClient) GetLastViewedAt(channelId string) int64 { //nolint:golint
109	m.RLock()
110	defer m.RUnlock()
111	res, resp := m.Client.GetChannelMember(channelId, m.User.Id, "")
112	if resp.Error != nil {
113		return model.GetMillis()
114	}
115	return res.LastViewedAt
116}
117
118// GetMoreChannels returns existing channels where we're not a member off.
119func (m *MMClient) GetMoreChannels() []*model.Channel {
120	m.RLock()
121	defer m.RUnlock()
122	var channels []*model.Channel
123	for _, t := range m.OtherTeams {
124		channels = append(channels, t.MoreChannels...)
125	}
126	return channels
127}
128
129// GetTeamFromChannel returns teamId belonging to channel (DM channels have no teamId).
130func (m *MMClient) GetTeamFromChannel(channelId string) string { //nolint:golint
131	m.RLock()
132	defer m.RUnlock()
133	var channels []*model.Channel
134	for _, t := range m.OtherTeams {
135		channels = append(channels, t.Channels...)
136		if t.MoreChannels != nil {
137			channels = append(channels, t.MoreChannels...)
138		}
139		for _, c := range channels {
140			if c.Id == channelId {
141				if c.Type == model.CHANNEL_GROUP {
142					return "G"
143				}
144				return t.Id
145			}
146		}
147		channels = nil
148	}
149	return ""
150}
151
152func (m *MMClient) JoinChannel(channelId string) error { //nolint:golint
153	m.RLock()
154	defer m.RUnlock()
155	for _, c := range m.Team.Channels {
156		if c.Id == channelId {
157			m.logger.Debug("Not joining ", channelId, " already joined.")
158			return nil
159		}
160	}
161	m.logger.Debug("Joining ", channelId)
162	_, resp := m.Client.AddChannelMember(channelId, m.User.Id)
163	if resp.Error != nil {
164		return resp.Error
165	}
166	return nil
167}
168
169func (m *MMClient) UpdateChannelsTeam(teamID string) error {
170	mmchannels, resp := m.Client.GetChannelsForTeamForUser(teamID, m.User.Id, false, "")
171	if resp.Error != nil {
172		return errors.New(resp.Error.DetailedError)
173	}
174	for idx, t := range m.OtherTeams {
175		if t.Id == teamID {
176			m.Lock()
177			m.OtherTeams[idx].Channels = mmchannels
178			m.Unlock()
179		}
180	}
181
182	mmchannels, resp = m.Client.GetPublicChannelsForTeam(teamID, 0, 5000, "")
183	if resp.Error != nil {
184		return errors.New(resp.Error.DetailedError)
185	}
186	for idx, t := range m.OtherTeams {
187		if t.Id == teamID {
188			m.Lock()
189			m.OtherTeams[idx].MoreChannels = mmchannels
190			m.Unlock()
191		}
192	}
193	return nil
194}
195
196func (m *MMClient) UpdateChannels() error {
197	if err := m.UpdateChannelsTeam(m.Team.Id); err != nil {
198		return err
199	}
200	for _, t := range m.OtherTeams {
201		if err := m.UpdateChannelsTeam(t.Id); err != nil {
202			return err
203		}
204	}
205	return nil
206}
207
208func (m *MMClient) UpdateChannelHeader(channelId string, header string) { //nolint:golint
209	channel := &model.Channel{Id: channelId, Header: header}
210	m.logger.Debugf("updating channelheader %#v, %#v", channelId, header)
211	_, resp := m.Client.UpdateChannel(channel)
212	if resp.Error != nil {
213		m.logger.Error(resp.Error)
214	}
215}
216
217func (m *MMClient) UpdateLastViewed(channelId string) error { //nolint:golint
218	m.logger.Debugf("posting lastview %#v", channelId)
219	view := &model.ChannelView{ChannelId: channelId}
220	_, resp := m.Client.ViewChannel(m.User.Id, view)
221	if resp.Error != nil {
222		m.logger.Errorf("ChannelView update for %s failed: %s", channelId, resp.Error)
223		return resp.Error
224	}
225	return nil
226}
227