From d19058b6c071d754a6cc8143acd7e2c50ae12d93 Mon Sep 17 00:00:00 2001 From: Matthias Hecker Date: Mon, 13 Apr 2020 20:07:02 +0200 Subject: [PATCH] plugin(oxford): fix result handling, closes #37 --- data/rbot/plugins/oxford.rb | 39 ++++++++++++++++++++++++++++--------- 1 file 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="([^"]+)">([^<]+) 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" -- 2.39.2