mirror of
https://github.com/42wim/matterbridge.git
synced 2024-11-30 06:32:01 -08:00
227 lines
5.4 KiB
Go
227 lines
5.4 KiB
Go
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
|
|
}
|