ruby-growl 3.0 → 4.0
Sign up to get free protection for your applications and to get access to all the features.
- data.tar.gz.sig +0 -0
- data/.autotest +16 -0
- data/.gemtest +0 -0
- data/History.txt +15 -0
- data/Manifest.txt +7 -1
- data/README.txt +15 -11
- data/Rakefile +4 -1
- data/bin/growl +1 -1
- data/lib/ruby-growl.rb +136 -262
- data/lib/ruby-growl/gntp.rb +553 -0
- data/lib/ruby-growl/ruby_logo.rb +3769 -0
- data/lib/ruby-growl/udp.rb +266 -0
- data/lib/uri/x_growl_resource.rb +76 -0
- data/test/test_growl_gntp.rb +1238 -0
- data/test/{test_ruby_growl.rb → test_growl_udp.rb} +30 -21
- metadata +86 -55
- metadata.gz.sig +0 -0
data.tar.gz.sig
CHANGED
Binary file
|
data/.autotest
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'autotest/restart'
|
2
|
+
|
3
|
+
Autotest.add_hook :initialize do |at|
|
4
|
+
at.add_exception '.git'
|
5
|
+
at.testlib = 'minitest/autorun'
|
6
|
+
at.unit_diff = 'cat'
|
7
|
+
|
8
|
+
def at.path_to_classname s
|
9
|
+
sep = File::SEPARATOR
|
10
|
+
f = s.sub(/^test#{sep}/, '').sub(/\.rb$/, '').split(sep)
|
11
|
+
f = f.map { |path| path.split(/_|(\d+)/).map { |seg| seg.capitalize }.join }
|
12
|
+
f = f.map { |path| path =~ /^Test/ ? path : "Test#{path}" }
|
13
|
+
f.join('::').gsub('Gntp', 'GNTP').gsub('Udp', 'UDP')
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
data/.gemtest
ADDED
File without changes
|
data/History.txt
CHANGED
@@ -1,3 +1,18 @@
|
|
1
|
+
=== 4 / 2012-04-04
|
2
|
+
|
3
|
+
* API changes:
|
4
|
+
* Growl is now a wrapper for Growl::UDP (1.2 and older) and Growl::GNTP (1.3
|
5
|
+
and newer). The main difference is that notifications need to be
|
6
|
+
registered with Growl#add_notification instead of via Growl#initialize.
|
7
|
+
* Ruby 1.9.2 or newer is required to use ruby-growl
|
8
|
+
|
9
|
+
* Major enhancements
|
10
|
+
* Added GNTP protocol support for registration and notification including
|
11
|
+
application and notification icons and callbacks.
|
12
|
+
* Moved UDP protocol support to Growl::UDP
|
13
|
+
* Growl automatically determines if the growl server supports GNTP or UDP
|
14
|
+
and uses the best protocol.
|
15
|
+
|
1
16
|
=== 3.0 / 2010-09-11
|
2
17
|
|
3
18
|
* Major enhancement
|
data/Manifest.txt
CHANGED
@@ -1,7 +1,13 @@
|
|
1
|
+
.autotest
|
1
2
|
History.txt
|
2
3
|
Manifest.txt
|
3
4
|
README.txt
|
4
5
|
Rakefile
|
5
6
|
bin/growl
|
6
7
|
lib/ruby-growl.rb
|
7
|
-
|
8
|
+
lib/ruby-growl/gntp.rb
|
9
|
+
lib/ruby-growl/ruby_logo.rb
|
10
|
+
lib/ruby-growl/udp.rb
|
11
|
+
lib/uri/x_growl_resource.rb
|
12
|
+
test/test_growl_gntp.rb
|
13
|
+
test/test_growl_udp.rb
|
data/README.txt
CHANGED
@@ -4,23 +4,27 @@
|
|
4
4
|
|
5
5
|
== DESCRIPTION:
|
6
6
|
|
7
|
-
A pure-ruby growl notifier. ruby-growl
|
8
|
-
|
9
|
-
non-OSX machines).
|
7
|
+
A pure-ruby growl notifier for UDP and GNTP growl protocols. ruby-growl
|
8
|
+
allows you to perform Growl notifications from machines without growl
|
9
|
+
installed (for example, non-OSX machines).
|
10
10
|
|
11
|
-
What
|
12
|
-
X".
|
11
|
+
What is growl? Growl is a really cool "global notification system originally
|
12
|
+
for Mac OS X".
|
13
13
|
|
14
|
-
|
15
|
-
|
14
|
+
You can receive Growl notifications on various platforms and send them from
|
15
|
+
any machine that runs Ruby.
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
-
|
17
|
+
OS X: http://growl.info
|
18
|
+
Windows: http://www.growlforwindows.com/gfw/
|
19
|
+
Linux: http://github.com/mattn/growl-for-linux
|
20
|
+
|
21
|
+
ruby-growl also contains a command-line notification tool named 'growl'. It
|
22
|
+
is almost completely option-compatible with growlnotify. (All except for -p
|
23
|
+
is supported, use --priority instead.)
|
20
24
|
|
21
25
|
== FEATURES/PROBLEMS:
|
22
26
|
|
23
|
-
* Requires "Listen for incoming notifications" enabled
|
27
|
+
* Requires "Listen for incoming notifications" enabled on the growl server
|
24
28
|
|
25
29
|
== INSTALL:
|
26
30
|
|
data/Rakefile
CHANGED
@@ -3,10 +3,13 @@ require 'hoe'
|
|
3
3
|
|
4
4
|
Hoe.plugin :git
|
5
5
|
Hoe.plugin :minitest
|
6
|
+
Hoe.plugin :travis
|
6
7
|
|
7
8
|
Hoe.spec 'ruby-growl' do
|
8
9
|
developer 'Eric Hodel', 'drbrain@segment7.net'
|
9
10
|
|
10
|
-
spec_extras['required_ruby_version'] = '
|
11
|
+
spec_extras['required_ruby_version'] = '>= 1.9.2'
|
12
|
+
|
13
|
+
extra_deps << ['uuid', '~> 2.3', '>= 2.3.5']
|
11
14
|
end
|
12
15
|
|
data/bin/growl
CHANGED
data/lib/ruby-growl.rb
CHANGED
@@ -1,149 +1,81 @@
|
|
1
|
-
#!/usr/local/bin/ruby -w
|
2
|
-
|
3
1
|
require 'digest/md5'
|
4
2
|
require 'socket'
|
5
3
|
|
4
|
+
begin
|
5
|
+
require 'dnssd'
|
6
|
+
rescue LoadError
|
7
|
+
end
|
8
|
+
|
6
9
|
##
|
7
|
-
# ruby-growl allows you to perform Growl
|
8
|
-
#
|
10
|
+
# ruby-growl allows you to perform Growl notifications from machines without
|
11
|
+
# growl installed (for example, non-OSX machines).
|
9
12
|
#
|
10
|
-
#
|
11
|
-
#
|
13
|
+
# In version 4, the Growl class is a wrapper for Growl::UDP and Growl::GNTP.
|
14
|
+
# The GNTP protocol allows setting icons for notifications and callbacks. To
|
15
|
+
# upgrade from version 3 replace the notification names passed to initialize
|
16
|
+
# with a call to #add_notification.
|
12
17
|
#
|
13
|
-
#
|
14
|
-
# notifications from any UDP-capable machine that runs Ruby.
|
18
|
+
# Basic usage:
|
15
19
|
#
|
16
|
-
#
|
17
|
-
# http://growl.info/documentation/growl-source-install.php
|
20
|
+
# require 'ruby-growl'
|
18
21
|
#
|
19
|
-
#
|
20
|
-
#
|
21
|
-
#
|
22
|
+
# g = Growl.new "localhost", "ruby-growl"
|
23
|
+
# g.add_notification "ruby-growl Notification"
|
24
|
+
# g.notify "ruby-growl Notification", "It came from ruby-growl!",
|
25
|
+
# "Greetings!"
|
22
26
|
#
|
23
|
-
#
|
27
|
+
# For GNTP users, ruby-growl ships with the Ruby icon from the {Ruby Visual
|
28
|
+
# Identity Team}[http://rubyidentity.org/]:
|
24
29
|
#
|
25
|
-
#
|
26
|
-
#
|
27
|
-
#
|
28
|
-
#
|
30
|
+
# require 'ruby-growl'
|
31
|
+
# require 'ruby-growl/ruby_logo'
|
32
|
+
#
|
33
|
+
# g = Growl.new "localhost", "ruby-growl"
|
34
|
+
# g.add_notification("notification", "ruby-growl Notification",
|
35
|
+
# Growl::RUBY_LOGO_PNG)
|
36
|
+
# g.notify "notification", "It came from ruby-growl", "Greetings!"
|
37
|
+
#
|
38
|
+
# See Growl::UDP and Growl::GNTP for protocol-specific API.
|
29
39
|
|
30
40
|
class Growl
|
31
41
|
|
32
42
|
##
|
33
|
-
#
|
34
|
-
# byte order instead of 'n'.
|
43
|
+
# ruby-growl version
|
35
44
|
|
36
|
-
|
37
|
-
|
38
|
-
little_endian = [1].pack('V*') == [1].pack('L*')
|
39
|
-
little_endian = !little_endian if BROKEN_PACK
|
45
|
+
VERSION = '4.0'
|
40
46
|
|
41
47
|
##
|
42
|
-
#
|
43
|
-
|
44
|
-
LITTLE_ENDIAN = little_endian
|
48
|
+
# Growl error base class
|
45
49
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
VERSION = '3.0'
|
50
|
-
|
51
|
-
##
|
52
|
-
# Growl Network Registration Packet +pack+ Format
|
53
|
-
#--
|
54
|
-
# Format:
|
55
|
-
#
|
56
|
-
# struct GrowlNetworkRegistration {
|
57
|
-
# struct GrowlNetworkPacket {
|
58
|
-
# unsigned char version;
|
59
|
-
# unsigned char type;
|
60
|
-
# } __attribute__((packed));
|
61
|
-
# unsigned short appNameLen;
|
62
|
-
# unsigned char numAllNotifications;
|
63
|
-
# unsigned char numDefaultNotifications;
|
64
|
-
# /*
|
65
|
-
# * Variable sized. Format:
|
66
|
-
# * <application name><all notifications><default notifications><checksum>
|
67
|
-
# * where <all notifications> is of the form (<length><name>){num} and
|
68
|
-
# * <default notifications> is an array of indices into the all notifications
|
69
|
-
# * array, each index being 8 bits.
|
70
|
-
# */
|
71
|
-
# unsigned char data[];
|
72
|
-
# } __attribute__((packed));
|
73
|
-
|
74
|
-
GNR_FORMAT = "CCnCCa*"
|
75
|
-
|
76
|
-
GNR_FORMAT.gsub!(/n/, 'v') if BROKEN_PACK
|
77
|
-
|
78
|
-
##
|
79
|
-
# Growl Network Notification Packet +pack+ Format
|
80
|
-
#--
|
81
|
-
# Format:
|
82
|
-
#
|
83
|
-
# struct GrowlNetworkNotification {
|
84
|
-
# struct GrowlNetworkPacket {
|
85
|
-
# unsigned char version;
|
86
|
-
# unsigned char type;
|
87
|
-
# } __attribute__((packed));
|
88
|
-
# struct GrowlNetworkNotificationFlags {
|
89
|
-
# unsigned reserved: 12;
|
90
|
-
# signed priority: 3;
|
91
|
-
# unsigned sticky: 1;
|
92
|
-
# } __attribute__((packed)) flags; //size = 16 (12 + 3 + 1)
|
93
|
-
# unsigned short nameLen;
|
94
|
-
# unsigned short titleLen;
|
95
|
-
# unsigned short descriptionLen;
|
96
|
-
# unsigned short appNameLen;
|
97
|
-
# /*
|
98
|
-
# * Variable sized. Format:
|
99
|
-
# * <notification name><title><description><application name><checksum>
|
100
|
-
# */
|
101
|
-
# unsigned char data[];
|
102
|
-
# } __attribute__((packed));
|
103
|
-
|
104
|
-
GNN_FORMAT = "CCnnnnna*"
|
105
|
-
|
106
|
-
GNN_FORMAT.gsub!(/n/, 'v') if BROKEN_PACK
|
107
|
-
|
108
|
-
# For litle endian machines the NetworkNotificationFlags aren't in network
|
109
|
-
# byte order
|
110
|
-
|
111
|
-
GNN_FORMAT.sub!((BROKEN_PACK ? 'v' : 'n'), 'v') if LITTLE_ENDIAN
|
112
|
-
|
113
|
-
##
|
114
|
-
# Growl UDP Port
|
115
|
-
|
116
|
-
GROWL_UDP_PORT = 9887
|
117
|
-
|
118
|
-
##
|
119
|
-
# Growl Protocol Version
|
120
|
-
|
121
|
-
GROWL_PROTOCOL_VERSION = 1
|
122
|
-
|
123
|
-
##
|
124
|
-
# Growl Registration Packet Id
|
125
|
-
|
126
|
-
GROWL_TYPE_REGISTRATION = 0
|
50
|
+
class Error < RuntimeError
|
51
|
+
end
|
127
52
|
|
128
53
|
##
|
129
|
-
#
|
54
|
+
# Password for authenticating and encrypting requests.
|
130
55
|
|
131
|
-
|
56
|
+
attr_accessor :password
|
132
57
|
|
133
58
|
##
|
134
59
|
# List of hosts accessible via dnssd
|
135
60
|
|
136
|
-
def self.list
|
137
|
-
|
61
|
+
def self.list type
|
62
|
+
raise 'you must gem install dnssd' unless Object.const_defined? :DNSSD
|
63
|
+
|
64
|
+
require 'timeout'
|
138
65
|
|
139
66
|
growls = []
|
140
67
|
|
141
|
-
|
142
|
-
|
68
|
+
begin
|
69
|
+
Timeout.timeout 10 do
|
70
|
+
DNSSD.browse! type do |reply|
|
71
|
+
next unless reply.flags.add?
|
143
72
|
|
144
|
-
|
73
|
+
growls << reply
|
145
74
|
|
146
|
-
|
75
|
+
break unless reply.flags.more_coming?
|
76
|
+
end
|
77
|
+
end
|
78
|
+
rescue Timeout::Error
|
147
79
|
end
|
148
80
|
|
149
81
|
hosts = []
|
@@ -156,8 +88,6 @@ class Growl
|
|
156
88
|
end
|
157
89
|
|
158
90
|
hosts.uniq
|
159
|
-
rescue LoadError
|
160
|
-
raise 'you must gem install dnssd'
|
161
91
|
end
|
162
92
|
|
163
93
|
##
|
@@ -172,10 +102,10 @@ class Growl
|
|
172
102
|
end
|
173
103
|
|
174
104
|
notify_type = options[:notify_type]
|
175
|
-
notify_types = [notify_type]
|
176
105
|
|
177
|
-
g = new
|
178
|
-
|
106
|
+
g = new options[:host], options[:name]
|
107
|
+
g.add_notification notify_type
|
108
|
+
g.password = options[:password]
|
179
109
|
|
180
110
|
g.notify(notify_type, options[:title], message, options[:priority],
|
181
111
|
options[:sticky])
|
@@ -188,15 +118,15 @@ class Growl
|
|
188
118
|
require 'optparse'
|
189
119
|
|
190
120
|
options = {
|
191
|
-
:
|
192
|
-
:
|
193
|
-
:
|
194
|
-
:
|
195
|
-
:
|
196
|
-
:
|
197
|
-
:
|
198
|
-
:
|
199
|
-
:
|
121
|
+
host: nil,
|
122
|
+
message: nil,
|
123
|
+
name: "ruby-growl",
|
124
|
+
notify_type: "ruby-growl Notification",
|
125
|
+
password: nil,
|
126
|
+
priority: 0,
|
127
|
+
sticky: false,
|
128
|
+
title: "",
|
129
|
+
list: false,
|
200
130
|
}
|
201
131
|
|
202
132
|
opts = OptionParser.new do |o|
|
@@ -277,7 +207,11 @@ Synopsis:
|
|
277
207
|
|
278
208
|
if options[:list] then
|
279
209
|
begin
|
280
|
-
puts
|
210
|
+
puts 'Growl GNTP hosts:'
|
211
|
+
puts list '_gntp._tcp'
|
212
|
+
puts
|
213
|
+
puts 'Growl UDP hosts:'
|
214
|
+
puts list '_growl._tcp'
|
281
215
|
rescue => e
|
282
216
|
raise unless e.message =~ /gem install dnssd/
|
283
217
|
|
@@ -290,165 +224,105 @@ Synopsis:
|
|
290
224
|
end
|
291
225
|
|
292
226
|
##
|
293
|
-
# Creates a new
|
294
|
-
# with the remote machine.
|
295
|
-
#
|
296
|
-
# +host+ is the host to contact.
|
297
|
-
#
|
298
|
-
# +app_name+ is the name of the application sending the notifications.
|
299
|
-
#
|
300
|
-
# +all_notifies+ is a list of notification types your application sends.
|
301
|
-
#
|
302
|
-
# +default_notifies+ is a list of notification types that are turned on by
|
303
|
-
# default.
|
304
|
-
#
|
305
|
-
# I'm not sure about what +default_notifies+ is supposed to be set to, since
|
306
|
-
# there is a comment that says "not a subset of all_notifies" in the code.
|
307
|
-
#
|
308
|
-
# +password+ is the password needed to send notifications to +host+.
|
309
|
-
|
310
|
-
def initialize(host, app_name, all_notifies, default_notifies = nil,
|
311
|
-
password = nil)
|
312
|
-
@socket = UDPSocket.open
|
313
|
-
# FIXME This goes somewhere else
|
314
|
-
@socket.connect host, GROWL_UDP_PORT
|
315
|
-
@app_name = app_name
|
316
|
-
@all_notifies = all_notifies
|
317
|
-
@default_notifies = default_notifies.nil? ? all_notifies : default_notifies
|
318
|
-
@password = password
|
319
|
-
|
320
|
-
register
|
321
|
-
end
|
322
|
-
|
323
|
-
##
|
324
|
-
# Sends a notification.
|
227
|
+
# Creates a new growl basic notifier for +host+ and +application_name+.
|
325
228
|
#
|
326
|
-
# +
|
229
|
+
# +growl_type+ is used to specify the type of growl server to connect to.
|
230
|
+
# The following values are allowed:
|
327
231
|
#
|
328
|
-
#
|
232
|
+
# nil::
|
233
|
+
# Automatically determine the growl type. If a GNTP server is not found
|
234
|
+
# then ruby-growl chooses UDP.
|
235
|
+
# 'GNTP'::
|
236
|
+
# Use GNTP connections. GNTP is supported by Growl 1.3 and newer and by
|
237
|
+
# Growl for Windows.
|
238
|
+
# 'UDP'::
|
239
|
+
# Uses the UDP growl protocol. UDP growl is supported by Growl 1.2 and
|
240
|
+
# older.
|
329
241
|
#
|
330
|
-
#
|
331
|
-
#
|
332
|
-
# +priority+ is the priorty of message to send.
|
333
|
-
#
|
334
|
-
# +sticky+ makes the notification stick until clicked.
|
242
|
+
# You can use <tt>growl --list</tt> to see growl servers on your local
|
243
|
+
# network.
|
335
244
|
|
336
|
-
def
|
337
|
-
|
338
|
-
|
245
|
+
def initialize host, application_name, growl_type = nil
|
246
|
+
@host = host
|
247
|
+
@application_name = application_name
|
339
248
|
|
340
|
-
|
341
|
-
|
249
|
+
@notifications = {}
|
250
|
+
@password = nil
|
342
251
|
|
343
|
-
|
344
|
-
# Registers the notification types with +host+.
|
345
|
-
|
346
|
-
def register
|
347
|
-
send registration_packet
|
252
|
+
@growl_type = choose_implementation growl_type
|
348
253
|
end
|
349
254
|
|
350
255
|
##
|
351
|
-
#
|
256
|
+
# Adds a notification named +name+ to the basic notifier. For GNTP servers
|
257
|
+
# you may specify a +display_name+ and +icon+ and set the default +enabled+
|
258
|
+
# status.
|
352
259
|
|
353
|
-
def
|
354
|
-
|
355
|
-
@socket.send packet, 0
|
356
|
-
@socket.flush
|
260
|
+
def add_notification name, display_name = nil, icon = nil, enabled = true
|
261
|
+
@notifications[name] = display_name, icon, enabled
|
357
262
|
end
|
358
263
|
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
length = 0
|
364
|
-
data = []
|
365
|
-
data_format = ""
|
366
|
-
|
367
|
-
packet = [
|
368
|
-
GROWL_PROTOCOL_VERSION,
|
369
|
-
GROWL_TYPE_REGISTRATION
|
370
|
-
]
|
264
|
+
def choose_implementation type # :nodoc:
|
265
|
+
raise ArgumentError,
|
266
|
+
"type must be \"GNTP\", \"UDP\" or nil; was #{type.inspect}" unless
|
267
|
+
['GNTP', 'UDP', nil].include? type
|
371
268
|
|
372
|
-
|
373
|
-
packet << @all_notifies.length
|
374
|
-
packet << @default_notifies.length
|
269
|
+
return type if type
|
375
270
|
|
376
|
-
|
377
|
-
data_format = "a#{@app_name.bytesize}"
|
378
|
-
|
379
|
-
@all_notifies.each do |notify|
|
380
|
-
data << notify.length
|
381
|
-
data << notify
|
382
|
-
data_format << "na#{notify.length}"
|
383
|
-
end
|
384
|
-
|
385
|
-
@default_notifies.each do |notify|
|
386
|
-
data << @all_notifies.index(notify) if @all_notifies.include? notify
|
387
|
-
data_format << "C"
|
388
|
-
end
|
271
|
+
TCPSocket.open @host, Growl::GNTP::PORT do end
|
389
272
|
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
packet << data
|
395
|
-
|
396
|
-
packet = packet.pack GNR_FORMAT
|
397
|
-
|
398
|
-
checksum = Digest::MD5.new << packet
|
399
|
-
checksum.update @password unless @password.nil?
|
400
|
-
|
401
|
-
packet << checksum.digest
|
402
|
-
|
403
|
-
return packet
|
273
|
+
'GNTP'
|
274
|
+
rescue SystemCallError
|
275
|
+
'UDP'
|
404
276
|
end
|
405
277
|
|
406
278
|
##
|
407
|
-
#
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
279
|
+
# Sends a notification of type +name+ with the given +title+, +message+,
|
280
|
+
# +priority+ and +sticky+ settings.
|
281
|
+
|
282
|
+
def notify name, title, message, priority = 0, sticky = false
|
283
|
+
case @growl_type
|
284
|
+
when 'GNTP' then
|
285
|
+
notify_gntp name, title, message, priority, sticky
|
286
|
+
when 'UDP' then
|
287
|
+
notify_udp name, title, message, priority, sticky
|
288
|
+
else
|
289
|
+
raise Growl::Error, "bug, unknown growl type #{@growl_type.inspect}"
|
290
|
+
end
|
417
291
|
|
418
|
-
|
419
|
-
|
420
|
-
flags |= 1 if sticky # 1 bit for sticky
|
292
|
+
self
|
293
|
+
end
|
421
294
|
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
packet << description.bytesize
|
426
|
-
packet << @app_name.bytesize
|
295
|
+
def notify_gntp name, title, message, priority, sticky # :nodoc:
|
296
|
+
growl = Growl::GNTP.new @host, @application_name
|
297
|
+
growl.password = @password
|
427
298
|
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
data << @app_name
|
299
|
+
@notifications.each do |name, details|
|
300
|
+
growl.add_notification name, *details
|
301
|
+
end
|
432
302
|
|
433
|
-
|
434
|
-
packet = packet.pack GNN_FORMAT
|
303
|
+
growl.register
|
435
304
|
|
436
|
-
|
437
|
-
|
305
|
+
growl.notify name, title, message, priority, sticky
|
306
|
+
end
|
438
307
|
|
439
|
-
|
308
|
+
def notify_udp name, title, message, priority, sticky # :nodoc:
|
309
|
+
all_notifications = @notifications.keys
|
310
|
+
default_notifications = @notifications.select do |name, (_, _, enabled)|
|
311
|
+
enabled
|
312
|
+
end.map do |name,|
|
313
|
+
name
|
314
|
+
end
|
440
315
|
|
441
|
-
|
442
|
-
end
|
316
|
+
notification = all_notifications.first
|
443
317
|
|
444
|
-
|
445
|
-
|
446
|
-
#--
|
447
|
-
# Is this truly necessary?
|
318
|
+
growl = Growl::UDP.new(@host, @application_name, all_notifications,
|
319
|
+
default_notifications, @password)
|
448
320
|
|
449
|
-
|
450
|
-
@socket.setsockopt Socket::SOL_SOCKET, Socket::SO_SNDBUF, length
|
321
|
+
growl.notify name, title, message, priority, sticky
|
451
322
|
end
|
452
323
|
|
453
324
|
end
|
454
325
|
|
326
|
+
require 'ruby-growl/gntp'
|
327
|
+
require 'ruby-growl/udp'
|
328
|
+
|