2020-04-04 12:29:18 +00:00
# -*- coding: utf-8 -*-
# Recent changes Goat compatible Discord webhook is a project for using a webhook as recent changes page from MediaWiki.
# Copyright (C) 2020 Frisk
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
2020-07-16 12:46:23 +00:00
import logging , gettext , schedule , requests
2020-07-07 11:21:49 +00:00
from src . configloader import settings
2020-07-16 12:46:23 +00:00
from src . discussion_formatters import embed_formatter , compact_formatter
from src . misc import datafile , messagequeue
2020-07-07 11:21:49 +00:00
from src . session import session
2020-08-03 13:27:24 +00:00
from src . i18n import disc
2020-04-04 12:29:18 +00:00
# Initialize translation
2020-08-03 13:27:24 +00:00
_ = disc . gettext
2020-04-04 12:29:18 +00:00
# Create a custom logger
discussion_logger = logging . getLogger ( " rcgcdw.disc " )
2020-04-05 00:07:56 +00:00
# Create a variable in datafile if it doesn't exist yet (in files <1.10)
if " discussion_id " not in datafile . data :
datafile . data [ " discussion_id " ] = 0
datafile . save_datafile ( )
storage = datafile . data
2020-04-04 12:29:18 +00:00
fetch_url = " https://services.fandom.com/discussion/ {wikiid} /posts?sortDirection=descending&sortKey=creation_date&limit= {limit} " . format ( wikiid = settings [ " fandom_discussions " ] [ " wiki_id " ] , limit = settings [ " fandom_discussions " ] [ " limit " ] )
2020-04-05 00:07:56 +00:00
2020-04-04 12:29:18 +00:00
def fetch_discussions ( ) :
2020-05-06 09:13:51 +00:00
messagequeue . resend_msgs ( )
2020-04-05 00:07:56 +00:00
request = safe_request ( fetch_url )
if request :
try :
request_json = request . json ( ) [ " _embedded " ] [ " doc:posts " ]
request_json . reverse ( )
except ValueError :
discussion_logger . warning ( " ValueError in fetching discussions " )
return None
except KeyError :
discussion_logger . warning ( " Wiki returned %s " % ( request_json . json ( ) ) )
return None
else :
if request_json :
for post in request_json :
2020-04-05 21:50:36 +00:00
if int ( post [ " id " ] ) > storage [ " discussion_id " ] :
2020-04-25 14:06:15 +00:00
parse_discussion_post ( post )
2020-04-05 21:50:36 +00:00
if int ( post [ " id " ] ) > storage [ " discussion_id " ] :
storage [ " discussion_id " ] = int ( post [ " id " ] )
2020-04-05 00:07:56 +00:00
datafile . save_datafile ( )
2020-04-25 14:06:15 +00:00
def parse_discussion_post ( post ) :
""" Initial post recognition & handling """
post_type = post . get ( " funnel " , " TEXT " )
if post_type == " TEXT " :
formatter ( post , post_type )
elif post_type == " POLL " :
formatter ( post , post_type )
else :
2020-08-02 16:03:38 +00:00
discussion_logger . warning ( " The type of {} is an unknown discussion post type. Please post an issue on the project page to have it added https://gitlab.com/piotrex43/RcGcDw/-/issues. " . format ( post_type ) )
2020-04-25 14:06:15 +00:00
2020-04-25 11:21:41 +00:00
2020-04-05 00:07:56 +00:00
def safe_request ( url ) :
""" Function to assure safety of request, and do not crash the script on exceptions, """
try :
2020-04-05 21:50:36 +00:00
request = session . get ( url , timeout = 10 , allow_redirects = False , headers = { " Accept " : " application/hal+json " } )
2020-04-05 00:07:56 +00:00
except requests . exceptions . Timeout :
discussion_logger . warning ( " Reached timeout error for request on link {url} " . format ( url = url ) )
return None
except requests . exceptions . ConnectionError :
discussion_logger . warning ( " Reached connection error for request on link {url} " . format ( url = url ) )
return None
except requests . exceptions . ChunkedEncodingError :
discussion_logger . warning ( " Detected faulty response from the web server for request on link {url} " . format ( url = url ) )
return None
else :
if 499 < request . status_code < 600 :
return None
return request
formatter = embed_formatter if settings [ " fandom_discussions " ] [ " appearance " ] [ " mode " ] == " embed " else compact_formatter
schedule . every ( settings [ " fandom_discussions " ] [ " cooldown " ] ) . seconds . do ( fetch_discussions )