1 """Get data from database and publish them."""
3 from random import randint
4 from requests import post
5 from coffee_getter.db import Db
6 import coffee_getter.conf as conf
10 isuff = {1: "st", 2: "nd", 3: "rd", 4: "th", 5: "th"}
12 def __init__(self, db_path=False):
16 self.db = Db(conf.DB_PATH)
24 def send_msg_to(self, where="slack"):
26 where = conf.COFFEEBOT_SLACK_URL
28 raise ValueError(f"Unknown `where` = {where}.")
29 return post(where, dumps({"text": self.msg}))
31 def get_drink_smile(self, drink):
32 """Return Slack smile for ``drink``.
35 drink -- Drink of smile.
39 "espresso": ":coffee:",
40 "espresso lungo": ":owl:",
41 "cappuccino": ":flara:",
42 "latte macchiato": ":baby_bottle:",
43 "Club-Mate 0,5 l": ":club-mate:",
44 "Club-Mate 0,33 l": ":club-mate_cola:",
48 def get_hero_comment(self):
49 """Return comment for hero."""
53 " because couldn't resist",
57 " - superultramaxidrinker",
58 " and didn't sleep last week",
59 " in last 604800 seconds",
61 " and still drinking",
63 ri = randint(0, len(hsuff) - 1)
66 def get_some_smile(self):
67 """Return some Slack smile."""
77 ri = randint(0, len(smiles) - 1)
80 def compute_equal_drinkers(self):
81 """Compute equally drunken drinkers."""
83 if len(self.top) <= 0:
85 lc = self.top[0][1] + 1
86 for (un, c) in self.top:
90 self.topeq[-1].append((un, c))
93 def load_top_drinks(self):
94 """Get list of top drinks, update message."""
95 self.msg = "*Top drinks*\n"
96 self.top = self.db.get_top_drinks()
97 self.compute_equal_drinkers()
99 for drinks in self.topeq[:3]:
101 d = [un for (un, c) in drinks]
102 self.msg += "{}{}".format(i, self.isuff[i])
109 self.msg += "{}".format(self.get_drink_smile(un))
111 self.msg += "" if len(d) == 2 else ","
112 self.msg += " and {}".format(self.get_drink_smile(un))
114 self.msg += ", *{}*".format(self.get_drink_smile(un))
116 self.msg += " with each of "
119 self.msg += "`{}` drunk".format(c)
123 def load_top_mate_drinkers(self):
124 """Get list of top Mate drinkers, update message."""
125 self.msg = "*Top 5 Club-Mate drinkers*\n"
126 self.top = self.db.get_top_mate_drinkers()
127 self.compute_equal_drinkers()
128 totl = [c for (un, c) in self.top]
131 for drinkers in self.topeq[:5]:
133 d = [un for (un, c) in drinkers]
134 self.msg += "{}{}".format(i, self.isuff[i])
141 self.msg += "*{}*".format(un)
143 self.msg += "" if len(d) == 2 else ","
144 self.msg += " and *{}*".format(un)
146 self.msg += ", *{}*".format(un)
148 self.msg += " of whom each drank "
150 self.msg += " who drank "
151 self.msg += "`{:.2f}` liters".format(c)
153 self.msg += self.get_hero_comment()
157 self.msg += "Oh, and together we drank *{:.2f}* liters {}".format(
159 self.get_some_smile()
163 def load_top_tea_drinkers(self):
164 """Get list of top tea drinkers, update message."""
165 self.msg = "*Top 5 tea drinkers*\n"
166 self.top = self.db.get_top_tea_drinkers()
167 self.compute_equal_drinkers()
168 tot = sum([c for (un, c) in self.top])
170 for drinkers in self.topeq[:5]:
172 d = [un for (un, c) in drinkers]
173 self.msg += "{}{}".format(i, self.isuff[i])
180 self.msg += "*{}*".format(un)
182 self.msg += "" if len(d) == 2 else ","
183 self.msg += " and *{}*".format(un)
185 self.msg += ", *{}*".format(un)
187 self.msg += " of whom each drank "
189 self.msg += " who drank "
191 self.msg += "`{}` teas".format(c)
193 self.msg += "`{}` tea".format(c)
197 self.msg += "Oh, and together we drank *{}* teas {}".format(
199 self.get_some_smile()
202 def load_drunk_sum(self, flavor, dtf, dtt):
203 """Get list of drunken ``flavor`` from ``dtf`` to ``dtt``, update msg.
206 flavor -- The flavor of beverage.
207 dtf -- Date and time *from*.
208 dtt -- Date and time *to*.
210 self.top = self.db.get_drunk_sum(flavor, dtf, dtt)
211 self.msg = "{} drunk from {} to {}:\n".format(flavor, dtf, dtt)
212 for (un, cnt) in self.top:
213 self.msg += "{}: {}\n".format(un, cnt)
217 def load_drunk_list(self, flavor, dtf, dtt):
218 """Get list of drunken ``flavor`` from ``dtf`` to ``dtt``, update msg.
221 flavor -- The flavor of beverage.
222 dtf -- Date and time *from*.
223 dtt -- Date and time *to*.
225 self.top = self.db.get_drunk_sum(flavor, dtf, dtt)
226 d = self.db.get_drunk_list(flavor, dtf, dtt)
227 self.msg = "{} drunk from {} to {}:\n".format(flavor, dtf, dtt)
228 for (un, l) in d.items():
229 self.msg += "{}: ".format(un)
231 self.msg += "{}, ".format(cnt)
232 self.msg += "{}\n".format(l[-1])