2021-09-04 01:27:46 +05:30
# frozen_string_literal: true
require " discordrb/webhooks "
module Integrations
class Discord < BaseChatNotification
ATTACHMENT_REGEX = / : (?<entry>.*?) \ n - (?<name>.*) \ n* / . freeze
2022-10-11 01:57:18 +05:30
undef :notify_only_broken_pipelines
field :webhook ,
section : SECTION_TYPE_CONNECTION ,
2023-01-13 00:05:48 +05:30
help : 'e.g. https://discordapp.com/api/webhooks/…' ,
2022-10-11 01:57:18 +05:30
required : true
field :notify_only_broken_pipelines ,
type : 'checkbox' ,
section : SECTION_TYPE_CONFIGURATION
field :branches_to_be_notified ,
type : 'select' ,
section : SECTION_TYPE_CONFIGURATION ,
title : - > { s_ ( 'Integrations|Branches for which notifications are to be sent' ) } ,
choices : - > { branch_choices }
2021-09-04 01:27:46 +05:30
def title
s_ ( " DiscordService|Discord Notifications " )
end
def description
s_ ( " DiscordService|Send notifications about project events to a Discord channel. " )
end
def self . to_param
" discord "
end
2022-10-11 01:57:18 +05:30
def fields
self . class . fields + build_event_channels
end
2021-09-04 01:27:46 +05:30
def help
2022-05-07 20:08:51 +05:30
docs_link = ActionController :: Base . helpers . link_to _ ( 'How do I set up this service?' ) , Rails . application . routes . url_helpers . help_page_url ( 'user/project/integrations/discord_notifications' ) , target : '_blank' , rel : 'noopener noreferrer'
2021-09-04 01:27:46 +05:30
s_ ( 'Send notifications about project events to a Discord channel. %{docs_link}' ) . html_safe % { docs_link : docs_link . html_safe }
end
def default_channel_placeholder
# No-op.
end
def self . supported_events
%w[ push issue confidential_issue merge_request note confidential_note tag_push pipeline wiki_page ]
end
2022-08-27 11:52:29 +05:30
def sections
[
{
type : SECTION_TYPE_CONNECTION ,
title : s_ ( 'Integrations|Connection details' ) ,
description : help
} ,
{
type : SECTION_TYPE_TRIGGER ,
title : s_ ( 'Integrations|Trigger' ) ,
description : s_ ( 'Integrations|An event will be triggered when one of the following items happen.' )
} ,
{
type : SECTION_TYPE_CONFIGURATION ,
title : s_ ( 'Integrations|Notification settings' ) ,
description : s_ ( 'Integrations|Configure the scope of notifications.' )
}
]
end
2021-09-04 01:27:46 +05:30
private
def notify ( message , opts )
client = Discordrb :: Webhooks :: Client . new ( url : webhook )
client . execute do | builder |
builder . add_embed do | embed |
embed . author = Discordrb :: Webhooks :: EmbedAuthor . new ( name : message . user_name , icon_url : message . user_avatar )
embed . description = ( message . pretext + " \n " + Array . wrap ( message . attachments ) . join ( " \n " ) ) . gsub ( ATTACHMENT_REGEX , " \\ k<entry> - \\ k<name> \n " )
2021-09-30 23:02:18 +05:30
embed . colour = 16543014 # The hex "fc6d26" as an Integer
embed . timestamp = Time . now . utc
2021-09-04 01:27:46 +05:30
end
end
2022-08-27 11:52:29 +05:30
rescue RestClient :: Exception = > e
log_error ( e . message )
2021-09-04 01:27:46 +05:30
false
end
def custom_data ( data )
super ( data ) . merge ( markdown : true )
end
end
end