diff --git a/cmd/publicatr/go.mod b/cmd/publicatr/go.mod deleted file mode 100644 index 2b41a839..00000000 --- a/cmd/publicatr/go.mod +++ /dev/null @@ -1,46 +0,0 @@ -module github.com/mattn/algia - -go 1.21 - -toolchain go1.21.1 - -require ( - github.com/fatih/color v1.15.0 - github.com/mdp/qrterminal/v3 v3.2.0 - github.com/nbd-wtf/go-nostr v0.25.0 - github.com/nbd-wtf/nostr-sdk v0.0.1 - github.com/urfave/cli/v2 v2.25.7 -) - -require ( - github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect - github.com/btcsuite/btcd/btcutil v1.1.4-0.20230904040416-d4f519f5dc05 // indirect - github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect - github.com/decred/dcrd/crypto/blake256 v1.0.1 // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect - github.com/dgraph-io/ristretto v0.1.1 // indirect - github.com/dustin/go-humanize v1.0.1 // indirect - github.com/fiatjaf/eventstore v0.1.0 // indirect - github.com/gobwas/httphead v0.1.0 // indirect - github.com/gobwas/pool v0.2.1 // indirect - github.com/gobwas/ws v1.3.0 // indirect - github.com/golang/glog v1.1.2 // indirect - github.com/josharian/intern v1.0.0 // indirect - github.com/mailru/easyjson v0.7.7 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.20 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/puzpuzpuz/xsync/v2 v2.5.1 // indirect - github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/tidwall/gjson v1.17.0 // indirect - github.com/tidwall/match v1.1.1 // indirect - github.com/tidwall/pretty v1.2.1 // indirect - github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect - golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect - golang.org/x/net v0.10.0 // indirect - golang.org/x/sys v0.14.0 // indirect - golang.org/x/term v0.13.0 // indirect - rsc.io/qr v0.2.0 // indirect -) diff --git a/cmd/publicatr/go.sum b/cmd/publicatr/go.sum deleted file mode 100644 index 7c8ebd80..00000000 --- a/cmd/publicatr/go.sum +++ /dev/null @@ -1,181 +0,0 @@ -github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= -github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= -github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M= -github.com/btcsuite/btcd v0.23.0/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= -github.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA= -github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= -github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= -github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= -github.com/btcsuite/btcd/btcutil v1.0.0/go.mod h1:Uoxwv0pqYWhD//tfTiipkxNfdhG9UrLwaeswfjfdF0A= -github.com/btcsuite/btcd/btcutil v1.1.0/go.mod h1:5OapHB7A2hBBWLm48mmw4MOHNJCcUBTwmWH/0Jn8VHE= -github.com/btcsuite/btcd/btcutil v1.1.4-0.20230904040416-d4f519f5dc05 h1:aemxF+69pT9sYC5E6Qj71zQVHcF72m0BNcVhCl3/thU= -github.com/btcsuite/btcd/btcutil v1.1.4-0.20230904040416-d4f519f5dc05/go.mod h1:UR7dsSJzJUfMmFiiLlIrMq1lS9jh9EdCV7FStZSnpi0= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2 h1:KdUfX2zKommPRa+PD0sWZUyXe9w277ABlgELO7H04IM= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= -github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= -github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= -github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= -github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= -github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= -github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= -github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= -github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= -github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= -github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= -github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= -github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= -github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= -github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= -github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= -github.com/fiatjaf/eventstore v0.1.0 h1:/g7VTw6dsXmjICD3rBuHNIvAammHJ5unrKJ71Dz+VTs= -github.com/fiatjaf/eventstore v0.1.0/go.mod h1:juMei5HL3HJi6t7vZjj7VdEItDPu31+GLROepdUK4tw= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= -github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= -github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= -github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.3.0 h1:sbeU3Y4Qzlb+MOzIe6mQGf7QR4Hkv6ZD0qhGkBFL2O0= -github.com/gobwas/ws v1.3.0/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= -github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= -github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= -github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mdp/qrterminal/v3 v3.2.0 h1:qteQMXO3oyTK4IHwj2mWsKYYRBOp1Pj2WRYFYYNTCdk= -github.com/mdp/qrterminal/v3 v3.2.0/go.mod h1:XGGuua4Lefrl7TLEsSONiD+UEjQXJZ4mPzF+gWYIJkk= -github.com/nbd-wtf/go-nostr v0.25.0 h1:6ArnEX5NqjTaIBH6F5KYIJ0uw0uaKSWu8zjDb9za0Cg= -github.com/nbd-wtf/go-nostr v0.25.0/go.mod h1:bkffJI+x914sPQWum9ZRUn66D7NpDnAoWo1yICvj3/0= -github.com/nbd-wtf/nostr-sdk v0.0.1 h1:Yd5RQRFEh2NgRcjRsJ+BQ3mbbdeVAC6QCy7ptQ3MCKY= -github.com/nbd-wtf/nostr-sdk v0.0.1/go.mod h1:9P3DiQQ9OAa/i+QM1+B/t3djE/jzLNzqxCamNKKyF6Q= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/puzpuzpuz/xsync/v2 v2.5.1 h1:mVGYAvzDSu52+zaGyNjC+24Xw2bQi3kTr4QJ6N9pIIU= -github.com/puzpuzpuz/xsync/v2 v2.5.1/go.mod h1:gD2H2krq/w52MfPLE+Uy64TzJDVY7lP2znR9qmR35kU= -github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= -github.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM= -github.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= -github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= -github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= -github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= -github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= -github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= -golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= -golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= -golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= -golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -rsc.io/qr v0.2.0 h1:6vBLea5/NRMVTz8V66gipeLycZMl/+UlFmk8DvqQ6WY= -rsc.io/qr v0.2.0/go.mod h1:IF+uZjkb9fqyeF/4tlBoynqmQxUoPfWEKh921coOuXs= diff --git a/cmd/publicatr/helpers.go b/cmd/publicatr/helpers.go new file mode 100644 index 00000000..28632adf --- /dev/null +++ b/cmd/publicatr/helpers.go @@ -0,0 +1,13 @@ +package main + +import ( + "encoding/hex" + + log2 "mleku.online/git/log" +) + +var ( + log = log2.GetLogger() + fails = log.D.Chk + hexDecode, encodeToHex = hex.DecodeString, hex.EncodeToString +) diff --git a/cmd/publicatr/main.go b/cmd/publicatr/main.go index ee27adf2..bd7f9738 100644 --- a/cmd/publicatr/main.go +++ b/cmd/publicatr/main.go @@ -16,13 +16,17 @@ import ( "github.com/urfave/cli/v2" + "github.com/Hubmakerlabs/replicatr/pkg/nostr" + "github.com/Hubmakerlabs/replicatr/pkg/nostr/kind" + "github.com/Hubmakerlabs/replicatr/pkg/nostr/kinds" + "github.com/Hubmakerlabs/replicatr/pkg/nostr/nip1" + "github.com/Hubmakerlabs/replicatr/pkg/nostr/nip19" + "github.com/Hubmakerlabs/replicatr/pkg/nostr/nip4" + "github.com/Hubmakerlabs/replicatr/pkg/nostr/tag" "github.com/fatih/color" - "github.com/nbd-wtf/go-nostr" - "github.com/nbd-wtf/go-nostr/nip04" - "github.com/nbd-wtf/go-nostr/nip19" ) -const name = "algia" +const appName = "publicatr" const version = "0.0.53" @@ -51,8 +55,8 @@ type Config struct { // Event is type Event struct { - Event *nostr.Event `json:"event"` - Profile Profile `json:"profile"` + Event *nip1.Event `json:"event"` + Profile Profile `json:"profile"` } // Profile is @@ -84,7 +88,7 @@ func loadConfig(profile string) (*Config, error) { if err != nil { return nil, err } - dir = filepath.Join(dir, "algia") + dir = filepath.Join(dir, appName) var fp string if profile == "" { @@ -130,7 +134,7 @@ func (cfg *Config) GetFollows(profile string) (map[string]Profile, error) { var mu sync.Mutex var pub string if _, s, err := nip19.Decode(cfg.PrivateKey); err == nil { - if pub, err = nostr.GetPublicKey(s.(string)); err != nil { + if pub, err = nip19.GetPublicKey(s.(string)); err != nil { return nil, err } } else { @@ -145,7 +149,11 @@ func (cfg *Config) GetFollows(profile string) (map[string]Profile, error) { m := map[string]struct{}{} cfg.Do(Relay{Read: true}, func(ctx context.Context, relay *nostr.Relay) bool { - evs, err := relay.QuerySync(ctx, nostr.Filter{Kinds: []int{nostr.KindContactList}, Authors: []string{pub}, Limit: 1}) + evs, err := relay.QuerySync(ctx, &nip1.Filter{ + Kinds: kinds.T{kind.ContactList}, + Authors: tag.T{pub}, + Limit: 1, + }) if err != nil { return true } @@ -189,8 +197,8 @@ func (cfg *Config) GetFollows(profile string) (map[string]Profile, error) { // get follower's descriptions cfg.Do(Relay{Read: true}, func(ctx context.Context, relay *nostr.Relay) bool { - evs, err := relay.QuerySync(ctx, nostr.Filter{ - Kinds: []int{nostr.KindProfileMetadata}, + evs, err := relay.QuerySync(ctx, &nip1.Filter{ + Kinds: kinds.T{kind.ProfileMetadata}, Authors: follows[i:end], // Use the updated end index }) if err != nil { @@ -286,7 +294,7 @@ func (cfg *Config) save(profile string) error { if err != nil { return err } - dir = filepath.Join(dir, "algia") + dir = filepath.Join(dir, appName) var fp string if profile == "" { @@ -302,12 +310,12 @@ func (cfg *Config) save(profile string) error { } // Decode is -func (cfg *Config) Decode(ev *nostr.Event) error { +func (cfg *Config) Decode(ev *nip1.Event) error { var sk string var pub string if _, s, err := nip19.Decode(cfg.PrivateKey); err == nil { sk = s.(string) - if pub, err = nostr.GetPublicKey(s.(string)); err != nil { + if pub, err = nip19.GetPublicKey(s.(string)); err != nil { return err } } else { @@ -325,20 +333,20 @@ func (cfg *Config) Decode(ev *nostr.Event) error { } else { sp = ev.PubKey } - ss, err := nip04.ComputeSharedSecret(sp, sk) + ss, err := nip4.ComputeSharedSecret(sp, sk) if err != nil { return err } - content, err := nip04.Decrypt(ev.Content, ss) + content, err := nip4.Decrypt(ev.Content, ss) if err != nil { return err } - ev.Content = content + ev.Content = string(content) return nil } // PrintEvents is -func (cfg *Config) PrintEvents(evs []*nostr.Event, followsMap map[string]Profile, j, extra bool) { +func (cfg *Config) PrintEvents(evs []*nip1.Event, followsMap map[string]Profile, j, extra bool) { if j { if extra { var events []Event @@ -380,7 +388,7 @@ func (cfg *Config) PrintEvents(evs []*nostr.Event, followsMap map[string]Profile } // Events is -func (cfg *Config) Events(filter nostr.Filter) []*nostr.Event { +func (cfg *Config) Events(filter *nip1.Filter) []*nip1.Event { var mu sync.Mutex found := false var m sync.Map @@ -397,7 +405,7 @@ func (cfg *Config) Events(filter nostr.Filter) []*nostr.Event { } for _, ev := range evs { if _, ok := m.Load(ev.ID); !ok { - if ev.Kind == nostr.KindEncryptedDirectMessage { + if ev.Kind == kind.EncryptedDirectMessage { if err := cfg.Decode(ev); err != nil { continue } @@ -415,7 +423,7 @@ func (cfg *Config) Events(filter nostr.Filter) []*nostr.Event { return true }) - keys := []string{} + keys := tag.T{} m.Range(func(k, v any) bool { keys = append(keys, k.(string)) return true @@ -429,15 +437,15 @@ func (cfg *Config) Events(filter nostr.Filter) []*nostr.Event { if !ok { return false } - return lhs.(*nostr.Event).CreatedAt.Time().Before(rhs.(*nostr.Event).CreatedAt.Time()) + return lhs.(*nip1.Event).CreatedAt.Time().Before(rhs.(*nip1.Event).CreatedAt.Time()) }) - var evs []*nostr.Event + var evs []*nip1.Event for _, key := range keys { vv, ok := m.Load(key) if !ok { continue } - evs = append(evs, vv.(*nostr.Event)) + evs = append(evs, vv.(*nip1.Event)) } return evs } @@ -473,7 +481,7 @@ func main() { Usage: "show stream", Flags: []cli.Flag{ &cli.StringFlag{Name: "author"}, - &cli.IntSliceFlag{Name: "kind", Value: cli.NewIntSlice(nostr.KindTextNote)}, + &cli.IntSliceFlag{Name: "kind", Value: cli.NewIntSlice(int(kind.TextNote))}, &cli.BoolFlag{Name: "follow"}, &cli.StringFlag{Name: "pattern"}, &cli.StringFlag{Name: "reply"}, @@ -491,7 +499,7 @@ func main() { &cli.StringFlag{Name: "geohash"}, }, Usage: "post new note", - UsageText: "algia post [note text]", + UsageText: "publicatr post [note text]", HelpName: "post", ArgsUsage: "[note text]", Action: doPost, @@ -508,7 +516,7 @@ func main() { &cli.StringFlag{Name: "geohash"}, }, Usage: "reply to the note", - UsageText: "algia reply --id [id] [note text]", + UsageText: "publicatr reply --id [id] [note text]", HelpName: "reply", ArgsUsage: "[note text]", Action: doReply, @@ -520,7 +528,7 @@ func main() { &cli.StringFlag{Name: "id", Required: true}, }, Usage: "repost the note", - UsageText: "algia repost --id [id]", + UsageText: "publicatr repost --id [id]", HelpName: "repost", Action: doRepost, }, @@ -531,7 +539,7 @@ func main() { &cli.StringFlag{Name: "id", Required: true}, }, Usage: "unrepost the note", - UsageText: "algia unrepost --id [id]", + UsageText: "publicatr unrepost --id [id]", HelpName: "unrepost", Action: doUnrepost, }, @@ -544,7 +552,7 @@ func main() { &cli.StringFlag{Name: "emoji"}, }, Usage: "like the note", - UsageText: "algia like --id [id]", + UsageText: "publicatr like --id [id]", HelpName: "like", Action: doLike, }, @@ -555,7 +563,7 @@ func main() { &cli.StringFlag{Name: "id", Required: true}, }, Usage: "unlike the note", - UsageText: "algia unlike --id [id]", + UsageText: "publicatr unlike --id [id]", HelpName: "unlike", Action: doUnlike, }, @@ -566,7 +574,7 @@ func main() { &cli.StringFlag{Name: "id", Required: true}, }, Usage: "delete the note", - UsageText: "algia delete --id [id]", + UsageText: "publicatr delete --id [id]", HelpName: "delete", Action: doDelete, }, @@ -579,7 +587,7 @@ func main() { &cli.BoolFlag{Name: "extra", Usage: "extra JSON"}, }, Usage: "search notes", - UsageText: "algia search [words]", + UsageText: "publicatr search [words]", HelpName: "search", Action: doSearch, }, @@ -609,7 +617,7 @@ func main() { &cli.StringFlag{Name: "sensitive"}, }, Usage: "post new note", - UsageText: "algia post [note text]", + UsageText: "publicatr post [note text]", HelpName: "post", ArgsUsage: "[note text]", Action: doDMPost, @@ -621,21 +629,21 @@ func main() { &cli.BoolFlag{Name: "json", Usage: "output JSON"}, }, Usage: "show profile", - UsageText: "algia profile", + UsageText: "publicatr profile", HelpName: "profile", Action: doProfile, }, { Name: "powa", Usage: "post ぽわ〜", - UsageText: "algia powa", + UsageText: "publicatr powa", HelpName: "powa", Action: doPowa, }, { Name: "puru", Usage: "post ぷる", - UsageText: "algia puru", + UsageText: "publicatr puru", HelpName: "puru", Action: doPuru, }, @@ -646,14 +654,14 @@ func main() { &cli.StringFlag{Name: "comment", Usage: "comment for zap", Value: ""}, }, Usage: "zap [note|npub|nevent]", - UsageText: "algia zap [note|npub|nevent]", + UsageText: "publicatr zap [note|npub|nevent]", HelpName: "zap", Action: doZap, }, { Name: "version", Usage: "show version", - UsageText: "algia version", + UsageText: "publicatr version", HelpName: "version", Action: doVersion, }, diff --git a/cmd/publicatr/profile.go b/cmd/publicatr/profile.go index 54d10528..0f0dc0b3 100644 --- a/cmd/publicatr/profile.go +++ b/cmd/publicatr/profile.go @@ -9,9 +9,12 @@ import ( "github.com/urfave/cli/v2" - "github.com/nbd-wtf/go-nostr" - "github.com/nbd-wtf/go-nostr/nip19" - "github.com/nbd-wtf/nostr-sdk" + "github.com/Hubmakerlabs/replicatr/pkg/nostr/kind" + "github.com/Hubmakerlabs/replicatr/pkg/nostr/kinds" + "github.com/Hubmakerlabs/replicatr/pkg/nostr/nip1" + "github.com/Hubmakerlabs/replicatr/pkg/nostr/nip19" + "github.com/Hubmakerlabs/replicatr/pkg/nostr/sdk" + "github.com/Hubmakerlabs/replicatr/pkg/nostr/tag" ) func doProfile(cCtx *cli.Context) error { @@ -28,7 +31,7 @@ func doProfile(cCtx *cli.Context) error { var pub string if user == "" { if _, s, err := nip19.Decode(cfg.PrivateKey); err == nil { - if pub, err = nostr.GetPublicKey(s.(string)); err != nil { + if pub, err = nip19.GetPublicKey(s.(string)); err != nil { return err } } else { @@ -43,9 +46,9 @@ func doProfile(cCtx *cli.Context) error { } // get set-metadata - filter := nostr.Filter{ - Kinds: []int{nostr.KindProfileMetadata}, - Authors: []string{pub}, + filter := &nip1.Filter{ + Kinds: kinds.T{kind.ProfileMetadata}, + Authors: tag.T{pub}, Limit: 1, } diff --git a/cmd/publicatr/timeline.go b/cmd/publicatr/timeline.go index d4232dea..cb5c4673 100644 --- a/cmd/publicatr/timeline.go +++ b/cmd/publicatr/timeline.go @@ -5,6 +5,7 @@ import ( "encoding/json" "errors" "fmt" + "io" "io/ioutil" "os" "regexp" @@ -12,13 +13,18 @@ import ( "sync" "sync/atomic" - "github.com/urfave/cli/v2" - + "github.com/Hubmakerlabs/replicatr/pkg/nostr" + "github.com/Hubmakerlabs/replicatr/pkg/nostr/kind" + "github.com/Hubmakerlabs/replicatr/pkg/nostr/kinds" + "github.com/Hubmakerlabs/replicatr/pkg/nostr/nip1" + "github.com/Hubmakerlabs/replicatr/pkg/nostr/nip19" + "github.com/Hubmakerlabs/replicatr/pkg/nostr/nip4" + "github.com/Hubmakerlabs/replicatr/pkg/nostr/sdk" + "github.com/Hubmakerlabs/replicatr/pkg/nostr/tag" + "github.com/Hubmakerlabs/replicatr/pkg/nostr/tags" + "github.com/Hubmakerlabs/replicatr/pkg/nostr/timestamp" "github.com/fatih/color" - "github.com/nbd-wtf/go-nostr" - "github.com/nbd-wtf/go-nostr/nip04" - "github.com/nbd-wtf/go-nostr/nip19" - "github.com/nbd-wtf/nostr-sdk" + "github.com/urfave/cli/v2" ) func doDMList(cCtx *cli.Context) error { @@ -39,13 +45,13 @@ func doDMList(cCtx *cli.Context) error { } else { return err } - if npub, err = nostr.GetPublicKey(sk); err != nil { + if npub, err = nip19.GetPublicKey(sk); err != nil { return err } // get timeline - filter := nostr.Filter{ - Kinds: []int{nostr.KindEncryptedDirectMessage}, + filter := &nip1.Filter{ + Kinds: kinds.T{kind.EncryptedDirectMessage}, Authors: []string{npub}, } @@ -54,7 +60,7 @@ func doDMList(cCtx *cli.Context) error { name string pubkey string } - users := []entry{} + var users []entry m := map[string]struct{}{} for _, ev := range evs { p := ev.Tags.GetFirst([]string{"p"}).Value() @@ -77,11 +83,10 @@ func doDMList(cCtx *cli.Context) error { } if j { for _, user := range users { - json.NewEncoder(os.Stdout).Encode(user) + log.D.Chk(json.NewEncoder(os.Stdout).Encode(user)) } return nil } - for _, user := range users { color.Set(color.FgHiRed) fmt.Print(user.name) @@ -109,7 +114,7 @@ func doDMTimeline(cCtx *cli.Context) error { } else { return err } - if npub, err = nostr.GetPublicKey(sk); err != nil { + if npub, err = nip19.GetPublicKey(sk); err != nil { return err } @@ -129,10 +134,10 @@ func doDMTimeline(cCtx *cli.Context) error { } // get timeline - filter := nostr.Filter{ - Kinds: []int{nostr.KindEncryptedDirectMessage}, + filter := &nip1.Filter{ + Kinds: kinds.T{kind.EncryptedDirectMessage}, Authors: []string{npub, pub}, - Tags: nostr.TagMap{"p": []string{npub, pub}}, + Tags: nip1.TagMap{"p": []string{npub, pub}}, Limit: 9999, } @@ -157,8 +162,8 @@ func doDMPost(cCtx *cli.Context) error { } else { return err } - ev := nostr.Event{} - if npub, err := nostr.GetPublicKey(sk); err == nil { + ev := &nip1.Event{} + if npub, err := nip19.GetPublicKey(sk); err == nil { if _, err := nip19.EncodePublicKey(npub); err != nil { return err } @@ -181,7 +186,7 @@ func doDMPost(cCtx *cli.Context) error { } if sensitive != "" { - ev.Tags = ev.Tags.AppendUnique(nostr.Tag{"content-warning", sensitive}) + ev.Tags = ev.Tags.AppendUnique(tag.T{"content-warning", sensitive}) } if u == "me" { @@ -194,19 +199,19 @@ func doDMPost(cCtx *cli.Context) error { return fmt.Errorf("failed to parse pubkey from '%s'", u) } - ev.Tags = ev.Tags.AppendUnique(nostr.Tag{"p", pub}) - ev.CreatedAt = nostr.Now() - ev.Kind = nostr.KindEncryptedDirectMessage + ev.Tags = ev.Tags.AppendUnique(tag.T{"p", pub}) + ev.CreatedAt = timestamp.Now() + ev.Kind = kind.EncryptedDirectMessage - ss, err := nip04.ComputeSharedSecret(ev.PubKey, sk) + ss, err := nip4.ComputeSharedSecret(ev.PubKey, sk) if err != nil { return err } - ev.Content, err = nip04.Encrypt(ev.Content, ss) + ev.Content, err = nip4.Encrypt(ev.Content, ss) if err != nil { return err } - if err := ev.Sign(sk); err != nil { + if err = ev.Sign(sk); err != nil { return err } @@ -243,8 +248,8 @@ func doPost(cCtx *cli.Context) error { } else { return err } - ev := nostr.Event{} - if pub, err := nostr.GetPublicKey(sk); err == nil { + ev := &nip1.Event{} + if pub, err := nip19.GetPublicKey(sk); err == nil { if _, err := nip19.EncodePublicKey(pub); err != nil { return err } @@ -254,7 +259,7 @@ func doPost(cCtx *cli.Context) error { } if stdin { - b, err := ioutil.ReadAll(os.Stdin) + b, err := io.ReadAll(os.Stdin) if err != nil { return err } @@ -266,10 +271,10 @@ func doPost(cCtx *cli.Context) error { return errors.New("content is empty") } - ev.Tags = nostr.Tags{} + ev.Tags = tags.T{} - for _, entry := range extractLinks(ev.Content) { - ev.Tags = ev.Tags.AppendUnique(nostr.Tag{"r", entry.text}) + for _, links := range extractLinks(ev.Content) { + ev.Tags = ev.Tags.AppendUnique(tag.T{"r", links.text}) } for _, u := range cCtx.StringSlice("emoji") { @@ -277,12 +282,12 @@ func doPost(cCtx *cli.Context) error { if len(tok) != 2 { return cli.ShowSubcommandHelp(cCtx) } - ev.Tags = ev.Tags.AppendUnique(nostr.Tag{"emoji", tok[0], tok[1]}) + ev.Tags = ev.Tags.AppendUnique(tag.T{"emoji", tok[0], tok[1]}) } - for _, entry := range extractEmojis(ev.Content) { - name := strings.Trim(entry.text, ":") + for _, emojis := range extractEmojis(ev.Content) { + name := strings.Trim(emojis.text, ":") if icon, ok := cfg.Emojis[name]; ok { - ev.Tags = ev.Tags.AppendUnique(nostr.Tag{"emoji", name, icon}) + ev.Tags = ev.Tags.AppendUnique(tag.T{"emoji", name, icon}) } } @@ -293,18 +298,18 @@ func doPost(cCtx *cli.Context) error { } else { return fmt.Errorf("failed to parse pubkey from '%s'", u) } - ev.Tags = ev.Tags.AppendUnique(nostr.Tag{"p", u}) + ev.Tags = ev.Tags.AppendUnique(tag.T{"p", u}) } if sensitive != "" { - ev.Tags = ev.Tags.AppendUnique(nostr.Tag{"content-warning", sensitive}) + ev.Tags = ev.Tags.AppendUnique(tag.T{"content-warning", sensitive}) } if geohash != "" { - ev.Tags = ev.Tags.AppendUnique(nostr.Tag{"g", geohash}) + ev.Tags = ev.Tags.AppendUnique(tag.T{"g", geohash}) } - hashtag := nostr.Tag{"h"} + hashtag := tag.T{"h"} for _, m := range regexp.MustCompile(`#[a-zA-Z0-9]+`).FindAllStringSubmatchIndex(ev.Content, -1) { hashtag = append(hashtag, ev.Content[m[0]+1:m[1]]) } @@ -312,8 +317,8 @@ func doPost(cCtx *cli.Context) error { ev.Tags = ev.Tags.AppendUnique(hashtag) } - ev.CreatedAt = nostr.Now() - ev.Kind = nostr.KindTextNote + ev.CreatedAt = timestamp.Now() + ev.Kind = kind.TextNote if err := ev.Sign(sk); err != nil { return err } @@ -353,8 +358,8 @@ func doReply(cCtx *cli.Context) error { } else { return err } - ev := nostr.Event{} - if pub, err := nostr.GetPublicKey(sk); err == nil { + ev := &nip1.Event{} + if pub, err := nip19.GetPublicKey(sk); err == nil { if _, err := nip19.EncodePublicKey(pub); err != nil { return err } @@ -364,13 +369,13 @@ func doReply(cCtx *cli.Context) error { } if evp := sdk.InputToEventPointer(id); evp != nil { - id = evp.ID + id = evp.ID.String() } else { return fmt.Errorf("failed to parse event from '%s'", id) } - ev.CreatedAt = nostr.Now() - ev.Kind = nostr.KindTextNote + ev.CreatedAt = timestamp.Now() + ev.Kind = kind.TextNote if stdin { b, err := ioutil.ReadAll(os.Stdin) if err != nil { @@ -384,10 +389,10 @@ func doReply(cCtx *cli.Context) error { return errors.New("content is empty") } - ev.Tags = nostr.Tags{} + ev.Tags = tags.T{} for _, entry := range extractLinks(ev.Content) { - ev.Tags = ev.Tags.AppendUnique(nostr.Tag{"r", entry.text}) + ev.Tags = ev.Tags.AppendUnique(tag.T{"r", entry.text}) } for _, u := range cCtx.StringSlice("emoji") { @@ -395,24 +400,24 @@ func doReply(cCtx *cli.Context) error { if len(tok) != 2 { return cli.ShowSubcommandHelp(cCtx) } - ev.Tags = ev.Tags.AppendUnique(nostr.Tag{"emoji", tok[0], tok[1]}) + ev.Tags = ev.Tags.AppendUnique(tag.T{"emoji", tok[0], tok[1]}) } for _, entry := range extractEmojis(ev.Content) { name := strings.Trim(entry.text, ":") if icon, ok := cfg.Emojis[name]; ok { - ev.Tags = ev.Tags.AppendUnique(nostr.Tag{"emoji", name, icon}) + ev.Tags = ev.Tags.AppendUnique(tag.T{"emoji", name, icon}) } } if sensitive != "" { - ev.Tags = ev.Tags.AppendUnique(nostr.Tag{"content-warning", sensitive}) + ev.Tags = ev.Tags.AppendUnique(tag.T{"content-warning", sensitive}) } if geohash != "" { - ev.Tags = ev.Tags.AppendUnique(nostr.Tag{"g", geohash}) + ev.Tags = ev.Tags.AppendUnique(tag.T{"g", geohash}) } - hashtag := nostr.Tag{"h"} + hashtag := tag.T{"h"} for _, m := range regexp.MustCompile(`#[a-zA-Z0-9]+`).FindAllStringSubmatchIndex(ev.Content, -1) { hashtag = append(hashtag, ev.Content[m[0]+1:m[1]]) } @@ -423,9 +428,9 @@ func doReply(cCtx *cli.Context) error { var success atomic.Int64 cfg.Do(Relay{Write: true}, func(ctx context.Context, relay *nostr.Relay) bool { if !quote { - ev.Tags = ev.Tags.AppendUnique(nostr.Tag{"e", id, relay.URL, "reply"}) + ev.Tags = ev.Tags.AppendUnique(tag.T{"e", id, relay.URL, "reply"}) } else { - ev.Tags = ev.Tags.AppendUnique(nostr.Tag{"e", id, relay.URL, "mention"}) + ev.Tags = ev.Tags.AppendUnique(tag.T{"e", id, relay.URL, "mention"}) } if err := ev.Sign(sk); err != nil { return true @@ -450,14 +455,14 @@ func doRepost(cCtx *cli.Context) error { cfg := cCtx.App.Metadata["config"].(*Config) - ev := nostr.Event{} + ev := &nip1.Event{} var sk string if _, s, err := nip19.Decode(cfg.PrivateKey); err == nil { sk = s.(string) } else { return err } - if pub, err := nostr.GetPublicKey(sk); err == nil { + if pub, err := nip19.GetPublicKey(sk); err == nil { if _, err := nip19.EncodePublicKey(pub); err != nil { return err } @@ -467,18 +472,18 @@ func doRepost(cCtx *cli.Context) error { } if evp := sdk.InputToEventPointer(id); evp != nil { - id = evp.ID + id = evp.ID.String() } else { return fmt.Errorf("failed to parse event from '%s'", id) } - ev.Tags = ev.Tags.AppendUnique(nostr.Tag{"e", id}) - filter := nostr.Filter{ - Kinds: []int{nostr.KindTextNote}, - IDs: []string{id}, + ev.Tags = ev.Tags.AppendUnique(tag.T{"e", id}) + filter := &nip1.Filter{ + Kinds: kinds.T{kind.TextNote}, + IDs: tag.T{id}, } - ev.CreatedAt = nostr.Now() - ev.Kind = nostr.KindRepost + ev.CreatedAt = timestamp.Now() + ev.Kind = kind.Repost ev.Content = "" var first atomic.Bool @@ -492,7 +497,7 @@ func doRepost(cCtx *cli.Context) error { return true } for _, tmp := range evs { - ev.Tags = ev.Tags.AppendUnique(nostr.Tag{"p", tmp.ID}) + ev.Tags = ev.Tags.AppendUnique(tag.T{"p", string(tmp.ID)}) } first.Store(false) if err := ev.Sign(sk); err != nil { @@ -517,7 +522,7 @@ func doRepost(cCtx *cli.Context) error { func doUnrepost(cCtx *cli.Context) error { id := cCtx.String("id") if evp := sdk.InputToEventPointer(id); evp != nil { - id = evp.ID + id = evp.ID.String() } else { return fmt.Errorf("failed to parse event from '%s'", id) } @@ -530,16 +535,16 @@ func doUnrepost(cCtx *cli.Context) error { } else { return err } - pub, err := nostr.GetPublicKey(sk) + pub, err := nip19.GetPublicKey(sk) if err != nil { return err } - filter := nostr.Filter{ - Kinds: []int{nostr.KindRepost}, - Authors: []string{pub}, - Tags: nostr.TagMap{"e": []string{id}}, + filter := &nip1.Filter{ + Kinds: kinds.T{kind.Repost}, + Authors: tag.T{pub}, + Tags: nip1.TagMap{"e": tag.T{id}}, } - var repostID string + var repostID nip1.EventID var mu sync.Mutex cfg.Do(Relay{Read: true}, func(ctx context.Context, relay *nostr.Relay) bool { evs, err := relay.QuerySync(ctx, filter) @@ -554,10 +559,10 @@ func doUnrepost(cCtx *cli.Context) error { return true }) - var ev nostr.Event - ev.Tags = ev.Tags.AppendUnique(nostr.Tag{"e", repostID}) - ev.CreatedAt = nostr.Now() - ev.Kind = nostr.KindDeletion + var ev *nip1.Event + ev.Tags = ev.Tags.AppendUnique(tag.T{"e", repostID.String()}) + ev.CreatedAt = timestamp.Now() + ev.Kind = kind.Deletion if err := ev.Sign(sk); err != nil { return err } @@ -584,14 +589,14 @@ func doLike(cCtx *cli.Context) error { cfg := cCtx.App.Metadata["config"].(*Config) - ev := nostr.Event{} + ev := &nip1.Event{} var sk string if _, s, err := nip19.Decode(cfg.PrivateKey); err == nil { sk = s.(string) } else { return err } - if pub, err := nostr.GetPublicKey(sk); err == nil { + if pub, err := nip19.GetPublicKey(sk); err == nil { if _, err := nip19.EncodePublicKey(pub); err != nil { return err } @@ -601,25 +606,25 @@ func doLike(cCtx *cli.Context) error { } if evp := sdk.InputToEventPointer(id); evp != nil { - id = evp.ID + id = evp.ID.String() } else { return fmt.Errorf("failed to parse event from '%s'", id) } - ev.Tags = ev.Tags.AppendUnique(nostr.Tag{"e", id}) - filter := nostr.Filter{ - Kinds: []int{nostr.KindTextNote}, + ev.Tags = ev.Tags.AppendUnique(tag.T{"e", id}) + filter := &nip1.Filter{ + Kinds: kinds.T{kind.TextNote}, IDs: []string{id}, } - ev.CreatedAt = nostr.Now() - ev.Kind = nostr.KindReaction + ev.CreatedAt = timestamp.Now() + ev.Kind = kind.Reaction ev.Content = cCtx.String("content") emoji := cCtx.String("emoji") if emoji != "" { if ev.Content == "" { ev.Content = "like" } - ev.Tags = ev.Tags.AppendUnique(nostr.Tag{"emoji", ev.Content, emoji}) + ev.Tags = ev.Tags.AppendUnique(tag.T{"emoji", ev.Content, emoji}) ev.Content = ":" + ev.Content + ":" } if ev.Content == "" { @@ -637,7 +642,7 @@ func doLike(cCtx *cli.Context) error { return true } for _, tmp := range evs { - ev.Tags = ev.Tags.AppendUnique(nostr.Tag{"p", tmp.ID}) + ev.Tags = ev.Tags.AppendUnique(tag.T{"p", tmp.ID.String()}) } first.Store(false) if err := ev.Sign(sk); err != nil { @@ -663,7 +668,7 @@ func doLike(cCtx *cli.Context) error { func doUnlike(cCtx *cli.Context) error { id := cCtx.String("id") if evp := sdk.InputToEventPointer(id); evp != nil { - id = evp.ID + id = evp.ID.String() } else { return fmt.Errorf("failed to parse event from '%s'", id) } @@ -676,14 +681,14 @@ func doUnlike(cCtx *cli.Context) error { } else { return err } - pub, err := nostr.GetPublicKey(sk) + pub, err := nip19.GetPublicKey(sk) if err != nil { return err } - filter := nostr.Filter{ - Kinds: []int{nostr.KindReaction}, + filter := &nip1.Filter{ + Kinds: kinds.T{kind.Reaction}, Authors: []string{pub}, - Tags: nostr.TagMap{"e": []string{id}}, + Tags: nip1.TagMap{"e": []string{id}}, } var likeID string var mu sync.Mutex @@ -694,16 +699,16 @@ func doUnlike(cCtx *cli.Context) error { } mu.Lock() if len(evs) > 0 && likeID == "" { - likeID = evs[0].ID + likeID = evs[0].ID.String() } mu.Unlock() return true }) - var ev nostr.Event - ev.Tags = ev.Tags.AppendUnique(nostr.Tag{"e", likeID}) - ev.CreatedAt = nostr.Now() - ev.Kind = nostr.KindDeletion + var ev *nip1.Event + ev.Tags = ev.Tags.AppendUnique(tag.T{"e", likeID}) + ev.CreatedAt = timestamp.Now() + ev.Kind = kind.Deletion if err := ev.Sign(sk); err != nil { return err } @@ -730,14 +735,14 @@ func doDelete(cCtx *cli.Context) error { cfg := cCtx.App.Metadata["config"].(*Config) - ev := nostr.Event{} + ev := &nip1.Event{} var sk string if _, s, err := nip19.Decode(cfg.PrivateKey); err == nil { sk = s.(string) } else { return err } - if pub, err := nostr.GetPublicKey(sk); err == nil { + if pub, err := nip19.GetPublicKey(sk); err == nil { if _, err := nip19.EncodePublicKey(pub); err != nil { return err } @@ -747,13 +752,13 @@ func doDelete(cCtx *cli.Context) error { } if evp := sdk.InputToEventPointer(id); evp != nil { - id = evp.ID + id = evp.ID.String() } else { return fmt.Errorf("failed to parse event from '%s'", id) } - ev.Tags = ev.Tags.AppendUnique(nostr.Tag{"e", id}) - ev.CreatedAt = nostr.Now() - ev.Kind = nostr.KindDeletion + ev.Tags = ev.Tags.AppendUnique(tag.T{"e", id}) + ev.CreatedAt = timestamp.Now() + ev.Kind = kind.Deletion if err := ev.Sign(sk); err != nil { return err } @@ -795,8 +800,8 @@ func doSearch(cCtx *cli.Context) error { } // get timeline - filter := nostr.Filter{ - Kinds: []int{nostr.KindTextNote}, + filter := &nip1.Filter{ + Kinds: kinds.T{kind.TextNote}, Search: strings.Join(cCtx.Args().Slice(), " "), Limit: n, } @@ -807,7 +812,8 @@ func doSearch(cCtx *cli.Context) error { } func doStream(cCtx *cli.Context) error { - kinds := cCtx.IntSlice("kind") + kk := cCtx.IntSlice("kind") + k := kinds.FromIntSlice(kk) authors := cCtx.StringSlice("author") f := cCtx.Bool("follow") pattern := cCtx.String("pattern") @@ -836,7 +842,7 @@ func doStream(cCtx *cli.Context) error { } else { return err } - pub, err := nostr.GetPublicKey(sk) + pub, err := nip19.GetPublicKey(sk) if err != nil { return err } @@ -855,30 +861,30 @@ func doStream(cCtx *cli.Context) error { follows = authors } - since := nostr.Now() - filter := nostr.Filter{ - Kinds: kinds, + since := timestamp.Now() + filter := &nip1.Filter{ + Kinds: k, Authors: follows, - Since: &since, + Since: (*timestamp.Tp)(&since), } - sub, err := relay.Subscribe(context.Background(), nostr.Filters{filter}) + sub, err := relay.Subscribe(context.Background(), nip1.Filters{filter}) if err != nil { return err } for ev := range sub.Events { - if ev.Kind == nostr.KindTextNote { + if ev.Kind == kind.TextNote { if re != nil && !re.MatchString(ev.Content) { continue } json.NewEncoder(os.Stdout).Encode(ev) if reply != "" { - var evr nostr.Event + var evr *nip1.Event evr.PubKey = pub evr.Content = reply - evr.Tags = evr.Tags.AppendUnique(nostr.Tag{"e", ev.ID, "", "reply"}) - evr.CreatedAt = nostr.Now() - evr.Kind = nostr.KindTextNote + evr.Tags = evr.Tags.AppendUnique(tag.T{"e", ev.ID.String(), "", "reply"}) + evr.CreatedAt = timestamp.Now() + evr.Kind = kind.TextNote if err := evr.Sign(sk); err != nil { return err } @@ -912,8 +918,8 @@ func doTimeline(cCtx *cli.Context) error { } // get timeline - filter := nostr.Filter{ - Kinds: []int{nostr.KindTextNote}, + filter := &nip1.Filter{ + Kinds: kinds.T{kind.TextNote}, Authors: follows, Limit: n, } @@ -932,8 +938,8 @@ func postMsg(cCtx *cli.Context, msg string) error { } else { return err } - ev := nostr.Event{} - if pub, err := nostr.GetPublicKey(sk); err == nil { + ev := &nip1.Event{} + if pub, err := nip19.GetPublicKey(sk); err == nil { if _, err := nip19.EncodePublicKey(pub); err != nil { return err } @@ -943,9 +949,9 @@ func postMsg(cCtx *cli.Context, msg string) error { } ev.Content = msg - ev.CreatedAt = nostr.Now() - ev.Kind = nostr.KindTextNote - ev.Tags = nostr.Tags{} + ev.CreatedAt = timestamp.Now() + ev.Kind = kind.TextNote + ev.Tags = tags.T{} if err := ev.Sign(sk); err != nil { return err } diff --git a/cmd/publicatr/zap.go b/cmd/publicatr/zap.go index aae5109b..9bcd0a51 100644 --- a/cmd/publicatr/zap.go +++ b/cmd/publicatr/zap.go @@ -13,9 +13,16 @@ import ( "github.com/mdp/qrterminal/v3" "github.com/urfave/cli/v2" - "github.com/nbd-wtf/go-nostr" - "github.com/nbd-wtf/go-nostr/nip04" - "github.com/nbd-wtf/go-nostr/nip19" + "github.com/Hubmakerlabs/replicatr/pkg/nostr" + "github.com/Hubmakerlabs/replicatr/pkg/nostr/kind" + "github.com/Hubmakerlabs/replicatr/pkg/nostr/kinds" + "github.com/Hubmakerlabs/replicatr/pkg/nostr/nip1" + "github.com/Hubmakerlabs/replicatr/pkg/nostr/nip19" + "github.com/Hubmakerlabs/replicatr/pkg/nostr/nip4" + "github.com/Hubmakerlabs/replicatr/pkg/nostr/pointers" + "github.com/Hubmakerlabs/replicatr/pkg/nostr/tag" + "github.com/Hubmakerlabs/replicatr/pkg/nostr/tags" + "github.com/Hubmakerlabs/replicatr/pkg/nostr/timestamp" ) // Lnurlp is @@ -63,18 +70,16 @@ func pay(cfg *Config, invoice string) error { wallet := uri.Host host := uri.Query().Get("relay") secret := uri.Query().Get("secret") - pub, err := nostr.GetPublicKey(secret) + pub, err := nip19.GetPublicKey(secret) if err != nil { return err } - relay, err := nostr.RelayConnect(context.Background(), host) if err != nil { return err } defer relay.Close() - - ss, err := nip04.ComputeSharedSecret(wallet, secret) + ss, err := nip4.ComputeSharedSecret(wallet, secret) if err != nil { return err } @@ -85,46 +90,44 @@ func pay(cfg *Config, invoice string) error { if err != nil { return err } - content, err := nip04.Encrypt(string(b), ss) + content, err := nip4.Encrypt(string(b), ss) if err != nil { return err } - - ev := nostr.Event{ + ev := &nip1.Event{ PubKey: pub, - CreatedAt: nostr.Now(), - Kind: nostr.KindNWCWalletRequest, - Tags: nostr.Tags{nostr.Tag{"p", wallet}}, + CreatedAt: timestamp.Now(), + Kind: kind.NWCWalletRequest, + Tags: tags.T{{"p", wallet}}, Content: content, } err = ev.Sign(secret) if err != nil { return err } - - filters := []nostr.Filter{{ - Tags: nostr.TagMap{ + filters := []*nip1.Filter{{ + Tags: nip1.TagMap{ "p": []string{pub}, - "e": []string{ev.ID}, + "e": []string{string(ev.ID)}, }, - Kinds: []int{nostr.KindNWCWalletInfo, nostr.KindNWCWalletResponse, nostr.KindNWCWalletRequest}, + Kinds: kinds.T{kind.NWCWalletInfo, kind.NWCWalletResponse, kind.NWCWalletRequest}, Limit: 1, }} sub, err := relay.Subscribe(context.Background(), filters) if err != nil { return err } - _, err = relay.Publish(context.Background(), ev) if err != nil { return err } - er := <-sub.Events - content, err = nip04.Decrypt(er.Content, ss) + var decrypted []byte + decrypted, err = nip4.Decrypt(er.Content, ss) if err != nil { return err } + content = string(decrypted) var resp PayResponse err = json.Unmarshal([]byte(content), resp) if err != nil { @@ -144,25 +147,21 @@ func (cfg *Config) ZapInfo(pub string) (*Lnurlp, error) { return nil, errors.New("cannot connect relays") } defer relay.Close() - // get set-metadata - filter := nostr.Filter{ - Kinds: []int{nostr.KindProfileMetadata}, + filter := &nip1.Filter{ + Kinds: kinds.T{kind.ProfileMetadata}, Authors: []string{pub}, Limit: 1, } - evs := cfg.Events(filter) if len(evs) == 0 { return nil, errors.New("cannot find user") } - var profile Profile err := json.Unmarshal([]byte(evs[0].Content), &profile) if err != nil { return nil, err } - tok := strings.SplitN(profile.Lud16, "@", 2) if err != nil { return nil, err @@ -170,13 +169,11 @@ func (cfg *Config) ZapInfo(pub string) (*Lnurlp, error) { if len(tok) != 2 { return nil, errors.New("receipt address is not valid") } - resp, err := http.Get("https://" + tok[1] + "/.well-known/lnurlp/" + tok[0]) if err != nil { return nil, err } defer resp.Body.Close() - var lp Lnurlp err = json.NewDecoder(resp.Body).Decode(&lp) if err != nil { @@ -191,25 +188,20 @@ func doZap(cCtx *cli.Context) error { if cCtx.Args().Len() == 0 { return cli.ShowSubcommandHelp(cCtx) } - if cCtx.Args().Len() == 0 { return cli.ShowSubcommandHelp(cCtx) } - cfg := cCtx.App.Metadata["config"].(*Config) - var sk string if _, s, err := nip19.Decode(cfg.PrivateKey); err == nil { sk = s.(string) } else { return err } - receipt := "" - zr := nostr.Event{} - zr.Tags = nostr.Tags{} - - if pub, err := nostr.GetPublicKey(sk); err == nil { + zr := &nip1.Event{} + zr.Tags = tags.T{} + if pub, err := nip19.GetPublicKey(sk); err == nil { if _, err := nip19.EncodePublicKey(pub); err != nil { return err } @@ -217,9 +209,8 @@ func doZap(cCtx *cli.Context) error { } else { return err } - - zr.Tags = zr.Tags.AppendUnique(nostr.Tag{"amount", fmt.Sprint(amount * 1000)}) - relays := nostr.Tag{"relays"} + zr.Tags = zr.Tags.AppendUnique(tag.T{"amount", fmt.Sprint(amount * 1000)}) + relays := tag.T{"relays"} for k, v := range cfg.Relays { if v.Write { relays = append(relays, k) @@ -229,26 +220,25 @@ func doZap(cCtx *cli.Context) error { if prefix, s, err := nip19.Decode(cCtx.Args().First()); err == nil { switch prefix { case "nevent": - receipt = s.(nostr.EventPointer).Author - zr.Tags = zr.Tags.AppendUnique(nostr.Tag{"p", receipt}) - zr.Tags = zr.Tags.AppendUnique(nostr.Tag{"e", s.(nostr.EventPointer).ID}) + receipt = s.(pointers.Event).Author + zr.Tags = zr.Tags.AppendUnique(tag.T{"p", receipt}) + zr.Tags = zr.Tags.AppendUnique(tag.T{"e", string(s.(pointers.Event).ID)}) case "note": - evs := cfg.Events(nostr.Filter{IDs: []string{s.(string)}}) + evs := cfg.Events(&nip1.Filter{IDs: []string{s.(string)}}) if len(evs) != 0 { receipt = evs[0].PubKey - zr.Tags = zr.Tags.AppendUnique(nostr.Tag{"p", receipt}) + zr.Tags = zr.Tags.AppendUnique(tag.T{"p", receipt}) } - zr.Tags = zr.Tags.AppendUnique(nostr.Tag{"e", s.(string)}) + zr.Tags = zr.Tags.AppendUnique(tag.T{"e", s.(string)}) case "npub": receipt = s.(string) - zr.Tags = zr.Tags.AppendUnique(nostr.Tag{"p", receipt}) + zr.Tags = zr.Tags.AppendUnique(tag.T{"p", receipt}) default: return errors.New("invalid argument") } } - - zr.Kind = nostr.KindZapRequest // 9734 - zr.CreatedAt = nostr.Now() + zr.Kind = kind.ZapRequest // 9734 + zr.CreatedAt = timestamp.Now() zr.Content = comment if err := zr.Sign(sk); err != nil { return err @@ -257,7 +247,6 @@ func doZap(cCtx *cli.Context) error { if err != nil { return err } - zi, err := cfg.ZapInfo(receipt) if err != nil { return err @@ -275,13 +264,11 @@ func doZap(cCtx *cli.Context) error { return err } defer resp.Body.Close() - var iv Invoice err = json.NewDecoder(resp.Body).Decode(&iv) if err != nil { return err } - if cfg.NwcURI == "" { config := qrterminal.Config{ HalfBlocks: false, diff --git a/go.mod b/go.mod index dfda9826..a7955ded 100644 --- a/go.mod +++ b/go.mod @@ -5,13 +5,16 @@ go 1.21.5 require ( github.com/dgraph-io/badger/v4 v4.2.0 github.com/fasthttp/websocket v1.5.7 + github.com/fatih/color v1.16.0 github.com/fiatjaf/generic-ristretto v0.0.1 github.com/gobwas/httphead v0.1.0 github.com/gobwas/ws v1.3.1 + github.com/mdp/qrterminal/v3 v3.2.0 github.com/minio/sha256-simd v1.0.1 github.com/puzpuzpuz/xsync/v2 v2.5.1 github.com/rs/cors v1.10.1 github.com/sebest/xff v0.0.0-20210106013422-671bd2870b3a + github.com/urfave/cli/v2 v2.27.1 golang.org/x/exp v0.0.0-20231219180239-dc181d75b848 golang.org/x/net v0.18.0 lukechampine.com/frand v1.4.2 @@ -24,24 +27,31 @@ require ( github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da // indirect github.com/andybalholm/brotli v1.0.5 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/dchest/blake256 v1.1.0 // indirect github.com/dgraph-io/ristretto v0.1.1 // indirect - github.com/dustin/go-humanize v1.0.1 // indirect + github.com/dustin/go-humanize v1.0.0 // indirect github.com/gobwas/pool v0.2.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/glog v1.1.2 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.3 // indirect - github.com/golang/snappy v0.0.4 // indirect - github.com/google/flatbuffers v23.5.26+incompatible // indirect + github.com/golang/glog v1.0.0 // indirect + github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 // indirect + github.com/golang/protobuf v1.5.2 // indirect + github.com/golang/snappy v0.0.3 // indirect + github.com/google/flatbuffers v1.12.1 // indirect github.com/klauspost/compress v1.17.3 // indirect github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/pkg/errors v0.9.1 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/savsgio/gotils v0.0.0-20230208104028-c358bd845dee // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasthttp v1.51.0 // indirect - go.opencensus.io v0.24.0 // indirect + github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect + go.opencensus.io v0.22.5 // indirect golang.org/x/sys v0.14.0 // indirect - google.golang.org/protobuf v1.31.0 // indirect + golang.org/x/term v0.14.0 // indirect + google.golang.org/protobuf v1.28.1 // indirect + rsc.io/qr v0.2.0 // indirect ) diff --git a/go.sum b/go.sum index fb34f435..88a910d2 100644 --- a/go.sum +++ b/go.sum @@ -4,12 +4,12 @@ github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da h1:KjTM2ks9d14ZYCvmH github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da/go.mod h1:eHEWzANqSiWQsof+nXEI9bUVUyV6F53Fp89EuCh2EAA= github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -21,15 +21,12 @@ github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWa github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= -github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fasthttp/websocket v1.5.7 h1:0a6o2OfeATvtGgoMKleURhLT6JqWPg7fYfWnH4KHau4= github.com/fasthttp/websocket v1.5.7/go.mod h1:bC4fxSono9czeXHQUVKxsC0sNjbm7lPJR04GDFqClfU= +github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= +github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= github.com/fiatjaf/generic-ristretto v0.0.1 h1:LUJSU87X/QWFsBXTwnH3moFe4N8AjUxT+Rfa0+bo6YM= github.com/fiatjaf/generic-ristretto v0.0.1/go.mod h1:cvV6ANHDA/GrfzVrig7N7i6l8CWnkVZvtQ2/wk9DPVE= github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= @@ -41,76 +38,69 @@ github.com/gobwas/ws v1.3.1/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/K github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= -github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 h1:ZgQEtGgCBiWRM39fZuwSd1LwSqqSW0hOdXCYYDX0R3I= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/flatbuffers v23.5.26+incompatible h1:M9dgRyhJemaM4Sw8+66GHBu8ioaQmyPLg1b8VwK5WJg= -github.com/google/flatbuffers v23.5.26+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/flatbuffers v1.12.1 h1:MVlul7pQNoDzWRLTw5imwYsl+usrS1TXG2H4jg6ImGw= +github.com/google/flatbuffers v1.12.1/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.17.3 h1:qkRjuerhUU1EmXLYGkSH6EZL+vPSxIrYjLNAK4slzwA= github.com/klauspost/compress v1.17.3/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mdp/qrterminal/v3 v3.2.0 h1:qteQMXO3oyTK4IHwj2mWsKYYRBOp1Pj2WRYFYYNTCdk= +github.com/mdp/qrterminal/v3 v3.2.0/go.mod h1:XGGuua4Lefrl7TLEsSONiD+UEjQXJZ4mPzF+gWYIJkk= github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/puzpuzpuz/xsync/v2 v2.5.1 h1:mVGYAvzDSu52+zaGyNjC+24Xw2bQi3kTr4QJ6N9pIIU= github.com/puzpuzpuz/xsync/v2 v2.5.1/go.mod h1:gD2H2krq/w52MfPLE+Uy64TzJDVY7lP2znR9qmR35kU= github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/savsgio/gotils v0.0.0-20230208104028-c358bd845dee h1:8Iv5m6xEo1NR1AvpV+7XmhI4r39LGNzwUL4YpMuL5vk= github.com/savsgio/gotils v0.0.0-20230208104028-c358bd845dee/go.mod h1:qwtSXrKuJh/zsFQ12yEE89xfCrGKK63Rr7ctU/uCo4g= github.com/sebest/xff v0.0.0-20210106013422-671bd2870b3a h1:iLcLb5Fwwz7g/DLK89F+uQBDeAhHhwdzB5fSlVdhGcM= github.com/sebest/xff v0.0.0-20210106013422-671bd2870b3a/go.mod h1:wozgYq9WEBQBaIJe4YZ0qTSFAMxmcwBhQH0fO0R34Z0= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/urfave/cli/v2 v2.27.1 h1:8xSQ6szndafKVRmfyeUMxkNUJQMjL1F2zmsZ+qHpfho= +github.com/urfave/cli/v2 v2.27.1/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.51.0 h1:8b30A5JlZ6C7AS81RsWjYMQmrZG6feChmgAolCl1SqA= github.com/valyala/fasthttp v1.51.0/go.mod h1:oI2XroL+lI7vdXyYoQk03bXBThfFl2cVdIA3Xl7cH8g= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opencensus.io v0.22.5 h1:dntmOdLpSpHlVqbW5Eay97DelsZHe+55D+xC6i0dDS0= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -130,32 +120,35 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.14.0 h1:LGK9IlZ8T9jvdy6cTdfKUCltatMFOehAQo9SRC46UQ8= +golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -166,33 +159,18 @@ golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8T google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= lukechampine.com/frand v1.4.2 h1:RzFIpOvkMXuPMBb9maa4ND4wjBn71E1Jpf8BzJHMaVw= lukechampine.com/frand v1.4.2/go.mod h1:4S/TM2ZgrKejMcKMbeLjISpJMO+/eZ1zu3vYX9dtj3s= mleku.online/git/bech32 v1.0.3 h1:RwtkFB19yRxsYqXyqVqPAIsYWXYPMJQGXcwVz37DHAs= @@ -201,3 +179,5 @@ mleku.online/git/ec v1.0.4 h1:wsXfszxoDUVqF3IcDmr+vFh7dONBgelL+6iESiHLVho= mleku.online/git/ec v1.0.4/go.mod h1:D1BIglBfDaUsit3R+LVVXJ9SlxwjPnCJpp+gz6yARzY= mleku.online/git/log v1.0.7 h1:jNDph/CW/GerRluqcWV6F+NMng1gmm5Qi/TFAJRAfpo= mleku.online/git/log v1.0.7/go.mod h1:OdomTvlDYHzX1daD1LaqU+TtX484EbECPKOiMrlGkOY= +rsc.io/qr v0.2.0 h1:6vBLea5/NRMVTz8V66gipeLycZMl/+UlFmk8DvqQ6WY= +rsc.io/qr v0.2.0/go.mod h1:IF+uZjkb9fqyeF/4tlBoynqmQxUoPfWEKh921coOuXs= diff --git a/pkg/nostr/kind/kinds.go b/pkg/nostr/kind/kinds.go index b7ec3789..47f03882 100644 --- a/pkg/nostr/kind/kinds.go +++ b/pkg/nostr/kind/kinds.go @@ -1,7 +1,5 @@ package kind -import "github.com/Hubmakerlabs/replicatr/pkg/wire/array" - // T - which will be externally referenced as kind.T is the event type in the // nostr protocol, the use of the capital T signifying type, consistent with Go // idiom, the Go standard library, and much, conformant, existing code. @@ -70,51 +68,3 @@ func (evt T) IsParameterizedReplaceable() bool { return evt >= ParameterizedReplaceableStart && evt < ParameterizedReplaceableEnd } - -type Array []T - -// ToArray converts to the generic array.T type ([]interface{}) -func (ar Array) ToArray() (a array.T) { - a = make(array.T, len(ar)) - for i := range ar { - a[i] = ar[i] - } - return -} - -// Clone makes a new kind.Array with the same members. -func (ar Array) Clone() (c Array) { - c = make(Array, len(ar)) - for i := range ar { - c[i] = ar[i] - } - return -} - -// Contains returns true if the provided element is found in the kind.Array. -// -// Note that the request must use the typed kind.T or convert the number thus. -// Even if a custom number is found, this codebase does not have the logic to -// deal with the kind so such a search is pointless and for which reason static -// typing always wins. No mistakes possible with known quantities. -func (ar Array) Contains(s T) bool { - for i := range ar { - if ar[i] == s { - return true - } - } - return false -} - -// Equals checks that the provided kind.Array matches. -func (ar Array) Equals(t1 Array) bool { - if len(ar) != len(t1) { - return false - } - for i := range ar { - if ar[i] != t1[i] { - return false - } - } - return true -} diff --git a/pkg/nostr/kinds/kinds.go b/pkg/nostr/kinds/kinds.go new file mode 100644 index 00000000..0ad9c48e --- /dev/null +++ b/pkg/nostr/kinds/kinds.go @@ -0,0 +1,61 @@ +package kinds + +import ( + "github.com/Hubmakerlabs/replicatr/pkg/nostr/kind" + "github.com/Hubmakerlabs/replicatr/pkg/wire/array" +) + +type T []kind.T + +// ToArray converts to the generic array.T type ([]interface{}) +func (ar T) ToArray() (a array.T) { + a = make(array.T, len(ar)) + for i := range ar { + a[i] = ar[i] + } + return +} + +func FromIntSlice(is []int) (k T) { + for i := range is { + k = append(k, kind.T(is[i])) + } + return +} + +// Clone makes a new kind.T with the same members. +func (ar T) Clone() (c T) { + c = make(T, len(ar)) + for i := range ar { + c[i] = ar[i] + } + return +} + +// Contains returns true if the provided element is found in the kinds.T. +// +// Note that the request must use the typed kind.T or convert the number thus. +// Even if a custom number is found, this codebase does not have the logic to +// deal with the kind so such a search is pointless and for which reason static +// typing always wins. No mistakes possible with known quantities. +func (ar T) Contains(s kind.T) bool { + for i := range ar { + if ar[i] == s { + return true + } + } + return false +} + +// Equals checks that the provided kind.T matches. +func (ar T) Equals(t1 T) bool { + if len(ar) != len(t1) { + return false + } + for i := range ar { + if ar[i] != t1[i] { + return false + } + } + return true +} diff --git a/pkg/nostr/nip1/filters.go b/pkg/nostr/nip1/filters.go index 4c96ddad..b236adfe 100644 --- a/pkg/nostr/nip1/filters.go +++ b/pkg/nostr/nip1/filters.go @@ -3,12 +3,13 @@ package nip1 import ( "encoding/json" "fmt" - "github.com/Hubmakerlabs/replicatr/pkg/nostr/kind" + "sort" + + "github.com/Hubmakerlabs/replicatr/pkg/nostr/kinds" "github.com/Hubmakerlabs/replicatr/pkg/nostr/tag" "github.com/Hubmakerlabs/replicatr/pkg/nostr/timestamp" "github.com/Hubmakerlabs/replicatr/pkg/wire/array" "github.com/Hubmakerlabs/replicatr/pkg/wire/object" - "sort" ) type Filters []*Filter @@ -50,7 +51,7 @@ func (eff Filters) ToArray() (a array.T) { // populated tags are put into the map as they are expected to be. type Filter struct { IDs tag.T `json:"ids,omitempty"` - Kinds kind.Array `json:"kinds,omitempty"` + Kinds kinds.T `json:"kinds,omitempty"` Authors tag.T `json:"authors,omitempty"` Tags TagMap `json:"-,omitempty"` Since *timestamp.Tp `json:"since,omitempty"` diff --git a/pkg/nostr/nip1/filters_test.go b/pkg/nostr/nip1/filters_test.go index abb96b31..01abd00b 100644 --- a/pkg/nostr/nip1/filters_test.go +++ b/pkg/nostr/nip1/filters_test.go @@ -2,12 +2,14 @@ package nip1_test import ( "encoding/json" + "testing" + "time" + "github.com/Hubmakerlabs/replicatr/pkg/nostr/kind" + "github.com/Hubmakerlabs/replicatr/pkg/nostr/kinds" "github.com/Hubmakerlabs/replicatr/pkg/nostr/nip1" "github.com/Hubmakerlabs/replicatr/pkg/nostr/tag" "github.com/Hubmakerlabs/replicatr/pkg/nostr/timestamp" - "testing" - "time" ) var filt = nip1.Filters{ @@ -18,7 +20,7 @@ var filt = nip1.Filters{ "92570b321da503eac8014b23447301eb3d0bbdfbace0d11a4e4072e72bb7205d", "92570b321da503eac8014b23447301eb3d0bbdfbace0d11a4e4072e72bb7205d", }, - Kinds: kind.Array{ + Kinds: kinds.T{ kind.TextNote, kind.MemoryHole, kind.CategorizedBookmarksList, }, Authors: []string{ diff --git a/pkg/nostr/nip1/unmarshalfilter.go b/pkg/nostr/nip1/unmarshalfilter.go index 9556b953..53674728 100644 --- a/pkg/nostr/nip1/unmarshalfilter.go +++ b/pkg/nostr/nip1/unmarshalfilter.go @@ -4,14 +4,15 @@ package nip1 import ( "fmt" - "github.com/Hubmakerlabs/replicatr/pkg/nostr/kind" + + "github.com/Hubmakerlabs/replicatr/pkg/nostr/kinds" "github.com/Hubmakerlabs/replicatr/pkg/nostr/tag" "github.com/Hubmakerlabs/replicatr/pkg/nostr/timestamp" ) type UnmarshalingFilter struct { IDs tag.T `json:"ids,omitempty"` - Kinds kind.Array `json:"kinds,omitempty"` + Kinds kinds.T `json:"kinds,omitempty"` Authors tag.T `json:"authors,omitempty"` Ta tag.T `json:"#a,omitempty"` Tb tag.T `json:"#b,omitempty"` diff --git a/pkg/nostr/nip1/unmarshalgen.go b/pkg/nostr/nip1/unmarshalgen.go index 68b110eb..bd9d02d2 100644 --- a/pkg/nostr/nip1/unmarshalgen.go +++ b/pkg/nostr/nip1/unmarshalgen.go @@ -22,7 +22,7 @@ import ( type UnmarshalingFilter struct { IDs tag.T `+"`json:\"ids,omitempty\"`"+` - Kinds kind.Array `+"`json:\"kinds,omitempty\"`"+` + Kinds kinds.T `+"`json:\"kinds,omitempty\"`"+` Authors tag.T `+"`json:\"authors,omitempty\"`"+` `) for i := 'a'; i < 'z'; i++ { diff --git a/pkg/nostr/sdk b/pkg/nostr/sdk new file mode 160000 index 00000000..6e6db693 --- /dev/null +++ b/pkg/nostr/sdk @@ -0,0 +1 @@ +Subproject commit 6e6db693e2cf53d95b464f91d71f6cfad0063073 diff --git a/pkg/nostr/subscription_test.go b/pkg/nostr/subscription_test.go index ae982de9..6a4e04f1 100644 --- a/pkg/nostr/subscription_test.go +++ b/pkg/nostr/subscription_test.go @@ -3,11 +3,13 @@ package nostr import ( "context" "fmt" - "github.com/Hubmakerlabs/replicatr/pkg/nostr/kind" - "github.com/Hubmakerlabs/replicatr/pkg/nostr/nip1" "sync/atomic" "testing" "time" + + "github.com/Hubmakerlabs/replicatr/pkg/nostr/kind" + "github.com/Hubmakerlabs/replicatr/pkg/nostr/kinds" + "github.com/Hubmakerlabs/replicatr/pkg/nostr/nip1" ) const RELAY = "wss://nostr.mom" @@ -25,7 +27,7 @@ func TestSubscribe(t *testing.T) { sub, err := rl.Subscribe(context.Background(), nip1.Filters{ - {Kinds: kind.Array{kind.TextNote}, Limit: 2}, + {Kinds: kinds.T{kind.TextNote}, Limit: 2}, }) if err != nil { t.Errorf("subscription failed: %v", err) @@ -68,7 +70,7 @@ func TestNestedSubscriptions(t *testing.T) { // fetch 2 replies to a note sub, err := rl.Subscribe(context.Background(), nip1.Filters{{ - Kinds: kind.Array{kind.TextNote}, + Kinds: kinds.T{kind.TextNote}, Tags: nip1.TagMap{"e": []string{"0e34a74f8547e3b95d52a2543719b109fd0312aba144e2ef95cba043f42fe8c5"}}, Limit: 3, }}) @@ -81,7 +83,7 @@ func TestNestedSubscriptions(t *testing.T) { select { case event := <-sub.Events: // now fetch author of this - sub, err := rl.Subscribe(context.Background(), nip1.Filters{{Kinds: kind.Array{kind.SetMetadata}, Authors: []string{event.PubKey}, Limit: 1}}) + sub, err := rl.Subscribe(context.Background(), nip1.Filters{{Kinds: kinds.T{kind.SetMetadata}, Authors: []string{event.PubKey}, Limit: 1}}) if err != nil { t.Errorf("subscription 2 failed: %v", err) return diff --git a/pkg/relay/add-event.go b/pkg/relay/add-event.go index fee50739..d1065499 100644 --- a/pkg/relay/add-event.go +++ b/pkg/relay/add-event.go @@ -4,7 +4,8 @@ import ( "context" "errors" "fmt" - "github.com/Hubmakerlabs/replicatr/pkg/nostr/kind" + + "github.com/Hubmakerlabs/replicatr/pkg/nostr/kinds" "github.com/Hubmakerlabs/replicatr/pkg/nostr/nip1" "github.com/Hubmakerlabs/replicatr/pkg/relay/eventstore" @@ -31,7 +32,7 @@ func (rl *Relay) AddEvent(ctx context.Context, evt *nip1.Event) error { if evt.Kind.IsReplaceable() { // replaceable event, delete before storing for _, query := range rl.QueryEvents { - ch, err := query(ctx, &nip1.Filter{Authors: []string{evt.PubKey}, Kinds: kind.Array{evt.Kind}}) + ch, err := query(ctx, &nip1.Filter{Authors: []string{evt.PubKey}, Kinds: kinds.T{evt.Kind}}) if err != nil { continue } @@ -46,7 +47,7 @@ func (rl *Relay) AddEvent(ctx context.Context, evt *nip1.Event) error { d := evt.Tags.GetFirst([]string{"d", ""}) if d != nil { for _, query := range rl.QueryEvents { - ch, err := query(ctx, &nip1.Filter{Authors: []string{evt.PubKey}, Kinds: kind.Array{evt.Kind}, Tags: nip1.TagMap{"d": []string{d.Value()}}}) + ch, err := query(ctx, &nip1.Filter{Authors: []string{evt.PubKey}, Kinds: kinds.T{evt.Kind}, Tags: nip1.TagMap{"d": []string{d.Value()}}}) if err != nil { continue } diff --git a/pkg/relay/eventstore/relay_interface.go b/pkg/relay/eventstore/relay_interface.go index e2f50245..39b724fd 100644 --- a/pkg/relay/eventstore/relay_interface.go +++ b/pkg/relay/eventstore/relay_interface.go @@ -4,7 +4,8 @@ import ( "context" "errors" "fmt" - "github.com/Hubmakerlabs/replicatr/pkg/nostr/kind" + + "github.com/Hubmakerlabs/replicatr/pkg/nostr/kinds" "github.com/Hubmakerlabs/replicatr/pkg/nostr/nip1" ) @@ -43,7 +44,7 @@ func (w RelayWrapper) Publish(ctx context.Context, evt nip1.Event) (e error) { } else if evt.Kind.IsReplaceable() { // replaceable event, delete before storing var ch chan *nip1.Event - ch, e = w.Store.QueryEvents(ctx, &nip1.Filter{Authors: []string{evt.PubKey}, Kinds: kind.Array{evt.Kind}}) + ch, e = w.Store.QueryEvents(ctx, &nip1.Filter{Authors: []string{evt.PubKey}, Kinds: kinds.T{evt.Kind}}) if fails(e) { return fmt.Errorf("failed to query before replacing: %w", e) } @@ -59,7 +60,7 @@ func (w RelayWrapper) Publish(ctx context.Context, evt nip1.Event) (e error) { var ch chan *nip1.Event ch, e = w.Store.QueryEvents(ctx, &nip1.Filter{ Authors: []string{evt.PubKey}, - Kinds: kind.Array{evt.Kind}, + Kinds: kinds.T{evt.Kind}, Tags: nip1.TagMap{"d": []string{d.Value()}}, }) if fails(e) { diff --git a/pkg/relay/handlers.go b/pkg/relay/handlers.go index 73e7a2b5..0e73355e 100644 --- a/pkg/relay/handlers.go +++ b/pkg/relay/handlers.go @@ -3,7 +3,6 @@ package relay import ( "context" "crypto/rand" - "crypto/sha256" "encoding/hex" "encoding/json" "errors" @@ -16,6 +15,7 @@ import ( "github.com/Hubmakerlabs/replicatr/pkg/nostr/nip42" "github.com/Hubmakerlabs/replicatr/pkg/nostr/nip45" "github.com/fasthttp/websocket" + "github.com/minio/sha256-simd" "github.com/rs/cors" ) diff --git a/pkg/relay/policies/events.go b/pkg/relay/policies/events.go index 7f5f2bf5..900fa821 100644 --- a/pkg/relay/policies/events.go +++ b/pkg/relay/policies/events.go @@ -2,7 +2,9 @@ package policies import ( "context" + "github.com/Hubmakerlabs/replicatr/pkg/nostr/kind" + "github.com/Hubmakerlabs/replicatr/pkg/nostr/kinds" "github.com/Hubmakerlabs/replicatr/pkg/nostr/timestamp" "github.com/Hubmakerlabs/replicatr/pkg/nostr/nip1" @@ -14,7 +16,7 @@ import ( // // If ignoreKinds is given this restriction will not apply to these kinds (useful for allowing a bigger). // If onlyKinds is given then all other kinds will be ignored. -func PreventTooManyIndexableTags(max int, ignoreKinds kind.Array, onlyKinds kind.Array) func(context.Context, *nip1.Event) (bool, string) { +func PreventTooManyIndexableTags(max int, ignoreKinds kinds.T, onlyKinds kinds.T) func(context.Context, *nip1.Event) (bool, string) { ignore := func(kind kind.T) bool { return false } if len(ignoreKinds) > 0 { ignore = func(kind kind.T) bool { diff --git a/pkg/relay/policies/filters.go b/pkg/relay/policies/filters.go index d3de5d23..a6260d4e 100644 --- a/pkg/relay/policies/filters.go +++ b/pkg/relay/policies/filters.go @@ -2,7 +2,8 @@ package policies import ( "context" - "github.com/Hubmakerlabs/replicatr/pkg/nostr/kind" + + kinds2 "github.com/Hubmakerlabs/replicatr/pkg/nostr/kinds" "github.com/Hubmakerlabs/replicatr/pkg/nostr/nip1" "golang.org/x/exp/slices" @@ -52,7 +53,7 @@ func RemoveSearchQueries(ctx context.Context, filter *nip1.Filter) { func RemoveAllButKinds(kinds ...uint16) func(context.Context, *nip1.Filter) { return func(ctx context.Context, filter *nip1.Filter) { if n := len(filter.Kinds); n > 0 { - newKinds := make(kind.Array, 0, n) + newKinds := make(kinds2.T, 0, n) for i := 0; i < n; i++ { if k := filter.Kinds[i]; slices.Contains(kinds, uint16(k)) { newKinds = append(newKinds, k)