Include command line flag to repost pinned thread
This commit is contained in:
		
							parent
							
								
									07d80f689a
								
							
						
					
					
						commit
						65661ef8c1
					
				| 
						 | 
				
			
			@ -140,3 +140,6 @@ cython_debug/
 | 
			
		|||
 | 
			
		||||
# config file
 | 
			
		||||
config.py
 | 
			
		||||
 | 
			
		||||
# file with pinned thread text
 | 
			
		||||
pinned_thread.txt
 | 
			
		||||
| 
						 | 
				
			
			@ -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,14 +39,65 @@ async def startup():
 | 
			
		|||
		me = await c.verify_account_credentials()
 | 
			
		||||
		log('Credentials verified!')
 | 
			
		||||
 | 
			
		||||
		tasks = []
 | 
			
		||||
 | 
			
		||||
		tasks.append(asyncio.create_task(listen(c, me)))
 | 
			
		||||
		tasks.append(asyncio.create_task(repeat(5 * 60, update_followers, c, me)))
 | 
			
		||||
		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)),
 | 
			
		||||
			]
 | 
			
		||||
 | 
			
		||||
			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):
 | 
			
		||||
	"""
 | 
			
		||||
	Return information about all cards with names in 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))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue