Update oasisSdk and apply breaking changes

This commit is contained in:
2025-08-31 15:53:00 +01:00
parent 5988eead04
commit 1da705a1b0
3 changed files with 221 additions and 215 deletions

2
go.mod
View File

@@ -7,7 +7,7 @@ require (
fyne.io/x/fyne v0.0.0-20250418202416-58a230ad1acb fyne.io/x/fyne v0.0.0-20250418202416-58a230ad1acb
github.com/rrivera/identicon v0.0.0-20240116195454-d5ba35832c0d github.com/rrivera/identicon v0.0.0-20240116195454-d5ba35832c0d
mellium.im/xmpp v0.22.0 mellium.im/xmpp v0.22.0
pain.agency/oasis-sdk v0.0.0-20250809192709-a3e5dff1aa61 pain.agency/oasis-sdk v0.0.0-20250831105702-85385dca3a95
) )
require ( require (

2
go.sum
View File

@@ -101,3 +101,5 @@ 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-20250809192709-a3e5dff1aa61 h1:7zb69SAfLAJhXoqXZaS0pq/p1Y9W19Pm4FjcwWjTVoE= pain.agency/oasis-sdk v0.0.0-20250809192709-a3e5dff1aa61 h1:7zb69SAfLAJhXoqXZaS0pq/p1Y9W19Pm4FjcwWjTVoE=
pain.agency/oasis-sdk v0.0.0-20250809192709-a3e5dff1aa61/go.mod h1:eyvDgfpHo+9bdB/AkMEMZ3ETeoSONTULVx9X4w9kGAU= pain.agency/oasis-sdk v0.0.0-20250809192709-a3e5dff1aa61/go.mod h1:eyvDgfpHo+9bdB/AkMEMZ3ETeoSONTULVx9X4w9kGAU=
pain.agency/oasis-sdk v0.0.0-20250831105702-85385dca3a95 h1:BcB7/hnMnQIU+pERvQRGFMt9i0/o8XCnHbK1kYG3/K4=
pain.agency/oasis-sdk v0.0.0-20250831105702-85385dca3a95/go.mod h1:eyvDgfpHo+9bdB/AkMEMZ3ETeoSONTULVx9X4w9kGAU=

432
main.go
View File

@@ -202,8 +202,6 @@ func CreateUITab(chatJidStr string) ChatTabUI {
return return
} }
if strings.HasSuffix(chatTabs[chatJidStr].Messages[i].ImageURL, "mp4") || strings.HasSuffix(chatTabs[chatJidStr].Messages[i].ImageURL, "mp3") || strings.HasSuffix(chatTabs[chatJidStr].Messages[i].ImageURL, "gif") || strings.HasSuffix(chatTabs[chatJidStr].Messages[i].ImageURL, "webp") { // FIXME: This code is fucking terrible // TODO: Could check mime? if strings.HasSuffix(chatTabs[chatJidStr].Messages[i].ImageURL, "mp4") || strings.HasSuffix(chatTabs[chatJidStr].Messages[i].ImageURL, "mp3") || strings.HasSuffix(chatTabs[chatJidStr].Messages[i].ImageURL, "gif") || strings.HasSuffix(chatTabs[chatJidStr].Messages[i].ImageURL, "webp") { // FIXME: This code is fucking terrible // TODO: Could check mime?
url, err := url.Parse(chatTabs[chatJidStr].Messages[i].ImageURL) url, err := url.Parse(chatTabs[chatJidStr].Messages[i].ImageURL)
if err != nil { if err != nil {
@@ -396,91 +394,16 @@ func main() {
notifications = config.Notifications notifications = config.Notifications
client, err := oasisSdk.CreateClient( client, err := oasisSdk.CreateClient(
&login, &login)
func(client *oasisSdk.XmppClient, msg *oasisSdk.XMPPChatMessage) {
correction := false
userJidStr := msg.From.Bare().String()
tab, ok := chatTabs[userJidStr]
if ok {
str := *msg.CleanedBody
if notifications {
a.SendNotification(fyne.NewNotification(fmt.Sprintf("%s says", userJidStr), str))
}
for _, v := range msg.Unknown { client.SetDmHandler(func(client *oasisSdk.XmppClient, msg *oasisSdk.XMPPChatMessage) {
if v.XMLName.Local == "replace" { correction := false
correction = true userJidStr := msg.From.Bare().String()
break // dont need to look at more fields tab, ok := chatTabs[userJidStr]
} if ok {
} str := *msg.CleanedBody
if notifications {
var img string = "" a.SendNotification(fyne.NewNotification(fmt.Sprintf("%s says", userJidStr), str))
if strings.Contains(str, "https://") {
lines := strings.Split(str, "\n")
for i, line := range lines {
s := strings.Split(line, " ")
for _, v := range s {
_, err := url.Parse(v)
if err == nil && strings.HasPrefix(v, "https://") {
if strings.HasSuffix(v, ".png") || strings.HasSuffix(v, ".jpg") || strings.HasSuffix(v, ".jpeg") || strings.HasSuffix(v, ".webp") || strings.HasSuffix(v, ".mp4") || strings.HasSuffix(v, ".gif") {
img = v
}
}
}
lines[i] = strings.Join(s, " ")
}
str = strings.Join(lines, " ")
}
var replyID string
if msg.Reply == nil {
replyID = "PICLIENT:UNAVAILABLE"
} else {
replyID = msg.Reply.ID
}
if correction {
for i := len(tab.Messages) - 1; i > 0; i-- {
if tab.Messages[i].Raw.From.String() == msg.From.String() {
tab.Messages[i].Content = *msg.CleanedBody + " (edited)"
fyne.Do(func() {
UITabs[userJidStr].Scroller.Refresh()
})
return
}
}
}
myMessage := Message{
Author: msg.From.Resourcepart(),
Content: str,
ID: msg.ID,
ReplyID: replyID,
Raw: *msg,
ImageURL: img,
}
tab.Messages = append(tab.Messages, myMessage)
fyne.Do(func() {
UITabs[userJidStr].Scroller.Refresh()
if scrollDownOnNewMessage {
UITabs[userJidStr].Scroller.ScrollToBottom()
}
})
}
},
func(client *oasisSdk.XmppClient, muc *muc.Channel, msg *oasisSdk.XMPPChatMessage) {
// HACK: IGNORING ALL MESSAGES FROM CLASSIC MUC HISTORY IN PREPARATION OF MAM SUPPORT
ignore := false
correction := false
important := false
donotnotify := false
for _, v := range msg.Unknown {
if v.XMLName.Local == "delay" { // Classic history message
donotnotify = true
//ignore = true
//fmt.Println("ignoring!")
//return //what is blud doing
}
} }
for _, v := range msg.Unknown { for _, v := range msg.Unknown {
@@ -490,105 +413,186 @@ func main() {
} }
} }
var ImageID string = "" var img string = ""
mucJidStr := msg.From.Bare().String() if strings.Contains(str, "https://") {
if tab, ok := chatTabs[mucJidStr]; ok { lines := strings.Split(str, "\n")
chatTabs[mucJidStr].Muc = muc for i, line := range lines {
str := *msg.CleanedBody s := strings.Split(line, " ")
if strings.Contains(str, login.DisplayName) { for _, v := range s {
fmt.Println(str) _, err := url.Parse(v)
important = true if err == nil && strings.HasPrefix(v, "https://") {
} if strings.HasSuffix(v, ".png") || strings.HasSuffix(v, ".jpg") || strings.HasSuffix(v, ".jpeg") || strings.HasSuffix(v, ".webp") || strings.HasSuffix(v, ".mp4") || strings.HasSuffix(v, ".gif") {
if !donotnotify && !ignore && notifications { img = v
if !correction && msg.From.String() != client.JID.String() && strings.Contains(str, login.DisplayName) || (msg.Reply != nil && strings.Contains(msg.Reply.To, login.DisplayName)) {
a.SendNotification(fyne.NewNotification(fmt.Sprintf("Mentioned in %s", mucJidStr), str))
}
}
if strings.Contains(str, "https://") {
lines := strings.Split(str, "\n")
for i, line := range lines {
s := strings.Split(line, " ")
for _, v := range s {
_, err := url.Parse(v)
if err == nil && strings.HasPrefix(v, "https://") {
if strings.HasSuffix(v, ".png") || strings.HasSuffix(v, ".jpg") || strings.HasSuffix(v, ".jpeg") || strings.HasSuffix(v, ".webp") || strings.HasSuffix(v, ".mp4") || strings.HasSuffix(v, ".mp3") || strings.HasSuffix(v, ".gif") {
ImageID = v
}
} }
} }
lines[i] = strings.Join(s, " ")
} }
str = strings.Join(lines, " ") lines[i] = strings.Join(s, " ")
fmt.Println(str)
}
fmt.Println(msg.ID)
var replyID string
if msg.Reply == nil {
replyID = "PICLIENT:UNAVAILABLE"
} else {
replyID = msg.Reply.To
} }
str = strings.Join(lines, " ")
}
var replyID string
if msg.Reply == nil {
replyID = "PICLIENT:UNAVAILABLE"
} else {
replyID = msg.Reply.ID
}
if correction { if correction {
for i := len(tab.Messages) - 1; i > 0; i-- { for i := len(tab.Messages) - 1; i > 0; i-- {
if tab.Messages[i].Raw.From.String() == msg.From.String() { if tab.Messages[i].Raw.From.String() == msg.From.String() {
tab.Messages[i].Content = *msg.CleanedBody + " (edited)" tab.Messages[i].Content = *msg.CleanedBody + " (edited)"
fyne.Do(func() { fyne.Do(func() {
UITabs[mucJidStr].Scroller.Refresh() UITabs[userJidStr].Scroller.Refresh()
}) })
return return
}
}
}
myMessage := Message{
Author: msg.From.Resourcepart(),
Content: str,
ID: msg.ID,
ReplyID: replyID,
Raw: *msg,
ImageURL: img,
}
tab.Messages = append(tab.Messages, myMessage)
fyne.Do(func() {
UITabs[userJidStr].Scroller.Refresh()
if scrollDownOnNewMessage {
UITabs[userJidStr].Scroller.ScrollToBottom()
}
})
}
})
client.SetGroupChatHandler(func(client *oasisSdk.XmppClient, muc *muc.Channel, msg *oasisSdk.XMPPChatMessage) {
// HACK: IGNORING ALL MESSAGES FROM CLASSIC MUC HISTORY IN PREPARATION OF MAM SUPPORT
ignore := false
correction := false
important := false
donotnotify := false
for _, v := range msg.Unknown {
if v.XMLName.Local == "delay" { // Classic history message
donotnotify = true
//ignore = true
//fmt.Println("ignoring!")
//return //what is blud doing
}
}
for _, v := range msg.Unknown {
if v.XMLName.Local == "replace" {
correction = true
break // dont need to look at more fields
}
}
var ImageID string = ""
mucJidStr := msg.From.Bare().String()
if tab, ok := chatTabs[mucJidStr]; ok {
chatTabs[mucJidStr].Muc = muc
str := *msg.CleanedBody
if strings.Contains(str, login.DisplayName) {
fmt.Println(str)
important = true
}
if !donotnotify && !ignore && notifications {
if !correction && msg.From.String() != client.JID.String() && strings.Contains(str, login.DisplayName) || (msg.Reply != nil && strings.Contains(msg.Reply.To, login.DisplayName)) {
a.SendNotification(fyne.NewNotification(fmt.Sprintf("Mentioned in %s", mucJidStr), str))
}
}
if strings.Contains(str, "https://") {
lines := strings.Split(str, "\n")
for i, line := range lines {
s := strings.Split(line, " ")
for _, v := range s {
_, err := url.Parse(v)
if err == nil && strings.HasPrefix(v, "https://") {
if strings.HasSuffix(v, ".png") || strings.HasSuffix(v, ".jpg") || strings.HasSuffix(v, ".jpeg") || strings.HasSuffix(v, ".webp") || strings.HasSuffix(v, ".mp4") || strings.HasSuffix(v, ".mp3") || strings.HasSuffix(v, ".gif") {
ImageID = v
}
} }
} }
lines[i] = strings.Join(s, " ")
} }
str = strings.Join(lines, " ")
fmt.Println(str)
}
fmt.Println(msg.ID)
var replyID string
if msg.Reply == nil {
replyID = "PICLIENT:UNAVAILABLE"
} else {
replyID = msg.Reply.To
}
myMessage := Message{ if correction {
Author: msg.From.Resourcepart(), for i := len(tab.Messages) - 1; i > 0; i-- {
Content: str, if tab.Messages[i].Raw.From.String() == msg.From.String() {
ID: msg.ID, tab.Messages[i].Content = *msg.CleanedBody + " (edited)"
ReplyID: replyID, fyne.Do(func() {
Raw: *msg, UITabs[mucJidStr].Scroller.Refresh()
ImageURL: ImageID, })
Important: important, return
}
if !ignore {
tab.Messages = append(tab.Messages, myMessage)
}
fyne.Do(func() {
UITabs[mucJidStr].Scroller.Refresh()
if scrollDownOnNewMessage {
UITabs[mucJidStr].Scroller.ScrollToBottom()
} }
}) }
} }
},
func(_ *oasisSdk.XmppClient, from jid.JID, state oasisSdk.ChatState) {
switch state {
case oasisSdk.ChatStateComposing:
fyne.Do(func() {
statBar.SetText(fmt.Sprintf("%s is typing...", from.Resourcepart()))
})
case oasisSdk.ChatStatePaused:
fyne.Do(func() { myMessage := Message{
statBar.SetText(fmt.Sprintf("%s has stopped typing.", from.Resourcepart())) Author: msg.From.Resourcepart(),
}) Content: str,
case oasisSdk.ChatStateInactive: ID: msg.ID,
fyne.Do(func() { ReplyID: replyID,
statBar.SetText(fmt.Sprintf("%s is idle", from.Resourcepart())) Raw: *msg,
}) ImageURL: ImageID,
case oasisSdk.ChatStateGone: Important: important,
fyne.Do(func() {
statBar.SetText(fmt.Sprintf("%s is gone", from.Resourcepart()))
})
default:
fyne.Do(func() {
statBar.SetText("")
})
} }
}, if !ignore {
tab.Messages = append(tab.Messages, myMessage)
}
fyne.Do(func() {
UITabs[mucJidStr].Scroller.Refresh()
if scrollDownOnNewMessage {
UITabs[mucJidStr].Scroller.ScrollToBottom()
}
})
}
})
client.SetChatstateHandler(func(_ *oasisSdk.XmppClient, from jid.JID, state oasisSdk.ChatState) {
switch state {
case oasisSdk.ChatStateComposing:
fyne.Do(func() {
statBar.SetText(fmt.Sprintf("%s is typing...", from.Resourcepart()))
})
case oasisSdk.ChatStatePaused:
fyne.Do(func() {
statBar.SetText(fmt.Sprintf("%s has stopped typing.", from.Resourcepart()))
})
case oasisSdk.ChatStateInactive:
fyne.Do(func() {
statBar.SetText(fmt.Sprintf("%s is idle", from.Resourcepart()))
})
case oasisSdk.ChatStateGone:
fyne.Do(func() {
statBar.SetText(fmt.Sprintf("%s is gone", from.Resourcepart()))
})
default:
fyne.Do(func() {
statBar.SetText("")
})
}
})
client.SetDeliveryReceiptHandler(
func(_ *oasisSdk.XmppClient, from jid.JID, id string) { func(_ *oasisSdk.XmppClient, from jid.JID, id string) {
fmt.Printf("Delivered %s to %s", id, from.String()) fmt.Printf("Delivered %s to %s", id, from.String())
}, })
client.SetReadReceiptHandler(
func(_ *oasisSdk.XmppClient, from jid.JID, id string) { func(_ *oasisSdk.XmppClient, from jid.JID, id string) {
for _, tab := range chatTabs { for _, tab := range chatTabs {
for i := len(tab.Messages) - 1; i >= 0; i-- { for i := len(tab.Messages) - 1; i >= 0; i-- {
@@ -603,8 +607,8 @@ func main() {
} }
} }
fmt.Printf("%s has seen %s\n", from.String(), id) fmt.Printf("%s has seen %s\n", from.String(), id)
}, })
)
if err != nil { if err != nil {
log.Fatalln("Could not create client - " + err.Error()) log.Fatalln("Could not create client - " + err.Error())
} }
@@ -951,55 +955,55 @@ func main() {
d := dialog.NewCustom("Please wait", "Close", widget.NewLabel("..."), w) d := dialog.NewCustom("Please wait", "Close", widget.NewLabel("..."), w)
d.Show() d.Show()
go func() { go func() {
//search, err = jid.Parse(s) //search, err = jid.Parse(s)
//if err != nil { //if err != nil {
// d.Hide() // d.Hide()
// dialog.ShowError(err, w) // dialog.ShowError(err, w)
// return // return
//} //}
txt := `<iq from='ringen@muc.isekai.rocks/sunglocto' txt := `<iq from='ringen@muc.isekai.rocks/sunglocto'
to='ringen@muc.iskai.rocks/snit' to='ringen@muc.iskai.rocks/snit'
type='get' type='get'
id='vc2'> id='vc2'>
<vCard xmlns='vcard-temp'/> <vCard xmlns='vcard-temp'/>
</iq>` </iq>`
var stan stanza.IQ var stan stanza.IQ
xml.Unmarshal([]byte(txt), &stan) xml.Unmarshal([]byte(txt), &stan)
if err != nil { if err != nil {
d.Hide()
dialog.ShowError(err, w)
return
}
r, err := client.Session.EncodeIQ(client.Ctx, stan)
if err != nil {
d.Hide()
dialog.ShowError(err, w)
return
}
ra, _ := r.Token()
t, _ := xml.MarshalIndent(ra, "", "\t")
fmt.Println(string(t))
d.Hide() d.Hide()
dialog.ShowError(err, w) /*
return
}
r, err := client.Session.EncodeIQ(client.Ctx, stan)
if err != nil {
d.Hide()
dialog.ShowError(err, w)
return
}
ra, _ := r.Token()
t, _ := xml.MarshalIndent(ra, "", "\t")
fmt.Println(string(t))
d.Hide()
/*
myBox := container.NewGridWithColumns(1, widget.NewLabel("Items")) myBox := container.NewGridWithColumns(1, widget.NewLabel("Items"))
info, err := disco.GetInfo(client.Ctx, "", search, client.Session) info, err := disco.GetInfo(client.Ctx, "", search, client.Session)
if err != nil { if err != nil {
d.Hide() d.Hide()
dialog.ShowError(err, w) dialog.ShowError(err, w)
return return
} }
m := info.Identity m := info.Identity
bytes, err := xml.MarshalIndent(m, "", "\t") bytes, err := xml.MarshalIndent(m, "", "\t")
if err != nil { if err != nil {
d.Hide() d.Hide()
dialog.ShowError(err, w) dialog.ShowError(err, w)
return return
} }
fyne.Do(func() {d.Hide()}) fyne.Do(func() {d.Hide()})
myBox.Objects = append(myBox.Objects, widget.NewLabel(string(bytes))) myBox.Objects = append(myBox.Objects, widget.NewLabel(string(bytes)))
dialog.ShowCustom("Service discovery", "cancel", myBox, w) dialog.ShowCustom("Service discovery", "cancel", myBox, w)
*/ */
}() }()
}, w) }, w)