ircbot and notification worker basic functionality works
This commit is contained in:
parent
3715d00701
commit
5bc728a2e8
|
@ -55,12 +55,13 @@ TICKET_CATEGORY_NAME='Tickets'
|
||||||
# schedule settings
|
# schedule settings
|
||||||
SCHEDULE_MIDNIGHT_OFFSET_HOURS=6
|
SCHEDULE_MIDNIGHT_OFFSET_HOURS=6
|
||||||
SCHEDULE_TIMESLOT_LENGTH_MINUTES=30
|
SCHEDULE_TIMESLOT_LENGTH_MINUTES=30
|
||||||
|
SCHEDULE_EVENT_NOTIFICATION_MINUTES=10
|
||||||
|
|
||||||
# irc bot settings
|
# irc bot settings
|
||||||
IRCBOT_CHECK_MESSAGE_INTERVAL_SECONDS=60
|
IRCBOT_CHECK_MESSAGE_INTERVAL_SECONDS=60
|
||||||
IRCBOT_NICK='mybot'
|
IRCBOT_NICK='mybot'
|
||||||
IRCBOT_SCHEDULE_ANNOUNCE_CHANNEL='#test'
|
IRCBOT_SCHEDULE_ANNOUNCE_CHANNEL='#something'
|
||||||
IRCBOT_SERVER_HOSTNAME='ircd.example.com'
|
IRCBOT_SERVER_HOSTNAME='irc.example.com'
|
||||||
IRCBOT_SERVER_PORT=6697
|
IRCBOT_SERVER_PORT=6697
|
||||||
IRCBOT_SERVER_USETLS=True
|
IRCBOT_SERVER_USETLS=True
|
||||||
|
|
||||||
|
|
9
src/camps/utils.py
Normal file
9
src/camps/utils.py
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
from camps.models import Camp
|
||||||
|
from django.utils import timezone
|
||||||
|
|
||||||
|
def get_current_camp():
|
||||||
|
try:
|
||||||
|
return Camp.objects.get(camp__contains=timezone.now())
|
||||||
|
except Camp.DoesNotExist:
|
||||||
|
return False
|
||||||
|
|
45
src/program/management/commands/notification_worker.py
Normal file
45
src/program/management/commands/notification_worker.py
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
from django.core.management.base import BaseCommand
|
||||||
|
from django.conf import settings
|
||||||
|
from django.utils import timezone
|
||||||
|
from time import sleep
|
||||||
|
import irc3, sys, asyncio
|
||||||
|
from ircbot.models import OutgoingIrcMessage
|
||||||
|
from camps.utils import get_current_camp
|
||||||
|
from django.utils import timezone
|
||||||
|
from program.models import EventInstance
|
||||||
|
from datetime import timedelta
|
||||||
|
|
||||||
|
|
||||||
|
class Command(BaseCommand):
|
||||||
|
args = 'none'
|
||||||
|
help = 'Queue notifications for channels and users for upcoming event instances.'
|
||||||
|
|
||||||
|
def output(self, message):
|
||||||
|
self.stdout.write('%s: %s' % (timezone.now().strftime("%Y-%m-%d %H:%M:%S"), message))
|
||||||
|
|
||||||
|
def handle(self, *args, **options):
|
||||||
|
self.output('Schedule notification worker running...')
|
||||||
|
while True:
|
||||||
|
camp = get_current_camp()
|
||||||
|
if camp:
|
||||||
|
print("working with camp %s" % camp)
|
||||||
|
# a camp is currently going on, check if we need to send out any notifications
|
||||||
|
for ei in EventInstance.objects.filter(
|
||||||
|
event__camp=camp,
|
||||||
|
event__event_type__notifications=True,
|
||||||
|
notifications_sent=False,
|
||||||
|
when__startswith__lt=timezone.now()+timedelta(minutes=settings.SCHEDULE_EVENT_NOTIFICATION_MINUTES), # start of event is less than X minutes away
|
||||||
|
when__startswith__gt=timezone.now() # but event has not started yet
|
||||||
|
):
|
||||||
|
# this event is less than settings.SCHEDULE_EVENT_NOTIFICATION_MINUTES minutes from starting, queue an IRC notificatio
|
||||||
|
OutgoingIrcMessage.objects.create(
|
||||||
|
target=settings.IRCBOT_SCHEDULE_ANNOUNCE_CHANNEL,
|
||||||
|
message="starting soon: %s" % ei,
|
||||||
|
timeout=ei.when.lower
|
||||||
|
)
|
||||||
|
ei.notifications_sent=True
|
||||||
|
ei.save()
|
||||||
|
|
||||||
|
# check once per minute
|
||||||
|
sleep(60)
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.10.5 on 2017-02-01 23:18
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('program', '0016_auto_20170131_1849'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='eventinstance',
|
||||||
|
name='notifications_sent',
|
||||||
|
field=models.BooleanField(default=False),
|
||||||
|
),
|
||||||
|
]
|
20
src/program/migrations/0018_eventtype_notifications.py
Normal file
20
src/program/migrations/0018_eventtype_notifications.py
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.10.5 on 2017-02-02 12:29
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('program', '0017_eventinstance_notifications_sent'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='eventtype',
|
||||||
|
name='notifications',
|
||||||
|
field=models.BooleanField(default=False),
|
||||||
|
),
|
||||||
|
]
|
|
@ -14,6 +14,7 @@ class EventType(CreatedUpdatedModel):
|
||||||
slug = models.SlugField()
|
slug = models.SlugField()
|
||||||
color = models.CharField(max_length=50)
|
color = models.CharField(max_length=50)
|
||||||
light_text = models.BooleanField(default=False)
|
light_text = models.BooleanField(default=False)
|
||||||
|
notifications = models.BooleanField(default=False)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.name
|
return self.name
|
||||||
|
@ -50,6 +51,7 @@ class EventInstance(CreatedUpdatedModel):
|
||||||
""" An instance of an event """
|
""" An instance of an event """
|
||||||
event = models.ForeignKey('program.event', related_name='instances')
|
event = models.ForeignKey('program.event', related_name='instances')
|
||||||
when = DateTimeRangeField()
|
when = DateTimeRangeField()
|
||||||
|
notifications_sent = models.BooleanField(default=False)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
ordering = ['when']
|
ordering = ['when']
|
||||||
|
|
Loading…
Reference in a new issue