Accept queries for stats by privmsg.

This commit is contained in:
Mark Côté 2016-04-17 01:52:01 -04:00
Родитель b9c5dab349
Коммит b9e67e5b5e
2 изменённых файлов: 87 добавлений и 0 удалений

Просмотреть файл

@ -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']: