nadoka 0.8.4 → 0.8.5
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
[![Build Status](https://travis-ci.org/nadoka/nadoka.png?branch=master)](https://travis-ci.org/nadoka/nadoka)
|
6
|
+
[![Code Climate](https://codeclimate.com/github/nadoka/nadoka.png)](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: []
|