Follow screen

master
Bob Mottram 2019-07-29 10:49:46 +01:00
parent 8a24d7437d
commit 54ed777710
4 changed files with 120 additions and 2 deletions

View File

@ -10,6 +10,8 @@ https://blog.dereferenced.org/what-is-ocap-and-why-should-i-care
https://alexcastano.com/what-is-activity-pub https://alexcastano.com/what-is-activity-pub
https://gitlab.com/spritely/ocappub/blob/master/README.org
This project is currently *pre alpha* and not recommended for any real world uses. This project is currently *pre alpha* and not recommended for any real world uses.
## Goals ## Goals

View File

@ -64,6 +64,7 @@ from webinterface import htmlPostReplies
from webinterface import htmlLogin from webinterface import htmlLogin
from webinterface import htmlGetLoginCredentials from webinterface import htmlGetLoginCredentials
from webinterface import htmlNewPost from webinterface import htmlNewPost
from webinterface import htmlFollowConfirm
from shares import getSharesFeedForPerson from shares import getSharesFeedForPerson
from shares import outboxShareUpload from shares import outboxShareUpload
from shares import outboxUndoShareUpload from shares import outboxUndoShareUpload
@ -452,6 +453,16 @@ class PubServer(BaseHTTPRequestHandler):
mediaBinary = avFile.read() mediaBinary = avFile.read()
self.wfile.write(mediaBinary) self.wfile.write(mediaBinary)
return return
# follow screen background image
if self.path=='/follow-background.png':
mediaFilename= \
self.server.baseDir+'/accounts/follow-background.png'
if os.path.isfile(mediaFilename):
self._set_headers('image/png')
with open(mediaFilename, 'rb') as avFile:
mediaBinary = avFile.read()
self.wfile.write(mediaBinary)
return
# show media # show media
# Note that this comes before the busy flag to avoid conflicts # Note that this comes before the busy flag to avoid conflicts
if '/media/' in self.path: if '/media/' in self.path:
@ -570,6 +581,21 @@ class PubServer(BaseHTTPRequestHandler):
self.server.GETbusy=False self.server.GETbusy=False
return return
if '/users/' in self.path:
if '?follow=' in self.path:
followStr=self.path.split('?follow=')[1]
originPathStr=self.path.split('?follow=')[0]
if ';' in followStr:
followActor=followStr.split(';')[0]
followProfileUrl=followStr.split(';')[1]
self._login_headers('text/html')
self.wfile.write(htmlFollowConfirm(self.server.baseDir,originPathStr,followActor,followProfileUrl).encode())
self.server.GETbusy=False
return
self._redirect_headers(originPathStr)
self.server.GETbusy=False
return
if '/users/' in self.path and \ if '/users/' in self.path and \
(self.path.endswith('/newpost') or \ (self.path.endswith('/newpost') or \
self.path.endswith('/newunlisted') or \ self.path.endswith('/newunlisted') or \

60
epicyon-follow.css 100644
View File

@ -0,0 +1,60 @@
body, html {
height: 100%;
font-family: Arial, Helvetica, sans-serif;
max-width: 80%;
min-width: 600px;
margin: 0 auto;
}
.follow {
background-image: url("follow-background.png");
height: 100%;
background-position: center;
background-repeat: no-repeat;
background-size: cover;
position: relative;
background-color: white;
}
.followAvatar {
margin: 15% 0;
}
.followText {
font-size: 24px;
}
.button {
border-radius: 4px;
background-color: #999;
border: none;
color: white;
text-align: center;
font-size: 24px;
padding: 10px;
width: 20%;
max-width: 200px;
min-width: 100px;
cursor: pointer;
margin: 5px;
}
.button:hover {
background-color: #555;
color: white;
}
.container {
border: 2px solid #dedede;
background-color: #f1f1f1;
border-radius: 5px;
padding: 10px;
margin: 10px 0;
}
.container img {
max-width: 60px;
width: 100%;
margin-right: 20px;
border-radius: 10%;
}

View File

@ -428,7 +428,7 @@ 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']:
avatarDropdown= \ avatarDropdown= \
' <div class="dropdown-timeline">' \ ' <div class="dropdown-timeline">' \
' <img src="'+avatarUrl+'" alt="Avatar"'+avatarPosition+'/>' \ ' <img src="'+avatarUrl+'" alt="Avatar"'+avatarPosition+'/>' \
@ -517,3 +517,33 @@ def htmlPostReplies(postJsonObject: {}) -> str:
"""Show the replies to an individual post as html """Show the replies to an individual post as html
""" """
return htmlHeader()+"<h1>Replies</h1>"+htmlFooter() return htmlHeader()+"<h1>Replies</h1>"+htmlFooter()
def htmlFollowConfirm(baseDir: str,originPathStr: str,followActor: str,followProfileUrl: str) -> str:
"""Asks to confirm a follow
"""
followDomain,port=getDomainFromActor(followActor)
if os.path.isfile(baseDir+'/img/follow-background.png'):
if not os.path.isfile(baseDir+'/accounts/follow-background.png'):
copyfile(baseDir+'/img/follow-background.png',baseDir+'/accounts/follow-background.png')
with open(baseDir+'/epicyon-follow.css', 'r') as cssFile:
profileStyle = cssFile.read()
followStr=htmlHeader(profileStyle)
followStr+='<div class="follow">'
followStr+=' <div class="followAvatar">'
followStr+=' <center>'
followStr+=' <a href="'+followActor+'">'
followStr+=' <img src="'+followProfileUrl+'"/></a>'
followStr+=' <p class="followText">Follow '+getNicknameFromActor(followActor)+'@'+followDomain+' ?</p>'
followStr+= \
' <form method="POST" action="'+originPathStr+'?followconfirm">' \
' <input type="hidden" name="actor" value="'+followActor+'">' \
' <button type="submit" class="button" name="submitYes">Yes</button>' \
' <a href="'+originPathStr+'"><button class="button">No</button></a>' \
' </form>'
followStr+='</center>'
followStr+='</div>'
followStr+='</div>'
followStr+=htmlFooter()
return followStr