create_app_consumer.go raw

   1  package service
   2  
   3  import (
   4  	"context"
   5  
   6  	"github.com/getAlby/go-nostr"
   7  	"github.com/sirupsen/logrus"
   8  
   9  	"github.com/getAlby/hub/db"
  10  	"github.com/getAlby/hub/events"
  11  	"github.com/getAlby/hub/logger"
  12  )
  13  
  14  type createAppConsumer struct {
  15  	events.EventSubscriber
  16  	svc  *service
  17  	pool *nostr.SimplePool
  18  }
  19  
  20  // When a new app is created, subscribe to it on the relay
  21  func (s *createAppConsumer) ConsumeEvent(ctx context.Context, event *events.Event, globalProperties map[string]interface{}) {
  22  	if event.Event != "nwc_app_created" {
  23  		return
  24  	}
  25  
  26  	properties, ok := event.Properties.(map[string]interface{})
  27  	if !ok {
  28  		logger.Logger.WithField("event", event).Error("Failed to cast event.Properties to map")
  29  		return
  30  	}
  31  	id, ok := properties["id"].(uint)
  32  	if !ok {
  33  		logger.Logger.WithField("event", event).Error("Failed to get app id")
  34  		return
  35  	}
  36  
  37  	app := db.App{}
  38  	err := s.svc.db.First(&app, id).Error
  39  	if err != nil {
  40  		logger.Logger.WithFields(logrus.Fields{
  41  			"id": id,
  42  		}).WithError(err).Error("Failed to find app for id")
  43  		return
  44  	}
  45  
  46  	walletPrivKey, err := s.svc.keys.GetAppWalletKey(id)
  47  	if err != nil {
  48  		logger.Logger.WithError(err).Error("Failed to calculate app wallet priv key")
  49  		return
  50  	}
  51  	walletPubKey, err := nostr.GetPublicKey(walletPrivKey)
  52  	if err != nil {
  53  		logger.Logger.WithError(err).Error("Failed to calculate app wallet pub key")
  54  		return
  55  	}
  56  	for _, relayUrl := range s.svc.cfg.GetRelayUrls() {
  57  		s.svc.nip47Service.EnqueueNip47InfoPublishRequest(id, walletPubKey, walletPrivKey, relayUrl)
  58  	}
  59  
  60  	go s.svc.startAppWalletSubscription(ctx, s.pool, walletPubKey)
  61  }
  62