notify-push 0.1.3 → 0.2.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.
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