[twitter] Add start, stop, status REST endpoints

This commit is contained in:
Cathy Hu 2020-07-17 23:36:14 +02:00
parent fc324f102d
commit f6eef5dc73
3 changed files with 47 additions and 12 deletions

View file

@ -7,7 +7,7 @@ from kibicara.config import config
from kibicara.platformapi import Censor, Message, Spawner
from kibicara.platforms.twitter.model import Twitter
from logging import getLogger
from peony import PeonyClient
from peony import PeonyClient, exceptions
logger = getLogger(__name__)
@ -17,18 +17,21 @@ class TwitterBot(Censor):
def __init__(self, twitter_model):
super().__init__(twitter_model.hood)
self.twitter_model = twitter_model
self.client = PeonyClient(
consumer_key=config['twitter']['consumer_key'],
consumer_secret=config['twitter']['consumer_secret'],
access_token=twitter_model.access_token,
access_token_secret=twitter_model.access_token_secret,
)
self.enabled = self.twitter_model.enabled
self.polling_interval_sec = 60
self.mentions_since_id = self.twitter_model.mentions_since_id
self.dms_since_id = self.twitter_model.dms_since_id
async def run(self):
if self.twitter_model.successful_verified:
try:
if not self.twitter_model.verified:
raise ValueError('Oauth Handshake not completed')
self.client = PeonyClient(
consumer_key=config['twitter']['consumer_key'],
consumer_secret=config['twitter']['consumer_secret'],
access_token=self.twitter_model.access_token,
access_token_secret=self.twitter_model.access_token_secret,
)
if self.twitter_model.mentions_since_id is None:
logger.debug('since_id is None in model, fetch newest mention id')
await self._poll_mentions()
@ -37,8 +40,16 @@ class TwitterBot(Censor):
await self._poll_direct_messages()
logger.debug('Starting Twitter bot: %s' % self.twitter_model.__dict__)
await gather(self.poll(), self.push())
else:
logger.debug('Twitter Bot not started: Oauth Handshake not completed')
except CancelledError:
logger.debug(f'Bot {self.twitter_model.hood.name} received Cancellation.')
raise
except exceptions.Unauthorized:
logger.debug(f'Bot {self.twitter_model.hood.name} has invalid auth token.')
await self.twitter_model.update(enabled=False)
self.enabled = self.twitter_model.enabled
raise
finally:
logger.debug(f'Bot {self.twitter_model.hood.name} stopped.')
async def poll(self):
while True:

View file

@ -13,7 +13,8 @@ class Twitter(Model):
mentions_since_id: Integer(allow_null=True) = None
access_token: Text()
access_token_secret: Text()
successful_verified: Boolean() = False
verified: Boolean() = False
enabled: Boolean() = False
class Mapping(Mapping):
table_name = 'twitterbots'

View file

@ -43,8 +43,30 @@ async def twitter_delete(twitter=Depends(get_twitter)):
await twitter.delete()
@router.get('/{twitter_id}/status', status_code=status.HTTP_200_OK)
async def twitter_status(twitter=Depends(get_twitter)):
return {'status': spawner.get(twitter).status.name}
@router.post('/{twitter_id}/start', status_code=status.HTTP_200_OK)
async def twitter_start(twitter=Depends(get_twitter)):
await twitter.update(enabled=True)
spawner.get(twitter).start()
return {}
@router.post('/{twitter_id}/stop', status_code=status.HTTP_200_OK)
async def twitter_stop(twitter=Depends(get_twitter)):
await twitter.update(enabled=False)
spawner.get(twitter).stop()
return {}
@router.post('/', status_code=status.HTTP_201_CREATED)
async def twitter_create(response: Response, hood=Depends(get_hood)):
"""
`https://api.twitter.com/oauth/authorize?oauth_token=`
"""
try:
request_token = await get_oauth_token(
config['twitter']['consumer_key'],
@ -78,7 +100,8 @@ async def twitter_read_callback(oauth_token: str, oauth_verifier: str):
await twitter.update(
access_token=access_token['oauth_token'],
access_token_secret=access_token['oauth_token_secret'],
successful_verified=True,
verified=True,
enabled=True,
)
spawner.start(twitter)
return []