nadoka 0.9.1 → 0.9.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: fb5d2901149e7c9b3ceb6e96b8b3aa4f4a1c4b68
4
- data.tar.gz: 42ad6c145f67aadd8b4369187a0d9df83dc87c26
2
+ SHA256:
3
+ metadata.gz: 499bbabcf8dd4f2b5c8850550daee031996821c3106f63795972f843b22fc45b
4
+ data.tar.gz: 1b151a20ec41485b4a0e368d62746591be4710c82b089e82314b9a969f499d3a
5
5
  SHA512:
6
- metadata.gz: 550f7ed0ab720cb1778a05bf15b18f6046ae1a099e5b6c0aa22edb3356e9d121635e57d8bb908112a57c10282fa5fb62c4ac9fece4ee75c61afb41bb6d18f607
7
- data.tar.gz: b298ae869b4d92cf748efb16774a7bc08d506d1f2650ff08a033a39bb7f000bd0ee90edb2c3d692ffa9168ec034e458f43fba15fe5b0aec20f9542df47698d94
6
+ metadata.gz: 2cc2ed86d0496fdc7bbad02524df8c50efb784e559d15b3590c3dbdb8f1125f74738a5ccb574e682efd211e47b979a111e1dea3b7a341b58e8bef6715de99ed5
7
+ data.tar.gz: 71b721ff820b48fbdc39601e578cdbc795088fa6df223027a4c6e801d1eb8089de6dbb3024d3c6c2f467c5922afe0d796485b8fb50b1eb3eba58cf75ddd1763b
@@ -21,6 +21,8 @@ matrix:
21
21
  - rvm: ruby-head
22
22
  - rvm: jruby-head
23
23
  - rvm: ree
24
+ before_install:
25
+ - gem update bundler
24
26
  script: ruby check-syntax.rb
25
27
  notifications:
26
28
  irc: "irc.freenode.org#nadoka_jp"
@@ -79,7 +79,7 @@ class RSS_Check
79
79
 
80
80
  def read_content
81
81
  case @uri.scheme
82
- when 'http'
82
+ when 'http', 'https'
83
83
  open(@uri){|f|
84
84
  if f.content_encoding.any?{|e| /gzip/ =~ e}
85
85
  Zlib::GzipReader.new(StringIO.new(f.read)).read || ''
@@ -96,7 +96,7 @@ class RSS_Check
96
96
 
97
97
  def mtime
98
98
  case @uri.scheme
99
- when 'http'
99
+ when 'http', 'https'
100
100
  open(@uri){|f|
101
101
  f.last_modified || Time.now
102
102
  }
@@ -204,13 +204,11 @@ if $0 == __FILE__
204
204
  ARGV.shift || './rss_cache',
205
205
  false # false
206
206
  )
207
- require 'iconv'
208
207
  require 'kconv'
209
- ic = Iconv.open("EUC-JP", "UTF-8")
210
208
 
211
209
  rssc.check.each{|e|
212
210
  puts e[:about]
213
- title = (e[:ccode] == 'UTF-8') ? ic.iconv(e[:title]) : e[:title]
211
+ title = (e[:ccode] == 'UTF-8') ? e[:title].toeuc : e[:title]
214
212
  puts title
215
213
  }
216
214
  rssc.dump
data/nadokarc CHANGED
@@ -7,7 +7,7 @@
7
7
  #
8
8
  # This program is free software with ABSOLUTELY NO WARRANTY.
9
9
  # You can re-distribute and/or modify this program under
10
- # the same terms of the Ruby's lisence.
10
+ # the same terms of the Ruby's license.
11
11
  #
12
12
  #
13
13
 
@@ -80,7 +80,7 @@ class NADOKA_Config < Nadoka::NDK_ConfigBase
80
80
  # :port => 6667,
81
81
  # },
82
82
  # {
83
- # :host => 'irc6.livedoor.ne.jp',
83
+ # :host => 'dh6.ircnet.ne.jp',
84
84
  # :port => (6660 .. 6669),
85
85
  # },
86
86
  ]
@@ -387,7 +387,7 @@ module Nadoka
387
387
  @config = {}
388
388
  klass = ConfigClass.last
389
389
 
390
- klass.ancestors[0..-3].reverse_each{|kl|
390
+ klass.ancestors[0..klass.ancestors.index(NDK_ConfigBase)].reverse_each{|kl|
391
391
  kl.constants.each{|e|
392
392
  @config[e.downcase.intern] = klass.const_get(e)
393
393
  }
@@ -180,6 +180,10 @@ module Nadoka
180
180
  @server_thread.raise NDK_ReconnectToServer
181
181
  when '020'
182
182
  # ignore
183
+ when 'PRIVMSG'
184
+ # ignore
185
+ when '004'
186
+ # ignore
183
187
  else
184
188
  msg = "Server login fail!(#{q})"
185
189
  @logger.slog msg
@@ -11,7 +11,7 @@
11
11
  #
12
12
 
13
13
  module Nadoka
14
- VERSION = '0.9.1'
14
+ VERSION = '0.9.2'
15
15
  NDK_Version = VERSION.dup
16
16
  NDK_Created = Time.now
17
17
 
@@ -29,7 +29,7 @@ BotConfig = [
29
29
 
30
30
  This program is free software with ABSOLUTELY NO WARRANTY.
31
31
  You can re-distribute and/or modify this program under
32
- the same terms of the Ruby's lisence.
32
+ the same terms of the Ruby's license.
33
33
 
34
34
  == Author
35
35
 
@@ -41,9 +41,10 @@ BotConfig = [
41
41
  #"User-Agent" => "Ruby/#{RUBY_VERSION}",
42
42
  'Referer' => 'https://github.com/nadoka/nadoka',
43
43
  },
44
- # Register URL at http://code.google.com/intl/ja/apis/ajaxsearch/signup.html
45
- # and set your URL to :referer and your API key to :api_key if you want.
46
- :api_key => nil,
44
+ # API key
45
+ :api_key => 'INSERT_YOUR_API_KEY',
46
+ # Custom search engine ID
47
+ :cx => '017576662512468239146:omuauf_lfve',
47
48
  :googlec_maxwords => 5,
48
49
  :search_default_lang => 'ja',
49
50
  :count_default_lang => '',
@@ -94,6 +95,7 @@ class GoogleBot < Nadoka::NDK_Bot
94
95
  @count_default_lang = (@bot_config[:count_default_lang] || '').sub(/^lang_/, '')
95
96
  @headers = @bot_config.fetch(:headers, {})
96
97
  @api_key = @bot_config[:api_key]
98
+ @cx = @bot_config[:cx]
97
99
  @uri_slog = @bot_config.fetch(:uri_slog, false)
98
100
  @ch_kcode = @bot_config.fetch(:ch_kcode, :tojis)
99
101
  end
@@ -121,6 +123,8 @@ class GoogleBot < Nadoka::NDK_Bot
121
123
  def dispatch_command msg
122
124
  begin
123
125
  case msg
126
+ when /^g>\s*(.+)/
127
+ custom_search $1
124
128
  when /^goo(o*)gle( #{SEARCHER_RE})?(:.*?)?>\s*(.+)/o, /^gu(u*)guru(#{SEARCHER_RE})?(:.+)?>\s*(.+)/o
125
129
  "goo#{$1}gle#{$2} bot#{$3}: #{search($1.length, $3, $4, $2)}"
126
130
  when /^googlec( #{SEARCHER_RE})?(:.*?)?>\s*(.+)/o
@@ -135,6 +139,33 @@ class GoogleBot < Nadoka::NDK_Bot
135
139
  end
136
140
  end
137
141
 
142
+ def custom_search word
143
+ uri = "https://www.googleapis.com/customsearch/v1"
144
+ uri << "?key=#{@api_key}&cx=#{@cx}&q="
145
+ uri << CGI.escape(word)
146
+ @logger.slog "GoogleBot: #{uri}" if @uri_slog
147
+ result = open(uri, @headers) do |f|
148
+ JSON.parse(f.read)
149
+ end
150
+ @logger.slog "GoogleBot: #{result}" if @uri_slog
151
+ count = result["searchInformation"]["totalResults"].to_i
152
+ if count == 0
153
+ return "no match"
154
+ end
155
+ count = count.to_s.gsub(/(\d)(?=\d{3}+$)/, '\\1,')
156
+ item, = result["items"]
157
+ title = item["title"]
158
+ url = item["link"]
159
+ "#{title} - #{url} (and #{count} hit#{(count.to_i > 1) ? 's' : ''})".delete("\r\n")
160
+ rescue OpenURI::HTTPError => e
161
+ @logger.slog "GoogleBot: #{e.inspect}" if @uri_slog
162
+ result = JSON.parse(e.io.read)
163
+ if @uri_slog
164
+ @logger.slog "GoogleBot: #{result.inspect}"
165
+ end
166
+ result["error"]["errors"][0]["reason"].delete("\r\n")
167
+ end
168
+
138
169
  def do_search word, cnt, lang, searcher='web'
139
170
  i = 0
140
171
  begin
@@ -173,6 +204,11 @@ class GoogleBot < Nadoka::NDK_Bot
173
204
  def api_search word, cnt, lang, searcher
174
205
  result = do_search word, cnt, lang, searcher
175
206
 
207
+ if result["responseData"].nil?
208
+ # {"responseData": null, "responseDetails": "qps rate exceeded", "responseStatus": 503}
209
+ return "error #{result['responseStatus']}: #{result['responseDetails']}"
210
+ end
211
+
176
212
  count = result.estimatedTotalResultsCount.to_i
177
213
 
178
214
  if count > 0
@@ -300,7 +336,7 @@ class GoogleBot < Nadoka::NDK_Bot
300
336
  else
301
337
  api_search word, cnt, lang, searcher
302
338
  end
303
- end
339
+ end
304
340
 
305
341
  def googlec lang, word, searcher=nil
306
342
  lang = lang_check(lang, @count_default_lang)
@@ -29,7 +29,6 @@ BotConfig = [
29
29
  =end
30
30
 
31
31
  require 'lib/rss_check'
32
- require 'iconv'
33
32
  require 'kconv'
34
33
 
35
34
  class RSS_CheckBot < Nadoka::NDK_Bot
@@ -40,7 +39,6 @@ class RSS_CheckBot < Nadoka::NDK_Bot
40
39
  @tm = @bot_config.fetch(:tm,30) # min
41
40
  @over = @bot_config.fetch(:over_message, nil)
42
41
  @rssc = RSS_Check.new(@paths, @cache, true)
43
- @ic = Iconv.open("EUC-JP", "UTF-8")
44
42
  @prevtm= Time.now
45
43
  end
46
44
 
@@ -99,7 +97,7 @@ class RSS_CheckBot < Nadoka::NDK_Bot
99
97
  begin
100
98
  # convert from U+FF5E FULLWIDTH TILDE to U+301C WAVE DASH
101
99
  title = e[:title].gsub(/\357\275\236/u, "\343\200\234")
102
- title = @ic.iconv(title)
100
+ title = title.toeuc
103
101
  rescue Exception
104
102
  # maybe, char code translation error
105
103
  next
@@ -59,14 +59,28 @@ end
59
59
  module URL2Title
60
60
  module_function
61
61
 
62
+ BLACKLIST_HOST = [
63
+ /\blocalhost\b/,
64
+ /\A127\./,
65
+ /\A192\.168\./,
66
+ /\A10\./,
67
+ /\A169\.254\./,
68
+ ]
69
+
62
70
  def get_title(url, headers)
63
71
  uri = URI(url)
64
72
  info = { :uri => uri }
65
73
  info[:errors] = []
66
74
  case uri.host
67
- when /localhost/, /\A127\./, /\A192\.168\./, /\A10\./
75
+ when *BLACKLIST_HOST
68
76
  info[:title] = "(ignored)"
69
77
  return info
78
+ when /\A(?:www\.nicovideo\.jp)\z/
79
+ if /\A\/watch\/(sm\d+)\z/ =~ uri.path
80
+ uri = URI("http://d.hatena.ne.jp/video/niconico/#{$1}")
81
+ end
82
+ when /\A(?:mobile\.twitter\.com)\z/
83
+ uri = URI(url.sub(/mobile\.twitter\.com/, 'twitter.com'))
70
84
  end
71
85
  headers = {
72
86
  :content_length_proc => proc{|x| raise Errno::EFBIG if x && x > 1048576},
@@ -104,7 +118,7 @@ module URL2Title
104
118
  charset = $1
105
119
  end
106
120
  case charset
107
- when /shift_jis/i
121
+ when /shift[_-]jis/i
108
122
  charset = "cp932"
109
123
  when /euc-jp/i # euc-jp, x-euc-jp
110
124
  charset = "eucjp-ms"
@@ -151,6 +165,10 @@ module URL2Title
151
165
  end
152
166
  when /\A(?:github\.com)\z/
153
167
  # ignore og:title
168
+ when /\A(?:www\.youtube\.com)\z/
169
+ if %r'"title":"(.+?)"' =~ body
170
+ title = $1
171
+ end
154
172
  else
155
173
  if defined?(::Nokogiri)
156
174
  doc ||= Nokogiri::HTML(body, uri.to_s, 'utf-8')
@@ -255,7 +273,7 @@ end
255
273
  if __FILE__ == $0
256
274
  require File.expand_path('../../ndk/version', __FILE__)
257
275
  def u2t(url)
258
- firefox = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:25.0) Gecko/20100101 Firefox/25.0"
276
+ firefox = "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0"
259
277
  ua = "NadokaTitleBot/#{Nadoka::VERSION}"
260
278
  headers = {
261
279
  "User-Agent" => "#{firefox} Ruby/#{RUBY_VERSION} #{ua}",
@@ -264,6 +282,7 @@ if __FILE__ == $0
264
282
  rescue
265
283
  $!.inspect
266
284
  end
285
+ URL2Title::BLACKLIST_HOST << /\.test\z/
267
286
  if ARGV.empty?
268
287
  # TODO: test
269
288
  else
@@ -58,8 +58,8 @@ module RICE
58
58
 
59
59
  @read_q = Queue.new
60
60
 
61
- @read_th = Thread.new(@read_q, @eol) do |read_q, eol|
62
- read_thread(read_q, eol)
61
+ @read_th = Thread.new(@read_q, @eol) do |read_q, eol_|
62
+ read_thread(read_q, eol_)
63
63
  end
64
64
 
65
65
  @threads = {}
@@ -86,7 +86,7 @@ module RICE
86
86
  @delay = 0.3
87
87
  @prev_send_time = Time.now
88
88
  end
89
- attr :delay, true
89
+ attr_accessor :delay
90
90
  attr_reader :server, :port, :ssl_params
91
91
 
92
92
  =begin
@@ -217,6 +217,7 @@ module RICE
217
217
  context.set_params(ssl_params)
218
218
  conn = OpenSSL::SSL::SSLSocket.new(conn, context)
219
219
  conn.sync_close = true
220
+ conn.hostname = @server if conn.respond_to? :hostname=
220
221
  conn.connect
221
222
  if context.verify_mode != OpenSSL::SSL::VERIFY_NONE
222
223
  conn.post_connection_check(@server)
@@ -246,8 +247,8 @@ module RICE
246
247
  USER_THREAD = Struct.new('User_Thread', :q, :raise_on_close)
247
248
  def regist(raise_on_close = false, *args)
248
249
  read_q = Queue.new
249
- th = Thread.new(read_q, self, *args) do |read_q, conn, *args|
250
- yield(read_q, conn, *args)
250
+ th = Thread.new(read_q, self, *args) do |read_q_, conn, *args_|
251
+ yield(read_q_, conn, *args_)
251
252
  end
252
253
  @threads.synchronize do
253
254
  @threads[th] = USER_THREAD.new(read_q, raise_on_close)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nadoka
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
4
+ version: 0.9.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kazuhiro NISHIYAMA
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-02-29 00:00:00.000000000 Z
12
+ date: 2018-09-29 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: Nadoka is a tool for monitoring and logging IRC conversations and responding
15
15
  to specially formatted requests. You define and customize these responses in Ruby.
@@ -97,7 +97,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
97
97
  version: '0'
98
98
  requirements: []
99
99
  rubyforge_project:
100
- rubygems_version: 2.5.1
100
+ rubygems_version: 2.7.6
101
101
  signing_key:
102
102
  specification_version: 4
103
103
  summary: IRC logger, monitor and proxy program ("bot")