Advertisement
Guest User

Untitled

a guest
Jul 18th, 2018
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.13 KB | None | 0 0
  1. /*****************************************************************************
  2. * bg_SlackUtils
  3. *
  4. * Utils class for Slack operations
  5. *
  6. * Author: Thomas Packer - BrightGen Ltd
  7. * Date: 13/06/2018
  8. * Changes: Craig Platt - 16/07/2018
  9. * Added messageText variable and call to bg_SlackMessageUtils.setMessageMentions()
  10. *****************************************************************************/
  11.  
  12. public class bg_SlackUtils
  13. {
  14. // A method to process slack channels
  15. public static void processSlackChannels()
  16. {
  17. // Get slack channels
  18. HttpResponse response = bg_SlackAPIUtils.getAllSlackChannels('300');
  19.  
  20. // Check we have a response
  21. if (response != null)
  22. {
  23. // Get response body
  24. String responseBody = response.getBody();
  25.  
  26. // Get slack channels
  27. bg_Slack_JSON.bg_SlackChannelResponse_JSON slackChannelResponse = bg_JSONUtils.deserializeSlackChannelResults(responseBody);
  28.  
  29. // Check we have slack channels
  30. if (slackChannelResponse != null)
  31. {
  32. List<Slack_Channel__c> channels = new List<Slack_Channel__c>();
  33.  
  34. // Create slack channel records
  35. for (bg_Slack_JSON.bg_SlackChannel_JSON channel : slackChannelResponse.channels)
  36. {
  37. channels.add(new Slack_Channel__c(Channel_Id__c = channel.Id, Name = channel.name));
  38. }
  39.  
  40. // If we have slack channels to create/update, then do so
  41. if (!channels.isEmpty())
  42. {
  43. try
  44. {
  45. upsert channels Channel_Id__c;
  46. }
  47. catch(DmlException e)
  48. {
  49. System.debug(LoggingLevel.ERROR, '***** DmlException - ' + e.getDmlMessage(0));
  50. }
  51. catch(Exception e)
  52. {
  53. System.debug(LoggingLevel.ERROR, '***** Exception - ' + e.getMessage());
  54. }
  55. }
  56. }
  57. }
  58. }
  59.  
  60. // A method to process slack messages
  61. public static void processSlackMessages(String channelId)
  62. {
  63. // Get slack messages
  64. HttpResponse response = bg_SlackAPIUtils.getSlackFeed(channelId);
  65.  
  66. // Check we have a response
  67. if (response != null)
  68. {
  69. // Get response body
  70. String responseBody = response.getBody();
  71.  
  72. // Get slack messages
  73. bg_Slack_JSON.bg_SlackMessageResponse_JSON slackMessageResponse = bg_JSONUtils.deserializeSlackMessageResults(responseBody);
  74.  
  75. // Check we have slack messages
  76. if (slackMessageResponse != null)
  77. {
  78. // Get slack chanel Salesforce record that the messages belong to
  79. Slack_Channel__c slackChannel = bg_SlackChannelUtils.getSlackChannelByChannelId(channelId);
  80.  
  81. // Check we have a slack channel
  82. if (slackChannel != null)
  83. {
  84.  
  85. List<Slack_Message__c> messages = new List<Slack_Message__c>();
  86.  
  87. // Create slack message records
  88. for (bg_Slack_JSON.bg_SlackMessage_JSON message : slackMessageResponse.messages)
  89. {
  90. // Format slack timestamp so we can convert into a valid DateTime
  91. String unixTimestamp = message.ts;
  92. String formattedUTX = unixTimestamp.substring(0, unixTimestamp.indexOf('.')).rightPad(13, '0');
  93.  
  94. DateTime timestamp = DateTime.newInstance(Long.valueOf(formattedUTX));
  95.  
  96. // Create slack message id
  97. String slackMessageId = unixTimestamp.remove('.') + message.user;
  98.  
  99. messages.add(new Slack_Message__c(Message__c = message.text, Slack_Channel__c = slackChannel.Id, Slack_User_Id__c = message.user, Timestamp__c = timestamp, Slack_Message_Id__c = slackMessageId.toUpperCase()));
  100. }
  101.  
  102. // If we have slack messages to insert/update, then do so
  103. if (!messages.isEmpty())
  104. {
  105. try
  106. {
  107. upsert messages Slack_Message_Id__c;
  108. }
  109. catch(DmlException e)
  110. {
  111. System.debug(LoggingLevel.ERROR, '***** DmlException - ' + e.getDmlMessage(0));
  112. }
  113. catch(Exception e)
  114. {
  115. System.debug(LoggingLevel.ERROR, '***** Exception - ' + e.getMessage());
  116. }
  117. }
  118. }
  119. }
  120. }
  121. }
  122.  
  123. // A method to process a slack user
  124. public static void processSlackUser()
  125. {
  126.  
  127. }
  128.  
  129. // A method to process a slack team
  130. public static void processSlackTeam()
  131. {
  132. // Get slack team
  133. HttpResponse response = bg_SlackAPIUtils.getSlackTeam();
  134.  
  135. // Check we have a response
  136. if (response != null)
  137. {
  138. // Get response body
  139. String responseBody = response.getBody();
  140.  
  141. // Get slack messages
  142. bg_Slack_JSON.bg_SlackTeamResponse_JSON slackTeamResponse = bg_JSONUtils.deserializeSlackTeamResults(responseBody);
  143.  
  144. // Check we have slack messages
  145. if (slackTeamResponse != null)
  146. {
  147. List<Slack_User__c> users = new List<Slack_User__c>();
  148.  
  149. // Create slack User records
  150. for (bg_Slack_JSON.bg_SlackTeamMember_JSON member : slackTeamResponse.members)
  151. {
  152. users.add(new Slack_User__c(Slack_User_Id__c = member.id, Slack_Avatar_Photo_URL__c = member.profile.image_48, Slack_Real_Name__c = member.profile.real_name_normalized, Slack_Display_Name__c = member.profile.display_name_normalized));
  153. }
  154.  
  155. // If we have slack users to insert/update, then do so
  156. if (!users.isEmpty())
  157. {
  158. try
  159. {
  160. upsert users Slack_User_Id__c;
  161. }
  162. catch(DmlException e)
  163. {
  164. System.debug(LoggingLevel.ERROR, '***** DmlException - ' + e.getDmlMessage(0));
  165. }
  166. catch(Exception e)
  167. {
  168. System.debug(LoggingLevel.ERROR, '***** Exception - ' + e.getMessage());
  169. }
  170. }
  171. }
  172. }
  173. }
  174.  
  175. /************************************************************************
  176. WRAPPERS
  177. *************************************************************************/
  178.  
  179. // Slack channel wrapper class
  180. public class bg_SlackChannelWrapper
  181. {
  182. // bg_SlackChannelWrapper public members
  183. public String channelId;
  184. public String channelName;
  185. public String formattedLastRefreshDate;
  186. public String formattedLastRefreshTime;
  187.  
  188. public DateTime lastRefreshDate;
  189.  
  190. public List<bg_SlackActionWrapper> actions;
  191.  
  192. public void initializeWrapper(String channelId, String channelName, DateTime lastRefreshDate)
  193. {
  194. this.channelId = channelId;
  195. this.channelName = channelName;
  196.  
  197. this.lastRefreshDate = lastRefreshDate;
  198.  
  199. actions = new List<bg_SlackActionWrapper>();
  200.  
  201. setRefreshDateTime(lastRefreshDate);
  202. }
  203.  
  204. // A method to build channel messages
  205. public void setMessages(Map<Id, Slack_Message__c> slackMessages, Map<String, Slack_User__c> slackUsersBySlackUserId)
  206. {
  207. // Clearing out existing actions
  208. if (actions.size() > 0)
  209. {
  210. actions.clear();
  211. }
  212.  
  213. Map<String, bg_SlackActionWrapper> actionsByDate = new Map<String, bg_SlackActionWrapper>();
  214.  
  215. String previousMessageSenderId;
  216. DateTime previousMessageSendTime;
  217. Slack_Message__c previousMessage;
  218. boolean multiMessage = false;
  219. boolean previousMultiMessageValue = false;
  220. Integer counter;
  221.  
  222. // Build up channel actions
  223. for (Slack_Message__c message : slackMessages.values())
  224. {
  225. String formatDate = message.Timestamp__c.format('dd/MM/yy');
  226.  
  227. bg_SlackActionWrapper actionWrapper;
  228.  
  229. // Check we do not already have a bg_SlackActionWrapper in memory for this date
  230. // If not, create one
  231. if (!actionsByDate.containsKey(formatDate))
  232. {
  233. String dateDisplayString;
  234.  
  235. Date today = Date.today();
  236. Date yesterday = Date.today().addDays(-1);
  237.  
  238. // Calculate if message date is today or yesterday. Otherwise just display the date.
  239. if (today.format() == message.Timestamp__c.format('dd/MM/yyyy'))
  240. {
  241. dateDisplayString = 'Today';
  242. }
  243. else if(yesterday.format() == message.Timestamp__c.format('dd/MM/yyyy'))
  244. {
  245. dateDisplayString = 'Yesterday';
  246. }
  247. else
  248. {
  249. dateDisplayString = formatDate;
  250. }
  251.  
  252. actionWrapper = new bg_SlackActionWrapper(dateDisplayString);
  253. actionsByDate.put(formatDate, actionWrapper);
  254. actions.add(actionWrapper);
  255. }
  256. else
  257. {
  258. actionWrapper = actionsByDate.get(formatDate);
  259. }
  260.  
  261. // Get slack user record by slack user id
  262. Slack_User__c slackUser = slackUsersBySlackUserId.get(message.Slack_User_Id__c);
  263.  
  264. String messageText;
  265.  
  266. // Check if message contains a mention
  267. if(message.Message__c.contains('@'))
  268. {
  269. messageText = bg_SlackMessageUtils.setMessageMentions(message.Message__c, slackUsersBySlackUserId);
  270. }
  271. else
  272. {
  273. messageText = message.Message__c;
  274. }
  275.  
  276. String displayName;
  277.  
  278. if (slackUser.slack_Display_Name__c != null)
  279. {
  280. displayName = slackUser.Slack_Display_Name__c;
  281. }
  282. else
  283. {
  284. displayName = slackUser.Slack_Real_Name__c;
  285. }
  286.  
  287. if(previousMessage != null)
  288. {
  289. if(previousMessage.Slack_User_Id__c != null && previousMessage.Timestamp__c != null)
  290. {
  291. if(message.Slack_User_Id__c.Equals(previousMessage.Slack_User_Id__c))
  292. {
  293.  
  294. if(message.Timestamp__c.getTime() - previousMessage.Timestamp__c.getTime() < 300000)
  295. {
  296. multiMessage = true;
  297. System.debug(LoggingLevel.ERROR, '****CP previousMessage text before current text is applied= ' + previousMessage.Message__c);
  298. previousMessage.Message__c += '\n' + message.Message__c;
  299. System.debug(LoggingLevel.ERROR, '****CP updatedMessage = ' + previousMessage);
  300. System.debug(LoggingLevel.ERROR, '****CP updatedMessage text = ' + previousMessage.Message__c);
  301. }
  302. else
  303. {
  304. multiMessage = false;
  305. }
  306. //check previous send time is within 5 minutes and create a new wrapper if they are.
  307. //Need to create a multipleMessageWrapper - maybe
  308. //if time of second date in millis - previousdate in millis is less than 300000, they are within 5 minutes.
  309. //add a css tooltip to the messages with the time.
  310. }
  311. else
  312. {
  313. multiMessage = false;
  314. }
  315. }
  316.  
  317. }
  318. else
  319. {
  320. multiMessage = false;
  321. }
  322.  
  323. if(previousMessage != null)
  324. {
  325.  
  326. }
  327.  
  328. System.debug(LoggingLevel.ERROR, 'mutlimessage = ' + multimessage);
  329. System.debug(LoggingLevel.ERROR, 'previousMultiMessageValue = ' + previousMultiMessageValue);
  330. if(!multiMessage && previousMultiMessageValue)
  331. {
  332. System.Debug(LoggingLevel.ERROR, '&&&&&CP multiMessage is false and previous value was true, creating multi message');
  333. System.Debug(LoggingLevel.ERROR, '&&&&&CP message to be created = ' + PreviousMessage.Message__c);
  334. // Create channel messages and add it to the action wrapper messages collection
  335. actionWrapper.messages.add(new bg_SlackMessageWrapper(previousMessage.Slack_User_Id__c, displayName, previousMessage.Message__c, previousMessage.Timestamp__c, slackUser.Slack_Avatar_Photo_URL__c));
  336.  
  337. if(!message.Slack_User_Id__c.Equals(previousMessage.Slack_User_Id__c))
  338. {
  339. actionWrapper.messages.add(new bg_SlackMessageWrapper(message.Slack_User_Id__c, displayName, messageText, message.Timestamp__c, slackUser.Slack_Avatar_Photo_URL__c));
  340. }
  341.  
  342. previousMessage = message;
  343.  
  344. }
  345. else if(!multiMessage && !previousMultiMessageValue)
  346. {
  347. System.Debug(LoggingLevel.ERROR, '&&&&&CP multiMessage is false and previous value was false, creating normal message');
  348. actionWrapper.messages.add(new bg_SlackMessageWrapper(message.Slack_User_Id__c, displayName, messageText, message.Timestamp__c, slackUser.Slack_Avatar_Photo_URL__c));
  349. //previousMessage = message;
  350. }
  351.  
  352. // Create channel messages and add it to the action wrapper messages collection
  353. //actionWrapper.messages.add(new bg_SlackMessageWrapper(message.Slack_User_Id__c, displayName, messageText, message.Timestamp__c, slackUser.Slack_Avatar_Photo_URL__c));
  354.  
  355.  
  356. previousMultiMessageValue = multiMessage;
  357. //previousMessageSendTime = message.Timestamp__c;
  358. }
  359. }
  360.  
  361. // A method to format the last refresh date/time
  362. private void setRefreshDateTime(DateTime lastRefreshDate)
  363. {
  364. if (lastRefreshDate != null)
  365. {
  366. formattedLastRefreshDate = lastRefreshDate.format('dd/MM/yy');
  367. formattedLastRefreshTime = lastRefreshDate.format('h:mm a');
  368. }
  369. }
  370. }
  371.  
  372. // Slack action wrapper class
  373. public class bg_SlackActionWrapper
  374. {
  375. // bg_SlackActionWrapper public members
  376. public String formatDate;
  377.  
  378. public List<bg_SlackMessageWrapper> messages;
  379.  
  380. public bg_SlackActionWrapper(String formatDate)
  381. {
  382. this.formatDate = formatDate;
  383.  
  384. messages = new List<bg_SlackMessageWrapper>();
  385. }
  386. }
  387.  
  388. // Slack messages wrapper class
  389. public class bg_SlackMessageWrapper
  390. {
  391. // bg_SlackMessageWrapper public members
  392. public String userId;
  393. public String realName;
  394. public String firstName;
  395. public String lastName;
  396. public String message;
  397. public String formattedDate;
  398. public String formattedTime;
  399. public String avatarUrl;
  400.  
  401. // bg_SlackMessageWrapper private members
  402. private DateTime timestamp;
  403.  
  404. private Date postDate;
  405.  
  406. private Time postTime;
  407.  
  408. public bg_SlackMessageWrapper(String userId, String realName, String message, DateTime timestamp, String avatarUrl)
  409. {
  410. this.userId = userId;
  411. this.realName = realName;
  412. this.message = message;
  413. this.avatarUrl = avatarUrl;
  414.  
  415. setPostDateTime(timestamp);
  416. }
  417.  
  418. // A method to format the post date/time
  419. private void setPostDateTime(DateTime timestamp)
  420. {
  421. formattedDate = timestamp.format('dd/MM/yy');
  422. formattedTime = timestamp.format('h:mm a');
  423. timestamp = timestamp;
  424. }
  425. }
  426.  
  427. /* Slack Multiple message wrapper - May not need this, could just append the message from each slack message to the previous
  428. one on a new line?
  429.  
  430. public class bg_SlackMultipleMessageWrapper
  431. {
  432. // bg_SlackMessageWrapper public members
  433. public String userId;
  434. public String realName;
  435. public String firstName;
  436. public String lastName;
  437. public String message;
  438. public String formattedDate;
  439. public String formattedTime;
  440. public String avatarUrl;
  441.  
  442. // bg_SlackMessageWrapper private members
  443. private DateTime timestamp;
  444.  
  445. private Date postDate;
  446.  
  447. private Time postTime;
  448.  
  449. public bg_SlackMultipleMessageWrapper(String userId, String realName, List<String> messages, DateTime timestamp, String avatarUrl)
  450. {
  451. this.userId = userId;
  452. this.realName = realName;
  453. this.message = message;
  454. this.avatarUrl = avatarUrl;
  455.  
  456. setPostDateTime(timestamp);
  457. }
  458. }*/
  459. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement