t
This commit is contained in:
+21
-3
@@ -28,7 +28,9 @@ func scrollToBottomAfterUpdate(scrolledWindow *gtk.ScrolledWindow) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func createTab(jid string, isMuc bool, name string) bool {
|
func createTab(jid string, isMuc bool, name string) bool {
|
||||||
fmt.Println("Creating tab", jid, "isMuc:", isMuc)
|
if name == "" {
|
||||||
|
name = jid
|
||||||
|
}
|
||||||
_, ok := tabs.Load(jid)
|
_, ok := tabs.Load(jid)
|
||||||
_, uok := userdevices.Load(jid)
|
_, uok := userdevices.Load(jid)
|
||||||
_, mok := mucmembers.Load(jid)
|
_, mok := mucmembers.Load(jid)
|
||||||
@@ -138,6 +140,7 @@ func switchToTab(jid string, w *gtk.Window) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
status := gtk.NewImageFromPaintable(clientAssets["status_"+string(u.Show)])
|
status := gtk.NewImageFromPaintable(clientAssets["status_"+string(u.Show)])
|
||||||
status.SetTooltipText(string(u.Show))
|
status.SetTooltipText(string(u.Show))
|
||||||
|
|
||||||
@@ -152,6 +155,22 @@ func switchToTab(jid string, w *gtk.Window) {
|
|||||||
medal.SetHExpand(true)
|
medal.SetHExpand(true)
|
||||||
userbox.Append(medal)
|
userbox.Append(medal)
|
||||||
|
|
||||||
|
default_av := createIdenticon(u.From)
|
||||||
|
userbox.Prepend(default_av)
|
||||||
|
var vcu VCardUpdate
|
||||||
|
ok = u.Get(&vcu)
|
||||||
|
if ok {
|
||||||
|
photo := vcu.Photo
|
||||||
|
go func() {
|
||||||
|
new_im := getAvatar(u.From, photo)
|
||||||
|
glib.IdleAdd(func() {
|
||||||
|
userbox.Remove(default_av)
|
||||||
|
userbox.Prepend(new_im)
|
||||||
|
})
|
||||||
|
}()
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
gesture := gtk.NewGestureClick()
|
gesture := gtk.NewGestureClick()
|
||||||
gesture.SetButton(1)
|
gesture.SetButton(1)
|
||||||
|
|
||||||
@@ -352,7 +371,6 @@ func switchToTab(jid string, w *gtk.Window) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
fmt.Println("Attempting to get Disco info")
|
|
||||||
|
|
||||||
myIQ, err := stanza.NewIQ(stanza.Attrs{
|
myIQ, err := stanza.NewIQ(stanza.Attrs{
|
||||||
Type: "get",
|
Type: "get",
|
||||||
@@ -519,7 +537,7 @@ func createIdenticon(word string) *gtk.Image { // This function generates an ide
|
|||||||
|
|
||||||
gen, _ := identicon.New("github", 5, 3)
|
gen, _ := identicon.New("github", 5, 3)
|
||||||
ii, _ := gen.Draw(word)
|
ii, _ := gen.Draw(word)
|
||||||
im := ii.Image(25)
|
im := ii.Image(250)
|
||||||
|
|
||||||
buf := new(bytes.Buffer)
|
buf := new(bytes.Buffer)
|
||||||
err := png.Encode(buf, im)
|
err := png.Encode(buf, im)
|
||||||
|
|||||||
@@ -294,13 +294,11 @@ func getAvatar(j, hash string) *gtk.Image { // TODO: This function probably shou
|
|||||||
}
|
}
|
||||||
|
|
||||||
if hash == "" {
|
if hash == "" {
|
||||||
fmt.Println("Hash is nil!")
|
|
||||||
return createIdenticon(j)
|
return createIdenticon(j)
|
||||||
}
|
}
|
||||||
|
|
||||||
_, ok := invalidImages[hash]
|
_, ok := invalidImages[hash]
|
||||||
if ok {
|
if ok {
|
||||||
fmt.Println("Image is invalid")
|
|
||||||
return createIdenticon(j)
|
return createIdenticon(j)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ import (
|
|||||||
"github.com/BurntSushi/toml"
|
"github.com/BurntSushi/toml"
|
||||||
"gosrc.io/xmpp"
|
"gosrc.io/xmpp"
|
||||||
"gosrc.io/xmpp/stanza"
|
"gosrc.io/xmpp/stanza"
|
||||||
"mellium.im/xmpp/jid"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
_ "embed"
|
_ "embed"
|
||||||
@@ -396,44 +395,9 @@ func main() {
|
|||||||
|
|
||||||
} else { // This is a presence stanza from a regular user
|
} else { // This is a presence stanza from a regular user
|
||||||
// The code is basically the exact same as above, we just don't check for mucuser
|
// The code is basically the exact same as above, we just don't check for mucuser
|
||||||
user := jid.MustParse(presence.From).Bare().String()
|
|
||||||
_, ok := userdevices.Load(user)
|
|
||||||
_, mok := mucmembers.Load(user)
|
|
||||||
if !ok && !mok { // FIXME: The initial muc presence gets picked up from this check
|
|
||||||
ok := createTab(user, false, user)
|
|
||||||
if ok {
|
|
||||||
userdevices.Store(user, userUnit{})
|
|
||||||
|
|
||||||
b := gtk.NewLabel(user)
|
// TODO: Presence handling code goes here
|
||||||
gesture1 := gtk.NewGestureClick()
|
|
||||||
gesture1.SetButton(1)
|
|
||||||
gesture1.Connect("pressed", func() {
|
|
||||||
switchToTab(user, &window.Window)
|
|
||||||
})
|
|
||||||
|
|
||||||
b.AddController(gesture1)
|
|
||||||
menu.Append(b)
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
unit, ok := userdevices.Load(user)
|
|
||||||
if !ok {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
resource := jid.MustParse(presence.From).Resourcepart()
|
|
||||||
|
|
||||||
typed_unit := unit.(userUnit)
|
|
||||||
|
|
||||||
if presence.Type != "unavailable" {
|
|
||||||
typed_unit.Devices.Store(resource, presence)
|
|
||||||
} else {
|
|
||||||
typed_unit.Devices.Delete(resource)
|
|
||||||
}
|
|
||||||
|
|
||||||
userdevices.Store(user, typed_unit)
|
|
||||||
}
|
|
||||||
time.Sleep(1 * time.Second)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
c, err := xmpp.NewClient(&config, router, func(err error) {
|
c, err := xmpp.NewClient(&config, router, func(err error) {
|
||||||
@@ -526,6 +490,55 @@ func main() {
|
|||||||
</iq>
|
</iq>
|
||||||
`, clientroot.Session.BindJid))
|
`, clientroot.Session.BindJid))
|
||||||
|
|
||||||
|
// Fetch roster
|
||||||
|
i, err := stanza.NewIQ(stanza.Attrs{
|
||||||
|
Type: "get",
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
roster := i.RosterItems()
|
||||||
|
i.Payload = roster
|
||||||
|
mychan, err := c.SendIQ(context.TODO(), i)
|
||||||
|
result := <-mychan
|
||||||
|
if err == nil {
|
||||||
|
items, ok := result.Payload.(*stanza.RosterItems)
|
||||||
|
if ok {
|
||||||
|
for _, v := range items.Items {
|
||||||
|
name := v.Name
|
||||||
|
jid := v.Jid
|
||||||
|
|
||||||
|
if name == "" {
|
||||||
|
name = jid
|
||||||
|
}
|
||||||
|
|
||||||
|
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))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Join rooms in bookmarks
|
// Join rooms in bookmarks
|
||||||
if loadedConfig.JoinBookmarks {
|
if loadedConfig.JoinBookmarks {
|
||||||
books, err := stanza.NewItemsRequest("", "urn:xmpp:bookmarks:1", 0)
|
books, err := stanza.NewItemsRequest("", "urn:xmpp:bookmarks:1", 0)
|
||||||
@@ -539,7 +552,7 @@ func main() {
|
|||||||
jid := item.Id
|
jid := item.Id
|
||||||
node := item.Any
|
node := item.Any
|
||||||
autojoin := false
|
autojoin := false
|
||||||
name := ""
|
name := jid
|
||||||
password := ""
|
password := ""
|
||||||
nick := loadedConfig.Nick
|
nick := loadedConfig.Nick
|
||||||
for _, attr := range node.Attrs {
|
for _, attr := range node.Attrs {
|
||||||
@@ -582,15 +595,25 @@ func main() {
|
|||||||
joinMuc(client, clientroot.Session.BindJid, jid, nick, password)
|
joinMuc(client, clientroot.Session.BindJid, jid, nick, password)
|
||||||
createTab(jid, true, name)
|
createTab(jid, true, name)
|
||||||
glib.IdleAdd(func() {
|
glib.IdleAdd(func() {
|
||||||
|
box := gtk.NewBox(gtk.OrientationHorizontal, 10)
|
||||||
b := gtk.NewLabel(name)
|
b := gtk.NewLabel(name)
|
||||||
gesture1 := gtk.NewGestureClick()
|
gesture1 := gtk.NewGestureClick()
|
||||||
gesture1.SetButton(1)
|
gesture1.SetButton(1)
|
||||||
gesture1.Connect("pressed", func() {
|
gesture1.Connect("pressed", func() {
|
||||||
switchToTab(jid, &window.Window)
|
switchToTab(jid, &window.Window)
|
||||||
})
|
})
|
||||||
|
box.Append(b)
|
||||||
|
go func() {
|
||||||
|
new_im := getAvatar(jid, jid)
|
||||||
|
glib.IdleAdd(func() {
|
||||||
|
new_im.SetPixelSize(40)
|
||||||
|
box.Prepend(new_im)
|
||||||
|
})
|
||||||
|
}()
|
||||||
|
|
||||||
b.AddController(gesture1)
|
box.AddController(gesture1)
|
||||||
menu.Append(b)
|
menu.Append(box)
|
||||||
|
menu.Append(gtk.NewSeparator(gtk.OrientationHorizontal))
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -820,7 +843,16 @@ func activate(app *gtk.Application) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
createTab(t, true, n)
|
createTab(t, true, n)
|
||||||
|
box := gtk.NewBox(gtk.OrientationHorizontal, 10)
|
||||||
|
go func() {
|
||||||
|
new_im := getAvatar(t, t)
|
||||||
|
glib.IdleAdd(func() {
|
||||||
|
new_im.SetPixelSize(40)
|
||||||
|
box.Prepend(new_im)
|
||||||
|
})
|
||||||
|
}()
|
||||||
b := gtk.NewLabel(n)
|
b := gtk.NewLabel(n)
|
||||||
|
box.Append(b)
|
||||||
gesture1 := gtk.NewGestureClick()
|
gesture1 := gtk.NewGestureClick()
|
||||||
gesture1.SetButton(1)
|
gesture1.SetButton(1)
|
||||||
gesture1.Connect("pressed", func() {
|
gesture1.Connect("pressed", func() {
|
||||||
@@ -828,7 +860,8 @@ func activate(app *gtk.Application) {
|
|||||||
})
|
})
|
||||||
|
|
||||||
b.AddController(gesture1)
|
b.AddController(gesture1)
|
||||||
menu.Append(b)
|
menu.Append(box)
|
||||||
|
menu.Append(gtk.NewSeparator(gtk.OrientationHorizontal))
|
||||||
}
|
}
|
||||||
if !ok {
|
if !ok {
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user