class TorrentHandler(RequestHandler):
    # noinspection PyMethodOverriding
    def initialize(self, database, auto_track=True, interval=30):
        self.registry = TorrentRegistry(database, auto_track)
        self.interval = interval

    def get(self):
        """
        :type request: tornado.httputil.HTTPServerRequest
        Take a request, do some some database work, return a peer
        list response.
        """
        try:
            if not all(map(lambda x: x in self.request.query_arguments, ['info_hash', 'compact', 'port', 'peer_id'])):
                raise TorrentRegistryException('Not all arguments set')
            info_hash = self.get_query_argument('info_hash')
            compact = self.get_query_argument('compact').lower() not in ('0', 'false')
            ip = self.request.remote_ip
            port = int(self.get_query_argument('port'))
            peer_id = self.get_query_argument('peer_id')

            event = self.request.args.get('event', [''])[0]
            # TODO: process 'started', 'completed' and 'stopped' events
            if event == 'stopped':
                self.registry.remove_peer(info_hash, peer_id, ip, port)
            else:
                self.registry.add_peer(info_hash, peer_id, ip, port)
            return encode({
                "interval": self.interval,
                "complete": 0,
                "incomplete": 0,
                "peers": self.registry.peer_list(info_hash, compact)
            })
        except TorrentRegistryException, e:
            log.error(e.message)
            return encode({
                'failure reason': e.message
            })
        except Exception, e:
            log.error(e.message)
            return encode({
                'failure reason': (u'Internal server error: %s' % unicode(e)).encode('utf-8')
            })
class TorrentResource(Resource):
    def __init__(self, database, auto_track=True, interval=30):
        Resource.__init__(self)
        self.registry = TorrentRegistry(database, auto_track)
        self.interval = interval

    def render_GET(self, request):
        """
        :type request: twisted.web.http.Request
        Take a request, do some some database work, return a peer
        list response.
        """
        try:
            if not all(map(lambda x: x in request.args, ['info_hash', 'compact', 'port', 'peer_id'])):
                raise TorrentRegistryException('Not all arguments set')
            info_hash = request.args['info_hash'][0]
            compact = request.args['compact'][0].lower() not in ('0', 'false')
            ip = request.client.host
            port = int(request.args['port'][0])
            peer_id = request.args['peer_id'][0]

            event = request.args.get('event', [''])[0]
            # TODO: process 'started', 'completed' and 'stopped' events
            if event == 'stopped':
                self.registry.remove_peer(info_hash, peer_id, ip, port)
            else:
                self.registry.add_peer(info_hash, peer_id, ip, port)
            return encode({
                "interval": self.interval,
                "complete": 0,
                "incomplete": 0,
                "peers": self.registry.peer_list(info_hash, compact)
            })
        except TorrentRegistryException, e:
            log.error(e.message)
            return encode({
                'failure reason': e.message
            })
        except Exception, e:
            log.error(e.message)
            return encode({
                'failure reason': (u'Internal server error: %s' % unicode(e)).encode('utf-8')
            })
 def initialize(self, database, auto_track=True, interval=30):
     self.registry = TorrentRegistry(database, auto_track)
     self.interval = interval
 def __init__(self, database, auto_track=True, interval=30):
     Resource.__init__(self)
     self.registry = TorrentRegistry(database, auto_track)
     self.interval = interval