73 lines
2.3 KiB
Python
73 lines
2.3 KiB
Python
|
"""Handle dispatcher API requests."""
|
||
|
|
||
|
from __future__ import unicode_literals
|
||
|
|
||
|
import logging
|
||
|
import os
|
||
|
import xmlrpclib
|
||
|
|
||
|
from django.conf import settings
|
||
|
from django.http import Http404
|
||
|
from rest_framework.views import APIView
|
||
|
from rest_framework.response import Response
|
||
|
from rest_framework import generics, status
|
||
|
|
||
|
from dispatch.models import Dispatcher
|
||
|
from dispatch.serializers import DispatchMessageSerializer, DispatcherSerializer
|
||
|
|
||
|
|
||
|
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(APIView):
|
||
|
|
||
|
"""Send a message to the given dispatcher."""
|
||
|
|
||
|
queryset = Dispatcher.objects.none()
|
||
|
|
||
|
def get_object(self, pk):
|
||
|
try:
|
||
|
return Dispatcher.objects.get(pk=pk)
|
||
|
except Dispatcher.DoesNotExist:
|
||
|
raise Http404
|
||
|
|
||
|
def get(self, request, pk, format=None):
|
||
|
dispatcher = self.get_object(pk)
|
||
|
return Response({'message': ""})
|
||
|
|
||
|
def post(self, request, pk, format=None):
|
||
|
dispatcher = self.get_object(pk)
|
||
|
serializer = DispatchMessageSerializer(data=request.data)
|
||
|
if serializer.is_valid():
|
||
|
if dispatcher.type == Dispatcher.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", serializer.data['message'], dispatcher.destination)
|
||
|
bot.privmsg(dispatcher.destination, serializer.data['message'])
|
||
|
return Response({'status': "OK"})
|
||
|
elif dispatcher.type == Dispatcher.FILE_TYPE:
|
||
|
filename = os.path.abspath(dispatcher.destination)
|
||
|
log.debug("sending '%s' to file %s", serializer.data['message'], filename)
|
||
|
with open(filename, 'w') as f:
|
||
|
f.write(serializer.data['message'])
|
||
|
f.write('\n')
|
||
|
return Response({'status': "OK"})
|
||
|
|
||
|
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|