diff --git a/README.md b/README.md index c8db5f98e..9fae8d45c 100644 --- a/README.md +++ b/README.md @@ -83,7 +83,16 @@ The preview of the configured messages, as well as the creation of a channel wel * `/welcomebot help` - Displays usage information. * `/welcomebot list` - Lists the teams for which greetings were defined. * `/welcomebot preview [team-name]` - Sends ephemeral messages to the user calling the command, with the preview of the welcome message[s] for the given team name and the user that requested the preview. -* `/welcomebot set_channel_welcome [welcome-message]` - Sets the given text as current's channel welcome message. +* `/welcomebot set_channel_welcome [welcome-message]` - Sets the given text as current's channel welcome message. You can also include `{{.UserDisplayName}}` and `{{.Channel.DisplayName}}` in the `welcome-message` to print the user joined and the channel display name in the message, respectively. You can insert any variable from the `MessageTemplate` struct, which has the following fields: + ```go + type MessageTemplate struct { + WelcomeBot *model.User + User *model.User + DirectMessage *model.Channel + Channel *model.Channel + UserDisplayName string + } + ``` * `/welcomebot get_channel_welcome` - Gets the current channel's welcome message. * `/welcomebot delete_channel_welcome` - Deletes the current channel's welcome message. diff --git a/server/hooks.go b/server/hooks.go index 25b1b744e..751afed44 100644 --- a/server/hooks.go +++ b/server/hooks.go @@ -69,13 +69,20 @@ func (p *Plugin) UserHasJoinedChannel(c *plugin.Context, channelMember *model.Ch return } + templateData := p.constructChannelMessageTemplate(channelMember.UserId, channelMember.ChannelId) + if templateData == nil { + return + } + + message := p.getTemplateMessage([]string{string(data)}, templateData) + // We send a DM and an opportunistic ephemeral message to the channel. See // the discussion at the link below for more details: // https://github.com/mattermost/mattermost-plugin-welcomebot/pull/31#issuecomment-611691023 postDM := &model.Post{ UserId: p.botUserID, ChannelId: dmChannel.Id, - Message: string(data), + Message: message, } if _, appErr := p.API.CreatePost(postDM); appErr != nil { mlog.Error("failed to post welcome message to the channel", @@ -87,7 +94,7 @@ func (p *Plugin) UserHasJoinedChannel(c *plugin.Context, channelMember *model.Ch postChannel := &model.Post{ UserId: p.botUserID, ChannelId: channelMember.ChannelId, - Message: string(data), + Message: message, } time.Sleep(1 * time.Second) _ = p.API.SendEphemeralPost(channelMember.UserId, postChannel) diff --git a/server/message_template.go b/server/message_template.go index 717b36bc0..b00ffd2aa 100644 --- a/server/message_template.go +++ b/server/message_template.go @@ -11,3 +11,11 @@ type MessageTemplate struct { DirectMessage *model.Channel UserDisplayName string } + +type ChannelMessageTemplate struct { + WelcomeBot *model.User + User *model.User + Channel *model.Channel + DirectMessage *model.Channel + UserDisplayName string +} diff --git a/server/welcomebot.go b/server/welcomebot.go index 7f65ad45f..c8a7dbe49 100644 --- a/server/welcomebot.go +++ b/server/welcomebot.go @@ -45,6 +45,37 @@ func (p *Plugin) constructMessageTemplate(userID, teamID string) *MessageTemplat return data } +func (p *Plugin) constructChannelMessageTemplate(userID, channelID string) *ChannelMessageTemplate { + data := &ChannelMessageTemplate{} + var err error + + if len(userID) > 0 { + if data.User, err = p.client.User.Get(userID); err != nil { + p.client.Log.Error("failed to query user", "UserID", userID) + return nil + } + } + + if data.User != nil { + if data.DirectMessage, err = p.client.Channel.GetDirect(userID, p.botUserID); err != nil { + p.client.Log.Error("failed to query direct message channel", "UserID", userID) + return nil + } + } + + if len(channelID) > 0 { + data.Channel, err = p.client.Channel.Get(channelID) + if err != nil { + p.client.Log.Error("failed to query channel", "ChannelID", channelID) + return nil + } + } + + data.UserDisplayName = data.User.GetDisplayName(model.ShowNicknameFullName) + + return data +} + func (p *Plugin) getSiteURL() string { siteURL := "http://localhost:8065" @@ -133,18 +164,10 @@ func (p *Plugin) renderWelcomeMessage(messageTemplate MessageTemplate, configMes } } - tmpMsg, _ := template.New("Response").Parse(strings.Join(configMessage.Message, "\n")) - var message bytes.Buffer - err := tmpMsg.Execute(&message, messageTemplate) - if err != nil { - p.API.LogError( - "Failed to execute message template", - "err", err.Error(), - ) - } + message := p.getTemplateMessage(configMessage.Message, messageTemplate) post := &model.Post{ - Message: message.String(), + Message: message, UserId: p.botUserID, } @@ -177,6 +200,17 @@ func (p *Plugin) renderWelcomeMessage(messageTemplate MessageTemplate, configMes return post } +func (p *Plugin) getTemplateMessage(data []string, messageTemplate interface{}) string { + tmpMsg, _ := template.New("Response").Parse(strings.Join(data, "\n")) + var message bytes.Buffer + if err := tmpMsg.Execute(&message, messageTemplate); err != nil { + p.client.Log.Error("Failed to execute channel message template", "Error", err.Error()) + return "" + } + + return message.String() +} + func (p *Plugin) processWelcomeMessage(messageTemplate MessageTemplate, configMessage ConfigMessage) { time.Sleep(time.Second * time.Duration(configMessage.DelayInSeconds))