#!/usr/bin/env python3 import sys import re import json try: USERS = __import__("users").users() except ImportError: USERS = None NUMBER_EMOJI = { "zero": "0", "one": "1", "two": "2", "three": "3", "four": "4", "five": "5", "six": "6", "seven": "7", "eight": "8", "nine": "9", } URL_PREFIX = "https://mattermost.zeus.gent/zeus/pl/" second_last_number = None second_last_line = {"id": None} last_number = None last_line = {"id": None} messages = [] start_number = None for line in sys.stdin: line = json.loads(line) # Ignore non-message posts (e.g. join/leave) if line.get("type") is not None: continue if "user_id" in line and USERS is not None: line["username"] = USERS.get(line["user_id"]) if "username" in line: line["mention"] = f" (@{line['username']})" else: line["mention"] = "" if "message" in line and line["message"] != "": message = line["message"] message = re.sub(r"^[#>]* ?|[*_`]*", "", message) for emoji, numb in NUMBER_EMOJI.items(): message = re.sub(f" *:{emoji}: *", numb, message) message = re.sub(" ?:(?:green)?num([0-9]+): ?", lambda m: m.group(1), message) message = message.replace("\ufe0f", "").replace("\u20e3", "") message = message.strip() else: try: message = line["metadata"]["files"][0]["name"].split(".")[0] except (KeyError, IndexError): messages.append( f"- [Unrecognized post]({URL_PREFIX}{line['id']}){line['mention']}" ) continue if line.get("edit_at") is not None: messages.append( f"- Edited message [{message}]({URL_PREFIX}{line['id']}){line['mention']}" ) m = re.fullmatch(r"-?[1-9][0-9]*|0", message) if not m: messages.append( f"- Non-number message [{message}]({URL_PREFIX}{line['id']}){line['mention']}" ) else: number = int(m.group(0)) if last_number is None: start_number = number last_number = number - 1 second_last_number = number - 2 if number != last_number + 1: if number == second_last_number + 2 and last_number != second_last_number + 1: messages.pop() messages.append( f"- [{last_number}]({URL_PREFIX}{last_line['id']}) should have been {number - 1}{last_line['mention']}" ) elif number == last_number: messages.append( f"- Duplicate [{number}]({URL_PREFIX}{line['id']}){line['mention']}" ) elif number == second_last_number + 1 and last_number != second_last_number + 1: messages.pop() messages.append( f"- Stray [{last_number}]({URL_PREFIX}{last_line['id']}){last_line['mention']}" ) elif number == last_number + 2: messages.append( f"- Skipped [{last_number + 1}]({URL_PREFIX}{line['id']}){line['mention']}" ) else: messages.append( f"- Going from [{last_number}]({URL_PREFIX}{last_line['id']}) " f"to [{number}]({URL_PREFIX}{line['id']}){line['mention']}" ) second_last_number = last_number second_last_line = last_line last_number = number last_line = line if start_number is None and messages == []: print("No input data") else: if start_number is None: print("No valid number messages!") else: print(f"Checked from {start_number} up to {number}") if messages: print("🚨 Errors: 🚨") print("\n".join(messages)) else: print("No errors! 🎉")