mirror of
				https://github.com/discourse/discourse-chat-integration.git
				synced 2025-10-31 13:58:37 +00:00 
			
		
		
		
	This commit centralizes 'display name' generation into a helper, and updates it to respect core preferences for `enable_names` and `prioritize_username_in_ux`.
		
			
				
	
	
		
			77 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| # frozen_string_literal: true
 | |
| module DiscourseChatIntegration::Provider::GroupmeProvider
 | |
|   PROVIDER_NAME = "groupme".freeze
 | |
|   PROVIDER_ENABLED_SETTING = :chat_integration_groupme_enabled
 | |
|   CHANNEL_PARAMETERS = [
 | |
|       { key: "groupme_instance_name", regex: '[\s\S]*', unique: true }
 | |
|   ]
 | |
| 
 | |
|   def self.generate_groupme_message(post)
 | |
|     display_name = ::DiscourseChatIntegration::Helper.formatted_display_name(post.user)
 | |
| 
 | |
|     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
 | |
|     pre_post_text = "#{display_name} Posted to #{SiteSetting.title}\n\nTopic: #{topic.title} [#{category}]"
 | |
|     read_more = "(Read More: #{post.full_url})"
 | |
|     post_excerpt = "#{post.excerpt(SiteSetting.chat_integration_groupme_excerpt_length, text_entities: true, strip_links: true, remap_emoji: true)}"
 | |
|     data = {
 | |
|       text: "#{pre_post_text}\n\n#{post_excerpt}\n#{read_more}"
 | |
|     }
 | |
|     data
 | |
|   end
 | |
| 
 | |
|   def self.send_via_webhook(message, channel)
 | |
|     # loop through all the bot IDs
 | |
|     last_error_raised = nil
 | |
|     num_errors = 0
 | |
|     # split on commas, but remove leading/trailing spaces
 | |
|     bot_ids = SiteSetting.chat_integration_groupme_bot_ids.split(/\s*,\s*/)
 | |
|     instance_names = SiteSetting.chat_integration_groupme_instance_names.split(/\s*,\s*/)
 | |
| 
 | |
|     unless instance_names.length() == bot_ids.length()
 | |
|       instance_names = [I18n.t('chat_integration.provider.groupme.errors.instance_names_issue')] * bot_ids.length()
 | |
|     end
 | |
| 
 | |
|     name_to_id = Hash[instance_names.zip(bot_ids)]
 | |
|     user_input_channel = channel.data['groupme_instance_name'].strip
 | |
|     unless user_input_channel.eql? 'all'
 | |
|       instance_names = [user_input_channel]
 | |
|     end
 | |
|     instance_names.each { |instance_name|
 | |
|       bot_id = name_to_id["#{instance_name}"]
 | |
|       uri = URI("https://api.groupme.com/v3/bots/post")
 | |
|       http = Net::HTTP.new(uri.host, uri.port)
 | |
|       http.use_ssl = (uri.scheme == 'https')
 | |
|       req = Net::HTTP::Post.new(uri, 'Content-Type' => 'application/json')
 | |
|       message[:bot_id] = bot_id
 | |
|       req.body = message.to_json
 | |
|       response = http.request(req)
 | |
|       unless response.kind_of? Net::HTTPSuccess
 | |
|         num_errors += 1
 | |
|         if response.code.to_s == '404'
 | |
|           error_key = 'chat_integration.provider.groupme.errors.not_found'
 | |
|         else
 | |
|           error_key = nil
 | |
|         end
 | |
|         last_error_raised = { error_key: error_key, groupme_name: instance_name, bot_id: bot_id, request: req.body, response_code: response.code, response_body: response.body }
 | |
|       end
 | |
|     }
 | |
|     if last_error_raised
 | |
|       successfully_sent = instance_names.length() - num_errors
 | |
|       last_error_raised[:success_rate] = "#{successfully_sent}/#{instance_names.length()}"
 | |
|       raise ::DiscourseChatIntegration::ProviderError.new info: last_error_raised
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def self.trigger_notification(post, channel, rule)
 | |
|     data_package = generate_groupme_message(post)
 | |
|     self.send_via_webhook(data_package, channel)
 | |
|   end
 | |
| end
 |