/
server.rb
79 lines (69 loc) · 2.35 KB
/
server.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
require 'timeout'
module MulukhiyaTootProxy
class Server < Ginseng::Sinatra
include Package
def before_post
super
return unless @headers['HTTP_AUTHORIZATION']
@mastodon = Mastodon.new(
(@config['/instance_url'] || "https://#{@headers['HTTP_HOST']}"),
@headers['HTTP_AUTHORIZATION'].split(/\s+/)[1],
)
end
post '/api/v1/statuses' do
tags = params['status'].scan(tag_pattern).map(&:first)
results = []
Handler.all do |handler|
Timeout.timeout(handler.timeout) do
handler.mastodon = @mastodon
handler.exec(params, @headers)
results.push(handler.result)
end
rescue Timeout::Error => e
@logger.error(Ginseng::Error.create(e).to_h)
next
end
r = @mastodon.toot(params)
@renderer.message = r.parsed_response
@renderer.message['results'] = results.join(', ')
@renderer.message['tags']&.keep_if{|v| tags.include?(v['name'])}
@renderer.status = r.code
headers({'X-Mulukhiya' => results.join(', ')})
return @renderer.to_s
end
post '/mulukhiya/webhook/:digest' do
unless webhook = Webhook.create(params[:digest])
raise Ginseng::NotFoundError, "Resource #{request.path} not found."
end
params[:text] ||= params[:body]
raise Ginseng::RequestError, 'empty message' unless params[:text].present?
@renderer.message = webhook.toot(params[:text]).parsed_response
return @renderer.to_s
end
get '/mulukhiya/webhook/:digest' do
unless Webhook.create(params[:digest])
raise Ginseng::NotFoundError, "Resource #{request.path} not found."
end
@renderer.message = {message: 'OK'}
return @renderer.to_s
end
not_found do
@renderer.status = 404
@renderer.message = Ginseng::NotFoundError.new("Resource #{request.path} not found.").to_h
return @renderer.to_s
end
error do |e|
e = Ginseng::Error.create(e)
@renderer.status = e.status
@renderer.message = e.to_h.delete_if{|k, v| k == :backtrace}
@renderer.message['error'] = e.message
Slack.broadcast(e.to_h) unless e.status == 404
@logger.error(e.to_h)
return @renderer.to_s
end
private
def tag_pattern
return Regexp.new(@config['/mastodon/hashtag/pattern'], Regexp::IGNORECASE)
end
end
end