Pulse 1.2.8 → 1.3.0
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/pulse/client.rb +26 -34
- data/library/pulse/connection.rb +14 -4
- data/library/pulse/handling.rb +2 -7
- data/library/pulse/queue.rb +0 -3
- data/library/pulse/script/cache.rb +3 -6
- data/library/pulse/script.rb +12 -24
- data/library/pulse.rb +9 -21
- metadata +4 -5
- data/library/pulse/dcc.rb +0 -38
data/library/pulse/client.rb
CHANGED
@@ -9,28 +9,25 @@ module Pulse
|
|
9
9
|
attr_accessor :scripts
|
10
10
|
|
11
11
|
def initialize options
|
12
|
-
@scripts
|
13
|
-
@channels = {}
|
14
|
-
@settings = Settings.new options
|
15
|
-
@callbacks = {}
|
16
|
-
@connection = Connection.new self, @settings
|
17
|
-
@conversations = {}
|
12
|
+
@conversations, @callbacks, @channels, @scripts = {}, {}, {}, []
|
18
13
|
|
19
|
-
|
14
|
+
@settings = Settings.new options
|
15
|
+
@connection = Connection.new self, @settings
|
20
16
|
|
21
|
-
|
22
|
-
|
23
|
-
transmit :QUIT, "I was interrupted"
|
24
|
-
end
|
17
|
+
load_scripts
|
18
|
+
trap 2, &method(:quit)
|
25
19
|
end
|
26
20
|
|
27
21
|
def connect
|
28
|
-
@connection.
|
22
|
+
if not @connection.established?
|
23
|
+
@connection.establish
|
24
|
+
else
|
25
|
+
raise ConnectionError, 'Connection has already been established'
|
26
|
+
end
|
29
27
|
end
|
30
28
|
|
31
29
|
def got_command command
|
32
30
|
name = :"got_#{command.name.downcase}"
|
33
|
-
puts "<< #{command}"
|
34
31
|
|
35
32
|
if respond_to? name
|
36
33
|
__send__ name, command
|
@@ -38,18 +35,11 @@ module Pulse
|
|
38
35
|
end
|
39
36
|
|
40
37
|
def connection_established connection
|
41
|
-
puts "Connection has been established."
|
42
|
-
|
43
38
|
transmit :NICK, @settings.nickname
|
44
39
|
transmit :USER, @settings.username, ?*, ?*, @settings.realname
|
45
40
|
end
|
46
41
|
|
47
42
|
def connection_terminated connection
|
48
|
-
puts "The connection was terminated."
|
49
|
-
end
|
50
|
-
|
51
|
-
def say recipient, line
|
52
|
-
transmit :PRIVMSG, recipient.to_s, line
|
53
43
|
end
|
54
44
|
|
55
45
|
def load_scripts
|
@@ -64,25 +54,30 @@ module Pulse
|
|
64
54
|
end.clear
|
65
55
|
end
|
66
56
|
|
67
|
-
def
|
57
|
+
def instances_of name
|
68
58
|
@channels.values.select { |c| c.user? name }.each do |channel|
|
69
59
|
yield channel.user name
|
70
60
|
end
|
71
61
|
end
|
72
62
|
|
73
|
-
def send_file path, recipient
|
74
|
-
Thread.new path, recipient do
|
75
|
-
DCC.new(path).listen do |addr|
|
76
|
-
# FIXME: find the right local ip address and convert it to an integer
|
77
|
-
transmit :PRIVMSG, recipient, "\x01DCC SEND #{File.basename path} 1489377357 #{addr[1]} #{File.size path}\x01"
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
63
|
def transmit name, *args
|
83
64
|
@connection.transmit name, *args
|
84
65
|
end
|
85
66
|
|
67
|
+
def say recipient, line
|
68
|
+
transmit :PRIVMSG, recipient.to_s, line
|
69
|
+
end
|
70
|
+
|
71
|
+
def join channel
|
72
|
+
transmit :JOIN, channel.to_s
|
73
|
+
end
|
74
|
+
|
75
|
+
def quit signal
|
76
|
+
unload_scripts
|
77
|
+
|
78
|
+
transmit :QUIT, "Received kill signal (#{signal})"
|
79
|
+
end
|
80
|
+
|
86
81
|
private
|
87
82
|
|
88
83
|
def emit name, *args
|
@@ -90,12 +85,9 @@ module Pulse
|
|
90
85
|
callback.call *args
|
91
86
|
end if @callbacks[name]
|
92
87
|
|
93
|
-
|
94
88
|
@scripts.each do |script|
|
95
89
|
begin
|
96
|
-
if script.respond_to? name
|
97
|
-
script.__send__ name, *args
|
98
|
-
end
|
90
|
+
script.__send__ name, *args if script.respond_to? name
|
99
91
|
rescue => exception
|
100
92
|
puts "Script error: #{exception.message} on line #{exception.line + 1} in #{script.path}"
|
101
93
|
end
|
data/library/pulse/connection.rb
CHANGED
@@ -23,12 +23,22 @@ module Pulse
|
|
23
23
|
@delegate.connection_terminated self
|
24
24
|
end
|
25
25
|
|
26
|
-
def
|
27
|
-
|
26
|
+
def transmit name, *arguments
|
27
|
+
if established?
|
28
|
+
Command.new(name, arguments).tap { |this| @queue << this }
|
29
|
+
else
|
30
|
+
raise ConnectionError, 'Connection has not been established'
|
31
|
+
end
|
28
32
|
end
|
29
33
|
|
30
|
-
def
|
31
|
-
|
34
|
+
def established?; not @socket.nil? and not @socket.closed? end
|
35
|
+
|
36
|
+
def close
|
37
|
+
if established?
|
38
|
+
@socket.close
|
39
|
+
else
|
40
|
+
raise ConnectionError, 'Connection is already closed'
|
41
|
+
end
|
32
42
|
end
|
33
43
|
end
|
34
44
|
end
|
data/library/pulse/handling.rb
CHANGED
@@ -20,7 +20,6 @@ module Pulse
|
|
20
20
|
else
|
21
21
|
@channels[command[2]] ||= Channel.new(command[2], self, users)
|
22
22
|
end
|
23
|
-
p users, command[3]
|
24
23
|
end
|
25
24
|
|
26
25
|
# The IRCd is checking whether or not we're still alive
|
@@ -56,11 +55,7 @@ module Pulse
|
|
56
55
|
(@conversations[command.sender.nickname] ||= Conversation.new user, self).tap do |conversation|
|
57
56
|
user.channel = conversation
|
58
57
|
|
59
|
-
|
60
|
-
emit :dcc, user, conversation, $1.split
|
61
|
-
else
|
62
|
-
emit :conversation, user, conversation, message
|
63
|
-
end
|
58
|
+
emit :conversation, user, conversation, message
|
64
59
|
end
|
65
60
|
end
|
66
61
|
end
|
@@ -73,7 +68,7 @@ module Pulse
|
|
73
68
|
user.channel = channel
|
74
69
|
user.synchronize command.sender
|
75
70
|
channel.users << user
|
76
|
-
emit :
|
71
|
+
emit :user_entered, user, channel
|
77
72
|
end
|
78
73
|
end
|
79
74
|
|
data/library/pulse/queue.rb
CHANGED
@@ -15,16 +15,13 @@ module Pulse
|
|
15
15
|
YAML.dump @containers, file
|
16
16
|
end
|
17
17
|
|
18
|
-
puts "Dumping cache for script #{@script.
|
18
|
+
puts "Dumping cache for script #{@script.name} to #{path} …"
|
19
19
|
end
|
20
20
|
|
21
21
|
def load
|
22
|
-
if
|
23
|
-
@containers =
|
24
|
-
|
25
|
-
puts "Imported cache from #{path} …"
|
22
|
+
if data = YAML.load_file(path)
|
23
|
+
puts "Imported cache from #{path} …" if @containers = data
|
26
24
|
end
|
27
|
-
|
28
25
|
rescue
|
29
26
|
puts "The cache is corrupted. Removing."
|
30
27
|
File.unlink path
|
data/library/pulse/script.rb
CHANGED
@@ -2,29 +2,31 @@
|
|
2
2
|
|
3
3
|
module Pulse
|
4
4
|
class Script < Module
|
5
|
-
|
6
5
|
attr_accessor :name, :author, :version, :path
|
7
6
|
|
8
7
|
def initialize path, client
|
9
|
-
@path, @client = path, client
|
10
|
-
@loaded = false
|
8
|
+
@path, @client, @loaded = path, client, false
|
11
9
|
|
12
|
-
evaluate_script
|
13
10
|
cache.load if has_cache?
|
14
|
-
|
11
|
+
emit :loaded if evaluate_script
|
15
12
|
end
|
16
13
|
|
17
|
-
def Script name, version = [1,
|
14
|
+
def Script name, version = [1,0,0], author = nil, &block
|
18
15
|
@name, @version, @author = name, version, author
|
16
|
+
|
19
17
|
instance_eval &block
|
20
18
|
end
|
21
19
|
|
20
|
+
def cache_for name; script = @client.scripts.find { |script| script.name == name } ? script.cache : nil end
|
21
|
+
|
22
|
+
def emit method, *args; __send__ method, *args if respond_to? method end
|
23
|
+
def script name; @client.scripts.find { |script| script.name == name } end
|
24
|
+
def cache; @cache ||= Cache.new self end
|
25
|
+
|
26
|
+
def has_cache?; File.exists? "#{File.expand_path File.dirname $0}/cache/#@name.yml" end
|
22
27
|
def loaded?; @loaded == true end
|
23
28
|
|
24
|
-
def unload
|
25
|
-
cache.save if @cache
|
26
|
-
__send__ :unloaded if respond_to? :unloaded
|
27
|
-
end
|
29
|
+
def unload!; cache.save if @cache; emit :unloaded end
|
28
30
|
|
29
31
|
def to_yaml opts = {}; @name.to_yaml opts end
|
30
32
|
|
@@ -32,19 +34,6 @@ module Pulse
|
|
32
34
|
%{#<#{self.class.name} @name=#{@name.inspect} @version=#{@version.inspect} @author=#{@author.inspect}}
|
33
35
|
end
|
34
36
|
|
35
|
-
def cache_for name
|
36
|
-
script = @client.scripts.find { |script| script.name == name }
|
37
|
-
script ? script.cache : nil
|
38
|
-
end
|
39
|
-
|
40
|
-
def script name; @client.scripts.find { |script| script.name == name } end
|
41
|
-
|
42
|
-
def has_cache?
|
43
|
-
File.exists? "#{File.expand_path File.dirname $0}/cache/#@name.yml"
|
44
|
-
end
|
45
|
-
|
46
|
-
def cache; @cache ||= Cache.new self end
|
47
|
-
|
48
37
|
private
|
49
38
|
|
50
39
|
def evaluate_script
|
@@ -52,6 +41,5 @@ module Pulse
|
|
52
41
|
rescue
|
53
42
|
puts "Parse error: #{$!.message}"
|
54
43
|
end
|
55
|
-
|
56
44
|
end
|
57
45
|
end
|
data/library/pulse.rb
CHANGED
@@ -2,33 +2,21 @@
|
|
2
2
|
|
3
3
|
require 'yaml'
|
4
4
|
require 'socket'
|
5
|
-
require 'pulse/dcc'
|
6
|
-
require 'pulse/user'
|
7
|
-
require 'pulse/queue'
|
8
|
-
require 'pulse/client'
|
9
|
-
require 'pulse/script'
|
10
|
-
require 'pulse/channel'
|
11
|
-
require 'pulse/command'
|
12
|
-
require 'pulse/settings'
|
13
|
-
require 'pulse/connection'
|
14
|
-
require 'pulse/enhancements'
|
15
|
-
require 'pulse/conversation'
|
16
|
-
require 'pulse/script/cache'
|
17
5
|
|
18
6
|
Thread.abort_on_exception = true
|
19
7
|
|
8
|
+
Dir.glob("#{File.dirname __FILE__}/pulse/**/*.rb").each &method(:require)
|
9
|
+
|
20
10
|
module Pulse
|
21
|
-
class
|
11
|
+
class ConnectionError < StandardError; end
|
12
|
+
|
13
|
+
class << Version = [1,3]
|
22
14
|
def to_s; join ?. end
|
23
15
|
end
|
24
16
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
Client.new(options).tap do |client|
|
30
|
-
client.instance_eval &block
|
31
|
-
end.connect
|
32
|
-
end
|
17
|
+
def self.connect options, &block
|
18
|
+
Client.new(options).tap do |client|
|
19
|
+
client.instance_eval &block
|
20
|
+
end.connect
|
33
21
|
end
|
34
22
|
end
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 1
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 1.
|
7
|
+
- 3
|
8
|
+
- 0
|
9
|
+
version: 1.3.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Mikkel Kroman
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: executables
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-12-
|
17
|
+
date: 2010-12-13 00:00:00 +01:00
|
18
18
|
default_executable:
|
19
19
|
dependencies: []
|
20
20
|
|
@@ -38,7 +38,6 @@ files:
|
|
38
38
|
- library/pulse/user.rb
|
39
39
|
- library/pulse/conversation.rb
|
40
40
|
- library/pulse/channel.rb
|
41
|
-
- library/pulse/dcc.rb
|
42
41
|
- library/pulse/enhancements.rb
|
43
42
|
- library/pulse.rb
|
44
43
|
has_rdoc: true
|
data/library/pulse/dcc.rb
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require 'timeout'
|
4
|
-
|
5
|
-
module Pulse
|
6
|
-
class DCC
|
7
|
-
Duration = 150
|
8
|
-
|
9
|
-
def initialize path, position = 0
|
10
|
-
@path, @position = path, 0
|
11
|
-
end
|
12
|
-
|
13
|
-
def listen
|
14
|
-
client = nil
|
15
|
-
|
16
|
-
TCPServer.open '0.0.0.0', 0 do |server|
|
17
|
-
yield server.addr if block_given?
|
18
|
-
|
19
|
-
begin
|
20
|
-
timeout(Duration) { client = server.accept }
|
21
|
-
rescue Timeout::Error
|
22
|
-
server.close
|
23
|
-
end
|
24
|
-
|
25
|
-
each_chunk { |chunk| client.write chunk } if client
|
26
|
-
client.close if client
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
def each_chunk
|
31
|
-
File.open @path, ?r do |file|
|
32
|
-
file.readpartial @position if @position > 0
|
33
|
-
yield file.readpartial 1024 until file.eof?
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
end
|
38
|
-
end
|