diff --git a/debug.png b/debug.png index c101887..3eaccd4 100644 Binary files a/debug.png and b/debug.png differ diff --git a/gtk-helpers.go b/gtk-helpers.go index f663fe2..28256a5 100644 --- a/gtk-helpers.go +++ b/gtk-helpers.go @@ -52,6 +52,12 @@ func showUserWindow(u stanza.Presence, custom_nick string) { status_message.AddCSSClass("status") profile_box.Append(status_message) } + + if loadedConfig.BlockingOI[ocu.ID] { + blocked_note := gtk.NewLabel("You have blocked this user!") + blocked_note.AddCSSClass("blocked") + profile_box.Prepend(blocked_note) + } profile_box.Append(ver_text) fr := gtk.NewLabel(u.From) fr.AddCSSClass("jid") diff --git a/gtk-message.go b/gtk-message.go index 4d57fe6..ff916af 100644 --- a/gtk-message.go +++ b/gtk-message.go @@ -74,7 +74,7 @@ func generatePresenceWidget(p stanza.Packet) gtk.Widgetter { return b } -func generateMessageWidget(p stanza.Packet) (gtk.Widgetter, bool) { +func generateMessageWidget(p stanza.Packet, blocked bool) (gtk.Widgetter, bool) { m, ok := p.(stanza.Message) if !ok { return gtk.NewLabel("Unsupported message."), true @@ -233,12 +233,18 @@ func generateMessageWidget(p stanza.Packet) (gtk.Widgetter, bool) { mainBox.AddController(gesture) - if name == "" { name = JidMustParse(m.From).Bare() } if loadedConfig.CompactMode { + if m.Body == "" { + /* + mlabel.SetText(loadedLocale["noBodySet"]) + mlabel.AddCSSClass("visitor") + */ + return nil, false + } al := gtk.NewLabel(name) ycbcr := xmpp_color.String(id, 255, loadedConfig.CVD) r, g, b, _ := ycbcr.RGBA() @@ -251,13 +257,6 @@ func generateMessageWidget(p stanza.Packet) (gtk.Widgetter, bool) { mlabel := gtk.NewLabel(m.Body) - if m.Body == "" { - /* - mlabel.SetText(loadedLocale["noBodySet"]) - mlabel.AddCSSClass("visitor") - */ - return nil, false - } mlabel.SetWrap(true) mlabel.SetSelectable(true) // mlabel.SetHAlign(gtk.AlignFill) @@ -333,8 +332,8 @@ func generateMessageWidget(p stanza.Packet) (gtk.Widgetter, bool) { mlabel := gtk.NewLabel(m.Body) if m.Body == "" { /* - mlabel.SetText(loadedLocale["noBodySet"]) - mlabel.AddCSSClass("visitor") + mlabel.SetText(loadedLocale["noBodySet"]) + mlabel.AddCSSClass("visitor") */ return nil, false } @@ -404,6 +403,27 @@ func generateMessageWidget(p stanza.Packet) (gtk.Widgetter, bool) { } } + if loadedConfig.BlockingMode == Highlight && blocked { + mainBox.AddCSSClass("blocked") + } + + if loadedConfig.BlockingMode == Hide && blocked { + mainBox.SetVisible(false) + blocked_box := gtk.NewBox(gtk.OrientationVertical, 0) + blocked_part := gtk.NewBox(gtk.OrientationHorizontal, 0) + blocked_part.Append(gtk.NewLabel("This message is from a user you have blocked. ")) + + show_hide := gtk.NewButtonWithLabel("Toggle") + show_hide.ConnectClicked(func() { + mainBox.SetVisible(!mainBox.IsVisible()) + }) + + blocked_part.Append(show_hide) + blocked_box.Append(blocked_part) + blocked_box.Append(mainBox) + return blocked_box, true + } + return mainBox, true } diff --git a/main.go b/main.go index ae70f33..58c6938 100644 --- a/main.go +++ b/main.go @@ -208,15 +208,26 @@ func main() { }) router.HandleFunc("message", func(s xmpp.Sender, p stanza.Packet) { + var blocked bool m, ok := p.(stanza.Message) if !ok { return } - e := stanza.PubSubEvent{} - ok = m.Get(&e) + oi := new(OccupantID) + ok = m.Get(oi) if ok { - fmt.Println(e) + id := oi.ID + va, ok := loadedConfig.BlockingOI[id] + if ok { + if va { + if loadedConfig.BlockingMode == Drop { + return + } else { + blocked = true + } + } + } } originator := JidMustParse(m.From).Bare() @@ -300,13 +311,13 @@ func main() { fmt.Println("Got message when the tab does not exist!") } - untyped_box, valid := generateMessageWidget(p) + untyped_box, valid := generateMessageWidget(p, blocked) ba, converted_successfully := untyped_box.(*gtk.Box) if valid && converted_successfully { typed_tab.msgs.Append(b) b.Append(ba) - } + } }) }) @@ -525,6 +536,33 @@ func main() { `, clientroot.Session.BindJid)) + // Create note to self + jid := JidMustParse(clientroot.Session.BindJid).Bare() + name := "Note To Self" + createTab(jid, false, name) + glib.IdleAdd(func() { + box := gtk.NewBox(gtk.OrientationHorizontal, 10) + b := gtk.NewLabel(name) + gesture1 := gtk.NewGestureClick() + gesture1.SetButton(1) + gesture1.Connect("pressed", func() { + switchToTab(jid, &window.Window) + }) + + box.Append(b) + go func() { + new_im := getAvatar(jid, jid) // TODO: Use PEP avatar and do not use JID as hash + glib.IdleAdd(func() { + new_im.SetPixelSize(40) + box.Prepend(new_im) + }) + }() + + box.AddController(gesture1) + menu.Append(box) + menu.Append(gtk.NewSeparator(gtk.OrientationHorizontal)) + }) + // Fetch roster i, err := stanza.NewIQ(stanza.Attrs{ Type: "get", diff --git a/style.css b/style.css index 9392c1d..d2c5425 100644 --- a/style.css +++ b/style.css @@ -85,3 +85,8 @@ color: cyan; font-family: serif; } + +.blocked { + background-color: orange; + color: black; +} diff --git a/types.go b/types.go index 135f18d..d1d0b90 100644 --- a/types.go +++ b/types.go @@ -15,23 +15,39 @@ type chatTab struct { muc_presence *stanza.Presence } +type BlockingMode int + +const ( + Drop BlockingMode = iota + Hide + Highlight +) + type lambdaConfig struct { - Server string - Username string - Resource string - Password string - Insecure bool - Nick string - JoinBookmarks bool - CVD color.CVD - Identicons bool - Debug bool + Server string + Username string + Resource string + Password string + Insecure bool + Nick string + JoinBookmarks bool + + CVD color.CVD + Identicons bool + + Debug bool + ShowPresenceUpdates bool CompactMode bool ShowAvatarsInMemberList bool - CustomNicks map[string]string // Anyone with a specific Occupant ID will have this nick - CustomNicksAV map[string]string // Anyone with a specific avatar hash will have this nick - CheckUpdate string + + CustomNicks map[string]string // Anyone with a specific Occupant ID will have this nick + CustomNicksAV map[string]string // Anyone with a specific avatar hash will have this nick + + BlockingOI map[string]bool // Any person who's Occupant ID is in this map will have their messages dropped + BlockingMode BlockingMode + + CheckUpdate string } type mucUnit struct {