Files
danbooru/app/logical/discord_webhook_service.rb
evazion 412b7f2727 http: split requests into internal and external requests.
Split requests made by Danbooru::Http into either internal or external
requests. Internal requests are API calls to internal services run by
Danbooru. External requests are requests to external websites, for
example fetching sources or downloading files. External requests may use
a HTTP proxy if one is configured. Internal requests don't.

Fixes a few source extractors not using the HTTP proxy for certain API calls.
2022-10-19 01:49:28 -05:00

62 lines
1.7 KiB
Ruby

# frozen_string_literal: true
# Used for posting notifications to Discord about new forum posts.
# https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks
class DiscordWebhookService
attr_reader :webhook_id, :webhook_secret, :http
def initialize(webhook_id: Danbooru.config.discord_webhook_id, webhook_secret: Danbooru.config.discord_webhook_secret, http: Danbooru::Http.external)
@webhook_id = webhook_id
@webhook_secret = webhook_secret
@http = http
end
def enabled?
webhook_id.present? && webhook_secret.present?
end
# https://discord.com/developers/docs/resources/webhook#execute-webhook
def post_message(forum_post)
return unless enabled?
http.post(webhook_url, params: { wait: true }, json: build_message(forum_post))
end
# https://discord.com/developers/docs/resources/channel#embed-object
def build_message(forum_post)
{
embeds: [{
title: forum_post.topic.title,
description: convert_dtext(forum_post.body),
timestamp: forum_post.created_at.iso8601,
url: Routes.url_for(forum_post),
author: {
name: forum_post.creator.name,
url: Routes.url_for(forum_post.creator)
},
fields: [
{
name: "Replies",
value: forum_post.topic.response_count,
inline: true
},
{
name: "Users",
value: forum_post.topic.forum_posts.distinct.count(:creator_id),
inline: true
}
]
}]
}
end
def convert_dtext(dtext)
DText.to_markdown(dtext).truncate(2000)
end
def webhook_url
"https://discord.com/api/webhooks/#{webhook_id}/#{webhook_secret}"
end
end