Apply voting threshold to timeline

main
Bob Mottram 2020-10-08 20:47:23 +01:00
parent 72b5db2d9e
commit cc642557f4
5 changed files with 124 additions and 42 deletions

View File

@ -5990,7 +5990,9 @@ class PubServer(BaseHTTPRequestHandler):
path, path,
httpPrefix, httpPrefix,
maxPostsInFeed, 'inbox', maxPostsInFeed, 'inbox',
authorized) authorized,
0,
self.server.positiveVoting)
if inboxFeed: if inboxFeed:
if GETstartTime: if GETstartTime:
self._benchmarkGETtimings(GETstartTime, GETtimings, self._benchmarkGETtimings(GETstartTime, GETtimings,
@ -6018,7 +6020,9 @@ class PubServer(BaseHTTPRequestHandler):
path + '?page=1', path + '?page=1',
httpPrefix, httpPrefix,
maxPostsInFeed, 'inbox', maxPostsInFeed, 'inbox',
authorized) authorized,
0,
self.server.positiveVoting)
if GETstartTime: if GETstartTime:
self._benchmarkGETtimings(GETstartTime, self._benchmarkGETtimings(GETstartTime,
GETtimings, GETtimings,
@ -6106,7 +6110,8 @@ class PubServer(BaseHTTPRequestHandler):
path, path,
httpPrefix, httpPrefix,
maxPostsInFeed, 'dm', maxPostsInFeed, 'dm',
authorized) authorized,
0, self.server.positiveVoting)
if inboxDMFeed: if inboxDMFeed:
if self._requestHTTP(): if self._requestHTTP():
nickname = path.replace('/users/', '') nickname = path.replace('/users/', '')
@ -6130,7 +6135,9 @@ class PubServer(BaseHTTPRequestHandler):
path + '?page=1', path + '?page=1',
httpPrefix, httpPrefix,
maxPostsInFeed, 'dm', maxPostsInFeed, 'dm',
authorized) authorized,
0,
self.server.positiveVoting)
msg = \ msg = \
htmlInboxDMs(self.server.defaultTimeline, htmlInboxDMs(self.server.defaultTimeline,
self.server.recentPostsCache, self.server.recentPostsCache,
@ -6207,7 +6214,8 @@ class PubServer(BaseHTTPRequestHandler):
path, path,
httpPrefix, httpPrefix,
maxPostsInFeed, 'tlreplies', maxPostsInFeed, 'tlreplies',
True) True,
0, self.server.positiveVoting)
if not inboxRepliesFeed: if not inboxRepliesFeed:
inboxRepliesFeed = [] inboxRepliesFeed = []
if self._requestHTTP(): if self._requestHTTP():
@ -6232,7 +6240,8 @@ class PubServer(BaseHTTPRequestHandler):
path + '?page=1', path + '?page=1',
httpPrefix, httpPrefix,
maxPostsInFeed, 'tlreplies', maxPostsInFeed, 'tlreplies',
True) True,
0, self.server.positiveVoting)
msg = \ msg = \
htmlInboxReplies(self.server.defaultTimeline, htmlInboxReplies(self.server.defaultTimeline,
self.server.recentPostsCache, self.server.recentPostsCache,
@ -6309,7 +6318,8 @@ class PubServer(BaseHTTPRequestHandler):
path, path,
httpPrefix, httpPrefix,
maxPostsInMediaFeed, 'tlmedia', maxPostsInMediaFeed, 'tlmedia',
True) True,
0, self.server.positiveVoting)
if not inboxMediaFeed: if not inboxMediaFeed:
inboxMediaFeed = [] inboxMediaFeed = []
if self._requestHTTP(): if self._requestHTTP():
@ -6334,7 +6344,8 @@ class PubServer(BaseHTTPRequestHandler):
path + '?page=1', path + '?page=1',
httpPrefix, httpPrefix,
maxPostsInMediaFeed, 'tlmedia', maxPostsInMediaFeed, 'tlmedia',
True) True,
0, self.server.positiveVoting)
msg = \ msg = \
htmlInboxMedia(self.server.defaultTimeline, htmlInboxMedia(self.server.defaultTimeline,
self.server.recentPostsCache, self.server.recentPostsCache,
@ -6411,7 +6422,8 @@ class PubServer(BaseHTTPRequestHandler):
path, path,
httpPrefix, httpPrefix,
maxPostsInBlogsFeed, 'tlblogs', maxPostsInBlogsFeed, 'tlblogs',
True) True,
0, self.server.positiveVoting)
if not inboxBlogsFeed: if not inboxBlogsFeed:
inboxBlogsFeed = [] inboxBlogsFeed = []
if self._requestHTTP(): if self._requestHTTP():
@ -6436,7 +6448,8 @@ class PubServer(BaseHTTPRequestHandler):
path + '?page=1', path + '?page=1',
httpPrefix, httpPrefix,
maxPostsInBlogsFeed, 'tlblogs', maxPostsInBlogsFeed, 'tlblogs',
True) True,
0, self.server.positiveVoting)
msg = \ msg = \
htmlInboxBlogs(self.server.defaultTimeline, htmlInboxBlogs(self.server.defaultTimeline,
self.server.recentPostsCache, self.server.recentPostsCache,
@ -6514,7 +6527,9 @@ class PubServer(BaseHTTPRequestHandler):
path, path,
httpPrefix, httpPrefix,
maxPostsInNewsFeed, 'tlnews', maxPostsInNewsFeed, 'tlnews',
True) True,
self.server.newswireVotesThreshold,
self.server.positiveVoting)
if not inboxNewsFeed: if not inboxNewsFeed:
inboxNewsFeed = [] inboxNewsFeed = []
if self._requestHTTP(): if self._requestHTTP():
@ -6540,7 +6555,9 @@ class PubServer(BaseHTTPRequestHandler):
path + '?page=1', path + '?page=1',
httpPrefix, httpPrefix,
maxPostsInBlogsFeed, 'tlnews', maxPostsInBlogsFeed, 'tlnews',
True) True,
self.server.newswireVotesThreshold,
self.server.positiveVoting)
currNickname = path.split('/users/')[1] currNickname = path.split('/users/')[1]
if '/' in currNickname: if '/' in currNickname:
currNickname = currNickname.split('/')[0] currNickname = currNickname.split('/')[0]
@ -6686,7 +6703,8 @@ class PubServer(BaseHTTPRequestHandler):
path, path,
httpPrefix, httpPrefix,
maxPostsInFeed, 'tlbookmarks', maxPostsInFeed, 'tlbookmarks',
authorized) authorized,
0, self.server.positiveVoting)
if bookmarksFeed: if bookmarksFeed:
if self._requestHTTP(): if self._requestHTTP():
nickname = path.replace('/users/', '') nickname = path.replace('/users/', '')
@ -6712,7 +6730,8 @@ class PubServer(BaseHTTPRequestHandler):
httpPrefix, httpPrefix,
maxPostsInFeed, maxPostsInFeed,
'tlbookmarks', 'tlbookmarks',
authorized) authorized,
0, self.server.positiveVoting)
msg = \ msg = \
htmlBookmarks(self.server.defaultTimeline, htmlBookmarks(self.server.defaultTimeline,
self.server.recentPostsCache, self.server.recentPostsCache,
@ -6791,7 +6810,8 @@ class PubServer(BaseHTTPRequestHandler):
path, path,
httpPrefix, httpPrefix,
maxPostsInFeed, 'tlevents', maxPostsInFeed, 'tlevents',
authorized) authorized,
0, self.server.positiveVoting)
print('eventsFeed: ' + str(eventsFeed)) print('eventsFeed: ' + str(eventsFeed))
if eventsFeed: if eventsFeed:
if self._requestHTTP(): if self._requestHTTP():
@ -6817,7 +6837,8 @@ class PubServer(BaseHTTPRequestHandler):
httpPrefix, httpPrefix,
maxPostsInFeed, maxPostsInFeed,
'tlevents', 'tlevents',
authorized) authorized,
0, self.server.positiveVoting)
msg = \ msg = \
htmlEvents(self.server.defaultTimeline, htmlEvents(self.server.defaultTimeline,
self.server.recentPostsCache, self.server.recentPostsCache,
@ -6888,7 +6909,9 @@ class PubServer(BaseHTTPRequestHandler):
port, path, port, path,
httpPrefix, httpPrefix,
maxPostsInFeed, 'outbox', maxPostsInFeed, 'outbox',
authorized) authorized,
self.server.newswireVotesThreshold,
self.server.positiveVoting)
if outboxFeed: if outboxFeed:
if self._requestHTTP(): if self._requestHTTP():
nickname = \ nickname = \
@ -6912,7 +6935,9 @@ class PubServer(BaseHTTPRequestHandler):
path + '?page=1', path + '?page=1',
httpPrefix, httpPrefix,
maxPostsInFeed, 'outbox', maxPostsInFeed, 'outbox',
authorized) authorized,
self.server.newswireVotesThreshold,
self.server.positiveVoting)
msg = \ msg = \
htmlOutbox(self.server.defaultTimeline, htmlOutbox(self.server.defaultTimeline,
self.server.recentPostsCache, self.server.recentPostsCache,
@ -6976,7 +7001,8 @@ class PubServer(BaseHTTPRequestHandler):
path, path,
httpPrefix, httpPrefix,
maxPostsInFeed, 'moderation', maxPostsInFeed, 'moderation',
True) True,
0, self.server.positiveVoting)
if moderationFeed: if moderationFeed:
if self._requestHTTP(): if self._requestHTTP():
nickname = path.replace('/users/', '') nickname = path.replace('/users/', '')
@ -7000,7 +7026,8 @@ class PubServer(BaseHTTPRequestHandler):
path + '?page=1', path + '?page=1',
httpPrefix, httpPrefix,
maxPostsInFeed, 'moderation', maxPostsInFeed, 'moderation',
True) True,
0, self.server.positiveVoting)
msg = \ msg = \
htmlModeration(self.server.defaultTimeline, htmlModeration(self.server.defaultTimeline,
self.server.recentPostsCache, self.server.recentPostsCache,

View File

@ -595,7 +595,8 @@ def personLookup(domain: str, path: str, baseDir: str) -> {}:
def personBoxJson(recentPostsCache: {}, def personBoxJson(recentPostsCache: {},
session, baseDir: str, domain: str, port: int, path: str, session, baseDir: str, domain: str, port: int, path: str,
httpPrefix: str, noOfItems: int, boxname: str, httpPrefix: str, noOfItems: int, boxname: str,
authorized: bool) -> {}: authorized: bool,
newswireVotesThreshold: int, positiveVoting: bool) -> {}:
"""Obtain the inbox/outbox/moderation feed for the given person """Obtain the inbox/outbox/moderation feed for the given person
""" """
if boxname != 'inbox' and boxname != 'dm' and \ if boxname != 'inbox' and boxname != 'dm' and \
@ -671,6 +672,7 @@ def personBoxJson(recentPostsCache: {},
elif boxname == 'tlnews': elif boxname == 'tlnews':
return createNewsTimeline(session, baseDir, nickname, domain, port, return createNewsTimeline(session, baseDir, nickname, domain, port,
httpPrefix, noOfItems, headerOnly, httpPrefix, noOfItems, headerOnly,
newswireVotesThreshold, positiveVoting,
pageNumber) pageNumber)
elif boxname == 'tlblogs': elif boxname == 'tlblogs':
return createBlogsTimeline(session, baseDir, nickname, domain, port, return createBlogsTimeline(session, baseDir, nickname, domain, port,

View File

@ -46,6 +46,8 @@ from utils import locatePost
from utils import loadJson from utils import loadJson
from utils import saveJson from utils import saveJson
from utils import getConfigParam from utils import getConfigParam
from utils import locateNewsVotes
from utils import votesOnNewswireItem
from media import attachMedia from media import attachMedia
from media import replaceYouTube from media import replaceYouTube
from content import removeHtml from content import removeHtml
@ -2477,7 +2479,7 @@ def createInbox(recentPostsCache: {},
session, baseDir, 'inbox', session, baseDir, 'inbox',
nickname, domain, port, httpPrefix, nickname, domain, port, httpPrefix,
itemsPerPage, headerOnly, True, itemsPerPage, headerOnly, True,
pageNumber) 0, False, pageNumber)
def createBookmarksTimeline(session, baseDir: str, nickname: str, domain: str, def createBookmarksTimeline(session, baseDir: str, nickname: str, domain: str,
@ -2486,7 +2488,7 @@ def createBookmarksTimeline(session, baseDir: str, nickname: str, domain: str,
return createBoxIndexed({}, session, baseDir, 'tlbookmarks', return createBoxIndexed({}, session, baseDir, 'tlbookmarks',
nickname, domain, nickname, domain,
port, httpPrefix, itemsPerPage, headerOnly, port, httpPrefix, itemsPerPage, headerOnly,
True, pageNumber) True, 0, False, pageNumber)
def createEventsTimeline(recentPostsCache: {}, def createEventsTimeline(recentPostsCache: {},
@ -2496,7 +2498,7 @@ def createEventsTimeline(recentPostsCache: {},
return createBoxIndexed(recentPostsCache, session, baseDir, 'tlevents', return createBoxIndexed(recentPostsCache, session, baseDir, 'tlevents',
nickname, domain, nickname, domain,
port, httpPrefix, itemsPerPage, headerOnly, port, httpPrefix, itemsPerPage, headerOnly,
True, pageNumber) True, 0, False, pageNumber)
def createDMTimeline(recentPostsCache: {}, def createDMTimeline(recentPostsCache: {},
@ -2506,7 +2508,7 @@ def createDMTimeline(recentPostsCache: {},
return createBoxIndexed(recentPostsCache, return createBoxIndexed(recentPostsCache,
session, baseDir, 'dm', nickname, session, baseDir, 'dm', nickname,
domain, port, httpPrefix, itemsPerPage, domain, port, httpPrefix, itemsPerPage,
headerOnly, True, pageNumber) headerOnly, True, 0, False, pageNumber)
def createRepliesTimeline(recentPostsCache: {}, def createRepliesTimeline(recentPostsCache: {},
@ -2516,7 +2518,7 @@ def createRepliesTimeline(recentPostsCache: {},
return createBoxIndexed(recentPostsCache, session, baseDir, 'tlreplies', return createBoxIndexed(recentPostsCache, session, baseDir, 'tlreplies',
nickname, domain, port, httpPrefix, nickname, domain, port, httpPrefix,
itemsPerPage, headerOnly, True, itemsPerPage, headerOnly, True,
pageNumber) 0, False, pageNumber)
def createBlogsTimeline(session, baseDir: str, nickname: str, domain: str, def createBlogsTimeline(session, baseDir: str, nickname: str, domain: str,
@ -2525,7 +2527,7 @@ def createBlogsTimeline(session, baseDir: str, nickname: str, domain: str,
return createBoxIndexed({}, session, baseDir, 'tlblogs', nickname, return createBoxIndexed({}, session, baseDir, 'tlblogs', nickname,
domain, port, httpPrefix, domain, port, httpPrefix,
itemsPerPage, headerOnly, True, itemsPerPage, headerOnly, True,
pageNumber) 0, False, pageNumber)
def createMediaTimeline(session, baseDir: str, nickname: str, domain: str, def createMediaTimeline(session, baseDir: str, nickname: str, domain: str,
@ -2534,15 +2536,17 @@ def createMediaTimeline(session, baseDir: str, nickname: str, domain: str,
return createBoxIndexed({}, session, baseDir, 'tlmedia', nickname, return createBoxIndexed({}, session, baseDir, 'tlmedia', nickname,
domain, port, httpPrefix, domain, port, httpPrefix,
itemsPerPage, headerOnly, True, itemsPerPage, headerOnly, True,
pageNumber) 0, False, pageNumber)
def createNewsTimeline(session, baseDir: str, nickname: str, domain: str, def createNewsTimeline(session, baseDir: str, nickname: str, domain: str,
port: int, httpPrefix: str, itemsPerPage: int, port: int, httpPrefix: str, itemsPerPage: int,
headerOnly: bool, pageNumber=None) -> {}: headerOnly: bool, newswireVotesThreshold: int,
positiveVoting: bool, pageNumber=None) -> {}:
return createBoxIndexed({}, session, baseDir, 'outbox', 'news', return createBoxIndexed({}, session, baseDir, 'outbox', 'news',
domain, port, httpPrefix, domain, port, httpPrefix,
itemsPerPage, headerOnly, True, itemsPerPage, headerOnly, True,
newswireVotesThreshold, positiveVoting,
pageNumber) pageNumber)
@ -2553,7 +2557,7 @@ def createOutbox(session, baseDir: str, nickname: str, domain: str,
return createBoxIndexed({}, session, baseDir, 'outbox', return createBoxIndexed({}, session, baseDir, 'outbox',
nickname, domain, port, httpPrefix, nickname, domain, port, httpPrefix,
itemsPerPage, headerOnly, authorized, itemsPerPage, headerOnly, authorized,
pageNumber) 0, False, pageNumber)
def createModeration(baseDir: str, nickname: str, domain: str, port: int, def createModeration(baseDir: str, nickname: str, domain: str, port: int,
@ -2846,6 +2850,7 @@ def createBoxIndexed(recentPostsCache: {},
session, baseDir: str, boxname: str, session, baseDir: str, boxname: str,
nickname: str, domain: str, port: int, httpPrefix: str, nickname: str, domain: str, port: int, httpPrefix: str,
itemsPerPage: int, headerOnly: bool, authorized: bool, itemsPerPage: int, headerOnly: bool, authorized: bool,
newswireVotesThreshold: int, positiveVoting: bool,
pageNumber=None) -> {}: pageNumber=None) -> {}:
"""Constructs the box feed for a person with the given nickname """Constructs the box feed for a person with the given nickname
""" """
@ -2915,6 +2920,30 @@ def createBoxIndexed(recentPostsCache: {},
if not postFilename: if not postFilename:
break break
# apply votes within this timeline
if newswireVotesThreshold > 0:
# if there a votes file for this post?
votesFilename = \
locateNewsVotes(baseDir, domain, postFilename)
if votesFilename:
# load the votes file and count the votes
votesJson = loadJson(votesFilename, 0, 2)
if votesJson:
if not positiveVoting:
if votesOnNewswireItem >= \
newswireVotesThreshold:
# Too many veto votes.
# Continue without incrementing the
# posts counter
continue
else:
if votesOnNewswireItem < \
newswireVotesThreshold:
# Not enough votes.
# Continue without incrementing the
# posts counter
continue
# Skip through any posts previous to the current page # Skip through any posts previous to the current page
if postsCtr < int((pageNumber - 1) * itemsPerPage): if postsCtr < int((pageNumber - 1) * itemsPerPage):
postsCtr += 1 postsCtr += 1

View File

@ -500,6 +500,39 @@ def followPerson(baseDir: str, nickname: str, domain: str,
return True return True
def votesOnNewswireItem(status: []) -> int:
"""Returns the number of votes on a newswire item
"""
totalVotes = 0
for line in status:
if 'vote:' in line:
totalVotes += 1
return totalVotes
def locateNewsVotes(baseDir: str, domain: str,
postUrl: str) -> str:
"""Returns the votes filename for a news post
within the news user account
"""
postUrl = \
postUrl.strip().replace('\n', '').replace('\r', '')
# if this post in the shared inbox?
postUrl = removeIdEnding(postUrl.strip()).replace('/', '#')
if postUrl.endswith('.json'):
postUrl = postUrl + '.votes'
else:
postUrl = postUrl + '.json.votes'
accountDir = baseDir + '/accounts/news' + '@' + domain + '/'
postFilename = accountDir + 'outbox/' + postUrl
if os.path.isfile(postFilename):
return postFilename
return None
def locatePost(baseDir: str, nickname: str, domain: str, def locatePost(baseDir: str, nickname: str, domain: str,
postUrl: str, replies=False) -> str: postUrl: str, replies=False) -> str:
"""Returns the filename for the given status post url """Returns the filename for the given status post url
@ -525,7 +558,7 @@ def locatePost(baseDir: str, nickname: str, domain: str,
# check news posts # check news posts
accountDir = baseDir + '/accounts/news' + '@' + domain + '/' accountDir = baseDir + '/accounts/news' + '@' + domain + '/'
postFilename = accountDir + boxName + '/' + postUrl postFilename = accountDir + 'outbox/' + postUrl
if os.path.isfile(postFilename): if os.path.isfile(postFilename):
return postFilename return postFilename

View File

@ -43,6 +43,7 @@ from utils import getCachedPostDirectory
from utils import getCachedPostFilename from utils import getCachedPostFilename
from utils import loadJson from utils import loadJson
from utils import getConfigParam from utils import getConfigParam
from utils import votesOnNewswireItem
from follow import isFollowingActor from follow import isFollowingActor
from webfinger import webfingerHandle from webfinger import webfingerHandle
from posts import isDM from posts import isDM
@ -2861,7 +2862,7 @@ def htmlProfilePosts(recentPostsCache: {}, maxRecentPosts: int,
str(currPage), str(currPage),
httpPrefix, httpPrefix,
10, 'outbox', 10, 'outbox',
authorized) authorized, 0, False)
if not outboxFeed: if not outboxFeed:
break break
if len(outboxFeed['orderedItems']) == 0: if len(outboxFeed['orderedItems']) == 0:
@ -5367,16 +5368,6 @@ def getLeftColumnContent(baseDir: str, nickname: str, domainFull: str,
return htmlStr return htmlStr
def votesOnNewswireItem(status: []) -> int:
"""Returns the number of votes on a newswire item
"""
totalVotes = 0
for line in status:
if 'vote:' in line:
totalVotes += 1
return totalVotes
def votesIndicator(totalVotes: int, positiveVoting: bool) -> str: def votesIndicator(totalVotes: int, positiveVoting: bool) -> str:
"""Returns an indicator of the number of votes on a newswire item """Returns an indicator of the number of votes on a newswire item
""" """