From 3f2320a6fcb43b82ebbce43a1a837e3cf1c34696 Mon Sep 17 00:00:00 2001 From: Lucy Joshua Date: Mon, 30 Jan 2023 23:22:21 +0200 Subject: [PATCH] Switch to Redis --- requirements.txt | 3 ++- src/BotYamPoster.py | 39 +++++++++++++++++++++++++++------------ src/main.py | 43 +++++++++++++++++++++++++++---------------- 3 files changed, 56 insertions(+), 29 deletions(-) diff --git a/requirements.txt b/requirements.txt index 0c1046f..38d05a9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,4 +10,5 @@ tweepy==4.12.1 urllib3==1.26.13 jsonschema==3.2.0 six==1.16.0 -python-consul==1.1.0 \ No newline at end of file +crc16=0.1.1 +python-redis=0.3.0 \ No newline at end of file diff --git a/src/BotYamPoster.py b/src/BotYamPoster.py index d9af346..7e1b1f4 100644 --- a/src/BotYamPoster.py +++ b/src/BotYamPoster.py @@ -4,16 +4,15 @@ import syslog import random import json from main import Connector -from main import init_api -def init_streamobject(): +def init_streamobject(conn): syslog.syslog(syslog.LOG_INFO, "Loading Stream object...") - bearer = os.getenv("BEARER") - return BotYamPoster(bearer) + return BotYamPoster(conn.get_bearer()) -def post_reply(conn, victim_bank, tweet, words, reply_text, postcounter): +def post_reply(conn, victim_bank, tweet, words, reply_text_bank, postcounter): # Search for word in word bank if any(word in tweet.data['text'] for word in words): + reply_text = reply_text_bank[random.randint(0, (reply_text_bank.len()-1))] # Post reply if tweet.data['author_id'] in victim_bank.author_id: reply_text = victim_bank.text[random.randint(0,2)] + "\n" + reply_text @@ -41,8 +40,7 @@ class BotYamPoster(tweepy.StreamingClient): return conn = Connector() - i, d = conn.conn_consul.get.kv('botyam/reply_bank') - reply_bank = json.loads(d["Value"]) + reply_bank = json.loads(conn.dbconn.get_reply_bank()) # Debug tweet_data = f"NEW TWEET from @{conn.api.get_user(id=tweet.data['author_id']).data['username']}: {tweet.data['text']}" @@ -55,16 +53,33 @@ class BotYamPoster(tweepy.StreamingClient): # Run on all gags for gag in reply_bank.gags: - post_reply(conn, reply_bank.victims, tweet, gag.keywords, gag.reply, postcounter) + postcounter = post_reply(conn, reply_bank.victims, tweet, gag.keywords, gag.reply, postcounter) # Special gags if reply_bank.special_gags['haikar_misadot'].keywords[0] in tweet.data["text"]: - post_reply(conn, reply_bank.victims, tweet, reply_bank.special_gags['haikar_misadot'].keywords, reply_bank.special_gags['haikar_misadot'].reply) + postcounter = post_reply( + conn, + reply_bank.victims, + tweet, + reply_bank.special_gags['haikar_misadot'].keywords, + reply_bank.special_gags['haikar_misadot'].reply, + postcounter) elif not any(gebol in tweet.data['text'] for gebol in reply_bank.gags[1].keywords) and any(misada in tweet.data['text'] for misada in reply_bank.special_gags['misadot'].keywords): - post_reply(conn, reply_bank.victims, tweet, reply_bank.special_gags['misadot'].keywords) + postcounter = post_reply( + conn, + reply_bank.victims, + tweet, + reply_bank.special_gags['misadot'].keywords, + reply_bank.special_gags['misadot'].reply, + postcounter) - if any(tilter in tweet.data['text'] for tilter in reply_bank.special_gags['tilt'].keywords) or (postcounter == 0 and not "@FromBotYam" in tweet.data['text']): - post_reply(conn, reply_bank.victims, tweet, reply_bank.special_gags['tilt'].keywords, reply_bank.special_gags['tilt'].reply) + if any(tilter in tweet.data['text'] for tilter in reply_bank.special_gags['tilt'].keywords) or (postcounter == 0 and "@FromBotYam" in tweet.data['text']): + postcounter = post_reply( + conn, + reply_bank.victims, + tweet, reply_bank.special_gags['tilt'].keywords, + reply_bank.special_gags['tilt'].reply, + postcounter) # Define a callback function to handle errors def on_error(self, status_code): diff --git a/src/main.py b/src/main.py index fadefdb..02c7402 100644 --- a/src/main.py +++ b/src/main.py @@ -1,40 +1,51 @@ import tweepy import os import syslog -import consul import json +import redis from BotYamPoster import BotYamPoster from BotYamPoster import init_streamobject -class Connector: - conn_consul = set() - api = set() - +class Connector(): def __init__(self): syslog.syslog(syslog.LOG_INFO, "Loading Consul connector...") # TODO: Add token - conn_consul = consul.Consul(host='', port='') + self.dbconn = redis.Redis( + host=os.getenv("REDIS_HOST"), + port=os.getenv("REDIS_PORT"), + password=os.getenv("REDIS_CREDENTIALS") + ) - api = Connector.init_api(conn_consul) + self.api = Connector.init_api(self.dbconn) - def init_api(conn_consul): + def init_api(dbconn): # Syslog report syslog.syslog(syslog.LOG_INFO, "Loading Twitter API connector...") - i, kv_keys = conn_consul.kv.get('botyam/api') return tweepy.Client( - bearer_token=json.loads(kv_keys['Value']).bearer, - consumer_key=json.loads(kv_keys['Value']).consumer_key, - consumer_secret=json.loads(kv_keys['Value']).consumer_secret, - access_token=json.loads(kv_keys['Value']).access_token, - access_token_secret=json.loads(kv_keys['Value']).access_token_secret) + bearer_token=str(dbconn.hget("api", "bearer")), + consumer_key=str(dbconn.hget("api", "consumer_key")), + consumer_secret=str(dbconn.hget("api", "consumer_secret")) + access_token=str(dbconn.hget("api", "access_token")), + access_token_secret=str(dbconn.hget("api","access_token_secret")) + ) + + def get_reply_bank(self): + return json.loads(self.dbconn.get('reply_bank')) + + def get_victims(self): + return json.loads(self.dbconn.get('reply_bank')).victims + + def get_bearer(self): + return str(self.dbconn.hget("api", "bearer")) def main(): syslog.syslog(syslog.LOG_INFO, "BOT-YAM - VERSION 2.1.2 >>>>") - stream = init_streamobject() + conn = Connector() + stream = init_streamobject(conn) syslog.syslog(syslog.LOG_INFO, "Adding stream rules...") - stream.add_rules(tweepy.StreamRule("from:LucyBscalE OR from:aviv_yashar OR from:shaulig OR from:DvirAviam OR from:YoavFried1 OR from:StevenRaz5 OR from:nir_hau")) + stream.add_rules(tweepy.StreamRule(conn.get_victims().stream_filter)) stream.add_rules(tweepy.StreamRule("@FromBotYam")) # Start listening for tweets syslog.syslog(syslog.LOG_INFO, "Starting Twitter stream!")