66 lines
2.4 KiB
Go
66 lines
2.4 KiB
Go
package extensions
|
|
|
|
import (
|
|
"cwtch.im/cwtch/event"
|
|
"cwtch.im/cwtch/model"
|
|
"cwtch.im/cwtch/model/attr"
|
|
"cwtch.im/cwtch/model/constants"
|
|
"cwtch.im/cwtch/peer"
|
|
"git.openprivacy.ca/openprivacy/log"
|
|
"strconv"
|
|
)
|
|
|
|
// ProfileValueExtension implements custom Profile Names over Cwtch
|
|
type ProfileValueExtension struct {
|
|
}
|
|
|
|
func (pne ProfileValueExtension) EventsToRegister() []event.Type {
|
|
return nil
|
|
}
|
|
|
|
func (pne ProfileValueExtension) ExperimentsToRegister() []string {
|
|
return nil
|
|
}
|
|
|
|
func (pne ProfileValueExtension) OnEvent(event event.Event, profile peer.CwtchPeer) {
|
|
// nop
|
|
}
|
|
|
|
// OnContactReceiveValue for ProfileValueExtension handles saving specific Public Profile Values like Profile Name
|
|
func (pne ProfileValueExtension) OnContactReceiveValue(profile peer.CwtchPeer, conversation model.Conversation, szp attr.ScopedZonedPath, value string, exists bool) {
|
|
// Allow public profile parameters to be added as contact specific attributes...
|
|
scope, zone, _ := szp.GetScopeZonePath()
|
|
if exists && scope.IsPublic() && zone == attr.ProfileZone {
|
|
err := profile.SetConversationAttribute(conversation.ID, szp, value)
|
|
if err != nil {
|
|
log.Errorf("error setting conversation attribute %v", err)
|
|
}
|
|
}
|
|
}
|
|
|
|
// OnContactRequestValue for ProfileValueExtension handles returning Public Profile Values
|
|
func (pne ProfileValueExtension) OnContactRequestValue(profile peer.CwtchPeer, conversation model.Conversation, eventID string, szp attr.ScopedZonedPath) {
|
|
scope, zone, zpath := szp.GetScopeZonePath()
|
|
log.Debugf("Looking up public | conversation scope/zone %v", szp.ToString())
|
|
if scope.IsPublic() || scope.IsConversation() {
|
|
val, exists := profile.GetScopedZonedAttribute(scope, zone, zpath)
|
|
|
|
// NOTE: Temporary Override because UI currently wipes names if it can't find them...
|
|
if !exists && zone == attr.UnknownZone && zpath == constants.Name {
|
|
val, exists = profile.GetScopedZonedAttribute(attr.PublicScope, attr.ProfileZone, constants.Name)
|
|
}
|
|
|
|
// Construct a Response
|
|
resp := event.NewEvent(event.SendRetValMessageToPeer, map[event.Field]string{event.ConversationID: strconv.Itoa(conversation.ID), event.RemotePeer: conversation.Handle, event.Exists: strconv.FormatBool(exists)})
|
|
resp.EventID = eventID
|
|
if exists {
|
|
resp.Data[event.Data] = val
|
|
} else {
|
|
resp.Data[event.Data] = ""
|
|
}
|
|
|
|
log.Debugf("Responding with SendRetValMessageToPeer exists:%v data: %v\n", exists, val)
|
|
profile.PublishEvent(resp)
|
|
}
|
|
}
|