Accept queries for stats by privmsg.
This commit is contained in:
Родитель
b9c5dab349
Коммит
b9e67e5b5e
|
@ -62,11 +62,44 @@ class Bot(irc.client.SimpleIRCClient):
|
|||
self.stats_thread.daemon = True
|
||||
self.stats_thread.start()
|
||||
|
||||
def on_privmsg(self, connection, event):
|
||||
nick = event.source.nick
|
||||
|
||||
response = self.do_command(event.arguments[0])
|
||||
for line in response:
|
||||
self.connection.privmsg(nick, line)
|
||||
|
||||
def on_disconnect(self, connection, event):
|
||||
# TODO: Retry, with an exponential backoff timer.
|
||||
logging.warn('Disconnected! %s' % event)
|
||||
raise SystemExit()
|
||||
|
||||
def do_command(self, cmd_line):
|
||||
cmd_parts = cmd_line.split()
|
||||
cmd = cmd_parts[0]
|
||||
cmd_args = cmd_parts[1:]
|
||||
|
||||
response = []
|
||||
|
||||
if cmd == 'stats':
|
||||
cmd_args = cmd_args[:2]
|
||||
stats_dict = self.stats.get_stats(*cmd_args)
|
||||
for vernum, queries in stats_dict.iteritems():
|
||||
for query, value in queries.iteritems():
|
||||
response.append('%s (%s) %s: %s' % (
|
||||
self.stats.version_names[vernum],
|
||||
vernum,
|
||||
self.stats.query_names[query],
|
||||
value
|
||||
))
|
||||
response.sort()
|
||||
if not response:
|
||||
response = ['not found']
|
||||
else:
|
||||
response = ['unknown command "%s"' % cmd]
|
||||
|
||||
return response
|
||||
|
||||
def poll_stats_loop(self):
|
||||
while True:
|
||||
now = time.time()
|
||||
|
|
|
@ -19,6 +19,8 @@ class Stats(object):
|
|||
self.version_callback = version_callback
|
||||
self._redis_client = None
|
||||
self._bzconfig = None
|
||||
self._version_names = None
|
||||
self._query_names = None
|
||||
|
||||
@property
|
||||
def redis_client(self):
|
||||
|
@ -36,8 +38,27 @@ class Stats(object):
|
|||
k: json.loads(v) for k, v in
|
||||
self.redis_client.hgetall('bzconfig').iteritems()
|
||||
}
|
||||
self._version_names = None
|
||||
self._query_names = None
|
||||
return self._bzconfig
|
||||
|
||||
@property
|
||||
def version_names(self):
|
||||
if not self._version_names:
|
||||
self._version_names = {
|
||||
v['version']: v['title'] for v
|
||||
in self._bzconfig['versions'].values()
|
||||
}
|
||||
return self._version_names
|
||||
|
||||
@property
|
||||
def query_names(self):
|
||||
if not self._query_names:
|
||||
self._query_names = {
|
||||
q['id']: q['title'] for q in self._bzconfig['bugQueries']
|
||||
}
|
||||
return self._query_names
|
||||
|
||||
def refresh_bzconfig(self):
|
||||
"""Store the releasehealth dashboard's Bugzilla config.
|
||||
|
||||
|
@ -65,6 +86,39 @@ class Stats(object):
|
|||
logging.error('Error fetching bzconfig from %s: status %s' %
|
||||
(config.BZCONFIG_JSON_URL, r.status_code))
|
||||
|
||||
def get_stats(self, version=None, query=None):
|
||||
if version and version != '*':
|
||||
try:
|
||||
versions = [int(version)]
|
||||
except ValueError:
|
||||
versions = [self.bzconfig['versions'][version]]
|
||||
else:
|
||||
versions = [x['version'] for x
|
||||
in self.bzconfig['versions'].values()]
|
||||
|
||||
if query and query != '*':
|
||||
query = query.lower()
|
||||
queries = [
|
||||
x['id'] for x in self.bzconfig['bugQueries']
|
||||
if x['title'].replace(' ', '').lower().startswith(query)
|
||||
]
|
||||
else:
|
||||
queries = [x['id'] for x in self.bzconfig['bugQueries']]
|
||||
|
||||
results = {}
|
||||
|
||||
for v in versions:
|
||||
results[v] = {}
|
||||
for q in queries:
|
||||
key = '%s:%s' % (v, q)
|
||||
try:
|
||||
results[v][q] = json.loads(
|
||||
self.redis_client.lindex(key, 0))[0]
|
||||
except TypeError:
|
||||
pass
|
||||
|
||||
return results
|
||||
|
||||
def refresh_stats(self):
|
||||
for ver in self.bzconfig['versions'].values():
|
||||
for query in self.bzconfig['bugQueries']:
|
||||
|
|
Загрузка…
Ссылка в новой задаче