module SportsLookup
SportsLookup — fetch SportScore feeds, filter by region, rank, and commentate. Public: lookup, parse_command, extract_slug, list_url, detail_url Tests: test/lib/sports_lookup_test.rb
Constants
- BASE
- LIST_LIMIT
- SRC
Public Instance Methods
Source
# File lib/sports_lookup.rb, line 79 def detail_url(sport, slug) "#{BASE}/api/widget/match/?sport=#{CGI.escape(sport)}&slug=#{CGI.escape(slug)}" end
Source
# File lib/sports_lookup.rb, line 92 def error_report(message) report = message == :usage ? SportsReport.usage : SportsReport.error(message) { error: true, report: report } end
Source
# File lib/sports_lookup.rb, line 70 def extract_slug(url) match = url.to_s.match(%r{/match/([^/]+)/?}) match ? match[1] : nil end
Source
# File lib/sports_lookup.rb, line 66 def filter_by_region(matches, region_code) Array(matches).select { |match| SportsRegion.match_region?(match, region_code) } end
Source
# File lib/sports_lookup.rb, line 75 def list_url(sport) "#{BASE}/api/widget/matches/?sport=#{CGI.escape(sport)}&limit=#{LIST_LIMIT}&src=#{SRC}" end
Source
# File lib/sports_lookup.rb, line 22 def lookup(args, default_region:, fetch_json:) parsed = parse_command(args, default_region: default_region) return error_report(parsed[:error]) if parsed[:error] sport = parsed[:sport] region = parsed[:region] list = fetch_json.call(list_url(sport)) matches = Array(list["matches"]) filtered = filter_by_region(matches, region[:code]) if filtered.empty? return error_report( "No live #{sport} in #{region[:name]} — try !sports #{sport} #{suggest_country(sport)}" ) end picked = SportsRank.pick_match(filtered, region_code: region[:code]) slug = extract_slug(picked["url"]) return error_report("Could not read match data — try again shortly.") if slug.nil? || slug.empty? detail = fetch_json.call(detail_url(sport, slug)) match = detail["match"] || picked commentary = SportsCommentary.build(match, sport: sport) report = SportsReport.build(sport: sport, match: match, commentary_lines: commentary) { report: report, match: match } rescue StandardError error_report("Could not fetch sports feed — try again shortly.") end
Source
# File lib/sports_lookup.rb, line 51 def parse_command(args, default_region:) text = args.to_s.strip return { error: :usage } if text.empty? parts = text.split(/\s+/, 2) sport_result = SportsSport.resolve(parts[0]) return { error: sport_result[:error] } if sport_result[:error] region_query = parts.length > 1 ? parts[1] : default_region region = ChartsCountry.resolve(region_query) return { error: region[:error] } if region[:error] { sport: sport_result[:sport], region: region } end
Source
# File lib/sports_lookup.rb, line 83 def suggest_country(sport) case sport when "cricket" then "uk" when "football" then "uk" when "basketball" then "usa" else "usa" end end