Add blocking

This commit is contained in:
2026-01-02 11:40:32 +00:00
3 changed files with 57 additions and 9 deletions

2
go.mod
View File

@@ -8,8 +8,8 @@ require (
github.com/makeworld-the-better-one/go-isemoji v1.3.0 github.com/makeworld-the-better-one/go-isemoji v1.3.0
github.com/rrivera/identicon v0.0.0-20240116195454-d5ba35832c0d github.com/rrivera/identicon v0.0.0-20240116195454-d5ba35832c0d
github.com/shreve/musicwand v0.0.1 github.com/shreve/musicwand v0.0.1
github.com/sunglocto/oasis-sdk v0.0.0-20251128101950-083ea4658d9c
mellium.im/xmpp v0.22.0 mellium.im/xmpp v0.22.0
pain.agency/oasis-sdk v0.0.0-20250918002549-5a45c8afedcd
) )
require ( require (

8
go.sum
View File

@@ -78,6 +78,12 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/sunglocto/oasis-sdk v0.0.0-20251128095406-3c003b830815 h1:HsI7kxYauygjRK15Iwf3FlZnU8XJwRPSmbtoNfeyBYk=
github.com/sunglocto/oasis-sdk v0.0.0-20251128095406-3c003b830815/go.mod h1:Y5iPruMLvqNwGVqB+n/+wylQjCTPKQx37I/PyLWhuzk=
github.com/sunglocto/oasis-sdk v0.0.0-20251128100941-f53b1dabbcac h1:pVarwnSbjNSDpeQer/SERztTEpkl6Cnb5xuyxXmb50k=
github.com/sunglocto/oasis-sdk v0.0.0-20251128100941-f53b1dabbcac/go.mod h1:Y5iPruMLvqNwGVqB+n/+wylQjCTPKQx37I/PyLWhuzk=
github.com/sunglocto/oasis-sdk v0.0.0-20251128101950-083ea4658d9c h1:peWSGIl0xBvx3sJR3+kHV1xOe1X8dbQ9xtvEXyXogCo=
github.com/sunglocto/oasis-sdk v0.0.0-20251128101950-083ea4658d9c/go.mod h1:Y5iPruMLvqNwGVqB+n/+wylQjCTPKQx37I/PyLWhuzk=
github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI=
github.com/yuin/goldmark v1.7.8 h1:iERMLn0/QJeHFhxSt3p6PeN9mGnvIKSpG9YYorDMnic= github.com/yuin/goldmark v1.7.8 h1:iERMLn0/QJeHFhxSt3p6PeN9mGnvIKSpG9YYorDMnic=
github.com/yuin/goldmark v1.7.8/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= github.com/yuin/goldmark v1.7.8/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E=
@@ -113,5 +119,3 @@ mellium.im/xmlstream v0.15.4 h1:gLKxcWl4rLMUpKgtzrTBvr4OexPeO/edYus+uK3F6ZI=
mellium.im/xmlstream v0.15.4/go.mod h1:yXaCW2++fmVO4L9piKVkyLDqnCmictVYF7FDQW8prb4= mellium.im/xmlstream v0.15.4/go.mod h1:yXaCW2++fmVO4L9piKVkyLDqnCmictVYF7FDQW8prb4=
mellium.im/xmpp v0.22.0 h1:UthQVSwEAr7SNrmyc90c2ykGpVHxjn/3yw8Ey4+Im8s= mellium.im/xmpp v0.22.0 h1:UthQVSwEAr7SNrmyc90c2ykGpVHxjn/3yw8Ey4+Im8s=
mellium.im/xmpp v0.22.0/go.mod h1:WSjq12nhREFD88Vy/0WD6Q8inE8t6a8w7QjzwivWitw= mellium.im/xmpp v0.22.0/go.mod h1:WSjq12nhREFD88Vy/0WD6Q8inE8t6a8w7QjzwivWitw=
pain.agency/oasis-sdk v0.0.0-20250918002549-5a45c8afedcd h1:oLKI4XqaHpJeegwRxRYH9hepFO4GYKCr6C7cLwqXTK8=
pain.agency/oasis-sdk v0.0.0-20250918002549-5a45c8afedcd/go.mod h1:eyvDgfpHo+9bdB/AkMEMZ3ETeoSONTULVx9X4w9kGAU=

56
main.go
View File

@@ -34,7 +34,7 @@ import (
"mellium.im/xmpp/jid" "mellium.im/xmpp/jid"
"mellium.im/xmpp/muc" "mellium.im/xmpp/muc"
"mellium.im/xmpp/pubsub" "mellium.im/xmpp/pubsub"
oasisSdk "pain.agency/oasis-sdk" oasisSdk "github.com/sunglocto/oasis-sdk"
// TODO: integrated theme switcher // TODO: integrated theme switcher
) )
@@ -173,6 +173,8 @@ func CreateUITab(chatJidStr string) ChatTabUI {
replytext.Hide() replytext.Hide()
replytext.Importance = widget.SuccessImportance replytext.Importance = widget.SuccessImportance
replytext.Selectable = true replytext.Selectable = true
// replytext.Wrapping = fyne.TextWrapWord
replytext.Truncation = fyne.TextTruncateEllipsis
btn := widget.NewButtonWithIcon("View media", icon, func() { btn := widget.NewButtonWithIcon("View media", icon, func() {
}) })
@@ -275,7 +277,12 @@ func CreateUITab(chatJidStr string) ChatTabUI {
content.SetText(msgContent) content.SetText(msgContent)
if chatTabs[chatJidStr].Messages[i].ReplyID != "PICLIENT:UNAVAILABLE" { if chatTabs[chatJidStr].Messages[i].ReplyID != "PICLIENT:UNAVAILABLE" {
reply := chatTabs[chatJidStr].Messages[i].Raw.Reply reply := chatTabs[chatJidStr].Messages[i].Raw.Reply
guy := jid.MustParse(reply.To).Resourcepart() j, err := jid.Parse(reply.To)
if err != nil {
log.Println("ERR: " + err.Error()) // FIXME
return
}
guy := j.Resourcepart()
// TODO: EXPERIMENTALLY GET REPLIED TO TEXT // TODO: EXPERIMENTALLY GET REPLIED TO TEXT
for i := len(chatTabs[chatJidStr].Messages) - 1; i >= 0; i-- { for i := len(chatTabs[chatJidStr].Messages) - 1; i >= 0; i-- {
@@ -573,7 +580,7 @@ func main() {
var ImageID string = "" var ImageID string = ""
mucJidStr := msg.From.Bare().String() mucJidStr := msg.From.Bare().String()
if tab, ok := chatTabs[mucJidStr]; ok { if tab, ok := chatTabs[mucJidStr]; ok {
chatInfo.Objects[0] = widget.NewLabel(fmt.Sprintf("[!] %s", mucJidStr)) //chatInfo.Objects[0] = widget.NewLabel(fmt.Sprintf("[!] %s", mucJidStr))
chatTabs[mucJidStr].Muc = muc chatTabs[mucJidStr].Muc = muc
str := *msg.CleanedBody str := *msg.CleanedBody
if strings.Contains(str, login.DisplayName) { if strings.Contains(str, login.DisplayName) {
@@ -649,7 +656,10 @@ func main() {
fyne.Do(func() { fyne.Do(func() {
UITabs[mucJidStr].Scroller.Refresh() UITabs[mucJidStr].Scroller.Refresh()
if scrollDownOnNewMessage { if scrollDownOnNewMessage {
UITabs[mucJidStr].Scroller.ScrollToBottom() tab, ok := UITabs[mucJidStr]
if ok {
tab.Scroller.ScrollToBottom()
}
} }
}) })
} }
@@ -682,6 +692,7 @@ func main() {
}) })
client.SetPresenceHandler(func(client *oasisSdk.XmppClient, from jid.JID, p oasisSdk.UserPresence) { client.SetPresenceHandler(func(client *oasisSdk.XmppClient, from jid.JID, p oasisSdk.UserPresence) {
log.Println(p.Type)
bareAcc := from.Bare() bareAcc := from.Bare()
tab, ok := chatTabs[bareAcc.String()] tab, ok := chatTabs[bareAcc.String()]
if !ok { if !ok {
@@ -696,6 +707,9 @@ func main() {
}) })
client.SetBookmarkHandler(false, func(client *oasisSdk.XmppClient, bookmark bookmarks.Channel) { client.SetBookmarkHandler(false, func(client *oasisSdk.XmppClient, bookmark bookmarks.Channel) {
if !config.JoinBookmarks {
return
}
// FIXME // FIXME
if bookmark.JID.String() == "conversations-offtopic-reloaded@conference.trashserver.net" { if bookmark.JID.String() == "conversations-offtopic-reloaded@conference.trashserver.net" {
return return
@@ -1064,8 +1078,9 @@ func main() {
bookmarks := client.BookmarkCache() bookmarks := client.BookmarkCache()
box := container.NewVBox() box := container.NewVBox()
box.Add(widget.NewRichTextFromMarkdown("# Manage Bookmarks")) box.Add(widget.NewRichTextFromMarkdown("# Manage Bookmarks"))
box.Add(widget.NewLabel(fmt.Sprintf("%d bookmarks", len(bookmarks))))
for address, bookmark := range bookmarks { for address, bookmark := range bookmarks {
bookmarkWidget := container.NewGridWithColumns(5) bookmarkWidget := container.NewGridWithColumns(7)
nameLabel := widget.NewLabel(bookmark.Name) nameLabel := widget.NewLabel(bookmark.Name)
nameLabel.Wrapping = fyne.TextWrapBreak nameLabel.Wrapping = fyne.TextWrapBreak
@@ -1080,6 +1095,7 @@ func main() {
var autojoinCheck *widget.Check var autojoinCheck *widget.Check
var deleteBookmarkButton *widget.Button var deleteBookmarkButton *widget.Button
var joinRoomButton *widget.Button var joinRoomButton *widget.Button
var setNick *widget.Button
joinRoomButton = widget.NewButtonWithIcon("Join", theme.AccountIcon(), func() { joinRoomButton = widget.NewButtonWithIcon("Join", theme.AccountIcon(), func() {
fyne.Do(func() { joinRoomButton.Disable() }) fyne.Do(func() { joinRoomButton.Disable() })
go func() { go func() {
@@ -1133,9 +1149,32 @@ func main() {
}() }()
}) })
nickEntry := widget.NewEntry()
nickEntry.SetText(bookmark.Nick)
setNick = widget.NewButton("Set nick", func() {
go func() {
fyne.Do(func() {setNick.Disable()})
newNick := nickEntry.Text
bookmark.Nick = newNick
err := client.PublishBookmark(bookmark, context.TODO())
if err != nil {
fyne.Do(func() {
setNick.Enable()
dialog.ShowError(err, w)
})
return
}
client.RefreshBookmarks(false)
fyne.Do(func() {setNick.Enable()})
}()
})
bookmarkWidget.Add(autojoinCheck) bookmarkWidget.Add(autojoinCheck)
bookmarkWidget.Add(deleteBookmarkButton) bookmarkWidget.Add(deleteBookmarkButton)
bookmarkWidget.Add(joinRoomButton) bookmarkWidget.Add(joinRoomButton)
bookmarkWidget.Add(nickEntry)
bookmarkWidget.Add(setNick)
box.Add(bookmarkWidget) box.Add(bookmarkWidget)
} }
@@ -1543,10 +1582,13 @@ func main() {
if tab.isMuc { if tab.isMuc {
nameLabel := widget.NewRichTextFromMarkdown("# " + activeChatJid) nameLabel := widget.NewRichTextFromMarkdown("# " + activeChatJid)
nameLabel.Truncation = fyne.TextTruncateEllipsis nameLabel.Truncation = fyne.TextTruncateEllipsis
box := container.NewVBox(nameLabel, widget.NewLabel(fmt.Sprintf("%d members ", len(tab.Members)))) memberLabel := widget.NewLabel(fmt.Sprintf("%d members ", len(tab.Members)))
memberLabel.Truncation = fyne.TextTruncateEllipsis
box := container.NewVBox(nameLabel, )
chatSidebar.Objects = []fyne.CanvasObject{} chatSidebar.Objects = []fyne.CanvasObject{}
for name, p := range tab.Members { for name, p := range tab.Members {
log.Println(string(p.Type))
gen, _ := identicon.New("github", 5, 3) gen, _ := identicon.New("github", 5, 3)
userjid, err := jid.Parse(name) userjid, err := jid.Parse(name)
if err != nil { if err != nil {
@@ -1561,6 +1603,7 @@ func main() {
mention := func() { mention := func() {
entry.SetText(fmt.Sprintf("%s %s", entry.Text, nickname)) entry.SetText(fmt.Sprintf("%s %s", entry.Text, nickname))
} }
if err != nil { if err != nil {
fmt.Println("ERROR: " + err.Error()) fmt.Println("ERROR: " + err.Error())
box.Add(container.NewHBox(widget.NewLabel(nickname), widget.NewButton("Mention", mention))) box.Add(container.NewHBox(widget.NewLabel(nickname), widget.NewButton("Mention", mention)))
@@ -1571,6 +1614,7 @@ func main() {
imageWidget.Refresh() imageWidget.Refresh()
nickLabel := widget.NewLabel(nickname) nickLabel := widget.NewLabel(nickname)
nickLabel.Selectable = true nickLabel.Selectable = true
nickLabel.Truncation = fyne.TextTruncateClip
box.Add(container.NewHBox(imageWidget, nickLabel)) box.Add(container.NewHBox(imageWidget, nickLabel))
if p.Status != "" { if p.Status != "" {