hector 1.0.2 → 1.0.3

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/bin/hector-daemon CHANGED
@@ -3,12 +3,21 @@
3
3
  require "hector/boot"
4
4
  Hector.start
5
5
 
6
- if fork
7
- exec "tail -n 0 -f #{Hector.root.join("log/hector.log")}"
6
+ def stop
7
+ EventMachine.stop_event_loop
8
+ Hector.logger.info "Hector stopped"
9
+ end
10
+
11
+ %w(INT QUIT TERM).each do |signal|
12
+ Signal.trap(signal) { stop }
13
+ end
14
+
15
+ run_method = if EventMachine.respond_to?(:synchrony)
16
+ :synchrony
8
17
  else
9
- sleep 0.01
10
- EventMachine.run do
11
- Hector.start_server
12
- end
13
- Process.wait
18
+ :run
19
+ end
20
+
21
+ EventMachine.send(run_method) do
22
+ Hector.start_server
14
23
  end
data/bin/hector-identity CHANGED
@@ -17,7 +17,9 @@ command = nil unless username
17
17
 
18
18
  case command
19
19
  when "authenticate"
20
- exit Hector::Identity.adapter.authenticate(username, password || read_password) ? 0 : -1
20
+ Hector::Identity.adapter.authenticate(username, password || read_password) do |authenticated|
21
+ exit authenticated ? 0 : -1
22
+ end
21
23
 
22
24
  when "remember"
23
25
  Hector::Identity.adapter.remember(username, password || read_password)
@@ -28,6 +28,7 @@ module Hector
28
28
  end
29
29
 
30
30
  def normalize(name)
31
+ name.force_encoding("UTF-8") if name.respond_to?(:force_encoding)
31
32
  if name =~ /^#[\p{L}\p{M}\p{N}\p{So}\p{Co}\w][\p{L}\p{M}\p{N}\p{So}\p{Co}\p{Pd}\p{Pc}\w-]{0,15}$/u
32
33
  name.downcase
33
34
  else
@@ -0,0 +1,24 @@
1
+ module Hector
2
+ module Commands
3
+ module Invite
4
+ def on_invite
5
+ touch_presence
6
+ nickname = request.args.first
7
+ if session = Session.find(nickname)
8
+ channel = Channel.find(request.args[1])
9
+ if channels.include?(channel)
10
+ if !session.channels.include?(channel)
11
+ session.deliver(:invite, self, :source => source, :text => request.text)
12
+ else
13
+ respond_with("443", nickname, channel.name, "is already on channel", :source => Hector.server_name)
14
+ end
15
+ else
16
+ respond_with("442", request.args[1], "You're not on that channel", :source => Hector.server_name)
17
+ end
18
+ else
19
+ raise NoSuchNickOrChannel, nickname
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -19,6 +19,7 @@ module Hector
19
19
 
20
20
  protected
21
21
  def authenticate
22
+ start_timeout
22
23
  set_identity
23
24
  set_session
24
25
  end
@@ -27,6 +28,7 @@ module Hector
27
28
  if @username && @password && !@identity
28
29
  Identity.authenticate(@username, @password) do |identity|
29
30
  if @identity = identity
31
+ cancel_timeout
30
32
  set_session
31
33
  else
32
34
  error InvalidPassword
@@ -36,10 +38,20 @@ module Hector
36
38
  end
37
39
 
38
40
  def set_session
39
- if @identity && @nickname
41
+ if @identity && @nickname && !@session
40
42
  @session = UserSession.create(@nickname, self, @identity, @realname)
41
43
  end
42
44
  end
45
+
46
+ def start_timeout
47
+ @timer ||= EventMachine::Timer.new(30) do
48
+ close_connection(true)
49
+ end
50
+ end
51
+
52
+ def cancel_timeout
53
+ @timer.cancel if @timer
54
+ end
43
55
  end
44
56
  end
45
57
  end
data/lib/hector/server.rb CHANGED
@@ -1,14 +1,17 @@
1
1
  module Hector
2
2
  class << self
3
- attr_accessor :server_name
3
+ attr_accessor :server_name, :address, :port, :ssl_port
4
4
 
5
- def start_server(address = "0.0.0.0", port = 6767, ssl_port = 6868)
6
- EventMachine.start_server(address, port, Connection)
7
- EventMachine.start_server(address, ssl_port, SSLConnection)
8
- logger.info("Hector running on #{address}:#{port}")
9
- logger.info("Secure Hector running on #{address}:#{ssl_port}")
5
+ def start_server
6
+ EventMachine.start_server(@address, @port, Connection)
7
+ EventMachine.start_server(@address, @ssl_port, SSLConnection)
8
+ logger.info("Hector running on #{@address}:#{@port}")
9
+ logger.info("Secure Hector running on #{@address}:#{@ssl_port}")
10
10
  end
11
11
  end
12
12
 
13
13
  self.server_name = "hector.irc"
14
+ self.address = "0.0.0.0"
15
+ self.port = 6767
16
+ self.ssl_port = 6868
14
17
  end
@@ -18,6 +18,7 @@ module Hector
18
18
  include Commands::Who
19
19
  include Commands::Whois
20
20
  include Commands::Away
21
+ include Commands::Invite
21
22
 
22
23
  attr_reader :nickname, :request, :response, :away_message
23
24
 
@@ -59,7 +60,8 @@ module Hector
59
60
  end
60
61
 
61
62
  def normalize(nickname)
62
- if nickname =~ /^[\p{L}\p{M}\p{N}\p{So}\p{Co}\w][\p{L}\p{M}\p{N}\p{So}\p{Co}\p{P}\w-]{0,15}$/u
63
+ nickname.force_encoding("UTF-8") if nickname.respond_to?(:force_encoding)
64
+ if nickname =~ /^[\p{L}\p{M}\p{N}\p{So}\p{Co}\w][\p{L}\p{M}\p{N}\p{So}\p{Co}\p{P}\w\|\-]{0,15}$/u
63
65
  nickname.downcase
64
66
  else
65
67
  raise ErroneousNickname, nickname
data/lib/hector.rb CHANGED
@@ -11,6 +11,7 @@ require "hector/concerns/keep_alive"
11
11
  require "hector/concerns/presence"
12
12
 
13
13
  require "hector/commands/away"
14
+ require "hector/commands/invite"
14
15
  require "hector/commands/join"
15
16
  require "hector/commands/mode"
16
17
  require "hector/commands/names"
metadata CHANGED
@@ -1,56 +1,54 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: hector
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.3
4
5
  prerelease:
5
- version: 1.0.2
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Sam Stephenson
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2011-03-05 00:00:00 -06:00
14
- default_executable:
15
- dependencies:
16
- - !ruby/object:Gem::Dependency
12
+ date: 2011-08-17 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
17
15
  name: eventmachine
18
- prerelease: false
19
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: &70326738713840 !ruby/object:Gem::Requirement
20
17
  none: false
21
- requirements:
22
- - - ">="
23
- - !ruby/object:Gem::Version
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
24
21
  version: 0.12.10
25
22
  type: :runtime
26
- version_requirements: *id001
27
- - !ruby/object:Gem::Dependency
28
- name: mocha
29
23
  prerelease: false
30
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: *70326738713840
25
+ - !ruby/object:Gem::Dependency
26
+ name: mocha
27
+ requirement: &70326738713280 !ruby/object:Gem::Requirement
31
28
  none: false
32
- requirements:
33
- - - ">="
34
- - !ruby/object:Gem::Version
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
35
32
  version: 0.9.9
36
33
  type: :development
37
- version_requirements: *id002
38
- description: A private group chat server for people you trust. Implements a limited subset of the IRC protocol.
39
- email:
34
+ prerelease: false
35
+ version_requirements: *70326738713280
36
+ description: A private group chat server for people you trust. Implements a limited
37
+ subset of the IRC protocol.
38
+ email:
40
39
  - sstephenson@gmail.com
41
- executables:
40
+ executables:
42
41
  - hector
43
42
  - hector-daemon
44
43
  - hector-identity
45
44
  - hector-setup
46
45
  extensions: []
47
-
48
46
  extra_rdoc_files: []
49
-
50
- files:
47
+ files:
51
48
  - lib/hector/boot.rb
52
49
  - lib/hector/channel.rb
53
50
  - lib/hector/commands/away.rb
51
+ - lib/hector/commands/invite.rb
54
52
  - lib/hector/commands/join.rb
55
53
  - lib/hector/commands/mode.rb
56
54
  - lib/hector/commands/names.rb
@@ -87,33 +85,28 @@ files:
87
85
  - bin/hector-daemon
88
86
  - bin/hector-identity
89
87
  - bin/hector-setup
90
- has_rdoc: true
91
88
  homepage: http://github.com/sstephenson/hector
92
89
  licenses: []
93
-
94
90
  post_install_message:
95
91
  rdoc_options: []
96
-
97
- require_paths:
92
+ require_paths:
98
93
  - lib
99
- required_ruby_version: !ruby/object:Gem::Requirement
94
+ required_ruby_version: !ruby/object:Gem::Requirement
100
95
  none: false
101
- requirements:
102
- - - ">="
103
- - !ruby/object:Gem::Version
104
- version: "0"
105
- required_rubygems_version: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ! '>='
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ required_rubygems_version: !ruby/object:Gem::Requirement
106
101
  none: false
107
- requirements:
108
- - - ">="
109
- - !ruby/object:Gem::Version
110
- version: "0"
102
+ requirements:
103
+ - - ! '>='
104
+ - !ruby/object:Gem::Version
105
+ version: '0'
111
106
  requirements: []
112
-
113
107
  rubyforge_project:
114
- rubygems_version: 1.5.0
108
+ rubygems_version: 1.8.7
115
109
  signing_key:
116
110
  specification_version: 3
117
111
  summary: Private group chat server
118
112
  test_files: []
119
-