notify-push 0.1.3 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: dd0ab6b2b7e44edc715aa70fe7f88a00cb5abde7
4
- data.tar.gz: 32e3095cbba0183ff1c2bdc7577152aca8fbbaae
3
+ metadata.gz: 00d52fe8704f4c9c24bed46b6a59d3a93096b844
4
+ data.tar.gz: 9d73dce0d6711cf6bf89595d1c706daa91a8570a
5
5
  SHA512:
6
- metadata.gz: 1ad5497e2be621ae61ba77e46bb7828d32746eddb23d2141806e0f5ef1fb3f1209a47f462b08e98c5046b4f3d592902dafdb86dbfc6a08239734bd11262190f8
7
- data.tar.gz: f1f291e6bb25d4e8fe0ef0e18a9f1c14e49dcdba287fbacff1a34ce81426fde6edcd27274335b7ad52380483ad6c5de155252710ded1a831e9a7381a6d1bfc2c
6
+ metadata.gz: 54cab4097489b0a7618bc997095b5b330600bc36b703601fc776b25b4e9e3edaad880dda75dc72bfaba7b94d3ef40e79dea453e9cbb9942edd744e0152dce1b3
7
+ data.tar.gz: de367fff0e4252b32adaa68a2f12e10bf633b494638940ce9711613df705f4d71b1c69f20907e0dc7588ff1a1490cec54a4bcdbef4fe2fe0b9eaee7d38933ea1
data/Gemfile CHANGED
@@ -3,27 +3,15 @@
3
3
  # ================================================
4
4
  source "http://rubygems.org"
5
5
 
6
- # http://stackoverflow.com/questions/8420414/how-to-add-mac-specific-gems-to-bundle-on-mac-but-not-on-linux
7
- def windows_only(require_as)
8
- RbConfig::CONFIG['host_os'] =~ /mingw|mswin/i ? require_as : false
9
- end
10
-
11
- def linux_only(require_as)
12
- RbConfig::CONFIG['host_os'] =~ /linux/ ? require_as : false
13
- end
14
-
15
- def darwin_only(require_as)
16
- RbConfig::CONFIG['host_os'] =~ /darwin/ ? require_as : false
17
- end
18
-
19
6
  gem "pusher"
20
7
  gem "pusher-client"
21
8
  gem "activesupport"
22
9
  gem "recursive-open-struct"
23
10
  gem "pidfile"
24
11
  gem "os"
25
- #gem "terminal-notifier", require: darwin_only("terminal-notifier")
26
- gem "notifier"
12
+ gem "notifier", github: "eriknomitch/notifier"
13
+ gem "thor"
14
+ gem "awesome_print"
27
15
 
28
16
  group :development do
29
17
  gem "shoulda", ">= 0"
data/Gemfile.lock CHANGED
@@ -1,13 +1,20 @@
1
+ GIT
2
+ remote: git://github.com/eriknomitch/notifier.git
3
+ revision: a43138bbc90c5d246dfb38c34f8ff9b9b56ae07b
4
+ specs:
5
+ notifier (0.5.1)
6
+
1
7
  GEM
2
8
  remote: http://rubygems.org/
3
9
  specs:
4
- activesupport (4.2.1)
10
+ activesupport (4.2.3)
5
11
  i18n (~> 0.7)
6
12
  json (~> 1.7, >= 1.7.7)
7
13
  minitest (~> 5.1)
8
14
  thread_safe (~> 0.3, >= 0.3.4)
9
15
  tzinfo (~> 1.1)
10
16
  addressable (2.3.8)
17
+ awesome_print (1.6.1)
11
18
  builder (3.2.2)
12
19
  coderay (1.1.0)
13
20
  descendants_tracker (0.0.4)
@@ -24,7 +31,7 @@ GEM
24
31
  multi_json (>= 1.7.5, < 2.0)
25
32
  nokogiri (~> 1.6.3)
26
33
  oauth2
27
- hashie (3.4.1)
34
+ hashie (3.4.2)
28
35
  highline (1.7.2)
29
36
  httpclient (2.6.0.1)
30
37
  i18n (0.7.0)
@@ -37,17 +44,16 @@ GEM
37
44
  nokogiri (>= 1.5.10)
38
45
  rake
39
46
  rdoc
40
- json (1.8.2)
41
- jwt (1.5.0)
47
+ json (1.8.3)
48
+ jwt (1.5.1)
42
49
  method_source (0.8.2)
43
50
  mini_portile (0.6.2)
44
51
  minitest (5.7.0)
45
- multi_json (1.11.0)
52
+ multi_json (1.11.2)
46
53
  multi_xml (0.5.5)
47
54
  multipart-post (2.0.0)
48
55
  nokogiri (1.6.6.2)
49
56
  mini_portile (~> 0.6.0)
50
- notifier (0.5.1)
51
57
  oauth2 (1.0.0)
52
58
  faraday (>= 0.8, < 0.10)
53
59
  jwt (~> 1.0)
@@ -67,11 +73,11 @@ GEM
67
73
  pusher-client (0.6.2)
68
74
  json
69
75
  websocket (~> 1.0)
70
- rack (1.6.1)
76
+ rack (1.6.4)
71
77
  rake (10.4.2)
72
78
  rdoc (3.12.2)
73
79
  json (~> 1.4)
74
- recursive-open-struct (0.6.4)
80
+ recursive-open-struct (0.6.5)
75
81
  shoulda (3.5.0)
76
82
  shoulda-context (~> 1.0, >= 1.0.1)
77
83
  shoulda-matchers (>= 1.4.1, < 3.0)
@@ -85,6 +91,7 @@ GEM
85
91
  simplecov-html (~> 0.10.0)
86
92
  simplecov-html (0.10.0)
87
93
  slop (3.6.0)
94
+ thor (0.19.1)
88
95
  thread_safe (0.3.5)
89
96
  tzinfo (1.2.2)
90
97
  thread_safe (~> 0.1)
@@ -96,9 +103,10 @@ PLATFORMS
96
103
 
97
104
  DEPENDENCIES
98
105
  activesupport
106
+ awesome_print
99
107
  bundler (~> 1.0)
100
108
  jeweler (~> 2.0.1)
101
- notifier
109
+ notifier!
102
110
  os
103
111
  pidfile
104
112
  pry
@@ -108,4 +116,5 @@ DEPENDENCIES
108
116
  recursive-open-struct
109
117
  shoulda
110
118
  simplecov
119
+ thor
111
120
  yard (~> 0.7)
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
  A general purpose popup notifier sender/receiver for using WebSockets (via [Pusher](https://pusher.com)).
3
3
 
4
4
  ## Overview
5
- `notify-push` employs a Receiver (*currently OS X only*) and Sender(s) to push messages from the Sender(s) to the Receiver.
5
+ `notify-push` employs a Receiver and Sender(s) to push messages from the Sender(s) to the Receiver.
6
6
 
7
7
  **Example Use Case**:
8
8
  You have `irssi` set up in a `screen` on a remote machine and you want to be notified on your laptop/desktop whenever your name gets highlighted.
@@ -25,6 +25,14 @@ For the Receiver machine and the Sender machine(s):
25
25
  $ gem install notify-push
26
26
  ```
27
27
 
28
+ Or, from source:
29
+ ```Shell
30
+ $ git clone https://github.com/eriknomitch/notify-push.git
31
+ $ cd notify-push
32
+ $ bundle install
33
+ $ rake install
34
+ ```
35
+
28
36
  ### Create & Distribute Configuration File
29
37
  Next, create a configuration file with your Pusher App's credentials (found on your Pusher App's page under *App Credentials*) and distribute it to each machine (Receiver and Sender(s)).
30
38
 
@@ -45,7 +53,7 @@ pusher:
45
53
  Invoke the Receiver with:
46
54
 
47
55
  ```Shell
48
- $ notify-push --receiver # or -r
56
+ $ notify-push receive
49
57
  ```
50
58
 
51
59
  TODO: There's a .plist launchd file in there but it's not ready.
@@ -55,13 +63,12 @@ TODO: There's a .plist launchd file in there but it's not ready.
55
63
  ### Usage
56
64
 
57
65
  ```Shell
58
- $ notify-push <message> [title] [subtitle]
66
+ $ notify-push send <message> [title]
59
67
  ```
60
68
 
61
69
  Alternatively, you can `curl` or use any Pusher tool to send on messages to your `notify-push` app on channel `"notifications"` with data:
62
70
 
63
71
  ```
64
- message: The message to notify you with in the notifier popup (REQUIRED)
65
- title: The title of the notifier popup (Optional)
66
- subtitle: The subtitle of the notifier popup (Optional)
72
+ message: The message to notify you with in the notifier popup (REQUIRED)
73
+ title: The title of the notifier popup (Optional)
67
74
  ```
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.3
1
+ 0.2.0
data/bin/notify-push CHANGED
@@ -1,10 +1,29 @@
1
1
  #!/usr/bin/env ruby
2
+
3
+ # ------------------------------------------------
4
+ # TRAPS ------------------------------------------
5
+ # ------------------------------------------------
6
+
7
+ # We want to trap these signals early because loading
8
+ # everything takes a bit of time... The user could
9
+ # Ctrl-C before that happens.
10
+ trap "SIGINT" do
11
+ exit 130
12
+ end
13
+
14
+ trap "KILL" do
15
+ exit 143
16
+ end
17
+
18
+ # ------------------------------------------------
19
+ # MAIN -------------------------------------------
20
+ # ------------------------------------------------
21
+
22
+ # Requiring "notify-push" will subsequently require the Thor app (CLI)
23
+ # and run everything.
2
24
  begin
3
25
  require "notify-push"
4
26
  rescue LoadError
5
27
  require "rubygems"
6
28
  require "notify-push"
7
29
  end
8
-
9
- exit NotifyPush.main
10
-
@@ -1,26 +1,38 @@
1
1
  #!/bin/bash
2
2
 
3
- # FIX: Unfinished
3
+ _envs_passed=0
4
4
 
5
- key=$PUSHER_KEY
6
- secret=$PUSHER_SECRET
7
- appID=$PUSHER_APP_ID
5
+ function _require_environment_variable() {
6
+ [ -z "${!1}" ] && echo "Need to set $1 environment variable." && _env_passed=1 && return 1
7
+ return 0
8
+ }
9
+
10
+ _require_environment_variable "PUSHER_KEY"
11
+ _require_environment_variable "PUSHER_SECRET"
12
+ _require_environment_variable "PUSHER_APP_ID"
13
+
14
+ if (( $_env_passed != 0 )) ; then
15
+ echo "fatal: One or more environment variables are not set."
16
+ exit 1
17
+ fi
8
18
 
9
19
  message=$1
10
20
  title=$2
11
21
  timestamp=$(date +%s)
12
22
 
23
+ [ -z "$message" ] && echo "fatal: No message supplied." && exit 1
24
+
13
25
  data='{"name":"notification","channel":"notify-push","data":"{\"message\":\"'$message'\",\"title\":\"'$title'\"}"}'
14
26
 
15
27
  # Be sure to use `printf %s` to prevent a trailing \n from being added to the data.
16
28
  md5data=$(printf '%s' "$data" | md5sum | awk '{print $1}')
17
- path="/apps/${appID}/events"
18
- queryString="auth_key=${key}&auth_timestamp=${timestamp}&auth_version=1.0&body_md5=${md5data}"
29
+ path="/apps/${$PUSHER_APP_ID}/events"
30
+ queryString="auth_key=${$PUSHER_KEY}&auth_timestamp=${timestamp}&auth_version=1.0&body_md5=${md5data}"
19
31
 
20
32
  # Be sure to use a multi-line, double quoted string that doesn't end in \n as
21
33
  # input for the SHA-256 HMAC.
22
34
  authSig=$(printf '%s' "POST
23
35
  $path
24
- $queryString" | openssl dgst -sha256 -hex -hmac "$secret")
36
+ $queryString" | openssl dgst -sha256 -hex -hmac "$PUSHER_SECRET")
25
37
  curl -s -H "Content-Type:application/json" -d "$data" "http://api.pusherapp.com${path}?${queryString}&auth_signature=${authSig}" > /dev/null 2>&1 &
26
38
 
data/lib/notify-push.rb CHANGED
@@ -1,15 +1,29 @@
1
+ # ================================================
2
+ # NOTIFY-PUSH ====================================
3
+ # ================================================
1
4
  require "json"
2
5
  require "shellwords"
3
6
  require "yaml"
4
7
  require "recursive-open-struct"
5
8
  require "os"
6
9
  require "notifier"
10
+ require "thor"
11
+ require "thor/group"
12
+ require "awesome_print"
7
13
 
8
- require "pry"
14
+ # FIX: Development only
15
+ require "pry" if Gem::Specification::find_all_by_name("pry").any?
9
16
 
10
17
  require "active_support/core_ext/hash/reverse_merge"
11
18
  require "active_support/core_ext/module"
12
19
  require "active_support/core_ext/object/blank"
20
+ require "active_support/core_ext/object/try"
21
+ require "active_support/inflector/inflections"
22
+
23
+ # ------------------------------------------------
24
+ # TRAP->ANY-EXIT ---------------------------------
25
+ # ------------------------------------------------
26
+ at_exit { NotifyPush.on_at_exit }
13
27
 
14
28
  # ------------------------------------------------
15
29
  # ->CLASS->OS ------------------------------------
@@ -27,6 +41,18 @@ end
27
41
  # MODULE->NOTIFY-PUSH ----------------------------
28
42
  # ------------------------------------------------
29
43
  module NotifyPush
44
+
45
+ # ----------------------------------------------
46
+ # CONSTANTS ------------------------------------
47
+ # ----------------------------------------------
48
+ VERSION = Gem.loaded_specs["notify-push"].version
49
+ CHANNEL_NAME = "notify-push"
50
+ CONFIGURATION_FILE_PATH = "#{ENV["HOME"]}/.notify-pushrc"
51
+
52
+ # ----------------------------------------------
53
+ # ATTRIBUTES -----------------------------------
54
+ # ----------------------------------------------
55
+ mattr_accessor :configuration, :acting_as
30
56
 
31
57
  # ----------------------------------------------
32
58
  # MODULE->UTILITY ------------------------------
@@ -36,18 +62,7 @@ module NotifyPush
36
62
  system "command -v #{command} >/dev/null 2>&1" or raise "The command '#{command}' cannot be found and is required."
37
63
  end
38
64
  end
39
-
40
- # ----------------------------------------------
41
- # ATTRIBUTES -----------------------------------
42
- # ----------------------------------------------
43
- mattr_accessor :configuration
44
65
 
45
- # ----------------------------------------------
46
- # CONSTANTS ------------------------------------
47
- # ----------------------------------------------
48
- CHANNEL_NAME = "notify-push"
49
- CONFIGURATION_FILE_PATH = "#{ENV["HOME"]}/.notify-pushrc"
50
-
51
66
  # ----------------------------------------------
52
67
  # USER-CONFIGURATION ---------------------------
53
68
  # ----------------------------------------------
@@ -59,153 +74,44 @@ module NotifyPush
59
74
  self.configuration = RecursiveOpenStruct.new(YAML.load_file(CONFIGURATION_FILE_PATH))
60
75
  end
61
76
 
77
+ # ----------------------------------------------
78
+ # CALLBACKS ------------------------------------
79
+ # ----------------------------------------------
80
+ def self.on_at_exit
81
+ self.acting_as.try(:on_at_exit)
82
+ end
83
+
62
84
  # ----------------------------------------------
63
85
  # MAIN -----------------------------------------
64
86
  # ----------------------------------------------
65
- def self.main()
87
+ def self.main(type, *args)
66
88
  begin
67
89
  initialize_configuration
68
90
 
69
- if ["--receiver", "-r"].member? ARGV[0]
70
- return NotifyPush::Receiver.start
91
+ case type
92
+ when :receiver, :receive
93
+ return NotifyPush::Receiver.start *args
94
+ when :sender, :send
95
+ return NotifyPush::Sender.send_notification *args
71
96
  end
72
97
 
73
- NotifyPush::Sender.start
74
98
  rescue => exception
75
99
  puts "fatal: #{exception.to_s}"
76
100
  exit 1
77
101
  end
78
102
  end
79
103
 
80
- # ----------------------------------------------
81
- # MODULE->SENDER -------------------------------
82
- # ----------------------------------------------
83
- module Sender
84
-
85
- class << self
86
- delegate :configuration, to: :parent
87
- end
88
-
89
- def self.start()
90
-
91
- # The only thing we require is a message.
92
- # The others will be nil if not supplied.
93
- raise "No message supplied." if ARGV[0].blank?
94
-
95
- notification = {
96
- message: ARGV[0],
97
- title: ARGV[1],
98
- subtitle: ARGV[2]
99
- }
100
-
101
- puts "Sending notification (backgrounded) with data:"
102
- puts " message-> #{notification[:message]}"
103
- puts " title-> #{notification[:title]}"
104
- puts " subtitle-> #{notification[:subtitle]}"
105
-
106
- # Daemonize now.
107
- Process.daemon true
108
-
109
- require "pusher"
110
-
111
- # Strip the nil key/value pairs out so we don't have to
112
- # worry about them on the Receiver end.
113
- notification.delete_if {|key, value| value.blank?}
114
-
115
- # Connect to Pusher and trigger the notification
116
- Pusher.url = "http://#{configuration.pusher.key}:#{configuration.pusher.secret}@api.pusherapp.com/apps/#{configuration.pusher.app_id}"
117
-
118
- Pusher[CHANNEL_NAME].trigger("notification", notification)
119
-
120
- 0
121
- end
122
-
123
- end
124
-
125
- # ----------------------------------------------
126
- # MODULE->RECEIVER -----------------------------
127
- # ----------------------------------------------
128
- module Receiver
129
-
130
- class << self
131
- delegate :configuration, to: :parent
132
- end
133
-
134
- # --------------------------------------------
135
- # PID ----------------------------------------
136
- # --------------------------------------------
137
- def self.pid_lock
138
- require "pidfile"
139
-
140
- PidFile.new
141
- end
142
-
143
- # --------------------------------------------
144
- # NOTIFY -------------------------------------
145
- # --------------------------------------------
146
- def self.notify(title: "notify-push", subtitle: nil, message:)
147
-
148
- message = "#{subtitle} - #{message}" if subtitle
149
-
150
- Notifier.notify({
151
- title: title,
152
- message: message
153
- })
154
- end
155
-
156
- # --------------------------------------------
157
- # START --------------------------------------
158
- # --------------------------------------------
159
- def self.start()
160
-
161
- pid_lock
162
-
163
- require "pusher-client"
164
-
165
- socket = PusherClient::Socket.new configuration.pusher.key, {
166
- secure: true
167
- }
168
-
169
- # Subscribe to main channel
170
- socket.subscribe(CHANNEL_NAME)
171
-
172
- # Bind to the main channel event
173
- socket[CHANNEL_NAME].bind("notification") do |data|
174
-
175
- begin
176
- data = JSON.parse(data, symbolize_names: true)
177
-
178
- notify **data
179
-
180
- rescue => exception
181
- puts "Warning: Failed to process notification."
182
- puts exception
183
- ensure
184
- puts "----------"
185
- puts data
186
- end
187
- end
188
-
189
- # Bind to the error event
190
- socket.bind("pusher:error") do |data|
191
- puts "----------"
192
- puts "Warning: Pusher Error"
193
- puts data
194
- end
195
-
196
- # Connect
197
- socket.connect
198
-
199
- 0
200
- end
201
-
202
- end
203
104
  end
204
105
 
205
106
  # ------------------------------------------------
206
- # TRAP->SIGINT -----------------------------------
107
+ # REQUIRES ---------------------------------------
207
108
  # ------------------------------------------------
208
- trap "SIGINT" do
209
- puts "Exiting."
210
- exit 130
211
- end
109
+ require "notify-push/receiver"
110
+ require "notify-push/sender"
111
+ require "notify-push/cli"
112
+
113
+ # ------------------------------------------------
114
+ # MAIN -------------------------------------------
115
+ # ------------------------------------------------
116
+ NotifyPush::CLI.start(ARGV)
117
+
@@ -0,0 +1,110 @@
1
+ # ------------------------------------------------
2
+ # MODULE->NOTIFY-PUSH ----------------------------
3
+ # ------------------------------------------------
4
+ module NotifyPush
5
+
6
+ #class Sub < Thor
7
+ ## --------------------------------------------
8
+ ## CONFIGURATION ------------------------------
9
+ ## --------------------------------------------
10
+ ##package_name "receiver"
11
+
12
+ ## --------------------------------------------
13
+ ## COMMAND->RECEIVE ---------------------------
14
+ ## --------------------------------------------
15
+ #desc "Starts the Receiver server (in the foreground)."
16
+ ##option :silence_events, type: :boolean, default: false
17
+ #def foo()
18
+ #puts "foo"
19
+ #end
20
+ #end
21
+
22
+ # ----------------------------------------------
23
+ # CLASS->CLI-RECEIVER (THOR) -------------------
24
+ # ----------------------------------------------
25
+ #class CLIReceiver < Thor
26
+
27
+ ## --------------------------------------------
28
+ ## CONFIGURATION ------------------------------
29
+ ## --------------------------------------------
30
+ ##package_name "receiver"
31
+
32
+ ## --------------------------------------------
33
+ ## COMMAND->RECEIVE ---------------------------
34
+ ## --------------------------------------------
35
+ ##desc "Starts the Receiver server (in the foreground)."
36
+ #desc "foo", "Starts the Receiver server (in the foreground)."
37
+ ##option :silence_events, type: :boolean, default: false
38
+ #def foo()
39
+ #puts "foo"
40
+ #end
41
+
42
+ #end
43
+
44
+ # ----------------------------------------------
45
+ # CLASS->CLI (THOR) ----------------------------
46
+ # ----------------------------------------------
47
+ class CLI < Thor
48
+
49
+ # --------------------------------------------
50
+ # CONFIGURATION ------------------------------
51
+ # --------------------------------------------
52
+ package_name "notify-push"
53
+
54
+ # --------------------------------------------
55
+ # COMMAND->UNINSTALL -------------------------
56
+ # --------------------------------------------
57
+ desc "version|--version", "Displays the current version of notify-push"
58
+ def version()
59
+ puts ::NotifyPush::VERSION
60
+ end
61
+
62
+ map "--version" => "version"
63
+
64
+ # --------------------------------------------
65
+ # COMMAND->RECEIVE ---------------------------
66
+ # --------------------------------------------
67
+ desc "receive", "Starts the Receiver server (in the foreground) (short-cut alias: \"r\")"
68
+ option :silence_events, type: :boolean, default: false
69
+
70
+ def receive()
71
+ NotifyPush.main :receive
72
+ end
73
+
74
+ map "r" => "send"
75
+
76
+ # --------------------------------------------
77
+ # COMMAND->SEND ------------------------------
78
+ # --------------------------------------------
79
+ desc "send MESSAGE <TITLE>", "Sends data to any listening Receivers (short-cut alias: \"s\")"
80
+ def send(message, title="notify-push")
81
+
82
+ # FIX: Use these arguments instead of ARGV
83
+ NotifyPush.main :send
84
+ end
85
+
86
+ map "s" => "send"
87
+
88
+ # --------------------------------------------
89
+ # COMMAND->INSTALL ---------------------------
90
+ # --------------------------------------------
91
+ desc "install COMPONENT", "Installs a notify-push component. Available COMPONENT(s): receiver-daemon"
92
+ def install(component)
93
+ puts "installing..."
94
+ end
95
+
96
+ # --------------------------------------------
97
+ # COMMAND->UNINSTALL -------------------------
98
+ # --------------------------------------------
99
+ desc "uninstall COMPONENT", "Uninstalls a notify-push component."
100
+ def uninstall(component)
101
+ puts "uninstalling..."
102
+ end
103
+
104
+ #desc "subbb", "Installs a notify-push component. Available COMPONENT(s): receiver-daemon"
105
+ #register CLIReceiver, :receiver, "receiver", "Do something else"
106
+ #subcommand "sub", CLIReceiver
107
+
108
+ end
109
+
110
+ end
@@ -0,0 +1,107 @@
1
+ # ------------------------------------------------
2
+ # MODULE->NOTIFY-PUSH ----------------------------
3
+ # ------------------------------------------------
4
+ module NotifyPush
5
+
6
+ # ----------------------------------------------
7
+ # MODULE->RECEIVER -----------------------------
8
+ # ----------------------------------------------
9
+ module Receiver
10
+
11
+ class << self
12
+ delegate :configuration, to: :parent
13
+ end
14
+
15
+ def self.on_at_exit
16
+ notify title: "notify-push", message: "Receiver: Exiting.", sound: :Submarine
17
+ end
18
+
19
+ # --------------------------------------------
20
+ # PID ----------------------------------------
21
+ # --------------------------------------------
22
+ def self.pid_lock
23
+ require "pidfile"
24
+
25
+ PidFile.new
26
+ end
27
+
28
+ # --------------------------------------------
29
+ # NOTIFY -------------------------------------
30
+ # --------------------------------------------
31
+ def self.notify(title: "notify-push", subtitle: nil, sound: :Bottle, message:)
32
+
33
+ message = "#{subtitle} - #{message}" if subtitle
34
+
35
+ Notifier.notify({
36
+ title: title,
37
+ message: message,
38
+ sound: sound
39
+ })
40
+ end
41
+
42
+ # --------------------------------------------
43
+ # START --------------------------------------
44
+ # --------------------------------------------
45
+ def self.start()
46
+
47
+ pid_lock
48
+
49
+ ::NotifyPush.acting_as = self
50
+
51
+ require "pusher-client"
52
+
53
+ socket = PusherClient::Socket.new configuration.pusher.key, {
54
+ secure: true
55
+ }
56
+
57
+ # Subscribe to main channel
58
+ # ------------------------------------------
59
+ socket.subscribe(CHANNEL_NAME)
60
+
61
+ # Bind to: Main Channel Notification
62
+ # ------------------------------------------
63
+ socket[CHANNEL_NAME].bind("notification") do |data|
64
+
65
+ begin
66
+ data = JSON.parse(data, symbolize_names: true)
67
+
68
+ notify **data
69
+
70
+ rescue => exception
71
+ puts "Warning: Failed to process notification."
72
+ puts exception
73
+ ensure
74
+ puts "--------------------------------------------------"
75
+ puts "-> Received Push Notification at: #{Time.now.to_s}"
76
+ puts "--------------------------------------------------"
77
+ ap data
78
+ end
79
+ end
80
+
81
+ # Bind to: Pusher Errors
82
+ # ------------------------------------------
83
+ socket.bind("pusher:error") do |data|
84
+ puts "----------"
85
+ puts "Warning: Pusher Error"
86
+ puts data
87
+ end
88
+
89
+ # Bind to: Pusher Connection Established
90
+ # ------------------------------------------
91
+ socket.bind("pusher:connection_established") do |data|
92
+ self.notify({
93
+ title: "notify-push",
94
+ message: "Receiver: Started & connected.",
95
+ sound: :default
96
+ })
97
+ end
98
+
99
+ # Connect the Socket
100
+ # ------------------------------------------
101
+ socket.connect
102
+
103
+ 0
104
+ end
105
+
106
+ end
107
+ end
@@ -0,0 +1,55 @@
1
+ # ------------------------------------------------
2
+ # MODULE->NOTIFY-PUSH ----------------------------
3
+ # ------------------------------------------------
4
+ module NotifyPush
5
+
6
+ # ----------------------------------------------
7
+ # MODULE->SENDER -------------------------------
8
+ # ----------------------------------------------
9
+ module Sender
10
+
11
+ class << self
12
+ delegate :configuration, to: :parent
13
+ end
14
+
15
+ def self.send_notification()
16
+
17
+ ARGV.shift
18
+
19
+ # The only thing we require is a message.
20
+ # The others will be nil if not supplied.
21
+ raise "No message supplied." if ARGV[0].blank?
22
+
23
+ ::NotifyPush.acting_as = self
24
+
25
+ notification = {
26
+ message: ARGV[0],
27
+ title: ARGV[1],
28
+ subtitle: ARGV[2]
29
+ }
30
+
31
+ puts "Sending notification (backgrounded) with data:"
32
+ puts " message-> #{notification[:message]}"
33
+ puts " title-> #{notification[:title]}"
34
+ puts " subtitle-> #{notification[:subtitle]}"
35
+
36
+ # Daemonize now.
37
+ Process.daemon true
38
+
39
+ require "pusher"
40
+
41
+ # Strip the nil key/value pairs out so we don't have to
42
+ # worry about them on the Receiver end.
43
+ notification.delete_if {|key, value| value.blank?}
44
+
45
+ # Connect to Pusher and trigger the notification
46
+ Pusher.url = "http://#{configuration.pusher.key}:#{configuration.pusher.secret}@api.pusherapp.com/apps/#{configuration.pusher.app_id}"
47
+
48
+ Pusher[CHANNEL_NAME].trigger("notification", notification)
49
+
50
+ 0
51
+ end
52
+
53
+ end
54
+
55
+ end
data/notify-push.gemspec CHANGED
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: notify-push 0.1.3 ruby lib
5
+ # stub: notify-push 0.2.0 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "notify-push"
9
- s.version = "0.1.3"
9
+ s.version = "0.2.0"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib"]
13
13
  s.authors = ["Erik Nomitch"]
14
- s.date = "2015-06-08"
14
+ s.date = "2015-07-08"
15
15
  s.description = "A general purpose popup notifier sender/receiver using WebSockets (via Pusher)"
16
16
  s.email = "erik@nomitch.com"
17
17
  s.executables = ["notify-push"]
@@ -32,6 +32,9 @@ Gem::Specification.new do |s|
32
32
  "contrib/shell/notify-push-curl",
33
33
  "images/doc/terminal-notifier.png",
34
34
  "lib/notify-push.rb",
35
+ "lib/notify-push/cli.rb",
36
+ "lib/notify-push/receiver.rb",
37
+ "lib/notify-push/sender.rb",
35
38
  "notify-push.gemspec",
36
39
  "ofe.json",
37
40
  "system/com.notify-push.receiver.plist",
@@ -55,6 +58,8 @@ Gem::Specification.new do |s|
55
58
  s.add_runtime_dependency(%q<pidfile>, [">= 0"])
56
59
  s.add_runtime_dependency(%q<os>, [">= 0"])
57
60
  s.add_runtime_dependency(%q<notifier>, [">= 0"])
61
+ s.add_runtime_dependency(%q<thor>, [">= 0"])
62
+ s.add_runtime_dependency(%q<awesome_print>, [">= 0"])
58
63
  s.add_development_dependency(%q<shoulda>, [">= 0"])
59
64
  s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
60
65
  s.add_development_dependency(%q<yard>, ["~> 0.7"])
@@ -70,6 +75,8 @@ Gem::Specification.new do |s|
70
75
  s.add_dependency(%q<pidfile>, [">= 0"])
71
76
  s.add_dependency(%q<os>, [">= 0"])
72
77
  s.add_dependency(%q<notifier>, [">= 0"])
78
+ s.add_dependency(%q<thor>, [">= 0"])
79
+ s.add_dependency(%q<awesome_print>, [">= 0"])
73
80
  s.add_dependency(%q<shoulda>, [">= 0"])
74
81
  s.add_dependency(%q<rdoc>, ["~> 3.12"])
75
82
  s.add_dependency(%q<yard>, ["~> 0.7"])
@@ -86,6 +93,8 @@ Gem::Specification.new do |s|
86
93
  s.add_dependency(%q<pidfile>, [">= 0"])
87
94
  s.add_dependency(%q<os>, [">= 0"])
88
95
  s.add_dependency(%q<notifier>, [">= 0"])
96
+ s.add_dependency(%q<thor>, [">= 0"])
97
+ s.add_dependency(%q<awesome_print>, [">= 0"])
89
98
  s.add_dependency(%q<shoulda>, [">= 0"])
90
99
  s.add_dependency(%q<rdoc>, ["~> 3.12"])
91
100
  s.add_dependency(%q<yard>, ["~> 0.7"])
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: notify-push
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Erik Nomitch
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-08 00:00:00.000000000 Z
11
+ date: 2015-07-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pusher
@@ -108,6 +108,34 @@ dependencies:
108
108
  - - ">="
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: thor
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: awesome_print
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
111
139
  - !ruby/object:Gem::Dependency
112
140
  name: shoulda
113
141
  requirement: !ruby/object:Gem::Requirement
@@ -228,6 +256,9 @@ files:
228
256
  - contrib/shell/notify-push-curl
229
257
  - images/doc/terminal-notifier.png
230
258
  - lib/notify-push.rb
259
+ - lib/notify-push/cli.rb
260
+ - lib/notify-push/receiver.rb
261
+ - lib/notify-push/sender.rb
231
262
  - notify-push.gemspec
232
263
  - ofe.json
233
264
  - system/com.notify-push.receiver.plist