From b11edc5c69b6ca04a296f0c9fb4b19ad59309a21 Mon Sep 17 00:00:00 2001 From: Fotoente Date: Sun, 20 Feb 2022 13:53:13 +0100 Subject: [PATCH] Added support for UTF8 emojis --- .gitignore | 3 +- miceco.py | 295 ++++++++++++++++++++++++++++++----------------------- 2 files changed, 169 insertions(+), 129 deletions(-) diff --git a/.gitignore b/.gitignore index 4b6a613..90162ed 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ emojicount.cfg -miceco.cfg \ No newline at end of file +miceco.cfg +.idea \ No newline at end of file diff --git a/miceco.py b/miceco.py index 29b8e6f..95118f7 100644 --- a/miceco.py +++ b/miceco.py @@ -1,23 +1,26 @@ -import sys -import os -import requests -from datetime import * -import json import configparser +import os +import re +import sys +from datetime import * +import dateutil.relativedelta -def check_str_to_bool(text) -> bool: - if (text == "True" or text == "true" or text == "TRUE"): +import requests +import emoji as emojilib + + +def check_str_to_bool(input_text) -> bool: + if input_text == "True" or input_text == "true" or input_text == "TRUE": return True - elif (text == "False" or text == "false" or text == "FALSE"): + elif input_text == "False" or input_text == "false" or input_text == "FALSE": return False else: return True -token="" -url="" + noteList = [] reactionList = [] -reactList=[] +reactList = [] emojiList = [] emojisTotal = 0 doubleList = [] @@ -26,186 +29,222 @@ getReactions = False configfilePath = os.path.join(os.path.dirname(__file__), 'miceco.cfg') -if (not os.path.exists(configfilePath)): +if not os.path.exists(configfilePath): print("No config File found!") - print("Exit programm!") + print("Exit program!") sys.exit(1) -#Load configuration +# Load configuration config = configparser.ConfigParser() config.read(configfilePath) -url = "https://" + config.get("misskey","instance") + "/api" -token = config.get("misskey","token") -user = config.get("misskey","user") +url = "https://" + config.get("misskey", "instance") + "/api" +token = config.get("misskey", "token") +user = config.get("misskey", "user") try: - getReactions = check_str_to_bool(config.get("misskey","getReaction")) + getReactions = check_str_to_bool(config.get("misskey", "getReaction")) except (TypeError, ValueError) as err: getReactions = False try: - req = requests.post(url+"/users/show", json={"username" : user, "host" : None, "i" : token}) - req.raise_for_status() + req = requests.post(url + "/users/show", json={"username": user, "host": None, "i": token}) + req.raise_for_status() except requests.exceptions.HTTPError as err: - print("Couldn't get Username!\n"+str(err)) - sys.exit(1) - - + print("Couldn't get Username!\n" + str(err)) + sys.exit(1) + userid = req.json()["id"] nickname = req.json()["name"] -heute = date.today() -gestern = heute - timedelta(days = 1) -mitternachtGestern = datetime.combine(gestern, time(0,0,0)) -mitternachtHeute = datetime.combine(heute, time(0,0,0)) +today = date.today() +formerDate = today - timedelta(days=1) +# formerDate = today - timedelta(weeks=1) #Last week +# formerDate = today - dateutil.relativedelta.relativedelta(months=1) +formerDateMidnight = datetime.combine(formerDate, time(0, 0, 0)) +todayMidnight = datetime.combine(today, time(0, 0, 0)) -seit = int(mitternachtGestern.timestamp())*1000 #Javascript uses millisecond timestamp and Python uses float -bis = int(mitternachtHeute.timestamp())*1000 +seit = int(formerDateMidnight.timestamp()) * 1000 # Javascript uses millisecond timestamp and Python uses float +bis = int(todayMidnight.timestamp()) * 1000 lastTimestamp = bis +formerTimestamp = 0 while True: - - - if ((bis != lastTimestamp) and (formerTimestamp == lastTimestamp)): + + if (bis != lastTimestamp) and (formerTimestamp == lastTimestamp): break - - try: - req = requests.post(url+"/users/notes", json = { - "i" : token, - "userId" : userid, - "sinceDate" : seit, - "untilDate" : lastTimestamp, - "includeReplies" : True, - "limit" : 100, - "includeMyRenotes" : False, - "withFiles" : False, - "excludeNsfw" : False - }) + + try: + req = requests.post(url + "/users/notes", json={ + "i": token, + "userId": userid, + "sinceDate": seit, + "untilDate": lastTimestamp, + "includeReplies": True, + "limit": 100, + "includeMyRenotes": False, + "withFiles": False, + "excludeNsfw": False + }) req.raise_for_status() except requests.exceptions.HTTPError as err: - print("Couldn't get Posts! "+str(err)) + print("Couldn't get Posts! " + str(err)) sys.exit(1) for jsonObj in req.json(): - #textDict = jsonObj + # textDict = jsonObj noteList.append(jsonObj) - + formerTimestamp = lastTimestamp - - lastTime = noteList[len(noteList)-1]["createdAt"] - lastTimestamp = int(datetime.timestamp(datetime.strptime(lastTime, '%Y-%m-%dT%H:%M:%S.%f%z'))*1000) + + lastTime = noteList[len(noteList) - 1]["createdAt"] + lastTimestamp = int(datetime.timestamp(datetime.strptime(lastTime, '%Y-%m-%dT%H:%M:%S.%f%z')) * 1000) for element in noteList: - if (element["text"] == None): #Skip Notes without text + if element["text"] is None: # Skip Notes without text print("Skip Note " + element["id"] + " without Text\nTime noted: " + element["createdAt"]) continue - - if (element["text"].find(chr(8203))>0): #Skip notes with Zero-Width-Space (Marker to skip older MiCECo notes) + + if element["text"].find(chr(8203) + chr(8203) + chr(8203)) > 0: # Skip notes with three Zero-Width-Space in a + # row (Marker to skip older MiCECo notes) print("Skip Note " + element["id"] + " with Zero-Width-Space\nTime noted: " + element["createdAt"]) continue - + + # Process and count custom Emojis emojis = element["emojis"] + + if emojis is not None: + for emoji in emojis: + if emoji["name"].find("@") == -1: # Only emojis from the own instance, because reactions will be in "emojis" + # too + if not emoji["name"] in doubleList: + doubleList.append(emoji["name"]) # Easy way to prevent a double emoji in the list. + emojiDict = {"emoji": ":" + emoji["name"] + ":", "count": 0} + emojiList.append(emojiDict) + else: + continue + + index = doubleList.index(emoji["name"]) + + emojiList[index]["count"] += element["text"].count(emojiList[index]["emoji"]) + + if element["cw"] is not None: + emojiList[index]["count"] += element["cw"].count(emojiList[index]["emoji"]) # Count those Emojis, that + # are in this note CW text - if (not emojis): #Notes without emojis will be skipped - continue - - for emoji in emojis: - if (emoji["name"].find("@") == -1): #Only emojis from the own instance, because reactions will be in "emojis" too - if (not emoji["name"] in doubleList): - doubleList.append(emoji["name"]) #Easy way to prevent a double emoji in the list. - dict={"emoji" : emoji["name"], "count" : 0} - emojiList.append(dict) #TODO: Append a dictionary to acces it way easier - - for emoji in emojiList: - emoji["count"] += element["text"].count(emoji["emoji"]) #Count those Emojis, that are in this note - - if (element["cw"] is not None): - emoji["count"] += element["cw"].count(emoji["emoji"]) #Count those Emojis, that are in this note + # Process UTF8 Emojis + if element["cw"] is not None: + UTF8text = element["text"] + " " + element["cw"] + else: + UTF8text = element["text"] + UTF8List = re.findall(emojilib.get_emoji_regexp(), UTF8text) # Find all UTF8 Emojis in Text and CW text + + if len(UTF8List) > 0: + UTF8List = list(set(UTF8List)) + for emoji in UTF8List: + if emoji not in doubleList: + doubleList.append(emoji) # Easy way to prevent a double emoji in the list. + emojiDict = {"emoji": emoji, "count": 0} + emojiList.append(emojiDict) + + index = doubleList.index(emoji) + emojiList[index]["count"] += UTF8text.count(emoji) doubleList = [] -emojiList = sorted(emojiList, reverse = True , key = lambda d: d["count"]) #Sort it by the most used Emojis! - +emojiList = sorted(emojiList, reverse=True, key=lambda d: d["count"]) # Sort it by the most used Emojis! + +reactionCount = 0 + if getReactions: lastTimestamp = bis - + while True: - - if ((bis != lastTimestamp) and (formerTimestamp == lastTimestamp)): + + if (bis != lastTimestamp) and (formerTimestamp == lastTimestamp): break - - try: - req = requests.post(url+"/users/reactions", json = { - "i" : token, - "userId" : userid, - "sinceDate" : seit, - "untilDate" : lastTimestamp - }) + + try: + req = requests.post(url + "/users/reactions", json={ + "i": token, + "userId": userid, + "sinceDate": seit, + "untilDate": lastTimestamp + }) req.raise_for_status() except requests.exceptions.HTTPError as err: - print("Couldn't get Posts! "+str(err)) + print("Couldn't get Posts! " + str(err)) sys.exit(1) for jsonObj in req.json(): - #textDict = jsonObj + # textDict = jsonObj reactionList.append(jsonObj) - - formerTimestamp = lastTimestamp - - lastTime = reactionList[len(reactionList)-1]["createdAt"] - lastTimestamp = int(datetime.timestamp(datetime.strptime(lastTime, '%Y-%m-%dT%H:%M:%S.%f%z'))*1000) - for reaction in reactionList: - react = reaction["type"] - react = react.replace("@.","") - - if (not react in doubleList): + formerTimestamp = lastTimestamp + + lastTime = reactionList[len(reactionList) - 1]["createdAt"] + lastTimestamp = int(datetime.timestamp(datetime.strptime(lastTime, '%Y-%m-%dT%H:%M:%S.%f%z')) * 1000) + + react = "" + index = None + reactionElement: dict + + for reactionElement in reactionList: + react = reactionElement["type"] + react = react.replace("@.", "") + + if react not in doubleList: doubleList.append(react) - dict={"reaction" : react, "count" : 0} - reactList.append(dict) - - for reaction in reactList: - if (reaction["reaction"] == react): - reaction["count"] += 1 - - reactList = sorted(reactList, reverse = True , key = lambda d: d["count"]) - - reactionCount = 0 - for react in reactList: + emojiDict = {"reaction": react, "count": 0} + reactList.append(emojiDict) + + index = doubleList.index(react) + + reactList[index]["count"] += 1 + + doubleList = [] + reactList = sorted(reactList, reverse=True, key=lambda d: d["count"]) + + if len(reactList) > 0: + for react in reactList: # Summarize the number of Reactions used reactionCount += react["count"] - - if (len(reactList) > 0): - reactText="\n\n\nAnd used " + str(reactionCount) + " reactions:\n\n" + chr(9553) + " " - - for reaction in reactList: - reactText += str(reaction["count"]) + "x " + reaction["reaction"] + " " + chr(9553) + " " + + reactText = "\n\n\nAnd used " + str(reactionCount) + " reactions:\n\n" + chr(9553) + " " + + for reactionElement in reactList: + reactText += str(reactionElement["count"]) + "x " + reactionElement["reaction"] + " " + chr(9553) + " " else: - reactText="\n\nAnd didn't use any reactions." + reactText = "\n\nAnd didn't use any reactions." else: - reactText="" + reactText = "" for count in emojiList: emojisTotal += count["count"] -if (emojisTotal > 0): - text = nickname + " has written " + str(len(noteList)) + " Notes yesterday, " + gestern.strftime('%a %d-%m-%Y') + "\nand used a total of " + str(emojisTotal) + " Emojis. #miceco" + chr(8203) + "\n\n" + chr(9553) + " " +if emojisTotal > 0: + text = nickname + " has written " + str(len(noteList)) + " Notes yesterday, " + formerDate.strftime( + '%a %d-%m-%Y') + "\nand used a total of " + str(emojisTotal) + " Emojis. #miceco" + chr(8203) + chr(8203) + chr( + 8203) + "\n\n" + chr( + 9553) + " " for element in emojiList: - text += str(element["count"]) + "x\u00A0:" + element["emoji"] + ": " + chr(9553) + " " + text += str(element["count"]) + "x\u00A0" + element["emoji"] + " " + chr(9553) + " " else: - text = nickname + " has written " + str(len(noteList)) + " Notes yesterday, " + gestern.strftime('%a %d-%m-%Y') + "\nand didn't used any emojis. #miceco" + chr(8203) + text = nickname + " has written " + str(len(noteList)) + " Notes yesterday, " + formerDate.strftime( + '%a %d-%m-%Y') + "\nand didn't used any emojis. #miceco" + chr(8203) + chr(8203) + chr( + 8203) text += reactText -#print(text) - -try: - req = requests.post(url+"/notes/create", json = { - "i" : token, - "visibility": "public", - "text": text - }) +print(text) +""" +try: + req = requests.post(url + "/notes/create", json={ + "i": token, + "visibility": "specified", + "text": text + }) req.raise_for_status() except requests.exceptions.HTTPError as err: - print("Couldn't create Posts! "+str(err)) + print("Couldn't create Posts! " + str(err)) sys.exit(1) +""" \ No newline at end of file