]>
Commit | Line | Data |
---|---|---|
611adbfb MT |
1 | #!/usr/bin/python3 |
2 | ||
3 | import datetime | |
4 | import logging | |
5 | import tornado.gen | |
6 | import twython | |
7 | ||
8 | from .misc import Object | |
9 | ||
10 | class Tweets(Object): | |
11 | @tornado.gen.coroutine | |
12 | def tweet(self): | |
13 | """ | |
14 | Sends a random promotional tweet | |
15 | """ | |
16 | # Do not tweet too often | |
17 | if self.has_had_recent_activity(): | |
18 | logging.debug("Won't tweet because we recently did it") | |
19 | return | |
20 | ||
21 | # Do not tweet when there was a blog post | |
22 | if self.backend.blog.has_had_recent_activity(): | |
23 | logging.debug("Won't tweet because the blog has had activity") | |
24 | return | |
25 | ||
26 | # Select a tweet | |
27 | tweet = self._get_random_tweet() | |
28 | if not tweet: | |
29 | logging.warning("Could not find anything to tweet") | |
30 | return | |
31 | ||
32 | # Tweet the tweet | |
33 | with self.db.transaction(): | |
34 | self._tweet(tweet) | |
35 | ||
36 | def has_had_recent_activity(self, t=None): | |
37 | if t is None: | |
38 | t = datetime.timedelta(days=3) | |
39 | ||
40 | res = self.db.get("SELECT COUNT(*) AS count FROM tweets \ | |
41 | WHERE last_tweeted_at IS NOT NULL AND last_tweeted_at >= NOW() - %s", t) | |
42 | ||
43 | if res and res.count > 0: | |
44 | return True | |
45 | ||
46 | return False | |
47 | ||
48 | def _get_random_tweet(self): | |
49 | res = self.db.get( | |
50 | "WITH candidate_tweets AS (SELECT id, \ | |
51 | (CURRENT_TIMESTAMP - COALESCE(last_tweeted_at, '1970-01-01')) * RANDOM() AS age \ | |
52 | FROM tweets \ | |
53 | WHERE (last_tweeted_at IS NULL OR last_tweeted_at <= CURRENT_TIMESTAMP - INTERVAL '1 month') \ | |
54 | ) \ | |
55 | SELECT tweets.* FROM candidate_tweets \ | |
56 | LEFT JOIN tweets ON candidate_tweets.id = tweets.id \ | |
57 | ORDER BY age DESC LIMIT 1") | |
58 | ||
59 | return res | |
60 | ||
61 | def _tweet(self, tweet): | |
62 | logging.info("Tweeting: %s" % tweet.message) | |
63 | ||
64 | # Update database status | |
65 | self.db.execute("UPDATE tweets \ | |
66 | SET last_tweeted_at = CURRENT_TIMESTAMP, total_tweets = total_tweets + 1 \ | |
67 | WHERE id = %s", tweet.id) | |
68 | ||
69 | # Connect to twitter | |
70 | twitter = twython.Twython( | |
71 | self.settings.get("twitter_consumer_key"), | |
72 | self.settings.get("twitter_consumer_secret"), | |
73 | self.settings.get("twitter_%s_access_token" % tweet.account), | |
74 | self.settings.get("twitter_%s_access_token_secret" % tweet.account), | |
75 | ) | |
76 | ||
77 | # Update status | |
78 | twitter.update_status(status=tweet.message) |