]> rtime.felk.cvut.cz Git - hubacji1/coffee-getter.git/blob - cbgetter.py
Add top drinks ut
[hubacji1/coffee-getter.git] / cbgetter.py
1 # -*- coding: utf-8 -*-
2 """Get data from database and publish them."""
3 from json import dumps
4 from random import randint
5 from requests import post
6 from cbconf import Conf
7 from cbdb import Db
8
9 class CoffeebotGetter:
10     """This class connects configuration, database access and publishing."""
11     def __init__(self):
12         self.cfg = Conf()
13         self.db = Db(self.cfg.getCoffeeDbPath())
14         self.msg = ""
15         self.top = []
16         self.topeq = []
17         self.isuff = {1: "st", 2: "nd", 3: "rd", 4: "th", 5: "th"}
18         return None
19
20     def getMsg(self):
21         """Return message."""
22         return self.msg
23
24     def sendMsgToSlack(self):
25         """Send message to Slack Bot."""
26         return post(self.cfg.getCoffeebotURL(), dumps({"text": self.msg}))
27
28     def getHeroComment(self):
29         """Return comment for hero."""
30         hsuff = [
31             ", oops",
32             " - real hero",
33             " because couldn't resist",
34             " - drunken master",
35             ", woohoo",
36             " - unbeatable",
37             " - superultramaxidrinker",
38             " and didn't sleep last week",
39             " in last 604800 seconds",
40             ", no idea how",
41             " and still drinking",
42         ]
43         ri = randint(0, len(hsuff) - 1)
44         return hsuff[ri]
45
46     def getSomeSmile(self):
47         """Return some Slack smile."""
48         smiles = [
49             ":party_parrot:",
50             ":cat2:",
51             ":heavy_check_mark:",
52             ":baby_bottle:",
53             ":+1:",
54             ":aaw_yeah:",
55             ":better:",
56         ]
57         ri = randint(0, len(smiles) - 1)
58         return smiles[ri]
59
60     def computeEqualDrinkers(self):
61         """Compute equally drunken drinkers."""
62         if len(self.top) <= 0:
63             return
64         lc = self.top[0][1] + 1
65         for (un, c) in self.top:
66             if c < lc:
67                 self.topeq.append([])
68                 lc = c
69             self.topeq[-1].append((un, c))
70         return
71
72     def loadTopMateDrinkers(self):
73         """Get list of top Mate drinkers, update message."""
74         self.msg = "*Top 5 Club-Mate drinkers*\n"
75         self.top = self.db.getTopMateDrinkers()
76         self.computeEqualDrinkers()
77         totl = [c for (un, c) in self.top]
78         tot = sum(totl)
79         i = 1
80         for drinkers in self.topeq[:5]:
81             c = drinkers[0][1]
82             d = [un for (un, c) in drinkers]
83             self.msg += "{}{}".format(i, self.isuff[i])
84             if len(d) > 1:
85                 self.msg += " are "
86             else:
87                 self.msg += " is "
88             for un in d:
89                 if un is d[0]:
90                     self.msg += "*{}*".format(un)
91                 elif un is d[-1]:
92                     self.msg += "" if len(d) == 2 else ","
93                     self.msg += " and *{}*".format(un)
94                 else:
95                     self.msg += ", *{}*".format(un)
96             if len(d) > 1:
97                 self.msg += " of whom each drank "
98             else:
99                 self.msg += " who drank "
100             self.msg += "`{:.2f}` liters".format(c)
101             if i == 1:
102                 self.msg += self.getHeroComment()
103             self.msg += "\n"
104             i += 1
105         self.msg += "\n"
106         self.msg += "Oh, and together we drank *{:.2f}* liters {}".format(
107             tot,
108             self.getSomeSmile()
109         )
110         return
111
112     def load_top_tea_drinkers(self):
113         """Get list of top tea drinkers, update message."""
114         self.msg = "*Top 5 tea drinkers*\n"
115         self.top = self.db.get_top_tea_drinkers()
116         self.computeEqualDrinkers()
117         tot = sum([c for (un, c) in self.top])
118         i = 1
119         for drinkers in self.topeq[:5]:
120             c = drinkers[0][1]
121             d = [un for (un, c) in drinkers]
122             self.msg += "{}{}".format(i, self.isuff[i])
123             if len(d) > 1:
124                 self.msg += " are "
125             else:
126                 self.msg += " is "
127             for un in d:
128                 if un is d[0]:
129                     self.msg += "*{}*".format(un)
130                 elif un is d[-1]:
131                     self.msg += "" if len(d) == 2 else ","
132                     self.msg += " and *{}*".format(un)
133                 else:
134                     self.msg += ", *{}*".format(un)
135             if len(d) > 1:
136                 self.msg += " of whom each drank "
137             else:
138                 self.msg += " who drank "
139             if c > 1:
140                 self.msg += "`{:.2f}` teas".format(c)
141             else:
142                 self.msg += "`{:.2f}` tea".format(c)
143             self.msg += "\n"
144             i += 1
145         self.msg += "\n"
146         self.msg += "Oh, and together we drank *{:.2f}* teas {}".format(
147             tot,
148             self.getSomeSmile()
149         )
150
151     def loadDrunkSum(self, *args, **kwargs):
152         """Get list of drunken ``flavor`` from ``dtf`` to ``dtt``, update msg.
153
154         Keyword arguments:
155         flavor -- The flavor of beverage.
156         dtf -- Date and time *from*.
157         dtt -- Date and time *to*.
158         """
159         self.top = self.db.getDrunkSum(*args, **kwargs)
160         if args:
161             flavor = args[0]
162             dtf = args[1]
163             dtt = args[2]
164         elif kwargs:
165             flavor = kwargs["flavor"]
166             dtf = kwargs["dtf"]
167             dtt = kwargs["dtt"]
168         self.msg = "{} drunk from {} to {}:\n".format(flavor, dtf, dtt)
169         for (un, cnt) in self.top:
170             self.msg += "{}: {}\n".format(un, cnt)
171         self.msg += "---"
172         return
173
174     def loadDrunkList(self, *args, **kwargs):
175         """Get list of drunken ``flavor`` from ``dtf`` to ``dtt``, update msg.
176
177         Keyword arguments:
178         flavor -- The flavor of beverage.
179         dtf -- Date and time *from*.
180         dtt -- Date and time *to*.
181         """
182         self.top = self.db.getDrunkSum(*args, **kwargs)
183         d = self.db.getDrunkList(*args, **kwargs)
184         if args:
185             flavor = args[0]
186             dtf = args[1]
187             dtt = args[2]
188         elif kwargs:
189             flavor = kwargs["flavor"]
190             dtf = kwargs["dtf"]
191             dtt = kwargs["dtt"]
192         self.msg = "{} drunk from {} to {}:\n".format(flavor, dtf, dtt)
193         for (un, l) in d.items():
194             self.msg += "{}: ".format(un)
195             for cnt in l[:-1]:
196                 self.msg += "{}, ".format(cnt)
197             self.msg += "{}\n".format(l[-1])
198         self.msg += "---"
199         return