From 06d3dd4d7e3f790aab8e071e136a5034ba585ad9 Mon Sep 17 00:00:00 2001 From: Mark Veidemanis Date: Tue, 8 Oct 2019 18:15:23 +0100 Subject: [PATCH] Implement storing analytics on a LIST response --- core/bot.py | 25 ++++++++++++++++++++++--- modules/chankeep.py | 44 ++++++++++++++++++++++++++++++++++++++++++++ modules/network.py | 1 + 3 files changed, 67 insertions(+), 3 deletions(-) diff --git a/core/bot.py b/core/bot.py index 7ac0820..5c3dc9b 100644 --- a/core/bot.py +++ b/core/bot.py @@ -11,6 +11,7 @@ from copy import deepcopy from modules import userinfo from modules import counters from modules import monitor +from modules import chankeep from core.relay import sendRelayNotification from utils.dedup import dedup @@ -119,6 +120,8 @@ class IRCBot(IRCClient): self._tempList = ([], []) # Temporary storage for gathering LIST info self.listOngoing = False + self.chanLimit = 0 + def parsen(self, user): step = user.split("!") nick = step[0] @@ -314,13 +317,15 @@ class IRCBot(IRCClient): d = Deferred() self._tempList = ([], []) self._tempList[0].append(d) - self.sendLine("LIST") + self.sendLine("LIST >0") return d def list(self): if not self.listOngoing: self._list().addCallback(self.got_list) - self.listOngoing = True + + def irc_RPL_LISTSTART(self, prefix, params): + self.listOngoing = True def irc_RPL_LIST(self, prefix, params): channel = params[1] @@ -337,7 +342,20 @@ class IRCBot(IRCClient): self._tempList[1].clear() def got_list(self, listinfo): - print("have list", listinfo) + chankeep.initialList(self.net, self.num, listinfo, self.chanLimit) + + def isupport(self, options): + for i in options: + if i.startswith("CHANLIMIT"): + if "#" in i: + split = i.split("#") + if len(split) >= 2: + chanLimit = split[-1].replace(":", "") + try: + self.chanLimit = int(chanLimit) + return + except TypeError: + error("Invalid CHANLIMIT: %s" % i) #twisted sucks so i have to do this to actually get the user info def irc_JOIN(self, prefix, params): @@ -489,6 +507,7 @@ class IRCBotFactory(ReconnectingClientFactory): def __init__(self, net, num=None, relayCommands=None, user=None, stage2=None): if net == None: self.num = num + self.net = None self.name = "relay - %i" % num self.relay = True else: diff --git a/modules/chankeep.py b/modules/chankeep.py index 8ee9bae..0f18e9b 100644 --- a/modules/chankeep.py +++ b/modules/chankeep.py @@ -1 +1,45 @@ import main +from utils.logging.log import * + +# make this into a threaded function +def initialList(net, num, listinfo, chanLimit): + #listinfo = sorted(listinfo, key=lambda x: xdd[0]) + listLength = len(listinfo) + cumul = 0 + try: + cumul += sum(int(i[1]) for i in listinfo) + except TypeError: + warn("Bad LIST data received from %s - %i" % (net, num)) + return + mean = cumul/listLength + sigLength = 0 + insigLength = 0 + sigCumul = 0 + insigCumul = 0 + for i in listinfo: + if int(i[1]) > mean: + sigLength += 1 + sigCumul += int(i[1]) + elif int(i[1]) < mean: + insigLength += 1 + insigCumul += int(i[1]) + + if not net in main.network.keys(): + warn("Cannot write list info - no network entry for %s" % net) + return + main.network[net].list["mean"] = mean + main.network[net].list["total"] = listLength + main.network[net].list["sigtotal"] = sigLength + main.network[net].list["insigtotal"] = insigLength + main.network[net].list["sigperc"] = sigLength/listLength*100 + main.network[net].list["insigperc"] = insigLength/listLength*100 + main.network[net].list["cumul"] = cumul + main.network[net].list["sigcumul"] = sigCumul + main.network[net].list["insigcumul"] = insigCumul + main.network[net].list["relay"] = listLength/chanLimit + main.network[net].list["sigrelay"] = sigLength/chanLimit + main.network[net].list["insigrelay"] = insigLength/chanLimit + + # Rounding + main.network[net].list = {x: round(y, 4) for x, y in main.network[net].list.items()} + main.saveConf("network") diff --git a/modules/network.py b/modules/network.py index fbcfaa4..a958cc1 100644 --- a/modules/network.py +++ b/modules/network.py @@ -19,6 +19,7 @@ class Network: self.last = 0 self.relays = {} self.aliases = {} + self.list = {} def add_relay(self, num=None): if not num: