From 46d0b2009e23787c760cec2242c89a3dbdeaf35e Mon Sep 17 00:00:00 2001 From: Brad Brown Date: Tue, 7 Jun 2022 15:47:05 -0500 Subject: [PATCH] add tweet link web endpoint --- wordlinator/db/pg.py | 16 ++++++++++++++++ wordlinator/twitter/__init__.py | 21 ++++++++++++++++----- wordlinator/web/__init__.py | 20 +++++++++++++++++++- 3 files changed, 51 insertions(+), 6 deletions(-) diff --git a/wordlinator/db/pg.py b/wordlinator/db/pg.py index bf0c0f8..b716b7c 100644 --- a/wordlinator/db/pg.py +++ b/wordlinator/db/pg.py @@ -126,3 +126,19 @@ class WordleDb: with db.atomic(): for score in scores: score.save() + + def get_users_without_score(self, round_no, hole_no, tweetable=True): + hole = self.get_or_create_hole(round_no, hole_no) + query_str = """SELECT username + FROM user_tbl u + WHERE NOT EXISTS ( + SELECT FROM score WHERE score.user_id = u.user_id AND score.hole_id = {} + )""".format( + hole.hole_id + ) + + if tweetable: + query_str += " AND u.check_twitter = true" + + res = db.execute_sql(query_str) + return [r[0] for r in res] diff --git a/wordlinator/twitter/__init__.py b/wordlinator/twitter/__init__.py index 666ecb3..f66e9d5 100644 --- a/wordlinator/twitter/__init__.py +++ b/wordlinator/twitter/__init__.py @@ -196,17 +196,28 @@ class TwitterClient(httpx.AsyncClient): async def get_wordlegolf_tweets(self): return self._build_wordle_tweets(await self.search_tweets("#WordleGolf")) - def open_tweet(self, msg): + @classmethod + def open_tweet(cls, msg): param = urllib.parse.urlencode({"text": msg}) - webbrowser.open(f"{self.TWEET_INTENT_URL}?{param}") + webbrowser.open(f"{cls.TWEET_INTENT_URL}?{param}") - async def notify_missing(self, names): + @classmethod + def full_notify_link(cls, names): header = "Still missing a few #WordleGolf Players today!" msg = header while names: - while len(msg) < self.MAX_TWEET_LENGTH and names: + msg += f" @{names.pop()}" + param = urllib.parse.urlencode({"text": msg}) + return f"{cls.TWEET_INTENT_URL}?{param}" + + @classmethod + async def notify_missing(cls, names): + header = "Still missing a few #WordleGolf Players today!" + msg = header + while names: + while len(msg) < cls.MAX_TWEET_LENGTH and names: msg += f" @{names.pop()}" - self.open_tweet(msg) + cls.open_tweet(msg) async def main(): diff --git a/wordlinator/web/__init__.py b/wordlinator/web/__init__.py index e96fd8a..9ea8715 100644 --- a/wordlinator/web/__init__.py +++ b/wordlinator/web/__init__.py @@ -6,9 +6,12 @@ import time import dash import dash.long_callback import diskcache +import flask +import flask.views import plotly.graph_objs import wordlinator.db.pg as db +import wordlinator.twitter import wordlinator.utils ################### @@ -348,8 +351,23 @@ def get_stats_graph(_): server = app.server +class GetLinkView(flask.views.View): + methods = ["GET"] + + def dispatch_request(self): + today = wordle_today() + missing_users = db.WordleDb().get_users_without_score( + today.golf_hole.game_no, today.golf_hole.hole_no + ) + link = wordlinator.twitter.TwitterClient.full_notify_link(missing_users) + return flask.redirect(link) + + +server.add_url_rule("/tweet_link", view_func=GetLinkView.as_view("tweet_link")) + + def serve(debug=True): - app.run_server(debug=debug) + app.run(debug=debug) if __name__ == "__main__":