Browse Source

First pass at extracting additional query info

Kirk Trombley 6 years ago
parent
commit
114ba77af3
1 changed files with 42 additions and 7 deletions
  1. 42 7
      app.py

+ 42 - 7
app.py

@@ -15,25 +15,59 @@ def get_users():
     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")
-        tn.write(b"whoami\n")
+        response = tn.read_until(b"\n").decode("ascii")
+        print("after clientlist")
+        print(response)
+        print(tn.read_until(b"\n").decode("ascii"))
+        print("----")
+
+        # TODO clean this nicely
+        client_info = {info["client_nickname"]: info for info in [{k: v for k, v in [i.split("=", 1) for i in ent.split()]} for ent in response.split("|")] 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("----")
+            v["client_info"] = {k: v for k, v in [ent.split("=", 1) for ent in response.split() if "=" in ent]}
+
         tn.write(b"quit\n")
-        response = tn.read_until(b"virtualserver_status").decode("ascii")
+        print("after quit")
+        print(tn.read_until(b"\n").decode("ascii"))
+
+    import pprint
+    pprint.pprint(client_info)
 
-    return [x.split("=", 1)[1] for x in response.split()
-            if x.startswith("client_nickname") and "serveradmin" not in x]
+    return client_info
 
 
 @app.route("/")
 def get_status():
-    return jsonify({"users": get_users()})
+    return jsonify({"users": list(get_users().keys())})
 
 
 @app.route("/page")
 def get_status_page():
-    users = get_users()
+    info = get_users()
+    users = list(info.keys())
     if len(users) == 0:
         text = "No one in teamspeak!"
     elif len(users) == 1:
@@ -76,4 +110,5 @@ def get_status_page():
 
 
 if __name__ == "__main__":
-    app.run("0.0.0.0", 5000, debug=True, threaded=True)
+    print(get_users())
+    # app.run("0.0.0.0", 5000, debug=True, threaded=True)