dr.botzo/dr_botzo/dispatch/views.py

95 lines
3.0 KiB
Python
Raw Normal View History

"""Handle dispatcher API requests."""
from __future__ import unicode_literals
import copy
import logging
import os
import xmlrpclib
from django.conf import settings
from django.shortcuts import get_object_or_404
from rest_framework.response import Response
from rest_framework import generics, status
from dispatch.models import Dispatcher, DispatcherAction
from dispatch.serializers import DispatchMessageSerializer, DispatcherSerializer, DispatcherActionSerializer
log = logging.getLogger('dispatch.views')
class DispatcherList(generics.ListAPIView):
"""List all dispatchers."""
queryset = Dispatcher.objects.all()
serializer_class = DispatcherSerializer
class DispatcherDetail(generics.RetrieveAPIView):
"""Detail the given dispatcher."""
queryset = Dispatcher.objects.all()
serializer_class = DispatcherSerializer
class DispatchMessage(generics.GenericAPIView):
"""Send a message to the given dispatcher."""
queryset = Dispatcher.objects.all()
serializer_class = DispatchMessageSerializer
def get_object(self):
queryset = self.get_queryset()
queryset = self.filter_queryset(queryset)
return get_object_or_404(queryset)
def get(self, request, *args, **kwargs):
dispatcher = self.get_object()
data = {'status': "READY"}
message = self.serializer_class(data=data)
return Response(message.initial_data)
def post(self, request, *args, **kwargs):
dispatcher = self.get_object()
message = self.serializer_class(data=request.data)
if message.is_valid():
for action in dispatcher.actions.all():
if action.type == DispatcherAction.PRIVMSG_TYPE:
bot_url = 'http://{0:s}:{1:d}/'.format(settings.IRCBOT_XMLRPC_HOST, settings.IRCBOT_XMLRPC_PORT)
bot = xmlrpclib.ServerProxy(bot_url)
log.debug("sending '%s' to channel %s", message.data['message'], action.destination)
bot.privmsg(action.destination, message.data['message'])
elif action.type == DispatcherAction.FILE_TYPE:
filename = os.path.abspath(action.destination)
log.debug("sending '%s' to file %s", message.data['message'], filename)
with open(filename, 'w') as f:
f.write(message.data['message'])
f.write('\n')
new_data = copy.deepcopy(message.data)
new_data['status'] = "OK"
new_message = self.serializer_class(data=new_data)
return Response(new_message.initial_data)
return Response(message.errors, status=status.HTTP_400_BAD_REQUEST)
class DispatcherActionList(generics.ListAPIView):
"""List all dispatchers."""
queryset = DispatcherAction.objects.all()
serializer_class = DispatcherActionSerializer
class DispatcherActionDetail(generics.RetrieveAPIView):
"""Detail the given dispatcher."""
queryset = DispatcherAction.objects.all()
serializer_class = DispatcherActionSerializer