Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import { Injectable, Logger } from '@nestjs/common';
- import { FacebookEventEntry, FacebookEventEventValue } from '../../interfaces/FbWebhookEvent';
- import { CachingRedisCrudService } from '../redis-connection/caching-redis-crud/caching-redis-crud.service';
- import { MaxLogger } from '../logger.service';
- import { FacebookGraphApiService } from '../facebook-graph-api/facebook-graph-api.service';
- import { MessengerRedisCrudService } from '../redis-connection/messenger-redis-crud/messenger-redis-crud.service';
- import { PubSubRedisCrudService } from '../redis-connection/pub-sub-redis-crud/pub-sub-redis-crud.service';
- import { MessengerTemplateRendererV2Service } from '../messenger-template-renderer-v2/messenger-template-renderer-v2.service';
- import { sleep } from '../../../common';
- import * as cJ from 'circular-json';
- import { AxiosResponse } from 'axios';
- import { LogRedisCrudService } from '../redis-connection/log-redis-crud/log-redis-crud.service';
- import { ConfigService } from '../config.service';
- @Injectable()
- export class FacebookFeedService {
- constructor(
- private readonly cachingRedisService: CachingRedisCrudService,
- private readonly messengerRedisService: MessengerRedisCrudService,
- private readonly facebookGraphApiService: FacebookGraphApiService,
- private readonly pubSubRedisCrudService: PubSubRedisCrudService,
- private readonly logRedisCrudService: LogRedisCrudService,
- private readonly messengerTemplateRenderer: MessengerTemplateRendererV2Service,
- private readonly config: ConfigService,
- private maxLogger: MaxLogger,
- ) {
- }
- async processEvent(eventData: FacebookEventEntry) {
- const pageId = eventData.id;
- if (pageId === '349237912563624' || this.config.Env === 'production') {
- // if (pageId === '409027152641016' || this.config.Env === 'production') {
- eventData.changes.forEach(change => {
- const eventFromId = change.value.from && change.value.from.id;
- if (!eventFromId || eventFromId === pageId) {
- return;
- }
- switch (change.value.item) {
- case 'comment':
- this.processCommentEvent(change.value, pageId).then();
- return;
- default:
- return;
- }
- });
- }
- }
- async processCommentEvent(eventData: FacebookEventEventValue, pageId: string) {
- const accessToken = await this.cachingRedisService.hget(`max_page:${pageId}`, 'access_token');
- if (accessToken) {
- const campaignId = await this.getCampaignAutoRelyId(eventData, pageId, accessToken);
- // Logger.log(campaignId, 'campaignId');
- if (campaignId) {
- this.processCampaignAutoReply(pageId, campaignId, eventData, accessToken).then();
- }
- } else {
- this.maxLogger.logToSlack(
- 'Get access token failed',
- 'MAX GATEWAY',
- ``,
- { pageId },
- 'modules/consumer-page/providers/services/facebook-feed/facebook-feed.service => processCommentEvent',
- 'danger');
- }
- }
- private async getCampaignAutoRelyId(eventData: FacebookEventEventValue, pageId: string, accessToken: string) {
- const postId = eventData.post_id;
- const parentId = eventData.parent_id;
- let campaignId;
- // post
- campaignId = await this.cachingRedisService.get(`max_post:${postId}`);
- if (!campaignId) {
- // child post
- campaignId = await this.cachingRedisService.get(`max_post:${parentId}`);
- }
- if (!campaignId) {
- const promotableRes = (await this.facebookGraphApiService.getPostInfo(pageId, postId, accessToken, ['link', 'promotable_id']));
- Logger.log(promotableRes, 'promotableRes');
- if (promotableRes) {
- const { promotable_id: promotableId, link: postLink } = promotableRes;
- // child comment in child post
- campaignId = await this.cachingRedisService.get(`max_post:${promotableId}`);
- if (!campaignId) {
- // albums
- campaignId = await this.cachingRedisService.get(`max_post:${pageId}_${postLink.split('/')[6]}`);
- }
- }
- }
- return campaignId;
- }
- async processCampaignAutoReply(pageId: string, campaignId: string, eventData: FacebookEventEventValue, accessToken: string) {
- Logger.log(eventData, 'processCampaignAutoReply');
- if (eventData.verb === 'add') {
- Logger.log({ eventData, campaignId }, 'processCampaignAutoReply');
- const commentId = eventData.comment_id;
- const message = eventData.message;
- const photo = eventData.photo;
- const PSID = eventData.from.id;
- const campaignInfo = await this.cachingRedisService.hgetall(`max_cam:${campaignId}`);
- // Logger.log(campaignInfo, 'campaignInfo');
- const PSIDInfoFromApi = await this.messengerTemplateRenderer.getInfoPSID(PSID, pageId, false);
- const PSIDInfo = {
- PSID,
- full_name: eventData.from.name,
- ...(PSIDInfoFromApi ? PSIDInfoFromApi : {}),
- };
- // @ts-ignore
- if (campaignInfo && campaignInfo.properties) {
- // @ts-ignore
- const campaignProps = JSON.parse(campaignInfo.properties);
- // Logger.log(campaignProps, 'campaignProps');
- const {
- is_delay: isDelay,
- delay_time: delayTime,
- message_cmt: messageCmt,
- message_msg: messageMsg,
- patterns,
- } = campaignProps;
- if (patterns && patterns.length > 0) {
- const matchPattern = patterns.reduce((result, pattern) => result && new RegExp(`\\${pattern}`).test(message.trim().toLowerCase()), true);
- if (!matchPattern) {
- return;
- }
- }
- const postId = eventData.post_id;
- const parentId = eventData.parent_id;
- let allowCmt = true, allowMsg = true, replyComment = true;
- if (postId !== parentId) {
- if (postId.split('_')[1] === parentId.split('_')[0]) {
- allowCmt = false;
- }
- }
- // Logger.log(allowCmt ? 'true' : 'false', `allowCmt ${PSID}`);
- if (isDelay) {
- await sleep(delayTime);
- }
- if (messageCmt && allowCmt) {
- const messageToCmt = this.messengerTemplateRenderer.generateText(messageCmt, PSIDInfo, 800);
- const responsePostComment = await this.facebookGraphApiService.postComment(commentId, messageToCmt, accessToken, true);
- if (!responsePostComment) {
- replyComment = false;
- } else {
- Logger.log(`success reply comment ${commentId} => by ${responsePostComment.data.id}`, 'postComment');
- }
- }
- if (messageMsg && allowMsg) {
- let msgToSend = this.messengerTemplateRenderer.generateText(messageMsg, PSIDInfo, 800);
- if (message) {
- msgToSend = `${msgToSend}\n\nLời nhắn của bạn: _${message}_`;
- if (photo) {
- msgToSend = `${msgToSend}\nPhoto của bạn: ${photo}`;
- }
- } else {
- if (photo) {
- msgToSend = `${msgToSend}\nPhoto của bạn: ${photo}`;
- }
- }
- const responseSendPrivateReply = await this.facebookGraphApiService.sendPrivateReply(commentId, msgToSend, accessToken, true);
- if (responseSendPrivateReply) {
- Logger.log(`success reply comment ${commentId} => by ${responseSendPrivateReply.data.id}`, 'sendPrivateReply');
- this.messengerRedisService.hmset(`max:auto-reply:${PSID}`, {
- campaign_id: +campaignId,
- page_id: +pageId,
- }, 7 * 24 * 60 * 60);
- this.logRedisCrudService.publish(`max:messenger:auto-reply`, {
- fromComponent: 'max-gateway',
- page_id: pageId,
- campaign_id: campaignId,
- pagescope_id: PSID,
- });
- }
- // this.facebookGraphApiService.sendPrivateReply(commentId, msgToSend, accessToken)
- // .then((resp: AxiosResponse) => {
- // if (resp.data && resp.data.id) {
- // // this.messengerRedisService.hmset(`max:auto-reply:${PSID}`, {
- // // campaign_id: campaignId,
- // // page_id: pageId,
- // // }, 7 * 24 * 60 * 60);
- // // this.pubSubRedisCrudService.publish(`max:messenger:auto-reply`, {
- // // fromComponent: 'max-fe',
- // // page_id: pageId,
- // // campaign_id: campaignId,
- // // pagescope_id: PSID,
- // // });
- // } else {
- // this.maxLogger.logToSlack(
- // '[FB Graph API] sendPrivateReply failed',
- // 'MAX GATEWAY',
- // `errAPI: ${resp.data.error.message}`,
- // { commentId, msgToSend },
- // 'shared/providers/services/facebook-graph-api/facebook-graph-api.service => sendPrivateReply',
- // 'danger');
- // }
- // })
- // .catch((e) => {
- // // this.maxLogger.logToSlack(
- // // '[FB Graph API] sendPrivateReply failed',
- // // 'MAX GATEWAY',
- // // `err: ${e}`,
- // // { commentId, msgToSend },
- // // 'shared/providers/services/facebook-graph-api/facebook-graph-api.service => sendPrivateReply',
- // // 'danger');
- // });
- }
- } else {
- this.maxLogger.logToSlack(
- 'Not found campaign',
- 'MAX GATEWAY',
- ``,
- { campaignId },
- 'modules/consumer-page/providers/services/facebook-feed/facebook-feed.service => processCampaignAutoReply',
- 'danger');
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement