From 836e6210632de209a94bc1a78160b9e9e53239e8 Mon Sep 17 00:00:00 2001 From: Mark Veidemanis Date: Sat, 13 Aug 2022 13:27:20 +0100 Subject: [PATCH] Implement getting LIST information from API --- api/views.py | 14 ++++++++++---- modules/chankeep.py | 43 ++++++++++++++++++++++++++++++++----------- 2 files changed, 42 insertions(+), 15 deletions(-) diff --git a/api/views.py b/api/views.py index ce236a4..60765c0 100644 --- a/api/views.py +++ b/api/views.py @@ -198,7 +198,6 @@ class API(object): def irc_network(self, request, net): if net not in main.network.keys(): return dumps({"success": False, "reason": "no such net."}) - first_relay = helpers.get_first_relay(net) inst = main.network[net] network = {} network["net"] = inst.net @@ -210,9 +209,6 @@ class API(object): network["relays"] = len(inst.relays) network["channels"] = userinfo.getTotalChanNum(net) network["records"] = userinfo.getNumWhoEntries(net) - if first_relay: - network["chanlimit_live"] = first_relay.chanlimit - network["chanlimit_conf"] = inst.chanlimit return dumps(network) @app.route("/irc/network//", methods=["DELETE"]) @@ -483,6 +479,15 @@ class API(object): first_relay.list() return dumps({"success": True, "message": f"requested list with instance {first_relay.num} of {net}"}) + @app.route("/irc/list//", methods=["GET"]) + @login_required + def get_irc_list_info(self, request, net): + if net not in main.network.keys(): + return dumps({"success": False, "reason": "no such net."}) + listinfo = chankeep.getListInfo(net) + return dumps({"success": True, "listinfo": listinfo}) + + @app.route("/irc/msg////", methods=["PUT"]) @login_required def irc_send_message(self, request, net, num, channel): @@ -527,3 +532,4 @@ class API(object): if name not in main.IRCPool.keys(): return dumps({"success": False, "reason": f"relay {num} not on {net}"}) return dumps({"nickname": main.IRCPool[name].nickname}) + diff --git a/modules/chankeep.py b/modules/chankeep.py index 85865f2..0de8baf 100644 --- a/modules/chankeep.py +++ b/modules/chankeep.py @@ -347,21 +347,22 @@ def _initialList(net, num, listinfo, chanlimit): relay = ceil(listlength / chanlimit) abase = "analytics.list.%s" % net + main.g.delete(abase) p = main.g.pipeline() # See docstring for meanings p.hset(abase, "mean", mean) - p.hset(abase, "total", listlength) - p.hset(abase, "sigtotal", siglength) - p.hset(abase, "insigtotal", insiglength) - p.hset(abase, "sigperc", round(siglength / listlength * 100, 2)) - p.hset(abase, "insigperc", round(insiglength / listlength * 100, 2)) - p.hset(abase, "cumul", cumul) - p.hset(abase, "sigcumul", sigcumul) - p.hset(abase, "insigcumul", insigcumul) - p.hset(abase, "relay", relay) - p.hset(abase, "sigrelay", sigrelay) - p.hset(abase, "insigrelay", ceil(insiglength / chanlimit)) + p.hset(abase, "total_chans", listlength) + p.hset(abase, "big_chans", siglength) + p.hset(abase, "small_chans", insiglength) + p.hset(abase, "big_chan_perc", round(siglength / listlength * 100, 2)) + p.hset(abase, "small_chan_perc", round(insiglength / listlength * 100, 2)) + p.hset(abase, "total_cumul_mem", cumul) + p.hset(abase, "big_chan_cumul_mem", sigcumul) + p.hset(abase, "small_chan_cumul_mem", insigcumul) + p.hset(abase, "relays_for_all_chans", relay) + p.hset(abase, "relays_for_big_chans", sigrelay) + p.hset(abase, "relays_for_small_chans", ceil(insiglength / chanlimit)) debug( ( f"_initialList() net:{net} num:{num} listlength:{listlength} " @@ -383,6 +384,26 @@ def _initialList(net, num, listinfo, chanlimit): # return (listinfo, mean, sigrelay, relay) +def convert(data): + """ + Recursively convert a dictionary. + """ + if isinstance(data, bytes): + return data.decode("ascii") + if isinstance(data, dict): + return dict(map(convert, data.items())) + if isinstance(data, tuple): + return map(convert, data) + if isinstance(data, list): + return list(map(convert, data)) + return data + + +def getListInfo(net): + abase = f"analytics.list.{net}" + info = main.g.hgetall(abase) + return convert(info) + def initialList(net, num, listinfo, chanlimit): """