From d3ce38b7359151f59ba24dcf398bcb4dc711307c Mon Sep 17 00:00:00 2001 From: rigormorrtiss Date: Thu, 9 Sep 2021 21:34:47 +0400 Subject: [PATCH] feat: implement desktop notifications (#42) --- discordo.go | 29 +++++++++++++++++++++++++++-- go.mod | 1 + go.sum | 13 +++++++++++++ util/config.go | 6 ++++-- 4 files changed, 45 insertions(+), 4 deletions(-) diff --git a/discordo.go b/discordo.go index a919237..8fe8182 100644 --- a/discordo.go +++ b/discordo.go @@ -1,11 +1,13 @@ package main import ( + "fmt" "sort" "strings" "github.com/atotto/clipboard" "github.com/gdamore/tcell/v2" + "github.com/gen2brain/beeep" "github.com/rigormorrtiss/discordgo" "github.com/rigormorrtiss/discordo/ui" "github.com/rigormorrtiss/discordo/util" @@ -279,8 +281,31 @@ func onSessionReady(_ *discordgo.Session, r *discordgo.Ready) { guildsView.SetCurrentNode(n) } -func onSessionMessageCreate(_ *discordgo.Session, m *discordgo.MessageCreate) { - if selectedChannel == nil || selectedChannel.ID != m.ChannelID { +func onSessionMessageCreate(s *discordgo.Session, m *discordgo.MessageCreate) { + if selectedChannel == nil { + selectedChannel = &discordgo.Channel{ID: ""} + } + + if selectedChannel.ID != m.ChannelID { + if config.Notifications { + for _, u := range m.Mentions { + // If the client user account is mentioned in the message content, send a desktop notification with details. + if u.ID == s.State.User.ID { + g, err := s.State.Guild(m.GuildID) + if err != nil { + return + } + c, err := s.State.Channel(m.ChannelID) + if err != nil { + return + } + + beeep.Alert(fmt.Sprintf("%s (#%s)", g.Name, c.Name), m.ContentWithMentionsReplaced(), "") + return + } + } + } + return } diff --git a/go.mod b/go.mod index c245be3..79be34d 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,7 @@ go 1.16 require ( github.com/atotto/clipboard v0.1.4 github.com/gdamore/tcell/v2 v2.4.1-0.20210904044819-ae5116d72813 + github.com/gen2brain/beeep v0.0.0-20210529141713-5586760f0cc1 github.com/rigormorrtiss/discordgo v0.23.3-0.20210821171441-1f1f1a283940 github.com/rivo/tview v0.0.0-20210904173154-2f13f81dcb15 github.com/zalando/go-keyring v0.1.1 diff --git a/go.sum b/go.sum index 2f337da..3c34dfe 100644 --- a/go.sum +++ b/go.sum @@ -10,8 +10,16 @@ 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.1-0.20210904044819-ae5116d72813 h1:uqlt4EHPdtAAXKBq6OKc0auHsQP5zfhdHo/BYe6hz2Q= github.com/gdamore/tcell/v2 v2.4.1-0.20210904044819-ae5116d72813/go.mod h1:Az6Jt+M5idSED2YPGtwnfJV0kXohgdCBPmHGSYc1r04= +github.com/gen2brain/beeep v0.0.0-20210529141713-5586760f0cc1 h1:Xh9mvwEmhbdXlRSsgn+N0zj/NqnKvpeqL08oKDHln2s= +github.com/gen2brain/beeep v0.0.0-20210529141713-5586760f0cc1/go.mod h1:ElSskYZe3oM8kThaHGJ+kiN2yyUMVXMZ7WxF9QqLDS8= +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/godbus/dbus/v5 v5.0.3 h1:ZqHaoEF7TBzh4jzPmqVhE/5A1z9of6orkAe5uHoAeME= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gopherjs/gopherjs v0.0.0-20180825215210-0210a2f0f73c h1:16eHWuMGvCjSfgRJKqIzapE78onvvTbdi1rMkU00lZw= +github.com/gopherjs/gopherjs v0.0.0-20180825215210-0210a2f0f73c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gopherjs/gopherwasm v1.1.0 h1:fA2uLoctU5+T3OhOn2vYP0DVT6pxc7xhTlBB1paATqQ= +github.com/gopherjs/gopherwasm v1.1.0/go.mod h1:SkZ8z7CWBz5VXbhJel8TxCmAcsQqzgWGR/8nMhyhZSI= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= @@ -19,6 +27,8 @@ github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69 github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rigormorrtiss/discordgo v0.23.3-0.20210821171441-1f1f1a283940 h1:Qg0MhvFI7Mg4Za9/Htou4y3nDaU0uABMYRys4U1WK4g= @@ -31,12 +41,15 @@ github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +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/zalando/go-keyring v0.1.1 h1:w2V9lcx/Uj4l+dzAf1m9s+DJ1O8ROkEHnynonHjTcYE= github.com/zalando/go-keyring v0.1.1/go.mod h1:OIC+OZ28XbmwFxU/Rp9V7eKzZjamBJwRzC8UFJH9+L8= golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b h1:7mWr3k41Qtv8XlltBkDkl8LoP3mpSgBW8BUoxtEdbXg= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210309074719-68d13333faf2 h1:46ULzRKLh1CwgRq2dC5SlBzEqqNCi8rreOZnNrbqcIY= golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/util/config.go b/util/config.go index 5c381ea..e66a700 100644 --- a/util/config.go +++ b/util/config.go @@ -12,6 +12,7 @@ import ( type Config struct { Token string `json:"token"` Mouse bool `json:"mouse"` + Notifications bool `json:"notifications"` UserAgent string `json:"userAgent"` GetMessagesLimit int `json:"getMessagesLimit"` Theme tview.Theme `json:"theme"` @@ -20,8 +21,9 @@ type Config struct { // NewConfig reads the configuration file (if exists) and returns a new config. func NewConfig() *Config { c := Config{ - Token: "", - Mouse: true, + Token: "", + Mouse: true, + Notifications: true, UserAgent: "" + "Mozilla/5.0 (X11; Linux x86_64) " + "AppleWebKit/537.36 (KHTML, like Gecko) " +