queue an irc message when we sell a ticket

This commit is contained in:
Thomas Steen Rasmussen 2017-07-03 19:28:50 +02:00
parent 4d9663123a
commit 5c689e4076
6 changed files with 75 additions and 6 deletions

View file

@ -18,7 +18,6 @@ class Plugin(object):
def __init__(self, bot):
self.bot = bot
self.log = self.bot.log
###############################################################################################
@ -69,7 +68,7 @@ class Plugin(object):
This method gets unprocessed OutgoingIrcMessage objects and attempts to send them to
the target channel. Messages are skipped if the bot is not in the channel.
"""
logger.debug("inside get_outgoing_messages()")
#logger.debug("inside get_outgoing_messages()")
for msg in OutgoingIrcMessage.objects.filter(processed=False).order_by('created'):
# if this message expired mark it as expired and processed without doing anything
if msg.timeout < timezone.now():
@ -92,7 +91,7 @@ class Plugin(object):
else:
logger.warning("skipping message to %s" % msg.target)
# call this function again in 60 seconds
# call this function again in X seconds
self.bot.loop.call_later(settings.IRCBOT_CHECK_MESSAGE_INTERVAL_SECONDS, self.bot.get_outgoing_messages)

29
src/ircbot/ircworker.py Normal file
View file

@ -0,0 +1,29 @@
from .models import OutgoingIrcMessage
from django.conf import settings
import logging, irc3
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger('bornhack.%s' % __name__)
def do_work():
"""
Run irc3 module code, wait for events on IRC and wait for messages in OutgoingIrcMessage
"""
config = {
'nick': settings.IRCBOT_NICK,
'autojoins': [settings.IRCBOT_SCHEDULE_ANNOUNCE_CHANNEL],
'host': settings.IRCBOT_SERVER_HOSTNAME,
'port': settings.IRCBOT_SERVER_PORT,
'ssl': settings.IRCBOT_SERVER_USETLS,
'timeout': 30,
'includes': [
'ircbot.irc3module',
],
}
logger.debug("Connecting to IRC with the following config: %s" % config)
try:
irc3.IrcBot(**config).run(forever=True)
except Exception as E:
logger.exception("Got exception inside do_work for %s" % self.workermodule)
raise

View file

@ -0,0 +1,2 @@
default_app_config = 'shop.apps.ShopConfig'

View file

@ -1,5 +1,12 @@
from django.apps import AppConfig
from .signal_handlers import ticket_created
from django.db.models.signals import post_save
import logging
logger = logging.getLogger("bornhack.%s" % __name__)
class ShopConfig(AppConfig):
name = 'shop'
def ready(self):
post_save.connect(ticket_created, sender='shop.Ticket')

View file

@ -0,0 +1,28 @@
from django.utils import timezone
from django.conf import settings
from datetime import timedelta
from django.db.models import Count
import logging
logger = logging.getLogger("bornhack.%s" % __name__)
def ticket_created(sender, instance, created, **kwargs):
# only send a message when a ticket is created
if not created:
return
# queue an IRC message to the orga channel if any is defined, otherwise for the default channel
target = settings.IRCBOT_CHANNELS['orga'] if 'orga' in settings.IRCBOT_CHANNELS else settings.IRCBOT_CHANNELS['default']
# get ticket stats, FIXME: Camp name is hardcoded here for now
from shop.models import Ticket
stats = ", ".join(["%s: %s" % (tickettype['product__name'], tickettype['total']) for tickettype in Ticket.objects.filter(product__name__startswith="BornHack 2017").values('product__name').annotate(total=Count('product__name')).order_by('product__name')])
# queue the message
from ircbot.models import OutgoingIrcMessage
OutgoingIrcMessage.objects.create(
target=target,
message="%s sold! Totals: %s" % (instance.product.name, stats),
timeout=timezone.now()+timedelta(minutes=10)
)

View file

@ -53,8 +53,12 @@ class Command(BaseCommand):
logger.info("Entering main loop...")
while True:
# run worker code
getattr(self.workermodule, 'do_work')()
try:
# run worker code
getattr(self.workermodule, 'do_work')()
except Exception as E:
logger.exception("Got exception inside do_work for %s" % self.workermodule)
sys.exit(1)
# sleep for N seconds before calling worker code again
i = 0