update_app_consumer.go raw

   1  package service
   2  
   3  import (
   4  	"context"
   5  
   6  	"github.com/getAlby/go-nostr"
   7  	"github.com/getAlby/hub/events"
   8  	"github.com/getAlby/hub/logger"
   9  )
  10  
  11  type updateAppConsumer struct {
  12  	events.EventSubscriber
  13  	svc *service
  14  }
  15  
  16  // When a app is updated, re-publish the nip47 info event
  17  func (s *updateAppConsumer) ConsumeEvent(ctx context.Context, event *events.Event, globalProperties map[string]interface{}) {
  18  	if event.Event != "nwc_app_updated" {
  19  		return
  20  	}
  21  
  22  	properties, ok := event.Properties.(map[string]interface{})
  23  	if !ok {
  24  		logger.Logger.WithField("event", event).Error("Failed to cast event.Properties to map")
  25  		return
  26  	}
  27  	id, ok := properties["id"].(uint)
  28  	if !ok {
  29  		logger.Logger.WithField("event", event).Error("Failed to get app id")
  30  		return
  31  	}
  32  	walletPrivKey, err := s.svc.keys.GetAppWalletKey(id)
  33  	if err != nil {
  34  		logger.Logger.WithError(err).Error("Failed to calculate app wallet priv key")
  35  		return
  36  	}
  37  	walletPubKey, err := nostr.GetPublicKey(walletPrivKey)
  38  	if err != nil {
  39  		logger.Logger.WithError(err).Error("Failed to calculate app wallet pub key")
  40  		return
  41  	}
  42  
  43  	if s.svc.keys.GetNostrPublicKey() != walletPubKey {
  44  		// only need to re-publish the nip47 event info if it is not a legacy app connection (shared wallet pubkey)
  45  		// (legacy app connection can be used for multiple apps - so it cannot be app-specific)
  46  		for _, relayUrl := range s.svc.cfg.GetRelayUrls() {
  47  			s.svc.nip47Service.EnqueueNip47InfoPublishRequest(id, walletPubKey, walletPrivKey, relayUrl)
  48  		}
  49  	}
  50  }
  51