diff --git a/entrypoint.py b/entrypoint.py index ad18016..c1cb219 100644 --- a/entrypoint.py +++ b/entrypoint.py @@ -1,8 +1,13 @@ +import logging import sys import main from helpers import jokes + +logging.basicConfig(level=logging.INFO) + + arg = sys.argv[-1] if arg == "poll": jokes.poll_jokes() diff --git a/helpers/events.py b/helpers/events.py new file mode 100644 index 0000000..12303fb --- /dev/null +++ b/helpers/events.py @@ -0,0 +1,53 @@ +import csv +import datetime +import logging +from io import StringIO +from typing import Generator + +from helpers.mongo import mongo + + +class Events: + def __init__(self): + self.collection = mongo.events_collection + self.metrics = ("launch", "joke", "ping") + + @property + def today(self): + date = datetime.datetime.now() + return datetime.datetime(year=date.year, month=date.month, day=date.day) + + @property + def date_range(self) -> Generator[datetime.date, None, None]: + today = self.today + first = today - datetime.timedelta(days=30) + while first <= today: + yield today + today = today - datetime.timedelta(days=1) + + def inc(self, event: str): + if event not in self.metrics: + logging.error("metric is not allowed") + return + query = {"date": self.today, "event": event} + event = self.collection.find_one(query) + if event is None: + query["count"] = 1 + self.collection.insert_one(query) + else: + self.collection.update_one({"_id": event["_id"]}, {"$inc": {"count": 1}}) + + def form_data(self): + si = StringIO() + cw = csv.writer(si) + cw.writerow(["Date"] + list(self.metrics)) + for date in self.date_range: + row = [date.strftime("%y-%m-%d")] + for metric in self.metrics: + data = self.collection.find_one({"date": date, "event": metric}) or {"count": 0} + row.append(str(data["count"])) + cw.writerow(row) + return si.getvalue() + + +events = Events() diff --git a/helpers/jokes.py b/helpers/jokes.py index 7477d7e..1f8bebb 100644 --- a/helpers/jokes.py +++ b/helpers/jokes.py @@ -7,9 +7,6 @@ from requests import get from helpers.mongo import mongo -logging.basicConfig(level=logging.INFO) - - def fetch_jokes(): i = 1 while True: diff --git a/helpers/mongo.py b/helpers/mongo.py index d7dbce3..af5d228 100644 --- a/helpers/mongo.py +++ b/helpers/mongo.py @@ -13,6 +13,10 @@ class Mongo: self.jokes_collection.create_index([ ("id", 1) ]) + self.events_collection.create_index([ + ("date", 1), + ("event", 1) + ]) def __getitem__(self, item): return self.database.get_collection(item) @@ -21,5 +25,9 @@ class Mongo: def jokes_collection(self): return self["jokes"] + @cached_property + def events_collection(self): + return self['events'] + mongo = Mongo() diff --git a/main.py b/main.py index d04a222..977770f 100644 --- a/main.py +++ b/main.py @@ -1,5 +1,6 @@ -from flask import Flask, request +from flask import Flask, request, make_response +from helpers.events import events from processor import Processor @@ -20,4 +21,11 @@ def run(): response['response'].update(processor.process()) return response + @app.route('/stats', methods=['GET']) + def stats(): + output = make_response(events.form_data()) + output.headers["Content-Disposition"] = "attachment; filename=stats.csv" + output.headers["Content-type"] = "text/csv" + return output + app.run(host="0.0.0.0", port=8000) diff --git a/processor.py b/processor.py index 87a07b6..684e399 100644 --- a/processor.py +++ b/processor.py @@ -1,5 +1,6 @@ from functools import cached_property +from helpers.events import events from helpers.jokes import get_random @@ -10,6 +11,7 @@ class Processor: self.user_id = data['session']['user']['user_id'] else: self.user_id = None + events.inc("ping") self.message = data['request']['original_utterance'].lower() def next(self): @@ -46,11 +48,14 @@ class Processor: def process(self) -> dict: if self.data['session']['new']: + if self.user_id is not None: + events.inc("launch") return { "text": "Привет! Сейчас мы с тобой пошутим! Чтобы услышать смешную шутеечку, скажи \"следующий\" или \"дальше\". Если ты устал и хочешь закончить, скажи \"закончить\" или \"хватит\". " "Держи первый анекдот:\n" f"{get_random()}" } + events.inc("joke") action = None for key, value in self.handlers.items(): if key in self.message: