Show unfollow if already following

master
Bob Mottram 2019-07-29 20:46:30 +01:00
parent baa531ecf6
commit 4bdd930454
2 changed files with 40 additions and 8 deletions

View File

@ -24,6 +24,29 @@ from webfinger import webfingerHandle
from auth import createBasicAuthHeader from auth import createBasicAuthHeader
from session import postJson from session import postJson
def isFollowingActor(baseDir: str,nickname: str,domain: str,actor: str) -> bool:
"""Is the given actor a follower of the given nickname?
"""
if ':' in domain:
domain=domain.split(':')[0]
handle=nickname+'@'+domain
if not os.path.isdir(baseDir+'/accounts/'+handle):
return False
followersFile=baseDir+'/accounts/'+handle+'/followers.txt'
if not os.path.isfile(followersFile):
return False
if actor in open(followersFile).read():
return True
followerNickname=getNicknameFromActor(actor)
followerDomain,followerPort=getDomainFromActor(actor)
followerHandle=followerNickname+'@'+followerDomain
if followerPort:
if followerPort!=80 and followerPort!=443:
followerHandle+=':'+str(followerPort)
if followerHandle in open(followersFile).read():
return True
return False
def getFollowersOfPerson(baseDir: str, \ def getFollowersOfPerson(baseDir: str, \
nickname: str,domain: str, \ nickname: str,domain: str, \
followFile='following.txt') -> []: followFile='following.txt') -> []:
@ -33,7 +56,7 @@ def getFollowersOfPerson(baseDir: str, \
followers=[] followers=[]
if ':' in domain: if ':' in domain:
domain=domain.split(':')[0] domain=domain.split(':')[0]
handle=nickname.lower()+'@'+domain.lower() handle=nickname+'@'+domain
if not os.path.isdir(baseDir+'/accounts/'+handle): if not os.path.isdir(baseDir+'/accounts/'+handle):
return followers return followers
for subdir, dirs, files in os.walk(baseDir+'/accounts'): for subdir, dirs, files in os.walk(baseDir+'/accounts'):

View File

@ -15,6 +15,7 @@ from person import personBoxJson
from utils import getNicknameFromActor from utils import getNicknameFromActor
from utils import getDomainFromActor from utils import getDomainFromActor
from posts import getPersonBox from posts import getPersonBox
from follow import isFollowingActor
def htmlGetLoginCredentials(loginParams: str,lastLoginTime: int) -> (str,str): def htmlGetLoginCredentials(loginParams: str,lastLoginTime: int) -> (str,str):
"""Receives login credentials via HTTPServer POST """Receives login credentials via HTTPServer POST
@ -196,7 +197,7 @@ def htmlProfilePosts(baseDir: str,httpPrefix: str, \
for item in outboxFeed['orderedItems']: for item in outboxFeed['orderedItems']:
if item['type']=='Create': if item['type']=='Create':
profileStr+= \ profileStr+= \
individualPostAsHtml(session,wfRequest,personCache, \ individualPostAsHtml(baseDir,session,wfRequest,personCache, \
nickname,domain,port,item) nickname,domain,port,item)
return profileStr return profileStr
@ -402,7 +403,8 @@ def individualFollowAsHtml(session,wfRequest: {}, \
'<p>'+titleStr+'</p></a>'+ \ '<p>'+titleStr+'</p></a>'+ \
'</div>\n' '</div>\n'
def individualPostAsHtml(session,wfRequest: {},personCache: {}, \ def individualPostAsHtml(baseDir: str, \
session,wfRequest: {},personCache: {}, \
nickname: str,domain: str,port: int, \ nickname: str,domain: str,port: int, \
postJsonObject: {}) -> str: postJsonObject: {}) -> str:
avatarPosition='' avatarPosition=''
@ -463,13 +465,20 @@ def individualPostAsHtml(session,wfRequest: {},personCache: {}, \
avatarDropdown= \ avatarDropdown= \
' <a href="'+postJsonObject['actor']+'">' \ ' <a href="'+postJsonObject['actor']+'">' \
' <img src="'+avatarUrl+'" title="Show profile" alt="Avatar"'+avatarPosition+'/></a>' ' <img src="'+avatarUrl+'" title="Show profile" alt="Avatar"'+avatarPosition+'/></a>'
if fullDomain+'/users/'+nickname not in postJsonObject['actor']: if fullDomain+'/users/'+nickname not in postJsonObject['actor']:
# if not following then show "Follow" in the dropdown
followUnfollowStr='<a href="/users/'+nickname+'?follow='+postJsonObject['actor']+';'+avatarUrl+'">Follow</a>'
# if following then show "Unfollow" in the dropdown
if isFollowingActor(baseDir,nickname,domain,postJsonObject['actor']):
followUnfollowStr='<a href="/users/'+nickname+'?unfollow='+postJsonObject['actor']+';'+avatarUrl+'">Unfollow</a>'
avatarDropdown= \ avatarDropdown= \
' <div class="dropdown-timeline">' \ ' <div class="dropdown-timeline">' \
' <img src="'+avatarUrl+'" alt="Avatar"'+avatarPosition+'/>' \ ' <img src="'+avatarUrl+'" alt="Avatar"'+avatarPosition+'/>' \
' <div class="dropdown-timeline-content">' \ ' <div class="dropdown-timeline-content">' \
' <a href="'+postJsonObject['actor']+'">Visit</a>'+ \ ' <a href="'+postJsonObject['actor']+'">Visit</a>'+ \
' <a href="/users/'+nickname+'?follow='+postJsonObject['actor']+';'+avatarUrl+'">Follow</a>' \ followUnfollowStr+ \
' <a href="/users/'+nickname+'?block='+postJsonObject['actor']+';'+avatarUrl+'">Block</a>' \ ' <a href="/users/'+nickname+'?block='+postJsonObject['actor']+';'+avatarUrl+'">Block</a>' \
' <a href="/users/'+nickname+'?report='+postJsonObject['actor']+';'+avatarUrl+'">Report</a>' \ ' <a href="/users/'+nickname+'?report='+postJsonObject['actor']+';'+avatarUrl+'">Report</a>' \
' </div>' \ ' </div>' \
@ -520,7 +529,7 @@ def htmlTimeline(session,baseDir: str,wfRequest: {},personCache: {}, \
'</div>' '</div>'
for item in timelineJson['orderedItems']: for item in timelineJson['orderedItems']:
if item['type']=='Create': if item['type']=='Create':
tlStr+=individualPostAsHtml(session,wfRequest,personCache, \ tlStr+=individualPostAsHtml(baseDir,session,wfRequest,personCache, \
nickname,domain,port,item) nickname,domain,port,item)
tlStr+=htmlFooter() tlStr+=htmlFooter()
return tlStr return tlStr
@ -539,12 +548,12 @@ def htmlOutbox(session,baseDir: str,wfRequest: {},personCache: {}, \
return htmlTimeline(session,baseDir,wfRequest,personCache, \ return htmlTimeline(session,baseDir,wfRequest,personCache, \
nickname,domain,port,outboxJson,'outbox') nickname,domain,port,outboxJson,'outbox')
def htmlIndividualPost(session,wfRequest: {},personCache: {}, \ def htmlIndividualPost(baseDir: str,session,wfRequest: {},personCache: {}, \
nickname: str,domain: str,port: int,postJsonObject: {}) -> str: nickname: str,domain: str,port: int,postJsonObject: {}) -> str:
"""Show an individual post as html """Show an individual post as html
""" """
return htmlHeader()+ \ return htmlHeader()+ \
individualPostAsHtml(session,wfRequest,personCache, \ individualPostAsHtml(baseDir,session,wfRequest,personCache, \
nickname,domain,port,postJsonObject)+ \ nickname,domain,port,postJsonObject)+ \
htmlFooter() htmlFooter()