#!/usr/bin/env python3 from telnetlib import Telnet import toml from flask import Flask, jsonify, render_template_string app = Flask(__name__) def get_users(): with open("secret.toml") as infile: cfg = toml.load(infile) login = ("login %s %s\n" % (cfg["user"], cfg["pass"])).encode("utf-8") with Telnet(cfg["host"], cfg["port"], 5) as tn: print("connection") print(tn.read_until(b"\n").decode("ascii")) print(tn.read_until(b"\n").decode("ascii")) print("----") tn.write(login) print("after login") print(tn.read_until(b"\n").decode("ascii")) print("----") tn.write(b"use 1 -virtual\n") print("after use") print(tn.read_until(b"\n").decode("ascii")) print("----") tn.write(b"clientlist\n") response = tn.read_until(b"\n").decode("ascii") print("after clientlist") print(response) print(tn.read_until(b"\n").decode("ascii")) print("----") # entries separated by |'s entries = response.split("|") # entries contain key=value pairs separated by spaces pairs = [[pr.split("=", 1) for pr in ent.split()] for ent in entries] # rearrange these into maps for convenience entry_maps = [{k: v for k, v in pr} for pr in pairs] # combine the maps into one large map, ignoring serveradmin query user client_info = {info["client_nickname"]: info for info in entry_maps if "serveradmin" not in info["client_nickname"]} for k, v in client_info.items(): tn.write(f"clientinfo clid={v['clid']}\n".encode("utf-8")) response = tn.read_until(b"\n").decode("ascii") print(f"after clientinfo for {k}") print(response) print(tn.read_until(b"\n").decode("ascii")) print("----") # info is key=value pairs separated by spaces pairs = [ent.split("=", 1) for ent in response.split() if "=" in ent] # rearrange into a map and put in the client_info v["client_info"] = {k: v for k, v in pairs} tn.write(b"quit\n") print("after quit") print(tn.read_until(b"\n").decode("ascii")) users = [] for name, info in client_info.items(): user_text = name audio_status = [] if info["client_info"].get("client_input_muted", "0") == "1": audio_status.append("Mic muted") if info["client_info"].get("client_output_muted", "0") == "1": audio_status.append("Sound muted") if len(audio_status) > 0: user_text += f" ({', '.join(audio_status)})" users.append(user_text) return users @app.route("/") def get_status(): return jsonify({"users": get_users()}) @app.route("/page") def get_status_page(): return render_template_string("""