diff options
author | Jesús Espino <jespinog@gmail.com> | 2017-11-14 23:27:14 +0100 |
---|---|---|
committer | Joram Wilander <jwawilander@gmail.com> | 2017-11-14 17:27:14 -0500 |
commit | 6c211c3a12b9f909651a1431999067c7a8df0def (patch) | |
tree | 445c7cd195599dc6cb9a4636deb03179a768fd26 /app | |
parent | 1c92ad0afb7d0828f5d8a69adbf9600b75f3b212 (diff) | |
download | chat-6c211c3a12b9f909651a1431999067c7a8df0def.tar.gz chat-6c211c3a12b9f909651a1431999067c7a8df0def.tar.bz2 chat-6c211c3a12b9f909651a1431999067c7a8df0def.zip |
PLT-7111 Add groupmsg command (#7419)
* Coping command_msg to use as command_groupmsg base
* Changing msg to groupmsg names in groumsg command
* Add groupmsg command
Diffstat (limited to 'app')
-rw-r--r-- | app/command_groupmsg.go | 137 | ||||
-rw-r--r-- | app/command_groupmsg_test.go | 37 |
2 files changed, 174 insertions, 0 deletions
diff --git a/app/command_groupmsg.go b/app/command_groupmsg.go new file mode 100644 index 000000000..a07309f04 --- /dev/null +++ b/app/command_groupmsg.go @@ -0,0 +1,137 @@ +// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. +// See License.txt for license information. + +package app + +import ( + "fmt" + "strings" + + l4g "github.com/alecthomas/log4go" + "github.com/mattermost/mattermost-server/model" + goi18n "github.com/nicksnyder/go-i18n/i18n" +) + +type groupmsgProvider struct { +} + +const ( + CMD_GROUPMSG = "groupmsg" +) + +func init() { + RegisterCommandProvider(&groupmsgProvider{}) +} + +func (me *groupmsgProvider) GetTrigger() string { + return CMD_GROUPMSG +} + +func (me *groupmsgProvider) GetCommand(T goi18n.TranslateFunc) *model.Command { + return &model.Command{ + Trigger: CMD_GROUPMSG, + AutoComplete: true, + AutoCompleteDesc: T("api.command_groupmsg.desc"), + AutoCompleteHint: T("api.command_groupmsg.hint"), + DisplayName: T("api.command_groupmsg.name"), + } +} + +func (me *groupmsgProvider) DoCommand(a *App, args *model.CommandArgs, message string) *model.CommandResponse { + targetUsers := map[string]*model.User{} + targetUsersSlice := []string{args.UserId} + invalidUsernames := []string{} + + users, parsedMessage := groupMsgUsernames(message) + + for _, username := range users { + username = strings.TrimSpace(username) + username = strings.TrimPrefix(username, "@") + if result := <-a.Srv.Store.User().GetByUsername(username); result.Err != nil { + invalidUsernames = append(invalidUsernames, username) + } else { + targetUser := result.Data.(*model.User) + _, exists := targetUsers[targetUser.Id] + if !exists && targetUser.Id != args.UserId { + targetUsers[targetUser.Id] = targetUser + targetUsersSlice = append(targetUsersSlice, targetUser.Id) + } + } + } + + if len(invalidUsernames) > 0 { + invalidUsersString := map[string]interface{}{ + "Users": "@" + strings.Join(invalidUsernames, ", @"), + } + return &model.CommandResponse{ + Text: args.T("api.command_groupmsg.invalid_user.app_error", len(invalidUsernames), invalidUsersString), + ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL, + } + } + + if len(targetUsersSlice) == 2 { + return GetCommandProvider("msg").DoCommand(a, args, fmt.Sprintf("%s %s", targetUsers[targetUsersSlice[1]].Username, parsedMessage)) + } + + if len(targetUsersSlice) < model.CHANNEL_GROUP_MIN_USERS { + minUsers := map[string]interface{}{ + "MinUsers": model.CHANNEL_GROUP_MIN_USERS - 1, + } + return &model.CommandResponse{ + Text: args.T("api.command_groupmsg.min_users.app_error", minUsers), + ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL, + } + } + + if len(targetUsersSlice) > model.CHANNEL_GROUP_MAX_USERS { + maxUsers := map[string]interface{}{ + "MaxUsers": model.CHANNEL_GROUP_MAX_USERS - 1, + } + return &model.CommandResponse{ + Text: args.T("api.command_groupmsg.max_users.app_error", maxUsers), + ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL, + } + } + + groupChannel, channelErr := a.CreateGroupChannel(targetUsersSlice, args.UserId) + if channelErr != nil { + l4g.Error(channelErr.Error()) + return &model.CommandResponse{Text: args.T("api.command_groupmsg.group_fail.app_error"), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL} + } + + if len(parsedMessage) > 0 { + post := &model.Post{} + post.Message = parsedMessage + post.ChannelId = groupChannel.Id + post.UserId = args.UserId + if _, err := a.CreatePostMissingChannel(post, true); err != nil { + return &model.CommandResponse{Text: args.T("api.command_groupmsg.fail.app_error"), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL} + } + } + + team, err := a.GetTeam(args.TeamId) + if err != nil { + return &model.CommandResponse{Text: args.T("api.command_groupmsg.fail.app_error"), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL} + } + + return &model.CommandResponse{GotoLocation: args.SiteURL + "/" + team.Name + "/channels/" + groupChannel.Name, Text: "", ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL} +} + +func groupMsgUsernames(message string) ([]string, string) { + result := []string{} + resultMessage := "" + for idx, part := range strings.Split(message, ",") { + clean := strings.TrimPrefix(strings.TrimSpace(part), "@") + split := strings.Fields(clean) + if len(split) > 0 { + result = append(result, split[0]) + } + if len(split) > 1 { + splitted := strings.SplitN(message, ",", idx+1) + resultMessage = strings.TrimPrefix(strings.TrimSpace(splitted[len(splitted)-1]), "@") + resultMessage = strings.TrimSpace(strings.TrimPrefix(resultMessage, split[0])) + break + } + } + return result, resultMessage +} diff --git a/app/command_groupmsg_test.go b/app/command_groupmsg_test.go new file mode 100644 index 000000000..610d2e446 --- /dev/null +++ b/app/command_groupmsg_test.go @@ -0,0 +1,37 @@ +package app + +import ( + "testing" +) + +func TestGroupMsgUsernames(t *testing.T) { + if users, parsedMessage := groupMsgUsernames(""); len(users) != 0 || parsedMessage != "" { + t.Fatal("error parsing empty message") + } + if users, parsedMessage := groupMsgUsernames("test"); len(users) != 1 || parsedMessage != "" { + t.Fatal("error parsing simple user") + } + if users, parsedMessage := groupMsgUsernames("test1, test2, test3 , test4"); len(users) != 4 || parsedMessage != "" { + t.Fatal("error parsing various users") + } + + if users, parsedMessage := groupMsgUsernames("test1, test2 message with spaces"); len(users) != 2 || parsedMessage != "message with spaces" { + t.Fatal("error parsing message") + } + + if users, parsedMessage := groupMsgUsernames("test1, test2 message with, comma"); len(users) != 2 || parsedMessage != "message with, comma" { + t.Fatal("error parsing messages with comma") + } + + if users, parsedMessage := groupMsgUsernames("test1,,,test2"); len(users) != 2 || parsedMessage != "" { + t.Fatal("error parsing multiple commas in username ") + } + + if users, parsedMessage := groupMsgUsernames(" test1, test2 other message "); len(users) != 2 || parsedMessage != "other message" { + t.Fatal("error parsing strange usage of spaces") + } + + if users, _ := groupMsgUsernames(" test1, test2,,123,@321,+123"); len(users) != 5 || users[0] != "test1" || users[1] != "test2" || users[2] != "123" || users[3] != "321" || users[4] != "+123" { + t.Fatal("error parsing different types of users") + } +} |