| 
									
										
										
										
											2020-07-29 21:50:02 +05:30
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-13 14:36:16 -05:00
										 |  |  | module DiscourseChatIntegration::Provider::TeamsProvider | 
					
						
							| 
									
										
										
										
											2020-07-29 21:50:02 +05:30
										 |  |  |   PROVIDER_NAME = "teams".freeze | 
					
						
							|  |  |  |   PROVIDER_ENABLED_SETTING = :chat_integration_teams_enabled | 
					
						
							|  |  |  |   CHANNEL_PARAMETERS = [ | 
					
						
							|  |  |  |     { key: "name", regex: '^\S+$', unique: true }, | 
					
						
							| 
									
										
										
										
											2021-01-26 17:45:49 +00:00
										 |  |  |     { key: "webhook_url", regex: '^https:\/\/\S+$', unique: true, hidden: true } | 
					
						
							| 
									
										
										
										
											2020-07-29 21:50:02 +05:30
										 |  |  |   ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def self.trigger_notification(post, channel, rule) | 
					
						
							|  |  |  |     message = get_message(post) | 
					
						
							|  |  |  |     uri = URI(channel.data['webhook_url']) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-01 17:36:56 +00:00
										 |  |  |     http = FinalDestination::HTTP.new(uri.host, uri.port) | 
					
						
							| 
									
										
										
										
											2020-07-29 21:50:02 +05:30
										 |  |  |     http.use_ssl = (uri.scheme == 'https') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     req = Net::HTTP::Post.new(uri, 'Content-Type' => 'application/json') | 
					
						
							|  |  |  |     req.body = message.to_json | 
					
						
							|  |  |  |     response = http.request(req) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     unless response.kind_of? Net::HTTPSuccess | 
					
						
							|  |  |  |       if response.body.include?('Invalid webhook URL') | 
					
						
							|  |  |  |         error_key = 'chat_integration.provider.teams.errors.invalid_channel' | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         error_key = nil | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2021-07-13 14:36:16 -05:00
										 |  |  |       raise ::DiscourseChatIntegration::ProviderError.new info: { error_key: error_key, request: req.body, response_code: response.code, response_body: response.body } | 
					
						
							| 
									
										
										
										
											2020-07-29 21:50:02 +05:30
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def self.get_message(post) | 
					
						
							|  |  |  |     display_name = "@#{post.user.username}" | 
					
						
							| 
									
										
										
										
											2022-06-16 13:12:56 -03:00
										 |  |  |     full_name = | 
					
						
							|  |  |  |       if SiteSetting.enable_names && post.user.name.present? | 
					
						
							|  |  |  |         post.user.name | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         "" | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2020-07-29 21:50:02 +05:30
										 |  |  | 
 | 
					
						
							|  |  |  |     topic = post.topic | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     category = '' | 
					
						
							|  |  |  |     if topic.category&.uncategorized? | 
					
						
							|  |  |  |       category = "[#{I18n.t('uncategorized_category_name')}]" | 
					
						
							|  |  |  |     elsif topic.category | 
					
						
							|  |  |  |       category = (topic.category.parent_category) ? "[#{topic.category.parent_category.name}/#{topic.category.name}]" : "[#{topic.category.name}]" | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     message = { | 
					
						
							|  |  |  |       "@type": "MessageCard", | 
					
						
							|  |  |  |       "summary": topic.title, | 
					
						
							|  |  |  |       "sections": [{ | 
					
						
							|  |  |  |         "activityTitle": "[#{topic.title} #{category} #{topic.tags.present? ? topic.tags.map(&:name).join(', ') : ''}](#{post.full_url})", | 
					
						
							|  |  |  |         "activitySubtitle": post.excerpt(SiteSetting.chat_integration_teams_excerpt_length, text_entities: true, strip_links: true, remap_emoji: true), | 
					
						
							|  |  |  |         "activityImage": post.user.small_avatar_url, | 
					
						
							|  |  |  |         "facts": [{ | 
					
						
							|  |  |  |           "name": full_name, | 
					
						
							|  |  |  |           "value": display_name | 
					
						
							|  |  |  |         }], | 
					
						
							|  |  |  |         "markdown": true | 
					
						
							|  |  |  |       }], | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     message | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | end |