Function for getting a list of followers

master
Bob Mottram 2019-07-05 13:35:29 +01:00
parent 359e4794c9
commit a0499dc95b
3 changed files with 69 additions and 2 deletions

View File

@ -35,6 +35,7 @@ from follow import followPerson
from follow import followerOfPerson
from follow import unfollowPerson
from follow import unfollowerOfPerson
from follow import getFollowersOfPerson
from tests import testPostMessageBetweenServers
from tests import runAllTests
from config import setConfigParam
@ -273,5 +274,5 @@ if not os.path.isdir(baseDir+'/accounts/'+nickname+'@'+domain):
if not os.path.isdir(baseDir+'/accounts/sharedinbox@'+domain):
print('Creating shared inbox')
createSharedInbox(baseDir,'sharedinbox',domain,port,httpPrefix)
runDaemon(baseDir,domain,port,httpPrefix,federationList,useTor,debug)

View File

@ -13,6 +13,29 @@ import sys
from person import validNickname
from utils import domainPermitted
def getFollowersOfPerson(baseDir: str,nickname: str,domain: str,followFile='following.txt') -> []:
"""Returns a list containing the followers of the given person
Used by the shared inbox to know who to send incoming mail to
"""
followers=[]
handle=nickname.lower()+'@'+domain.lower()
if not os.path.isdir(baseDir+'/accounts/'+handle):
return followers
for subdir, dirs, files in os.walk(baseDir+'/accounts'):
for account in dirs:
filename = os.path.join(subdir, account)+'/'+followFile
if account == handle or account.startswith('sharedinbox@'):
continue
if not os.path.isfile(filename):
continue
with open(filename, 'r') as followingfile:
for followingHandle in followingfile:
if followingHandle.replace('\n','')==handle:
if account not in followers:
followers.append(account)
break
return followers
def followPerson(baseDir: str,nickname: str, domain: str, \
followNickname: str, followDomain: str, \
federationList: [], followFile='following.txt') -> bool:

View File

@ -29,6 +29,7 @@ from follow import followPerson
from follow import followerOfPerson
from follow import unfollowPerson
from follow import unfollowerOfPerson
from follow import getFollowersOfPerson
from person import createPerson
from person import setPreferredNickname
from person import setBio
@ -230,6 +231,47 @@ def testPostMessageBetweenServers():
# queue item removed
assert len([name for name in os.listdir(queuePath) if os.path.isfile(os.path.join(queuePath, name))])==0
os.chdir(baseDir)
shutil.rmtree(aliceDir)
shutil.rmtree(bobDir)
def testFollowersOfPerson():
print('testFollowersOfPerson')
currDir=os.getcwd()
nickname='mxpop'
domain='diva.domain'
password='birb'
port=80
httpPrefix='https'
federationList=[]
baseDir=currDir+'/.tests_followersofperson'
if os.path.isdir(baseDir):
shutil.rmtree(baseDir)
os.mkdir(baseDir)
os.chdir(baseDir)
createPerson(baseDir,nickname,domain,port,httpPrefix,True,password)
createPerson(baseDir,'maxboardroom',domain,port,httpPrefix,True,password)
createPerson(baseDir,'ultrapancake',domain,port,httpPrefix,True,password)
createPerson(baseDir,'drokk',domain,port,httpPrefix,True,password)
createPerson(baseDir,'sausagedog',domain,port,httpPrefix,True,password)
clearFollows(baseDir,nickname,domain)
followPerson(baseDir,nickname,domain,'maxboardroom',domain,federationList)
followPerson(baseDir,'drokk',domain,'ultrapancake',domain,federationList)
# deliberate duplication
followPerson(baseDir,'drokk',domain,'ultrapancake',domain,federationList)
followPerson(baseDir,'sausagedog',domain,'ultrapancake',domain,federationList)
followPerson(baseDir,nickname,domain,'ultrapancake',domain,federationList)
followPerson(baseDir,nickname,domain,'someother','randodomain.net',federationList)
followList=getFollowersOfPerson(baseDir,'ultrapancake',domain)
assert len(followList)==3
assert 'mxpop@'+domain in followList
assert 'drokk@'+domain in followList
assert 'sausagedog@'+domain in followList
os.chdir(currDir)
shutil.rmtree(baseDir)
def testFollows():
print('testFollows')
currDir=os.getcwd()
@ -359,5 +401,6 @@ def runAllTests():
testThreads()
testCreatePerson()
testAuthentication()
testFollows()
testFollowersOfPerson()
testFollows()
print('Tests succeeded\n')