#!/usr/bin/env python3 import requests, json import xml.etree.ElementTree as xml WORK_DIR = "/var/www/tilde.chat" r = requests.get("http://localhost:8081/stats") r.raise_for_status() out = {} d = xml.fromstring(r.text) assert d.tag == "inspircdstats" with open(f"{WORK_DIR}/blacklist", "r") as f: BLACKLIST = f.read().splitlines() def define(name, xps, vfilter=lambda x: x): global out out[name] = vfilter(d.findall(xps)[0].text) define("usercount", "./general/usercount", int) define("channelcount", "./general/channelcount", int) schannels = d.findall("./channellist/channel") channels = [] for schannel in schannels: channel = dict( name=schannel.findall("channelname")[0].text, usercount=int(schannel.findall("usercount")[0].text), ) channel["topic"] = ( schannel.findall("./channeltopic/topictext")[0].text if schannel.findall("./channeltopic/topictext")[0].text is not None else "No topic set" ) # bugfix: if mode s is set and there's a topic, hide the topic if ( "s" in schannel.findall("./channelmodes")[0].text.split()[0] and channel["topic"] != "No topic set" ): channel["topic"] = "Topic hidden" if channel["name"] in BLACKLIST: # skip channels in the blacklist continue channel["webchatlink"] = "https://web.tilde.chat/?join=" + channel["name"].lstrip( "#" ) channels.append(channel) channels.sort(key=lambda x: x["name"].lower()) out["channels"] = channels # print([x.text for x in d.findall("./channellist/channel/channeltopic/topictext")]) with open(f"{WORK_DIR}/stats.json", "w") as f: json.dump(out, f)