Skip to content

Commit

Permalink
enhacement of signals
Browse files Browse the repository at this point in the history
  • Loading branch information
jlmadurga committed Apr 13, 2016
1 parent 9da7603 commit 500fcbe
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 51 deletions.
1 change: 1 addition & 0 deletions microbot/__init__.py
@@ -1 +1,2 @@
__version__ = '1.1.1'
default_app_config = "microbot.apps.MicrobotAppConfig"
23 changes: 23 additions & 0 deletions microbot/apps.py
@@ -0,0 +1,23 @@
from django.apps import AppConfig
from django.apps import apps
from django.db.models import signals


def connect_bot_signals():
from . import signals as handlers
signals.pre_save.connect(handlers.validate_bot,
sender=apps.get_model("microbot", "Bot"),
dispatch_uid='bot_validate')
signals.post_save.connect(handlers.set_bot_webhook,
sender=apps.get_model("microbot", "Bot"),
dispatch_uid='bot_set_webhook')
signals.post_save.connect(handlers.set_bot_api_data,
sender=apps.get_model("microbot", "Bot"),
dispatch_uid='bot_set_api_data')

class MicrobotAppConfig(AppConfig):
name = "microbot"
verbose_name = "Microbot"

def ready(self):
connect_bot_signals()
51 changes: 0 additions & 51 deletions microbot/models/bot.py
Expand Up @@ -3,9 +3,6 @@
from django.utils.encoding import python_2_unicode_compatible
from django.utils.translation import ugettext_lazy as _
from telegram import Bot as BotAPI
from django.db.models.signals import post_save, pre_save
from django.dispatch import receiver
from django.core.urlresolvers import reverse
import logging
from microbot.models.base import MicrobotModel
from microbot.models import User, ChatState
Expand All @@ -17,15 +14,9 @@
from django.conf import settings
from django.db.models import Q
from microbot import validators
import re
from django.core.exceptions import ValidationError

logger = logging.getLogger(__name__)

def validate_token(value):
if not re.match('[0-9]+:[-_a-zA-Z0-9]+', value):
raise ValidationError(_("%(value)s is not a valid token"), params={'value': value})

@python_2_unicode_compatible
class Bot(MicrobotModel):
owner = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='bots', help_text=_("User who owns the bot"))
Expand Down Expand Up @@ -109,45 +100,3 @@ def send_message(self, chat_id, text, parse_mode=None, disable_web_page_preview=
except:
logger.error("Error trying to send message:(chat:%s,text:%s,parse_mode:%s,disable_preview:%s,kwargs:%s" %
(chat_id, text, parse_mode, disable_web_page_preview, kwargs))

@receiver(pre_save, sender=Bot)
def validate_bot(sender, instance, **kwargs):
validate_token(instance.token)


def get_site_domain():
from django.contrib.sites.models import Site
current_site = Site.objects.get_current()
return current_site.domain

@receiver(post_save, sender=Bot)
def set_api(sender, instance, **kwargs):
# set bot api if not yet
if not instance._bot:
instance._bot = BotAPI(instance.token)
try:
# set webhook
url = None
if instance.enabled:
webhook = reverse('microbot:telegrambot', kwargs={'hook_id': instance.hook_id})
url = 'https://' + getattr(settings, 'MICROBOT_WEBHOOK_DOMAIN', get_site_domain()) + webhook
instance._bot.setWebhook(webhook_url=url)
logger.info("Success: Webhook url %s for bot %s set" % (url, str(instance)))

except:
instance.delete()
logger.error("Failure: Webhook url %s for bot %s not set" % (url, str(instance)))
raise

try:
# complete Bot instance with api data
if not instance.user_api:
bot_api = instance._bot.getMe()
user_api, _ = User.objects.get_or_create(**bot_api.to_dict())
instance.user_api = user_api
instance.save()
logger.info("Success: Bot api info for bot %s set" % str(instance))
except:
instance.delete()
logger.error("Failure: Bot api info for bot %s no set" % str(instance))
raise
54 changes: 54 additions & 0 deletions microbot/signals.py
@@ -0,0 +1,54 @@
from telegram import Bot as BotAPI
from django.core.urlresolvers import reverse
from django.conf import settings
import logging
from microbot.validators import validate_token
from django.apps import apps


logger = logging.getLogger(__name__)

def set_bot_webhook(sender, instance, **kwargs):
def get_site_domain():
from django.contrib.sites.models import Site
current_site = Site.objects.get_current()
return current_site.domain

# set bot api if not yet
if not instance._bot:
instance._bot = BotAPI(instance.token)
try:
# set webhook
url = None
if instance.enabled:
webhook = reverse('microbot:telegrambot', kwargs={'hook_id': instance.hook_id})
url = 'https://' + getattr(settings, 'MICROBOT_WEBHOOK_DOMAIN', get_site_domain()) + webhook
instance._bot.setWebhook(webhook_url=url)
logger.info("Success: Webhook url %s for bot %s set" % (url, str(instance)))

except:
instance.delete()
logger.error("Failure: Webhook url %s for bot %s not set" % (url, str(instance)))
raise

def set_bot_api_data(sender, instance, **kwargs):
# set bot api if not yet
if not instance._bot:
instance._bot = BotAPI(instance.token)

try:
# complete Bot instance with api data
if not instance.user_api:
bot_api = instance._bot.getMe()
User = apps.get_model('microbot', 'User')
user_api, _ = User.objects.get_or_create(**bot_api.to_dict())
instance.user_api = user_api
instance.save()
logger.info("Success: Bot api info for bot %s set" % str(instance))
except:
instance.delete()
logger.error("Failure: Bot api info for bot %s no set" % str(instance))
raise

def validate_bot(sender, instance, **kwargs):
validate_token(instance.token)

0 comments on commit 500fcbe

Please sign in to comment.