Advertisement
Guest User

Untitled

a guest
Mar 22nd, 2019
207
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import { Injectable, Logger } from '@nestjs/common';
  2. import { FacebookEventEntry, FacebookEventEventValue } from '../../interfaces/FbWebhookEvent';
  3. import { CachingRedisCrudService } from '../redis-connection/caching-redis-crud/caching-redis-crud.service';
  4. import { MaxLogger } from '../logger.service';
  5. import { FacebookGraphApiService } from '../facebook-graph-api/facebook-graph-api.service';
  6. import { MessengerRedisCrudService } from '../redis-connection/messenger-redis-crud/messenger-redis-crud.service';
  7. import { PubSubRedisCrudService } from '../redis-connection/pub-sub-redis-crud/pub-sub-redis-crud.service';
  8. import { MessengerTemplateRendererV2Service } from '../messenger-template-renderer-v2/messenger-template-renderer-v2.service';
  9. import { sleep } from '../../../common';
  10. import * as cJ from 'circular-json';
  11. import { AxiosResponse } from 'axios';
  12. import { LogRedisCrudService } from '../redis-connection/log-redis-crud/log-redis-crud.service';
  13. import { ConfigService } from '../config.service';
  14.  
  15. @Injectable()
  16. export class FacebookFeedService {
  17.   constructor(
  18.     private readonly cachingRedisService: CachingRedisCrudService,
  19.     private readonly messengerRedisService: MessengerRedisCrudService,
  20.     private readonly facebookGraphApiService: FacebookGraphApiService,
  21.     private readonly pubSubRedisCrudService: PubSubRedisCrudService,
  22.     private readonly logRedisCrudService: LogRedisCrudService,
  23.     private readonly messengerTemplateRenderer: MessengerTemplateRendererV2Service,
  24.     private readonly config: ConfigService,
  25.     private maxLogger: MaxLogger,
  26.   ) {
  27.   }
  28.  
  29.   async processEvent(eventData: FacebookEventEntry) {
  30.     const pageId = eventData.id;
  31.     if (pageId === '349237912563624' || this.config.Env === 'production') {
  32.     // if (pageId === '409027152641016' || this.config.Env === 'production') {
  33.       eventData.changes.forEach(change => {
  34.         const eventFromId = change.value.from && change.value.from.id;
  35.         if (!eventFromId || eventFromId === pageId) {
  36.           return;
  37.         }
  38.         switch (change.value.item) {
  39.           case 'comment':
  40.             this.processCommentEvent(change.value, pageId).then();
  41.             return;
  42.           default:
  43.             return;
  44.         }
  45.       });
  46.     }
  47.   }
  48.  
  49.   async processCommentEvent(eventData: FacebookEventEventValue, pageId: string) {
  50.     const accessToken = await this.cachingRedisService.hget(`max_page:${pageId}`, 'access_token');
  51.     if (accessToken) {
  52.       const campaignId = await this.getCampaignAutoRelyId(eventData, pageId, accessToken);
  53.       // Logger.log(campaignId, 'campaignId');
  54.       if (campaignId) {
  55.         this.processCampaignAutoReply(pageId, campaignId, eventData, accessToken).then();
  56.       }
  57.     } else {
  58.       this.maxLogger.logToSlack(
  59.         'Get access token failed',
  60.         'MAX GATEWAY',
  61.         ``,
  62.         { pageId },
  63.         'modules/consumer-page/providers/services/facebook-feed/facebook-feed.service => processCommentEvent',
  64.         'danger');
  65.     }
  66.   }
  67.  
  68.   private async getCampaignAutoRelyId(eventData: FacebookEventEventValue, pageId: string, accessToken: string) {
  69.     const postId = eventData.post_id;
  70.     const parentId = eventData.parent_id;
  71.     let campaignId;
  72.     // post
  73.     campaignId = await this.cachingRedisService.get(`max_post:${postId}`);
  74.     if (!campaignId) {
  75.       // child post
  76.       campaignId = await this.cachingRedisService.get(`max_post:${parentId}`);
  77.     }
  78.     if (!campaignId) {
  79.       const promotableRes = (await this.facebookGraphApiService.getPostInfo(pageId, postId, accessToken, ['link', 'promotable_id']));
  80.       Logger.log(promotableRes, 'promotableRes');
  81.       if (promotableRes) {
  82.         const { promotable_id: promotableId, link: postLink } = promotableRes;
  83.         // child comment in child post
  84.         campaignId = await this.cachingRedisService.get(`max_post:${promotableId}`);
  85.         if (!campaignId) {
  86.           // albums
  87.           campaignId = await this.cachingRedisService.get(`max_post:${pageId}_${postLink.split('/')[6]}`);
  88.         }
  89.       }
  90.     }
  91.     return campaignId;
  92.   }
  93.  
  94.   async processCampaignAutoReply(pageId: string, campaignId: string, eventData: FacebookEventEventValue, accessToken: string) {
  95.     Logger.log(eventData, 'processCampaignAutoReply');
  96.     if (eventData.verb === 'add') {
  97.       Logger.log({ eventData, campaignId }, 'processCampaignAutoReply');
  98.       const commentId = eventData.comment_id;
  99.       const message = eventData.message;
  100.       const photo = eventData.photo;
  101.       const PSID = eventData.from.id;
  102.       const campaignInfo = await this.cachingRedisService.hgetall(`max_cam:${campaignId}`);
  103.       // Logger.log(campaignInfo, 'campaignInfo');
  104.       const PSIDInfoFromApi = await this.messengerTemplateRenderer.getInfoPSID(PSID, pageId, false);
  105.       const PSIDInfo = {
  106.         PSID,
  107.         full_name: eventData.from.name,
  108.         ...(PSIDInfoFromApi ? PSIDInfoFromApi : {}),
  109.       };
  110.       // @ts-ignore
  111.       if (campaignInfo && campaignInfo.properties) {
  112.         // @ts-ignore
  113.         const campaignProps = JSON.parse(campaignInfo.properties);
  114.         // Logger.log(campaignProps, 'campaignProps');
  115.         const {
  116.           is_delay: isDelay,
  117.           delay_time: delayTime,
  118.           message_cmt: messageCmt,
  119.           message_msg: messageMsg,
  120.           patterns,
  121.         } = campaignProps;
  122.         if (patterns && patterns.length > 0) {
  123.           const matchPattern = patterns.reduce((result, pattern) => result && new RegExp(`\\${pattern}`).test(message.trim().toLowerCase()), true);
  124.           if (!matchPattern) {
  125.             return;
  126.           }
  127.         }
  128.         const postId = eventData.post_id;
  129.         const parentId = eventData.parent_id;
  130.         let allowCmt = true, allowMsg = true, replyComment = true;
  131.         if (postId !== parentId) {
  132.           if (postId.split('_')[1] === parentId.split('_')[0]) {
  133.             allowCmt = false;
  134.           }
  135.         }
  136.         // Logger.log(allowCmt ? 'true' : 'false', `allowCmt ${PSID}`);
  137.  
  138.         if (isDelay) {
  139.           await sleep(delayTime);
  140.         }
  141.  
  142.         if (messageCmt && allowCmt) {
  143.           const messageToCmt = this.messengerTemplateRenderer.generateText(messageCmt, PSIDInfo, 800);
  144.           const responsePostComment = await this.facebookGraphApiService.postComment(commentId, messageToCmt, accessToken, true);
  145.           if (!responsePostComment) {
  146.             replyComment = false;
  147.           } else {
  148.             Logger.log(`success reply comment ${commentId} => by ${responsePostComment.data.id}`, 'postComment');
  149.           }
  150.         }
  151.         if (messageMsg && allowMsg) {
  152.           let msgToSend = this.messengerTemplateRenderer.generateText(messageMsg, PSIDInfo, 800);
  153.           if (message) {
  154.             msgToSend = `${msgToSend}\n\nLời nhắn của bạn: _${message}_`;
  155.             if (photo) {
  156.               msgToSend = `${msgToSend}\nPhoto của bạn: ${photo}`;
  157.             }
  158.           } else {
  159.             if (photo) {
  160.               msgToSend = `${msgToSend}\nPhoto của bạn: ${photo}`;
  161.             }
  162.           }
  163.           const responseSendPrivateReply = await this.facebookGraphApiService.sendPrivateReply(commentId, msgToSend, accessToken, true);
  164.           if (responseSendPrivateReply) {
  165.             Logger.log(`success reply comment ${commentId} => by ${responseSendPrivateReply.data.id}`, 'sendPrivateReply');
  166.             this.messengerRedisService.hmset(`max:auto-reply:${PSID}`, {
  167.               campaign_id: +campaignId,
  168.               page_id: +pageId,
  169.             }, 7 * 24 * 60 * 60);
  170.             this.logRedisCrudService.publish(`max:messenger:auto-reply`, {
  171.               fromComponent: 'max-gateway',
  172.               page_id: pageId,
  173.               campaign_id: campaignId,
  174.               pagescope_id: PSID,
  175.             });
  176.           }
  177.           // this.facebookGraphApiService.sendPrivateReply(commentId, msgToSend, accessToken)
  178.           //   .then((resp: AxiosResponse) => {
  179.           //     if (resp.data && resp.data.id) {
  180.           //       // this.messengerRedisService.hmset(`max:auto-reply:${PSID}`, {
  181.           //       //   campaign_id: campaignId,
  182.           //       //   page_id: pageId,
  183.           //       // }, 7 * 24 * 60 * 60);
  184.           //       // this.pubSubRedisCrudService.publish(`max:messenger:auto-reply`, {
  185.           //       //   fromComponent: 'max-fe',
  186.           //       //   page_id: pageId,
  187.           //       //   campaign_id: campaignId,
  188.           //       //   pagescope_id: PSID,
  189.           //       // });
  190.           //     } else {
  191.           //       this.maxLogger.logToSlack(
  192.           //         '[FB Graph API] sendPrivateReply failed',
  193.           //         'MAX GATEWAY',
  194.           //         `errAPI: ${resp.data.error.message}`,
  195.           //         { commentId, msgToSend },
  196.           //         'shared/providers/services/facebook-graph-api/facebook-graph-api.service => sendPrivateReply',
  197.           //         'danger');
  198.           //     }
  199.           //   })
  200.           //   .catch((e) => {
  201.           //     // this.maxLogger.logToSlack(
  202.           //     //   '[FB Graph API] sendPrivateReply failed',
  203.           //     //   'MAX GATEWAY',
  204.           //     //   `err: ${e}`,
  205.           //     //   { commentId, msgToSend },
  206.           //     //   'shared/providers/services/facebook-graph-api/facebook-graph-api.service => sendPrivateReply',
  207.           //     //   'danger');
  208.           //   });
  209.         }
  210.  
  211.       } else {
  212.         this.maxLogger.logToSlack(
  213.           'Not found campaign',
  214.           'MAX GATEWAY',
  215.           ``,
  216.           { campaignId },
  217.           'modules/consumer-page/providers/services/facebook-feed/facebook-feed.service => processCampaignAutoReply',
  218.           'danger');
  219.       }
  220.     }
  221.   }
  222.  
  223. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement