Titivillus/quest/events.py

156 lines
3.8 KiB
Python
Raw Normal View History

#!/usr/bin/env python3
"""
Individual functions for handling WebSocket events. Gets called by the
QuestConsumer object in consumers.py.
"""
2018-08-20 07:23:33 -04:00
import re
2018-08-16 15:43:43 -04:00
import time
import types
2018-08-21 07:18:03 -04:00
import random
2018-08-16 15:43:43 -04:00
import bleach
2018-08-21 09:01:16 -04:00
from django.utils.timezone import localtime
2018-08-16 15:43:43 -04:00
2018-08-21 09:01:16 -04:00
from quest.models import Message, Quest, Post
2018-08-23 07:40:28 -04:00
from quest.forms import DiceCallForm
def message(socket, data):
"""
Gets called when the server receives a 'message' event.
"""
# TODO: validation
message = data.get('message')
quest_id = data.get('quest_id')
2018-08-16 15:43:43 -04:00
2018-08-21 07:18:03 -04:00
# cleaning
2018-08-16 15:43:43 -04:00
message = message.strip()
if not message:
return
tags = ["b", "code", "i", "s"]
message = bleach.clean(message, tags=tags)
2018-08-20 07:23:33 -04:00
2018-08-21 07:18:03 -04:00
# greentext
2018-08-20 07:23:33 -04:00
lines = []
for line in message.splitlines():
if line.startswith(">") and not line.startswith(">>"):
line = '<span class="greenText">' + line + '</span>'
lines.append(line)
message = "<br>".join(lines)
2018-08-21 07:18:03 -04:00
# quote links
2018-08-20 07:23:33 -04:00
quotes = re.findall(r"&gt;&gt;\d+", message)
for quote in quotes:
msg_id = quote.replace("&gt;&gt;", "")
msg = '<a class="quotelink" '
msg += 'href="javascript:scrollToMsg(\'' + msg_id + '\')" '
msg += 'onmousemove="showPreview(event, \'' + msg_id + '\')" '
msg += 'onmouseout="clearPreview()">' + quote + '</a>'
message = message.replace(quote, msg)
2018-08-21 07:18:03 -04:00
# handle image
# dice rolling
if any(map(message.startswith, ["/dice", "/roll"])):
reg = re.search(r"(\d+)d(\d+)([+-]\d+)?", data["message"])
if not reg:
return
try:
groups = [0 if d is None else int(d) for d in reg.groups()]
dice_num, dice_sides, dice_mod = groups
assert 0 < dice_num < 100
assert 0 < dice_sides < 100
assert -1000 < dice_mod < 1000
except (ValueError, AssertionError):
return
dice = [random.randint(1, dice_sides) for _ in range(dice_num)]
total = sum(dice) + dice_mod
roll_msg = f"Rolled {', '.join(map(str, dice))}"
if dice_mod:
if dice_mod > 0:
roll_msg += " + " + str(dice_mod)
else:
roll_msg += " - " + str(dice_mod)[1:]
roll_msg += " = " + str(total)
message += '<hr class="msgSrvHr" /><b>' + roll_msg + "</b>"
user = socket.scope['user']
m = Message(
quest=Quest.objects.get(id=quest_id),
message=message)
if user.username:
m.user = user
m.save()
data = {}
data['message_id'] = m.id
2018-08-16 15:43:43 -04:00
data['message'] = message
data['date'] = int(time.time())
data['name'] = user.username
socket.send('message', data)
2018-08-21 09:01:16 -04:00
def text_post(socket, data):
"""
Called when the QM creates a new text post.
"""
2018-08-23 07:40:28 -04:00
# TODO: security
2018-08-21 09:01:16 -04:00
quest_id = data.get('quest_id')
2018-08-23 07:40:28 -04:00
post_text = data.get('text')
2018-08-21 09:01:16 -04:00
page_num = data.get('page_num')
# cleaning
2018-08-23 07:40:28 -04:00
post_text = bleach.clean(post_text.strip())
post_text = text.replace("\n", "<br>")
2018-08-21 09:01:16 -04:00
# handle image
p = Post(
quest=Quest.objects.get(id=quest_id),
page_num=page_num,
post_type='text',
2018-08-23 07:40:28 -04:00
post_text=post_text)
2018-08-21 09:01:16 -04:00
p.save()
data = {}
2018-08-23 07:40:28 -04:00
data['post_text'] = post_text
2018-08-21 09:01:16 -04:00
data['post_type'] = 'text'
data['date'] = localtime(p.timestamp).strftime('%Y-%m-%d %H:%M')
data['post_id'] = p.id
socket.send('new_post', data)
2018-08-23 07:40:28 -04:00
def dice_post(socket, data):
"""
Called when the QM makes a new dice post.
"""
quest_id = data.get('quest_id')
page_num = data.get('page_num')
form = DiceCallForm(data)
if not form.is_valid():
return # error message?
dice_roll = str(form.cleaned_data['diceNum']) + "d"
dice_roll += str(form.cleaned_data['diceSides'])
if form.cleaned_data['diceMod']:
if form.cleaned_data['diceMod'] > 0:
dice_roll += "+"
dice_roll += str(form.cleaned_data['diceMod'])
post_text = "Roll " + dice_roll
if form.cleaned_data['diceChal']:
post_text += " vs DC" + str(form.cleaned_data['diceChal'])
data = {}
data['post_text'] = post_text
data['post_type'] = 'dice'
data['date'] = int(time.time())
data['post_id'] = 1
socket.send('new_post', data)
events = {}
for obj in dir():
if type(locals()[obj]) == types.FunctionType:
events[locals()[obj].__name__] = locals()[obj]