Include command line flag to repost pinned thread

This commit is contained in:
Holly McFarland 2022-01-29 19:50:39 -05:00 committed by Holly
parent 07d80f689a
commit 65661ef8c1
2 changed files with 74 additions and 9 deletions

5
.gitignore vendored
View File

@ -139,4 +139,7 @@ dmypy.json
cython_debug/
# config file
config.py
config.py
# file with pinned thread text
pinned_thread.txt

View File

@ -7,6 +7,7 @@ import aiohttp
import re
import json
import io
import argparse
import traceback
from PIL import Image
@ -24,8 +25,8 @@ from easter_eggs import eggs
from debug import *
async def startup():
"""Start up the entire bot, logging in and starting to listen for cards"""
async def startup(args):
"""Start up the entire bot, logging in and executing code"""
log('Starting up...')
if not os.path.exists('config.py'):
@ -38,13 +39,64 @@ async def startup():
me = await c.verify_account_credentials()
log('Credentials verified!')
tasks = []
if args.update_pins:
await update_pins(c, me, config)
else:
tasks = [
asyncio.create_task(listen(c, me)),
asyncio.create_task(repeat(5 * 60, update_followers, c, me)),
]
tasks.append(asyncio.create_task(listen(c, me)))
tasks.append(asyncio.create_task(repeat(5 * 60, update_followers, c, me)))
for t in tasks:
await t
for t in tasks:
await t
async def update_pins(c, me, config):
"""Resend and repin the thread in pinned_thread.txt"""
async def get_pinned_statuses(user_id):
# atoot can't look up a user's pinned toots for some reason, so we
# have to do it ourselves
async with aiohttp.ClientSession() as session:
url = f'https://{config.instance}/api/v1/accounts/{me["id"]}/statuses?pinned=true'
async with session.get(url) as r:
return [e['id'] for e in await r.json()]
log('Ready to repost the pinned introduction thread!')
# Get text for each status of the thread
log('Getting thread text...')
try:
with open('pinned_thread.txt') as f:
thread_text = f.read().strip().split('\n-----\n')
except:
log('Error reading text for new pinned thread!', Severity.ERROR)
log('Make sure that the file pinned_thread.txt exists and that it contains the text of each status, separated by lines containing only "-----".', Severity.ERROR)
exit(-1)
thread_statuses = []
# Post the new thread
log('Posting new thread...')
for status_text in thread_text:
thread_statuses.append(
await c.create_status(
status=status_text,
in_reply_to_id=(thread_statuses[-1]['id'] if thread_statuses else None),
visibility='unlisted',
)
)
# Unpin all existing pins
log('Unpinning old thread...')
for status in (await get_pinned_statuses(me)):
await c.status_unpin(status)
log('Pinning new thread...')
# Pin the new thread in reverse order, so it reads chronologically top to bottom
for status in thread_statuses[::-1]:
await c.status_pin(status)
log('Done!')
async def get_cards(card_names):
"""
@ -247,6 +299,8 @@ async def handle_status(c, status):
# ignore any statuses without cards in them
if not card_names: return
log(f'Found a status with cards {card_names}...')
cards, media = await get_cards(card_names)
reply_text = status_author
@ -338,4 +392,12 @@ async def repeat(interval, func, *args, **kwargs):
)
if __name__ == '__main__':
asyncio.run(startup())
parser = argparse.ArgumentParser()
parser.add_argument(
'--update-pins',
help='repost and repin the introduction thread from pinned_thread.txt, then exit',
action='store_true'
)
args = parser.parse_args()
asyncio.run(startup(args))