hector 1.0.2 → 1.0.3

Sign up to get free protection for your applications and to get access to all the features.
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
-