diff options
Diffstat (limited to 'matterclient/channels.go')
-rw-r--r-- | matterclient/channels.go | 208 |
1 files changed, 208 insertions, 0 deletions
diff --git a/matterclient/channels.go b/matterclient/channels.go new file mode 100644 index 00000000..84d43bae --- /dev/null +++ b/matterclient/channels.go @@ -0,0 +1,208 @@ +package matterclient + +import ( + "errors" + "strings" + + "github.com/mattermost/mattermost-server/model" + log "github.com/sirupsen/logrus" +) + +// GetChannels returns all channels we're members off +func (m *MMClient) GetChannels() []*model.Channel { + m.RLock() + defer m.RUnlock() + var channels []*model.Channel + // our primary team channels first + channels = append(channels, m.Team.Channels...) + for _, t := range m.OtherTeams { + if t.Id != m.Team.Id { + channels = append(channels, t.Channels...) + } + } + return channels +} + +func (m *MMClient) GetChannelHeader(channelId string) string { //nolint:golint + m.RLock() + defer m.RUnlock() + for _, t := range m.OtherTeams { + for _, channel := range append(t.Channels, t.MoreChannels...) { + if channel.Id == channelId { + return channel.Header + } + + } + } + return "" +} + +func (m *MMClient) GetChannelId(name string, teamId string) string { //nolint:golint + m.RLock() + defer m.RUnlock() + if teamId != "" { + return m.getChannelIdTeam(name, teamId) + } + + for _, t := range m.OtherTeams { + for _, channel := range append(t.Channels, t.MoreChannels...) { + if channel.Type == model.CHANNEL_GROUP { + res := strings.Replace(channel.DisplayName, ", ", "-", -1) + res = strings.Replace(res, " ", "_", -1) + if res == name { + return channel.Id + } + } + + } + } + return "" +} + +func (m *MMClient) getChannelIdTeam(name string, teamId string) string { //nolint:golint + for _, t := range m.OtherTeams { + if t.Id == teamId { + for _, channel := range append(t.Channels, t.MoreChannels...) { + if channel.Name == name { + return channel.Id + } + } + } + } + return "" +} + +func (m *MMClient) GetChannelName(channelId string) string { //nolint:golint + m.RLock() + defer m.RUnlock() + for _, t := range m.OtherTeams { + if t == nil { + continue + } + for _, channel := range append(t.Channels, t.MoreChannels...) { + if channel.Id == channelId { + if channel.Type == model.CHANNEL_GROUP { + res := strings.Replace(channel.DisplayName, ", ", "-", -1) + res = strings.Replace(res, " ", "_", -1) + return res + } + return channel.Name + } + } + } + return "" +} + +func (m *MMClient) GetChannelTeamId(id string) string { //nolint:golint + m.RLock() + defer m.RUnlock() + for _, t := range append(m.OtherTeams, m.Team) { + for _, channel := range append(t.Channels, t.MoreChannels...) { + if channel.Id == id { + return channel.TeamId + } + } + } + return "" +} + +func (m *MMClient) GetLastViewedAt(channelId string) int64 { //nolint:golint + m.RLock() + defer m.RUnlock() + res, resp := m.Client.GetChannelMember(channelId, m.User.Id, "") + if resp.Error != nil { + return model.GetMillis() + } + return res.LastViewedAt +} + +// GetMoreChannels returns existing channels where we're not a member off. +func (m *MMClient) GetMoreChannels() []*model.Channel { + m.RLock() + defer m.RUnlock() + var channels []*model.Channel + for _, t := range m.OtherTeams { + channels = append(channels, t.MoreChannels...) + } + return channels +} + +// GetTeamFromChannel returns teamId belonging to channel (DM channels have no teamId). +func (m *MMClient) GetTeamFromChannel(channelId string) string { //nolint:golint + m.RLock() + defer m.RUnlock() + var channels []*model.Channel + for _, t := range m.OtherTeams { + channels = append(channels, t.Channels...) + if t.MoreChannels != nil { + channels = append(channels, t.MoreChannels...) + } + for _, c := range channels { + if c.Id == channelId { + if c.Type == model.CHANNEL_GROUP { + return "G" + } + return t.Id + } + } + channels = nil + } + return "" +} + +func (m *MMClient) JoinChannel(channelId string) error { //nolint:golint + m.RLock() + defer m.RUnlock() + for _, c := range m.Team.Channels { + if c.Id == channelId { + m.log.Debug("Not joining ", channelId, " already joined.") + return nil + } + } + m.log.Debug("Joining ", channelId) + _, resp := m.Client.AddChannelMember(channelId, m.User.Id) + if resp.Error != nil { + return resp.Error + } + return nil +} + +func (m *MMClient) UpdateChannels() error { + mmchannels, resp := m.Client.GetChannelsForTeamForUser(m.Team.Id, m.User.Id, "") + if resp.Error != nil { + return errors.New(resp.Error.DetailedError) + } + m.Lock() + m.Team.Channels = mmchannels + m.Unlock() + + mmchannels, resp = m.Client.GetPublicChannelsForTeam(m.Team.Id, 0, 5000, "") + if resp.Error != nil { + return errors.New(resp.Error.DetailedError) + } + + m.Lock() + m.Team.MoreChannels = mmchannels + m.Unlock() + return nil +} + +func (m *MMClient) UpdateChannelHeader(channelId string, header string) { //nolint:golint + channel := &model.Channel{Id: channelId, Header: header} + m.log.Debugf("updating channelheader %#v, %#v", channelId, header) + _, resp := m.Client.UpdateChannel(channel) + if resp.Error != nil { + log.Error(resp.Error) + } +} + +func (m *MMClient) UpdateLastViewed(channelId string) error { //nolint:golint + m.log.Debugf("posting lastview %#v", channelId) + view := &model.ChannelView{ChannelId: channelId} + _, resp := m.Client.ViewChannel(m.User.Id, view) + if resp.Error != nil { + m.log.Errorf("ChannelView update for %s failed: %s", channelId, resp.Error) + return resp.Error + } + return nil +} |