blur 1.5.1 → 1.5.2

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/library/blur.rb CHANGED
@@ -1,13 +1,15 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  require 'yaml'
4
+ require 'majic'
4
5
  require 'socket'
5
6
  require 'ostruct'
7
+ require 'openssl'
6
8
 
7
9
  Dir.glob("#{File.dirname __FILE__}/blur/**/*.rb").each &method(:require)
8
10
 
9
11
  module Blur
10
- class << Version = [1,5,1]
12
+ class << Version = [1,5,2]
11
13
  def to_s; join '.' end
12
14
  end
13
15
 
@@ -15,9 +15,7 @@ module Blur
15
15
  @callbacks = {}
16
16
  @connected = true
17
17
 
18
- @options[:networks].each do |options|
19
- @networks.<< Network.new options
20
- end
18
+ @networks = @options[:networks].map { |options| Network.new options }
21
19
 
22
20
  load_scripts
23
21
  trap 2, &method(:quit)
@@ -35,7 +33,7 @@ module Blur
35
33
  end
36
34
 
37
35
  def got_command network, command
38
- puts "<- \e[1m#{network}\e[0m | #{command}"
36
+ puts "<- #{network.inspect ^ :bold} | #{command}"
39
37
  name = :"got_#{command.name.downcase}"
40
38
 
41
39
  if respond_to? name
@@ -68,6 +66,7 @@ module Blur
68
66
  end
69
67
 
70
68
  @connected = false
69
+ unload_scripts
71
70
 
72
71
  exit 0
73
72
  end
@@ -78,15 +77,17 @@ module Blur
78
77
  puts "Starting run loop ..."
79
78
 
80
79
  while @connected
81
- @networks.each do |network|
80
+ @networks.select(&:connected?).each do |network|
82
81
  begin
83
82
  network.transcieve
84
83
  sleep 0.05
85
84
  rescue StandardError => exception
86
- puts "\e[1m\e[31merror:\e[39m #{exception.message}\e[0m"
87
-
88
- network.disconnect if network.connected?
89
- @networks.delete network
85
+ if network.connected?
86
+ network.disconnect
87
+ emit :connection_terminated, network
88
+ end
89
+
90
+ puts "#{"Network error" ^ :red} (#{exception.class.name}): #{exception.message}"
90
91
  end
91
92
  end
92
93
  end
@@ -103,7 +104,7 @@ module Blur
103
104
  begin
104
105
  script.__send__ name, *args if script.respond_to? name
105
106
  rescue Exception => exception
106
- puts "\e[1m#{File.basename script.path}:#{exception.line}: \e[31merror:\e[39m #{exception.message}\e[0m"
107
+ puts ("#{File.basename script.path}:#{exception.line}" ^ :bold) + ": #{"error:" ^ :red} #{exception.message}"
107
108
  end
108
109
  end
109
110
  end
@@ -22,7 +22,7 @@ module Blur
22
22
 
23
23
  if channel = network.channel_by_name(name)
24
24
  users.each do |user|
25
- user.channel = channel
25
+ user.channel = channel
26
26
  channel.users << user
27
27
  end
28
28
  else
@@ -88,6 +88,7 @@ module Blur
88
88
  if channel = network.channel_by_name(name)
89
89
  user.name = command.sender.username
90
90
  user.host = command.sender.hostname
91
+ user.channel = channel
91
92
 
92
93
  channel.users << user
93
94
 
@@ -3,15 +3,18 @@
3
3
  module Blur
4
4
  class Network
5
5
  class ConnectionError < StandardError; end
6
+
6
7
  attr_accessor :options, :channels, :delegate, :connection
7
8
 
8
9
  def connected?; @connection.established? end
9
10
 
11
+ def ssl?; @options[:secure] == true end
10
12
  def host; @options[:hostname] end
11
- def port; @options[:port] ||= (@options[:secure] == true) ? 6697 : 6667 end
13
+ def port; @options[:port] ||= ssl? ? 6697 : 6667 end
12
14
 
13
15
  def initialize options = {}
14
- @options = options
16
+ @options = options
17
+ @channels = []
15
18
 
16
19
  unless options[:nickname]
17
20
  raise ArgumentError, "nickname is missing from the network's option block"
@@ -21,7 +24,6 @@ module Blur
21
24
  @options[:realname] ||= @options[:username]
22
25
  @options[:channels] ||= []
23
26
 
24
- @channels = []
25
27
  @connection = Connection.new self, host, port
26
28
  end
27
29
 
@@ -43,6 +45,7 @@ module Blur
43
45
 
44
46
  def connect
45
47
  @connection.establish
48
+ @connection.enable_ssl OpenSSL::SSL::VERIFY_NONE if ssl?
46
49
 
47
50
  transmit :PASS, @options[:password] if @options[:password]
48
51
  transmit :NICK, @options[:nickname]
@@ -55,7 +58,7 @@ module Blur
55
58
 
56
59
  def transmit name, *arguments
57
60
  command = Command.new name, arguments
58
- puts "-> \e[1m#{self}\e[0m | #{command}"
61
+ puts "-> #{inspect ^ :bold} | #{command}"
59
62
 
60
63
  @connection.transmit command
61
64
  end
@@ -65,7 +68,7 @@ module Blur
65
68
  end
66
69
 
67
70
  def to_s
68
- %{#<#{self.class.name} "#{host}:#{port}">}
71
+ %{#<#{self.class.name} "#{host}":#{port}>}
69
72
  end
70
73
  end
71
74
  end
@@ -40,6 +40,10 @@ module Blur
40
40
  def inspect
41
41
  %{#<#{self.class.name} @name=#{@name.inspect} @users=#{@users.inspect}}
42
42
  end
43
+
44
+ def to_yaml options = {}
45
+ @name.to_yaml options
46
+ end
43
47
 
44
48
  def to_s
45
49
  @name
@@ -3,7 +3,7 @@
3
3
  module Blur
4
4
  class Network
5
5
  class Connection
6
- def established?; @socket and not (@socket.closed? or @socket.eof?) end
6
+ def established?; @socket and not @socket.closed? end
7
7
 
8
8
  def initialize delegate, host = nil, port = nil
9
9
  @host = host
@@ -17,11 +17,21 @@ module Blur
17
17
  def establish
18
18
  @socket = TCPSocket.new @host, @port
19
19
  end
20
+
21
+ def enable_ssl validator
22
+ @secure = true
23
+
24
+ context = OpenSSL::SSL::SSLContext.new
25
+ context.set_params verify_mode: validator
26
+
27
+ sslsocket = OpenSSL::SSL::SSLSocket.new @socket, context
28
+ sslsocket.sync = true
29
+ sslsocket.connect_nonblock
30
+ end
20
31
 
21
32
  def terminate
22
- @socket.close
23
- @socket = nil
24
- @buffer = ""
33
+ @socket = nil if @socket.close
34
+ @buffer.clear
25
35
  @queue.clear
26
36
  end
27
37
 
@@ -31,7 +41,7 @@ module Blur
31
41
 
32
42
  def transcieve
33
43
  readable, writable = IO.select [@socket], [@socket]
34
-
44
+
35
45
  # If the socket is ready to recieve, do so.
36
46
  if socket = readable.first
37
47
  @buffer.<< socket.read_nonblock 512
@@ -44,7 +54,18 @@ module Blur
44
54
 
45
55
  # If it's ready to write, do that too until the outoing queue is empty.
46
56
  if socket = writable.first
47
- socket.write_nonblock "#{command}\n" while command = @queue.shift
57
+ while command = @queue.shift
58
+ socket.write_nonblock "#{command}\n"
59
+ end
60
+ end
61
+
62
+ rescue Errno::EAGAIN, Errno::EWOULDBLOCK
63
+ puts "Insecure connection would block"
64
+ rescue OpenSSL::SSL::SSLError
65
+ if $!.message == "read would block"
66
+ puts "Secure connection would block"
67
+ else
68
+ raise $!
48
69
  end
49
70
  end
50
71
  end
@@ -47,6 +47,10 @@ module Blur
47
47
  def inspect
48
48
  %{#<#{self.class.name} @nick=#{@nick.inspect} @channel=#{@channel.name.inspect}>}
49
49
  end
50
+
51
+ def to_yaml options = {}
52
+ @nick.to_yaml options
53
+ end
50
54
 
51
55
  def to_s
52
56
  @nick
@@ -28,9 +28,10 @@ module Blur
28
28
  end
29
29
 
30
30
  def unload!
31
- @cache.save if @cache
32
-
31
+ cache.save if @cache
33
32
  __send__ :unloaded if respond_to? :unloaded
33
+
34
+ @cache = nil
34
35
  end
35
36
 
36
37
  def script name
@@ -51,7 +52,7 @@ module Blur
51
52
  module_eval File.read(@path), File.basename(@path), 0
52
53
  @evaluated = true
53
54
  rescue Exception => exception
54
- puts "\e[1m#{File.basename @path}:#{exception.line}: \e[31merror:\e[39m #{exception.message}\e[0m"
55
+ puts "#{File.basename(@path) ^ :bold}:#{exception.line.to_s ^ :bold}: #{"error:" ^ :red} #{exception.message ^ :bold}"
55
56
  end
56
57
  end
57
58
  end
@@ -12,7 +12,7 @@ module Blur
12
12
  File.exists? "#{path}/#{name}.yml"
13
13
  end
14
14
 
15
- def [] key; @hash[key] ||= {} end
15
+ def [] key; @hash[key] end
16
16
  def []= key, value; @hash[key] = value end
17
17
 
18
18
  def initialize script
@@ -49,4 +49,4 @@ module Blur
49
49
  end
50
50
  end
51
51
  end
52
- end
52
+ end
metadata CHANGED
@@ -1,12 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: blur
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 1
7
- - 5
8
- - 1
9
- version: 1.5.1
4
+ prerelease:
5
+ version: 1.5.2
10
6
  platform: ruby
11
7
  authors:
12
8
  - Mikkel Kroman
@@ -14,7 +10,7 @@ autorequire:
14
10
  bindir: executables
15
11
  cert_chain: []
16
12
 
17
- date: 2011-01-21 00:00:00 +01:00
13
+ date: 2011-02-05 00:00:00 +01:00
18
14
  default_executable:
19
15
  dependencies: []
20
16
 
@@ -30,7 +26,6 @@ files:
30
26
  - library/blur.rb
31
27
  - library/blur/client.rb
32
28
  - library/blur/enhancements.rb
33
- - library/blur/handling.rb
34
29
  - library/blur/network.rb
35
30
  - library/blur/network/channel.rb
36
31
  - library/blur/network/command.rb
@@ -39,6 +34,7 @@ files:
39
34
  - library/blur/script.rb
40
35
  - library/blur/script/cache.rb
41
36
  - library/blur/script/messageparsing.rb
37
+ - library/blur/handling.rb
42
38
  has_rdoc: true
43
39
  homepage:
44
40
  licenses: []
@@ -53,23 +49,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
53
49
  requirements:
54
50
  - - ">="
55
51
  - !ruby/object:Gem::Version
56
- segments:
57
- - 1
58
- - 9
59
- - 1
60
52
  version: 1.9.1
61
53
  required_rubygems_version: !ruby/object:Gem::Requirement
62
54
  none: false
63
55
  requirements:
64
56
  - - ">="
65
57
  - !ruby/object:Gem::Version
66
- segments:
67
- - 0
68
58
  version: "0"
69
59
  requirements: []
70
60
 
71
61
  rubyforge_project:
72
- rubygems_version: 1.3.7
62
+ rubygems_version: 1.5.0
73
63
  signing_key:
74
64
  specification_version: 3
75
65
  summary: Extensible IRC library