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