]> git.ipfire.org Git - ipfire.org.git/blob - src/backend/tweets.py
Add bot that automatically tweets some things
[ipfire.org.git] / src / backend / tweets.py
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)