def __init__(self, bot, token, responders, flowdock, logger=None): """consumer(responders) bot - the bot token - the user token responders - a set of responders """ self.responders = responders self.bot = bot self.token = token self.stream_assistant = StreamAssistant(self) self.flowdock = flowdock if not logger: self.logger = logging.getLogger('consumers.flowdock') else: self.logger = logger
class FlowDockConsumer(twistedhttpstream.MessageReceiver, Consumer): def __init__(self, bot, token, responders, flowdock, logger=None): """consumer(responders) bot - the bot token - the user token responders - a set of responders """ self.responders = responders self.bot = bot self.token = token self.stream_assistant = StreamAssistant(self) self.flowdock = flowdock if not logger: self.logger = logging.getLogger('consumers.flowdock') else: self.logger = logger def connectionMade(self): self.logger.info("Connection made to flowdock") for id, responder in self.responders: self.handle_response(responder.on_start(self), Request('on_start', User(None, None, 0), 'init', 'flowdock')) def create_request(self, message): if message['event'] == 'comment': text = message['content']['text'] elif message['event'] == 'message': text = message['content'] else: return False return Request(text, User(None, None, int(message['user'])), message['event'], 'flowdock') def messageReceived(self, message): request = self.create_request(message) if not request or request.user.id == 0: return if request.type == 'message' or request.type == 'comment': self.logger.debug("<<< Request: %s" % request.content) responses = self.handle_message(request) for response in responses: self.handle_response(response, request) def handle_message(self, request): responses = [] for id, responder in self.responders: if not responder.support(request): continue self.logger.debug(" Found responder: %s" % responder) responses.append(self.normalize(responder.generate(request), request)) return responses def handle_response(self, response, request): if isinstance(response, StreamResponse): self.stream_assistant.add(response, request) else: self.post(response, request) def post(self, response, request): response = self.normalize(response, request) if response in [False, None]: return if not response.content: return self.logger.debug(">>> Response: %s" % response.content) if len(response.content) > 300: flow_response = requests.post("https://api.flowdock.com/v1/messages/chat/%s" % self.token, data= { "content": "\t response too long, check the flowdock inbox!", "external_user_name": self.bot.name, "tags": response.tags }) if not flow_response.ok: print flow_response self.flowdock.post(self.bot.email, "Response to %s" % response.command, self.markdown(response.content) , from_name=self.bot.name) else: data= { "content": self.format(response.content), "external_user_name": self.bot.name, "tags": response.tags } flow_response = requests.post("https://api.flowdock.com/v1/messages/chat/%s" % self.token, data=data) if not flow_response.ok: print flow_response