Merge branch 'experimental' into 'testing'

Experimental

See merge request piotrex43/RcGcDw!8
This commit is contained in:
Frisk 2018-07-04 22:09:11 +00:00
commit 29762871af

View file

@ -41,10 +41,7 @@ else:
_ = lambda s: s _ = lambda s: s
def send(message, name, avatar): def send(message, name, avatar):
try: send_to_discord({"content": message, "avatar_url": avatar, "username": name})
req = requests.post(settings["webhookURL"], data={"content": message, "avatar_url": avatar, "username": name}, timeout=10)
except:
pass
def safe_read(request, *keys): def safe_read(request, *keys):
if request is None: if request is None:
@ -60,7 +57,33 @@ def safe_read(request, *keys):
logging.warning("Failure while extracting data from request in {change}".format(change=request)) logging.warning("Failure while extracting data from request in {change}".format(change=request))
return None return None
return request return request
def send_to_discord_webhook(data):
try:
result = requests.post(settings["webhookURL"], data=data, headers={'Content-Type': 'application/json'}, timeout=10)
except requests.exceptions.Timeout:
logging.warning("Timeouted while sending data to the webhook.")
return 3
except requests.exceptions.ConnectionError:
logging.warning("Connection error while sending the data to a webhook")
return 3
else:
return handle_discord_http(result.status_code, data)
def send_to_discord(data):
if recent_changes.unsent_messages:
recent_changes.unsent_messages.append(data)
else:
code = send_to_discord_webhook(data)
if code == 3:
recent_changes.unsent_messages.append(data)
elif code == 2:
time.sleep(5.0)
recent_changes.unsent_messages.append(data)
elif code < 2:
time.sleep(2.5)
pass
def webhook_formatter(action, STATIC, **params): def webhook_formatter(action, STATIC, **params):
logging.debug("Received things: {thing}".format(thing=params)) logging.debug("Received things: {thing}".format(thing=params))
colornumber = None if isinstance(STATIC["color"], str) else STATIC["color"] colornumber = None if isinstance(STATIC["color"], str) else STATIC["color"]
@ -325,28 +348,27 @@ def webhook_formatter(action, STATIC, **params):
data["embeds"].append(dict(embed)) data["embeds"].append(dict(embed))
data['avatar_url'] = settings["avatars"]["embed"] data['avatar_url'] = settings["avatars"]["embed"]
formatted_embed = json.dumps(data, indent=4) formatted_embed = json.dumps(data, indent=4)
headers = {'Content-Type': 'application/json'} send_to_discord(formatted_embed)
#logging.debug(data)
result = requests.post(settings["webhookURL"], data=formatted_embed, headers=headers)
if result.status_code != requests.codes.ok:
handle_discord_http(result.status_code, formatted_embed, headers)
def handle_discord_http(code, formatted_embed, headers): def handle_discord_http(code, formatted_embed):
if code == 204: #message went through if code <300 and code > 199: #message went through
return return 0
elif code == 400: #HTTP BAD REQUEST elif code == 400: #HTTP BAD REQUEST
logging.error("Following message has been rejected by Discord, please submit a bug on our bugtracker adding it:") logging.error("Following message has been rejected by Discord, please submit a bug on our bugtracker adding it:")
logging.error(formatted_embed) logging.error(formatted_embed)
return 1
elif code == 401: #HTTP UNAUTHORIZED elif code == 401: #HTTP UNAUTHORIZED
logging.error("Webhook URL is invalid or no longer in use, please replace it with proper one.") logging.error("Webhook URL is invalid or no longer in use, please replace it with proper one.")
sys.exit(1)
return 1
elif code == 429: elif code == 429:
logging.error("We are sending too many requests to the Discord, slowing down...") logging.error("We are sending too many requests to the Discord, slowing down...")
time.sleep(20.0) time.sleep(20.0)
result = requests.post(settings["webhookURL"], data=formatted_embed, headers=headers) #TODO Replace this solution with less obscure one return 2
elif code > 500 and code < 600: elif code > 500 and code < 600:
logging.error("Discord have trouble processing the event, and because the HTTP code returned is 500> it means we blame them.") logging.error("Discord have trouble processing the event, and because the HTTP code returned is 500> it means we blame them.")
time.sleep(20.0) time.sleep(20.0)
result = requests.post(settings["webhookURL"], data=formatted_embed, headers=headers) return 3
def first_pass(change): #I've decided to split the embed formatter and change handler, maybe it's more messy this way, I don't know def first_pass(change): #I've decided to split the embed formatter and change handler, maybe it's more messy this way, I don't know
parsedcomment = (BeautifulSoup(change["parsedcomment"], "lxml")).get_text() parsedcomment = (BeautifulSoup(change["parsedcomment"], "lxml")).get_text()
@ -556,9 +578,7 @@ def day_overview(): #time.strftime('%Y-%m-%dT%H:%M:%S.000Z', time.gmtime(time.ti
data = {} data = {}
data["embeds"] = [dict(embed)] data["embeds"] = [dict(embed)]
formatted_embed = json.dumps(data, indent=4) formatted_embed = json.dumps(data, indent=4)
headers = {'Content-Type': 'application/json'} send_to_discord(formatted_embed)
logging.debug(formatted_embed)
result = requests.post(settings["webhookURL"], data=formatted_embed, headers=headers)
else: else:
logging.debug("function requesting changes for day overview returned with error code") logging.debug("function requesting changes for day overview returned with error code")
@ -571,6 +591,7 @@ class recent_changes_class(object):
last_downtime = 0 last_downtime = 0
clock = 0 clock = 0
tags = {} tags = {}
unsent_messages = []
if settings["limitrefetch"] != -1: if settings["limitrefetch"] != -1:
with open("lastchange.txt", "r") as record: with open("lastchange.txt", "r") as record:
file_content = record.read().strip() file_content = record.read().strip()
@ -588,6 +609,13 @@ class recent_changes_class(object):
if len(self.ids) > settings["limit"]+5: if len(self.ids) > settings["limit"]+5:
self.ids.pop(0) self.ids.pop(0)
def fetch(self, amount=settings["limit"]): def fetch(self, amount=settings["limit"]):
if self.unsent_messages:
for num, item in enumerate(self.unsent_messages):
if send_to_discord_webhook(item) < 2:
time.sleep(2.5)
else:
break
self.unsent_messages = self.unsent_messages[num-1:]
last_check = self.fetch_changes(amount=amount) last_check = self.fetch_changes(amount=amount)
self.recent_id = last_check if last_check is not None else self.recent_id self.recent_id = last_check if last_check is not None else self.recent_id
if settings["limitrefetch"] != -1 and self.recent_id != self.file_id: if settings["limitrefetch"] != -1 and self.recent_id != self.file_id:
@ -625,7 +653,6 @@ class recent_changes_class(object):
logging.debug("Rejected {val}".format(val=change["rcid"])) logging.debug("Rejected {val}".format(val=change["rcid"]))
continue continue
first_pass(change) first_pass(change)
time.sleep(3.0) #sadly, the time here needs to be quite high, otherwise we are being rate-limited by the Discord, especially during re-fetch
return change["rcid"] return change["rcid"]
def safe_request(self, url): def safe_request(self, url):
try: try: