diff options
author | Matthias Hecker <mail@apoc.cc> | 2020-04-13 20:07:02 +0200 |
---|---|---|
committer | Matthias Hecker <mail@apoc.cc> | 2020-04-13 20:07:02 +0200 |
commit | d19058b6c071d754a6cc8143acd7e2c50ae12d93 (patch) | |
tree | d2dfc74a2d8b9575fb7031b3dc4673c290e40513 | |
parent | 69a5e6173695fa9fb1cf6dd81212ef6a68c52be8 (diff) |
plugin(oxford): fix result handling, closes #37
-rw-r--r-- | data/rbot/plugins/oxford.rb | 39 |
1 files changed, 30 insertions, 9 deletions
diff --git a/data/rbot/plugins/oxford.rb b/data/rbot/plugins/oxford.rb index 29ba3dce..5c9b0e4e 100644 --- a/data/rbot/plugins/oxford.rb +++ b/data/rbot/plugins/oxford.rb @@ -9,6 +9,7 @@ # License:: GPL v2 # require 'cgi' +require 'uri' class OxfordPlugin < Plugin Config.register Config::IntegerValue.new( @@ -26,23 +27,43 @@ class OxfordPlugin < Plugin end def oxford(m, params) - word = params[:word].join + word = params[:word].join(' ') - url = "#{@base_url}/definition/#{CGI.escape word}" + url = "#{@base_url}/definition/#{URI::encode word}" begin + debug "searching definition for #{word.inspect}" + response = @bot.httputil.get(url, resp: true) definition = parse_definition(response) + # try to find alternative word (different spelling, typos, etc.) if definition.empty? - closest = response.xpath('//div[@class="no-exact-matches"]//ul/li/a').first - - url = @base_url + closest['href'] + debug "search for alternative spelling result" + url = title = nil + exact_matches = response.xpath('//div[@class="no-exact-matches"]//ul/li/a') + if not exact_matches.empty? and not exact_matches.first['href'].empty? + url = @base_url + exact_matches.first['href'] + title = exact_matches.first.content + else + debug 'use web-service to find alternative result' + # alternatively attempt to use their webservice (json-p) instead + url = "#{@base_url}/search/dataset.js?dataset=noad&dictionary=en&query=#{CGI.escape word}" + response = @bot.httputil.get(url, headers: {'X-Requested-With': 'XMLHttpRequest'}) + alternative = response.gsub(/\\/, '').scan(/href="([^"]+)">([^<]+)</) + url = @base_url + alternative.first[0] + title = alternative.first[1] + end - m.reply "did you mean: #{Bold}#{closest.content.ircify_html}#{NormalText}" + debug "search for alternative spelling result, returned title=#{title.inspect} url=#{url.inspect}" - response = @bot.httputil.get(url, resp: true) - definition = parse_definition(response) + if url and title + unless title.downcase == word.downcase + m.reply "did you mean: #{Bold}#{title.ircify_html}#{NormalText}?" + end + response = @bot.httputil.get(url, resp: true) + definition = parse_definition(response) + end end rescue => e m.reply "error accessing lexico url -> #{url}" @@ -50,7 +71,7 @@ class OxfordPlugin < Plugin return end - if definition + unless definition.empty? m.reply definition.ircify_html, max_lines: @bot.config['oxford.max_lines'] else m.reply "couldn't find a definition for #{word} on oxford dictionary" |