]> rtime.felk.cvut.cz Git - hubacji1/coffee-getter.git/blob - coffee_getter/bot.py
Rework bot
[hubacji1/coffee-getter.git] / coffee_getter / bot.py
1 """Get data from database and publish them."""
2 from json import dumps
3 from random import randint
4 from requests import post
5 from coffee_getter.db import Db
6 import coffee_getter.conf as conf
7
8
9 class Bot:
10     isuff = {1: "st", 2: "nd", 3: "rd", 4: "th", 5: "th"}
11
12     def __init__(self, db_path=False):
13         if db_path:
14             self.db = Db(db_path)
15         else:
16             self.db = Db(conf.DB_PATH)
17         self.msg = ""
18         self.top = []
19         self.topeq = []
20
21     def get_msg(self):
22         return self.msg
23
24     def send_msg_to(self, where="slack"):
25         if where == "slack":
26             where = conf.COFFEEBOT_SLACK_URL
27         else:
28             raise ValueError(f"Unknown `where` = {where}.")
29         return post(where, dumps({"text": self.msg}))
30
31     def get_drink_smile(self, drink):
32         """Return Slack smile for ``drink``.
33
34         Keyword arguments:
35         drink -- Drink of smile.
36         """
37         smiles = {
38             "tea": ":tea:",
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:",
45         }
46         return smiles[drink]
47
48     def get_hero_comment(self):
49         """Return comment for hero."""
50         hsuff = [
51             ", oops",
52             " - real hero",
53             " because couldn't resist",
54             " - drunken master",
55             ", woohoo",
56             " - unbeatable",
57             " - superultramaxidrinker",
58             " and didn't sleep last week",
59             " in last 604800 seconds",
60             ", no idea how",
61             " and still drinking",
62         ]
63         ri = randint(0, len(hsuff) - 1)
64         return hsuff[ri]
65
66     def get_some_smile(self):
67         """Return some Slack smile."""
68         smiles = [
69             ":party_parrot:",
70             ":cat2:",
71             ":heavy_check_mark:",
72             ":baby_bottle:",
73             ":+1:",
74             ":aaw_yeah:",
75             ":better:",
76         ]
77         ri = randint(0, len(smiles) - 1)
78         return smiles[ri]
79
80     def compute_equal_drinkers(self):
81         """Compute equally drunken drinkers."""
82         self.topeq = []
83         if len(self.top) <= 0:
84             return
85         lc = self.top[0][1] + 1
86         for (un, c) in self.top:
87             if c < lc:
88                 self.topeq.append([])
89                 lc = c
90             self.topeq[-1].append((un, c))
91         return
92
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()
98         i = 1
99         for drinks in self.topeq[:3]:
100             c = drinks[0][1]
101             d = [un for (un, c) in drinks]
102             self.msg += "{}{}".format(i, self.isuff[i])
103             if len(d) > 1:
104                 self.msg += " are "
105             else:
106                 self.msg += " is "
107             for un in d:
108                 if un is d[0]:
109                     self.msg += "{}".format(self.get_drink_smile(un))
110                 elif un is d[-1]:
111                     self.msg += "" if len(d) == 2 else ","
112                     self.msg += " and {}".format(self.get_drink_smile(un))
113                 else:
114                     self.msg += ", *{}*".format(self.get_drink_smile(un))
115             if len(d) > 1:
116                 self.msg += " with each of "
117             else:
118                 self.msg += " with "
119             self.msg += "`{}` drunk".format(c)
120             self.msg += "\n"
121             i += 1
122
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]
129         tot = sum(totl)
130         i = 1
131         for drinkers in self.topeq[:5]:
132             c = drinkers[0][1]
133             d = [un for (un, c) in drinkers]
134             self.msg += "{}{}".format(i, self.isuff[i])
135             if len(d) > 1:
136                 self.msg += " are "
137             else:
138                 self.msg += " is "
139             for un in d:
140                 if un is d[0]:
141                     self.msg += "*{}*".format(un)
142                 elif un is d[-1]:
143                     self.msg += "" if len(d) == 2 else ","
144                     self.msg += " and *{}*".format(un)
145                 else:
146                     self.msg += ", *{}*".format(un)
147             if len(d) > 1:
148                 self.msg += " of whom each drank "
149             else:
150                 self.msg += " who drank "
151             self.msg += "`{:.2f}` liters".format(c)
152             if i == 1:
153                 self.msg += self.get_hero_comment()
154             self.msg += "\n"
155             i += 1
156         self.msg += "\n"
157         self.msg += "Oh, and together we drank *{:.2f}* liters {}".format(
158             tot,
159             self.get_some_smile()
160         )
161         return
162
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])
169         i = 1
170         for drinkers in self.topeq[:5]:
171             c = drinkers[0][1]
172             d = [un for (un, c) in drinkers]
173             self.msg += "{}{}".format(i, self.isuff[i])
174             if len(d) > 1:
175                 self.msg += " are "
176             else:
177                 self.msg += " is "
178             for un in d:
179                 if un is d[0]:
180                     self.msg += "*{}*".format(un)
181                 elif un is d[-1]:
182                     self.msg += "" if len(d) == 2 else ","
183                     self.msg += " and *{}*".format(un)
184                 else:
185                     self.msg += ", *{}*".format(un)
186             if len(d) > 1:
187                 self.msg += " of whom each drank "
188             else:
189                 self.msg += " who drank "
190             if c > 1:
191                 self.msg += "`{}` teas".format(c)
192             else:
193                 self.msg += "`{}` tea".format(c)
194             self.msg += "\n"
195             i += 1
196         self.msg += "\n"
197         self.msg += "Oh, and together we drank *{}* teas {}".format(
198             tot,
199             self.get_some_smile()
200         )
201
202     def load_drunk_sum(self, *args, **kwargs):
203         """Get list of drunken ``flavor`` from ``dtf`` to ``dtt``, update msg.
204
205         Keyword arguments:
206         flavor -- The flavor of beverage.
207         dtf -- Date and time *from*.
208         dtt -- Date and time *to*.
209         """
210         self.top = self.db.get_drunk_sum(*args, **kwargs)
211         if args:
212             flavor = args[0]
213             dtf = args[1]
214             dtt = args[2]
215         elif kwargs:
216             flavor = kwargs["flavor"]
217             dtf = kwargs["dtf"]
218             dtt = kwargs["dtt"]
219         self.msg = "{} drunk from {} to {}:\n".format(flavor, dtf, dtt)
220         for (un, cnt) in self.top:
221             self.msg += "{}: {}\n".format(un, cnt)
222         self.msg += "---"
223         return
224
225     def load_drunk_list(self, *args, **kwargs):
226         """Get list of drunken ``flavor`` from ``dtf`` to ``dtt``, update msg.
227
228         Keyword arguments:
229         flavor -- The flavor of beverage.
230         dtf -- Date and time *from*.
231         dtt -- Date and time *to*.
232         """
233         self.top = self.db.get_drunk_sum(*args, **kwargs)
234         d = self.db.getDrunkList(*args, **kwargs)
235         if args:
236             flavor = args[0]
237             dtf = args[1]
238             dtt = args[2]
239         elif kwargs:
240             flavor = kwargs["flavor"]
241             dtf = kwargs["dtf"]
242             dtt = kwargs["dtt"]
243         self.msg = "{} drunk from {} to {}:\n".format(flavor, dtf, dtt)
244         for (un, l) in d.items():
245             self.msg += "{}: ".format(un)
246             for cnt in l[:-1]:
247                 self.msg += "{}, ".format(cnt)
248             self.msg += "{}\n".format(l[-1])
249         self.msg += "---"
250         return