mirror of https://gitlab.com/bashrc2/epicyon
Label accusatory posts
parent
a4a4c21f4e
commit
0132674ea3
12
inbox.py
12
inbox.py
|
@ -62,6 +62,7 @@ from question import questionUpdateVotes
|
|||
from media import replaceYouTube
|
||||
from git import isGitPatch
|
||||
from git import receiveGitPatch
|
||||
from semantic import labelAccusatoryPost
|
||||
|
||||
|
||||
def storeHashTags(baseDir: str, nickname: str, postJsonObject: {}) -> None:
|
||||
|
@ -1316,7 +1317,7 @@ def receiveAnnounce(recentPostsCache: {},
|
|||
httpPrefix: str, domain: str, onionDomain: str, port: int,
|
||||
sendThreads: [], postLog: [], cachedWebfingers: {},
|
||||
personCache: {}, messageJson: {}, federationList: [],
|
||||
debug: bool) -> bool:
|
||||
debug: bool, translate: {}) -> bool:
|
||||
"""Receives an announce activity within the POST section of HTTPServer
|
||||
"""
|
||||
if messageJson['type'] != 'Announce':
|
||||
|
@ -1398,7 +1399,7 @@ def receiveAnnounce(recentPostsCache: {},
|
|||
' -> ' + messageJson['object'])
|
||||
postJsonObject = downloadAnnounce(session, baseDir, httpPrefix,
|
||||
nickname, domain, messageJson,
|
||||
__version__)
|
||||
__version__, translate)
|
||||
if postJsonObject:
|
||||
if debug:
|
||||
print('DEBUG: Announce post downloaded for ' +
|
||||
|
@ -2007,6 +2008,8 @@ def inboxAfterCapabilities(recentPostsCache: {}, maxRecentPosts: int,
|
|||
print('DEBUG: Undo bookmark accepted from ' + actor)
|
||||
return False
|
||||
|
||||
labelAccusatoryPost(messageJson, translate)
|
||||
|
||||
if receiveAnnounce(recentPostsCache,
|
||||
session, handle, isGroup,
|
||||
baseDir, httpPrefix,
|
||||
|
@ -2016,7 +2019,7 @@ def inboxAfterCapabilities(recentPostsCache: {}, maxRecentPosts: int,
|
|||
personCache,
|
||||
messageJson,
|
||||
federationList,
|
||||
debug):
|
||||
debug, translate):
|
||||
if debug:
|
||||
print('DEBUG: Announce accepted from ' + actor)
|
||||
|
||||
|
@ -2171,7 +2174,8 @@ def inboxAfterCapabilities(recentPostsCache: {}, maxRecentPosts: int,
|
|||
'/users/' + nickname + '/tlreplies')
|
||||
|
||||
if isImageMedia(session, baseDir, httpPrefix,
|
||||
nickname, domain, postJsonObject):
|
||||
nickname, domain, postJsonObject,
|
||||
translate):
|
||||
# media index will be updated
|
||||
updateIndexList.append('tlmedia')
|
||||
if isBlogPost(postJsonObject):
|
||||
|
|
9
posts.py
9
posts.py
|
@ -51,6 +51,7 @@ from config import getConfigParam
|
|||
from blocking import isBlocked
|
||||
from filters import isFiltered
|
||||
from git import convertPostToPatch
|
||||
from semantic import labelAccusatoryPost
|
||||
# try:
|
||||
# from BeautifulSoup import BeautifulSoup
|
||||
# except ImportError:
|
||||
|
@ -2306,14 +2307,14 @@ def isDM(postJsonObject: {}) -> bool:
|
|||
|
||||
def isImageMedia(session, baseDir: str, httpPrefix: str,
|
||||
nickname: str, domain: str,
|
||||
postJsonObject: {}) -> bool:
|
||||
postJsonObject: {}, translate: {}) -> bool:
|
||||
"""Returns true if the given post has attached image media
|
||||
"""
|
||||
if postJsonObject['type'] == 'Announce':
|
||||
postJsonAnnounce = \
|
||||
downloadAnnounce(session, baseDir, httpPrefix,
|
||||
nickname, domain, postJsonObject,
|
||||
__version__)
|
||||
__version__, translate)
|
||||
if postJsonAnnounce:
|
||||
postJsonObject = postJsonAnnounce
|
||||
if postJsonObject['type'] != 'Create':
|
||||
|
@ -2981,7 +2982,8 @@ def rejectAnnounce(announceFilename: str):
|
|||
|
||||
def downloadAnnounce(session, baseDir: str, httpPrefix: str,
|
||||
nickname: str, domain: str,
|
||||
postJsonObject: {}, projectVersion: str) -> {}:
|
||||
postJsonObject: {}, projectVersion: str,
|
||||
translate: {}) -> {}:
|
||||
"""Download the post referenced by an announce
|
||||
"""
|
||||
if not postJsonObject.get('object'):
|
||||
|
@ -3094,6 +3096,7 @@ def downloadAnnounce(session, baseDir: str, httpPrefix: str,
|
|||
# pprint(announcedJson)
|
||||
return None
|
||||
|
||||
labelAccusatoryPost(postJsonObject, translate)
|
||||
# set the id to the original status
|
||||
announcedJson['id'] = postJsonObject['object']
|
||||
announcedJson['object']['id'] = postJsonObject['object']
|
||||
|
|
|
@ -0,0 +1,67 @@
|
|||
__filename__ = "semantic.py"
|
||||
__author__ = "Bob Mottram"
|
||||
__license__ = "AGPL3+"
|
||||
__version__ = "1.1.0"
|
||||
__maintainer__ = "Bob Mottram"
|
||||
__email__ = "bob@freedombone.net"
|
||||
__status__ = "Production"
|
||||
|
||||
|
||||
def isAccusatory(content: str, translate: {}, threshold=3) -> bool:
|
||||
"""Indicates whether the given content is an accusatory post
|
||||
"""
|
||||
words = ('you', 'your', "you're", 'if you', 'you are')
|
||||
|
||||
if translate:
|
||||
wordsTranslated = []
|
||||
for wrd in words:
|
||||
translated = translate[wrd]
|
||||
if '|' not in translated:
|
||||
if translated not in wordsTranslated:
|
||||
wordsTranslated.append(translated)
|
||||
else:
|
||||
# handle differing genders
|
||||
words2 = translated.split('|')
|
||||
for wrd2 in words2:
|
||||
if wrd2.strip() not in wordsTranslated:
|
||||
wordsTranslated.append(translated)
|
||||
else:
|
||||
wordsTranslated = words
|
||||
|
||||
contentLower = content.lower()
|
||||
ctr = 0
|
||||
for wrd in wordsTranslated:
|
||||
ctr += contentLower.count(wrd + ' ')
|
||||
if ctr >= threshold:
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def labelAccusatoryPost(postJsonObject: {}, translate: {}, threshold=3):
|
||||
"""If a post is accusatory and it doesn't mention anyone
|
||||
specific and isn't a reply and it doesn't have a content
|
||||
warning then add a default 'accusatory' content warning
|
||||
"""
|
||||
if not postJsonObject.get('object'):
|
||||
return
|
||||
if not isinstance(postJsonObject['object'], dict):
|
||||
return
|
||||
if not postJsonObject['object'].get('content'):
|
||||
return
|
||||
if postJsonObject['object'].get('inReplyTo'):
|
||||
return
|
||||
if not isinstance(postJsonObject['object']['content'], str):
|
||||
return
|
||||
if '@' in postJsonObject['object']['content']:
|
||||
return
|
||||
if not isAccusatory(postJsonObject['object']['content'],
|
||||
translate, threshold):
|
||||
return
|
||||
cwStr = translate['Accusatory']
|
||||
if postJsonObject['object'].get('summary'):
|
||||
if cwStr not in postJsonObject['object']['summary']:
|
||||
postJsonObject['object']['summary'] = \
|
||||
cwStr + ', ' + postJsonObject['object']['summary']
|
||||
else:
|
||||
postJsonObject['object']['summary'] = cwStr
|
||||
postJsonObject['object']['sensitive'] = True
|
10
tests.py
10
tests.py
|
@ -68,6 +68,7 @@ from content import addHtmlTags
|
|||
from content import removeLongWords
|
||||
from content import replaceContentDuplicates
|
||||
from theme import setCSSparam
|
||||
from semantic import isAccusatory
|
||||
|
||||
testServerAliceRunning = False
|
||||
testServerBobRunning = False
|
||||
|
@ -1787,8 +1788,17 @@ def testRecentPostsCache():
|
|||
assert len(recentPostsCache['html'].items()) == maxRecentPosts
|
||||
|
||||
|
||||
def testAccusatory():
|
||||
print('testAccusatory')
|
||||
testStr = 'This is not an accusatory post'
|
||||
assert(not isAccusatory(testStr, None, 3))
|
||||
testStr = "If you x, and you're y then you are z"
|
||||
assert(isAccusatory(testStr, None, 3))
|
||||
|
||||
|
||||
def runAllTests():
|
||||
print('Running tests...')
|
||||
testAccusatory()
|
||||
testWebLinks()
|
||||
testRecentPostsCache()
|
||||
testTheme()
|
||||
|
|
|
@ -230,5 +230,11 @@
|
|||
"Zen": "زين",
|
||||
"Night": "ليل",
|
||||
"Starlight": "ضوء النجوم",
|
||||
"Search banner image": "البحث عن صورة بانر"
|
||||
"Search banner image": "البحث عن صورة بانر",
|
||||
"Accusatory", "اتهام",
|
||||
"you": "أنت",
|
||||
"your": "الخاص بك",
|
||||
"you're": "أنت على",
|
||||
"if you": "اذا أنت",
|
||||
"you are": "أنت"
|
||||
}
|
||||
|
|
|
@ -230,5 +230,11 @@
|
|||
"Zen": "Zen",
|
||||
"Night": "Nit",
|
||||
"Starlight": "Starlight",
|
||||
"Search banner image": "Cerca imatge del banner"
|
||||
"Search banner image": "Cerca imatge del banner",
|
||||
"Accusatory", "Acusatori",
|
||||
"you": "vostè",
|
||||
"your": "la seva",
|
||||
"you're": "estàs",
|
||||
"if you": "si tu",
|
||||
"you are": "tu ets"
|
||||
}
|
||||
|
|
|
@ -230,5 +230,11 @@
|
|||
"Zen": "Zen",
|
||||
"Night": "Noson",
|
||||
"Starlight": "Starlight",
|
||||
"Search banner image": "Chwilio delwedd baner"
|
||||
"Search banner image": "Chwilio delwedd baner",
|
||||
"Accusatory", "Cyhuddwr",
|
||||
"you": "ti",
|
||||
"your": "eich",
|
||||
"you're": "ti",
|
||||
"if you": "os ydych",
|
||||
"you are": "yr ydych"
|
||||
}
|
||||
|
|
|
@ -230,5 +230,11 @@
|
|||
"Zen": "Zen",
|
||||
"Night": "Nacht",
|
||||
"Starlight": "Sternenlicht",
|
||||
"Search banner image": "Suche Banner Bild"
|
||||
"Search banner image": "Suche Banner Bild",
|
||||
"Accusatory", "Anklagend",
|
||||
"you": "du",
|
||||
"your": "ihre",
|
||||
"you're": "du bist",
|
||||
"if you": "wenn du",
|
||||
"you are": "sie sind"
|
||||
}
|
||||
|
|
|
@ -230,5 +230,11 @@
|
|||
"Zen": "Zen",
|
||||
"Night": "Night",
|
||||
"Starlight": "Starlight",
|
||||
"Search banner image": "Search banner image"
|
||||
"Search banner image": "Search banner image",
|
||||
"Accusatory", "Accusatory",
|
||||
"you": "you",
|
||||
"your": "your",
|
||||
"you're": "you're",
|
||||
"if you": "if you",
|
||||
"you are": "you are"
|
||||
}
|
||||
|
|
|
@ -230,5 +230,11 @@
|
|||
"Zen": "Zen",
|
||||
"Night": "Noche",
|
||||
"Starlight": "Luz de las estrellas",
|
||||
"Search banner image": "Buscar imagen de banner"
|
||||
"Search banner image": "Buscar imagen de banner",
|
||||
"Accusatory", "Acusatoria",
|
||||
"you": "tú",
|
||||
"your": "tu",
|
||||
"you're": "tu eres",
|
||||
"if you": "si tu",
|
||||
"you are": "usted está"
|
||||
}
|
||||
|
|
|
@ -230,5 +230,11 @@
|
|||
"Zen": "Zen",
|
||||
"Night": "Nuit",
|
||||
"Starlight": "Lumière des étoiles",
|
||||
"Search banner image": "Image de bannière de recherche"
|
||||
"Search banner image": "Image de bannière de recherche",
|
||||
"Accusatory", "Accusatoire",
|
||||
"you": "vous",
|
||||
"your": "votre",
|
||||
"you're": "tu es",
|
||||
"if you": "si tu",
|
||||
"you are": "tu es"
|
||||
}
|
||||
|
|
|
@ -230,5 +230,11 @@
|
|||
"Zen": "Zen",
|
||||
"Night": "Oíche",
|
||||
"Starlight": "Starlight",
|
||||
"Search banner image": "Cuardaigh íomhá meirge"
|
||||
"Search banner image": "Cuardaigh íomhá meirge",
|
||||
"Accusatory", "Cúisí",
|
||||
"you": "tú",
|
||||
"your": "do",
|
||||
"you're": "tá tú",
|
||||
"if you": "má tá tú",
|
||||
"you are": "tá tú"
|
||||
}
|
||||
|
|
|
@ -230,5 +230,11 @@
|
|||
"Zen": "जेन",
|
||||
"Night": "रात",
|
||||
"Starlight": "तारों का",
|
||||
"Search banner image": "बैनर छवि खोजें"
|
||||
"Search banner image": "बैनर छवि खोजें",
|
||||
"Accusatory", "दोष लगानेवाला",
|
||||
"you": "आप",
|
||||
"your": "तुम्हारी",
|
||||
"you're": "आप कर रहे हैं",
|
||||
"if you": "अगर तुम",
|
||||
"you are": "तुम हो"
|
||||
}
|
||||
|
|
|
@ -230,5 +230,11 @@
|
|||
"Zen": "Zen",
|
||||
"Night": "Notte",
|
||||
"Starlight": "luce stellare",
|
||||
"Search banner image": "Cerca immagine banner"
|
||||
"Search banner image": "Cerca immagine banner",
|
||||
"Accusatory", "di accusa",
|
||||
"you": "voi",
|
||||
"your": "il tuo",
|
||||
"you're": "sei",
|
||||
"if you": "se tu",
|
||||
"you are": "siete"
|
||||
}
|
||||
|
|
|
@ -230,5 +230,11 @@
|
|||
"Zen": "禅",
|
||||
"Night": "夜",
|
||||
"Starlight": "スターライト",
|
||||
"Search banner image": "バナー画像を検索"
|
||||
"Search banner image": "バナー画像を検索",
|
||||
"Accusatory", "非難",
|
||||
"you": "君は",
|
||||
"your": "君の",
|
||||
"you're": "あなたは",
|
||||
"if you": "もし、あんたが",
|
||||
"you are": "あなたは"
|
||||
}
|
||||
|
|
|
@ -226,5 +226,11 @@
|
|||
"Zen": "Zen",
|
||||
"Night": "Night",
|
||||
"Starlight": "Starlight",
|
||||
"Search banner image": "Search banner image"
|
||||
"Search banner image": "Search banner image",
|
||||
"Accusatory", "Accusatory",
|
||||
"you": "you",
|
||||
"your": "your",
|
||||
"you're": "you're",
|
||||
"if you": "if you",
|
||||
"you are": "you are"
|
||||
}
|
||||
|
|
|
@ -230,5 +230,11 @@
|
|||
"Zen": "Zen",
|
||||
"Night": "Noite",
|
||||
"Starlight": "Luz das estrelas",
|
||||
"Search banner image": "Pesquisar imagem do banner"
|
||||
"Search banner image": "Pesquisar imagem do banner",
|
||||
"Accusatory", "Acusatória",
|
||||
"you": "você",
|
||||
"your": "sua",
|
||||
"you're": "você é",
|
||||
"if you": "se vocês",
|
||||
"you are": "tu es"
|
||||
}
|
||||
|
|
|
@ -230,5 +230,11 @@
|
|||
"Zen": "Zen",
|
||||
"Night": "Ночь",
|
||||
"Starlight": "Звездный свет",
|
||||
"Search banner image": "Поиск изображения баннера"
|
||||
"Search banner image": "Поиск изображения баннера",
|
||||
"Accusatory", "обличительный",
|
||||
"you": "вы",
|
||||
"your": "ваш",
|
||||
"you're": "Вы",
|
||||
"if you": "если ты",
|
||||
"you are": "ты"
|
||||
}
|
||||
|
|
|
@ -229,5 +229,11 @@
|
|||
"Zen": "禅",
|
||||
"Night": "晚",
|
||||
"Starlight": "星光",
|
||||
"Search banner image": "搜索横幅图像"
|
||||
"Search banner image": "搜索横幅图像",
|
||||
"Accusatory", "指责的",
|
||||
"you": "您",
|
||||
"your": "您的",
|
||||
"you're": "你是",
|
||||
"if you": "如果你",
|
||||
"you are": "你是"
|
||||
}
|
||||
|
|
|
@ -3599,7 +3599,7 @@ def individualPostAsHtml(recentPostsCache: {}, maxRecentPosts: int,
|
|||
postJsonAnnounce = \
|
||||
downloadAnnounce(session, baseDir, httpPrefix,
|
||||
nickname, domain, postJsonObject,
|
||||
projectVersion)
|
||||
projectVersion, translate)
|
||||
if not postJsonAnnounce:
|
||||
return ''
|
||||
postJsonObject = postJsonAnnounce
|
||||
|
|
Loading…
Reference in New Issue