gtsocial-umbx

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

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 }