def dump(sub: Subreddit, outfile: TextIO): import csv writer = csv.DictWriter(outfile, ['username', 'flair_text', 'flair_css_class'], extrasaction='ignore') writer.writeheader() for user in sub.flair(): user['username'] = user['user'].name writer.writerow(user)
def updatestats(sub: Subreddit, flair_config: Dict, dry_run: bool) -> None: stats = {} for f in sub.flair(limit=None): classes = f['flair_css_class'].lower().strip() if f['flair_css_class'] else None if not classes: continue primary = find_flair(classes, flair_config['primary']) secondary = find_flair(classes, flair_config['secondary']) if primary is None: continue if primary not in stats: stats[primary] = {'_total': 0} stats[primary]['_total'] += 1 if secondary is not None: if secondary not in stats[primary]: stats[primary][secondary] = 0 stats[primary][secondary] += 1 renderer = RenderHelper(sub.display_name) rdr = renderer.render('flair_stats.md', {'stats': stats}) page = sub.wiki['/flair/stats'] update_or_create(sub, page, rdr, dry_run, edit_reason="Updated flair stats")
def repair_flair(sub: Subreddit, flair_config: Dict, dry_run: bool): valid_emojis = [emoji.name for emoji in sub.emoji] for f in sub.flair(limit=None): classes = f['flair_css_class'].lower().strip() if f['flair_css_class'] else None if classes == 'aafb': # Hardcoded mistake here print("Replace %r with text=<:AAF: AAF>, class=<aaf>" % f) if not dry_run: sub.flair.set(f['user'], text=":AAF: AAF", css_class="aaf") continue if not classes or 'official' in classes or 'ranker' in classes: print("Not touching %r" % f) continue primary = find_flair(classes, flair_config['primary']) secondary = find_flair(classes, flair_config['secondary']) if not primary: print("Couldn't find primary for %r" % f) continue if len(classes.split(" ")) == 2 and secondary is None: print("Two classes but couldn't find secondary for %r" % f) continue if len(classes.split(" ")) > 2: print("More than two classes for %r" % f) continue flair_emojis = re.findall(":([^:]+):", f['flair_text']) msg = "primary:%s-%s" % (primary[0], primary[1]) if secondary: msg += " secondary:%s-%s" % (secondary[0], secondary[1]) real_text, real_class = determine_flair(msg, flair_config) if not flair_emojis: print("%r is missing emoji" % f) print("Replace %r with text=<%s>, class=<%s>" % (f, real_text, real_class)) if not dry_run: sub.flair.set(f['user'], text=real_text, css_class=real_class) continue for flair_emoji in flair_emojis: if flair_emoji not in valid_emojis: print("%r has invalid emoji %s" % (f, flair_emoji)) print("Replace %r with text=<%s>, class=<%s>" % (f, real_text, real_class)) if not dry_run: sub.flair.set(f['user'], text=real_text, css_class=real_class) continue