zetabot 2.1.2 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,6 +3,9 @@
3
3
  # Great gem
4
4
  require 'cinch'
5
5
  require 'cinch/toolbox'
6
+ require 'nokogiri'
7
+ require 'open-uri'
8
+ require 'cgi/escape'
6
9
  # require 'cinch/cooldown'
7
10
  # require 'cinch-cooldown'
8
11
 
@@ -33,22 +36,31 @@ module Plugins
33
36
 
34
37
  def wiki(term)
35
38
  # URI Encode
36
- term = URI.escape(term, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))
37
- url = "http://en.wikipedia.org/w/index.php?search=#{term}"
39
+ query = URI.encode_www_form_component(term).gsub("+", "%20")
40
+ url = "https://en.wikipedia.org/w/index.php?search=#{query}"
38
41
 
39
42
  # Truncate text and url if they are too long
40
43
  text = Cinch::Toolbox.truncate(get_def(term, url), @max_length)
41
- url = Cinch::Toolbox.shorten(url)
44
+ url = shorten(url)
42
45
 
43
46
  "Wiki ∴ #{text} [#{url}]"
44
47
  end
45
48
 
49
+ # Cinch::Toolbox.shorten calls is.gd over http, which now only answers with a redirect
50
+ def shorten(url)
51
+ return url if url.length < 45
52
+ short = URI.open("https://is.gd/create.php?format=simple&url=#{CGI.escape(url)}").read.strip
53
+ short.match?(%r{\Ahttps?://is\.gd/\w+\z}) ? short : url
54
+ rescue SocketError, OpenURI::HTTPError, Net::OpenTimeout, Net::ReadTimeout, SystemCallError
55
+ url
56
+ end
57
+
46
58
  def get_def(term, url)
47
- cats = Cinch::Toolbox.get_html_element(url, '#mw-normal-catlinks')
59
+ cats = html_element(url, '#mw-normal-catlinks')
48
60
  if cats && cats.include?('Disambiguation')
49
61
  wiki_text = "'#{term} is too vague and lead to a disambiguation page."
50
62
  else
51
- wiki_text = Cinch::Toolbox.get_html_element(url, '#mw-content-text p')
63
+ wiki_text = html_element(url, '#mw-content-text p')
52
64
  if wiki_text.nil? || wiki_text.include?('Help:Searching')
53
65
  return not_found(wiki_text, url)
54
66
  end
@@ -57,8 +69,8 @@ module Plugins
57
69
  end
58
70
 
59
71
  def not_found(wiki_text, url)
60
- msg = "I couldn't find anything for that search, "
61
- alt_term_text = Cinch::Toolbox.get_html_element(url, '.searchdidyoumean')
72
+ msg = +"I couldn't find anything for that search, "
73
+ alt_term_text = html_element(url, '.searchdidyoumean')
62
74
  if alt_term_text
63
75
  alt_term = alt_term_text[/\ADid you mean: (\w+)\z/, 1]
64
76
  msg << "did you mean '#{alt_term}'?"
@@ -67,6 +79,15 @@ module Plugins
67
79
  end
68
80
  msg
69
81
  end
82
+
83
+ # Cinch::Toolbox.get_html_element relies on Kernel#open(url), removed in Ruby 3
84
+ def html_element(url, selector)
85
+ doc = Nokogiri::HTML(URI.open(url, 'User-Agent' => "Zeta/#{Zeta::VERSION}").read)
86
+ # Wikipedia pads articles with empty placeholder paragraphs; skip blank matches
87
+ doc.css(selector).map(&:content).find { |text| !text.strip.empty? }
88
+ rescue SocketError, OpenURI::HTTPError, Net::OpenTimeout, Net::ReadTimeout, SystemCallError
89
+ nil
90
+ end
70
91
  end
71
92
  end
72
93
 
@@ -1,5 +1,5 @@
1
1
  require 'crack'
2
- require 'cgi'
2
+ require 'cgi/escape'
3
3
 
4
4
  module Plugins
5
5
  class Wolfram
@@ -17,28 +17,36 @@ module Plugins
17
17
  match /calc (.+)/, method: :calculate
18
18
 
19
19
  def calculate(m, query)
20
- # Rescue in case something goes wrong
21
- begin
22
- url = "http://api.wolframalpha.com/v2/query?input=#{CGI.escape(query)}&appid=#{Config.secrets[:wolfram]}&primary=true&format=plaintext"
23
- request = RestClient.get(url).body
24
-
25
- data = Crack::XML.parse(request)
26
-
27
- pod0 = data['queryresult']['pod'][0]['subpod']['plaintext'].strip
28
- pod1 = data['queryresult']['pod'][1]['subpod']['plaintext'].strip
29
-
30
- return 'Unable to get a results' if pod0.nil?
31
-
32
- if pod1.lines.count > 2
33
- m.user.send "# Wolfram Results #\n #{pod0}\n #{pod1}", true
34
- elsif pod0.length > 400
35
- m.user.send("#{pod0} #{pod1}", true)
36
- else
37
- m.reply "#{pod0} = #{pod1}"
38
- end
39
- rescue
40
- m.reply 'Unable to get a results'
20
+ url = "https://api.wolframalpha.com/v2/query?input=#{CGI.escape(query)}&appid=#{CGI.escape(Config.secrets[:wolfram].to_s)}&primary=true&format=plaintext"
21
+ data = Crack::XML.parse(RestClient.get(url).body)
22
+
23
+ pod0, pod1 = pod_texts(data['queryresult'])
24
+ return m.reply('Unable to get a results') if pod0.nil? || pod0.empty?
25
+
26
+ if pod1.lines.count > 2
27
+ m.user.send "# Wolfram Results #\n #{pod0}\n #{pod1}", true
28
+ elsif pod0.length > 400
29
+ m.user.send("#{pod0} #{pod1}", true)
30
+ elsif pod1.empty?
31
+ m.reply pod0
32
+ else
33
+ m.reply "#{pod0} = #{pod1}"
41
34
  end
35
+ rescue RestClient::Unauthorized, RestClient::Forbidden
36
+ error 'Wolfram Alpha rejected the configured appid (Config.secrets[:wolfram])'
37
+ m.action_reply "isn't currently authorized to do that"
38
+ rescue StandardError => e
39
+ error "Wolfram Alpha query failed: #{e.class.name}: #{e.message}"
40
+ m.reply 'Unable to get a results'
41
+ end
42
+
43
+ private
44
+
45
+ # Crack returns a Hash for a single pod/subpod and an Array when there are several
46
+ def pod_texts(result)
47
+ Array.wrap(result && result['pod']).map do |pod|
48
+ Array.wrap(pod['subpod']).map { |sub| sub && sub['plaintext'].to_s.strip }.compact.reject(&:empty?).join("\n")
49
+ end + ['', ''] # always at least an input and result slot
42
50
  end
43
51
  end
44
52
  end
data/lib/Zeta/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Zeta
2
- VERSION = '2.1.2'
2
+ VERSION = '2.2.1'
3
3
  end
metadata CHANGED
@@ -1,27 +1,26 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zetabot
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.2
4
+ version: 2.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Liothen
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2024-07-03 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: bundler
15
14
  requirement: !ruby/object:Gem::Requirement
16
15
  requirements:
17
- - - "~>"
16
+ - - ">="
18
17
  - !ruby/object:Gem::Version
19
18
  version: '2.4'
20
19
  type: :development
21
20
  prerelease: false
22
21
  version_requirements: !ruby/object:Gem::Requirement
23
22
  requirements:
24
- - - "~>"
23
+ - - ">="
25
24
  - !ruby/object:Gem::Version
26
25
  version: '2.4'
27
26
  - !ruby/object:Gem::Dependency
@@ -30,14 +29,14 @@ dependencies:
30
29
  requirements:
31
30
  - - "~>"
32
31
  - !ruby/object:Gem::Version
33
- version: '10.0'
32
+ version: '13.0'
34
33
  type: :development
35
34
  prerelease: false
36
35
  version_requirements: !ruby/object:Gem::Requirement
37
36
  requirements:
38
37
  - - "~>"
39
38
  - !ruby/object:Gem::Version
40
- version: '10.0'
39
+ version: '13.0'
41
40
  - !ruby/object:Gem::Dependency
42
41
  name: rspec
43
42
  requirement: !ruby/object:Gem::Requirement
@@ -52,6 +51,20 @@ dependencies:
52
51
  - - "~>"
53
52
  - !ruby/object:Gem::Version
54
53
  version: '3.0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: webmock
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '3.0'
61
+ type: :development
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '3.0'
55
68
  - !ruby/object:Gem::Dependency
56
69
  name: irbtools
57
70
  requirement: !ruby/object:Gem::Requirement
@@ -67,7 +80,7 @@ dependencies:
67
80
  - !ruby/object:Gem::Version
68
81
  version: '0'
69
82
  - !ruby/object:Gem::Dependency
70
- name: daemons
83
+ name: logger
71
84
  requirement: !ruby/object:Gem::Requirement
72
85
  requirements:
73
86
  - - ">="
@@ -81,7 +94,7 @@ dependencies:
81
94
  - !ruby/object:Gem::Version
82
95
  version: '0'
83
96
  - !ruby/object:Gem::Dependency
84
- name: destructor
97
+ name: ostruct
85
98
  requirement: !ruby/object:Gem::Requirement
86
99
  requirements:
87
100
  - - ">="
@@ -95,7 +108,7 @@ dependencies:
95
108
  - !ruby/object:Gem::Version
96
109
  version: '0'
97
110
  - !ruby/object:Gem::Dependency
98
- name: tzinfo
111
+ name: base64
99
112
  requirement: !ruby/object:Gem::Requirement
100
113
  requirements:
101
114
  - - ">="
@@ -109,7 +122,7 @@ dependencies:
109
122
  - !ruby/object:Gem::Version
110
123
  version: '0'
111
124
  - !ruby/object:Gem::Dependency
112
- name: unitwise
125
+ name: bigdecimal
113
126
  requirement: !ruby/object:Gem::Requirement
114
127
  requirements:
115
128
  - - ">="
@@ -123,7 +136,7 @@ dependencies:
123
136
  - !ruby/object:Gem::Version
124
137
  version: '0'
125
138
  - !ruby/object:Gem::Dependency
126
- name: cinch
139
+ name: csv
127
140
  requirement: !ruby/object:Gem::Requirement
128
141
  requirements:
129
142
  - - ">="
@@ -137,7 +150,7 @@ dependencies:
137
150
  - !ruby/object:Gem::Version
138
151
  version: '0'
139
152
  - !ruby/object:Gem::Dependency
140
- name: cinch-cooldown
153
+ name: pstore
141
154
  requirement: !ruby/object:Gem::Requirement
142
155
  requirements:
143
156
  - - ">="
@@ -151,7 +164,63 @@ dependencies:
151
164
  - !ruby/object:Gem::Version
152
165
  version: '0'
153
166
  - !ruby/object:Gem::Dependency
154
- name: cinch-toolbox
167
+ name: cgi
168
+ requirement: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - ">="
171
+ - !ruby/object:Gem::Version
172
+ version: '0'
173
+ type: :runtime
174
+ prerelease: false
175
+ version_requirements: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - ">="
178
+ - !ruby/object:Gem::Version
179
+ version: '0'
180
+ - !ruby/object:Gem::Dependency
181
+ name: daemons
182
+ requirement: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - ">="
185
+ - !ruby/object:Gem::Version
186
+ version: '0'
187
+ type: :runtime
188
+ prerelease: false
189
+ version_requirements: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - ">="
192
+ - !ruby/object:Gem::Version
193
+ version: '0'
194
+ - !ruby/object:Gem::Dependency
195
+ name: destructor
196
+ requirement: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - ">="
199
+ - !ruby/object:Gem::Version
200
+ version: '0'
201
+ type: :runtime
202
+ prerelease: false
203
+ version_requirements: !ruby/object:Gem::Requirement
204
+ requirements:
205
+ - - ">="
206
+ - !ruby/object:Gem::Version
207
+ version: '0'
208
+ - !ruby/object:Gem::Dependency
209
+ name: tzinfo
210
+ requirement: !ruby/object:Gem::Requirement
211
+ requirements:
212
+ - - ">="
213
+ - !ruby/object:Gem::Version
214
+ version: '0'
215
+ type: :runtime
216
+ prerelease: false
217
+ version_requirements: !ruby/object:Gem::Requirement
218
+ requirements:
219
+ - - ">="
220
+ - !ruby/object:Gem::Version
221
+ version: '0'
222
+ - !ruby/object:Gem::Dependency
223
+ name: unitwise
155
224
  requirement: !ruby/object:Gem::Requirement
156
225
  requirements:
157
226
  - - ">="
@@ -165,7 +234,21 @@ dependencies:
165
234
  - !ruby/object:Gem::Version
166
235
  version: '0'
167
236
  - !ruby/object:Gem::Dependency
168
- name: cinch-quotes
237
+ name: ircinch
238
+ requirement: !ruby/object:Gem::Requirement
239
+ requirements:
240
+ - - ">="
241
+ - !ruby/object:Gem::Version
242
+ version: '0'
243
+ type: :runtime
244
+ prerelease: false
245
+ version_requirements: !ruby/object:Gem::Requirement
246
+ requirements:
247
+ - - ">="
248
+ - !ruby/object:Gem::Version
249
+ version: '0'
250
+ - !ruby/object:Gem::Dependency
251
+ name: cinch-toolbox
169
252
  requirement: !ruby/object:Gem::Requirement
170
253
  requirements:
171
254
  - - ">="
@@ -196,14 +279,14 @@ dependencies:
196
279
  name: nokogiri
197
280
  requirement: !ruby/object:Gem::Requirement
198
281
  requirements:
199
- - - "~>"
282
+ - - ">="
200
283
  - !ruby/object:Gem::Version
201
284
  version: 1.13.6
202
285
  type: :runtime
203
286
  prerelease: false
204
287
  version_requirements: !ruby/object:Gem::Requirement
205
288
  requirements:
206
- - - "~>"
289
+ - - ">="
207
290
  - !ruby/object:Gem::Version
208
291
  version: 1.13.6
209
292
  - !ruby/object:Gem::Dependency
@@ -500,20 +583,6 @@ dependencies:
500
583
  - - ">="
501
584
  - !ruby/object:Gem::Version
502
585
  version: '0'
503
- - !ruby/object:Gem::Dependency
504
- name: github_api
505
- requirement: !ruby/object:Gem::Requirement
506
- requirements:
507
- - - ">="
508
- - !ruby/object:Gem::Version
509
- version: '0'
510
- type: :runtime
511
- prerelease: false
512
- version_requirements: !ruby/object:Gem::Requirement
513
- requirements:
514
- - - ">="
515
- - !ruby/object:Gem::Version
516
- version: '0'
517
586
  - !ruby/object:Gem::Dependency
518
587
  name: gist
519
588
  requirement: !ruby/object:Gem::Requirement
@@ -556,7 +625,6 @@ dependencies:
556
625
  - - ">="
557
626
  - !ruby/object:Gem::Version
558
627
  version: '0'
559
- description:
560
628
  email:
561
629
  - liothen@flagrun.net
562
630
  executables:
@@ -566,6 +634,9 @@ extra_rdoc_files: []
566
634
  files:
567
635
  - ".bundle/config"
568
636
  - ".gitignore"
637
+ - ".mise.toml"
638
+ - ".projectile"
639
+ - ".rspec"
569
640
  - Gemfile
570
641
  - Gemfile.lock
571
642
  - LICENSE.txt
@@ -590,6 +661,7 @@ files:
590
661
  - lib/Zeta/admin/plugins.rb
591
662
  - lib/Zeta/admin/users.rb
592
663
  - lib/Zeta/blacklist.rb
664
+ - lib/Zeta/botinfo.txt
593
665
  - lib/Zeta/cache.rb
594
666
  - lib/Zeta/cinch.rb
595
667
  - lib/Zeta/config.rb
@@ -642,7 +714,6 @@ licenses:
642
714
  - MIT
643
715
  metadata:
644
716
  allowed_push_host: https://rubygems.org
645
- post_install_message:
646
717
  rdoc_options: []
647
718
  require_paths:
648
719
  - lib
@@ -650,15 +721,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
650
721
  requirements:
651
722
  - - ">="
652
723
  - !ruby/object:Gem::Version
653
- version: '0'
724
+ version: '3.2'
654
725
  required_rubygems_version: !ruby/object:Gem::Requirement
655
726
  requirements:
656
727
  - - ">="
657
728
  - !ruby/object:Gem::Version
658
729
  version: '0'
659
730
  requirements: []
660
- rubygems_version: 3.1.6
661
- signing_key:
731
+ rubygems_version: 4.0.20
662
732
  specification_version: 4
663
733
  summary: Zeta is a IRC bot written in ruby using the Cinch Framework
664
734
  test_files: []