diff options
Diffstat (limited to 'teleirc/matterbridge/matterclient/channels.go')
| -rw-r--r-- | teleirc/matterbridge/matterclient/channels.go | 226 |
1 files changed, 226 insertions, 0 deletions
diff --git a/teleirc/matterbridge/matterclient/channels.go b/teleirc/matterbridge/matterclient/channels.go new file mode 100644 index 0000000..13d3277 --- /dev/null +++ b/teleirc/matterbridge/matterclient/channels.go @@ -0,0 +1,226 @@ +package matterclient + +import ( + "errors" + "strings" + + "github.com/mattermost/mattermost-server/v5/model" +) + +// 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 getNormalisedName(channel *model.Channel) string { + if channel.Type == model.CHANNEL_GROUP { + // (deprecated in favor of ReplaceAll in go 1.12) + res := strings.Replace(channel.DisplayName, ", ", "-", -1) //nolint: gocritic + res = strings.Replace(res, " ", "_", -1) //nolint: gocritic + return res + } + return channel.Name +} + +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 getNormalisedName(channel) == 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 getNormalisedName(channel) == 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 { + return getNormalisedName(channel) + } + } + } + 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.logger.Debug("Not joining ", channelId, " already joined.") + return nil + } + } + m.logger.Debug("Joining ", channelId) + _, resp := m.Client.AddChannelMember(channelId, m.User.Id) + if resp.Error != nil { + return resp.Error + } + return nil +} + +func (m *MMClient) UpdateChannelsTeam(teamID string) error { + mmchannels, resp := m.Client.GetChannelsForTeamForUser(teamID, m.User.Id, false, "") + if resp.Error != nil { + return errors.New(resp.Error.DetailedError) + } + for idx, t := range m.OtherTeams { + if t.Id == teamID { + m.Lock() + m.OtherTeams[idx].Channels = mmchannels + m.Unlock() + } + } + + mmchannels, resp = m.Client.GetPublicChannelsForTeam(teamID, 0, 5000, "") + if resp.Error != nil { + return errors.New(resp.Error.DetailedError) + } + for idx, t := range m.OtherTeams { + if t.Id == teamID { + m.Lock() + m.OtherTeams[idx].MoreChannels = mmchannels + m.Unlock() + } + } + return nil +} + +func (m *MMClient) UpdateChannels() error { + if err := m.UpdateChannelsTeam(m.Team.Id); err != nil { + return err + } + for _, t := range m.OtherTeams { + if err := m.UpdateChannelsTeam(t.Id); err != nil { + return err + } + } + return nil +} + +func (m *MMClient) UpdateChannelHeader(channelId string, header string) { //nolint:golint + channel := &model.Channel{Id: channelId, Header: header} + m.logger.Debugf("updating channelheader %#v, %#v", channelId, header) + _, resp := m.Client.UpdateChannel(channel) + if resp.Error != nil { + m.logger.Error(resp.Error) + } +} + +func (m *MMClient) UpdateLastViewed(channelId string) error { //nolint:golint + m.logger.Debugf("posting lastview %#v", channelId) + view := &model.ChannelView{ChannelId: channelId} + _, resp := m.Client.ViewChannel(m.User.Id, view) + if resp.Error != nil { + m.logger.Errorf("ChannelView update for %s failed: %s", channelId, resp.Error) + return resp.Error + } + return nil +} |
