Exemple #1
0
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)
Exemple #2
0
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")
Exemple #3
0
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