mirror of
https://github.com/superseriousbusiness/gotosocial.git
synced 2025-10-28 13:42:26 -05:00
[bugfix] Update interaction policies of freshly dereffed statuses if different from last deref (#4474)
# Description > If this is a code change, please include a summary of what you've coded, and link to the issue(s) it closes/implements. > > If this is a documentation change, please briefly describe what you've changed and why. This pull request adds a check to see whether interaction policy on a refreshed status is different from the interaction policy set on that status before, and updates the status with the new policy if it's changed. Should fix a pesky issue where folks on v0.19.2 and above still can't interact with statuses they dereferenced before updating. ## Checklist Please put an x inside each checkbox to indicate that you've read and followed it: `[ ]` -> `[x]` If this is a documentation change, only the first checkbox must be filled (you can delete the others if you want). - [x] I/we have read the [GoToSocial contribution guidelines](https://codeberg.org/superseriousbusiness/gotosocial/src/branch/main/CONTRIBUTING.md). - [x] I/we have discussed the proposed changes already, either in an issue on the repository, or in the Matrix chat. - [x] I/we have not leveraged AI to create the proposed changes. - [x] I/we have performed a self-review of added code. - [x] I/we have written code that is legible and maintainable by others. - [x] I/we have commented the added code, particularly in hard-to-understand areas. - [ ] I/we have made any necessary changes to documentation. - [ ] I/we have added tests that cover new code. - [x] I/we have run tests and they pass locally with the changes. - [x] I/we have run `go fmt ./...` and `golangci-lint run`. Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4474 Reviewed-by: kim <gruf@noreply.codeberg.org> Co-authored-by: tobi <tobi.smethurst@protonmail.com> Co-committed-by: tobi <tobi.smethurst@protonmail.com>
This commit is contained in:
parent
57cb4fe748
commit
259fa1ffac
2 changed files with 87 additions and 0 deletions
|
|
@ -608,6 +608,9 @@ func (d *Dereferencer) enrichStatus(
|
||||||
return nil, nil, gtserror.Newf("error populating emojis for status %s: %w", uri, err)
|
return nil, nil, gtserror.Newf("error populating emojis for status %s: %w", uri, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check if interaction policy has changed between status and latestStatus.
|
||||||
|
interactionPolicyChanged := status.InteractionPolicy.DifferentFrom(latestStatus.InteractionPolicy)
|
||||||
|
|
||||||
if isNew {
|
if isNew {
|
||||||
// Simplest case, insert this new remote status into the database.
|
// Simplest case, insert this new remote status into the database.
|
||||||
if err := d.state.DB.PutStatus(ctx, latestStatus); err != nil {
|
if err := d.state.DB.PutStatus(ctx, latestStatus); err != nil {
|
||||||
|
|
@ -625,6 +628,7 @@ func (d *Dereferencer) enrichStatus(
|
||||||
tagsChanged,
|
tagsChanged,
|
||||||
mediaChanged,
|
mediaChanged,
|
||||||
emojiChanged,
|
emojiChanged,
|
||||||
|
interactionPolicyChanged,
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, gtserror.Newf("error handling edit for status %s: %w", uri, err)
|
return nil, nil, gtserror.Newf("error handling edit for status %s: %w", uri, err)
|
||||||
|
|
@ -1057,6 +1061,7 @@ func (d *Dereferencer) handleStatusEdit(
|
||||||
tagsChanged bool,
|
tagsChanged bool,
|
||||||
mediaChanged bool,
|
mediaChanged bool,
|
||||||
emojiChanged bool,
|
emojiChanged bool,
|
||||||
|
interactionPolicyChanged bool,
|
||||||
) (
|
) (
|
||||||
cols []string,
|
cols []string,
|
||||||
err error,
|
err error,
|
||||||
|
|
@ -1141,6 +1146,15 @@ func (d *Dereferencer) handleStatusEdit(
|
||||||
// been previously populated properly.
|
// been previously populated properly.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if interactionPolicyChanged {
|
||||||
|
// Interaction policy changed.
|
||||||
|
cols = append(cols, "interaction_policy")
|
||||||
|
|
||||||
|
// Int pol changed doesn't necessarily
|
||||||
|
// indicate an edit, it may just not have
|
||||||
|
// been previously populated properly.
|
||||||
|
}
|
||||||
|
|
||||||
if edited {
|
if edited {
|
||||||
// Get previous-most-recent modified time,
|
// Get previous-most-recent modified time,
|
||||||
// which will be this edit's creation time.
|
// which will be this edit's creation time.
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,8 @@
|
||||||
|
|
||||||
package gtsmodel
|
package gtsmodel
|
||||||
|
|
||||||
|
import "slices"
|
||||||
|
|
||||||
// A policy URI is GoToSocial's internal representation of
|
// A policy URI is GoToSocial's internal representation of
|
||||||
// one ActivityPub URI for an Actor or a Collection of Actors,
|
// one ActivityPub URI for an Actor or a Collection of Actors,
|
||||||
// specific to the domain of enforcing interaction policies.
|
// specific to the domain of enforcing interaction policies.
|
||||||
|
|
@ -232,6 +234,39 @@ type PolicyRules struct {
|
||||||
ManualApproval PolicyValues `json:"WithApproval,omitempty"`
|
ManualApproval PolicyValues `json:"WithApproval,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DifferentFrom returns true if pr1 and pr2
|
||||||
|
// are not equal in terms of nilness or content.
|
||||||
|
func (pr1 *PolicyRules) DifferentFrom(pr2 *PolicyRules) bool {
|
||||||
|
// If one PolicyRules is nil and
|
||||||
|
// the other isn't, they're different.
|
||||||
|
if pr1 == nil && pr2 != nil ||
|
||||||
|
pr1 != nil && pr2 == nil {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if AutomaticApproval
|
||||||
|
// differs between the two.
|
||||||
|
if slices.Compare(
|
||||||
|
pr1.AutomaticApproval,
|
||||||
|
pr2.AutomaticApproval,
|
||||||
|
) != 0 {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if ManualApproval
|
||||||
|
// differs between the two.
|
||||||
|
if slices.Compare(
|
||||||
|
pr1.ManualApproval,
|
||||||
|
pr2.ManualApproval,
|
||||||
|
) != 0 {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// They're the
|
||||||
|
// same picture.
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
// Returns the default interaction policy
|
// Returns the default interaction policy
|
||||||
// for the given visibility level.
|
// for the given visibility level.
|
||||||
func DefaultInteractionPolicyFor(v Visibility) *InteractionPolicy {
|
func DefaultInteractionPolicyFor(v Visibility) *InteractionPolicy {
|
||||||
|
|
@ -422,3 +457,41 @@ func DefaultInteractionPolicyDirect() *InteractionPolicy {
|
||||||
*c = *defaultPolicyDirect
|
*c = *defaultPolicyDirect
|
||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DifferentFrom returns true if p1 and p2 are different.
|
||||||
|
func (ip1 *InteractionPolicy) DifferentFrom(ip2 *InteractionPolicy) bool {
|
||||||
|
// If one policy is null and the
|
||||||
|
// other isn't, they're different.
|
||||||
|
if ip1 == nil && ip2 != nil ||
|
||||||
|
ip1 != nil && ip2 == nil {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// If they're both nil we don't
|
||||||
|
// need to check anything else.
|
||||||
|
if ip1 == nil && ip2 == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// If CanLike differs from one policy
|
||||||
|
// to the next, they're different.
|
||||||
|
if ip1.CanLike.DifferentFrom(ip2.CanLike) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// If CanReply differs from one policy
|
||||||
|
// to the next, they're different.
|
||||||
|
if ip1.CanReply.DifferentFrom(ip2.CanReply) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// If CanAnnounce differs from one policy
|
||||||
|
// to the next, they're different.
|
||||||
|
if ip1.CanAnnounce.DifferentFrom(ip2.CanAnnounce) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// Looks the
|
||||||
|
// same chief.
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue