Skip to content

Commit

Permalink
[MM-382] Add feature to use struct fields in the channel welcome message
Browse files Browse the repository at this point in the history
  • Loading branch information
ayusht2810 committed Apr 16, 2024
1 parent 502eb34 commit e956e0c
Show file tree
Hide file tree
Showing 4 changed files with 70 additions and 13 deletions.
10 changes: 9 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,15 @@ 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 command 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
UserDisplayName string
}
```
* `/welcomebot get_channel_welcome` - Gets the current channel's welcome message.
* `/welcomebot delete_channel_welcome` - Deletes the current channel's welcome message.

Expand Down
11 changes: 9 additions & 2 deletions server/hooks.go
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand All @@ -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)
Expand Down
8 changes: 8 additions & 0 deletions server/message_template.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
54 changes: 44 additions & 10 deletions server/welcomebot.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 *model.AppError

if len(userID) > 0 {
if data.User, err = p.API.GetUser(userID); err != nil {
p.API.LogError("failed to query user", "UserID", userID)
return nil
}
}

if data.User != nil {
if data.DirectMessage, err = p.API.GetDirectChannel(userID, p.botUserID); err != nil {
p.API.LogError("failed to query direct message channel", "UserID", userID)
return nil
}
}

if len(channelID) > 0 {
data.Channel, err = p.API.GetChannel(channelID)
if err != nil {
p.API.LogError("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"

Expand Down Expand Up @@ -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,
}

Expand Down Expand Up @@ -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 appErr := tmpMsg.Execute(&message, messageTemplate); appErr != nil {
p.API.LogError("Failed to execute channel message template", "Error", appErr.Error())
return ""
}

return message.String()
}

func (p *Plugin) processWelcomeMessage(messageTemplate MessageTemplate, configMessage ConfigMessage) {
time.Sleep(time.Second * time.Duration(configMessage.DelayInSeconds))

Expand Down

0 comments on commit e956e0c

Please sign in to comment.