this repo has no description

Add "Seven Dirty Words" feed

+77
+2
feed_manager.py
··· 5 5 from feeds.popular import PopularFeed 6 6 from feeds.homeruns import HomeRunsTeamFeed 7 7 from feeds.norazone_interesting import NoraZoneInteresting 8 + from feeds.sevendirtywords import SevenDirtyWordsFeed 8 9 9 10 class FeedManager: 10 11 def __init__(self): ··· 46 47 feed_manager.register(PopularFeed) 47 48 feed_manager.register(HomeRunsTeamFeed) 48 49 feed_manager.register(NoraZoneInteresting) 50 + feed_manager.register(SevenDirtyWordsFeed)
+75
feeds/sevendirtywords.py
··· 1 + import logging 2 + import re 3 + 4 + import apsw 5 + import apsw.ext 6 + 7 + from . import BaseFeed 8 + 9 + class SevenDirtyWordsFeed(BaseFeed): 10 + FEED_URI = 'at://did:plc:4nsduwlpivpuur4mqkbfvm6a/app.bsky.feed.generator/sdw' 11 + 12 + def __init__(self): 13 + self.db_cnx = apsw.Connection('db/sdw.db') 14 + self.db_cnx.pragma('journal_mode', 'WAL') 15 + self.db_cnx.pragma('wal_autocheckpoint', '0') 16 + 17 + with self.db_cnx: 18 + self.db_cnx.execute(""" 19 + create table if not exists posts (uri text, create_ts timestamp); 20 + create unique index if not exists create_ts_idx on posts(create_ts); 21 + """) 22 + 23 + self.logger = logging.getLogger('feeds.sdw') 24 + 25 + def process_commit(self, commit): 26 + if commit['opType'] != 'c': 27 + return 28 + 29 + if commit['collection'] != 'app.bsky.feed.post': 30 + return 31 + 32 + record = commit.get('record') 33 + if record is None: 34 + return 35 + 36 + # https://en.wikipedia.org/wiki/Seven_dirty_words 37 + if re.search(r'\b(shit|piss|fuck|cunt|cocksucker|motherfucker|tits)\b', record['text'], re.I) is not None: 38 + repo = commit['did'] 39 + rkey = commit['rkey'] 40 + post_uri = f'at://{repo}/app.bsky.feed.post/{rkey}' 41 + ts = self.safe_timestamp(record.get('createdAt')).timestamp() 42 + self.transaction_begin(self.db_cnx) 43 + self.db_cnx.execute( 44 + 'insert into posts (uri, create_ts) values (:uri, :ts)', 45 + dict(uri=post_uri, ts=ts) 46 + ) 47 + 48 + def delete_old_posts(self): 49 + self.db_cnx.execute( 50 + "delete from posts where create_ts < unixepoch('-24 hours')" 51 + ) 52 + 53 + def commit_changes(self): 54 + self.logger.debug('committing changes') 55 + self.delete_old_posts() 56 + self.transaction_commit(self.db_cnx) 57 + self.wal_checkpoint(self.db_cnx, 'RESTART') 58 + 59 + def serve_feed(self, limit, offset, langs): 60 + cur = self.db_cnx.execute(""" 61 + select uri 62 + from posts 63 + order by create_ts desc 64 + limit :limit 65 + offset :offset 66 + """, dict(limit=limit, offset=offset)) 67 + return [uri for (uri,) in cur] 68 + 69 + def serve_feed_debug(self, limit, offset, langs): 70 + query = "select * from posts order by create_ts desc limit :limit offset :offset" 71 + bindings = dict(limit=limit, offset=offset) 72 + return apsw.ext.format_query_table( 73 + self.db_cnx, query, bindings, 74 + string_sanitize=2, text_width=9999, use_unicode=True 75 + )