mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-11-03 21:32:24 -06: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
							 | 
						||
| 
								 | 
							
								}
							 |