diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 76345f7..8b83656 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -1164,3 +1164,25 @@ div.fieldWithErrors { font-style: italic; padding-left: 0.5em; } + + +/* pushover */ +.pushover_button { + box-sizing: border-box; + background-color: #eee; + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QAJQCeAPHNVUx7AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3wEPAh02ee0QVwAAACZpVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVAgb24gYSBNYWOV5F9bAAABqElEQVQ4y62TvUtbURjGf+fek2vQpMF2ED9QkfpR6VLaDoIEF0UKWQRBQ+yQP6GDU0Xw4y/obOgg6dDSJVS61MlBcXFQB6M1BsF+IES9NnrzcRy8xpvrBwH7bOflfc553+d5jsCF9tiRDwgBEaDXLi8B80AiGQ2Yzn7hIo8Cce5HOBkNfLo6aA7ydAVkgLjdez3BrS8rRbBJEmyU+AyBVVDE1i1SJ6psEmHvfOLktj0SjL/2snKQx8wpNg+LBJt0RjoN+j6bqOvN/ZotWAldtYK5gWpmV84YbPUw2ePlb7bI73+Kep+OLFONkGarXcK7l16+7+V57BW8qJMs7Ob5k4VQm4fVXzlyquyGiHRYBcC+WWQxnSP63AAgtn7O0FNJ9xOd0W+nbkF7pbsytXxOQw30N0t2MgX6Wzy8qtMJL5zy81jdsETaIXnjLL7trkLqGl+2svxI5/mwZt1l6ZJmJ6yEGqkYbveQOioQ2yiz7TbMa0DCWRnuMPBXaXzcsJx23YWEZmc7fJkqxdgzg8xZka/bFhVE2hSuKL+nMswko4GJ//KZxEO/8wVmfpjJTWeCTQAAAABJRU5ErkJggg==) 2px 2px no-repeat, linear-gradient(#FFF, #DEDEDE); + border: 1px solid #CCC; + border-radius: 3px; + color: #333; + display: inline-block; + font: 11px/18px "Helvetica Neue",Arial,sans-serif; + font-weight: bold; + cursor: pointer; + height: 22px; + padding-left: 20px; + padding-right: 5px; + overflow: hidden; + text-shadow: 0px 1px 0px rgba(255, 255, 255, 0.5); + text-decoration: none; + vertical-align: middle; +} diff --git a/app/controllers/settings_controller.rb b/app/controllers/settings_controller.rb index b79883e..ab4fc32 100644 --- a/app/controllers/settings_controller.rb +++ b/app/controllers/settings_controller.rb @@ -19,6 +19,50 @@ class SettingsController < ApplicationController return redirect_to settings_path end + def pushover + if !Pushover.SUBSCRIPTION_CODE + flash[:error] = "This site is not configured for Pushover" + return redirect_to "/settings" + end + + session[:pushover_rand] = SecureRandom.hex + + return redirect_to Pushover.subscription_url({ + :success => "#{Rails.application.root_url}settings/pushover_callback?" << + "rand=#{session[:pushover_rand]}", + :failure => "#{Rails.application.root_url}settings/", + }) + end + + def pushover_callback + if !session[:pushover_rand].to_s.present? + flash[:error] = "No random token present in session" + return redirect_to "/settings" + end + + if !params[:rand].to_s.present? + flash[:error] = "No random token present in URL" + return redirect_to "/settings" + end + + if params[:rand].to_s != session[:pushover_rand].to_s + raise "rand param #{params[:rand].inspect} != " << + session[:pushover_rand].inspect + end + + @user.pushover_user_key = params[:pushover_user_key].to_s + @user.save! + + if @user.pushover_user_key.present? + flash[:success] = "Your account is now setup for Pushover notifications." + else + flash[:success] = "Your account is no longer setup for Pushover " << + "notifications." + end + + return redirect_to "/settings" + end + def update @edit_user = @user.clone @@ -37,7 +81,6 @@ private :username, :email, :password, :password_confirmation, :about, :email_replies, :email_messages, :email_mentions, :pushover_replies, :pushover_messages, :pushover_mentions, - :pushover_user_key, :pushover_device, :pushover_sound, :mailing_list_mode ) end diff --git a/app/models/user.rb b/app/models/user.rb index ad99812..e1fe79a 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -221,8 +221,7 @@ class User < ActiveRecord::Base def pushover!(params) if self.pushover_user_key.present? - Pushover.push(self.pushover_user_key, self.pushover_device, - params.merge({ :sound => self.pushover_sound.to_s })) + Pushover.push(self.pushover_user_key, params) end end diff --git a/app/views/settings/index.html.erb b/app/views/settings/index.html.erb index f496db1..9bb0f70 100644 --- a/app/views/settings/index.html.erb +++ b/app/views/settings/index.html.erb @@ -38,33 +38,6 @@ -
- -
- <%= f.label :pushover_user_key, - raw("Pushover User Key:"), - :class => "required" %> - <%= f.text_field :pushover_user_key, :size => 40 %> - - For optional comment and message notifications below - -
- -
- <%= f.label :pushover_device, "Pushover Device:", - :class => "required" %> - <%= f.text_field :pushover_device, :placeholder => "optional", - :size => 15 %> -
- -
- <%= f.label :pushover_sound, "Pushover Sound:", - :class => "required" %> - <%= f.select :pushover_sound, Pushover.sounds.map{|k,v| [ v, k ] } %> -
- -
-
<%= f.label :about, "About:", :class => "required" %> <%= f.text_area :about, :size => "100x5", :style => "width: 600px;" %> @@ -83,6 +56,31 @@
+

+ <%= f.submit "Save Account Settings" %> +

+ +
+ +
+ Notification Settings +
+ +
+ <%= f.label :pushover_user_key, + raw("Pushover:"), + :class => "required" %> + <%= link_to((f.object.pushover_user_key.present?? + "Manage Pushover Subscription" : "Subscribe With Pushover"), + "/settings/pushover", :class => "pushover_button", :method => :post) %> + + For optional comment and message notifications below + +
+ +
+ +
Comment Reply Notification Settings
@@ -172,6 +170,7 @@ +
<%= f.submit "Save All Settings" %> <% end %> diff --git a/config/routes.rb b/config/routes.rb index 83b94d0..45fd616 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -88,6 +88,8 @@ Lobsters::Application.routes.draw do get "/settings" => "settings#index" post "/settings" => "settings#update" + post "/settings/pushover" => "settings#pushover" + get "/settings/pushover_callback" => "settings#pushover_callback" post "/settings/delete_account" => "settings#delete_account", :as => "delete_account" diff --git a/extras/pushover.rb b/extras/pushover.rb index b7abb18..ad1cb5d 100644 --- a/extras/pushover.rb +++ b/extras/pushover.rb @@ -1,50 +1,32 @@ class Pushover - cattr_accessor :API_KEY + # these need to be overridden in config/initializers/production.rb + cattr_accessor :API_TOKEN + cattr_accessor :SUBSCRIPTION_CODE - # this needs to be overridden in config/initializers/production.rb - @@API_KEY = nil - - @@SOUNDS = {} - def self.sounds - if !@@API_KEY - return @@SOUNDS - end - - if @@SOUNDS.length <= 1 - begin - s = Sponge.new - res = s.get("https://api.pushover.net/1/sounds.json?token=#{@@API_KEY}") - @@SOUNDS = JSON.parse(res)["sounds"] || {} - rescue => e - Rails.logger.error "error sending to pushover: #{e.inspect}" - end - - @@SOUNDS = { "" => "Device default" }.merge(@@SOUNDS) - end - - @@SOUNDS - end - - def self.push(user, device, params) - if !@@API_KEY + def self.push(user, params) + if !@@API_TOKEN return end begin - params[:message] = params[:message].to_s.match(/.{0,512}/m).to_s - - if params[:message] == "" + if params[:message].to_s == "" params[:message] = "(No message)" end s = Sponge.new s.fetch("https://api.pushover.net/1/messages.json", :post, { - :token => @@API_KEY, + :token => @@API_TOKEN, :user => user, - :device => device }.merge(params)) rescue => e Rails.logger.error "error sending to pushover: #{e.inspect}" end end + + def self.subscription_url(params) + u = "https://pushover.net/subscribe/#{@@SUBSCRIPTION_CODE}" + u << "?success=#{CGI.escape(params[:success])}" + u << "&failure=#{CGI.escape(params[:failure])}" + u + end end