Example #1
0
 def get_paper(self, paper_id):
     """ Return specified paper from within the set. """
     if not self.previous_attachments:
         logging.info("Can't retreive paper. No papers in current context.")
         return build_message(text="*Can't retreive paper*"), None
     else:
         pid = re.findall('[0-9]+\.?[0-9]*', self.previous_attachments[paper_id - 1]['text'])[0]
         logging.info("Getting paper: {} from ArXiv.".format(pid))
     paperURL = ASP_BaseURL + "/" + str(pid)
     paper = papers_from_embedded_script(paperURL)[0] # only get first, rest are related papers
     return build_message(text="*Here's your paper*", markdown=False, parts=None), [paper_snippet(paper, 1, include_abstract=True)]
Example #2
0
    def get_library(self, session):
        """ Get all papers saved by the user. Their 'library'. """
        logging.info("Getting ArXiv library.")
        libraryURL = ASP_BaseURL + "/library"
        try:
            papers = papers_from_embedded_script(libraryURL, session=session)
        except ReadTimeout:
            return build_message( text="*Connection Problem. Please try again*", markdown=False, parts=None)

        attached_papers = []
        for i, p in enumerate(papers):
            attached_papers.append(paper_snippet(p, i + 1))
        return build_message( text="*Your Library*", markdown=False, parts=attached_papers), attached_papers
    def handle_intent(self,
                      msg_txt,
                      intent,
                      session,
                      parameters=None,
                      context=None):
        """
        Receive an intent string and select the correct intent handling function.
        """
        attachments = None
        if intent == 'search':
            # Strip front of message to just retain search query
            if msg_txt.startswith('search for '):
                query = msg_txt[len('search for '):]
            else:  # message was just "search X"
                query = msg_txt[len('search '):]

            resp_msg, attachments = self.search_arxiv(query)
        elif intent == 'greeting' or intent == 'say_hello':
            resp_msg = self.greeting()
        elif intent == 'clear_library':
            resp_msg = self.clear_library(session)
        elif intent == 'get_library':
            resp_msg, attachments = self.get_library(session)
        elif intent == 'get_most_recent':
            resp_msg, attachments = self.get_most_recent(session)
        elif intent == 'get_paper':
            try:
                num_of_paper = [
                    int(s) for s in msg_txt.split() if s.isdigit()
                ][0]
                resp_msg, attachments = self.get_paper(num_of_paper)
            except KeyError:
                resp_msg = "Please specify which paper you want by it's number in the given list."
        elif intent == 'get_recommended':
            resp_msg, attachments = self.get_recommended(session)
        elif intent == 'get_similar_papers':
            resp_msg = self.get_similar(99)
        elif intent == 'get_top_recent':
            resp_msg = self.get_top_recent(session)
        elif intent == 'goto_website':
            resp_msg = self.goto_website()
        elif intent == 'save_paper':
            resp_msg = self.save_paper(999, session)
        elif intent == 'send_credentials':
            resp_msg = "Intent '{}' not yet implemented.".format(intent)
        elif intent == 'GAVE LOGIN DETAILS':
            resp_msg = build_message(
                text="Thanks for that. I've saved your details.",
                markdown=False,
                parts=None)
        else:
            logger.warning(
                "Intent '{}' couldn't be matched to a handler function.".
                format(intent))
            resp_msg = "Intent '{}' not yet implemented.".format(intent)

        self.previous_msg = resp_msg
        self.previous_attachments = attachments
        return resp_msg, attachments
Example #4
0
 def greeting(self):
     greetings = [
         'How are ya?',
         'Good to hear from you',
         'Hey', 'Hello', 'Hi',
         'Good day!'
     ]
     return build_message(text=random.choice(greetings), markdown=False, parts=None)
Example #5
0
def test_build_message_markdown_true():
    test_markdown = "## Heading \n\n * This is a bullet-point."

    expected_msg = {"text": "## Heading \n\n * This is a bullet-point.", "mrkdwn": True}

    msg = build_message(test_markdown, markdown=True)

    assert expected_msg == json.loads(msg)
Example #6
0
 def get_similar(self, pid):
     """ Get papers similar in content to the named paper. """
     logging.info("Getting ArXiv papers similar to paper: {}".format(pid))
     similarURL = ASP_BaseURL + str(pid)
     similar_papers = papers_from_embedded_script(similarURL)[1:] # TODO is the searched paper always first?
     attached_papers = []
     for p in similar_papers:
         attached_papers.append(paper_snippet(p))
     return build_message(text="*Your Library*", markdown=False, parts=attached_papers)
Example #7
0
 def get_recommended(self, session):
     """ Get the papers recommended to the user based on their
     saved papers and their search domain. """
     # TODO the /recommend endpoint has FILTERS
     logging.info("Getting recommended ArXiv papers for user.")
     recommendedURL = ASP_BaseURL + "/recommend"
     papers = papers_from_embedded_script(recommendedURL, session)
     attached_papers = []
     for i, p in enumerate(papers):
         attached_papers.append(paper_snippet(p, i + 1))
     return build_message( text="*Your Recommended*", markdown=False, parts=attached_papers), attached_papers[:5]
Example #8
0
    def get_most_recent(self, session):
        """ Get most recently published papers within the user's search
        domain.
        """
        logging.info("Getting most recent ArXiv papers within user's domain.")
        papers = papers_from_embedded_script(ASP_BaseURL+"/", session)
        attached_papers = []
        for i, p in enumerate(papers):
            attached_papers.append(paper_snippet(p, i + 1))

        return build_message( text="*Your Most Recent*", markdown=False, parts=attached_papers), attached_papers[:5]
Example #9
0
 def get_top_recent(self, session):
     """
     Get the 'top' recent papers within the user's search domain.
     """
     # TODO the /top endpoint has FILTERS
     logging.info("Getting top recent ArXiv papers in user's domain.")
     topURL = ASP_BaseURL + "/top" # default filters
     papers = papers_from_embedded_script(topURL, session=session)
     attached_papers = []
     for i, p in enumerate(papers):
         attached_papers.append(paper_snippet(p, i + 1))
     return build_message( text="*Your Library*", markdown=False, parts=attached_papers), attached_papers[:5]
Example #10
0
    def search_arxiv(self, query, num_papers=5):
        """ Search arxiv papers by search string. """
        logging.info("Searching ArXiv for: {}".format(query))
        tokens = query.split(' ')
        searchEndpoint = 'search?q=' + '+'.join(tokens)
        searchURL = ASP_BaseURL + searchEndpoint
        papers = papers_from_embedded_script(searchURL)
        bot_uid = self.clients.bot_user_id()
        attached_papers = []
        # For each paper
        for i in range(min(num_papers,len(papers))):
            attached_papers.append(paper_snippet(papers[i], i + 1))

        attached_papers[-1]['footer'] = "> `<@" + bot_uid + "> show more papers` - to see more papers"
        # build the json message object

        return build_message( text="*Search Results*", markdown=False, parts=attached_papers), attached_papers
Example #11
0
 def goto_website(self):
     """
     Open the Arxiv Sanity Preserver webpage, or just provide a link to it.
     """
     return build_message( text=ASP_BaseURL, markdown=False, parts=None)
Example #12
0
def test_build_message_markdown_false():
    test_text = "This is some text, yay."

    assert test_text == build_message(test_text, markdown=False)