Handle dicts in power level event, improve sorting

This commit is contained in:
miruka 2020-07-16 12:12:37 -04:00
parent 7d7376a5cf
commit 9674bf6a84

View File

@ -5,7 +5,7 @@ import logging as log
from dataclasses import dataclass, field from dataclasses import dataclass, field
from datetime import datetime, timedelta from datetime import datetime, timedelta
from html import escape from html import escape
from typing import TYPE_CHECKING, Optional, Tuple, Union from typing import TYPE_CHECKING, Dict, Optional, Tuple, Union
from urllib.parse import quote from urllib.parse import quote
import nio import nio
@ -343,6 +343,10 @@ class NioCallbacks:
# Event formatting # Event formatting
changes = []
event_changes = []
user_changes = []
def lvl(level: int) -> str: def lvl(level: int) -> str:
return ( return (
f"Admin ({level})" if level == 100 else f"Admin ({level})" if level == 100 else
@ -350,20 +354,36 @@ class NioCallbacks:
f"User ({level})" f"User ({level})"
) )
changes = [] def format_defaults_dict(
event_changes = [] levels: Dict[str, Union[int, dict]],
user_changes = [] previous: Dict[str, Union[int, dict]],
prefix: str = "",
# Default levels changes ) -> None:
for name, level in levels.items():
for default, level in ev.source["content"].items(): if not prefix and name in ("users", "events"):
if default in ("users", "events"):
continue continue
old = previous.get(default, levels.defaults.users_default) if isinstance(level, dict):
prev = previous.get(name, {})
if not isinstance(prev, dict):
prev = {}
format_defaults_dict(level, prev, f"{prefix}{name}.")
continue
default_0 = ("users_default", "events_default", "invite")
old = previous.get(
name, 0 if not prefix and name in default_0 else 50,
)
if not isinstance(old, int):
old = 50
if level != old or not previous: if level != old or not previous:
changes.append(f"{default} | {lvl(old)} | {lvl(level)}") changes.append((f"{prefix}{name}", old, level))
format_defaults_dict(ev.source["content"], previous)
# Minimum level to send event changes # Minimum level to send event changes
@ -390,12 +410,18 @@ class NioCallbacks:
# Gather and format changes # Gather and format changes
if changes or event_changes or user_changes: if changes or event_changes or user_changes:
changes.sort(key=lambda c: (c[2], c[0]))
changes_lines = [
f"{name} | {lvl(old)} | {lvl(now)}"
for name, old, now in changes
]
co = HTML_PROCESSOR.from_markdown("\n".join([ co = HTML_PROCESSOR.from_markdown("\n".join([
"%1 changed the room's permissions:", "%1 changed the room's permissions",
"", "",
"Change | Previous | Current ", "Change | Previous | Current ",
"--- | --- | ---", "--- | --- | ---",
*sorted(changes), *changes_lines,
*sorted(event_changes), *sorted(event_changes),
*sorted(user_changes), *sorted(user_changes),
])) ]))