# global variables
wants_to_stop = False
runner = None
-
+last_update = 0
+update_interval = 600
+last_topic = ""
# preamble
import modlib
# 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"))
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
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)