common.go (2114B)
1 // GoToSocial 2 // Copyright (C) GoToSocial Authors admin@gotosocial.org 3 // SPDX-License-Identifier: AGPL-3.0-or-later 4 // 5 // This program is free software: you can redistribute it and/or modify 6 // it under the terms of the GNU Affero General Public License as published by 7 // the Free Software Foundation, either version 3 of the License, or 8 // (at your option) any later version. 9 // 10 // This program is distributed in the hope that it will be useful, 11 // but WITHOUT ANY WARRANTY; without even the implied warranty of 12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 // GNU Affero General Public License for more details. 14 // 15 // You should have received a copy of the GNU Affero General Public License 16 // along with this program. If not, see <http://www.gnu.org/licenses/>. 17 18 package timeline 19 20 import ( 21 "context" 22 23 "github.com/superseriousbusiness/gotosocial/internal/timeline" 24 ) 25 26 // SkipInsert returns a function that satisifes SkipInsertFunction. 27 func SkipInsert() timeline.SkipInsertFunction { 28 // Gap to allow between a status or boost of status, 29 // and reinsertion of a new boost of that status. 30 // This is useful to avoid a heavily boosted status 31 // showing up way too often in a user's timeline. 32 const boostReinsertionDepth = 50 33 34 return func( 35 ctx context.Context, 36 newItemID string, 37 newItemAccountID string, 38 newItemBoostOfID string, 39 newItemBoostOfAccountID string, 40 nextItemID string, 41 nextItemAccountID string, 42 nextItemBoostOfID string, 43 nextItemBoostOfAccountID string, 44 depth int, 45 ) (bool, error) { 46 if newItemID == nextItemID { 47 // Don't insert duplicates. 48 return true, nil 49 } 50 51 if newItemBoostOfID != "" { 52 if newItemBoostOfID == nextItemBoostOfID && 53 depth < boostReinsertionDepth { 54 // Don't insert boosts of items 55 // we've seen boosted recently. 56 return true, nil 57 } 58 59 if newItemBoostOfID == nextItemID && 60 depth < boostReinsertionDepth { 61 // Don't insert boosts of items when 62 // we've seen the original recently. 63 return true, nil 64 } 65 } 66 67 // Proceed with insertion 68 // (that's what she said!). 69 return false, nil 70 } 71 }