Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ module.exports = {
'@typescript-eslint/ban-ts-comment': 'off',
'@typescript-eslint/no-var-requires': 'warn',
'@typescript-eslint/ban-types': 'warn',
'@typescript-eslint/no-non-null-assertion': 'off',
},
overrides: [
{
Expand Down
2 changes: 1 addition & 1 deletion lerna.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"lerna": "3.4.0",
"npmClient": "yarn",
"useWorkspaces": true,
"version": "1.5.0-alpha.14",
"version": "1.5.1-alpha.2",
"command": {
"publish": {
"ignoreChanges": [
Expand Down
4 changes: 2 additions & 2 deletions packages/bottender-dialogflow/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
"type": "git",
"url": "https://github.com/Yoctol/bottender.git"
},
"version": "1.5.0-alpha.14",
"version": "1.5.1-alpha.1",
"main": "dist/index.js",
"files": [
"dist"
Expand All @@ -21,7 +21,7 @@
"bottender": ">= 1.2.0-0"
},
"devDependencies": {
"bottender": "^1.5.0-alpha.14"
"bottender": "^1.5.1-alpha.1"
},
"keywords": [
"bot",
Expand Down
2 changes: 1 addition & 1 deletion packages/bottender-express/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"type": "git",
"url": "https://github.com/Yoctol/bottender.git"
},
"version": "1.5.0-alpha.14",
"version": "1.5.1-alpha.0",
"main": "dist/index.js",
"files": [
"dist"
Expand Down
8 changes: 3 additions & 5 deletions packages/bottender-facebook/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"type": "git",
"url": "https://github.com/Yoctol/bottender.git"
},
"version": "1.5.0-alpha.14",
"version": "1.5.1-alpha.2",
"main": "dist/index.js",
"files": [
"dist"
Expand All @@ -19,11 +19,9 @@
"warning": "^4.0.3"
},
"peerDependencies": {
"bottender": ">= 1.5.0-alpha.13",
"messaging-api-messenger": ">= 1.0.0-beta.26"
"bottender": ">= 1.5.1-alpha.1"
},
"devDependencies": {
"bottender": "^1.5.0-alpha.14",
"messaging-api-messenger": "^1.0.0-beta.26"
"bottender": "^1.5.1-alpha.1"
}
}
2 changes: 1 addition & 1 deletion packages/bottender-facebook/src/FacebookBatch.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import querystring from 'querystring';

import { MessengerTypes } from 'messaging-api-messenger';
import { MessengerTypes } from 'bottender';

import * as Types from './FacebookTypes';

Expand Down
2 changes: 1 addition & 1 deletion packages/bottender-facebook/src/FacebookClient.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import AxiosError from 'axios-error';
import get from 'lodash/get';
import { MessengerClient, MessengerTypes } from 'messaging-api-messenger';
import { MessengerClient, MessengerTypes } from 'bottender';

import * as Types from './FacebookTypes';

Expand Down
39 changes: 22 additions & 17 deletions packages/bottender-facebook/src/FacebookConnector.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,19 @@ import {
MessengerConnector,
MessengerContext,
MessengerEvent,
MessengerTypes,
RequestContext,
} from 'bottender';

import FacebookClient from './FacebookClient';
import FacebookContext from './FacebookContext';
import FacebookEvent from './FacebookEvent';

type FacebookRequestBody = Record<string, any>;
import { ChangesEntry, FacebookWebhookRequestBody } from './FacebookTypes';

// TODO: use exported type
type Session = Record<string, any>;

type ConstructorOptions = {
export type FacebookConnectorOptions = {
appId: string;
appSecret: string;
accessToken?: string;
Expand All @@ -34,13 +34,13 @@ type ConstructorOptions = {
};

export default class FacebookConnector
extends FacebookBaseConnector<FacebookRequestBody, FacebookClient>
implements Connector<FacebookRequestBody, FacebookClient> {
extends FacebookBaseConnector<FacebookWebhookRequestBody, FacebookClient>
implements Connector<FacebookWebhookRequestBody, FacebookClient> {
_mapPageToAccessToken: ((pageId: string) => Promise<string>) | null = null;

_messengerConnector: MessengerConnector;

public constructor(options: ConstructorOptions) {
public constructor(options: FacebookConnectorOptions) {
super({
...options,
ClientClass: FacebookClient,
Expand Down Expand Up @@ -107,37 +107,42 @@ export default class FacebookConnector
}

public mapRequestToEvents(
body: FacebookRequestBody
body: FacebookWebhookRequestBody
): (FacebookEvent | MessengerEvent)[] {
// TODO: returns InstagramEvent (object === 'instagram')
if (body.object !== 'page') {
return [];
}

return body.entry
.map((rawEvent: any) => {
const pageId = rawEvent.id;
if (rawEvent.messaging) {
return new MessengerEvent(rawEvent.messaging[0], {
const bodyEntry: (MessengerTypes.MessagingEntry | ChangesEntry)[] =
body.entry;

return bodyEntry
.map<FacebookEvent | MessengerEvent | null>(entry => {
const pageId = entry.id;
if ('messaging' in entry) {
return new MessengerEvent(entry.messaging[0], {
pageId,
isStandby: false,
});
}

if (rawEvent.standby) {
return new MessengerEvent(rawEvent.standby[0], {
if ('standby' in entry) {
return new MessengerEvent(entry.standby[0], {
pageId,
isStandby: true,
});
}

if (rawEvent.changes) {
return new FacebookEvent(rawEvent.changes[0], { pageId });
if ('changes' in entry) {
return new FacebookEvent(entry.changes[0], { pageId });
}

return null;
})
.filter((event: any) => event !== null);
.filter(
(event): event is FacebookEvent | MessengerEvent => event !== null
);
}

public async createContext(params: {
Expand Down
56 changes: 35 additions & 21 deletions packages/bottender-facebook/src/FacebookContext.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,23 @@
import { EventEmitter } from 'events';

import warning from 'warning';
import { Context, MessengerTypes, RequestContext } from 'bottender';
import { MessengerBatch } from 'messaging-api-messenger';
import {
Context,
MessengerBatch,
MessengerTypes,
RequestContext,
} from 'bottender';
import { MessengerBatchQueue } from 'messenger-batch';

import FacebookBatch from './FacebookBatch';
import FacebookClient from './FacebookClient';
import FacebookEvent, { Comment } from './FacebookEvent';
import FacebookEvent from './FacebookEvent';
import * as Types from './FacebookTypes';

// TODO: use exported type
type Session = Record<string, any>;

type Options = {
export type FacebookContextOptions = {
appId?: string;
client: FacebookClient;
event: FacebookEvent;
Expand Down Expand Up @@ -45,7 +49,7 @@ export default class FacebookContext extends Context<
customAccessToken,
batchQueue,
emitter,
}: Options) {
}: FacebookContextOptions) {
super({ client, event, session, initialState, requestContext, emitter });
this._customAccessToken = customAccessToken;
this._batchQueue = batchQueue || undefined;
Expand Down Expand Up @@ -75,19 +79,23 @@ export default class FacebookContext extends Context<
return;
}

if (this._event.rawEvent.value.verb === 'remove') {
const value = this._event.rawEvent.value as
| Types.FeedPost
| Types.FeedComment;

if (value.verb === 'remove') {
warning(false, "sendText: can't work with remove verb");
return;
}

let recipient;
if (this._event.rawEvent.value.item === 'comment') {
if (value.item === 'comment') {
recipient = {
commentId: this._event.rawEvent.value.commentId,
commentId: value.commentId,
};
} else {
recipient = {
postId: this._event.rawEvent.value.postId,
postId: value.postId,
};
}

Expand Down Expand Up @@ -119,18 +127,22 @@ export default class FacebookContext extends Context<
return;
}

if (this._event.rawEvent.value.verb === 'remove') {
const value = this._event.rawEvent.value as
| Types.FeedPost
| Types.FeedComment;

if (value.verb === 'remove') {
warning(false, "sendMessage: can't work with remove verb");
}

let recipient;
if (this._event.rawEvent.value.item === 'comment') {
if (value.item === 'comment') {
recipient = {
commentId: this._event.rawEvent.value.commentId,
commentId: value.commentId,
};
} else {
recipient = {
postId: this._event.rawEvent.value.postId,
postId: value.postId,
};
}

Expand Down Expand Up @@ -159,10 +171,10 @@ export default class FacebookContext extends Context<
let objectId;
if (this._event.isComment) {
objectId = this._event.isFirstLayerComment
? (this._event.rawEvent.value as Comment).commentId
: (this._event.rawEvent.value as Comment).parentId;
? (this._event.rawEvent.value as Types.FeedComment).commentId
: (this._event.rawEvent.value as Types.FeedComment).parentId;
} else if (this._event.isPost) {
objectId = (this._event.rawEvent.value as Comment).postId;
objectId = (this._event.rawEvent.value as Types.FeedComment).postId;
}

// TODO: support more type: Album, Event, Life Event, Link, Live Video, Note, Photo, Thread, User, Video
Expand Down Expand Up @@ -194,9 +206,9 @@ export default class FacebookContext extends Context<
public async sendLike(): Promise<{ success: boolean }> {
let objectId;
if (this._event.isComment) {
objectId = (this._event.rawEvent.value as Comment).commentId;
objectId = (this._event.rawEvent.value as Types.FeedComment).commentId;
} else if (this._event.isPost) {
objectId = (this._event.rawEvent.value as Comment).postId;
objectId = (this._event.rawEvent.value as Types.FeedComment).postId;
}

// TODO: support more type: Album, Event, Life Event, Link, Live Video, Note, Photo, Thread, User, Video
Expand All @@ -223,7 +235,8 @@ export default class FacebookContext extends Context<
public async getComment(
options: Types.GetCommentOptions
): Promise<Types.Comment | null> {
const commentId = (this._event.rawEvent.value as Comment).commentId;
const commentId = (this._event.rawEvent.value as Types.FeedComment)
.commentId;

if (!commentId) {
warning(false, 'Could not getComment if there is no comment.');
Expand All @@ -248,8 +261,9 @@ export default class FacebookContext extends Context<
*
* @param options -
*/
public getLikes(options: Types.GetLikesOptions) {
const objectId = (this._event.rawEvent.value as Comment).commentId; // FIXME: postId
public getLikes(options: Types.GetLikesOptions): Promise<Types.Likes> {
const objectId = (this._event.rawEvent.value as Types.FeedComment)
.commentId; // FIXME: postId

if (this._batchQueue) {
return this._batchQueue.push(
Expand Down
Loading