From f947ff44f8192101815a7e6d66c9d495c4097e21 Mon Sep 17 00:00:00 2001 From: Ivche1337 Date: Sat, 9 Dec 2017 01:28:27 +0100 Subject: [PATCH] wikipedia bot: Return up to three links from wikipedia for keyword. This change includes updates to the docs and tests as well. --- .../wikipedia/fixtures/test_multi_word.json | 9 +++++- .../wikipedia/fixtures/test_number_query.json | 8 ++++- .../wikipedia/fixtures/test_single_word.json | 6 ++++ .../bots/wikipedia/test_wikipedia.py | 24 +++++++++++---- .../zulip_bots/bots/wikipedia/wikipedia.py | 30 ++++++++++++------- 5 files changed, 59 insertions(+), 18 deletions(-) diff --git a/zulip_bots/zulip_bots/bots/wikipedia/fixtures/test_multi_word.json b/zulip_bots/zulip_bots/bots/wikipedia/fixtures/test_multi_word.json index 5195fe2..51ea282 100644 --- a/zulip_bots/zulip_bots/bots/wikipedia/fixtures/test_multi_word.json +++ b/zulip_bots/zulip_bots/bots/wikipedia/fixtures/test_multi_word.json @@ -9,8 +9,15 @@ "query": { "search": [ { - "title":"Sky blue" + "title":"Sky_blue" + }, + { + "title":"Sky_Blue_Sky" + }, + { + "title":"Blue_Sky" } + ] } }, diff --git a/zulip_bots/zulip_bots/bots/wikipedia/fixtures/test_number_query.json b/zulip_bots/zulip_bots/bots/wikipedia/fixtures/test_number_query.json index b8dfdf4..170b45f 100644 --- a/zulip_bots/zulip_bots/bots/wikipedia/fixtures/test_number_query.json +++ b/zulip_bots/zulip_bots/bots/wikipedia/fixtures/test_number_query.json @@ -10,7 +10,13 @@ "search": [ { "title":"123" - } + }, + { + "title":"Japan_Airlines_Flight_123" + }, + { + "title":"Iodine-123" + } ] } }, diff --git a/zulip_bots/zulip_bots/bots/wikipedia/fixtures/test_single_word.json b/zulip_bots/zulip_bots/bots/wikipedia/fixtures/test_single_word.json index a407ed9..9b88417 100644 --- a/zulip_bots/zulip_bots/bots/wikipedia/fixtures/test_single_word.json +++ b/zulip_bots/zulip_bots/bots/wikipedia/fixtures/test_single_word.json @@ -10,6 +10,12 @@ "search": [ { "title":"Happiness" + }, + { + "title":"Happy!" + }, + { + "title":"Happy,_Happy" } ] } diff --git a/zulip_bots/zulip_bots/bots/wikipedia/test_wikipedia.py b/zulip_bots/zulip_bots/bots/wikipedia/test_wikipedia.py index 0a4411f..c1c5644 100755 --- a/zulip_bots/zulip_bots/bots/wikipedia/test_wikipedia.py +++ b/zulip_bots/zulip_bots/bots/wikipedia/test_wikipedia.py @@ -9,25 +9,39 @@ class TestWikipediaBot(StubBotTestCase): # Single-word query bot_request = 'happy' - bot_response = "For search term \"happy\", https://en.wikipedia.org/wiki/Happiness" + bot_response = ('''For search term:happy +1:[Happiness](https://en.wikipedia.org/wiki/Happiness) +2:[Happy!](https://en.wikipedia.org/wiki/Happy!) +3:[Happy,_Happy](https://en.wikipedia.org/wiki/Happy,_Happy) +''') with self.mock_http_conversation('test_single_word'): self.verify_reply(bot_request, bot_response) # Multi-word query bot_request = 'The sky is blue' - bot_response = "For search term \"The sky is blue\", https://en.wikipedia.org/wiki/Sky_blue" + bot_response = ('''For search term:The sky is blue +1:[Sky_blue](https://en.wikipedia.org/wiki/Sky_blue) +2:[Sky_Blue_Sky](https://en.wikipedia.org/wiki/Sky_Blue_Sky) +3:[Blue_Sky](https://en.wikipedia.org/wiki/Blue_Sky) +''') with self.mock_http_conversation('test_multi_word'): self.verify_reply(bot_request, bot_response) # Number query bot_request = '123' - bot_response = "For search term \"123\", https://en.wikipedia.org/wiki/123" + bot_response = ('''For search term:123 +1:[123](https://en.wikipedia.org/wiki/123) +2:[Japan_Airlines_Flight_123](https://en.wikipedia.org/wiki/Japan_Airlines_Flight_123) +3:[Iodine-123](https://en.wikipedia.org/wiki/Iodine-123) +''') with self.mock_http_conversation('test_number_query'): self.verify_reply(bot_request, bot_response) # Hash query bot_request = '#' - bot_response = "For search term \"#\", https://en.wikipedia.org/wiki/Number_sign" + bot_response = '''For search term:# +1:[Number_sign](https://en.wikipedia.org/wiki/Number_sign) +''' with self.mock_http_conversation('test_hash_query'): self.verify_reply(bot_request, bot_response) @@ -39,5 +53,5 @@ class TestWikipediaBot(StubBotTestCase): # Empty query, no request made to the Internet. bot_request = '' - bot_response = "Please enter your message after @mention-bot" + bot_response = "Please enter your search term after @mention-bot" self.verify_reply(bot_request, bot_response) diff --git a/zulip_bots/zulip_bots/bots/wikipedia/wikipedia.py b/zulip_bots/zulip_bots/bots/wikipedia/wikipedia.py index a27bb7c..f176b28 100644 --- a/zulip_bots/zulip_bots/bots/wikipedia/wikipedia.py +++ b/zulip_bots/zulip_bots/bots/wikipedia/wikipedia.py @@ -10,7 +10,7 @@ from six.moves import urllib class WikipediaHandler(object): ''' This plugin facilitates searching Wikipedia for a - specific key term and returns the top article from the + specific key term and returns the top 3 articles from the search. It looks for messages starting with '@mention-bot' In this example, we write all Wikipedia searches into @@ -21,47 +21,55 @@ class WikipediaHandler(object): META = { 'name': 'Wikipedia', - 'description': 'Searches Wikipedia for a term and returns the top article.', + 'description': 'Searches Wikipedia for a term and returns the top 3 articles.', } def usage(self): return ''' This plugin will allow users to directly search - Wikipedia for a specific key term and get the top - article that is returned from the search. Users + Wikipedia for a specific key term and get the top 3 + articles that is returned from the search. Users should preface searches with "@mention-bot". - ''' + @mention-bot ''' def handle_message(self, message, bot_handler): bot_response = self.get_bot_wiki_response(message, bot_handler) bot_handler.send_reply(message, bot_response) def get_bot_wiki_response(self, message, bot_handler): - help_text = 'Please enter your message after @mention-bot' + '''This function returns the URLs of the requested topic.''' + + help_text = 'Please enter your search term after @mention-bot' + + # Checking if the link exists. query = message['content'] if query == '': return help_text + query_wiki_link = ('https://en.wikipedia.org/w/api.php?action=query&' 'list=search&srsearch=%s&format=json' % (urllib.parse.quote(query),)) try: data = requests.get(query_wiki_link) + except requests.exceptions.RequestException: logging.error('broken link') return + # Checking if the bot accessed the link. if data.status_code != 200: logging.error('Page not found.') return + new_content = 'For search term:' + query + '\n' - new_content = 'For search term "' + query + # Checking if there is content for the searched term if len(data.json()['query']['search']) == 0: new_content = 'I am sorry. The search term you provided is not found :slightly_frowning_face:' else: - search_string = data.json()['query']['search'][0]['title'].replace(' ', '_') - url = 'https://en.wikipedia.org/wiki/' + search_string - new_content = new_content + '", ' + url + for i in range(min(3, len(data.json()['query']['search']))): + search_string = data.json()['query']['search'][i]['title'].replace(' ', '_') + url = 'https://en.wikipedia.org/wiki/' + search_string + new_content += str(i+1) + ':' + '[' + search_string + ']' + '(' + url.replace('"', "%22") + ')\n' return new_content - handler_class = WikipediaHandler