diff --git a/js/components/src/livestream-store/websocket-consumer.tsx b/js/components/src/livestream-store/websocket-consumer.tsx index 039b10bb..54f41301 100644 --- a/js/components/src/livestream-store/websocket-consumer.tsx +++ b/js/components/src/livestream-store/websocket-consumer.tsx @@ -3,7 +3,7 @@ import { ChatMessageViewHydrated, LivestreamViewHydrated, PlaceStreamChatDefs, - PlaceStreamChatHide, + PlaceStreamChatGate, PlaceStreamChatMessage, PlaceStreamDefs, PlaceStreamLivestream, @@ -57,8 +57,8 @@ export const handleWebSocketMessages = ( ...state, profile: message, }; - } else if (PlaceStreamChatHide.isRecord(message)) { - const hideRecord = message as PlaceStreamChatHide.Record; + } else if (PlaceStreamChatGate.isRecord(message)) { + const hideRecord = message as PlaceStreamChatGate.Record; const hiddenMessageUri = hideRecord.hiddenMessage; const newPendingHides = [...state.pendingHides]; if (!newPendingHides.includes(hiddenMessageUri)) { diff --git a/js/components/src/streamplace-store/block.tsx b/js/components/src/streamplace-store/block.tsx index a419bbba..abc25786 100644 --- a/js/components/src/streamplace-store/block.tsx +++ b/js/components/src/streamplace-store/block.tsx @@ -41,13 +41,13 @@ export function useCreateHideChatRecord() { } const record = { - $type: "place.stream.chat.hide", + $type: "place.stream.chat.gate", hiddenMessage: chatMessageUri, }; return await agent.com.atproto.repo.createRecord({ repo: agent.did, - collection: "place.stream.chat.hide", + collection: "place.stream.chat.gate", record, }); }; diff --git a/js/docs/src/content/docs/lex-reference/chat/place-stream-chat-hide.md b/js/docs/src/content/docs/lex-reference/chat/place-stream-chat-gate.md similarity index 77% rename from js/docs/src/content/docs/lex-reference/chat/place-stream-chat-hide.md rename to js/docs/src/content/docs/lex-reference/chat/place-stream-chat-gate.md index f1aedf21..212085a2 100644 --- a/js/docs/src/content/docs/lex-reference/chat/place-stream-chat-hide.md +++ b/js/docs/src/content/docs/lex-reference/chat/place-stream-chat-gate.md @@ -1,6 +1,6 @@ --- -title: place.stream.chat.hide -description: Reference for the place.stream.chat.hide lexicon +title: place.stream.chat.gate +description: Reference for the place.stream.chat.gate lexicon --- **Lexicon Version:** 1 @@ -13,7 +13,7 @@ description: Reference for the place.stream.chat.hide lexicon **Type:** `record` -Record defining a single hidden chat message. +Record defining a single gated chat message. **Record Key:** `tid` @@ -30,12 +30,12 @@ Record defining a single hidden chat message. ```json { "lexicon": 1, - "id": "place.stream.chat.hide", + "id": "place.stream.chat.gate", "defs": { "main": { "type": "record", "key": "tid", - "description": "Record defining a single hidden chat message.", + "description": "Record defining a single gated chat message.", "record": { "type": "object", "required": ["hiddenMessage"], diff --git a/lexicons/place/stream/chat/hide.json b/lexicons/place/stream/chat/gate.json similarity index 78% rename from lexicons/place/stream/chat/hide.json rename to lexicons/place/stream/chat/gate.json index 0a0a7a68..99597499 100644 --- a/lexicons/place/stream/chat/hide.json +++ b/lexicons/place/stream/chat/gate.json @@ -1,11 +1,11 @@ { "lexicon": 1, - "id": "place.stream.chat.hide", + "id": "place.stream.chat.gate", "defs": { "main": { "type": "record", "key": "tid", - "description": "Record defining a single hidden chat message.", + "description": "Record defining a single gated chat message.", "record": { "type": "object", "required": ["hiddenMessage"], diff --git a/pkg/atproto/firehose.go b/pkg/atproto/firehose.go index e7e056f9..3bc2c929 100644 --- a/pkg/atproto/firehose.go +++ b/pkg/atproto/firehose.go @@ -151,7 +151,7 @@ var CollectionFilter = []string{ constants.APP_BSKY_FEED_POST, constants.APP_BSKY_GRAPH_BLOCK, constants.PLACE_STREAM_SERVER_SETTINGS, - constants.PLACE_STREAM_CHAT_HIDE, + constants.PLACE_STREAM_CHAT_GATE, } func (atsync *ATProtoSynchronizer) handleCommitEventOps(ctx context.Context, evt *comatproto.SyncSubscribeRepos_Commit) { diff --git a/pkg/atproto/sync.go b/pkg/atproto/sync.go index 5eca3172..70af3578 100644 --- a/pkg/atproto/sync.go +++ b/pkg/atproto/sync.go @@ -148,7 +148,7 @@ func (atsync *ATProtoSynchronizer) handleCreateUpdate(ctx context.Context, userD } } - case *streamplace.ChatHide: + case *streamplace.ChatGate: repo, err := atsync.SyncBlueskyRepoCached(ctx, userDID, atsync.Model) if err != nil { return fmt.Errorf("failed to sync bluesky repo: %w", err) @@ -157,8 +157,8 @@ func (atsync *ATProtoSynchronizer) handleCreateUpdate(ctx context.Context, userD // someone we don't know about return nil } - log.Debug(ctx, "creating hide", "userDID", userDID, "hiddenMessage", rec.HiddenMessage) - hide := &model.Hide{ + log.Debug(ctx, "creating gate", "userDID", userDID, "hiddenMessage", rec.HiddenMessage) + gate := &model.Gate{ RKey: rkey.String(), RepoDID: userDID, HiddenMessage: rec.HiddenMessage, @@ -166,19 +166,19 @@ func (atsync *ATProtoSynchronizer) handleCreateUpdate(ctx context.Context, userD CreatedAt: now, Repo: repo, } - err = atsync.Model.CreateHide(ctx, hide) + err = atsync.Model.CreateGate(ctx, gate) if err != nil { - return fmt.Errorf("failed to create hide: %w", err) + return fmt.Errorf("failed to create gate: %w", err) } - hide, err = atsync.Model.GetHide(ctx, rkey.String()) + gate, err = atsync.Model.GetGate(ctx, rkey.String()) if err != nil { - return fmt.Errorf("failed to get hide after we just saved it?!: %w", err) + return fmt.Errorf("failed to get gate after we just saved it?!: %w", err) } - streamplaceHide, err := hide.ToStreamplaceHide() + streamplaceGate, err := gate.ToStreamplaceGate() if err != nil { - return fmt.Errorf("failed to convert hide to streamplace hide: %w", err) + return fmt.Errorf("failed to convert gate to streamplace gate: %w", err) } - go atsync.Bus.Publish(userDID, streamplaceHide) + go atsync.Bus.Publish(userDID, streamplaceGate) case *streamplace.ChatProfile: repo, err := atsync.SyncBlueskyRepoCached(ctx, userDID, atsync.Model) diff --git a/pkg/constants/constants.go b/pkg/constants/constants.go index 1509806c..04d87004 100644 --- a/pkg/constants/constants.go +++ b/pkg/constants/constants.go @@ -9,7 +9,7 @@ var STREAMPLACE_SIGNING_KEY = "signingKey" //nolint:all var APP_BSKY_GRAPH_FOLLOW = "app.bsky.graph.follow" //nolint:all var APP_BSKY_FEED_POST = "app.bsky.feed.post" //nolint:all var APP_BSKY_GRAPH_BLOCK = "app.bsky.graph.block" //nolint:all -var PLACE_STREAM_CHAT_HIDE = "place.stream.chat.hide" //nolint:all +var PLACE_STREAM_CHAT_GATE = "place.stream.chat.gate" //nolint:all const DID_KEY_PREFIX = "did:key" //nolint:all const ADDRESS_KEY_PREFIX = "0x" //nolint:all diff --git a/pkg/gen/gen.go b/pkg/gen/gen.go index e6599629..9ba9402d 100644 --- a/pkg/gen/gen.go +++ b/pkg/gen/gen.go @@ -24,7 +24,7 @@ func main() { streamplace.ChatProfile_Color{}, streamplace.ChatMessage_ReplyRef{}, streamplace.ServerSettings{}, - streamplace.ChatHide{}, + streamplace.ChatGate{}, ); err != nil { panic(err) } diff --git a/pkg/model/chat_message.go b/pkg/model/chat_message.go index 5d38a2f1..9474b08c 100644 --- a/pkg/model/chat_message.go +++ b/pkg/model/chat_message.go @@ -115,9 +115,9 @@ func (m *DBModel) MostRecentChatMessages(repoDID string) ([]*streamplace.ChatDef // Exclude messages from users blocked by the streamer Joins("LEFT JOIN blocks ON blocks.repo_did = chat_messages.streamer_repo_did AND blocks.subject_did = chat_messages.repo_did"). Where("blocks.rkey IS NULL"). // Only include messages where no block exists - // Exclude hidden messages - Joins("LEFT JOIN hides ON hides.repo_did = chat_messages.streamer_repo_did AND hides.hidden_message = chat_messages.uri"). - Where("hides.hidden_message IS NULL"). // Only include messages where no hide exists + // Exclude gated messages + Joins("LEFT JOIN gates ON gates.repo_did = chat_messages.streamer_repo_did AND gates.hidden_message = chat_messages.uri"). + Where("gates.hidden_message IS NULL"). // Only include messages where no gate exists Limit(100). Order("chat_messages.created_at DESC"). Find(&dbmessages).Error diff --git a/pkg/model/gate.go b/pkg/model/gate.go new file mode 100644 index 00000000..261e9768 --- /dev/null +++ b/pkg/model/gate.go @@ -0,0 +1,55 @@ +package model + +import ( + "context" + "errors" + "time" + + "gorm.io/gorm" + "stream.place/streamplace/pkg/streamplace" +) + +type Gate struct { + RKey string `gorm:"primaryKey;column:rkey"` + CID string `gorm:"column:cid"` + RepoDID string `json:"repoDID" gorm:"column:repo_did"` + Repo *Repo `json:"repo,omitempty" gorm:"foreignKey:DID;references:RepoDID"` + HiddenMessage string `gorm:"column:hidden_message" json:"hiddenMessage"` + CreatedAt time.Time `gorm:"column:created_at"` +} + +func (g *Gate) ToStreamplaceGate() (*streamplace.ChatGate, error) { + return &streamplace.ChatGate{ + LexiconTypeID: "place.stream.chat.gate", + HiddenMessage: g.HiddenMessage, + }, nil +} + +func (m *DBModel) CreateGate(ctx context.Context, gate *Gate) error { + return m.DB.Create(gate).Error +} + +func (m *DBModel) GetGate(ctx context.Context, rkey string) (*Gate, error) { + var gate Gate + err := m.DB.Preload("Repo").Where("rkey = ?", rkey).First(&gate).Error + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, nil + } + if err != nil { + return nil, err + } + return &gate, nil +} + +func (m *DBModel) DeleteGate(ctx context.Context, rkey string) error { + return m.DB.Where("rkey = ?", rkey).Delete(&Gate{}).Error +} + +func (m *DBModel) GetUserGates(ctx context.Context, userDID string) ([]*Gate, error) { + var gates []*Gate + err := m.DB.Where("repo_did = ?", userDID).Find(&gates).Error + if err != nil { + return nil, err + } + return gates, nil +} diff --git a/pkg/model/hide.go b/pkg/model/hide.go deleted file mode 100644 index 80d542a3..00000000 --- a/pkg/model/hide.go +++ /dev/null @@ -1,55 +0,0 @@ -package model - -import ( - "context" - "errors" - "time" - - "gorm.io/gorm" - "stream.place/streamplace/pkg/streamplace" -) - -type Hide struct { - RKey string `gorm:"primaryKey;column:rkey"` - CID string `gorm:"column:cid"` - RepoDID string `json:"repoDID" gorm:"column:repo_did"` - Repo *Repo `json:"repo,omitempty" gorm:"foreignKey:DID;references:RepoDID"` - HiddenMessage string `gorm:"column:hidden_message" json:"hiddenMessage"` - CreatedAt time.Time `gorm:"column:created_at"` -} - -func (h *Hide) ToStreamplaceHide() (*streamplace.ChatHide, error) { - return &streamplace.ChatHide{ - LexiconTypeID: "place.stream.chat.hide", - HiddenMessage: h.HiddenMessage, - }, nil -} - -func (m *DBModel) CreateHide(ctx context.Context, hide *Hide) error { - return m.DB.Create(hide).Error -} - -func (m *DBModel) GetHide(ctx context.Context, rkey string) (*Hide, error) { - var hide Hide - err := m.DB.Preload("Repo").Where("rkey = ?", rkey).First(&hide).Error - if errors.Is(err, gorm.ErrRecordNotFound) { - return nil, nil - } - if err != nil { - return nil, err - } - return &hide, nil -} - -func (m *DBModel) DeleteHide(ctx context.Context, rkey string) error { - return m.DB.Where("rkey = ?", rkey).Delete(&Hide{}).Error -} - -func (m *DBModel) GetUserHides(ctx context.Context, userDID string) ([]*Hide, error) { - var hides []*Hide - err := m.DB.Where("repo_did = ?", userDID).Find(&hides).Error - if err != nil { - return nil, err - } - return hides, nil -} diff --git a/pkg/model/model.go b/pkg/model/model.go index 6f256b7a..e0a352ae 100644 --- a/pkg/model/model.go +++ b/pkg/model/model.go @@ -84,10 +84,10 @@ type Model interface { MostRecentChatMessages(repoDID string) ([]*streamplace.ChatDefs_MessageView, error) GetChatMessage(cid string) (*ChatMessage, error) - CreateHide(ctx context.Context, hide *Hide) error - DeleteHide(ctx context.Context, rkey string) error - GetHide(ctx context.Context, rkey string) (*Hide, error) - GetUserHides(ctx context.Context, userDID string) ([]*Hide, error) + CreateGate(ctx context.Context, gate *Gate) error + DeleteGate(ctx context.Context, rkey string) error + GetGate(ctx context.Context, rkey string) (*Gate, error) + GetUserGates(ctx context.Context, userDID string) ([]*Gate, error) CreateChatProfile(ctx context.Context, profile *ChatProfile) error GetChatProfile(ctx context.Context, repoDID string) (*ChatProfile, error) @@ -159,7 +159,7 @@ func MakeDB(dbURL string) (Model, error) { Block{}, ChatMessage{}, ChatProfile{}, - Hide{}, + Gate{}, oatproxy.OAuthSession{}, ServerSettings{}, } { diff --git a/pkg/streamplace/cbor_gen.go b/pkg/streamplace/cbor_gen.go index 7484ce3a..e0b19e48 100644 --- a/pkg/streamplace/cbor_gen.go +++ b/pkg/streamplace/cbor_gen.go @@ -2769,7 +2769,7 @@ func (t *ServerSettings) UnmarshalCBOR(r io.Reader) (err error) { return nil } -func (t *ChatHide) MarshalCBOR(w io.Writer) error { +func (t *ChatGate) MarshalCBOR(w io.Writer) error { if t == nil { _, err := w.Write(cbg.CborNull) return err @@ -2793,10 +2793,10 @@ func (t *ChatHide) MarshalCBOR(w io.Writer) error { return err } - if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("place.stream.chat.hide"))); err != nil { + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("place.stream.chat.gate"))); err != nil { return err } - if _, err := cw.WriteString(string("place.stream.chat.hide")); err != nil { + if _, err := cw.WriteString(string("place.stream.chat.gate")); err != nil { return err } @@ -2825,8 +2825,8 @@ func (t *ChatHide) MarshalCBOR(w io.Writer) error { return nil } -func (t *ChatHide) UnmarshalCBOR(r io.Reader) (err error) { - *t = ChatHide{} +func (t *ChatGate) UnmarshalCBOR(r io.Reader) (err error) { + *t = ChatGate{} cr := cbg.NewCborReader(r) @@ -2845,7 +2845,7 @@ func (t *ChatHide) UnmarshalCBOR(r io.Reader) (err error) { } if extra > cbg.MaxLength { - return fmt.Errorf("ChatHide: map struct too large (%d)", extra) + return fmt.Errorf("ChatGate: map struct too large (%d)", extra) } n := extra diff --git a/pkg/streamplace/chathide.go b/pkg/streamplace/chatgate.go similarity index 53% rename from pkg/streamplace/chathide.go rename to pkg/streamplace/chatgate.go index 92e56bd7..6fa04aec 100644 --- a/pkg/streamplace/chathide.go +++ b/pkg/streamplace/chatgate.go @@ -2,18 +2,18 @@ package streamplace -// schema: place.stream.chat.hide +// schema: place.stream.chat.gate import ( "github.com/bluesky-social/indigo/lex/util" ) func init() { - util.RegisterType("place.stream.chat.hide", &ChatHide{}) + util.RegisterType("place.stream.chat.gate", &ChatGate{}) } // -// RECORDTYPE: ChatHide -type ChatHide struct { - LexiconTypeID string `json:"$type,const=place.stream.chat.hide" cborgen:"$type,const=place.stream.chat.hide"` +// RECORDTYPE: ChatGate +type ChatGate struct { + LexiconTypeID string `json:"$type,const=place.stream.chat.gate" cborgen:"$type,const=place.stream.chat.gate"` // hiddenMessage: URI of the hidden chat message. HiddenMessage string `json:"hiddenMessage" cborgen:"hiddenMessage"` }