forked from publify/publify
/
note.rb
142 lines (117 loc) · 3.47 KB
/
note.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
134
135
136
137
138
139
140
141
142
class Note < Content
require 'twitter'
require 'json'
require 'uri'
include PublifyGuid
include ConfigManager
serialize :settings, Hash
setting :twitter_id, :string, ""
setting :in_reply_to_status_id, :string, ""
setting :in_reply_to_protected, :boolean, false
setting :in_reply_to_message, :string, ""
belongs_to :user
validates_presence_of :body
validates_uniqueness_of :permalink, :guid
after_create :set_permalink, :shorten_url
before_create :create_guid
default_scope order("published_at DESC")
TWITTER_FTP_URL_LEGTH = 19
TWITTER_HTTP_URL_LENGTH = 20
TWITTER_HTTPS_URL_LENGTH = 21
def set_permalink
self.permalink = "#{self.id}-#{self.body.to_permalink[0..79]}" if self.permalink.nil? or self.permalink.empty?
self.save
end
def categories;[];end
def tags;[];end
def set_author(user)
self.author = user.login
self.user = user
end
def html_preprocess(field, html)
PublifyApp::Textfilter::Twitterfilter.filtertext(nil,nil,html,nil).nofollowify
end
def initialize(*args)
super
# Yes, this is weird - PDC
begin
self.settings ||= {}
rescue Exception => e
self.settings = {}
end
end
def twitter_message_max_length
140 - (7 + self.redirects.first.to_url.length)
end
def twitter_message
base_message = self.body.strip_html
if too_long?(base_message)
"#{base_message[0..twitter_message_max_length]}... (#{self.redirects.first.to_url})"
else
"#{base_message} (#{short_link})"
end
end
def send_to_twitter
return false unless Blog.default.has_twitter_configured?
return false unless self.user.has_twitter_configured?
twitter = Twitter::Client.new(
:consumer_key => Blog.default.twitter_consumer_key,
:consumer_secret => Blog.default.twitter_consumer_secret,
:oauth_token => self.user.twitter_oauth_token,
:oauth_token_secret => self.user.twitter_oauth_token_secret
)
begin
options = {}
if self.in_reply_to_status_id and self.in_reply_to_status_id != ""
options = {:in_reply_to_status_id => self.in_reply_to_status_id}
self.in_reply_to_message = twitter.status(self.in_reply_to_status_id).to_json
end
tweet = twitter.update(self.twitter_message, options)
self.twitter_id = tweet.attrs[:id_str]
self.save
self.user.update_twitter_profile_image(tweet.attrs[:user][:profile_image_url])
true
rescue
false
end
end
content_fields :body
def password_protected?
false
end
def access_by?(user)
user.admin? || user_id == user.id
end
def permalink_url(anchor=nil, only_path=false)
blog.url_for(
:controller => '/notes',
:action => 'show',
:permalink => permalink,
:anchor => anchor,
:only_path => only_path
)
end
def short_link
path = self.redirects.first.from_path
blog = Blog.default
prefix = blog.custom_url_shortener.present? ? blog.custom_url_shortener : blog.base_url
prefix.sub!(/^https?\:\/\//, '')
"#{prefix} #{path}"
end
private
def too_long?(message)
uris = URI.extract(message, ['http', 'https', 'ftp'])
uris.each do |uri|
case uri.split(":")[0]
when "http"
payload = "-" * TWITTER_HTTP_URL_LENGTH
when "https"
payload = "-" * TWITTER_HTTPS_URL_LENGTH
when "ftp"
payload = "-" * TWITTER_FTP_URL_LEGTH
end
message = message.gsub(uri, payload)
end
message.length > twitter_message_max_length
end
end