dragoon 0.0.7 → 0.0.8
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/README.md +2 -1
- data/TODO +1 -1
- data/dragoon.gemspec +2 -0
- data/lib/dragoon.rb +78 -70
- data/lib/dragoon/event.rb +3 -3
- data/lib/dragoon/event_manager.rb +2 -2
- data/lib/dragoon/network.rb +14 -0
- data/lib/dragoon/version.rb +1 -1
- data/sample_config +32 -0
- data/spec/dragoon_spec.rb +72 -0
- data/spec/event_manager_spec.rb +10 -17
- data/spec/event_spec.rb +8 -4
- data/spec/spec_helper.rb +33 -0
- metadata +39 -8
- data/lib/dragoon/commands.rb +0 -35
data/README.md
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
Dragoon
|
2
2
|
============
|
3
3
|
|
4
|
-
An IRC bot that alerts you whenever certain keywords pop up in your favorite channels.
|
4
|
+
An IRC bot that alerts you whenever certain keywords pop up in your favorite channels. Notifications are displayed via growl if supported or text highlights on the terminal.
|
5
5
|
|
6
|
+
Listening to multiple network connections is supported via IO.select()
|
6
7
|
|
7
8
|
Dependencies
|
8
9
|
-----------
|
data/TODO
CHANGED
data/dragoon.gemspec
CHANGED
data/lib/dragoon.rb
CHANGED
@@ -4,25 +4,26 @@ require 'forwardable'
|
|
4
4
|
|
5
5
|
require 'term/ansicolor'
|
6
6
|
require 'json'
|
7
|
+
require 'active_support/core_ext/hash/indifferent_access'
|
7
8
|
|
8
|
-
require 'dragoon/commands'
|
9
9
|
require 'dragoon/event'
|
10
|
+
require 'dragoon/network'
|
10
11
|
require 'dragoon/event_manager'
|
11
12
|
require 'dragoon/color'
|
12
13
|
require 'dragoon/core_ext'
|
13
14
|
|
15
|
+
$verbose = true
|
14
16
|
|
15
17
|
module Dragoon
|
16
18
|
class Bot
|
17
19
|
extend Forwardable
|
18
|
-
|
19
|
-
include Commands
|
20
20
|
include Color
|
21
21
|
|
22
|
-
attr_accessor :nickname, :
|
22
|
+
attr_accessor :nickname, :networks, :keywords
|
23
23
|
|
24
24
|
def_delegators :@event_manager, :on, :dispatch
|
25
25
|
|
26
|
+
SAMPLE_CONFIG = File.expand_path("#{File.dirname(__FILE__)}/../sample_config")
|
26
27
|
CONFIG_FILE = File.expand_path("~/.dragoon")
|
27
28
|
|
28
29
|
def initialize
|
@@ -34,41 +35,18 @@ module Dragoon
|
|
34
35
|
def load_config
|
35
36
|
begin
|
36
37
|
if File.exist?(CONFIG_FILE)
|
37
|
-
|
38
|
-
config = JSON.parse(File.read(CONFIG_FILE))
|
39
|
-
@
|
40
|
-
@
|
41
|
-
@
|
42
|
-
@
|
43
|
-
@
|
44
|
-
@keywords = config[
|
38
|
+
log("*** Loading config file #{CONFIG_FILE}")
|
39
|
+
config = HashWithIndifferentAccess.new JSON.parse(File.read(CONFIG_FILE))
|
40
|
+
@nickname = config[:nickname]
|
41
|
+
@password = config[:password]
|
42
|
+
@hostname = config[:hostname]
|
43
|
+
@servername = config[:servername]
|
44
|
+
@networks = config[:networks].map { |n| Network.new(n) }
|
45
|
+
@keywords = config[:keywords]
|
45
46
|
else
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
"network": "chat.freenode.net",
|
50
|
-
"port": "6667",
|
51
|
-
"nickname": "fenix#{rand(10)}#{rand(10)}#{rand(10)}",
|
52
|
-
"password": "",
|
53
|
-
"channels": [
|
54
|
-
"#ubuntu",
|
55
|
-
"#ruby",
|
56
|
-
"#rubyonrails",
|
57
|
-
"#linux",
|
58
|
-
"#programming",
|
59
|
-
"#javascript"
|
60
|
-
],
|
61
|
-
"keywords": [
|
62
|
-
"and",
|
63
|
-
"how",
|
64
|
-
"who"
|
65
|
-
]
|
66
|
-
}
|
67
|
-
EOF
|
68
|
-
|
69
|
-
File.open(CONFIG_FILE,'w+') {|f| f.write(config) }
|
70
|
-
puts("Config file does not exist...created a default one at #{CONFIG_FILE}".red)
|
71
|
-
puts("Please modify it according to your preference".red)
|
47
|
+
File.open(CONFIG_FILE,'w+') {|f| f.write(File.read(SAMPLE_CONFIG)) }
|
48
|
+
log("Config file does not exist...created a default one at #{CONFIG_FILE}".red)
|
49
|
+
log("Please modify it according to your preference".red)
|
72
50
|
exit 1
|
73
51
|
end
|
74
52
|
rescue => e
|
@@ -78,40 +56,49 @@ module Dragoon
|
|
78
56
|
end
|
79
57
|
|
80
58
|
def init_callbacks
|
81
|
-
on :startup do |msg|
|
82
|
-
|
59
|
+
on :startup do |msg, source|
|
60
|
+
log msg.text
|
83
61
|
if msg.text =~ /.*Found your hostname.*/
|
84
62
|
# login
|
85
|
-
|
86
|
-
|
87
|
-
|
63
|
+
source.socket.write "PASS #{@password}\r\n" if !@password.empty?
|
64
|
+
source.socket.write "USER #{@nickname} #{@hostname} #{@servername} #{@nickname}\r\n"
|
65
|
+
source.socket.write "NICK #{@nickname}\r\n"
|
88
66
|
end
|
89
67
|
end
|
90
68
|
|
91
|
-
on :ping do |msg|
|
92
|
-
|
69
|
+
on :ping do |msg, source|
|
70
|
+
source.socket.write "PONG #{msg.server}\r\n" # keep alive
|
93
71
|
end
|
94
72
|
|
95
|
-
on :
|
96
|
-
|
97
|
-
|
73
|
+
on :welcome do |msg, source|
|
74
|
+
log "*** Logged in on #{source.name} as #{msg.nickname}"
|
75
|
+
|
76
|
+
source.channels.each do |channel|
|
77
|
+
source.socket.write "JOIN #{channel}\r\n"
|
78
|
+
end
|
98
79
|
end
|
99
80
|
|
100
|
-
on :join do |msg|
|
101
|
-
|
81
|
+
on :join do |msg, source|
|
82
|
+
log "*** Listening on channel #{colorize(msg.channel)}" if @nickname == msg.nickname
|
102
83
|
end
|
103
84
|
|
104
|
-
on :err do |msg|
|
105
|
-
|
85
|
+
on :err do |msg, source|
|
86
|
+
unless ['470', '422'].include?(msg.error_code) # ignore channel forwarding + motd file missing
|
87
|
+
$stderr.puts msg.text.red
|
88
|
+
end
|
89
|
+
|
106
90
|
if msg.error_code == '433' # nick already in use
|
107
91
|
print("Enter another nickname: ")
|
108
92
|
@nickname = gets.chomp
|
109
|
-
|
110
|
-
|
93
|
+
print("Enter password (optional): ")
|
94
|
+
@password = gets.chomp
|
95
|
+
source.socket.write "PASS #{@password}\r\n" if !@password.empty?
|
96
|
+
source.socket.write "USER #{@nickname} #{@hostname} #{@servername} #{@nickname}\r\n"
|
97
|
+
source.socket.write "NICK #{@nickname}\r\n"
|
111
98
|
end
|
112
99
|
end
|
113
100
|
|
114
|
-
on :privmsg do |msg|
|
101
|
+
on :privmsg do |msg, source|
|
115
102
|
if growlnotify_supported?
|
116
103
|
if keyword = @keywords.detect { |keyword| msg.text.include?(keyword) }
|
117
104
|
system("growlnotify " +
|
@@ -119,42 +106,63 @@ module Dragoon
|
|
119
106
|
"-m \"#{msg.privmsg.escape_double_quotes}\"")
|
120
107
|
end
|
121
108
|
end
|
122
|
-
|
109
|
+
log "#{colorize(msg.channel)} <#{msg.nickname}> #{highlight_keywords(msg.privmsg,@keywords)}"
|
123
110
|
end
|
124
111
|
end
|
125
112
|
|
126
113
|
def run
|
127
|
-
|
114
|
+
log "*** Press Ctrl + c to stop the program"
|
115
|
+
sockets = []
|
116
|
+
@networks.each do |network|
|
117
|
+
socket = connect(network)
|
118
|
+
network.server = socket.peeraddr[2]
|
119
|
+
network.socket = socket
|
120
|
+
sockets << socket
|
121
|
+
end
|
128
122
|
|
129
123
|
begin
|
130
|
-
while
|
131
|
-
@event = Event.parse(line)
|
132
|
-
dispatch(@event)
|
133
|
-
end
|
124
|
+
while true; listen(sockets); end
|
134
125
|
rescue Interrupt
|
135
126
|
stop
|
136
127
|
end
|
128
|
+
end
|
137
129
|
|
130
|
+
# should pass an array of sockets
|
131
|
+
def listen(sockets)
|
132
|
+
read_fds, write_fds, error_fds = IO.select(sockets, nil, nil, nil)
|
133
|
+
read_fds.each do |socket|
|
134
|
+
line = socket.gets
|
135
|
+
@event = Event.parse(line)
|
136
|
+
dispatch(@event,
|
137
|
+
@networks.select{ |n|
|
138
|
+
n.server == socket.peeraddr[2] &&
|
139
|
+
n.port = socket.peeraddr[1]
|
140
|
+
}.first
|
141
|
+
)
|
142
|
+
end
|
138
143
|
end
|
139
144
|
|
140
|
-
def connect
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
exit
|
145
|
+
def connect(network)
|
146
|
+
log "*** Connecting to #{network.name} on port #{network.port}"
|
147
|
+
TCPSocket.new(network.name, network.port)
|
148
|
+
rescue => e
|
149
|
+
log "#{e.class} Cannot connect to #{network.name} at port #{network.port}".red
|
150
|
+
raise
|
147
151
|
end
|
148
152
|
|
149
153
|
def stop
|
150
154
|
puts
|
151
|
-
|
152
|
-
@socket.close
|
155
|
+
log "*** Program stopped"
|
156
|
+
@networks.each { |network| network.socket.close }
|
153
157
|
exit
|
154
158
|
end
|
155
159
|
|
156
160
|
private
|
157
161
|
|
162
|
+
def log(text)
|
163
|
+
puts text if $verbose
|
164
|
+
end
|
165
|
+
|
158
166
|
def growlnotify_supported?
|
159
167
|
@growlnotify_supported ||= system("which growlnotify > /dev/null")
|
160
168
|
end
|
data/lib/dragoon/event.rb
CHANGED
@@ -13,12 +13,12 @@ module Dragoon
|
|
13
13
|
|
14
14
|
def self.parse(line)
|
15
15
|
case line
|
16
|
-
when /^:\S+ NOTICE
|
16
|
+
when /^:\S+ NOTICE .*:\*{3} .*/
|
17
17
|
self.new(:startup, Message.new(:text => line))
|
18
18
|
when /^PING :(\S+)/
|
19
19
|
self.new(:ping, Message.new(:text => line, :server => $1))
|
20
|
-
when
|
21
|
-
self.new(:
|
20
|
+
when /^:\S+ 001 (\S+) :.*/
|
21
|
+
self.new(:welcome, Message.new(:text => line, :nickname => $1))
|
22
22
|
when /^:(\S+)!(\S+)@(\S+) JOIN (\S+)/
|
23
23
|
self.new(:join, Message.new(:text => line,
|
24
24
|
:nickname => $1,
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Dragoon
|
2
|
+
class Network
|
3
|
+
attr_accessor :name, :port, :server, :socket, :channels
|
4
|
+
|
5
|
+
def initialize(options={})
|
6
|
+
@name = options[:name]
|
7
|
+
@port = options[:port]
|
8
|
+
@server = options[:server]
|
9
|
+
@socket = options[:socket]
|
10
|
+
@channels = options[:channels]
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
data/lib/dragoon/version.rb
CHANGED
data/sample_config
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
{
|
2
|
+
"nickname": "fenix457",
|
3
|
+
"password": "",
|
4
|
+
"hostname": "some_host",
|
5
|
+
"servername": "some_server",
|
6
|
+
"keywords": [
|
7
|
+
"and",
|
8
|
+
"how",
|
9
|
+
"who"
|
10
|
+
],
|
11
|
+
"networks": [
|
12
|
+
{
|
13
|
+
"name": "irc.freenode.net",
|
14
|
+
"port": 6667,
|
15
|
+
"channels": [
|
16
|
+
"#ubuntu",
|
17
|
+
"#ruby",
|
18
|
+
"#rubyonrails",
|
19
|
+
"#linux",
|
20
|
+
"#programming",
|
21
|
+
"#javascript"
|
22
|
+
]
|
23
|
+
},
|
24
|
+
{
|
25
|
+
"name": "irc.quartznet.org",
|
26
|
+
"port": 6667,
|
27
|
+
"channels": [
|
28
|
+
"#PlayGames"
|
29
|
+
]
|
30
|
+
}
|
31
|
+
]
|
32
|
+
}
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Dragoon::Bot do
|
4
|
+
before(:all) do
|
5
|
+
@local_servers = []
|
6
|
+
[7777, 7778].each { |port| @local_servers << LocalServer.new(port).run }
|
7
|
+
end
|
8
|
+
|
9
|
+
after(:all) do
|
10
|
+
@local_servers.each { |server| server.stop}
|
11
|
+
end
|
12
|
+
|
13
|
+
before(:each) do
|
14
|
+
@client = Dragoon::Bot.new
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "#connect" do
|
18
|
+
context "network parameters are wrong" do
|
19
|
+
before(:each) do
|
20
|
+
@network = Dragoon::Network.new(:name => 'localhost', :port => 6665, :channels => %w[ #ruby #java])
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should raise error" do
|
24
|
+
lambda {
|
25
|
+
socket = @client.connect(@network)
|
26
|
+
}.should raise_error
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
context "network parameters are correct" do
|
31
|
+
before(:each) do
|
32
|
+
@network = Dragoon::Network.new(:name => 'localhost', :port => 7777, :channels => %w[ #ruby #java])
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should return the correct TCP Socket" do
|
36
|
+
socket = @client.connect(@network)
|
37
|
+
socket.class.should == TCPSocket
|
38
|
+
socket.peeraddr[1].should == 7777
|
39
|
+
socket.peeraddr[2].should == 'localhost'
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe "#listen" do
|
45
|
+
context "listening to only 1 network" do
|
46
|
+
before(:each) do
|
47
|
+
@network = Dragoon::Network.new(:name => 'localhost', :port => 7777, :channels => %w[ #ruby #java])
|
48
|
+
@socket = @client.connect(@network)
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should receive data from that network" do
|
52
|
+
@socket.should_receive(:gets)
|
53
|
+
@client.listen([@socket])
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context "listening to more than 1 networks" do
|
58
|
+
before(:each) do
|
59
|
+
@networks = []
|
60
|
+
@networks << Dragoon::Network.new(:name => 'localhost', :port => 7777, :channels => %w[ #ruby #java])
|
61
|
+
@networks << Dragoon::Network.new(:name => 'localhost', :port => 7778, :channels => %w[ #ps3 #wii])
|
62
|
+
@sockets = @networks.map { |network| @client.connect(network) }
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should receive data from all networks" do
|
66
|
+
@sockets.each { |socket| socket.should_receive(:gets).at_least(:once) }
|
67
|
+
40.times { @client.listen(@sockets) }
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
data/spec/event_manager_spec.rb
CHANGED
@@ -7,40 +7,33 @@ describe Dragoon::EventManager do
|
|
7
7
|
end
|
8
8
|
|
9
9
|
describe "#dispatch" do
|
10
|
-
context "event is unknown" do
|
11
|
-
it "should not do anything" do
|
12
|
-
pending "help from other people"
|
13
|
-
#@event_manager.dispatch(:unknown, ":adams.freenode.net 372 felix21 :- portrayed in his uniquely British irony. He is sorely missed")
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
context "no handler for an event" do
|
18
|
-
it "should not do anything" do
|
19
|
-
pending "help from other people"
|
20
|
-
#@event_manager.dispatch(:mode, ":felix21 MODE felix21 :+i")
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
10
|
context "callback exists for an event" do
|
25
11
|
before(:each) do
|
26
|
-
@callback = lambda { puts "hello world" }
|
12
|
+
@callback = lambda { |event, source| puts "hello world" }
|
27
13
|
@event = Dragoon::Event.parse(":felix21 MODE felix21 :+i")
|
14
|
+
@network = Dragoon::Network.new
|
28
15
|
@event_manager.on @event.name, &@callback
|
29
16
|
end
|
30
17
|
|
31
18
|
it "should run the corresponding callback" do
|
32
19
|
@callback.should_receive(:call)
|
33
|
-
@event_manager.dispatch(@event)
|
20
|
+
@event_manager.dispatch(@event, @network)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should have message object and network source as parameters to the callback" do
|
24
|
+
@callback.should_receive(:call).with(@event.message, @network)
|
25
|
+
@event_manager.dispatch(@event, @network)
|
34
26
|
end
|
35
27
|
end
|
36
28
|
end
|
37
29
|
|
38
30
|
describe "#on" do
|
39
31
|
it "should register that event" do
|
40
|
-
callback = lambda { puts "this is a callback" }
|
32
|
+
callback = lambda { |event, source| puts "this is a callback" }
|
41
33
|
@event_manager.on(:mode, &callback)
|
42
34
|
@event_manager.handlers[:mode].should == callback
|
43
35
|
end
|
36
|
+
|
44
37
|
end
|
45
38
|
|
46
39
|
end
|
data/spec/event_spec.rb
CHANGED
@@ -5,9 +5,13 @@ describe Dragoon::Event do
|
|
5
5
|
describe "#get_event" do
|
6
6
|
it "should process startup event" do
|
7
7
|
msg = ":zelazny.freenode.net NOTICE * :*** Found your hostname"
|
8
|
+
msg2 = ":luca002.QuartzNet.Org NOTICE AUTH :*** Found your hostname"
|
8
9
|
event = Dragoon::Event.parse(msg)
|
9
10
|
event.name.should == :startup
|
10
11
|
event.message.text.should == msg
|
12
|
+
event = Dragoon::Event.parse(msg2)
|
13
|
+
event.name.should == :startup
|
14
|
+
event.message.text.should == msg2
|
11
15
|
end
|
12
16
|
|
13
17
|
it "should process ping event" do
|
@@ -18,12 +22,12 @@ describe Dragoon::Event do
|
|
18
22
|
event.message.server.should == "zelazny.freenode.net"
|
19
23
|
end
|
20
24
|
|
21
|
-
it "should process
|
22
|
-
msg = ":
|
25
|
+
it "should process welcome event" do
|
26
|
+
msg = ":luca002.QuartzNet.Org 001 fenix456 :Welcome to the QuartzNet IRC Network fenix456!~fenix456@some_host"
|
23
27
|
event = Dragoon::Event.parse(msg)
|
24
|
-
event.name.should == :
|
28
|
+
event.name.should == :welcome
|
25
29
|
event.message.text.should == msg
|
26
|
-
event.message.nickname.should == "
|
30
|
+
event.message.nickname.should == "fenix456"
|
27
31
|
end
|
28
32
|
|
29
33
|
it "should process join event" do
|
data/spec/spec_helper.rb
CHANGED
@@ -1,4 +1,37 @@
|
|
1
1
|
$LOAD_PATH.unshift("#{File.expand_path(File.dirname(__FILE__))}/../lib")
|
2
2
|
|
3
3
|
require 'dragoon'
|
4
|
+
require 'pry'
|
4
5
|
|
6
|
+
$verbose = false
|
7
|
+
|
8
|
+
# A localserver that will run in the background for test suites' bots to establish tcp connection to
|
9
|
+
# It handles multiple connections by further forking child processes as needed
|
10
|
+
# NOTE: Make sure you call #stop for all servers at the end of the test suite
|
11
|
+
|
12
|
+
class LocalServer
|
13
|
+
attr_reader :pid
|
14
|
+
|
15
|
+
def initialize(port)
|
16
|
+
@port = port
|
17
|
+
end
|
18
|
+
|
19
|
+
def run
|
20
|
+
server = TCPServer.new('localhost', @port)
|
21
|
+
server.listen(5)
|
22
|
+
@pid = fork {
|
23
|
+
while socket = server.accept
|
24
|
+
fork {
|
25
|
+
trap("PIPE") { exit }
|
26
|
+
loop { socket.write("localhost port #{socket.addr[1]} dumping text\r\n") }
|
27
|
+
}
|
28
|
+
end
|
29
|
+
}
|
30
|
+
self
|
31
|
+
end
|
32
|
+
|
33
|
+
def stop
|
34
|
+
`kill -9 #{@pid}`
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dragoon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 15
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 8
|
10
|
+
version: 0.0.8
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Reginald Tan
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-02-
|
18
|
+
date: 2012-02-12 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: rspec
|
@@ -32,7 +32,7 @@ dependencies:
|
|
32
32
|
type: :development
|
33
33
|
version_requirements: *id001
|
34
34
|
- !ruby/object:Gem::Dependency
|
35
|
-
name:
|
35
|
+
name: pry
|
36
36
|
prerelease: false
|
37
37
|
requirement: &id002 !ruby/object:Gem::Requirement
|
38
38
|
none: false
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
segments:
|
44
44
|
- 0
|
45
45
|
version: "0"
|
46
|
-
type: :
|
46
|
+
type: :development
|
47
47
|
version_requirements: *id002
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
|
-
name:
|
49
|
+
name: term-ansicolor
|
50
50
|
prerelease: false
|
51
51
|
requirement: &id003 !ruby/object:Gem::Requirement
|
52
52
|
none: false
|
@@ -59,6 +59,34 @@ dependencies:
|
|
59
59
|
version: "0"
|
60
60
|
type: :runtime
|
61
61
|
version_requirements: *id003
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: json
|
64
|
+
prerelease: false
|
65
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
hash: 3
|
71
|
+
segments:
|
72
|
+
- 0
|
73
|
+
version: "0"
|
74
|
+
type: :runtime
|
75
|
+
version_requirements: *id004
|
76
|
+
- !ruby/object:Gem::Dependency
|
77
|
+
name: active_support
|
78
|
+
prerelease: false
|
79
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
80
|
+
none: false
|
81
|
+
requirements:
|
82
|
+
- - ">="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
hash: 3
|
85
|
+
segments:
|
86
|
+
- 0
|
87
|
+
version: "0"
|
88
|
+
type: :runtime
|
89
|
+
version_requirements: *id005
|
62
90
|
description: "An IRC bot that alerts you whenever certain keywords appear in your favorite channels "
|
63
91
|
email:
|
64
92
|
- redge.tan@gmail.com
|
@@ -79,12 +107,14 @@ files:
|
|
79
107
|
- dragoon.gemspec
|
80
108
|
- lib/dragoon.rb
|
81
109
|
- lib/dragoon/color.rb
|
82
|
-
- lib/dragoon/commands.rb
|
83
110
|
- lib/dragoon/core_ext.rb
|
84
111
|
- lib/dragoon/event.rb
|
85
112
|
- lib/dragoon/event_manager.rb
|
113
|
+
- lib/dragoon/network.rb
|
86
114
|
- lib/dragoon/version.rb
|
115
|
+
- sample_config
|
87
116
|
- spec/colors_spec.rb
|
117
|
+
- spec/dragoon_spec.rb
|
88
118
|
- spec/event_manager_spec.rb
|
89
119
|
- spec/event_spec.rb
|
90
120
|
- spec/spec_helper.rb
|
@@ -123,6 +153,7 @@ specification_version: 3
|
|
123
153
|
summary: IRC bot for keyword notification
|
124
154
|
test_files:
|
125
155
|
- spec/colors_spec.rb
|
156
|
+
- spec/dragoon_spec.rb
|
126
157
|
- spec/event_manager_spec.rb
|
127
158
|
- spec/event_spec.rb
|
128
159
|
- spec/spec_helper.rb
|
data/lib/dragoon/commands.rb
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
module Dragoon
|
2
|
-
module Commands
|
3
|
-
|
4
|
-
def nick(nickname)
|
5
|
-
write "NICK #{nickname}"
|
6
|
-
end
|
7
|
-
|
8
|
-
def user(username, hostname, servername, realname)
|
9
|
-
write "USER #{username} #{hostname} #{servername} #{realname}"
|
10
|
-
end
|
11
|
-
|
12
|
-
def pass(password)
|
13
|
-
write "PASS #{password}"
|
14
|
-
end
|
15
|
-
|
16
|
-
def pong(server)
|
17
|
-
write "PONG #{server}"
|
18
|
-
end
|
19
|
-
|
20
|
-
def join(channel)
|
21
|
-
write "JOIN #{channel}"
|
22
|
-
end
|
23
|
-
|
24
|
-
def join_channels
|
25
|
-
@channels.each { |channel| join(channel) }
|
26
|
-
end
|
27
|
-
|
28
|
-
private
|
29
|
-
|
30
|
-
def write(text)
|
31
|
-
@socket.write "#{text}\r\n"
|
32
|
-
end
|
33
|
-
|
34
|
-
end
|
35
|
-
end
|