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" "cwtch.im/cwtch/settings" "git.openprivacy.ca/openprivacy/log" "strconv" ) // ProfileValueExtension implements custom Profile Names over Cwtch type ProfileValueExtension struct { } func (pne ProfileValueExtension) NotifySettingsUpdate(settings settings.GlobalSettings) { } 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) } }