pub struct Community {
pub id: CommunityId,
pub server_root_key: ServerRootKey,
pub server_root_epoch: Epoch,
pub name: String,
pub description: Option<String>,
pub icon: Option<CommunityImage>,
pub banner: Option<CommunityImage>,
pub relays: Vec<String>,
pub channels: Vec<Channel>,
pub owner_attestation: Option<String>,
pub dissolved: bool,
}Expand description
A Community (Discord’s “server”).
Keyless authority model: there is no shared signing key. READ access = key possession
(server_root_key + the granted channel keys let any member read/post); WRITE authority = the
member’s npub rank in the owner-rooted roster, and the OWNER is derived by verifying the
owner_attestation (see service::is_proven_owner). ChannelKey/ServerRootKey secrets are not
serialized here; persistence is a separate, vault-backed concern.
Fields§
§id: CommunityId§server_root_key: ServerRootKey@everyone base key — at server_root_epoch.
server_root_epoch: EpochThe server-root’s current epoch — the base/@everyone read clock. Bumps only on a
base rotation (a Private-community removal, or re-founding); stays 0 in a Public community and
at MVP. The per-epoch server-root pseudonym is derived from this, so it is the G1 seam the
control-plane fetch widens against once re-anchoring + multi-epoch fetch ship.
name: String§description: Option<String>Short description / topic (server-root-gated metadata; shown in invite previews).
icon: Option<CommunityImage>Logo (encrypted blob ref — see CommunityImage).
Banner (encrypted blob ref).
relays: Vec<String>Preferred relay set for all of this Community’s events.
channels: Vec<Channel>§owner_attestation: Option<String>The owner’s identity attestation (a signed event JSON, see owner) binding this
community’s id to the owner’s npub. The proven owner is DERIVED by verifying it, never stored
as a bare claim. None until the creator signs it. Travels in the GroupRoot + invite bundle.
dissolved: boolThe owner-dissolution SEAL. true once a folded GroupDissolved tombstone was verified against
the proven owner — PERMANENT and irreversible (there is no un-dissolve; the way forward is a fresh
community). Once set, the control fold stops advancing and the inbound path drops every subsequent
event (any kind/author/time — the seal is this flag, NOT a timestamp). false for a live community.
Implementations§
Source§impl Community
impl Community
Sourcepub fn create(
name: impl Into<String>,
default_channel_name: impl Into<String>,
relays: Vec<String>,
) -> Self
pub fn create( name: impl Into<String>, default_channel_name: impl Into<String>, relays: Vec<String>, ) -> Self
Mint a brand-new Community with one default channel, owned by the creator.
All ids are random opaque 32-byte values (NOT timestamp snowflakes), and the
server-root + channel keys are independently generated (hook #3). The owner attestation
is signed separately by service::create_community (it needs the owner’s identity signer).
Trait Implementations§
Auto Trait Implementations§
impl Freeze for Community
impl RefUnwindSafe for Community
impl Send for Community
impl Sync for Community
impl Unpin for Community
impl UnsafeUnpin for Community
impl UnwindSafe for Community
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more