collapsing all of dr_botzo one directory
This commit is contained in:
0
races/__init__.py
Normal file
0
races/__init__.py
Normal file
7
races/admin.py
Normal file
7
races/admin.py
Normal file
@@ -0,0 +1,7 @@
|
||||
from django.contrib import admin
|
||||
|
||||
from races.models import Race, Racer, RaceUpdate
|
||||
|
||||
admin.site.register(Race)
|
||||
admin.site.register(Racer)
|
||||
admin.site.register(RaceUpdate)
|
||||
191
races/ircplugin.py
Normal file
191
races/ircplugin.py
Normal file
@@ -0,0 +1,191 @@
|
||||
"""Track races and those racing them."""
|
||||
|
||||
import logging
|
||||
|
||||
import irc.client
|
||||
|
||||
from ircbot.lib import Plugin
|
||||
from races.models import Race, Racer, RaceUpdate
|
||||
|
||||
|
||||
log = logging.getLogger('races.ircplugin')
|
||||
|
||||
|
||||
class Races(Plugin):
|
||||
|
||||
"""Track races and allow for logging updates."""
|
||||
|
||||
def start(self):
|
||||
"""Hook handler functions into the IRC library."""
|
||||
|
||||
self.connection.reactor.add_global_regex_handler(['pubmsg', 'privmsg'], r'^!race\s+(\S+)\s+join$',
|
||||
self.join_race)
|
||||
self.connection.reactor.add_global_regex_handler(['pubmsg', 'privmsg'], r'^!race\s+(\S+)\s+leave$',
|
||||
self.leave_race)
|
||||
self.connection.reactor.add_global_regex_handler(['pubmsg', 'privmsg'], r'^!race\s+(\S+)\s+start$',
|
||||
self.start_race)
|
||||
self.connection.reactor.add_global_regex_handler(['pubmsg', 'privmsg'], r'^!race\s+(\S+)\s+finish$',
|
||||
self.finish_race)
|
||||
self.connection.reactor.add_global_regex_handler(['pubmsg', 'privmsg'], r'^!race\s+(\S+)\s+update\s+(.*)$',
|
||||
self.update_race)
|
||||
|
||||
super(Races, self).start()
|
||||
|
||||
def stop(self):
|
||||
"""Unhook handler functions into the IRC library."""
|
||||
|
||||
self.connection.reactor.remove_global_regex_handler(['pubmsg', 'privmsg'], self.join_race)
|
||||
self.connection.reactor.remove_global_regex_handler(['pubmsg', 'privmsg'], self.leave_race)
|
||||
self.connection.reactor.remove_global_regex_handler(['pubmsg', 'privmsg'], self.start_race)
|
||||
self.connection.reactor.remove_global_regex_handler(['pubmsg', 'privmsg'], self.finish_race)
|
||||
self.connection.reactor.remove_global_regex_handler(['pubmsg', 'privmsg'], self.update_race)
|
||||
|
||||
super(Races, self).stop()
|
||||
|
||||
def join_race(self, connection, event, match):
|
||||
"""Join a race."""
|
||||
|
||||
nick = irc.client.NickMask(event.source).nick
|
||||
race_id = match.group(1)
|
||||
try:
|
||||
race = Race.objects.get(key=race_id)
|
||||
|
||||
# is the nick already in the race
|
||||
try:
|
||||
racer = Racer.objects.get(race=race, nick=nick)
|
||||
|
||||
# ideally they're not in the db, but if they aren't flagged as joined,
|
||||
# then let them join again i guess
|
||||
if racer.joined:
|
||||
return self.bot.reply(event, "you are already in {0:s}.".format(race.name))
|
||||
except Racer.DoesNotExist:
|
||||
racer = Racer()
|
||||
racer.race = race
|
||||
racer.nick = nick
|
||||
|
||||
racer.joined = True
|
||||
racer.started = False
|
||||
racer.finished = False
|
||||
racer.save()
|
||||
|
||||
return self.bot.reply(event, "you have joined {0:s}.".format(race.name))
|
||||
except Race.DoesNotExist:
|
||||
return self.bot.reply(event, "race {0:s} not found.".format(race_id))
|
||||
|
||||
def leave_race(self, connection, event, match):
|
||||
"""Leave a race."""
|
||||
|
||||
nick = irc.client.NickMask(event.source).nick
|
||||
race_id = match.group(1)
|
||||
try:
|
||||
race = Race.objects.get(key=race_id)
|
||||
|
||||
try:
|
||||
racer = Racer.objects.get(race=race, nick=nick)
|
||||
|
||||
if racer.finished:
|
||||
return self.bot.reply(event, "you can't leave {0:s} since you finished it."
|
||||
"".format(race.name))
|
||||
|
||||
if racer.joined:
|
||||
racer.joined = False
|
||||
racer.save()
|
||||
|
||||
return self.bot.reply(event, "you have left {0:s}.".format(race.name))
|
||||
else:
|
||||
return self.bot.reply(event, "you weren't in {0:s}.".format(race.name))
|
||||
except Racer.DoesNotExist:
|
||||
return self.bot.reply(event, "you weren't in {0:s}.".format(race.name))
|
||||
except Race.DoesNotExist:
|
||||
return self.bot.reply(event, "race {0:s} not found.".format(race_id))
|
||||
|
||||
def start_race(self, connection, event, match):
|
||||
"""Start racing."""
|
||||
|
||||
nick = irc.client.NickMask(event.source).nick
|
||||
race_id = match.group(1)
|
||||
try:
|
||||
race = Race.objects.get(key=race_id)
|
||||
|
||||
try:
|
||||
racer = Racer.objects.get(race=race, nick=nick)
|
||||
|
||||
if racer.started:
|
||||
return self.bot.reply(event, "you have already started {0:s}.".format(race.name))
|
||||
|
||||
if racer.finished:
|
||||
return self.bot.reply(event, "you can't start {0:s} since you finished it."
|
||||
"".format(race.name))
|
||||
|
||||
racer.started = True
|
||||
racer.save()
|
||||
|
||||
# create an event for this too
|
||||
RaceUpdate.objects.create(race=race, racer=racer, update="Started the race.")
|
||||
|
||||
return self.bot.reply(event, "you have started {0:s}.".format(race.name))
|
||||
except Racer.DoesNotExist:
|
||||
return self.bot.reply(event, "you have not joined {0:s}.".format(race.name))
|
||||
except Race.DoesNotExist:
|
||||
return self.bot.reply(event, "race {0:s} not found.".format(race_id))
|
||||
|
||||
def finish_race(self, connection, event, match):
|
||||
"""Finish racing."""
|
||||
|
||||
nick = irc.client.NickMask(event.source).nick
|
||||
race_id = match.group(1)
|
||||
try:
|
||||
race = Race.objects.get(key=race_id)
|
||||
|
||||
try:
|
||||
racer = Racer.objects.get(race=race, nick=nick)
|
||||
|
||||
if not racer.started:
|
||||
return self.bot.reply(event, "you have not started {0:s}.".format(race.name))
|
||||
|
||||
if racer.finished:
|
||||
return self.bot.reply(event, "you have already finished {0:s}."
|
||||
"".format(race.name))
|
||||
|
||||
racer.finished = True
|
||||
racer.save()
|
||||
|
||||
# create an event for this too
|
||||
RaceUpdate.objects.create(race=race, racer=racer, update="Finished the race.")
|
||||
|
||||
return self.bot.reply(event, "you have finished {0:s}.".format(race.name))
|
||||
except Racer.DoesNotExist:
|
||||
return self.bot.reply(event, "you have not joined {0:s}.".format(race.name))
|
||||
except Race.DoesNotExist:
|
||||
return self.bot.reply(event, "race {0:s} not found.".format(race_id))
|
||||
|
||||
def update_race(self, connection, event, match):
|
||||
"""Add an update to an ongoing race."""
|
||||
|
||||
nick = irc.client.NickMask(event.source).nick
|
||||
race_id = match.group(1)
|
||||
update = match.group(2)
|
||||
try:
|
||||
race = Race.objects.get(key=race_id)
|
||||
|
||||
try:
|
||||
racer = Racer.objects.get(race=race, nick=nick)
|
||||
|
||||
if not racer.started:
|
||||
return self.bot.reply(event, "you have not started {0:s}.".format(race.name))
|
||||
|
||||
if racer.finished:
|
||||
return self.bot.reply(event, "you have already finished {0:s}."
|
||||
"".format(race.name))
|
||||
|
||||
# create an event
|
||||
RaceUpdate.objects.create(race=race, racer=racer, update=update)
|
||||
|
||||
return self.bot.reply(event, "update logged.")
|
||||
except Racer.DoesNotExist:
|
||||
return self.bot.reply(event, "you have not joined {0:s}.".format(race.name))
|
||||
except Race.DoesNotExist:
|
||||
return self.bot.reply(event, "race {0:s} not found.".format(race_id))
|
||||
|
||||
|
||||
plugin = Races
|
||||
56
races/migrations/0001_initial.py
Normal file
56
races/migrations/0001_initial.py
Normal file
@@ -0,0 +1,56 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from django.db import models, migrations
|
||||
import django.utils.timezone
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Race',
|
||||
fields=[
|
||||
('key', models.CharField(max_length=16, serialize=False, primary_key=True)),
|
||||
('name', models.CharField(max_length=255)),
|
||||
('description', models.TextField()),
|
||||
],
|
||||
options={
|
||||
},
|
||||
bases=(models.Model,),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Racer',
|
||||
fields=[
|
||||
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
|
||||
('nick', models.CharField(max_length=64)),
|
||||
('joined', models.BooleanField(default=False)),
|
||||
('started', models.BooleanField(default=False)),
|
||||
('finished', models.BooleanField(default=False)),
|
||||
('race', models.ForeignKey(to='races.Race')),
|
||||
],
|
||||
options={
|
||||
},
|
||||
bases=(models.Model,),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='RaceUpdate',
|
||||
fields=[
|
||||
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
|
||||
('update', models.TextField()),
|
||||
('event_time', models.DateTimeField(default=django.utils.timezone.now)),
|
||||
('race', models.ForeignKey(to='races.Race')),
|
||||
('racer', models.ForeignKey(to='races.Racer')),
|
||||
],
|
||||
options={
|
||||
'ordering': ['event_time'],
|
||||
},
|
||||
bases=(models.Model,),
|
||||
),
|
||||
migrations.AlterUniqueTogether(
|
||||
name='racer',
|
||||
unique_together=set([('nick', 'race')]),
|
||||
),
|
||||
]
|
||||
0
races/migrations/__init__.py
Normal file
0
races/migrations/__init__.py
Normal file
63
races/models.py
Normal file
63
races/models.py
Normal file
@@ -0,0 +1,63 @@
|
||||
"""Models for managing competitive races."""
|
||||
|
||||
import logging
|
||||
|
||||
from django.db import models
|
||||
from django.utils import timezone
|
||||
|
||||
|
||||
log = logging.getLogger('races.models')
|
||||
|
||||
|
||||
class Race(models.Model):
|
||||
|
||||
"""Track a race."""
|
||||
|
||||
key = models.CharField(max_length=16, primary_key=True)
|
||||
name = models.CharField(max_length=255)
|
||||
description = models.TextField()
|
||||
|
||||
def __str__(self):
|
||||
"""Text representation of a race."""
|
||||
|
||||
return "{0:s} ({1:s})".format(self.name, self.key)
|
||||
|
||||
|
||||
class Racer(models.Model):
|
||||
|
||||
"""Track a racer in a race."""
|
||||
|
||||
nick = models.CharField(max_length=64)
|
||||
race = models.ForeignKey(Race)
|
||||
|
||||
joined = models.BooleanField(default=False)
|
||||
started = models.BooleanField(default=False)
|
||||
finished = models.BooleanField(default=False)
|
||||
|
||||
class Meta:
|
||||
unique_together = ('nick', 'race')
|
||||
|
||||
def __str__(self):
|
||||
"""Text representation of a race racer."""
|
||||
|
||||
return "{0:s} in {1:s}".format(self.nick, self.race.name)
|
||||
|
||||
|
||||
class RaceUpdate(models.Model):
|
||||
|
||||
"""Periodic updates for a racer."""
|
||||
|
||||
race = models.ForeignKey(Race)
|
||||
racer = models.ForeignKey(Racer)
|
||||
update = models.TextField()
|
||||
event_time = models.DateTimeField(default=timezone.now)
|
||||
|
||||
class Meta:
|
||||
ordering = ['event_time',]
|
||||
|
||||
def __str__(self):
|
||||
"""Text representation of a race update."""
|
||||
|
||||
local_time = timezone.localtime(self.event_time)
|
||||
return "{0:s} in {1:s} @ {2:s}".format(self.racer.nick, self.race.name,
|
||||
local_time.strftime('%Y-%m-%d %H:%M:%S %Z'))
|
||||
14
races/templates/races/index.html
Normal file
14
races/templates/races/index.html
Normal file
@@ -0,0 +1,14 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}races{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<ul>
|
||||
{% for race in races %}
|
||||
<li><a href="{% url 'race_detail' race.key %}">{{ race.name }}</a></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endblock %}
|
||||
<!--
|
||||
vi:tabstop=4:expandtab:autoindent
|
||||
-->
|
||||
14
races/templates/races/race_detail.html
Normal file
14
races/templates/races/race_detail.html
Normal file
@@ -0,0 +1,14 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block title %}race: {{ race.name }}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<ul>
|
||||
{% for update in race.raceupdate_set.all %}
|
||||
<li>{{ update.racer.nick }} — {{ update.update }} — {{ update.event_time }}</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endblock %}
|
||||
<!--
|
||||
vi:tabstop=4:expandtab:autoindent
|
||||
-->
|
||||
6
races/urls.py
Normal file
6
races/urls.py
Normal file
@@ -0,0 +1,6 @@
|
||||
from django.conf.urls import patterns, url
|
||||
|
||||
urlpatterns = patterns('races.views',
|
||||
url(r'^$', 'index', name='races_index'),
|
||||
url(r'^race/(?P<race_id>[A-Za-z0-9]+)/$', 'race_detail', name='race_detail'),
|
||||
)
|
||||
26
races/views.py
Normal file
26
races/views.py
Normal file
@@ -0,0 +1,26 @@
|
||||
"""Display race statuses and whatnot."""
|
||||
|
||||
import logging
|
||||
|
||||
from django.shortcuts import get_object_or_404, render
|
||||
|
||||
from races.models import Race, Racer, RaceUpdate
|
||||
|
||||
|
||||
log = logging.getLogger('races.views')
|
||||
|
||||
|
||||
def index(request):
|
||||
"""Display a list of races."""
|
||||
|
||||
races = Race.objects.all()
|
||||
|
||||
return render(request, 'races/index.html', {'races': races})
|
||||
|
||||
|
||||
def race_detail(request, race_id):
|
||||
"""Display a race detail."""
|
||||
|
||||
race = get_object_or_404(Race, pk=race_id)
|
||||
|
||||
return render(request, 'races/race_detail.html', {'race': race})
|
||||
Reference in New Issue
Block a user