]> jfr.im git - erebus.git/commitdiff
implement handleState and getText
authorJohn Runyon <redacted>
Wed, 14 Jun 2023 11:47:21 +0000 (05:47 -0600)
committerJohn Runyon <redacted>
Wed, 14 Jun 2023 11:47:21 +0000 (05:47 -0600)
modules/reddark.py

index 911dd875a29376f6b51b81db2c728b63fadd0bcd..2a4ce8b9f4e5dd2ecc69b8079681799857608f90 100644 (file)
@@ -19,7 +19,9 @@ modinfo = {
 # global variables
 wants_to_stop = False
 runner = None
-
+last_update = 0
+update_interval = 600
+last_topic = ""
 
 # preamble
 import modlib
@@ -39,8 +41,9 @@ def modstop(*args, **kwargs):
 
 # module code
 from modules.contrib.sseclient import SSEClient
-import threading
-import json
+import requests
+from bs4 import BeautifulSoup
+import threading, json, time, collections, re
 
 def chan():
        return lib.parent.channel(lib.parent.cfg.get('reddark', 'channel', default="##.test"))
@@ -55,24 +58,65 @@ def debug(message, send_to_owner=True):
        if lib.parent.cfg.getboolean('reddark', 'debug', True):
                lib.parent.log('Reddark', 'R', message)
        if send_to_owner and lib.parent.cfg.get('debug', 'owner'):
-               bot().msg(lib.parent.cfg.get('debug', 'owner'), message)
+               bot().fastmsg(lib.parent.cfg.get('debug', 'owner'), message)
 
 def getText(subreddit):
-       pass
+       r = None
+       e = None
+       try:
+               r = requests.get('https://old.reddit.com/' + subreddit, headers={'User-Agent': 'better-see-reason-bot/1.0'})
+       except Exception as e2:
+               e = e2
+       if r is None:
+               debug("Error getting text: " + repr(e))
+               return
+       if r.status_code != 403:
+               debug("Error getting text: " + str(r.status_code) + " (403 expected)")
+               return
+       soup = BeautifulSoup(r.text, 'html.parser')
+       elements = soup.find_all(class_='interstitial-subreddit-description')
+       if elements[0]:
+               text = elements[0].get_text()
+               text = re.sub(re.escape(subreddit), '', text, re.IGNORECASE).replace("\n", " ")
+               return text
 
 def handleDelta(message):
        message['state'] = message['state'].lower()
        message['previous_state'] = message['previous_state'].lower()
        if message['state'] == 'private':
                message['text'] = getText(message['name'])
-               chan().msg('[%(section)s] %(name)s went %(state)s (was: %(previous_state)s) (https://old.reddit.com/%(name)s) %(text)s' % message)
+               print(repr(message))
+               chan().msg('[%(section)s] %(name)s went %(state)s (was: %(previous_state)s) (https://old.reddit.com/%(name)s) - %(text)s' % message, truncate=True)
        elif message['state'] == 'restricted':
-               chan().msg('[%(section)s] %(name)s went %(state)s (was: %(previous_state)s) (https://old.reddit.com/%(name)s)' % message)
+               chan().msg('[%(section)s] %(name)s went %(state)s (was: %(previous_state)s) (https://old.reddit.com/%(name)s)' % message, truncate=True)
        else:
-               chan().msg('[%(section)s] %(name)s went \x02%(state)s\x02 (was: %(previous_state)s) (https://old.reddit.com/%(name)s)' % message)
+               chan().msg('[%(section)s] %(name)s went \x02%(state)s\x02 (was: %(previous_state)s) (https://old.reddit.com/%(name)s)' % message, truncate=True)
 
 def handleState(message):
-       pass
+       global last_update, update_interval, last_topic
+       if time.time() < last_update+update_interval:
+               return
+       output = collections.defaultdict(int)
+       output['totalSubs'] = len(message['subreddits'])
+       for sub in message['subreddits']:
+               if sub['state'] == 'PRIVATE':
+                       output['privateSubs'] += 1
+                       output['protestingSubs'] += 1
+               elif sub['state'] == 'RESTRICTED':
+                       output['restrictedSubs'] += 1
+                       output['protestingSubs'] += 1
+               elif sub['state'] == 'PUBLIC':
+                       output['publicSubs'] += 1
+       output['pct'] = round(output['protestingSubs']/output['totalSubs']*100, 2)
+       output['pctPublic'] = round(output['publicSubs']/output['totalSubs']*100, 2)
+       output['pctPrivate'] = round(output['privateSubs']/output['totalSubs']*100, 2)
+       output['pctRestricted'] = round(output['restrictedSubs']/output['totalSubs']*100, 2)
+       newTopic = 'subreddits protesting: %(protestingSubs)s out of %(totalSubs)s pledged (%(pct)s%%) | private: %(privateSubs)s (%(pctPrivate)s%%), restricted: %(restrictedSubs)s (%(pctRestricted)s%%), public: %(publicSubs)s (%(pctPublic)s%%)' % dict(output)
+       debug(newTopic, False)
+       if last_topic != newTopic:
+               last_topic = newTopic
+               last_update = time.time()
+               bot().conn.send("TOPIC %(chan)s :%(topic)s" % {'chan': chan(), 'topic': newTopic})
 
 def gotParent(parent):
        global runner
@@ -90,6 +134,7 @@ def gotParent(parent):
                                debug(repr(data), False)
                                handleDelta(data['content'])
                        elif data['type'] == 'CurrentStateUpdate':
+                               debug(repr(data)[0:500], False)
                                handleState(data['content'])
                        else:
                                debug("Unknown event: " + msg, False)