diff --git a/.gitignore b/.gitignore index 409f624..5570f55 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ bin config +media +data diff --git a/README.md b/README.md index 006de90..7f2e464 100644 --- a/README.md +++ b/README.md @@ -33,12 +33,25 @@ Configures NIP 29 support. - `auto_join` - whether relay members can join `open` groups without approval. Defaults to `true`. - `auto_leave` - whether relay members can leave groups without approval. Defaults to `true`. +### `[management]` + +Configures NIP 86 support. + +- `enabled` - whether NIP 86 is enabled. +- `methods` - a list of [NIP 86](https://github.com/nostr-protocol/nips/blob/master/86.md) relay management methods enabled for this relay. + +### `[blossom]` + +Configures blossom support. + +- `enabled` - whether blossom is enabled. +- `directory` - where to store files. Defaults to `./data/{my-relay}/media`. + ### `[roles]` Defines roles that can be assigned to different users and attendant privileges. Each role is defined by a `[roles.{role_name}]` header and has the following options: -- `pubkey` - a list of nostr pubkeys this role is assigned to. -- `nip86_methods` - a list of [NIP 86](https://github.com/nostr-protocol/nips/blob/master/86.md) relay management methods enabled for this role. Defaults to `[]`. +- `pubkeys` - a list of nostr pubkeys this role is assigned to. - `can_invite` - a boolean indicating whether this role can invite new members to the relay by requesting a `kind 28935` claim. Defaults to `false`. See [access requests](https://github.com/nostr-protocol/nips/pull/1079) for more details. A special `[roles.member]` heading may be used to configure policies for all relay users (that is, pubkeys assigned to other roles, or who have redeemed an invite code). @@ -47,8 +60,7 @@ A special `[roles.member]` heading may be used to configure policies for all rel Contains information related to data persistence. -- `sqlite` is the location of the sqlite database file. Defaults to `./data/{my-relay}.db`. -- `media` is the name of the directory for storing blossom files. Defaults to `./media/{my-relay}`. +- `events` - the location of the sqlite database file used to store events. Defaults to `./data/{my-relay}/events`. ### Example @@ -56,25 +68,28 @@ The below config file might be saved as `./config/my-relay.example.com` in order ```toml [self] - name = "My relay" secret = "ce30b1831a4551f4cb7a984033c34ab96d8cf56ff50df9d0c27d9fa5422f2278" -[roles] +[groups] +enabled = true +auto_join = false + +[management] +enabled = true +methods = ["supportedmethods", "banpubkey", "allowpubkey"] + +[blossom] +enabled = false [roles.member] - can_invite = true [roles.admin] - -nip86_methods = ["supportedmethods", "banpubkey", "allowpubkey"] pubkeys = ["d9254d9898fd4728f7e2b32b87520221a50f6b8b97d935d7da2de8923988aa6d"] -[groups] - -enabled = true -auto_join = false +[data] +events = "./data/my-relay/events" ``` ## Development diff --git a/zooid/blossom.go b/zooid/blossom.go new file mode 100644 index 0000000..4fb6f4c --- /dev/null +++ b/zooid/blossom.go @@ -0,0 +1,8 @@ +package zooid + +import ( + "fiatjaf.com/nostr/khatru" +) + +func EnableBlossom(config *Config, relay *khatru.Relay) { +} diff --git a/zooid/config.go b/zooid/config.go index f2584a6..5dd44ee 100644 --- a/zooid/config.go +++ b/zooid/config.go @@ -21,15 +21,23 @@ type Config struct { AutoLeave bool `toml:"auto_leave"` } `toml:"groups"` + Management struct { + Enabled bool `toml:"enabled"` + Methods []string `toml:"methods"` + } `toml:"management"` + + Blossom struct { + Enabled bool `toml:"enabled"` + Directory string `toml:"directory"` + } `toml:"blossom"` + Roles map[string]struct { Pubkeys []string `toml:"pubkeys"` - Nip86Methods []string `toml:"nip86_methods"` CanInvite bool `toml:"can_invite"` } `toml:"roles"` Data struct { - Sqlite string `toml:"sqlite"` - Media string `toml:"media"` + Events string `toml:"events"` } `toml:"data"` } diff --git a/zooid/groups.go b/zooid/groups.go new file mode 100644 index 0000000..de162b1 --- /dev/null +++ b/zooid/groups.go @@ -0,0 +1,9 @@ +package zooid + +import ( + "fiatjaf.com/nostr/khatru" +) + +func EnableGroups(config *Config, relay *khatru.Relay) { + relay.Info.SupportedNIPs = append(relay.Info.SupportedNIPs, 29) +} diff --git a/zooid/management.go b/zooid/management.go new file mode 100644 index 0000000..4a7be10 --- /dev/null +++ b/zooid/management.go @@ -0,0 +1,8 @@ +package zooid + +import ( + "fiatjaf.com/nostr/khatru" +) + +func EnableManagement(config *Config, relay *khatru.Relay) { +} diff --git a/zooid/relay.go b/zooid/relay.go index 66e4578..93a32ca 100644 --- a/zooid/relay.go +++ b/zooid/relay.go @@ -1,12 +1,40 @@ package zooid import ( - "fiatjaf.com/nostr/khatru" "sync" + + "fiatjaf.com/nostr/khatru" ) func MakeRelay(hostname string, config *Config) *khatru.Relay { relay := khatru.NewRelay() + relay.Info.Name = config.Name + relay.Info.Icon = config.Icon + relay.Info.PubKey = config.Pubkey + relay.Info.Description = config.Description + relay.Info.Self = nostr.GetPublicKey(config.Secret) + relay.Info.Software = "https://github.com/coracle-social/zooid" + relay.Info.Version = "v0.1.0" + + relay.OnConnect = append(relay.OnConnect, khatru.RequestAuth) + relay.RejectFilter = append(relay.RejectFilter, RejectFilter) + relay.QueryEvents = append(relay.QueryEvents, QueryEvents) + relay.DeleteEvent = append(relay.DeleteEvent, DeleteEvent) + relay.RejectEvent = append(relay.RejectEvent, RejectEvent) + relay.StoreEvent = append(relay.StoreEvent, SaveEvent) + relay.OnEventSaved = append(relay.OnEventSaved, OnEventSaved) + + if config.Groups.Enabled { + EnableGroups(config, relay) + } + + if config.Blossom.Enabled { + EnableBlossom(config, relay) + } + + if config.Management.Enabled { + EnableManagement(config, relay) + } return relay }