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