nadoka 0.8.4 → 0.8.5
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.
- checksums.yaml +7 -0
- data/.travis.yml +24 -0
- data/README.md +3 -0
- data/check-syntax.rb +8 -0
- data/ndk/version.rb +1 -1
- data/plugins/githubissuesbot.nb +27 -5
- data/plugins/googlebot.nb +7 -1
- data/plugins/sixamobot.nb +1 -1
- data/plugins/titlebot.nb +49 -20
- data/plugins/xibot.nb +1 -0
- data/rice/irc.rb +2 -1
- metadata +9 -9
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: a0027c38e7562857343bf5e48f87e1916ec53cde
|
|
4
|
+
data.tar.gz: 86d15edf115119b3f5bcd9f54804195684c3bfa9
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 9a5a016d5cf5855d582ff360ab65022d4c53e2edab751d8349154b379dd1913091b6522b4b5ae56567433723d3801e9d3836edc3fd9df5f2918c15511004d5ea
|
|
7
|
+
data.tar.gz: 1548049a15809f1f5a54bf9521d14d426bd0ad0bb0182114b7ea79c7aa36f94ef117ff26fc83073c70e8981a221f715d0d1e0fc81edef91b729a679aa1450698
|
data/.travis.yml
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
language: ruby
|
|
2
|
+
rvm:
|
|
3
|
+
- 2.0.0
|
|
4
|
+
- 1.9.3
|
|
5
|
+
- jruby-18mode # JRuby in 1.8 mode
|
|
6
|
+
- jruby-19mode # JRuby in 1.9 mode
|
|
7
|
+
- rbx-18mode
|
|
8
|
+
- rbx-19mode
|
|
9
|
+
- ruby-head
|
|
10
|
+
- jruby-head
|
|
11
|
+
- 1.8.7
|
|
12
|
+
- ree
|
|
13
|
+
matrix:
|
|
14
|
+
allow_failures:
|
|
15
|
+
- rvm: jruby-18mode
|
|
16
|
+
- rvm: jruby-19mode
|
|
17
|
+
- rvm: rbx-18mode
|
|
18
|
+
- rvm: rbx-19mode
|
|
19
|
+
- rvm: ruby-head
|
|
20
|
+
- rvm: jruby-head
|
|
21
|
+
- rvm: ree
|
|
22
|
+
script: ruby check-syntax.rb
|
|
23
|
+
notifications:
|
|
24
|
+
irc: "irc.freenode.org#nadoka_jp"
|
data/README.md
CHANGED
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
Written by SASADA Koichi <ko1 at atdot.net>
|
|
4
4
|
|
|
5
|
+
[](https://travis-ci.org/nadoka/nadoka)
|
|
6
|
+
[](https://codeclimate.com/github/nadoka/nadoka)
|
|
7
|
+
|
|
5
8
|
## What's this?
|
|
6
9
|
|
|
7
10
|
Nadoka is IRC Client Server program.
|
data/check-syntax.rb
ADDED
data/ndk/version.rb
CHANGED
data/plugins/githubissuesbot.nb
CHANGED
|
@@ -33,13 +33,34 @@ end
|
|
|
33
33
|
module GithubIssues
|
|
34
34
|
module_function
|
|
35
35
|
|
|
36
|
-
|
|
36
|
+
DEFAULT_HEADER = {
|
|
37
|
+
'User-Agent' => "Nadoka-GithubIssuesBot/0.1",
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
def uri_read(uri, header)
|
|
41
|
+
debug = $GITHUB_ISSUES_DEBUG
|
|
42
|
+
p uri if debug
|
|
43
|
+
uri.open("r", header) do |f|
|
|
44
|
+
p f.meta if debug
|
|
45
|
+
return f.read
|
|
46
|
+
end
|
|
47
|
+
rescue OpenURI::HTTPError => e
|
|
48
|
+
p e.io.meta if debug
|
|
49
|
+
if e.io.meta["x-ratelimit-remaining"] == "0"
|
|
50
|
+
raise "#{e}: because x-ratelimit-remaining=0"
|
|
51
|
+
end
|
|
52
|
+
raise "#{e}: #{uri}"
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def issues(owner, repo, since, state='open', header=DEFAULT_HEADER)
|
|
37
56
|
since = since.utc.strftime("%Y-%m-%dT%H:%M:%SZ")
|
|
38
57
|
uri = URI("https://api.github.com/repos/#{owner}/#{repo}/issues?since=#{since}&state=#{state}")
|
|
39
|
-
|
|
58
|
+
json = uri_read(uri, header)
|
|
59
|
+
issues = JSON.parse(json)
|
|
40
60
|
issues.each do |issue|
|
|
41
61
|
comments_uri = URI("#{issue['comments_url']}?since=#{since}")
|
|
42
|
-
|
|
62
|
+
json = uri_read(comments_uri, header)
|
|
63
|
+
comments = JSON.parse(json)
|
|
43
64
|
if comments.empty?
|
|
44
65
|
yield [:issue, issue, issue_to_s(issue)]
|
|
45
66
|
else
|
|
@@ -77,9 +98,10 @@ module GithubIssues
|
|
|
77
98
|
end
|
|
78
99
|
|
|
79
100
|
if __FILE__ == $0
|
|
101
|
+
$GITHUB_ISSUES_DEBUG = $DEBUG
|
|
80
102
|
owner = "rubima"
|
|
81
103
|
repo = "rubima"
|
|
82
|
-
since = Time.now - 60*60*3
|
|
104
|
+
since = Time.now - 60*60*3*7
|
|
83
105
|
GithubIssues.issues(owner, repo, since) do |_, _, s|
|
|
84
106
|
puts s.gsub(/\s+/, ' ')
|
|
85
107
|
end
|
|
@@ -135,7 +157,7 @@ class GithubIssuesBot < Nadoka::NDK_Bot
|
|
|
135
157
|
send_notice @ch, s
|
|
136
158
|
end
|
|
137
159
|
rescue Exception => e
|
|
138
|
-
send_notice(@ch, "
|
|
160
|
+
send_notice(@ch, "github issues bot error for #{@owner}/#{@repo}: #{e}")
|
|
139
161
|
@manager.ndk_error e
|
|
140
162
|
end
|
|
141
163
|
end
|
data/plugins/googlebot.nb
CHANGED
|
@@ -54,7 +54,9 @@ BotConfig = [
|
|
|
54
54
|
=end
|
|
55
55
|
|
|
56
56
|
|
|
57
|
-
|
|
57
|
+
unless "".respond_to?(:encode)
|
|
58
|
+
require 'iconv'
|
|
59
|
+
end
|
|
58
60
|
require 'kconv'
|
|
59
61
|
require 'shellwords'
|
|
60
62
|
require 'cgi'
|
|
@@ -192,6 +194,10 @@ class GoogleBot < Nadoka::NDK_Bot
|
|
|
192
194
|
result.gsub!(/ /u, " ")
|
|
193
195
|
result.gsub!(/\s+/, " ")
|
|
194
196
|
return result
|
|
197
|
+
elsif /<div class="leg_calc [^<>]*><div[^<>]*>([^<>]*)<\/div><div[^<>]*>([^<>]*)</u =~ html
|
|
198
|
+
result = "#{$1} #{$2}"
|
|
199
|
+
#@logger.slog("google_calc>#{result.dump}")
|
|
200
|
+
return result
|
|
195
201
|
else
|
|
196
202
|
"response error"
|
|
197
203
|
end
|
data/plugins/sixamobot.nb
CHANGED
data/plugins/titlebot.nb
CHANGED
|
@@ -27,7 +27,10 @@ Reply title of URL.
|
|
|
27
27
|
|
|
28
28
|
=end
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
begin
|
|
31
|
+
require 'iconv'
|
|
32
|
+
rescue LoadError
|
|
33
|
+
end
|
|
31
34
|
require 'nkf'
|
|
32
35
|
require 'open-uri'
|
|
33
36
|
require 'timeout'
|
|
@@ -45,6 +48,13 @@ begin
|
|
|
45
48
|
rescue LoadError
|
|
46
49
|
end
|
|
47
50
|
|
|
51
|
+
unless OpenURI.redirectable?(URI("http://example.com"), URI("https://example.com"))
|
|
52
|
+
def OpenURI.redirectable?(uri1, uri2) # :nodoc:
|
|
53
|
+
uri1.scheme.downcase == uri2.scheme.downcase ||
|
|
54
|
+
(/\A(?:http|ftp)\z/i =~ uri1.scheme && /\A(?:https?|ftp)\z/i =~ uri2.scheme)
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
48
58
|
module URL2Title
|
|
49
59
|
module_function
|
|
50
60
|
|
|
@@ -104,39 +114,46 @@ module URL2Title
|
|
|
104
114
|
body = NKF.nkf("-wm0x --ic=#{charset}", body)
|
|
105
115
|
elsif charset
|
|
106
116
|
charset.sub!(/\Ax-?/i, '')
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
117
|
+
if defined?(Iconv)
|
|
118
|
+
begin
|
|
119
|
+
body = Iconv.conv("utf-8", charset, body)
|
|
120
|
+
rescue Iconv::IllegalSequence => e
|
|
121
|
+
info[:errors] << e
|
|
122
|
+
body = NKF.nkf("-wm0x", body)
|
|
123
|
+
rescue Iconv::InvalidEncoding => e
|
|
124
|
+
info[:errors] << e
|
|
125
|
+
body = NKF.nkf("-wm0x", body)
|
|
126
|
+
end
|
|
127
|
+
else
|
|
128
|
+
body = body.encode("utf-8", charset, :invalid => :replace, :undef => :replace)
|
|
115
129
|
end
|
|
116
130
|
else
|
|
117
131
|
body = NKF.nkf("-wm0x", body)
|
|
118
132
|
end
|
|
119
133
|
|
|
120
134
|
title = nil
|
|
121
|
-
|
|
135
|
+
if %r"<title\b(?>[^<>]*)>(.*?)</title(?>[^<>]*)>"miu =~ body
|
|
136
|
+
title = $1
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
case f.base_uri.host
|
|
122
140
|
when /\A(?:twitter\.com)\z/
|
|
123
|
-
if %r"<title\b(?>[^<>]*)>(.*?)</title(?>[^<>]*)>"miu =~ body
|
|
124
|
-
title = $1
|
|
125
|
-
end
|
|
126
141
|
if defined?(::Nokogiri)
|
|
127
142
|
doc = Nokogiri::HTML(body, uri.to_s, 'utf-8')
|
|
128
|
-
tweet = doc.css('.tweet-text')
|
|
129
|
-
|
|
143
|
+
tweet, = doc.css('.tweet-text')
|
|
144
|
+
if tweet
|
|
130
145
|
tweet = tweet.inner_html
|
|
131
146
|
tweet.gsub!(/<.*?>/, '')
|
|
132
147
|
tweet.strip!
|
|
133
148
|
title = tweet unless tweet.empty?
|
|
134
149
|
end
|
|
135
150
|
end
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
151
|
+
when /\A(?:github\.com)\z/
|
|
152
|
+
# ignore og:title
|
|
153
|
+
if title
|
|
154
|
+
title = title.gsub(/\xC2\xB8/u, "-")
|
|
139
155
|
end
|
|
156
|
+
else
|
|
140
157
|
if defined?(::Nokogiri)
|
|
141
158
|
doc ||= Nokogiri::HTML(body, uri.to_s, 'utf-8')
|
|
142
159
|
og_title = doc.xpath("//meta[@property='og:title'][1]/@content")
|
|
@@ -176,10 +193,10 @@ module URL2Title
|
|
|
176
193
|
doc ||= Nokogiri::HTML(body, uri.to_s, 'utf-8')
|
|
177
194
|
canonical_uri = doc.xpath("//link[@rel='canonical'][1]/@href")
|
|
178
195
|
unless canonical_uri.empty?
|
|
179
|
-
info[:uri] = URI(canonical_uri.text)
|
|
196
|
+
info[:uri] = URI(shorten_url(canonical_uri.text))
|
|
180
197
|
end
|
|
181
198
|
elsif /<link rel="canonical" href="(.+?)"/i =~ body
|
|
182
|
-
info[:uri] = URI(CGI.unescapeHTML($1))
|
|
199
|
+
info[:uri] = URI(shorten_url(CGI.unescapeHTML($1)))
|
|
183
200
|
end
|
|
184
201
|
if title
|
|
185
202
|
title = CGI.unescapeHTML(title)
|
|
@@ -217,6 +234,18 @@ module URL2Title
|
|
|
217
234
|
url.sub(/\/\#!\//, '/')
|
|
218
235
|
end
|
|
219
236
|
|
|
237
|
+
def shorten_url(url)
|
|
238
|
+
case url
|
|
239
|
+
when %r!\Ahttp://www\.amazon\.co\.jp/.*(/dp/.+)\z!
|
|
240
|
+
"http://amazon.jp#{$1}"
|
|
241
|
+
when %r!\A(http://(?:[a-z]+\.)?slashdot\.jp/story/\d+/\d+/\d+/\d+)(?:/.*)?\z!
|
|
242
|
+
$1
|
|
243
|
+
else
|
|
244
|
+
# default: do nothing
|
|
245
|
+
url
|
|
246
|
+
end
|
|
247
|
+
end
|
|
248
|
+
|
|
220
249
|
def url2title(url, headers)
|
|
221
250
|
url = prepare_url(url)
|
|
222
251
|
info = get_title(url, headers)
|
data/plugins/xibot.nb
CHANGED
data/rice/irc.rb
CHANGED
|
@@ -717,7 +717,8 @@ E
|
|
|
717
717
|
369,RPL_ENDOFWHOWAS 321,RPL_LISTSTART
|
|
718
718
|
322,RPL_LIST 323,RPL_LISTEND 325,RPL_UNIQOPIS
|
|
719
719
|
324,RPL_CHANNELMODEIS 331,RPL_NOTOPIC
|
|
720
|
-
332,RPL_TOPIC
|
|
720
|
+
332,RPL_TOPIC 333,RPL_TOPICWHOTIME
|
|
721
|
+
341,RPL_INVITING 342,RPL_SUMMONING
|
|
721
722
|
344,RPL_REOPLIST 345,RPL_ENDOFREOPLIST
|
|
722
723
|
346,RPL_INVITELIST 347,RPL_ENDOFINVITELIST
|
|
723
724
|
348,RPL_EXCEPTLIST 349,RPL_ENDOFEXCEPTLIST
|
metadata
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: nadoka
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.8.
|
|
5
|
-
prerelease:
|
|
4
|
+
version: 0.8.5
|
|
6
5
|
platform: ruby
|
|
7
6
|
authors:
|
|
8
7
|
- Kazuhiro NISHIYAMA
|
|
@@ -10,7 +9,7 @@ authors:
|
|
|
10
9
|
autorequire:
|
|
11
10
|
bindir: bin
|
|
12
11
|
cert_chain: []
|
|
13
|
-
date: 2013-
|
|
12
|
+
date: 2013-07-29 00:00:00.000000000 Z
|
|
14
13
|
dependencies: []
|
|
15
14
|
description: Nadoka is a tool for monitoring and logging IRC conversations and responding
|
|
16
15
|
to specially formatted requests. You define and customize these responses in Ruby.
|
|
@@ -23,10 +22,12 @@ extensions: []
|
|
|
23
22
|
extra_rdoc_files: []
|
|
24
23
|
files:
|
|
25
24
|
- .gitignore
|
|
25
|
+
- .travis.yml
|
|
26
26
|
- Gemfile
|
|
27
27
|
- README.md
|
|
28
28
|
- Rakefile
|
|
29
29
|
- bin/nadoka
|
|
30
|
+
- check-syntax.rb
|
|
30
31
|
- doc/ChangeLog.old
|
|
31
32
|
- lib/rss_check.rb
|
|
32
33
|
- lib/tagparts.rb
|
|
@@ -79,26 +80,25 @@ files:
|
|
|
79
80
|
- rice/irc.rb
|
|
80
81
|
homepage: https://github.com/nadoka/nadoka
|
|
81
82
|
licenses: []
|
|
83
|
+
metadata: {}
|
|
82
84
|
post_install_message:
|
|
83
85
|
rdoc_options: []
|
|
84
86
|
require_paths:
|
|
85
87
|
- lib
|
|
86
88
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
87
|
-
none: false
|
|
88
89
|
requirements:
|
|
89
|
-
- -
|
|
90
|
+
- - '>='
|
|
90
91
|
- !ruby/object:Gem::Version
|
|
91
92
|
version: '0'
|
|
92
93
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
93
|
-
none: false
|
|
94
94
|
requirements:
|
|
95
|
-
- -
|
|
95
|
+
- - '>='
|
|
96
96
|
- !ruby/object:Gem::Version
|
|
97
97
|
version: '0'
|
|
98
98
|
requirements: []
|
|
99
99
|
rubyforge_project: nadoka
|
|
100
|
-
rubygems_version:
|
|
100
|
+
rubygems_version: 2.0.3
|
|
101
101
|
signing_key:
|
|
102
|
-
specification_version:
|
|
102
|
+
specification_version: 4
|
|
103
103
|
summary: IRC logger, monitor and proxy program ("bot")
|
|
104
104
|
test_files: []
|