events
This commit is contained in:
parent
a166c0ef42
commit
51968a1c8f
@ -1,8 +1,13 @@
|
|||||||
|
import logging
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
import main
|
import main
|
||||||
from helpers import jokes
|
from helpers import jokes
|
||||||
|
|
||||||
|
|
||||||
|
logging.basicConfig(level=logging.INFO)
|
||||||
|
|
||||||
|
|
||||||
arg = sys.argv[-1]
|
arg = sys.argv[-1]
|
||||||
if arg == "poll":
|
if arg == "poll":
|
||||||
jokes.poll_jokes()
|
jokes.poll_jokes()
|
||||||
|
53
helpers/events.py
Normal file
53
helpers/events.py
Normal 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()
|
@ -7,9 +7,6 @@ from requests import get
|
|||||||
from helpers.mongo import mongo
|
from helpers.mongo import mongo
|
||||||
|
|
||||||
|
|
||||||
logging.basicConfig(level=logging.INFO)
|
|
||||||
|
|
||||||
|
|
||||||
def fetch_jokes():
|
def fetch_jokes():
|
||||||
i = 1
|
i = 1
|
||||||
while True:
|
while True:
|
||||||
|
@ -13,6 +13,10 @@ class Mongo:
|
|||||||
self.jokes_collection.create_index([
|
self.jokes_collection.create_index([
|
||||||
("id", 1)
|
("id", 1)
|
||||||
])
|
])
|
||||||
|
self.events_collection.create_index([
|
||||||
|
("date", 1),
|
||||||
|
("event", 1)
|
||||||
|
])
|
||||||
|
|
||||||
def __getitem__(self, item):
|
def __getitem__(self, item):
|
||||||
return self.database.get_collection(item)
|
return self.database.get_collection(item)
|
||||||
@ -21,5 +25,9 @@ class Mongo:
|
|||||||
def jokes_collection(self):
|
def jokes_collection(self):
|
||||||
return self["jokes"]
|
return self["jokes"]
|
||||||
|
|
||||||
|
@cached_property
|
||||||
|
def events_collection(self):
|
||||||
|
return self['events']
|
||||||
|
|
||||||
|
|
||||||
mongo = Mongo()
|
mongo = Mongo()
|
||||||
|
10
main.py
10
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
|
from processor import Processor
|
||||||
|
|
||||||
|
|
||||||
@ -20,4 +21,11 @@ def run():
|
|||||||
response['response'].update(processor.process())
|
response['response'].update(processor.process())
|
||||||
return response
|
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)
|
app.run(host="0.0.0.0", port=8000)
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
from functools import cached_property
|
from functools import cached_property
|
||||||
|
|
||||||
|
from helpers.events import events
|
||||||
from helpers.jokes import get_random
|
from helpers.jokes import get_random
|
||||||
|
|
||||||
|
|
||||||
@ -10,6 +11,7 @@ class Processor:
|
|||||||
self.user_id = data['session']['user']['user_id']
|
self.user_id = data['session']['user']['user_id']
|
||||||
else:
|
else:
|
||||||
self.user_id = None
|
self.user_id = None
|
||||||
|
events.inc("ping")
|
||||||
self.message = data['request']['original_utterance'].lower()
|
self.message = data['request']['original_utterance'].lower()
|
||||||
|
|
||||||
def next(self):
|
def next(self):
|
||||||
@ -46,11 +48,14 @@ class Processor:
|
|||||||
|
|
||||||
def process(self) -> dict:
|
def process(self) -> dict:
|
||||||
if self.data['session']['new']:
|
if self.data['session']['new']:
|
||||||
|
if self.user_id is not None:
|
||||||
|
events.inc("launch")
|
||||||
return {
|
return {
|
||||||
"text": "Привет! Сейчас мы с тобой пошутим! Чтобы услышать смешную шутеечку, скажи \"следующий\" или \"дальше\". Если ты устал и хочешь закончить, скажи \"закончить\" или \"хватит\". "
|
"text": "Привет! Сейчас мы с тобой пошутим! Чтобы услышать смешную шутеечку, скажи \"следующий\" или \"дальше\". Если ты устал и хочешь закончить, скажи \"закончить\" или \"хватит\". "
|
||||||
"Держи первый анекдот:\n"
|
"Держи первый анекдот:\n"
|
||||||
f"{get_random()}"
|
f"{get_random()}"
|
||||||
}
|
}
|
||||||
|
events.inc("joke")
|
||||||
action = None
|
action = None
|
||||||
for key, value in self.handlers.items():
|
for key, value in self.handlers.items():
|
||||||
if key in self.message:
|
if key in self.message:
|
||||||
|
Loading…
Reference in New Issue
Block a user