mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-31 14:52:30 -05:00 
			
		
		
		
	
		
			
	
	
		
			82 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			82 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
|  | package visibility | ||
|  | 
 | ||
|  | import ( | ||
|  | 	"fmt" | ||
|  | 
 | ||
|  | 	"github.com/superseriousbusiness/gotosocial/internal/gtsmodel" | ||
|  | ) | ||
|  | 
 | ||
|  | func (f *filter) pullRelevantAccountsFromStatus(targetStatus *gtsmodel.Status) (*relevantAccounts, error) { | ||
|  | 	accounts := &relevantAccounts{ | ||
|  | 		MentionedAccounts: []*gtsmodel.Account{}, | ||
|  | 	} | ||
|  | 
 | ||
|  | 	// get the author account | ||
|  | 	if targetStatus.GTSAuthorAccount == nil { | ||
|  | 		statusAuthor := >smodel.Account{} | ||
|  | 		if err := f.db.GetByID(targetStatus.AccountID, statusAuthor); err != nil { | ||
|  | 			return accounts, fmt.Errorf("PullRelevantAccountsFromStatus: error getting statusAuthor with id %s: %s", targetStatus.AccountID, err) | ||
|  | 		} | ||
|  | 		targetStatus.GTSAuthorAccount = statusAuthor | ||
|  | 	} | ||
|  | 	accounts.StatusAuthor = targetStatus.GTSAuthorAccount | ||
|  | 
 | ||
|  | 	// get the replied to account from the status and add it to the pile | ||
|  | 	if targetStatus.InReplyToAccountID != "" { | ||
|  | 		repliedToAccount := >smodel.Account{} | ||
|  | 		if err := f.db.GetByID(targetStatus.InReplyToAccountID, repliedToAccount); err != nil { | ||
|  | 			return accounts, fmt.Errorf("PullRelevantAccountsFromStatus: error getting repliedToAcount with id %s: %s", targetStatus.InReplyToAccountID, err) | ||
|  | 		} | ||
|  | 		accounts.ReplyToAccount = repliedToAccount | ||
|  | 	} | ||
|  | 
 | ||
|  | 	// get the boosted account from the status and add it to the pile | ||
|  | 	if targetStatus.BoostOfID != "" { | ||
|  | 		// retrieve the boosted status first | ||
|  | 		boostedStatus := >smodel.Status{} | ||
|  | 		if err := f.db.GetByID(targetStatus.BoostOfID, boostedStatus); err != nil { | ||
|  | 			return accounts, fmt.Errorf("PullRelevantAccountsFromStatus: error getting boostedStatus with id %s: %s", targetStatus.BoostOfID, err) | ||
|  | 		} | ||
|  | 		boostedAccount := >smodel.Account{} | ||
|  | 		if err := f.db.GetByID(boostedStatus.AccountID, boostedAccount); err != nil { | ||
|  | 			return accounts, fmt.Errorf("PullRelevantAccountsFromStatus: error getting boostedAccount with id %s: %s", boostedStatus.AccountID, err) | ||
|  | 		} | ||
|  | 		accounts.BoostedAccount = boostedAccount | ||
|  | 
 | ||
|  | 		// the boosted status might be a reply to another account so we should get that too | ||
|  | 		if boostedStatus.InReplyToAccountID != "" { | ||
|  | 			boostedStatusRepliedToAccount := >smodel.Account{} | ||
|  | 			if err := f.db.GetByID(boostedStatus.InReplyToAccountID, boostedStatusRepliedToAccount); err != nil { | ||
|  | 				return accounts, fmt.Errorf("PullRelevantAccountsFromStatus: error getting boostedStatusRepliedToAccount with id %s: %s", boostedStatus.InReplyToAccountID, err) | ||
|  | 			} | ||
|  | 			accounts.BoostedReplyToAccount = boostedStatusRepliedToAccount | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	// now get all accounts with IDs that are mentioned in the status | ||
|  | 	for _, mentionID := range targetStatus.Mentions { | ||
|  | 
 | ||
|  | 		mention := >smodel.Mention{} | ||
|  | 		if err := f.db.GetByID(mentionID, mention); err != nil { | ||
|  | 			return accounts, fmt.Errorf("PullRelevantAccountsFromStatus: error getting mention with id %s: %s", mentionID, err) | ||
|  | 		} | ||
|  | 
 | ||
|  | 		mentionedAccount := >smodel.Account{} | ||
|  | 		if err := f.db.GetByID(mention.TargetAccountID, mentionedAccount); err != nil { | ||
|  | 			return accounts, fmt.Errorf("PullRelevantAccountsFromStatus: error getting mentioned account: %s", err) | ||
|  | 		} | ||
|  | 		accounts.MentionedAccounts = append(accounts.MentionedAccounts, mentionedAccount) | ||
|  | 	} | ||
|  | 
 | ||
|  | 	return accounts, nil | ||
|  | } | ||
|  | 
 | ||
|  | // relevantAccounts denotes accounts that are replied to, boosted by, or mentioned in a status. | ||
|  | type relevantAccounts struct { | ||
|  | 	StatusAuthor          *gtsmodel.Account | ||
|  | 	ReplyToAccount        *gtsmodel.Account | ||
|  | 	BoostedAccount        *gtsmodel.Account | ||
|  | 	BoostedReplyToAccount *gtsmodel.Account | ||
|  | 	MentionedAccounts     []*gtsmodel.Account | ||
|  | } |