]> rtime.felk.cvut.cz Git - hubacji1/coffee-getter.git/blob - cbgetter.py
Merge branch 'release/0.3.0'
[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         return None
18
19     def getMsg(self):
20         """Return message."""
21         return self.msg
22
23     def sendMsgToSlack(self):
24         """Send message to Slack Bot."""
25         return post(self.cfg.getCoffeebotURL(), dumps({"text": self.msg}))
26
27     def getHeroComment(self):
28         """Return comment for hero."""
29         hsuff = [
30             ", oops",
31             " - real hero",
32             " because couldn't resist",
33             " - drunken master",
34             ", woohoo",
35             " - unbeatable",
36             " - superultramaxidrinker",
37             " and didn't sleep last week",
38             " in last 604800 seconds",
39             ", no idea how",
40             " and still drinking",
41         ]
42         ri = randint(0, len(hsuff) - 1)
43         return hsuff[ri]
44
45     def getSomeSmile(self):
46         """Return some Slack smile."""
47         smiles = [
48             ":party_parrot:",
49             ":cat2:",
50             ":heavy_check_mark:",
51             ":baby_bottle:",
52             ":+1:",
53             ":aaw_yeah:",
54             ":better:",
55         ]
56         ri = randint(0, len(smiles) - 1)
57         return smiles[ri]
58
59     def computeEqualDrinkers(self):
60         """Compute equally drunken drinkers."""
61         if len(self.top) <= 0:
62             return
63         lc = self.top[0][1] + 1
64         for (un, c) in self.top:
65             if c < lc:
66                 self.topeq.append([])
67                 lc = c
68             self.topeq[-1].append((un, c))
69         return
70
71     def loadTopMateDrinkers(self):
72         """Get list of top Mate drinkers, update message."""
73         self.msg = "*Top 5 Club-Mate drinkers*\n"
74         self.top = self.db.getTopMateDrinkers()
75         self.computeEqualDrinkers()
76         totl = [c for (un, c) in self.top]
77         tot = sum(totl)
78         isuff = {1: "st", 2: "nd", 3: "rd", 4: "th", 5: "th"}
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, 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 loadDrunkSum(self, *args, **kwargs):
113         """Get list of drunken ``flavor`` from ``dtf`` to ``dtt``, update msg.
114
115         Keyword arguments:
116         flavor -- The flavor of beverage.
117         dtf -- Date and time *from*.
118         dtt -- Date and time *to*.
119         """
120         self.top = self.db.getDrunkSum(*args, **kwargs)
121         if args:
122             flavor = args[0]
123             dtf = args[1]
124             dtt = args[2]
125         elif kwargs:
126             flavor = kwargs["flavor"]
127             dtf = kwargs["dtf"]
128             dtt = kwargs["dtt"]
129         self.msg = "{} drunk from {} to {}:\n".format(flavor, dtf, dtt)
130         for (un, cnt) in self.top:
131             self.msg += "{}: {}\n".format(un, cnt)
132         self.msg += "---"
133         return
134
135     def loadDrunkList(self, *args, **kwargs):
136         """Get list of drunken ``flavor`` from ``dtf`` to ``dtt``, update msg.
137
138         Keyword arguments:
139         flavor -- The flavor of beverage.
140         dtf -- Date and time *from*.
141         dtt -- Date and time *to*.
142         """
143         self.top = self.db.getDrunkSum(*args, **kwargs)
144         d = self.db.getDrunkList(*args, **kwargs)
145         if args:
146             flavor = args[0]
147             dtf = args[1]
148             dtt = args[2]
149         elif kwargs:
150             flavor = kwargs["flavor"]
151             dtf = kwargs["dtf"]
152             dtt = kwargs["dtt"]
153         self.msg = "{} drunk from {} to {}:\n".format(flavor, dtf, dtt)
154         for (un, l) in d.items():
155             self.msg += "{}: ".format(un)
156             for cnt in l[:-1]:
157                 self.msg += "{}, ".format(cnt)
158             self.msg += "{}\n".format(l[-1])
159         self.msg += "---"
160         return