cerberus 0.7.6 → 0.7.7
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.
- data/Changelog.txt +21 -1
- data/Rakefile +2 -2
- data/lib/cerberus/cli.rb +1 -1
- data/lib/cerberus/constants.rb +1 -1
- data/lib/cerberus/manager.rb +5 -5
- data/lib/cerberus/publisher/base.rb +1 -1
- data/lib/cerberus/publisher/irc.rb +8 -13
- data/lib/cerberus/publisher/mail.rb +1 -0
- data/lib/cerberus/scm/git.rb +1 -1
- data/lib/vendor/addressable/CHANGELOG +88 -0
- data/lib/vendor/addressable/LICENSE +20 -0
- data/lib/vendor/addressable/README +50 -0
- data/lib/vendor/addressable/Rakefile +74 -0
- data/lib/vendor/addressable/addressable.gemspec +30 -0
- data/lib/vendor/addressable/lib/addressable/idna.rb +4871 -0
- data/lib/vendor/addressable/lib/addressable/template.rb +1049 -0
- data/lib/vendor/addressable/lib/addressable/uri.rb +2078 -0
- data/lib/vendor/addressable/lib/addressable/version.rb +36 -0
- data/lib/vendor/addressable/spec/addressable/idna_spec.rb +194 -0
- data/lib/vendor/addressable/spec/addressable/template_spec.rb +2152 -0
- data/lib/vendor/addressable/spec/addressable/uri_spec.rb +3914 -0
- data/lib/vendor/addressable/spec/data/rfc3986.txt +3419 -0
- data/lib/vendor/addressable/tasks/clobber.rake +2 -0
- data/lib/vendor/addressable/tasks/gem.rake +68 -0
- data/lib/vendor/addressable/tasks/git.rake +40 -0
- data/lib/vendor/addressable/tasks/metrics.rake +22 -0
- data/lib/vendor/addressable/tasks/rdoc.rake +29 -0
- data/lib/vendor/addressable/tasks/rubyforge.rake +89 -0
- data/lib/vendor/addressable/tasks/spec.rake +47 -0
- data/lib/vendor/addressable/website/index.html +110 -0
- data/lib/vendor/shout-bot/TODO +2 -0
- data/lib/vendor/shout-bot/lib/shout-bot.rb +76 -0
- data/lib/vendor/shout-bot/shout-bot.gemspec +13 -0
- data/lib/vendor/tinder/CHANGELOG.txt +39 -0
- data/lib/vendor/tinder/Manifest.txt +10 -0
- data/lib/vendor/tinder/README.txt +48 -0
- data/lib/vendor/tinder/Rakefile +45 -0
- data/lib/vendor/tinder/VERSION +1 -0
- data/lib/vendor/tinder/init.rb +1 -0
- data/lib/vendor/tinder/lib/tinder.rb +12 -0
- data/lib/vendor/tinder/lib/tinder/campfire.rb +75 -0
- data/lib/vendor/tinder/lib/tinder/connection.rb +74 -0
- data/lib/vendor/tinder/lib/tinder/multipart.rb +63 -0
- data/lib/vendor/tinder/lib/tinder/room.rb +225 -0
- data/lib/vendor/tinder/site/index.html +101 -0
- data/lib/vendor/tinder/site/stylesheets/style.css +77 -0
- data/lib/vendor/tinder/spec/fixtures/rooms.json +18 -0
- data/lib/vendor/tinder/spec/fixtures/rooms/room80749.json +21 -0
- data/lib/vendor/tinder/spec/fixtures/rooms/room80751.json +21 -0
- data/lib/vendor/tinder/spec/fixtures/rooms/show.json +21 -0
- data/lib/vendor/tinder/spec/fixtures/users/me.json +11 -0
- data/lib/vendor/tinder/spec/spec.opts +2 -0
- data/lib/vendor/tinder/spec/spec_helper.rb +12 -0
- data/lib/vendor/tinder/spec/tinder/campfire_spec.rb +53 -0
- data/lib/vendor/tinder/spec/tinder/connection_spec.rb +29 -0
- data/lib/vendor/tinder/spec/tinder/room_spec.rb +98 -0
- data/lib/vendor/tinder/tinder.gemspec +79 -0
- data/test/functional_test.rb +19 -4
- data/test/integration_test.rb +1 -1
- data/test/irc_publisher_test.rb +4 -4
- data/test/mock/manager.rb +1 -1
- metadata +58 -20
- data/lib/vendor/irc/README +0 -23
- data/lib/vendor/irc/lib/IRC.rb +0 -164
- data/lib/vendor/irc/lib/IRCChannel.rb +0 -33
- data/lib/vendor/irc/lib/IRCConnection.rb +0 -134
- data/lib/vendor/irc/lib/IRCEvent.rb +0 -91
- data/lib/vendor/irc/lib/IRCUser.rb +0 -23
- data/lib/vendor/irc/lib/IRCUtil.rb +0 -49
- data/lib/vendor/irc/lib/eventmap.yml +0 -247
@@ -0,0 +1,68 @@
|
|
1
|
+
require "rake/gempackagetask"
|
2
|
+
|
3
|
+
namespace :gem do
|
4
|
+
GEM_SPEC = Gem::Specification.new do |s|
|
5
|
+
s.name = PKG_NAME
|
6
|
+
s.version = PKG_VERSION
|
7
|
+
s.summary = PKG_SUMMARY
|
8
|
+
s.description = PKG_DESCRIPTION
|
9
|
+
|
10
|
+
s.files = PKG_FILES.to_a
|
11
|
+
|
12
|
+
s.has_rdoc = true
|
13
|
+
s.extra_rdoc_files = %w( README )
|
14
|
+
s.rdoc_options.concat ["--main", "README"]
|
15
|
+
|
16
|
+
if !s.respond_to?(:add_development_dependency)
|
17
|
+
puts "Cannot build Gem with this version of RubyGems."
|
18
|
+
exit(1)
|
19
|
+
end
|
20
|
+
|
21
|
+
s.add_development_dependency("rake", ">= 0.7.3")
|
22
|
+
s.add_development_dependency("rspec", ">= 1.0.8")
|
23
|
+
s.add_development_dependency("launchy", ">= 0.3.2")
|
24
|
+
|
25
|
+
s.require_path = "lib"
|
26
|
+
|
27
|
+
s.author = "Bob Aman"
|
28
|
+
s.email = "bob@sporkmonger.com"
|
29
|
+
s.homepage = RUBY_FORGE_URL
|
30
|
+
s.rubyforge_project = RUBY_FORGE_PROJECT
|
31
|
+
end
|
32
|
+
|
33
|
+
Rake::GemPackageTask.new(GEM_SPEC) do |p|
|
34
|
+
p.gem_spec = GEM_SPEC
|
35
|
+
p.need_tar = true
|
36
|
+
p.need_zip = true
|
37
|
+
end
|
38
|
+
|
39
|
+
desc "Show information about the gem"
|
40
|
+
task :debug do
|
41
|
+
puts GEM_SPEC.to_ruby
|
42
|
+
end
|
43
|
+
|
44
|
+
desc "Install the gem"
|
45
|
+
task :install => ["clobber", "gem:package"] do
|
46
|
+
sh "#{SUDO} gem install --local pkg/#{GEM_SPEC.full_name}"
|
47
|
+
end
|
48
|
+
|
49
|
+
desc "Uninstall the gem"
|
50
|
+
task :uninstall do
|
51
|
+
installed_list = Gem.source_index.find_name(PKG_NAME)
|
52
|
+
if installed_list &&
|
53
|
+
(installed_list.collect { |s| s.version.to_s}.include?(PKG_VERSION))
|
54
|
+
sh(
|
55
|
+
"#{SUDO} gem uninstall --version '#{PKG_VERSION}' " +
|
56
|
+
"--ignore-dependencies --executables #{PKG_NAME}"
|
57
|
+
)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
desc "Reinstall the gem"
|
62
|
+
task :reinstall => [:uninstall, :install]
|
63
|
+
end
|
64
|
+
|
65
|
+
desc "Alias to gem:package"
|
66
|
+
task "gem" => "gem:package"
|
67
|
+
|
68
|
+
task "clobber" => ["gem:clobber_package"]
|
@@ -0,0 +1,40 @@
|
|
1
|
+
namespace :git do
|
2
|
+
namespace :tag do
|
3
|
+
desc "List tags from the Git repository"
|
4
|
+
task :list do
|
5
|
+
tags = `git tag -l`
|
6
|
+
tags.gsub!("\r", "")
|
7
|
+
tags = tags.split("\n").sort {|a, b| b <=> a }
|
8
|
+
puts tags.join("\n")
|
9
|
+
end
|
10
|
+
|
11
|
+
desc "Create a new tag in the Git repository"
|
12
|
+
task :create do
|
13
|
+
changelog = File.open("CHANGELOG", "r") { |file| file.read }
|
14
|
+
puts "-" * 80
|
15
|
+
puts changelog
|
16
|
+
puts "-" * 80
|
17
|
+
puts
|
18
|
+
|
19
|
+
v = ENV["VERSION"] or abort "Must supply VERSION=x.y.z"
|
20
|
+
abort "Versions don't match #{v} vs #{PKG_VERSION}" if v != PKG_VERSION
|
21
|
+
|
22
|
+
tag = "#{PKG_NAME}-#{PKG_VERSION}"
|
23
|
+
msg = "Release #{PKG_NAME}-#{PKG_VERSION}"
|
24
|
+
|
25
|
+
existing_tags = `git tag -l instrument-*`.split("\n")
|
26
|
+
if existing_tags.include?(tag)
|
27
|
+
warn("Tag already exists, deleting...")
|
28
|
+
unless system "git tag -d #{tag}"
|
29
|
+
abort "Tag deletion failed."
|
30
|
+
end
|
31
|
+
end
|
32
|
+
puts "Creating git tag '#{tag}'..."
|
33
|
+
unless system "git tag -a -m \"#{msg}\" #{tag}"
|
34
|
+
abort "Tag creation failed."
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
task "gem:release" => "git:tag:create"
|
@@ -0,0 +1,22 @@
|
|
1
|
+
namespace :metrics do
|
2
|
+
task :lines do
|
3
|
+
lines, codelines, total_lines, total_codelines = 0, 0, 0, 0
|
4
|
+
for file_name in FileList["lib/**/*.rb"]
|
5
|
+
f = File.open(file_name)
|
6
|
+
while line = f.gets
|
7
|
+
lines += 1
|
8
|
+
next if line =~ /^\s*$/
|
9
|
+
next if line =~ /^\s*#/
|
10
|
+
codelines += 1
|
11
|
+
end
|
12
|
+
puts "L: #{sprintf("%4d", lines)}, " +
|
13
|
+
"LOC #{sprintf("%4d", codelines)} | #{file_name}"
|
14
|
+
total_lines += lines
|
15
|
+
total_codelines += codelines
|
16
|
+
|
17
|
+
lines, codelines = 0, 0
|
18
|
+
end
|
19
|
+
|
20
|
+
puts "Total: Lines #{total_lines}, LOC #{total_codelines}"
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require "rake/rdoctask"
|
2
|
+
|
3
|
+
namespace :doc do
|
4
|
+
desc "Generate RDoc documentation"
|
5
|
+
Rake::RDocTask.new do |rdoc|
|
6
|
+
rdoc.rdoc_dir = "doc"
|
7
|
+
rdoc.title = "#{PKG_NAME}-#{PKG_VERSION} Documentation"
|
8
|
+
rdoc.options << "--line-numbers" << "--inline-source" <<
|
9
|
+
"--accessor" << "cattr_accessor=object" << "--charset" << "utf-8"
|
10
|
+
rdoc.template = "#{ENV["template"]}.rb" if ENV["template"]
|
11
|
+
rdoc.rdoc_files.include("README", "CHANGELOG", "LICENSE")
|
12
|
+
rdoc.rdoc_files.include("lib/**/*.rb")
|
13
|
+
end
|
14
|
+
|
15
|
+
desc "Generate ri locally for testing"
|
16
|
+
task :ri do
|
17
|
+
sh "rdoc --ri -o ri ."
|
18
|
+
end
|
19
|
+
|
20
|
+
desc "Remove ri products"
|
21
|
+
task :clobber_ri do
|
22
|
+
rm_r "ri" rescue nil
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
desc "Alias to doc:rdoc"
|
27
|
+
task "doc" => "doc:rdoc"
|
28
|
+
|
29
|
+
task "clobber" => ["doc:clobber_rdoc", "doc:clobber_ri"]
|
@@ -0,0 +1,89 @@
|
|
1
|
+
namespace :gem do
|
2
|
+
desc 'Package and upload to RubyForge'
|
3
|
+
task :release => ["gem:package"] do |t|
|
4
|
+
require 'rubyforge'
|
5
|
+
|
6
|
+
v = ENV['VERSION'] or abort 'Must supply VERSION=x.y.z'
|
7
|
+
abort "Versions don't match #{v} vs #{PROJ.version}" if v != PKG_VERSION
|
8
|
+
pkg = "pkg/#{GEM_SPEC.full_name}"
|
9
|
+
|
10
|
+
rf = RubyForge.new
|
11
|
+
rf.configure
|
12
|
+
puts 'Logging in...'
|
13
|
+
rf.login
|
14
|
+
|
15
|
+
c = rf.userconfig
|
16
|
+
changelog = File.open("CHANGELOG") { |file| file.read }
|
17
|
+
c['release_changes'] = changelog
|
18
|
+
c['preformatted'] = true
|
19
|
+
|
20
|
+
files = ["#{pkg}.tgz", "#{pkg}.zip", "#{pkg}.gem"]
|
21
|
+
|
22
|
+
puts "Releasing #{PKG_NAME} v. #{PKG_VERSION}"
|
23
|
+
rf.add_release RUBY_FORGE_PROJECT, PKG_NAME, PKG_VERSION, *files
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
namespace :doc do
|
28
|
+
desc "Publish RDoc to RubyForge"
|
29
|
+
task :release => ["doc:rdoc"] do
|
30
|
+
require "rake/contrib/sshpublisher"
|
31
|
+
require "yaml"
|
32
|
+
|
33
|
+
config = YAML.load(
|
34
|
+
File.read(File.expand_path('~/.rubyforge/user-config.yml'))
|
35
|
+
)
|
36
|
+
host = "#{config['username']}@rubyforge.org"
|
37
|
+
remote_dir = RUBY_FORGE_PATH + "/api"
|
38
|
+
local_dir = "doc"
|
39
|
+
Rake::SshDirPublisher.new(host, remote_dir, local_dir).upload
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
namespace :spec do
|
44
|
+
desc "Publish specdoc to RubyForge"
|
45
|
+
task :release => ["spec:specdoc"] do
|
46
|
+
require "rake/contrib/sshpublisher"
|
47
|
+
require "yaml"
|
48
|
+
|
49
|
+
config = YAML.load(
|
50
|
+
File.read(File.expand_path('~/.rubyforge/user-config.yml'))
|
51
|
+
)
|
52
|
+
host = "#{config['username']}@rubyforge.org"
|
53
|
+
remote_dir = RUBY_FORGE_PATH + "/specdoc"
|
54
|
+
local_dir = "specdoc"
|
55
|
+
Rake::SshDirPublisher.new(host, remote_dir, local_dir).upload
|
56
|
+
end
|
57
|
+
|
58
|
+
namespace :rcov do
|
59
|
+
desc "Publish coverage report to RubyForge"
|
60
|
+
task :release => ["spec:rcov"] do
|
61
|
+
require "rake/contrib/sshpublisher"
|
62
|
+
require "yaml"
|
63
|
+
|
64
|
+
config = YAML.load(
|
65
|
+
File.read(File.expand_path('~/.rubyforge/user-config.yml'))
|
66
|
+
)
|
67
|
+
host = "#{config['username']}@rubyforge.org"
|
68
|
+
remote_dir = RUBY_FORGE_PATH + "/coverage"
|
69
|
+
local_dir = "coverage"
|
70
|
+
Rake::SshDirPublisher.new(host, remote_dir, local_dir).upload
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
namespace :website do
|
76
|
+
desc "Publish website to RubyForge"
|
77
|
+
task :release => ["doc:release", "spec:release", "spec:rcov:release"] do
|
78
|
+
require "rake/contrib/sshpublisher"
|
79
|
+
require "yaml"
|
80
|
+
|
81
|
+
config = YAML.load(
|
82
|
+
File.read(File.expand_path('~/.rubyforge/user-config.yml'))
|
83
|
+
)
|
84
|
+
host = "#{config['username']}@rubyforge.org"
|
85
|
+
remote_dir = RUBY_FORGE_PATH
|
86
|
+
local_dir = "website"
|
87
|
+
Rake::SshDirPublisher.new(host, remote_dir, local_dir).upload
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
namespace :spec do
|
2
|
+
Spec::Rake::SpecTask.new(:rcov) do |t|
|
3
|
+
t.libs = %w[lib spec]
|
4
|
+
t.spec_files = FileList['spec/**/*_spec.rb']
|
5
|
+
t.spec_opts = ['--color', '--format', 'specdoc']
|
6
|
+
|
7
|
+
t.rcov = RCOV_ENABLED
|
8
|
+
t.rcov_opts = [
|
9
|
+
'--exclude', 'spec',
|
10
|
+
'--exclude', '1\\.8\\/gems',
|
11
|
+
'--exclude', '1\\.9\\/gems',
|
12
|
+
'--exclude', 'addressable\\/idna\\.rb', # unicode tables too big
|
13
|
+
]
|
14
|
+
end
|
15
|
+
|
16
|
+
Spec::Rake::SpecTask.new(:normal) do |t|
|
17
|
+
t.libs = %w[lib spec]
|
18
|
+
t.spec_files = FileList['spec/**/*_spec.rb']
|
19
|
+
t.spec_opts = ['--color', '--format', 'specdoc']
|
20
|
+
t.rcov = false
|
21
|
+
end
|
22
|
+
|
23
|
+
desc "Generate HTML Specdocs for all specs"
|
24
|
+
Spec::Rake::SpecTask.new(:specdoc) do |t|
|
25
|
+
specdoc_path = File.expand_path(File.join(File.dirname(__FILE__), '..', 'specdoc'))
|
26
|
+
Dir.mkdir(specdoc_path) if !File.exist?(specdoc_path)
|
27
|
+
|
28
|
+
output_file = File.join(specdoc_path, 'index.html')
|
29
|
+
t.libs = %w[lib spec]
|
30
|
+
t.spec_files = FileList['spec/**/*_spec.rb']
|
31
|
+
t.spec_opts = ["--format", "\"html:#{output_file}\"", "--diff"]
|
32
|
+
t.fail_on_error = false
|
33
|
+
end
|
34
|
+
|
35
|
+
namespace :rcov do
|
36
|
+
desc "Browse the code coverage report."
|
37
|
+
task :browse => "spec:rcov" do
|
38
|
+
require "launchy"
|
39
|
+
Launchy::Browser.run("coverage/index.html")
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
desc "Alias to spec:normal"
|
45
|
+
task "spec" => "spec:normal"
|
46
|
+
|
47
|
+
task "clobber" => ["spec:clobber_rcov"]
|
@@ -0,0 +1,110 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8"/>
|
5
|
+
<title>Addressable</title>
|
6
|
+
<style type="text/css">
|
7
|
+
* {
|
8
|
+
font-size: 100%;
|
9
|
+
margin: 0;
|
10
|
+
padding: 0;
|
11
|
+
}
|
12
|
+
|
13
|
+
body {
|
14
|
+
font-family: lucida grande, verdana, sans-serif;
|
15
|
+
margin: 1em;
|
16
|
+
}
|
17
|
+
|
18
|
+
a {
|
19
|
+
color: #880000;
|
20
|
+
}
|
21
|
+
|
22
|
+
a:visited {
|
23
|
+
color: #333333;
|
24
|
+
}
|
25
|
+
|
26
|
+
h1 {
|
27
|
+
font-size: 2em;
|
28
|
+
margin: 0 0 0.8em 0;
|
29
|
+
text-align: center;
|
30
|
+
}
|
31
|
+
|
32
|
+
h2 {
|
33
|
+
font-size: 1em;
|
34
|
+
margin: 0.8em 0;
|
35
|
+
}
|
36
|
+
|
37
|
+
p {
|
38
|
+
margin: 0.8em 0;
|
39
|
+
}
|
40
|
+
|
41
|
+
ul {
|
42
|
+
font-size: 0.9em;
|
43
|
+
margin: 0 0 0 1.5em;
|
44
|
+
}
|
45
|
+
|
46
|
+
div {
|
47
|
+
width: 50%;
|
48
|
+
margin: 0 auto;
|
49
|
+
padding: 0.8em;
|
50
|
+
background-color: #AA5852;
|
51
|
+
border: 2px solid #C2645D;
|
52
|
+
}
|
53
|
+
|
54
|
+
@media print {
|
55
|
+
body {
|
56
|
+
font-size: 0.9em;
|
57
|
+
}
|
58
|
+
|
59
|
+
a {
|
60
|
+
text-decoration: none;
|
61
|
+
color: #000;
|
62
|
+
}
|
63
|
+
}
|
64
|
+
</style>
|
65
|
+
</head>
|
66
|
+
<body>
|
67
|
+
<h1>Addressable</h1>
|
68
|
+
<div>
|
69
|
+
<p>
|
70
|
+
Addressable is a replacement for the URI implementation that is part
|
71
|
+
of Ruby's standard library. It more closely conforms to the relevant
|
72
|
+
RFCs and adds support for IRIs and URI templates.
|
73
|
+
</p>
|
74
|
+
<ul>
|
75
|
+
<li>
|
76
|
+
<a href="http://rubyforge.org/projects/addressable/">
|
77
|
+
Project Page
|
78
|
+
</a>
|
79
|
+
</li>
|
80
|
+
<li>
|
81
|
+
<a href="http://github.com/sporkmonger/addressable/tree/">
|
82
|
+
GitHub Page
|
83
|
+
</a>
|
84
|
+
</li>
|
85
|
+
<li><a href="/api/">API</a></li>
|
86
|
+
<li><a href="/specdoc/">Specifications</a></li>
|
87
|
+
<li><a href="/coverage/">Code Coverage</a></li>
|
88
|
+
</ul>
|
89
|
+
<p>
|
90
|
+
You know what to do:
|
91
|
+
</p>
|
92
|
+
<p>
|
93
|
+
<code>sudo gem install addressable</code>
|
94
|
+
</p>
|
95
|
+
<p>
|
96
|
+
Alternatively, you can:
|
97
|
+
</p>
|
98
|
+
<p>
|
99
|
+
<code>
|
100
|
+
git submodule add
|
101
|
+
git://github.com/sporkmonger/addressable.git
|
102
|
+
vendor/gems/addressable
|
103
|
+
</code>
|
104
|
+
</p>
|
105
|
+
<p>
|
106
|
+
Addressable works in Ruby 1.8.x, 1.9.x, and JRuby.
|
107
|
+
</p>
|
108
|
+
</div>
|
109
|
+
</body>
|
110
|
+
</html>
|
@@ -0,0 +1,76 @@
|
|
1
|
+
=begin
|
2
|
+
ShoutBot
|
3
|
+
Ridiculously simple library to quickly say something on IRC
|
4
|
+
<http://github.com/sr/shout-bot>
|
5
|
+
|
6
|
+
EXAMPLE
|
7
|
+
|
8
|
+
ShoutBot.shout('irc://shoutbot:password@irc.freenode.net:6667/#github') do |channel|
|
9
|
+
channel.say "check me out! http://github.com/sr/shout-bot"
|
10
|
+
end
|
11
|
+
|
12
|
+
LICENSE
|
13
|
+
|
14
|
+
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
15
|
+
Version 2, December 2004
|
16
|
+
|
17
|
+
Copyright (C) 2008, 2009 Simon Rozet <http://purl.org/net/sr/>
|
18
|
+
Copyright (C) 2008, 2009 Harry Vangberg <http://trueaffection.net>
|
19
|
+
|
20
|
+
Everyone is permitted to copy and distribute verbatim or modified
|
21
|
+
copies of this license document, and changing it is allowed as long
|
22
|
+
as the name is changed.
|
23
|
+
|
24
|
+
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
25
|
+
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
26
|
+
|
27
|
+
0. You just DO WHAT THE FUCK YOU WANT TO.
|
28
|
+
=end
|
29
|
+
|
30
|
+
require "addressable/uri"
|
31
|
+
require "socket"
|
32
|
+
|
33
|
+
class ShoutBot
|
34
|
+
def self.shout(uri, &block)
|
35
|
+
raise ArgumentError unless block_given?
|
36
|
+
|
37
|
+
uri = Addressable::URI.parse(uri)
|
38
|
+
irc = new(uri.host, uri.port, uri.user, uri.password) do |irc|
|
39
|
+
if channel = uri.fragment
|
40
|
+
irc.join(channel, &block)
|
41
|
+
else
|
42
|
+
irc.channel = uri.path[1..-1]
|
43
|
+
yield irc
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
attr_accessor :channel
|
49
|
+
|
50
|
+
def initialize(server, port, nick, password=nil)
|
51
|
+
raise ArgumentError unless block_given?
|
52
|
+
|
53
|
+
@socket = TCPSocket.open(server, port || 6667)
|
54
|
+
@socket.puts "PASSWORD #{password}" if password
|
55
|
+
@socket.puts "NICK #{nick}"
|
56
|
+
@socket.puts "USER #{nick} #{nick} #{nick} :#{nick}"
|
57
|
+
sleep 1
|
58
|
+
yield self
|
59
|
+
@socket.puts "QUIT"
|
60
|
+
@socket.gets until @socket.eof?
|
61
|
+
end
|
62
|
+
|
63
|
+
def join(channel)
|
64
|
+
raise ArgumentError unless block_given?
|
65
|
+
|
66
|
+
@channel = "##{channel}"
|
67
|
+
@socket.puts "JOIN #{@channel}"
|
68
|
+
yield self
|
69
|
+
@socket.puts "PART #{@channel}"
|
70
|
+
end
|
71
|
+
|
72
|
+
def say(message)
|
73
|
+
return unless @channel
|
74
|
+
@socket.puts "PRIVMSG #{@channel} :#{message}"
|
75
|
+
end
|
76
|
+
end
|