2015-06-28 22:42:48 +00:00
'use strict' ;
2016-03-27 20:29:00 +00:00
Object . defineProperty ( exports , "__esModule" , {
2015-06-28 22:42:48 +00:00
value : true
} ) ;
2016-03-27 20:29:00 +00:00
exports . Keyboard = exports . Question = exports . Forward = exports . BulkMessage = exports . Message = exports . File = undefined ;
2015-06-28 22:42:48 +00:00
2016-03-27 20:29:00 +00:00
var _createClass = function ( ) { function defineProperties ( target , props ) { for ( var i = 0 ; i < props . length ; i ++ ) { var descriptor = props [ i ] ; descriptor . enumerable = descriptor . enumerable || false ; descriptor . configurable = true ; if ( "value" in descriptor ) descriptor . writable = true ; Object . defineProperty ( target , descriptor . key , descriptor ) ; } } return function ( Constructor , protoProps , staticProps ) { if ( protoProps ) defineProperties ( Constructor . prototype , protoProps ) ; if ( staticProps ) defineProperties ( Constructor , staticProps ) ; return Constructor ; } ; } ( ) ;
2015-06-28 22:42:48 +00:00
2016-03-27 20:29:00 +00:00
require ( 'babel-polyfill' ) ;
2015-06-28 22:42:48 +00:00
2016-03-27 20:29:00 +00:00
var _api = require ( './functions/api' ) ;
2015-06-28 22:42:48 +00:00
2016-03-27 20:29:00 +00:00
var _api2 = _interopRequireDefault ( _api ) ;
2015-06-28 22:42:48 +00:00
2016-03-27 20:29:00 +00:00
var _webhook = require ( './functions/webhook' ) ;
2015-06-28 22:42:48 +00:00
2016-03-27 20:29:00 +00:00
var _webhook2 = _interopRequireDefault ( _webhook ) ;
2015-06-28 22:42:48 +00:00
2016-03-27 20:29:00 +00:00
var _poll = require ( './functions/poll' ) ;
2015-06-28 22:42:48 +00:00
2016-03-27 20:29:00 +00:00
var _poll2 = _interopRequireDefault ( _poll ) ;
2015-06-29 22:20:34 +00:00
2016-03-27 20:29:00 +00:00
var _argumentParser = require ( './functions/argument-parser' ) ;
2015-06-29 22:20:34 +00:00
2016-03-27 20:29:00 +00:00
var _argumentParser2 = _interopRequireDefault ( _argumentParser ) ;
2015-06-29 22:20:34 +00:00
2016-03-27 20:29:00 +00:00
var _events = require ( 'events' ) ;
2015-07-05 13:36:27 +00:00
2016-03-27 20:29:00 +00:00
var _Message = require ( './types/Message' ) ;
2015-07-05 13:36:27 +00:00
2016-03-27 20:29:00 +00:00
var _Message2 = _interopRequireDefault ( _Message ) ;
2015-06-29 22:20:34 +00:00
2016-03-27 20:29:00 +00:00
var _File = require ( './types/File' ) ;
var _File2 = _interopRequireDefault ( _File ) ;
var _Keyboard = require ( './types/Keyboard' ) ;
var _Keyboard2 = _interopRequireDefault ( _Keyboard ) ;
var _BulkMessage = require ( './types/BulkMessage' ) ;
var _BulkMessage2 = _interopRequireDefault ( _BulkMessage ) ;
var _Question = require ( './types/Question' ) ;
2015-06-28 22:42:48 +00:00
2016-03-27 20:29:00 +00:00
var _Question2 = _interopRequireDefault ( _Question ) ;
2015-07-09 09:56:17 +00:00
2016-03-27 20:29:00 +00:00
var _Forward = require ( './types/Forward' ) ;
var _Forward2 = _interopRequireDefault ( _Forward ) ;
function _interopRequireDefault ( obj ) { return obj && obj . _ _esModule ? obj : { default : obj } ; }
function _classCallCheck ( instance , Constructor ) { if ( ! ( instance instanceof Constructor ) ) { throw new TypeError ( "Cannot call a class as a function" ) ; } }
function _possibleConstructorReturn ( self , call ) { if ( ! self ) { throw new ReferenceError ( "this hasn't been initialised - super() hasn't been called" ) ; } return call && ( typeof call === "object" || typeof call === "function" ) ? call : self ; }
function _inherits ( subClass , superClass ) { if ( typeof superClass !== "function" && superClass !== null ) { throw new TypeError ( "Super expression must either be null or a function, not " + typeof superClass ) ; } subClass . prototype = Object . create ( superClass && superClass . prototype , { constructor : { value : subClass , enumerable : false , writable : true , configurable : true } } ) ; if ( superClass ) Object . setPrototypeOf ? Object . setPrototypeOf ( subClass , superClass ) : subClass . _ _proto _ _ = superClass ; }
2015-07-09 09:56:17 +00:00
2015-06-28 22:42:48 +00:00
var DEFAULTS = {
update : {
offset : 0 ,
2015-07-05 13:36:27 +00:00
timeout : 20 ,
2015-06-28 22:42:48 +00:00
limit : 100
}
} ;
2015-07-09 11:16:27 +00:00
var REQUIRED = 0 ;
2016-03-27 20:29:00 +00:00
2015-06-28 22:42:48 +00:00
/ * *
* Bot class used to connect to a new bot
* Bots have an api property which gives access to all Telegram API methods ,
* see API class
* /
2016-03-27 20:29:00 +00:00
var Bot = function ( _EventEmitter ) {
_inherits ( Bot , _EventEmitter ) ;
2015-06-28 22:42:48 +00:00
/ * *
* Create and connect to a new bot
* @ param { object } options Bot properties .
* /
function Bot ( ) {
2016-03-27 20:29:00 +00:00
var options = arguments . length <= 0 || arguments [ 0 ] === undefined ? { update : { } } : arguments [ 0 ] ;
2015-06-28 22:42:48 +00:00
_classCallCheck ( this , Bot ) ;
2016-03-27 20:29:00 +00:00
var _this = _possibleConstructorReturn ( this , Object . getPrototypeOf ( Bot ) . call ( this ) ) ;
2015-06-28 22:42:48 +00:00
if ( ! options . token ) {
throw new Error ( 'Token cannot be empty' ) ;
}
2016-03-27 20:29:00 +00:00
_this . token = options . token ;
_this . update = Object . assign ( options . update || { } , DEFAULTS . update ) ;
2015-06-28 22:42:48 +00:00
2016-03-27 20:29:00 +00:00
_this . api = new _api2 . default ( _this . token ) ;
2015-06-28 22:42:48 +00:00
2016-03-27 20:29:00 +00:00
_this . msg = { } ;
2015-06-28 22:42:48 +00:00
// EventEmitter
2016-03-27 20:29:00 +00:00
_this . _events = { } ;
_this . _userEvents = [ ] ;
2015-07-04 11:18:07 +00:00
2016-03-27 20:29:00 +00:00
_this . setMaxListeners ( 100 ) ;
return _this ;
2015-06-28 22:42:48 +00:00
}
2016-03-27 20:29:00 +00:00
/ * *
* Gets information about the bot and then
* 1 ) starts polling updates from API
* 2 ) sets a webhook as defined by the first parameter and listens for updates
* Emits an ` update ` event after polling with the response from server
* Returns a promise which is resolved after the bot information is received
* and set to it ' s ` info ` property i . e . bot . info
*
* @ param { object } hook An object containg options passed to webhook
* properties :
* - url : HTTPS url to listen on POST requests coming
* from the Telegram API
* - port : the port to listen to , defaults to 443
* - server : An object passed to https . createServer
*
* @ return { promise } A promise which is resolved with the response of getMe
* /
2015-06-28 22:42:48 +00:00
_createClass ( Bot , [ {
key : 'start' ,
2015-06-29 22:20:34 +00:00
value : function start ( hook ) {
2016-03-27 20:29:00 +00:00
var _this2 = this ;
2015-06-28 22:42:48 +00:00
2015-06-29 22:20:34 +00:00
if ( hook ) {
2016-03-27 20:29:00 +00:00
return ( 0 , _webhook2 . default ) ( hook , this ) ;
2015-06-29 22:20:34 +00:00
}
2015-06-28 22:42:48 +00:00
return this . api . getMe ( ) . then ( function ( response ) {
2016-03-27 20:29:00 +00:00
_this2 . info = response . result ;
2015-06-29 22:20:34 +00:00
2016-03-27 20:29:00 +00:00
_this2 . on ( 'update' , _this2 . _update ) ;
2015-06-29 22:20:34 +00:00
if ( hook ) {
2016-03-27 20:29:00 +00:00
return ( 0 , _webhook2 . default ) ( hook , _this2 ) ;
2015-06-29 22:20:34 +00:00
} else {
2016-03-27 20:29:00 +00:00
return ( 0 , _poll2 . default ) ( _this2 ) ;
2015-06-29 22:20:34 +00:00
}
2015-06-28 22:42:48 +00:00
} ) ;
}
/ * *
* Listens on specific message matching the pattern which can be an string
* or a regexp .
* @ param { string / regex } pattern
* @ param { function } listener function to call when a message matching the
* pattern is found , gets the Update
* In case of string , the message should start
* with the string i . e . / ^ yourString /
* @ return { object } returns the bot object
* /
2016-03-27 20:29:00 +00:00
} , {
key : 'get' ,
2015-06-28 22:42:48 +00:00
value : function get ( pattern , listener ) {
if ( typeof pattern === 'string' ) {
pattern = new RegExp ( '^' + pattern ) ;
}
this . _userEvents . push ( {
pattern : pattern , listener : listener
} ) ;
return this ;
}
/ * *
* Listens on a command
2015-07-05 13:36:27 +00:00
* @ param { string } command the command string , should not include slash ( / )
2015-06-28 22:42:48 +00:00
* @ param { function } listener function to call when the command is received ,
* gets the update
* @ return { object } returns the bot object
* /
2016-03-27 20:29:00 +00:00
} , {
key : 'command' ,
2015-07-05 13:36:27 +00:00
value : function command ( _command , listener ) {
var regex = /[^\s]+/ ;
2015-07-06 00:05:25 +00:00
var cmd = _command . match ( regex ) [ 0 ] . trim ( ) ;
2015-07-05 13:36:27 +00:00
2015-06-28 22:42:48 +00:00
this . _userEvents . push ( {
2015-07-04 19:35:58 +00:00
pattern : new RegExp ( '^/' + cmd ) ,
2016-03-27 20:29:00 +00:00
parse : _argumentParser2 . default . bind ( null , _command ) ,
2015-06-28 22:42:48 +00:00
listener : listener
} ) ;
return this ;
}
/ * *
* Sends the message provided
* @ param { object } message The message to send . Gets it ' s send method called
* @ return { unknown } returns the result of calling message ' s send method
* /
2016-03-27 20:29:00 +00:00
} , {
key : 'send' ,
2015-06-28 22:42:48 +00:00
value : function send ( message ) {
2016-03-27 20:29:00 +00:00
return message . send ( this ) . catch ( console . error ) ;
2015-06-28 22:42:48 +00:00
}
2015-11-08 03:22:06 +00:00
/ * *
* Stops the bot , deattaching all listeners and polling
* /
2016-03-27 20:29:00 +00:00
} , {
key : 'stop' ,
2015-11-08 03:22:06 +00:00
value : function stop ( ) {
this . _stop = true ;
if ( this . _webhookServer ) {
this . _webhookServer . close ( ) ;
}
this . removeListener ( 'update' , this . _update ) ;
this . _events = { } ;
}
2015-06-30 22:04:44 +00:00
/ * *
* The internal update event listener , used to parse messages and fire
* command / get events - YOU SHOULD NOT USE THIS
*
* @ param { object } update
* /
2016-03-27 20:29:00 +00:00
} , {
key : '_update' ,
2015-06-29 22:20:34 +00:00
value : function _update ( update ) {
2016-03-27 20:29:00 +00:00
var _this3 = this ;
2015-06-29 22:20:34 +00:00
if ( ! this . update . offset ) {
var updateId = update [ update . length - 1 ] . update _id ;
this . update . offset = updateId ;
}
if ( this . update ) {
this . update . offset += 1 ;
}
update . forEach ( function ( res ) {
2016-03-27 20:29:00 +00:00
var _marked = [ getAnswer ] . map ( regeneratorRuntime . mark ) ;
2015-07-09 11:16:27 +00:00
2015-06-29 22:20:34 +00:00
var text = res . message . text ;
2016-03-27 20:29:00 +00:00
if ( ! text ) {
return ;
}
2015-07-06 22:43:33 +00:00
2016-03-27 20:29:00 +00:00
var selfUsername = '@' + _this3 . info . username ;
2015-07-05 11:08:07 +00:00
if ( text . startsWith ( '/' ) && text . indexOf ( selfUsername ) > - 1 ) {
2015-06-29 22:20:34 +00:00
// Commands are sent in /command@thisusername format in groups
2016-03-27 20:29:00 +00:00
var regex = new RegExp ( '(/.*)@' + _this3 . info . username ) ;
2015-07-04 19:35:58 +00:00
text = text . replace ( regex , '$1' ) ;
2015-07-04 15:53:37 +00:00
res . message . text = text ;
2015-06-29 22:20:34 +00:00
}
2016-03-27 20:29:00 +00:00
var ev = _this3 . _userEvents . find ( function ( _ref ) {
2015-06-29 22:20:34 +00:00
var pattern = _ref . pattern ;
return pattern . test ( text ) ;
} ) ;
if ( ! ev ) {
2016-03-27 20:29:00 +00:00
_this3 . emit ( 'command-notfound' , res . message ) ;
2015-06-29 22:20:34 +00:00
return ;
}
2015-07-04 19:27:00 +00:00
2015-07-09 11:16:27 +00:00
if ( ! ev . parse ) {
ev . listener ( res . message ) ;
return ;
}
2015-07-09 09:56:17 +00:00
2015-07-09 11:16:27 +00:00
var _ev$parse = ev . parse ( res . message . text ) ;
2015-07-09 09:56:17 +00:00
2015-07-09 11:16:27 +00:00
var params = _ev$parse . params ;
var args = _ev$parse . args ;
2015-07-09 09:56:17 +00:00
2015-07-09 11:37:08 +00:00
res . message . args = args ;
2015-07-09 11:16:27 +00:00
var requiredParams = Object . keys ( params ) . filter ( function ( param ) {
2015-07-09 11:30:01 +00:00
return params [ param ] === REQUIRED && ! args [ param ] ;
2015-07-09 11:16:27 +00:00
} ) ;
if ( ! requiredParams . length ) {
ev . listener ( res . message ) ;
return ;
}
2015-07-09 09:56:17 +00:00
2016-03-27 20:29:00 +00:00
var bot = _this3 ;
2015-07-09 11:16:27 +00:00
function getAnswer ( ) {
2016-03-27 20:29:00 +00:00
var _this4 = this ;
2015-07-09 11:16:27 +00:00
var _iteratorNormalCompletion , _didIteratorError , _iteratorError , _loop , _iterator , _step ;
2016-03-27 20:29:00 +00:00
return regeneratorRuntime . wrap ( function getAnswer$ ( _context2 ) {
while ( 1 ) {
switch ( _context2 . prev = _context2 . next ) {
case 0 :
_iteratorNormalCompletion = true ;
_didIteratorError = false ;
_iteratorError = undefined ;
_context2 . prev = 3 ;
_loop = regeneratorRuntime . mark ( function _loop ( ) {
var param , msg ;
return regeneratorRuntime . wrap ( function _loop$ ( _context ) {
while ( 1 ) {
switch ( _context . prev = _context . next ) {
case 0 :
param = _step . value ;
msg = new _Message2 . default ( ) . to ( res . message . chat . id ) . text ( 'Enter value for ' + param ) ;
_context . next = 4 ;
return bot . send ( msg ) . then ( function ( answer ) {
args [ param ] = answer . text ;
} ) ;
case 4 :
case 'end' :
return _context . stop ( ) ;
}
}
} , _loop , _this4 ) ;
} ) ;
_iterator = requiredParams [ Symbol . iterator ] ( ) ;
case 6 :
if ( _iteratorNormalCompletion = ( _step = _iterator . next ( ) ) . done ) {
_context2 . next = 11 ;
break ;
}
return _context2 . delegateYield ( _loop ( ) , 't0' , 8 ) ;
case 8 :
_iteratorNormalCompletion = true ;
_context2 . next = 6 ;
2015-07-09 11:16:27 +00:00
break ;
2016-03-27 20:29:00 +00:00
case 11 :
_context2 . next = 17 ;
break ;
2015-07-09 09:56:17 +00:00
2016-03-27 20:29:00 +00:00
case 13 :
_context2 . prev = 13 ;
_context2 . t1 = _context2 [ 'catch' ] ( 3 ) ;
_didIteratorError = true ;
_iteratorError = _context2 . t1 ;
2015-07-09 09:56:17 +00:00
2016-03-27 20:29:00 +00:00
case 17 :
_context2 . prev = 17 ;
_context2 . prev = 18 ;
2015-07-09 11:16:27 +00:00
2016-03-27 20:29:00 +00:00
if ( ! _iteratorNormalCompletion && _iterator . return ) {
_iterator . return ( ) ;
}
2015-07-09 09:56:17 +00:00
2016-03-27 20:29:00 +00:00
case 20 :
_context2 . prev = 20 ;
2015-07-09 09:56:17 +00:00
2016-03-27 20:29:00 +00:00
if ( ! _didIteratorError ) {
_context2 . next = 23 ;
break ;
}
2015-07-09 09:56:17 +00:00
2016-03-27 20:29:00 +00:00
throw _iteratorError ;
2015-07-09 09:56:17 +00:00
2016-03-27 20:29:00 +00:00
case 23 :
return _context2 . finish ( 20 ) ;
2015-07-09 09:56:17 +00:00
2016-03-27 20:29:00 +00:00
case 24 :
return _context2 . finish ( 17 ) ;
2015-07-09 11:16:27 +00:00
2016-03-27 20:29:00 +00:00
case 25 :
case 'end' :
return _context2 . stop ( ) ;
}
2015-07-09 11:16:27 +00:00
}
2016-03-27 20:29:00 +00:00
} , _marked [ 0 ] , this , [ [ 3 , 13 , 17 , 25 ] , [ 18 , , 20 , 24 ] ] ) ;
2015-07-05 13:36:27 +00:00
}
2015-07-09 11:16:27 +00:00
var iterator = getAnswer ( ) ;
( function loop ( ) {
var next = iterator . next ( ) ;
if ( next . done ) {
ev . listener ( res . message ) ;
return ;
}
next . value . then ( loop ) ;
} ) ( ) ;
2015-06-29 22:20:34 +00:00
} ) ;
}
2015-06-28 22:42:48 +00:00
} ] ) ;
return Bot ;
2016-03-27 20:29:00 +00:00
} ( _events . EventEmitter ) ;
exports . default = Bot ;
exports . File = _File2 . default ;
exports . Message = _Message2 . default ;
exports . BulkMessage = _BulkMessage2 . default ;
exports . Forward = _Forward2 . default ;
exports . Question = _Question2 . default ;
exports . Keyboard = _Keyboard2 . default ;