diff options
author | Carlos Tadeu Panato Junior <ctadeu@gmail.com> | 2017-10-25 17:51:13 +0200 |
---|---|---|
committer | Joram Wilander <jwawilander@gmail.com> | 2017-10-25 11:51:13 -0400 |
commit | 62b3569025347a1291229771f363be5962951f25 (patch) | |
tree | 187a16db01b5775a5536bd928f936114b0dde07a | |
parent | f63223286295a1261c950c482701b99963fb260c (diff) | |
download | chat-62b3569025347a1291229771f363be5962951f25.tar.gz chat-62b3569025347a1291229771f363be5962951f25.tar.bz2 chat-62b3569025347a1291229771f363be5962951f25.zip |
[PLT-4341] add dnd command (#7694)
-rw-r--r-- | api4/status.go | 2 | ||||
-rw-r--r-- | api4/status_test.go | 24 | ||||
-rw-r--r-- | app/command_dnd.go | 49 | ||||
-rw-r--r-- | app/notification.go | 2 | ||||
-rw-r--r-- | app/status.go | 28 | ||||
-rw-r--r-- | i18n/en.json | 20 | ||||
-rw-r--r-- | model/status.go | 1 |
7 files changed, 126 insertions, 0 deletions
diff --git a/api4/status.go b/api4/status.go index 3aaa6f621..92f319273 100644 --- a/api4/status.go +++ b/api4/status.go @@ -84,6 +84,8 @@ func updateUserStatus(c *Context, w http.ResponseWriter, r *http.Request) { c.App.SetStatusOffline(c.Params.UserId, true) case "away": c.App.SetStatusAwayIfNeeded(c.Params.UserId, true) + case "dnd": + c.App.SetStatusDoNotDisturb(c.Params.UserId) default: c.SetInvalidParam("status") return diff --git a/api4/status_test.go b/api4/status_test.go index 963537e76..7049bedef 100644 --- a/api4/status_test.go +++ b/api4/status_test.go @@ -31,6 +31,13 @@ func TestGetUserStatus(t *testing.T) { t.Fatal("Should return away status") } + th.App.SetStatusDoNotDisturb(th.BasicUser.Id) + userStatus, resp = Client.GetUserStatus(th.BasicUser.Id, "") + CheckNoError(t, resp) + if userStatus.Status != "dnd" { + t.Fatal("Should return dnd status") + } + th.App.SetStatusOffline(th.BasicUser.Id, true) userStatus, resp = Client.GetUserStatus(th.BasicUser.Id, "") CheckNoError(t, resp) @@ -93,6 +100,16 @@ func TestGetUsersStatusesByIds(t *testing.T) { } } + th.App.SetStatusDoNotDisturb(th.BasicUser.Id) + th.App.SetStatusDoNotDisturb(th.BasicUser2.Id) + usersStatuses, resp = Client.GetUsersStatusesByIds(usersIds) + CheckNoError(t, resp) + for _, userStatus := range usersStatuses { + if userStatus.Status != "dnd" { + t.Fatal("Status should be offline") + } + } + Client.Logout() _, resp = Client.GetUsersStatusesByIds(usersIds) @@ -118,6 +135,13 @@ func TestUpdateUserStatus(t *testing.T) { t.Fatal("Should return away status") } + toUpdateUserStatus.Status = "dnd" + updateUserStatus, resp = Client.UpdateUserStatus(th.BasicUser.Id, toUpdateUserStatus) + CheckNoError(t, resp) + if updateUserStatus.Status != "dnd" { + t.Fatal("Should return dnd status") + } + toUpdateUserStatus.Status = "offline" updateUserStatus, resp = Client.UpdateUserStatus(th.BasicUser.Id, toUpdateUserStatus) CheckNoError(t, resp) diff --git a/app/command_dnd.go b/app/command_dnd.go new file mode 100644 index 000000000..7eff6039d --- /dev/null +++ b/app/command_dnd.go @@ -0,0 +1,49 @@ +// Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved. +// See License.txt for license information. + +package app + +import ( + "github.com/mattermost/mattermost-server/model" + goi18n "github.com/nicksnyder/go-i18n/i18n" +) + +type DndProvider struct { +} + +const ( + CMD_DND = "dnd" +) + +func init() { + RegisterCommandProvider(&DndProvider{}) +} + +func (me *DndProvider) GetTrigger() string { + return CMD_DND +} + +func (me *DndProvider) GetCommand(T goi18n.TranslateFunc) *model.Command { + return &model.Command{ + Trigger: CMD_DND, + AutoComplete: true, + AutoCompleteDesc: T("api.command_dnd.desc"), + DisplayName: T("api.command_dnd.name"), + } +} + +func (me *DndProvider) DoCommand(a *App, args *model.CommandArgs, message string) *model.CommandResponse { + status, err := a.GetStatus(args.UserId) + if err != nil { + return &model.CommandResponse{ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL, Text: args.T("api.command_dnd.error")} + } else { + if status.Status == "dnd" { + a.SetStatusOnline(args.UserId, args.Session.Id, true) + return &model.CommandResponse{ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL, Text: args.T("api.command_dnd.disabled")} + } + } + + a.SetStatusDoNotDisturb(args.UserId) + + return &model.CommandResponse{ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL, Text: args.T("api.command_dnd.success")} +} diff --git a/app/notification.go b/app/notification.go index 3adf14419..84a2b610b 100644 --- a/app/notification.go +++ b/app/notification.go @@ -993,6 +993,8 @@ func DoesStatusAllowPushNotification(userNotifyProps model.StringMap, status *mo return true } else if pushStatus == model.STATUS_OFFLINE && status.Status == model.STATUS_OFFLINE { return true + } else if status.Status == model.STATUS_DND { + return false } return false diff --git a/app/status.go b/app/status.go index 56bad2105..e5926a071 100644 --- a/app/status.go +++ b/app/status.go @@ -295,6 +295,34 @@ func (a *App) SetStatusAwayIfNeeded(userId string, manual bool) { }) } +func (a *App) SetStatusDoNotDisturb(userId string) { + if !*a.Config().ServiceSettings.EnableUserStatuses { + return + } + + status, err := a.GetStatus(userId) + + if err != nil { + status = &model.Status{UserId: userId, Status: model.STATUS_OFFLINE, Manual: false, LastActivityAt: 0, ActiveChannel: ""} + } + + status.Status = model.STATUS_DND + status.Manual = true + + a.AddStatusCache(status) + + if result := <-a.Srv.Store.Status().SaveOrUpdate(status); result.Err != nil { + l4g.Error(utils.T("api.status.save_status.error"), userId, result.Err) + } + + event := model.NewWebSocketEvent(model.WEBSOCKET_EVENT_STATUS_CHANGE, "", "", status.UserId, nil) + event.Add("status", model.STATUS_DND) + event.Add("user_id", status.UserId) + a.Go(func() { + a.Publish(event) + }) +} + func GetStatusFromCache(userId string) *model.Status { if result, ok := statusCache.Get(userId); ok { status := result.(*model.Status) diff --git a/i18n/en.json b/i18n/en.json index f1400da0b..a684c5be0 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -500,6 +500,26 @@ "translation": "You are now away" }, { + "id": "api.command_dnd.error", + "translation": "Error to retrieve the user status." + }, + { + "id": "api.command_dnd.disabled", + "translation": "Do Not Disturb is disabled." + }, + { + "id": "api.command_dnd.success", + "translation": "Do Not Disturb is enabled. You will not receive desktop or mobile push notifications until Do Not Disturb is turned off." + }, + { + "id": "api.command_dnd.desc", + "translation": "Do not disturb disables desktop and mobile push notifications." + }, + { + "id": "api.command_dnd.name", + "translation": "dnd" + }, + { "id": "api.command_channel_header.channel.app_error", "translation": "Error to retrieve the current channel." }, diff --git a/model/status.go b/model/status.go index d838eea01..6da6161eb 100644 --- a/model/status.go +++ b/model/status.go @@ -11,6 +11,7 @@ import ( const ( STATUS_OFFLINE = "offline" STATUS_AWAY = "away" + STATUS_DND = "dnd" STATUS_ONLINE = "online" STATUS_CACHE_SIZE = SESSION_CACHE_SIZE STATUS_CHANNEL_TIMEOUT = 20000 // 20 seconds |