-
Notifications
You must be signed in to change notification settings - Fork 0
/
app.rb
133 lines (112 loc) · 4.63 KB
/
app.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
require 'json'
require 'sinatra'
require 'simple_oauth'
require 'excon'
if ENV['RACK_ENV'] != "production"
require 'dotenv'
Dotenv.load ".env"
end
# Since Heroku only has the files in git and we prevent .env from being checked
# in; we can't use Dotenv on Heroku.
#
# Heroku sets an environment variable called `RACK_ENV` to "production" on ruby
# apps; so we use that to skip loading Dotenv.
#
# For all the rest of the variables we set in `.env` we'll use `heroku
# config:set VARIABLE_NAME="value"`:
# https://devcenter.heroku.com/articles/config-vars#setting-up-config-vars-for-a-deployed-application
def reverse(words)
new_words = []
words.split(" ").each do |word|
new_words.unshift(word.reverse)
#array.unshift is like array.push, but it prepends data to the beginning
# of an array instead of appending it to the end.
end
new_words.join(" ")
# This highly complex encryption algorithm will surely dupe the NSA!
end
def tweets(screen_name)
authorization_header = SimpleOAuth::Header.new("get",
"https://api.twitter.com/1.1/statuses/user_timeline.json",
{ :screen_name => screen_name },
{ :consumer_key => ENV['TWITTER_API_KEY'],
:consumer_secret => ENV['TWITTER_API_SECRET'] })
response = Excon.send("get", "https://api.twitter.com/1.1/statuses/user_timeline.json", {
:query => { :screen_name => screen_name },
:headers => { "Authorization" => authorization_header.to_s }
})
response = JSON.parse(response.body)
if response.respond_to?(:has_key?) && response.has_key?("errors")
messages = []
response["errors"].each do |error|
messages.push(error["message"])
end
raise "Woah! Lookit all these errors! #{messages.join("\n")}"
else
return response
end
# If only it were possible to re-use code without copying and pasting...
# http://guides.rubygems.org/make-your-own-gem/
end
QUOTES = ["It's life Jim, but not as we know it!",
"Safety Dance!",
"What is the airspeed velocity of a coconut laden swallow?"]
# Truly, great wisdom of the ages...
get('/') do
# `get` is a sinatra method that lets us respond to HTTP requests, e.g.,
# from a browser.
# `get` takes two arguments:
# * a string for the path to respond to
# * a `block` of instructions to execute when a request is sent using the
# `GET` http verb. (Blocks are those `do ... end` things.)
# This comment is inside one right now!
@words = QUOTES.sample
# The `@` sign denotes an `instance variable`. This is how we share `data`
# between a route and a view.
erb :home
# `erb` is a method that takes a symbol that corresponds to a file named in
# the `views` folder.
# In this case, we're saying "load the template file called `views/home.erb`,
# process it with whatever `instance variables` are defined; and return the
# result as a string.
end
post('/reverse') do
# Sinatra's `post` method is similar to `get`, except it responds only to
# `requests` sent with the `POST` http verb.
unreversed_words = params[:words]
# `params` is a hash provided by Sinatra that includes any `query variables`
# or `form variables` sent with the request.
#
# Take the following form:
# <form method="POST" action ="/reverse">
# <textarea name="words"><%= @words %></textarea>
# <button>Reversify!</button>
# </form>
#
# When a visitor fills in the text box and clicks the "Reversify!" button it
# will send an HTTP Post request to the '/reverse` path on whatever `server`
# is running the app. The request will include a form variable named `words`
# with a value of whatever the user put in.
@words = reverse(unreversed_words)
erb :home
# We can call methods we defined earlier in the file from within a route
# Because we're re-using the `home` template; we want to re-use the `@words`
# instance variable; since it's being used to pre-fill the words textarea.
end
get('/tweets') do
if ENV['TWITTER_API_KEY'].nil? || ENV['TWITTER_API_SECRET'].nil?
"Hey! Wait a second. Look in app.rb and set up your Twitter API key and secret."
elsif params[:screen_name]
@tweets = tweets(params[:screen_name])
erb :tweets
else
@tweets = []
erb :tweets
end
# If someone requests this page without passing in a `screen_name` variable;
# we want to default to an empty list of tweets.
#
# Don't believe me? Delete 94 and 96 - 98 and read the error message!
# Why do you think that is there?
# Which template do you think `erb` will use to render these tweets?
end