lib/lita/handlers/tweet.rb in lita-tweet-0.1.0 vs lib/lita/handlers/tweet.rb in lita-tweet-0.3.0
- old
+ new
@@ -1,8 +1,116 @@
+require_relative "./tweet/data"
+
module Lita
module Handlers
class Tweet < Handler
-
+ config :consumer_key, type: String
+ config :consumer_secret, type: String
+ config :http_url
+
+ route %r{^tweet\s(.+)}, :tweet, command: true, restrict_to: :tweeters,
+ help: {"tweet MESSAGE" => "Post a tweet."}
+ route %r{^untweet}, :untweet, command: true, restrict_to: :tweeters,
+ help: {"untweet" => "Delete the last tweet."}
+ route %r{^twitter accounts}, :accounts, command: true,
+ restrict_to: :tweeters, help: {
+ "twitter accounts" => "List accounts that can be tweeted from.",
+ "twitter accounts add" => "Authorize a new account for tweeting.",
+ "twitter accounts remove NAME" => "Remove the twitter account NAME"
+ }
+ # route %r{^twitter channels\s(.+?)\s(.+)}, :channels, command: true, help: {
+ # "twitter channels" => "List account to channel mappings.",
+ # "twitter channels NAME CHANNEL" => "Tweet as twitter account NAME when told to tweet in channel CHANNEL."
+ # }
+
+ TWITTER_AUTH_URL = "/twitter/auth"
+ TWITTER_AUTH_CALLBACK_URL = "/twitter/callback"
+ http.get TWITTER_AUTH_URL, :twitter_auth
+ http.get TWITTER_AUTH_CALLBACK_URL, :twitter_auth_callback
+
+ def tweet(response)
+ text = response.match_data[1]
+ if text.nil? || text.empty?
+ return response.reply("I need something to tweet!")
+ end
+
+ account = account_for(response)
+ return response.relpy(no_accounts) if account.nil?
+
+ tweet = account.tweet(text)
+ twitter_data.set_last_tweet(account.username, tweet.id)
+ response.reply(tweet.url)
+ end
+
+ def untweet(response)
+ account = account_for(response)
+ return response.relpy(no_accounts) if account.nil?
+
+ if account.untweet
+ response.reply("Removed last tweet.")
+ else
+ response.reply("Couldn't find a last tweet to remove!")
+ end
+ end
+
+ def accounts(response)
+ case response.args[1]
+ when "add"
+ response.reply(add_account)
+ when "remove"
+ response.reply(remove_account(response.args[2]))
+ else
+ response.reply(list_accounts)
+ end
+ end
+
+ # def channels(response)
+ # # do channel stuff here
+ # end
+
+ def twitter_auth(request, response)
+ callback_url = TWITTER_AUTH_CALLBACK_URL
+ request_token = twitter_data.create_request_token(callback_url)
+ response.status = 302
+ response.headers["Location"] = request_token.authorize_url
+ end
+
+ def twitter_auth_callback(request, response)
+ token = request.params["oauth_token"]
+ verifier = request.params["oauth_verifier"]
+ account = twitter_data.authorize_account(token, verifier)
+ response.body << "Done! You can now tweet from @#{account.username}."
+ end
+
+ private
+
+ def list_accounts
+ names = twitter_data.usernames
+
+ if names.empty?
+ "No authorized accounts. Use `twitter accounts add` to add one."
+ else
+ usernames = names.map{|n| " - @#{n}" }.join("\n")
+ "Authorized Twitter accounts:\n" << usernames
+ end
+ end
+
+ def add_account
+ auth_uri = twitter_data.bot_uri(TWITTER_AUTH_URL)
+ "Authorize your account for tweeting here:\n#{auth_uri}"
+ end
+
+ def remove_account(name)
+ twitter_data.remove_account(name)
+ "Removed @#{name}."
+ end
+ def account_for(response)
+ twitter_data.account(twitter_data.usernames.first)
+ end
+
+ def twitter_data
+ @twitter_data ||= Data.new(redis, config, robot)
+ end
Lita.register_handler(self)
end
end
end