diff --git a/discussions.py b/discussions.py index c07e952..ca1a636 100644 --- a/discussions.py +++ b/discussions.py @@ -16,9 +16,10 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -import logging, gettext, schedule, requests +import logging, gettext, schedule, requests, json, datetime +from collections import defaultdict from configloader import settings -from misc import datafile, WIKI_SCRIPT_PATH +from misc import datafile, WIKI_SCRIPT_PATH, send_to_discord from session import session # Initialize translation @@ -43,20 +44,38 @@ fetch_url = "https://services.fandom.com/discussion/{wikiid}/posts?sortDirection def embed_formatter(post): """Embed formatter for Fandom discussions.""" - pass - + embed = defaultdict(dict) + data = {"embeds": []} + embed["author"]["name"] = post["createdBy"]["name"] + embed["author"]["icon_url"] = post["createdBy"]["avatarUrl"] + embed["author"]["url"] = "{wikiurl}f/u/{creatorId}".format(wikiurl=WIKI_SCRIPT_PATH, creatorId=post["creatorId"]) + if post["isReply"]: + embed["title"] = _("Replied to {title}").format(title=post["_embedded"]["thread"][0]["title"]) + embed["url"] = "{wikiurl}f/p/{threadId}/r/{postId}".format(wikiurl=WIKI_SCRIPT_PATH, threadId=post["threadId"], postId=post["id"]) + else: + embed["title"] = _("Created {title}").format(title=post["title"]) + embed["url"] = "{wikiurl}f/p/{threadId}".format(wikiurl=WIKI_SCRIPT_PATH, threadId=post["threadId"]) + if settings["fandom_discussions"]["appearance"]["embed"]["show_content"]: + embed["description"] = post["rawContent"] + embed["footer"]["text"] = post["forumName"] + embed["timestamp"] = datetime.datetime.fromtimestamp(post["creationDate"]["epochSecond"]).isoformat()+"Z" + data["embeds"].append(dict(embed)) + data['avatar_url'] = settings["avatars"]["embed"] + data['allowed_mentions'] = {'parse': []} + formatted_embed = json.dumps(data, indent=4) + send_to_discord(formatted_embed) def compact_formatter(post): """Compact formatter for Fandom discussions.""" message = None if post["isReply"]: - message = _("[{author}](<{url}f/u/{creatorId}>) created [{title}](<{url}f/p/{threadId}>) in ${forumName}".format( - author=post["createdBy"]["name"], url=WIKI_SCRIPT_PATH, creatorId=post["creatorId"], title=post["title"], threadId=post["threadId"], forumName=post["forumName"])) + message = _("[{author}](<{url}f/u/{creatorId}>) created [{title}](<{url}f/p/{threadId}>) in {forumName}").format( + author=post["createdBy"]["name"], url=WIKI_SCRIPT_PATH, creatorId=post["creatorId"], title=post["title"], threadId=post["threadId"], forumName=post["forumName"]) else: - message = _("[${author}](<{url}f/u/{creatorId}>) created a [reply](<{url}f/p/{threadId}/r/{postId}>) to [{title}](<{url}f/p/{threadId}>) in {forumName}".format( + message = _("[{author}](<{url}f/u/{creatorId}>) created a [reply](<{url}f/p/{threadId}/r/{postId}>) to [{title}](<{url}f/p/{threadId}>) in {forumName}").format( author=post["createdBy"]["name"], url=WIKI_SCRIPT_PATH, creatorId=post["creatorId"], threadId=post["threadId"], postId=post["id"], title=post["_embedded"]["thread"][0]["title"], forumName=post["forumName"] - )) - {"content": message} + ) + send_to_discord(json.dumps({'content': message, 'allowed_mentions': {'parse': []}})) def fetch_discussions(): @@ -74,16 +93,16 @@ def fetch_discussions(): else: if request_json: for post in request_json: - if post["id"] > storage["discussion_id"]: + if int(post["id"]) > storage["discussion_id"]: formatter(post) - if post["id"] > storage["discussion_id"]: - storage["discussion_id"] = post["id"] + if int(post["id"]) > storage["discussion_id"]: + storage["discussion_id"] = int(post["id"]) datafile.save_datafile() def safe_request(url): """Function to assure safety of request, and do not crash the script on exceptions,""" try: - request = session.get(url, timeout=10, allow_redirects=False, header={"Accept": "application/hal+json"}) + request = session.get(url, timeout=10, allow_redirects=False, headers={"Accept": "application/hal+json"}) except requests.exceptions.Timeout: discussion_logger.warning("Reached timeout error for request on link {url}".format(url=url)) return None diff --git a/misc.py b/misc.py index 1410428..c6aa394 100644 --- a/misc.py +++ b/misc.py @@ -16,7 +16,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -import json, logging, sys, re +import json, logging, sys, re, time from html.parser import HTMLParser from urllib.parse import urlparse, urlunparse import requests @@ -277,3 +277,37 @@ prepare_paths() def create_article_path(article: str) -> str: """Takes the string and creates an URL with it as the article name""" return WIKI_ARTICLE_PATH.replace("$1", article) + + +def send_to_discord_webhook(data): + header = settings["header"] + if isinstance(data, str): + header['Content-Type'] = 'application/json' + else: + header['Content-Type'] = 'application/x-www-form-urlencoded' + try: + result = requests.post(settings["webhookURL"], data=data, + headers=header, timeout=10) + except requests.exceptions.Timeout: + misc_logger.warning("Timeouted while sending data to the webhook.") + return 3 + except requests.exceptions.ConnectionError: + misc_logger.warning("Connection error while sending the data to a webhook") + return 3 + else: + return handle_discord_http(result.status_code, data, result) + + +def send_to_discord(data): + if messagequeue: + messagequeue.add_message(data) + else: + code = send_to_discord_webhook(data) + if code == 3: + messagequeue.add_message(data) + elif code == 2: + time.sleep(5.0) + messagequeue.add_message(data) + elif code < 2: + time.sleep(2.0) + pass \ No newline at end of file diff --git a/rcgcdw.py b/rcgcdw.py index 55863e0..6222209 100644 --- a/rcgcdw.py +++ b/rcgcdw.py @@ -28,8 +28,9 @@ from bs4 import BeautifulSoup from collections import defaultdict, Counter from urllib.parse import quote_plus from configloader import settings -from misc import link_formatter, ContentParser, safe_read, handle_discord_http, add_to_dict, datafile, \ - WIKI_API_PATH, WIKI_SCRIPT_PATH, WIKI_JUST_DOMAIN, create_article_path, messagequeue +from misc import link_formatter, ContentParser, safe_read, add_to_dict, datafile, \ + WIKI_API_PATH, WIKI_SCRIPT_PATH, WIKI_JUST_DOMAIN, create_article_path, messagequeue, send_to_discord_webhook, \ + send_to_discord from session import session if settings["fandom_discussions"]["enabled"]: @@ -132,39 +133,6 @@ def profile_field_name(name, embed): else: return _("unknown") -def send_to_discord_webhook(data): - header = settings["header"] - if isinstance(data, str): - header['Content-Type'] = 'application/json' - else: - header['Content-Type'] = 'application/x-www-form-urlencoded' - try: - result = requests.post(settings["webhookURL"], data=data, - headers=header, timeout=10) - except requests.exceptions.Timeout: - logger.warning("Timeouted while sending data to the webhook.") - return 3 - except requests.exceptions.ConnectionError: - logger.warning("Connection error while sending the data to a webhook") - return 3 - else: - return handle_discord_http(result.status_code, data, result) - - -def send_to_discord(data): - if messagequeue: - messagequeue.add_message(data) - else: - code = send_to_discord_webhook(data) - if code == 3: - messagequeue.add_message(data) - elif code == 2: - time.sleep(5.0) - messagequeue.add_message(data) - elif code < 2: - time.sleep(2.0) - pass - def pull_comment(comment_id): try: