aboutsummaryrefslogtreecommitdiff
path: root/dinobot.rb
diff options
context:
space:
mode:
authorDavid Vazgenovich Shakaryan <dvshakaryan@gmail.com>2014-04-19 20:22:05 -0700
committerDavid Vazgenovich Shakaryan <dvshakaryan@gmail.com>2014-04-19 20:22:05 -0700
commited09327eac899b9d5a1f782616747ca13c4806b1 (patch)
tree68be5f276ef3789d8db5f7253c1060a2d0e712ac /dinobot.rb
parent6d4f0b1a3c82a983edd7ccba6dee5a7c79a8c941 (diff)
downloaddinobot-ed09327eac899b9d5a1f782616747ca13c4806b1.tar.gz
dinobot-ed09327eac899b9d5a1f782616747ca13c4806b1.tar.xz
Move protocol functionality to separate file.
Diffstat (limited to 'dinobot.rb')
-rw-r--r--dinobot.rb76
1 files changed, 30 insertions, 46 deletions
diff --git a/dinobot.rb b/dinobot.rb
index ce08b7c..ffb38f3 100644
--- a/dinobot.rb
+++ b/dinobot.rb
@@ -1,6 +1,7 @@
-require 'socket'
require 'timeout'
+require_relative 'irc'
+
module Dinobot
class Bot
attr_accessor :trigger
@@ -14,73 +15,42 @@ module Dinobot
@trigger = '!'
- @socket = nil
+ @irc = Dinobot::IRC.new(@server, @port, @nick, @pass)
@modules = Hash.new
@channels = Array.new
instance_eval(&block) if block_given?
end
- def connect
- log :info, "Connecting to #{@server}:#{@port}."
- @socket = TCPSocket.new(@server, @port)
-
- out "PASS #{@pass}" if @pass
- out "NICK #{@nick}"
- out "USER #{@nick} 0 * :#{@nick}"
+ def run
+ @irc.connect unless @irc.connected?
@channels.each do |channel|
- join channel
+ @irc.join channel
end
- end
- def connected?
- !(@socket.nil? || @socket.closed?)
- end
-
- def run
- connect unless connected?
-
- while str = @socket.gets.chomp
- log :in, str.inspect
-
- Thread.new do
- begin
- Timeout.timeout(30) do
- parse_line(str)
- end
- rescue => e
- log :error, "Error parsing line. (#{e})"
- log :indent, *e.backtrace
- end
- end
+ while str = @irc.gets
+ parse_in_new_thread(str)
end
- @socket.close
+ @irc.disconnect
log :info, 'Disconnected.'
end
- def out(str)
- return unless connected?
-
- log :out, str.inspect
- @socket.puts str
- end
-
def say(channel, message)
- out "PRIVMSG #{channel} :#{message}"
+ @irc.privmsg(channel, message)
end
def join(channel)
@channels << channel unless @channels.include?(channel)
- out "JOIN #{channel}"
+ @irc.join(channel) if @irc.connected?
end
def part(channel)
@channels.delete(channel)
- out "PART #{channel}"
+ @irc.part(channel)
end
def load_module(mod)
@@ -139,17 +109,31 @@ module Dinobot
private
+ def parse_in_new_thread(str)
+ Thread.new do
+ begin
+ Timeout.timeout(30) do
+ parse_line(str.chomp)
+ end
+ rescue => e
+ log :error, "Error parsing line. (#{e})"
+ log :indent, *e.backtrace
+ end
+ end
+ end
+
def parse_line(str)
- out str.sub('PING', 'PONG') if str =~ /^PING /
+ @irc.pong str.sub(/\APING /, 'PONG') if str =~ /\APING /
if str =~ /(\S+) PRIVMSG (\S+) :(.*)/
user, channel, message = str.scan(/(\S+) PRIVMSG (\S+) :(.*)/).first
return unless message.sub!(/^#{Regexp.escape(@trigger)}/, '')
- methods = exec_command(user, channel, message)
- ensure_valid_methods(methods)
- run_methods(methods)
+ if methods = exec_command(user, channel, message)
+ ensure_valid_methods(methods)
+ run_methods(methods)
+ end
end
end