Ejemplo n.º 1
0
    def send_message(self, chat_id, text, keyboard, reply_message=None, user=None):
        texts = text.strip().split('\\n')
        msgs = []
        for txt in texts:
            for chunk in textwrap.wrap(txt, 320):
                msgs.append(messages.Message(text=chunk))

        if keyboard:
            if len(msgs[-1].text) <= 45:
                title = msgs.pop().text
            else:
                new_texts = textwrap.wrap(msgs[-1].text, 45)
                msgs[-1].text = " ".join(new_texts[:-1])
                title = new_texts[-1]
            elements = []
            for chunk_buttons, last in self.batch(keyboard[0:30], 3):
                elements.append(Element(title=title, buttons=chunk_buttons))
            generic_template = GenericTemplate(elements)
            attachment = TemplateAttachment(generic_template)
            msgs.append(messages.Message(attachment=attachment))

        for msg in msgs:
            try:
                logger.debug("Message to send:(%s)" % msg.to_dict())
                recipient = messages.Recipient(recipient_id=chat_id)
                self._bot.send(messages.MessageRequest(recipient, msg))
                logger.debug("Message sent OK:(%s)" % msg.to_dict())
            except:
                exctype, value = sys.exc_info()[:2]
                logger.error("Error trying to send message:(%s): %s:%s" % (msg.to_dict(), exctype, value))
Ejemplo n.º 2
0
def handle_text(fbid, data):
    """
    Handles the sending to messenger of a text message
    """
    recipient = messages.Recipient(recipient_id=fbid)
    if (data["api_call"] == False):
        message = messages.Message(text=data["text"])
        request = messages.MessageRequest(recipient, message)
        messenger.send(request)
    else:
        criteria = data["criteria"]
        criteria_list = []
        for criterion in criteria:
            crit = Criteria(criterion["name"], criterion["value"])
            criteria_list.append(crit)
        wine_list = api.get_wines_by_criteria(criteria_list)
        text = ""

        for wine in wine_list:
            text += wine.get_name().decode('utf-8')
            text += "," + wine.get_appellation().decode('utf-8')
            text += "," + str(wine.get_vintage())
            text += "\n"

        pprint(wine_list)

        if not text:
            text = 'Aucun vin de correspond à votre recherche'

        message = messages.Message(text=text)
        request = messages.MessageRequest(recipient, message)
        messenger.send(request)
Ejemplo n.º 3
0
 def _fetch_history(self, date, year=None):
     '''Fetches the history and prepares the response.'''
     items = []
     for item in history_api.date(date.month, date.day, year):
         items.append(messages.Message(text=str(item)))
     if not items:
         items.append(
             messages.Message(
                 text='Nothing special found in history for this date'))
     return items
Ejemplo n.º 4
0
    def test_client_send_error_with_no_error_data(self, mock_post):

        mock_post.return_value.status_code = 190
        mock_post.return_value.json.return_value = {
            'error': {
                u'message':
                u'This Page access token belongs to a Page that has been deleted.',
                u'code': 190,
                u'type': u'OAuthException'
            }
        }

        messenger = MessengerClient(access_token='1234')

        recipient = messages.Recipient(recipient_id='123')
        message = messages.Message(text='Hello World')
        request = messages.MessageRequest(recipient, message)
        self.assertRaises(MessengerException, messenger.send, request)
        mock_post.assert_called_with(
            'https://graph.facebook.com/v2.6/me/messages',
            json={
                "message": {
                    "text": "Hello World"
                },
                "recipient": {
                    "id": "123"
                }
            },
            params={'access_token': '1234'})
Ejemplo n.º 5
0
def handle_api_call(fbid):
    """
    TODO: write description
    """
    recipient = messages.Recipient(recipient_id=fbid)

    text = ""
    criteria_data = db.get_criteria_data_by_id(fbid)
    if criteria_data is not None:
        wine_list = api.build_wine_list(criteria_data, RESULTS_LIMIT)
        text = "Voici les meilleurs vins présentants les critères recherchés :\n".decode(
            'utf-8')
        res = ""
        for wine in wine_list:
            res += "- "
            res += wine.get_name().decode('utf-8')
            res += ", " + wine.get_appellation().decode('utf-8').upper()
            res += " (" + str(wine.get_vintage()) + ")"
            res += ", " + str(wine.get_price()) + " euros"
            res += " (score : " + str(wine.get_global_score()) + ")"
            res += "\n"

        pprint(wine_list)

        if not res:
            res = "Aucun vin ne correspond à votre recherche".decode('utf-8')

        text += res
    else:
        text = "Une erreur s'est produite"

    message = messages.Message(text=text)
    request = messages.MessageRequest(recipient, message)
    messenger.send(request)
Ejemplo n.º 6
0
def messageReceived(data, recipient):
    if not 'message' in data or not 'text' in data['message']:
        return "ok"

    receivedMessage = data['message']['text']
    userData = findUserInDatabase(recipient.recipient_id)

    # Ce uporabnika se ni v bazi, mu posljemo uvodno sporocilo
    if not userData:
        userName = getUserName(recipient.recipient_id)
        sendMessage(
            recipient,
            "Živjo {}! 😄\nSem Branko, tvoj digitalni asistent, ki ti pomaga pri odjavi in prijavi na šolsko malico."
            .format(userName))
        typingIndicatorOn(recipient)
        time.sleep(0.8)
        sendMessage(
            recipient,
            "Preden ti lahko pomagam moraš imeti ustvarjen račun na šolski spletni strani za upravljanje z malico."
        )
        typingIndicatorOn(recipient)
        time.sleep(1)
        message = messages.Message(attachment=priponkaPrijava)
        req = messages.MessageRequest(recipient, message)
        messenger.send(req)
        return "ok"

    # Ce je uporabnik ze prijavljen ugotovimo kaj sploh zeli narediti
    parseUserMessage(receivedMessage, recipient)
Ejemplo n.º 7
0
    def test_client_send_error_with_error_data(self, mock_post):

        mock_post.return_value.status_code = 190
        mock_post.return_value.json.return_value = {
            "error": {
                "message": "Invalid parameter",
                "type": "FacebookApiException",
                "code": 100,
                "error_data": "No matching user found.",
                "fbtrace_id": "D2kxCybrKVw"
            }
        }

        messenger = MessengerClient(access_token='1234')

        recipient = messages.Recipient(recipient_id='123')
        message = messages.Message(text='Hello World')
        request = messages.MessageRequest(recipient, message)
        self.assertRaises(MessengerException, messenger.send, request)
        mock_post.assert_called_with(
            'https://graph.facebook.com/v2.6/me/messages',
            json={
                "message": {
                    "text": "Hello World"
                },
                "recipient": {
                    "id": "123"
                }
            },
            params={'access_token': '1234'})
Ejemplo n.º 8
0
    def test_message_notification_type(self):
        message = messages.Message(text='Hello World')
        request = messages.MessageRequest(self.recipient, message, 'INVALID')
        self.assertRaises(ValueError, request.serialise)

        request = messages.MessageRequest(self.recipient, message, 'REGULAR')
        self.assertIsInstance(request.serialise(), str)
Ejemplo n.º 9
0
def respond_to_client(sender_id, message):
    recipient = messages.Recipient(recipient_id=sender_id)
    result = chat.respond(message, session_id=sender_id)
    response = messages.MessageRequest(recipient,
                                       messages.Message(text=result))
    # send message to Messenger
    messenger.send(response)
def ask_user_for_origin(user_id, savedHome, savedUniversity):
    recipient = messages.Recipient(user_id)
    if savedHome:
        home_location_button = elements.PostbackButton(title=savedHome,
                                                       payload="useSavedHome")
    if savedUniversity:
        university_location_button = elements.PostbackButton(
            title=savedUniversity, payload="useSavedUniversity")
    other_location_button = elements.PostbackButton(title="Other",
                                                    payload="useOtherLocation")
    if savedHome and savedUniversity:
        template = templates.ButtonTemplate(text="What about for your origin?",
                                            buttons=[
                                                home_location_button,
                                                university_location_button,
                                                other_location_button
                                            ])
    elif savedHome:
        template = templates.ButtonTemplate(
            text="What about for your origin?",
            buttons=[home_location_button, other_location_button])
    elif savedUniversity:
        template = templates.ButtonTemplate(
            text="What about for your origin?",
            buttons=[university_location_button, other_location_button])
    attachment = attachments.TemplateAttachment(template=template)
    message = messages.Message(attachment=attachment)
    request = messages.MessageRequest(recipient, message)
    messenger.send(request)
    return
def askUserForDestination(user_id, savedHome, savedUniversity):
    recipient = messages.Recipient(user_id)
    if savedHome:
        home_location_button = elements.PostbackButton(title=savedHome,
                                                       payload="useSavedHome")
    if savedUniversity:
        university_location_button = elements.PostbackButton(
            title=savedUniversity, payload="useSavedUniversity")
    other_location_button = elements.PostbackButton(title="Other",
                                                    payload="useOtherLocation")
    if savedHome and savedUniversity:
        template = templates.ButtonTemplate(
            text=
            "Would you like to use a previous location as your destination?",
            buttons=[
                home_location_button, university_location_button,
                other_location_button
            ])
    elif savedHome:
        template = templates.ButtonTemplate(
            text=
            "Would you like to use a previous location as your destination?",
            buttons=[home_location_button, other_location_button])
    elif savedUniversity:
        template = templates.ButtonTemplate(
            text=
            "Would you like to use a previous location as your destination?",
            buttons=[university_location_button, other_location_button])
    attachment = attachments.TemplateAttachment(template=template)
    message = messages.Message(attachment=attachment)
    request = messages.MessageRequest(recipient, message)
    messenger.send(request)
    return
Ejemplo n.º 12
0
def respondToClient(sender_id, message):
    chat.conversation[sender_ïd].append(message)
    while message[-1] in ".!": message = message[:-1]
    result = chat.respond(message, sessionID=sender_id)
    chat.conversation[sender_id].append(result)
    response = messages.messageRequest(recipient, messages.Message(text=result))
    messenger.send(response)
Ejemplo n.º 13
0
    def test_text_message(self):
        message = messages.Message(text='Hello World')
        request = messages.MessageRequest(self.recipient, message)

        self.assertEquals(
            request.serialise(),
            '{"message": {"text": "Hello World"}, "recipient": {"id": "123"}}')
def start_over(user_id, context):
    global user_conversations
    user_dictionary = next(item for item in user_conversations
                           if item["recipient"]['id'] == user_id)
    user_dictionary['context'] = {}
    user_dictionary['payment'] = {
        "name": "",
        "cardNumber": "",
        "phoneNumber": "",
        "email": "",
        "address": "",
        "railcard": ""
    }
    recipient = messages.Recipient(user_id)
    buy_tickets_button = elements.PostbackButton(title="Buy Tickets",
                                                 payload="buyTickets")
    help_button = elements.PostbackButton(title="Display Help",
                                          payload="displayHelp")
    template = templates.ButtonTemplate(
        text="Is there anything else I can help you with?",
        buttons=[buy_tickets_button, help_button])
    attachment = attachments.TemplateAttachment(template=template)
    message = messages.Message(attachment=attachment)
    request = messages.MessageRequest(recipient, message)
    messenger.send(request)
def ask_ticket_speed_references(user_id, context):
    global user_conversations
    user_dictionary = next(item for item in user_conversations
                           if item["recipient"]['id'] == user_id)
    recipient = messages.Recipient(user_id)
    if 'returnTime' in context:
        if user_dictionary['ticketPreference'] == "":
            cheaper_button = elements.PostbackButton(
                title="Cheaper", payload="ticketPreferenceCheaper")
            sweet_spot_button = elements.PostbackButton(
                title="Sweet Spot", payload="ticketPreferenceSweetSpot")
            faster_button = elements.PostbackButton(
                title="Faster", payload="ticketPreferenceFaster")
            template = templates.ButtonTemplate(
                text="What are your ticket preferences?",
                buttons=[cheaper_button, sweet_spot_button, faster_button])
        else:
            use_old_preference_button = elements.PostbackButton(
                title="Use " + user_dictionary['ticketPreference'],
                payload="useOldTicketPreference")
            dont_use_old_preference_button = elements.PostbackButton(
                title="Change ticket prefs", payload="changePreferences")
            template = templates.ButtonTemplate(
                text="You have a saved preference. Would you like to use that?",
                buttons=[
                    use_old_preference_button, dont_use_old_preference_button
                ])
        attachment = attachments.TemplateAttachment(template=template)
        message = messages.Message(attachment=attachment)
        request = messages.MessageRequest(recipient, message)
        messenger.send(request)
    return context
Ejemplo n.º 16
0
def handle_text(fbid, data):
    """
    Handles the sending to messenger of a text message
    """
    recipient = messages.Recipient(recipient_id=fbid)
    message = messages.Message(text=data["text"])
    request = messages.MessageRequest(recipient, message)
    messenger.send(request)
Ejemplo n.º 17
0
def accountLinkingReceived(data, recipient):
    status = data['account_linking']['status']
    if status == 'linked':
        # Uporabnik se je ravnokar povezal
        authorizationCode = data['account_linking']['authorization_code']
        message = messages.Message(
            text='Super, prijavil si se kot {}'.format(authorizationCode))
        messageRequest = messages.MessageRequest(recipient, message)
        messenger.send(messageRequest)
        message = messages.Message(attachment=priponkaPomoc)
        messageRequest = messages.MessageRequest(recipient, message)
        messenger.send(messageRequest)
    elif status == 'unlinked':
        removeUserFromDatabase(recipient.recipient_id)
        message = messages.Message(text='Uspešno si izbrisal svoj račun.')
        messageRequest = messages.MessageRequest(recipient, message)
        messenger.send(messageRequest)
Ejemplo n.º 18
0
def handle_error(fbid):
    """
    Sends an error message to messenger
    """
    recipient = messages.Recipient(recipient_id=fbid)
    message = messages.Message(text='Oups, une erreur est survenue.')
    request = messages.MessageRequest(recipient, message)
    messenger.send(request)
Ejemplo n.º 19
0
 def test_image_url(self):
     attachment = attachments.ImageAttachment(
         url='https://petersapparel.com/img/shirt.png')
     message = messages.Message(attachment=attachment)
     request = messages.MessageRequest(self.recipient, message)
     self.assertEquals(
         request.serialise(),
         '{"message": {"attachment": {"type": "image", "payload": {"url": "https://petersapparel.com/img/shirt.png"}}}, "recipient": {"id": "123"}}'
     )
def send_yes_no_template(user_id):
    recipient = messages.Recipient(user_id)
    yes_button = elements.PostbackButton(title="Yes",
                                         payload="yesConfirmation")
    no_button = elements.PostbackButton(title="No", payload="noConfirmation")
    template = templates.ButtonTemplate(text="Is this correct?",
                                        buttons=[yes_button, no_button])
    attachment = attachments.TemplateAttachment(template=template)
    message = messages.Message(attachment=attachment)
    request = messages.MessageRequest(recipient, message)
    messenger.send(request)
Ejemplo n.º 21
0
def respond_to_client(sender_id,message):
    recipient = messages.Recipient(recipient_id=sender_id)
    chat.attr[sender_id]={"match":None,"pmatch":None,"_quote": False}
    chat.conversation[sender_id].append(message)
    message = message.rstrip(".! \n\t")
    result = chat.respond(message,session_id=sender_id)
    chat.conversation[sender_id].append(result)
    response = messages.MessageRequest(recipient, messages.Message(text=result))
    #send message to Messenger
    messenger.send(response)
    del chat.attr[sender_id]
def ask_to_save_payment(user_id, context):
    recipient = messages.Recipient(user_id)
    yes_button = elements.PostbackButton(title="Yes", payload="yesPayment")
    no_button = elements.PostbackButton(title="No", payload="noPayment")
    template = templates.ButtonTemplate(
        text="Awesome. Would you like to save these details for next time?",
        buttons=[yes_button, no_button])
    attachment = attachments.TemplateAttachment(template=template)
    message = messages.Message(attachment=attachment)
    request = messages.MessageRequest(recipient, message)
    messenger.send(request)
    pass
Ejemplo n.º 23
0
def handle_welcome(fbid, received_message):
    recipient = messages.Recipient(recipient_id=fbid)
    red_button = elements.PostbackButton(title='Rouge', payload='Rouge')
    white_button = elements.PostbackButton(title='Blanc', payload='Blanc')
    rose_button = elements.PostbackButton(title='Rose', payload='Rose')
    template = templates.ButtonTemplate(
        text='Bonjour, quelle couleur de vin desirez-vous ?',
        buttons=[red_button, white_button, rose_button])
    attachment = attachments.TemplateAttachment(template=template)
    message = messages.Message(attachment=attachment)
    request = messages.MessageRequest(recipient, message)
    messenger.send(request)
def ask_return_date(user_id, context):
    recipient = messages.Recipient(user_id)
    one_way_button = elements.PostbackButton(title="One way only",
                                             payload="oneWayTicket")
    template = templates.ButtonTemplate(
        text=
        "What date and time would you like to return? Please type if not one way.",
        buttons=[one_way_button])
    attachment = attachments.TemplateAttachment(template=template)
    message = messages.Message(attachment=attachment)
    request = messages.MessageRequest(recipient, message)
    messenger.send(request)
    return context
def send_single_or_return_template(user_id):
    recipient = messages.Recipient(user_id)
    single_button = elements.PostbackButton(title="Single",
                                            payload="singleTicket")
    return_button = elements.PostbackButton(title="Return",
                                            payload="returnTicket")
    template = templates.ButtonTemplate(
        text="Would you like a Single or a Return ticket?",
        buttons=[single_button, return_button])
    attachment = attachments.TemplateAttachment(template=template)
    message = messages.Message(attachment=attachment)
    request = messages.MessageRequest(recipient, message)
    messenger.send(request)
def ask_for_railcard(user_id, context):
    recipient = messages.Recipient(user_id)
    young_persons_button = elements.PostbackButton(title="16-25 Railcard",
                                                   payload="yesRailcard")
    other_button = elements.PostbackButton(title="Other",
                                           payload="otherRailcard")
    no_button = elements.PostbackButton(title="No", payload="noRailcard")
    template = templates.ButtonTemplate(
        text="One more thing: do you have a railcard?",
        buttons=[young_persons_button, other_button, no_button])
    attachment = attachments.TemplateAttachment(template=template)
    message = messages.Message(attachment=attachment)
    request = messages.MessageRequest(recipient, message)
    messenger.send(request)
def ask_to_save_ticket_preferences(user_id, context):
    recipient = messages.Recipient(user_id)
    yes_button = elements.PostbackButton(title="Yes",
                                         payload="saveTicketPreferences")
    no_button = elements.PostbackButton(title="No",
                                        payload="doNotSaveTicketPreferences")
    template = templates.ButtonTemplate(
        text="Would you like to save your ticket preferences?",
        buttons=[yes_button, no_button])
    attachment = attachments.TemplateAttachment(template=template)
    message = messages.Message(attachment=attachment)
    request = messages.MessageRequest(recipient, message)
    messenger.send(request)
    return context
def ask_to_memorize_location(user_id, context):
    recipient = messages.Recipient(user_id)
    location_save_yes_button = elements.PostbackButton(
        title="Yes", payload="saveLocationConfirmedYes")
    location_save_no_button = elements.PostbackButton(
        title="No", payload="saveLocationConfirmedNo")
    template = templates.ButtonTemplate(
        text="Would you like to save this location?",
        buttons=[location_save_yes_button, location_save_no_button])
    attachment = attachments.TemplateAttachment(template=template)
    message = messages.Message(attachment=attachment)
    request = messages.MessageRequest(recipient, message)
    messenger.send(request)
    return context
Ejemplo n.º 29
0
 def test_quick_replies(self):
     quick_reply = quick_replies.QuickReplyItem(content_type='text',
                                                title='New order',
                                                payload='Create new order')
     replies = quick_replies.QuickReplies(quick_replies=[
         quick_reply,
     ])
     message = messages.Message(text='My shopping cart',
                                quick_replies=replies)
     request = messages.MessageRequest(self.recipient, message)
     self.assertEquals(
         request.serialise(),
         '{"message": {"text": "My shopping cart", "quick_replies": [{"image_url": null, "payload": "Create new order", "content_type": "text", "title": "New order"}]}, "recipient": {"id": "123"}}'
     )
Ejemplo n.º 30
0
    def test_button_template(self):
        web_button = elements.WebUrlButton(
            title='Show website', url='https://petersapparel.parseapp.com')
        postback_button = elements.PostbackButton(
            title='Start chatting', payload='USER_DEFINED_PAYLOAD')
        template = templates.ButtonTemplate(
            text='What do you want to do next?',
            buttons=[web_button, postback_button])
        attachment = attachments.TemplateAttachment(template=template)

        message = messages.Message(attachment=attachment)
        request = messages.MessageRequest(self.recipient, message)

        self.assertEquals(
            request.serialise(),
            '{"message": {"attachment": {"type": "template", "payload": {"template_type": "button", "text": "What do you want to do next?", "buttons": [{"url": "https://petersapparel.parseapp.com", "type": "web_url", "title": "Show website"}, {"type": "postback", "payload": "USER_DEFINED_PAYLOAD", "title": "Start chatting"}]}}}, "recipient": {"id": "123"}}'
        )