From a59dbc589f71471e91c2af3169141e5c6989c3f1 Mon Sep 17 00:00:00 2001 From: Sydney Anne Erickson <sydney@elixxir.io> Date: Fri, 23 Sep 2022 14:57:43 -0700 Subject: [PATCH] Desktop notifications --- client/channels.go | 7 +++++++ go.mod | 7 ++++++- go.sum | 13 +++++++++++++ icon.png | Bin 0 -> 4112 bytes 4 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 icon.png diff --git a/client/channels.go b/client/channels.go index f40cf6d..57d5157 100644 --- a/client/channels.go +++ b/client/channels.go @@ -18,6 +18,7 @@ import ( "gitlab.com/elixxir/crypto/channel" "gitlab.com/elixxir/crypto/fastRNG" "gitlab.com/xx_network/primitives/id" + "github.com/gen2brain/beeep" "strconv" "strings" "time" @@ -170,6 +171,12 @@ func (m *Manager) ReceiveMessage(channelID *id.ID, messageID channel.MessageID, message := usernameField + " " + timestampField + "\n" + messageField c.ReceivedMsgChan <- message + + err := beeep.Notify(senderUsername, strings.TrimSpace(text), "icon.png") + if err != nil { + jww.FATAL.Printf("Could not make desktop notification occur: %s", err) + return + } } func (m *Manager) ReceiveReply(channelID *id.ID, messageID channel.MessageID, reactionTo channel.MessageID, senderUsername, text string, timestamp time.Time, lease time.Duration, round rounds.Round, status channels.SentStatus) { diff --git a/go.mod b/go.mod index 9b4ade0..a2f5500 100644 --- a/go.mod +++ b/go.mod @@ -27,6 +27,9 @@ require ( github.com/fsnotify/fsnotify v1.5.4 // indirect github.com/gdamore/encoding v1.0.0 // indirect github.com/gdamore/tcell/v2 v2.4.0 // indirect + github.com/gen2brain/beeep v0.0.0-20220909211152-5a9ec94374f6 // indirect + github.com/go-toast/toast v0.0.0-20190211030409-01e6764cf0a4 // indirect + github.com/godbus/dbus/v5 v5.1.0 // indirect github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3 // indirect github.com/golang/protobuf v1.5.2 // indirect github.com/gorilla/websocket v1.5.0 // indirect @@ -41,6 +44,7 @@ require ( github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 // indirect + github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d // indirect github.com/pelletier/go-toml v1.9.5 // indirect github.com/pelletier/go-toml/v2 v2.0.2 // indirect github.com/pkg/profile v1.6.0 // indirect @@ -51,6 +55,7 @@ require ( github.com/spf13/afero v1.9.2 // indirect github.com/spf13/cast v1.5.0 // indirect github.com/subosito/gotenv v1.4.0 // indirect + github.com/tadvi/systray v0.0.0-20190226123456-11a2b8fa57af // indirect github.com/ttacon/builder v0.0.0-20170518171403-c099f663e1c2 // indirect github.com/ttacon/libphonenumber v1.2.1 // indirect github.com/tyler-smith/go-bip39 v1.1.0 // indirect @@ -69,7 +74,7 @@ require ( golang.org/x/image v0.0.0-20211028202545-6944b10bf410 // indirect golang.org/x/mobile v0.0.0-20210716004757-34ab1303b554 // indirect golang.org/x/net v0.0.0-20220822230855-b0a4917ee28c // indirect - golang.org/x/sys v0.0.0-20220731174439-a90be440212d // indirect + golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8 // indirect golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect golang.org/x/text v0.3.7 // indirect google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc // indirect diff --git a/go.sum b/go.sum index 720bf9c..6b5b6db 100644 --- a/go.sum +++ b/go.sum @@ -173,6 +173,8 @@ github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdk github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= github.com/gdamore/tcell/v2 v2.4.0 h1:W6dxJEmaxYvhICFoTY3WrLLEXsQ11SaFnKGVEXW57KM= github.com/gdamore/tcell/v2 v2.4.0/go.mod h1:cTTuF84Dlj/RqmaCIV5p4w8uG1zWdk0SF6oBpwHp4fU= +github.com/gen2brain/beeep v0.0.0-20220909211152-5a9ec94374f6 h1:jFEK/SA/7E8lg9T33+y8D4Z0I782+bbiEjmyyklRzRQ= +github.com/gen2brain/beeep v0.0.0-20220909211152-5a9ec94374f6/go.mod h1:/WeFVhhxMOGypVKS0w8DUJxUBbHypnWkUVnW7p5c9Pw= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= @@ -200,6 +202,8 @@ github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1 github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-toast/toast v0.0.0-20190211030409-01e6764cf0a4 h1:qZNfIGkIANxGv/OqtnntR4DfOY2+BgwR60cAcu/i3SE= +github.com/go-toast/toast v0.0.0-20190211030409-01e6764cf0a4/go.mod h1:kW3HQ4UdaAyrUCSSDR4xUzBKW6O2iA4uHhk7AtyYp10= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= @@ -207,6 +211,8 @@ github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6Wezm github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= +github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -480,6 +486,8 @@ github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OS github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ= github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d h1:VhgPp6v9qf9Agr/56bj7Y/xa04UccTW04VP0Qed4vnQ= +github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d/go.mod h1:YUTz3bUH2ZwIWBy3CJBeOBEugqcmXREj14T+iG/4k4U= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= @@ -614,6 +622,8 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs= github.com/subosito/gotenv v1.4.0 h1:yAzM1+SmVcz5R4tXGsNMu1jUl2aOJXoiWUCEwwnGrvs= github.com/subosito/gotenv v1.4.0/go.mod h1:mZd6rFysKEcUhUHXJk0C/08wAgyDBFuwEYL7vWWGaGo= +github.com/tadvi/systray v0.0.0-20190226123456-11a2b8fa57af h1:6yITBqGTE2lEeTPG04SN9W+iWHCRyHqlVYILiSXziwk= +github.com/tadvi/systray v0.0.0-20190226123456-11a2b8fa57af/go.mod h1:4F09kP5F+am0jAwlQLddpoMDM+iewkxxt6nxUQ5nq5o= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/ttacon/builder v0.0.0-20170518171403-c099f663e1c2 h1:5u+EJUQiosu3JFX0XS0qTf5FznsMOzTjGqavBGuCbo0= github.com/ttacon/builder v0.0.0-20170518171403-c099f663e1c2/go.mod h1:4kyMkleCiLkgY6z8gK5BkI01ChBtxR0ro3I1ZDcGM3w= @@ -978,6 +988,7 @@ golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -986,6 +997,8 @@ golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220731174439-a90be440212d h1:Sv5ogFZatcgIMMtBSTTAgMYsicp25MXBubjXNDKwm80= golang.org/x/sys v0.0.0-20220731174439-a90be440212d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8 h1:h+EGohizhe9XlX18rfpa8k8RAc5XyaeamM+0VHRd4lc= +golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= diff --git a/icon.png b/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4864c0c21707c1913bf508e970553ba8df90fbee GIT binary patch literal 4112 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 RRt5$J22WQ%mvv4FO#oXlhPeO$ literal 0 HcmV?d00001 -- GitLab