]> rtime.felk.cvut.cz Git - hubacji1/coffee-getter.git/blob - cbgetter.py
4c4992ec2499d0a54550b3d86d6f553c98b33b5a
[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 get_drink_smile(self, drink):
29         """Return Slack smile for ``drink``.
30
31         Keyword arguments:
32         drink -- Drink of smile.
33         """
34         smiles = {
35             "tea": ":tea:",
36             "espresso": ":coffee:",
37             "espresso lungo": ":coffin:",
38             "cappuccino": ":flara:",
39             "latte macchiato": ":baby_bottle:",
40             "Club-Mate 0,5 l": ":club-mate:",
41             "Club-Mate 0,33 l": ":club-mate_cola:",
42         }
43         return smiles[drink]
44
45     def getHeroComment(self):
46         """Return comment for hero."""
47         hsuff = [
48             ", oops",
49             " - real hero",
50             " because couldn't resist",
51             " - drunken master",
52             ", woohoo",
53             " - unbeatable",
54             " - superultramaxidrinker",
55             " and didn't sleep last week",
56             " in last 604800 seconds",
57             ", no idea how",
58             " and still drinking",
59         ]
60         ri = randint(0, len(hsuff) - 1)
61         return hsuff[ri]
62
63     def getSomeSmile(self):
64         """Return some Slack smile."""
65         smiles = [
66             ":party_parrot:",
67             ":cat2:",
68             ":heavy_check_mark:",
69             ":baby_bottle:",
70             ":+1:",
71             ":aaw_yeah:",
72             ":better:",
73         ]
74         ri = randint(0, len(smiles) - 1)
75         return smiles[ri]
76
77     def computeEqualDrinkers(self):
78         """Compute equally drunken drinkers."""
79         if len(self.top) <= 0:
80             return
81         lc = self.top[0][1] + 1
82         for (un, c) in self.top:
83             if c < lc:
84                 self.topeq.append([])
85                 lc = c
86             self.topeq[-1].append((un, c))
87         return
88
89     def loadTopMateDrinkers(self):
90         """Get list of top Mate drinkers, update message."""
91         self.msg = "*Top 5 Club-Mate drinkers*\n"
92         self.top = self.db.getTopMateDrinkers()
93         self.computeEqualDrinkers()
94         totl = [c for (un, c) in self.top]
95         tot = sum(totl)
96         i = 1
97         for drinkers in self.topeq[:5]:
98             c = drinkers[0][1]
99             d = [un for (un, c) in drinkers]
100             self.msg += "{}{}".format(i, self.isuff[i])
101             if len(d) > 1:
102                 self.msg += " are "
103             else:
104                 self.msg += " is "
105             for un in d:
106                 if un is d[0]:
107                     self.msg += "*{}*".format(un)
108                 elif un is d[-1]:
109                     self.msg += "" if len(d) == 2 else ","
110                     self.msg += " and *{}*".format(un)
111                 else:
112                     self.msg += ", *{}*".format(un)
113             if len(d) > 1:
114                 self.msg += " of whom each drank "
115             else:
116                 self.msg += " who drank "
117             self.msg += "`{:.2f}` liters".format(c)
118             if i == 1:
119                 self.msg += self.getHeroComment()
120             self.msg += "\n"
121             i += 1
122         self.msg += "\n"
123         self.msg += "Oh, and together we drank *{:.2f}* liters {}".format(
124             tot,
125             self.getSomeSmile()
126         )
127         return
128
129     def load_top_tea_drinkers(self):
130         """Get list of top tea drinkers, update message."""
131         self.msg = "*Top 5 tea drinkers*\n"
132         self.top = self.db.get_top_tea_drinkers()
133         self.computeEqualDrinkers()
134         tot = sum([c for (un, c) in self.top])
135         i = 1
136         for drinkers in self.topeq[:5]:
137             c = drinkers[0][1]
138             d = [un for (un, c) in drinkers]
139             self.msg += "{}{}".format(i, self.isuff[i])
140             if len(d) > 1:
141                 self.msg += " are "
142             else:
143                 self.msg += " is "
144             for un in d:
145                 if un is d[0]:
146                     self.msg += "*{}*".format(un)
147                 elif un is d[-1]:
148                     self.msg += "" if len(d) == 2 else ","
149                     self.msg += " and *{}*".format(un)
150                 else:
151                     self.msg += ", *{}*".format(un)
152             if len(d) > 1:
153                 self.msg += " of whom each drank "
154             else:
155                 self.msg += " who drank "
156             if c > 1:
157                 self.msg += "`{}` teas".format(c)
158             else:
159                 self.msg += "`{}` tea".format(c)
160             self.msg += "\n"
161             i += 1
162         self.msg += "\n"
163         self.msg += "Oh, and together we drank *{}* teas {}".format(
164             tot,
165             self.getSomeSmile()
166         )
167
168     def loadDrunkSum(self, *args, **kwargs):
169         """Get list of drunken ``flavor`` from ``dtf`` to ``dtt``, update msg.
170
171         Keyword arguments:
172         flavor -- The flavor of beverage.
173         dtf -- Date and time *from*.
174         dtt -- Date and time *to*.
175         """
176         self.top = self.db.getDrunkSum(*args, **kwargs)
177         if args:
178             flavor = args[0]
179             dtf = args[1]
180             dtt = args[2]
181         elif kwargs:
182             flavor = kwargs["flavor"]
183             dtf = kwargs["dtf"]
184             dtt = kwargs["dtt"]
185         self.msg = "{} drunk from {} to {}:\n".format(flavor, dtf, dtt)
186         for (un, cnt) in self.top:
187             self.msg += "{}: {}\n".format(un, cnt)
188         self.msg += "---"
189         return
190
191     def loadDrunkList(self, *args, **kwargs):
192         """Get list of drunken ``flavor`` from ``dtf`` to ``dtt``, update msg.
193
194         Keyword arguments:
195         flavor -- The flavor of beverage.
196         dtf -- Date and time *from*.
197         dtt -- Date and time *to*.
198         """
199         self.top = self.db.getDrunkSum(*args, **kwargs)
200         d = self.db.getDrunkList(*args, **kwargs)
201         if args:
202             flavor = args[0]
203             dtf = args[1]
204             dtt = args[2]
205         elif kwargs:
206             flavor = kwargs["flavor"]
207             dtf = kwargs["dtf"]
208             dtt = kwargs["dtt"]
209         self.msg = "{} drunk from {} to {}:\n".format(flavor, dtf, dtt)
210         for (un, l) in d.items():
211             self.msg += "{}: ".format(un)
212             for cnt in l[:-1]:
213                 self.msg += "{}, ".format(cnt)
214             self.msg += "{}\n".format(l[-1])
215         self.msg += "---"
216         return