From de9e4b964c423cd206fee3a55945570374446973 Mon Sep 17 00:00:00 2001 From: KMY Date: Sun, 14 May 2023 14:12:35 +0900 Subject: [PATCH] Fix searchability api to compat with fedibird --- .../components/searchability_dropdown.jsx | 20 +++++++++---------- .../compose/containers/warning_container.jsx | 2 +- .../status/components/detailed_status.jsx | 12 +++++------ app/lib/activitypub/activity/create.rb | 8 ++++---- app/lib/activitypub/tag_manager.rb | 8 +++----- app/models/status.rb | 2 +- app/serializers/rest/instance_serializer.rb | 1 + .../rest/v1/instance_serializer.rb | 1 + app/services/post_status_service.rb | 11 +++++----- 9 files changed, 32 insertions(+), 33 deletions(-) diff --git a/app/javascript/mastodon/features/compose/components/searchability_dropdown.jsx b/app/javascript/mastodon/features/compose/components/searchability_dropdown.jsx index 241fb54dfa..aa9491f547 100644 --- a/app/javascript/mastodon/features/compose/components/searchability_dropdown.jsx +++ b/app/javascript/mastodon/features/compose/components/searchability_dropdown.jsx @@ -10,12 +10,12 @@ import { Icon } from 'mastodon/components/icon'; const messages = defineMessages({ public_short: { id: 'searchability.public.short', defaultMessage: 'Public' }, public_long: { id: 'searchability.public.long', defaultMessage: 'Anyone can find' }, - unlisted_short: { id: 'searchability.unlisted.short', defaultMessage: 'Followers' }, - unlisted_long: { id: 'searchability.unlisted.long', defaultMessage: 'Your followers can find' }, - private_short: { id: 'searchability.private.short', defaultMessage: 'Reactionners' }, - private_long: { id: 'searchability.private.long', defaultMessage: 'Reacter of this post can find' }, - direct_short: { id: 'searchability.direct.short', defaultMessage: 'Self only' }, - direct_long: { id: 'searchability.direct.long', defaultMessage: 'Nobody can find, but you can' }, + private_short: { id: 'searchability.unlisted.short', defaultMessage: 'Followers' }, + private_long: { id: 'searchability.unlisted.long', defaultMessage: 'Your followers can find' }, + direct_short: { id: 'searchability.private.short', defaultMessage: 'Reactionners' }, + direct_long: { id: 'searchability.private.long', defaultMessage: 'Reacter of this post can find' }, + limited_short: { id: 'searchability.direct.short', defaultMessage: 'Self only' }, + limited_long: { id: 'searchability.direct.long', defaultMessage: 'Nobody can find, but you can' }, change_searchability: { id: 'searchability.change', defaultMessage: 'Set status searchability' }, }); @@ -212,14 +212,14 @@ class SearchabilityDropdown extends React.PureComponent { this.props.onChange(value); }; - componentWillMount () { + UNSAFE_componentWillMount () { const { intl: { formatMessage } } = this.props; this.options = [ { icon: 'globe', value: 'public', text: formatMessage(messages.public_short), meta: formatMessage(messages.public_long) }, - { icon: 'unlock', value: 'unlisted', text: formatMessage(messages.unlisted_short), meta: formatMessage(messages.unlisted_long) }, - { icon: 'lock', value: 'private', text: formatMessage(messages.private_short), meta: formatMessage(messages.private_long) }, - { icon: 'at', value: 'direct', text: formatMessage(messages.direct_short), meta: formatMessage(messages.direct_long) }, + { icon: 'unlock', value: 'private', text: formatMessage(messages.private_short), meta: formatMessage(messages.private_long) }, + { icon: 'lock', value: 'direct', text: formatMessage(messages.direct_short), meta: formatMessage(messages.direct_long) }, + { icon: 'at', value: 'limited', text: formatMessage(messages.limited_short), meta: formatMessage(messages.limited_long) }, ]; } diff --git a/app/javascript/mastodon/features/compose/containers/warning_container.jsx b/app/javascript/mastodon/features/compose/containers/warning_container.jsx index 3f46237563..417e7258db 100644 --- a/app/javascript/mastodon/features/compose/containers/warning_container.jsx +++ b/app/javascript/mastodon/features/compose/containers/warning_container.jsx @@ -10,7 +10,7 @@ const mapStateToProps = state => ({ needsLockWarning: state.getIn(['compose', 'privacy']) === 'private' && !state.getIn(['accounts', me, 'locked']), hashtagWarning: ['public', 'public_unlisted'].indexOf(state.getIn(['compose', 'privacy'])) < 0 && HASHTAG_PATTERN_REGEX.test(state.getIn(['compose', 'text'])), directMessageWarning: state.getIn(['compose', 'privacy']) === 'direct', - searchabilityWarning: state.getIn(['compose', 'searchability']) === 'direct', + searchabilityWarning: state.getIn(['compose', 'searchability']) === 'limited', }); const WarningWrapper = ({ needsLockWarning, hashtagWarning, directMessageWarning, searchabilityWarning }) => { diff --git a/app/javascript/mastodon/features/status/components/detailed_status.jsx b/app/javascript/mastodon/features/status/components/detailed_status.jsx index cb9302c8d2..be5eab43b9 100644 --- a/app/javascript/mastodon/features/status/components/detailed_status.jsx +++ b/app/javascript/mastodon/features/status/components/detailed_status.jsx @@ -26,9 +26,9 @@ const messages = defineMessages({ private_short: { id: 'privacy.private.short', defaultMessage: 'Followers-only' }, direct_short: { id: 'privacy.direct.short', defaultMessage: 'Direct' }, searchability_public_short: { id: 'searchability.public.short', defaultMessage: 'Public' }, - searchability_unlisted_short: { id: 'searchability.unlisted.short', defaultMessage: 'Followers' }, - searchability_private_short: { id: 'searchability.private.short', defaultMessage: 'Reactionners' }, - searchability_direct_short: { id: 'searchability.direct.short', defaultMessage: 'Self only' }, + searchability_private_short: { id: 'searchability.unlisted.short', defaultMessage: 'Followers' }, + searchability_direct_short: { id: 'searchability.private.short', defaultMessage: 'Reactionners' }, + searchability_limited_short: { id: 'searchability.direct.short', defaultMessage: 'Self only' }, }); class DetailedStatus extends ImmutablePureComponent { @@ -223,9 +223,9 @@ class DetailedStatus extends ImmutablePureComponent { const searchabilityIconInfo = { 'public': { icon: 'globe', text: intl.formatMessage(messages.searchability_public_short) }, - 'unlisted': { icon: 'unlock', text: intl.formatMessage(messages.searchability_unlisted_short) }, - 'private': { icon: 'lock', text: intl.formatMessage(messages.searchability_private_short) }, - 'direct': { icon: 'at', text: intl.formatMessage(messages.searchability_direct_short) }, + 'private': { icon: 'unlock', text: intl.formatMessage(messages.searchability_private_short) }, + 'direct': { icon: 'lock', text: intl.formatMessage(messages.searchability_direct_short) }, + 'limited': { icon: 'at', text: intl.formatMessage(messages.searchability_limited_short) }, }; const searchabilityIcon = searchabilityIconInfo[status.get('searchability')]; diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb index a1dea2e333..2efa14237d 100644 --- a/app/lib/activitypub/activity/create.rb +++ b/app/lib/activitypub/activity/create.rb @@ -475,9 +475,9 @@ class ActivityPub::Activity::Create < ActivityPub::Activity elsif audience_searchable_by.any? { |uri| ActivityPub::TagManager.instance.public_collection?(uri) } :public elsif audience_searchable_by.include?(@account.followers_url) - :unlisted # Followers only in kmyblue (generics: private) + :private else - :private # Reaction only in kmyblue (generics: direct) + :direct end end @@ -507,9 +507,9 @@ class ActivityPub::Activity::Create < ActivityPub::Activity if searchability == visibility searchability elsif [:public, :unlisted].include?(searchability) && [:public, :unlisted].include?(visibility) # unlisted is Followers only in kmyblue (generics: private) - :unlisted + :private else - :private # Reaction only in kmyblue (generics: direct) + :direct end end diff --git a/app/lib/activitypub/tag_manager.rb b/app/lib/activitypub/tag_manager.rb index 048aee2f88..e2758458ec 100644 --- a/app/lib/activitypub/tag_manager.rb +++ b/app/lib/activitypub/tag_manager.rb @@ -211,11 +211,9 @@ class ActivityPub::TagManager case status.compute_searchability_activitypub when 'public' [COLLECTIONS[:public]] - when 'unlisted' # Followers only in kmyblue (generics: private) + when 'private' [account_followers_url(status.account)] - # when 'private' # Reaction only in kmyblue (generics: direct) - # [] - when 'limited' + when 'direct' status.conversation_id.present? ? [uri_for(status.conversation)] : [] else [] @@ -228,7 +226,7 @@ class ActivityPub::TagManager case account.searchability when 'public' [COLLECTIONS[:public]] - when 'unlisted', 'private' + when 'private', 'direct' [account_followers_url(account)] else [] diff --git a/app/models/status.rb b/app/models/status.rb index a45227094a..8cfa648ee1 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -53,7 +53,7 @@ class Status < ApplicationRecord update_index('statuses', :proper) enum visibility: { public: 0, unlisted: 1, private: 2, direct: 3, limited: 4, public_unlisted: 10 }, _suffix: :visibility - enum searchability: { public: 0, unlisted: 1, private: 2, direct: 3, limited: 4, public_unlisted: 10 }, _suffix: :searchability + enum searchability: { public: 0, private: 1, direct: 2, limited: 3, public_unlisted: 10 }, _suffix: :searchability belongs_to :application, class_name: 'Doorkeeper::Application', optional: true diff --git a/app/serializers/rest/instance_serializer.rb b/app/serializers/rest/instance_serializer.rb index ae008d09c9..ebf2d5be24 100644 --- a/app/serializers/rest/instance_serializer.rb +++ b/app/serializers/rest/instance_serializer.rb @@ -103,6 +103,7 @@ class REST::InstanceSerializer < ActiveModel::Serializer :enable_wide_emoji, :enable_wide_emoji_reaction, :kmyblue_searchability, + :searchability, :kmyblue_markdown, ] diff --git a/app/serializers/rest/v1/instance_serializer.rb b/app/serializers/rest/v1/instance_serializer.rb index 299b66117a..1e9b2fa6bc 100644 --- a/app/serializers/rest/v1/instance_serializer.rb +++ b/app/serializers/rest/v1/instance_serializer.rb @@ -113,6 +113,7 @@ class REST::V1::InstanceSerializer < ActiveModel::Serializer :enable_wide_emoji, :enable_wide_emoji_reaction, :kmyblue_searchability, + :searchability, :kmyblue_markdown, ] diff --git a/app/services/post_status_service.rb b/app/services/post_status_service.rb index 72577be73e..97c552c1ff 100644 --- a/app/services/post_status_service.rb +++ b/app/services/post_status_service.rb @@ -81,16 +81,15 @@ class PostStatusService < BaseService def searchability case @options[:searchability]&.to_sym when :public - case @visibility&.to_sym when :public, :public_unlisted then :public when :unlisted then :unlisted when :private then :private else :direct end - when :unlisted - case @visibility&.to_sym when :public, :public_unlisted, :unlisted then :unlisted when :private then :private else :direct end + case @visibility&.to_sym when :public, :public_unlisted then :public when :unlisted, :private then :private else :direct end when :private - # direct message also can be searched by receiver - :private + case @visibility&.to_sym when :public, :public_unlisted, :unlisted, :private then :private else :direct end + when :direct + :direct when nil @account.user&.setting_default_searchability || @account.searchability else - :direct + :limited end end