[core] Fix hood destruction process

This commit is contained in:
Cathy Hu 2020-09-06 19:11:18 +02:00
parent a24e5ff4f9
commit 7d54375b43
7 changed files with 52 additions and 4 deletions

View file

@ -117,6 +117,14 @@ class Censor:
""" """
pass pass
@classmethod
async def destroy_hood(cls, hood):
"""Removes all its database entries.
Note: Override this in the derived bot class.
"""
pass
async def publish(self, message): async def publish(self, message):
"""Distribute a message to the bots in a hood. """Distribute a message to the bots in a hood.
@ -187,6 +195,16 @@ class Spawner:
for spawner in cls.__instances: for spawner in cls.__instances:
await spawner._init() await spawner._init()
@classmethod
async def destroy_hood(cls, hood):
for spawner in cls.__instances:
for pk in list(spawner.__bots):
bot = spawner.__bots[pk]
if bot.hood.id == hood.id:
del spawner.__bots[pk]
bot.stop()
await spawner.BotClass.destroy_hood(hood)
async def _init(self): async def _init(self):
for item in await self.ORMClass.objects.all(): for item in await self.ORMClass.objects.all():
self.start(item) self.start(item)

View file

@ -8,7 +8,7 @@ from kibicara import email
from kibicara.config import config from kibicara.config import config
from kibicara.model import Hood from kibicara.model import Hood
from kibicara.platformapi import Censor, Spawner from kibicara.platformapi import Censor, Spawner
from kibicara.platforms.email.model import EmailSubscribers from kibicara.platforms.email.model import Email, EmailSubscribers
from kibicara.webapi.admin import to_token from kibicara.webapi.admin import to_token
from logging import getLogger from logging import getLogger
from smtplib import SMTPException from smtplib import SMTPException
@ -22,6 +22,14 @@ class EmailBot(Censor):
super().__init__(hood) super().__init__(hood)
self.enabled = hood.email_enabled self.enabled = hood.email_enabled
@classmethod
async def destroy_hood(cls, hood):
"""Removes all its database entries."""
for inbox in await Email.objects.filter(hood=hood).all():
await inbox.delete()
for subscriber in await EmailSubscribers.objects.filter(hood=hood).all():
await subscriber.delete()
async def run(self): async def run(self):
""" Loop which waits for new messages and sends emails to all subscribers. """ """ Loop which waits for new messages and sends emails to all subscribers. """
while True: while True:

View file

@ -92,7 +92,7 @@ async def email_read_all_public(hood=Depends(get_hood_unauthorized)):
operation_id='get_emails', operation_id='get_emails',
) )
async def email_read_all(hood=Depends(get_hood)): async def email_read_all(hood=Depends(get_hood)):
return await Email.objects.filter(hood=hood).all() return await Email.objects.filter(hood=hood).select_related('hood').all()
@router.post( @router.post(

View file

@ -20,6 +20,14 @@ class TelegramBot(Censor):
self.telegram_model = telegram_model self.telegram_model = telegram_model
self.enabled = self.telegram_model.enabled self.enabled = self.telegram_model.enabled
@classmethod
async def destroy_hood(cls, hood):
"""Removes all its database entries."""
for telegram in await Telegram.objects.filter(hood=hood).all():
for user in await TelegramUser.objects.filter(bot=telegram).all():
await user.delete()
await telegram.delete()
def _create_dispatcher(self): def _create_dispatcher(self):
dp = Dispatcher(self.bot) dp = Dispatcher(self.bot)
dp.register_message_handler(self._send_welcome, commands=['start']) dp.register_message_handler(self._send_welcome, commands=['start'])

View file

@ -6,7 +6,7 @@ from aiogram.bot.api import check_token
from aiogram import exceptions from aiogram import exceptions
from fastapi import APIRouter, Depends, HTTPException, Response, status from fastapi import APIRouter, Depends, HTTPException, Response, status
from kibicara.platforms.telegram.bot import spawner from kibicara.platforms.telegram.bot import spawner
from kibicara.platforms.telegram.model import Telegram from kibicara.platforms.telegram.model import Telegram, TelegramUser
from kibicara.webapi.hoods import get_hood, get_hood_unauthorized from kibicara.webapi.hoods import get_hood, get_hood_unauthorized
from logging import getLogger from logging import getLogger
from sqlite3 import IntegrityError from sqlite3 import IntegrityError
@ -84,6 +84,8 @@ async def telegram_read(telegram=Depends(get_telegram)):
) )
async def telegram_delete(telegram=Depends(get_telegram)): async def telegram_delete(telegram=Depends(get_telegram)):
spawner.stop(telegram) spawner.stop(telegram)
for user in await TelegramUser.objects.filter(bot=telegram).all():
await user.delete()
await telegram.delete() await telegram.delete()

View file

@ -22,6 +22,12 @@ class TwitterBot(Censor):
self.mentions_since_id = self.twitter_model.mentions_since_id self.mentions_since_id = self.twitter_model.mentions_since_id
self.dms_since_id = self.twitter_model.dms_since_id self.dms_since_id = self.twitter_model.dms_since_id
@classmethod
async def destroy_hood(cls, hood):
"""Removes all its database entries."""
for twitter in await Twitter.objects.filter(hood=hood).all():
await twitter.delete()
async def run(self): async def run(self):
try: try:
if not self.twitter_model.verified: if not self.twitter_model.verified:

View file

@ -6,7 +6,8 @@
""" REST API Endpoints for managing hoods. """ """ REST API Endpoints for managing hoods. """
from fastapi import APIRouter, Depends, HTTPException, Response, status from fastapi import APIRouter, Depends, HTTPException, Response, status
from kibicara.model import AdminHoodRelation, Hood from kibicara.model import AdminHoodRelation, BadWord, Hood, Trigger
from kibicara.platformapi import Spawner
from kibicara.platforms.email.bot import spawner from kibicara.platforms.email.bot import spawner
from kibicara.webapi.admin import get_admin from kibicara.webapi.admin import get_admin
from ormantic.exceptions import NoMatch from ormantic.exceptions import NoMatch
@ -111,6 +112,11 @@ async def hood_update(values: BodyHood, hood=Depends(get_hood)):
) )
async def hood_delete(hood=Depends(get_hood)): async def hood_delete(hood=Depends(get_hood)):
""" Deletes hood with id **hood_id**. """ """ Deletes hood with id **hood_id**. """
await Spawner.destroy_hood(hood)
for trigger in await Trigger.objects.filter(hood=hood).all():
await trigger.delete()
for badword in await BadWord.objects.filter(hood=hood).all():
await badword.delete()
for relation in await AdminHoodRelation.objects.filter(hood=hood).all(): for relation in await AdminHoodRelation.objects.filter(hood=hood).all():
await relation.delete() await relation.delete()
await hood.delete() await hood.delete()