This commit is contained in:
Administrator 2022-10-06 23:22:39 +03:00
parent a166c0ef42
commit 51968a1c8f
6 changed files with 80 additions and 4 deletions

View File

@ -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()

53
helpers/events.py Normal file
View File

@ -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()

View File

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

View File

@ -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()

10
main.py
View File

@ -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)

View File

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