Skip to content

Commit

Permalink
feat: add user received direct messages retrieval
Browse files Browse the repository at this point in the history
Signed-off-by: r3drun3 <simone.ragonesi@sighup.io>
  • Loading branch information
R3DRUN3 committed Oct 6, 2023
1 parent d48a98c commit 06e0bea
Show file tree
Hide file tree
Showing 4 changed files with 101 additions and 1 deletion.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,5 @@
#dev
example_output.json
user_tagged_notes.json
user_reposted_notes.json
user_reposted_notes.json
user_received_direct_messages.json
14 changes: 14 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ Usage:

Available Commands:
completion Generate the autocompletion script for the specified shell
dm Operations on direct messages
help Help about any command
notes Operations on notes
relay Operations on relays
Expand Down Expand Up @@ -99,6 +100,19 @@ PAYMENTSURL: https://relay.nostrview.com/invoices
```
</details>


<details>
<summary>Retrieve from the specified relay the last 300 direct messages that the specified user received</summary>

```console
nostro dm --userreceived npub1rusgp3upyrtpsy2pcqznl6e8hejg9ne8u2eg05gzc4n2cctsugksvcx2np nostr.wine
returned events saved to user_received_direct_messages.json
```
</details>




<details>
<summary>Retrieve from the specified relay the last 300 notes in which the specified user has been tagged</summary>

Expand Down
1 change: 1 addition & 0 deletions cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ var rootCmd = &cobra.Command{
func init() {
rootCmd.AddCommand(commands.RelayCmd)
rootCmd.AddCommand(commands.NotesCmd)
rootCmd.AddCommand(commands.DirectMessagesCmd)
}

func Execute() {
Expand Down
84 changes: 84 additions & 0 deletions internal/commands/dm.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
package commands

import (
"context"
"encoding/json"
"fmt"
"os"
"time"

"github.com/nbd-wtf/go-nostr"
"github.com/nbd-wtf/go-nostr/nip19"
"github.com/spf13/cobra"
)

var userReceivedDm bool

var DirectMessagesCmd = &cobra.Command{
Use: "dm",
Short: "Operations on direct messages",
Long: `Search and retrieve direct messages on nostr`,
RunE: func(cmd *cobra.Command, args []string) error {
if userReceivedDm {
if len(args) != 2 {
return fmt.Errorf("user npbu key and relay name are required")
}
npub := args[0]
url := args[1]
// connect to relay
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
relay, err := nostr.RelayConnect(ctx, url)
if err != nil {
panic(err)
}
// create filters
var filters nostr.Filters
if _, v, err := nip19.Decode(npub); err == nil {
t := make(map[string][]string)
// making a "p" tag for the above public key.
// this filters for messages tagged with the user, mainly replies.
t["p"] = []string{v.(string)}
filters = []nostr.Filter{{
Kinds: []int{int(nostr.KindEncryptedDirectMessage)},
Tags: t,
Limit: 300,
}}
} else {
panic("not a valid npub!")
}
// create a subscription and submit to relay
// results will be returned on the sub.Events channel
sub, _ := relay.Subscribe(ctx, filters)

// we will append the returned events to this slice
evs := make([]nostr.Event, 0)

go func() {
<-sub.EndOfStoredEvents
cancel()
}()
for ev := range sub.Events {
evs = append(evs, *ev)
}

filename := "user_received_direct_messages.json"
if f, err := os.Create(filename); err == nil {
fmt.Fprintf(os.Stderr, "returned events saved to %s\n", filename)
// encode the returned events in a file
enc := json.NewEncoder(f)
enc.SetIndent("", " ")
enc.Encode(evs)
f.Close()
} else {
panic(err)
}
} else {
cmd.Help()
}
return nil
},
}

func init() {
DirectMessagesCmd.Flags().BoolVarP(&userReceivedDm, "userreceived", "", false, "Retrieve from the specified relay the last 300 direct messages that the specified user received.")
}

0 comments on commit 06e0bea

Please sign in to comment.