From e0298521c6c12c5f347431bfad5b6a4d7ab8b465 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 26 Mar 2018 18:04:10 +0300 Subject: Add sounds to notifications --- matrix/matrix.go | 7 +++++-- notification/notify_darwin.go | 5 ++++- notification/notify_linux.go | 11 +++++++++-- notification/notify_unsupported.go | 23 +++++++++++++++++++++++ notification/notify_windows.go | 7 +++++-- ui/view-main.go | 7 ++++--- 6 files changed, 50 insertions(+), 10 deletions(-) create mode 100644 notification/notify_unsupported.go diff --git a/matrix/matrix.go b/matrix/matrix.go index d706b95..5bd9d17 100644 --- a/matrix/matrix.go +++ b/matrix/matrix.go @@ -270,18 +270,21 @@ func (c *Container) HandleMembership(evt *gomatrix.Event) { c.processOwnMembershipChange(evt) } - roomView := c.ui.MainView().GetRoom(evt.RoomID) + mainView := c.ui.MainView() + roomView := mainView.GetRoom(evt.RoomID) if roomView == nil { return } - message := c.ui.MainView().ProcessMembershipEvent(roomView, evt) + message := mainView.ProcessMembershipEvent(roomView, evt) if message != nil { // TODO this shouldn't be necessary roomView.Room.UpdateState(evt) // TODO This should probably also be in a different place roomView.UpdateUserList() + pushRules := c.PushRules().GetActions(roomView.Room, evt).Should() + mainView.NotifyMessage(roomView.Room, message, pushRules) roomView.AddMessage(message, widget.AppendMessage) c.ui.Render() } diff --git a/notification/notify_darwin.go b/notification/notify_darwin.go index 1d9cbbc..1e09ef8 100644 --- a/notification/notify_darwin.go +++ b/notification/notify_darwin.go @@ -31,7 +31,7 @@ func init() { TerminalNotifierAvailable = true } -func Send(title, text string, critical bool) error { +func Send(title, text string, critical, sound bool) error { if TerminalNotifierAvailable { args := []string{"-title", "gomuks", "-subtitle", title, "-message", text} if critical { @@ -39,6 +39,9 @@ func Send(title, text string, critical bool) error { } else { args = append(args, "-timeout", "4") } + if sound { + args = append(args, "-sound", "default") + } // if len(iconPath) > 0 { // args = append(args, "-appIcon", iconPath) // } diff --git a/notification/notify_linux.go b/notification/notify_linux.go index 25ab405..f8ecdaf 100644 --- a/notification/notify_linux.go +++ b/notification/notify_linux.go @@ -18,14 +18,21 @@ package notification import "os/exec" -func Send(title, text string, critical bool) error { +func Send(title, text string, critical, sound bool) error { args := []string{"-a", "gomuks"} if critical { - args = append(args, "-p", "critical") + args = append(args, "-u", "critical") } // if iconPath { // args = append(args, "-i", iconPath) // } args = append(args, title, text) + if sound { + soundName := "message-new-instant" + if critical { + soundName = "complete" + } + exec.Command("paplay", "/usr/share/sounds/freedesktop/stereo/"+soundName+".oga").Run() + } return exec.Command("notify-send", args...).Run() } diff --git a/notification/notify_unsupported.go b/notification/notify_unsupported.go new file mode 100644 index 0000000..0b350e8 --- /dev/null +++ b/notification/notify_unsupported.go @@ -0,0 +1,23 @@ +// +build !linux,!darwin,!windows + +// gomuks - A terminal Matrix client written in Go. +// Copyright (C) 2018 Tulir Asokan +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +package notification + +func Send(title, text string, critical, sound bool) error { + return nil +} diff --git a/notification/notify_windows.go b/notification/notify_windows.go index 71c547d..d927ee1 100644 --- a/notification/notify_windows.go +++ b/notification/notify_windows.go @@ -18,15 +18,18 @@ package notification import "gopkg.in/toast.v1" -func Send(title, text string, critical bool) error { +func Send(title, text string, critical, sound bool) error { notification := toast.Notification{ AppID: "gomuks", Title: title, Message: message, - Audio: toast.IM, + Audio: toast.Silent, Duration: toast.Short, // Icon: ..., } + if sound { + notification.Audio = toast.IM + } if critical { notification.Duration = toast.Long } diff --git a/ui/view-main.go b/ui/view-main.go index a037ea0..a35c35e 100644 --- a/ui/view-main.go +++ b/ui/view-main.go @@ -378,11 +378,11 @@ func (view *MainView) SetTyping(room string, users []string) { } } -func sendNotification(room *rooms.Room, sender, text string, critical bool) { +func sendNotification(room *rooms.Room, sender, text string, critical, sound bool) { if room.GetTitle() != sender { sender = fmt.Sprintf("%s (%s)", sender, room.GetTitle()) } - notification.Send(sender, text, critical) + notification.Send(sender, text, critical, sound) } func (view *MainView) NotifyMessage(room *rooms.Room, message *types.Message, should pushrules.PushActionArrayShould) { @@ -392,7 +392,8 @@ func (view *MainView) NotifyMessage(room *rooms.Room, message *types.Message, sh } shouldNotify := (should.Notify || !should.NotifySpecified) && message.Sender != view.config.Session.UserID if shouldNotify { - sendNotification(room, message.Sender, message.Text, should.Highlight) + shouldPlaySound := should.PlaySound && should.SoundName == "default" + sendNotification(room, message.Sender, message.Text, should.Highlight, shouldPlaySound) if !isCurrent { room.UnreadMessages++ } -- cgit v1.2.3