Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
TelegramBot
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Kulya
TelegramBot
Commits
6a0b7b1a
Commit
6a0b7b1a
authored
Apr 14, 2016
by
CrazyRedScorp
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added files via upload
parent
d1442fe9
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
790 additions
and
790 deletions
+790
-790
Telegram.php
src/Telegram.php
+790
-790
No files found.
src/Telegram.php
View file @
6a0b7b1a
<?php
/**
* This file is part of the TelegramBot package.
*
* (c) Avtandil Kikabidze aka LONGMAN <akalongman@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace
Longman\TelegramBot
;
define
(
'BASE_PATH'
,
__DIR__
);
define
(
'BASE_COMMANDS_PATH'
,
BASE_PATH
.
'/Commands'
);
use
Longman\TelegramBot\Entities\Update
;
use
Longman\TelegramBot\Exception\TelegramException
;
/**
* @package Telegram
* @author Avtandil Kikabidze <akalongman@gmail.com>
* @copyright Avtandil Kikabidze <akalongman@gmail.com>
* @license http://opensource.org/licenses/mit-license.php The MIT License (MIT)
* @link http://www.github.com/akalongman/php-telegram-bot
*/
class
Telegram
{
/**
* Version
*
* @var string
*/
protected
$version
=
'0.30.0'
;
/**
* Telegram API key
*
* @var string
*/
protected
$api_key
=
''
;
/**
* Telegram Bot name
*
* @var string
*/
protected
$bot_name
=
''
;
/**
* Raw request data (json) for webhook methods
*
* @var string
*/
protected
$input
;
/**
* Custom commands paths
*
* @var array
*/
protected
$commands_paths
=
[];
/**
* Current Update object
*
* @var Entities\Update
*/
protected
$update
;
/**
* Log verbose curl output
*
* @var bool
*/
protected
$log_requests
;
/**
* Log path
*
* @var string
*/
protected
$log_path
;
/**
* Upload path
*
* @var string
*/
protected
$upload_path
;
/**
* Download path
*
* @var string
*/
protected
$download_path
;
/**
* Log verbosity
*
* @var int
*/
protected
$log_verbosity
=
1
;
/**
* MySQL integration
*
* @var boolean
*/
protected
$mysql_enabled
=
false
;
/**
* PDO object
*
* @var \PDO
*/
protected
$pdo
;
/**
* Commands config
*
* @var array
*/
protected
$commands_config
=
[];
/**
* Admins list
*
* @var array
*/
protected
$admins_list
=
[];
/**
* ServerResponse of the last Command execution
*
* @var Entities\ServerResponse
*/
protected
$last_command_response
;
/**
* Constructor
*
* @param string $api_key
* @param string $bot_name
*/
public
function
__construct
(
$api_key
,
$bot_name
)
{
if
(
empty
(
$api_key
))
{
throw
new
TelegramException
(
'API KEY not defined!'
);
}
if
(
empty
(
$bot_name
))
{
throw
new
TelegramException
(
'Bot Username not defined!'
);
}
$this
->
api_key
=
$api_key
;
$this
->
bot_name
=
$bot_name
;
//Set default download and upload path
$this
->
setDownloadPath
(
BASE_PATH
.
'/../Download'
);
$this
->
setUploadPath
(
BASE_PATH
.
'/../Upload'
);
//Add default system commands path
$this
->
addCommandsPath
(
BASE_COMMANDS_PATH
.
'/SystemCommands'
);
Request
::
initialize
(
$this
);
}
/**
* Initialize Database connection
*
* @param array $credential
* @param string $table_prefix
*
* @return Telegram
*/
public
function
enableMySql
(
array
$credential
,
$table_prefix
=
null
)
{
$this
->
pdo
=
DB
::
initialize
(
$credential
,
$this
,
$table_prefix
);
ConversationDB
::
initializeConversation
();
$this
->
mysql_enabled
=
true
;
return
$this
;
}
/**
* Initialize Database external connection
*
* @param PDO $external_pdo_connection PDO database object
* @param string $table_prefix
*/
public
function
enableExternalMysql
(
$external_pdo_connection
,
$table_prefix
=
null
)
{
$this
->
pdo
=
DB
::
externalInitialize
(
$external_pdo_connection
,
$this
,
$table_prefix
);
ConversationDB
::
initializeConversation
();
$this
->
mysql_enabled
=
true
;
}
/**
* Get commands list
*
* @return array $commands
*/
public
function
getCommandsList
()
{
$commands
=
[];
foreach
(
$this
->
commands_paths
as
$path
)
{
try
{
//Get all "*Command.php" files
$files
=
new
\RegexIterator
(
new
\RecursiveIteratorIterator
(
new
\RecursiveDirectoryIterator
(
$path
)
),
'/^.+Command.php$/'
);
foreach
(
$files
as
$file
)
{
//Remove "Command.php" from filename
$command
=
$this
->
sanitizeCommand
(
substr
(
$file
->
getFilename
(),
0
,
-
11
));
$command_name
=
strtolower
(
$command
);
if
(
array_key_exists
(
$command_name
,
$commands
))
{
continue
;
}
require_once
$file
->
getPathname
();
$command_obj
=
$this
->
getCommandObject
(
$command
);
if
(
$command_obj
instanceof
Commands\Command
)
{
$commands
[
$command_name
]
=
$command_obj
;
}
}
}
catch
(
\Exception
$e
)
{
throw
new
TelegramException
(
'Error getting commands from path: '
.
$path
);
}
}
return
$commands
;
}
/**
* Get an object instance of the passed command
*
* @param string $command
*
* @return Entities\Command|null
*/
public
function
getCommandObject
(
$command
)
{
$which
=
[
'System'
];
(
$this
->
isAdmin
())
&&
$which
[]
=
'Admin'
;
$which
[]
=
'User'
;
foreach
(
$which
as
$auth
)
{
// $command_namespace = __NAMESPACE__ . '\\Commands\\' . $auth . 'Commands\\' . ucfirst($command) . 'Command';
$command_namespace
=
__NAMESPACE__
.
'\\Commands\\'
.
$auth
.
'Commands\\'
.
$this
->
mb_ucfirst
(
$command
)
.
'Command'
;
if
(
class_exists
(
$command_namespace
))
{
return
new
$command_namespace
(
$this
,
$this
->
update
);
}
}
return
null
;
}
/**
* Set log requests
*
* 0 don't store
* 1 store the Curl verbose output with Telegram updates
*
* @param bool $log_requests
*
* @return Telegram
*/
public
function
setLogRequests
(
$log_requests
)
{
$this
->
log_requests
=
$log_requests
;
return
$this
;
}
/**
* Get log requests
*
* @return bool
*/
public
function
getLogRequests
()
{
return
$this
->
log_requests
;
}
/**
* Set log path
*
* @param string $log_path
*
* @return \Longman\TelegramBot\Telegram
*/
public
function
setLogPath
(
$log_path
)
{
$this
->
log_path
=
$log_path
;
return
$this
;
}
/**
* Get log path
*
* @return string
*/
public
function
getLogPath
()
{
return
$this
->
log_path
;
}
/**
* Set log Verbosity
*
* @param int $log_verbosity
*
* 1 only incoming updates from webhook and getUpdates
* 3 incoming updates from webhook and getUpdates and curl request info and response
*
* @return \Longman\TelegramBot\Telegram
*/
public
function
setLogVerbosity
(
$log_verbosity
)
{
$this
->
log_verbosity
=
$log_verbosity
;
return
$this
;
}
/**
* Get log verbosity
*
* @return int
*/
public
function
getLogVerbosity
()
{
return
$this
->
log_verbosity
;
}
/**
* Set custom input string for debug purposes
*
* @param string $input (json format)
*
* @return \Longman\TelegramBot\Telegram
*/
public
function
setCustomInput
(
$input
)
{
$this
->
input
=
$input
;
return
$this
;
}
/**
* Get custom input string for debug purposes
*
* @return string
*/
public
function
getCustomInput
()
{
return
$this
->
input
;
}
/**
* Get the ServerResponse of the last Command execution
*
* @return Entities\ServerResponse
*/
public
function
getLastCommandResponse
()
{
return
$this
->
last_command_response
;
}
/**
* Handle getUpdates method
*
* @param int|null $limit
* @param int|null $timeout
*
* @return \Longman\TelegramBot\Entities\ServerResponse
*/
public
function
handleGetUpdates
(
$limit
=
null
,
$timeout
=
null
)
{
//DB Query
$last_update
=
DB
::
selectTelegramUpdate
(
1
);
//As explained in the telegram bot api documentation
$offset
=
(
isset
(
$last_update
[
0
][
'id'
]))
?
$last_update
[
0
][
'id'
]
+
1
:
null
;
$response
=
Request
::
getUpdates
([
'offset'
=>
$offset
,
'limit'
=>
$limit
,
'timeout'
=>
$timeout
,
]);
if
(
$response
->
isOk
())
{
//Process all updates
foreach
((
array
)
$response
->
getResult
()
as
$result
)
{
$this
->
processUpdate
(
$result
);
}
}
return
$response
;
}
/**
* Handle bot request from webhook
*
* @return bool
*/
public
function
handle
()
{
$this
->
input
=
Request
::
getInput
();
if
(
empty
(
$this
->
input
))
{
throw
new
TelegramException
(
'Input is empty!'
);
}
$post
=
json_decode
(
$this
->
input
,
true
);
if
(
empty
(
$post
))
{
throw
new
TelegramException
(
'Invalid JSON!'
);
}
return
$this
->
processUpdate
(
new
Update
(
$post
,
$this
->
bot_name
))
->
isOk
();
}
/**
* Get the command name from the command type
*
* @param string $type
*
* @return string
*/
private
function
getCommandFromType
(
$type
)
{
// return ucfirst(str_replace('_', '', $type));
return
$this
->
mb_ucfirst
(
str_replace
(
'_'
,
''
,
$type
));
}
/**
* Process bot Update request
*
* @param Entities\Update $update
*
* @return Entities\ServerResponse
*/
public
function
processUpdate
(
Update
$update
)
{
$this
->
update
=
$update
;
//If all else fails, it's a generic message.
$command
=
'genericmessage'
;
$update_type
=
$this
->
update
->
getUpdateType
();
if
(
in_array
(
$update_type
,
[
'inline_query'
,
'chosen_inline_result'
]))
{
$command
=
$this
->
getCommandFromType
(
$update_type
);
}
elseif
(
$update_type
===
'message'
)
{
$message
=
$this
->
update
->
getMessage
();
//Load admin commands
if
(
$this
->
isAdmin
())
{
$this
->
addCommandsPath
(
BASE_COMMANDS_PATH
.
'/AdminCommands'
,
false
);
}
$this
->
addCommandsPath
(
BASE_COMMANDS_PATH
.
'/UserCommands'
,
false
);
$type
=
$message
->
getType
();
if
(
$type
===
'command'
)
{
$command
=
$message
->
getCommand
();
}
elseif
(
in_array
(
$type
,
[
'channel_chat_created'
,
'delete_chat_photo'
,
'group_chat_created'
,
'left_chat_participant'
,
'migrate_from_chat_id'
,
'migrate_to_chat_id'
,
'new_chat_participant'
,
'new_chat_photo'
,
'new_chat_title'
,
'supergroup_chat_created'
,
]))
{
$command
=
$this
->
getCommandFromType
(
$type
);
}
}
//Make sure we have an up-to-date command list
//This is necessary to "require" all the necessary command files!
$this
->
getCommandsList
();
DB
::
insertRequest
(
$this
->
update
);
return
$this
->
executeCommand
(
$command
);
}
/**
* Execute /command
*
* @param string $command
*
* @return mixed
*/
public
function
executeCommand
(
$command
)
{
$command_obj
=
$this
->
getCommandObject
(
$command
);
if
(
!
$command_obj
||
!
$command_obj
->
isEnabled
())
{
//Failsafe in case the Generic command can't be found
if
(
$command
===
'Generic'
)
{
throw
new
TelegramException
(
'Generic command missing!'
);
}
//Handle a generic command or non existing one
$this
->
last_command_response
=
$this
->
executeCommand
(
'Generic'
);
}
else
{
//execute() method is executed after preExecute()
//This is to prevent executing a DB query without a valid connection
$this
->
last_command_response
=
$command_obj
->
preExecute
();
}
return
$this
->
last_command_response
;
}
/**
* @todo Complete DocBlock
*/
protected
function
sanitizeCommand
(
$command
)
{
// return str_replace(' ', '', ucwords(str_replace('_', ' ', $command)));
return
str_replace
(
' '
,
''
,
$this
->
mb_ucwords
(
str_replace
(
'_'
,
' '
,
$command
)));
}
/**
* Enable Admin Account
*
* @param array $admins_list List of admins
*
* @return string
*/
public
function
enableAdmins
(
array
$admins_list
)
{
foreach
(
$admins_list
as
$admin
)
{
if
(
$admin
>
0
)
{
$this
->
admins_list
[]
=
$admin
;
}
else
{
throw
new
TelegramException
(
'Invalid value "'
.
$admin
.
'" for admin!'
);
}
}
return
$this
;
}
/**
* Get list of admins
*
* @return array
*/
public
function
getAdminList
()
{
return
$this
->
admins_list
;
}
/**
* Check if the passed user is an admin
*
* If no user id is passed, the current update is checked for a valid message sender.
*
* @param int|null $user_id
*
* @return bool
*/
public
function
isAdmin
(
$user_id
=
null
)
{
if
(
$user_id
===
null
&&
$this
->
update
!==
null
)
{
if
((
$message
=
$this
->
update
->
getMessage
())
&&
(
$from
=
$message
->
getFrom
()))
{
$user_id
=
$from
->
getId
();
}
}
return
(
$user_id
===
null
)
?
false
:
in_array
(
$user_id
,
$this
->
admins_list
);
}
/**
* Check if user required the db connection
*
* @return bool
*/
public
function
isDbEnabled
()
{
if
(
$this
->
mysql_enabled
)
{
return
true
;
}
else
{
return
false
;
}
}
/**
* Add custom commands path
*
* @param string $path Custom commands path
* @param bool $before If the path should be prepended or appended to the list
*
* @return \Longman\TelegramBot\Telegram
*/
public
function
addCommandsPath
(
$path
,
$before
=
true
)
{
if
(
!
is_dir
(
$path
))
{
throw
new
TelegramException
(
'Commands path "'
.
$path
.
'" does not exist!'
);
}
if
(
!
in_array
(
$path
,
$this
->
commands_paths
))
{
if
(
$before
)
{
array_unshift
(
$this
->
commands_paths
,
$path
);
}
else
{
array_push
(
$this
->
commands_paths
,
$path
);
}
}
return
$this
;
}
/**
* Set custom upload path
*
* @param string $path Custom upload path
*
* @return \Longman\TelegramBot\Telegram
*/
public
function
setUploadPath
(
$path
)
{
$this
->
upload_path
=
$path
;
return
$this
;
}
/**
* Get custom upload path
*
* @return string
*/
public
function
getUploadPath
()
{
return
$this
->
upload_path
;
}
/**
* Set custom download path
*
* @param string $path Custom download path
*
* @return \Longman\TelegramBot\Telegram
*/
public
function
setDownloadPath
(
$path
)
{
$this
->
download_path
=
$path
;
return
$this
;
}
/**
* Get custom download path
*
* @return string
*/
public
function
getDownloadPath
()
{
return
$this
->
download_path
;
}
/**
* Set command config
*
* Provide further variables to a particular commands.
* For example you can add the channel name at the command /sendtochannel
* Or you can add the api key for external service.
*
* @param string $command
* @param array $config
*
* @return \Longman\TelegramBot\Telegram
*/
public
function
setCommandConfig
(
$command
,
array
$config
)
{
$this
->
commands_config
[
$command
]
=
$config
;
return
$this
;
}
/**
* Get command config
*
* @param string $command
*
* @return array
*/
public
function
getCommandConfig
(
$command
)
{
return
isset
(
$this
->
commands_config
[
$command
])
?
$this
->
commands_config
[
$command
]
:
[];
}
/**
* Get API key
*
* @return string
*/
public
function
getApiKey
()
{
return
$this
->
api_key
;
}
/**
* Get Bot name
*
* @return string
*/
public
function
getBotName
()
{
return
$this
->
bot_name
;
}
/**
* Get Version
*
* @return string
*/
public
function
getVersion
()
{
return
$this
->
version
;
}
/**
* Set Webhook for bot
*
* @param string $url
* @param string|null $path_certificate
*
* @return \Longman\TelegramBot\Entities\ServerResponse
*/
public
function
setWebHook
(
$url
,
$path_certificate
=
null
)
{
if
(
empty
(
$url
))
{
throw
new
TelegramException
(
'Hook url is empty!'
);
}
$result
=
Request
::
setWebhook
(
$url
,
$path_certificate
);
if
(
!
$result
->
isOk
())
{
throw
new
TelegramException
(
'Webhook was not set! Error: '
.
$result
->
getErrorCode
()
.
' '
.
$result
->
getDescription
()
);
}
return
$result
;
}
/**
* Unset Webhook for bot
*
* @return \Longman\TelegramBot\Entities\ServerResponse
*/
public
function
unsetWebHook
()
{
$result
=
Request
::
setWebhook
();
if
(
!
$result
->
isOk
())
{
throw
new
TelegramException
(
'Webhook was not unset! Error: '
.
$result
->
getErrorCode
()
.
' '
.
$result
->
getDescription
()
);
}
return
$result
;
}
/**
* Replace function `ucwords` for UTF-8 characters in the class definition and commands
*
* @param string $str
* @param string $encoding (default = 'UTF-8')
*
* @return string
*/
protected
function
mb_ucwords
(
$str
,
$encoding
=
'UTF-8'
)
{
return
mb_convert_case
(
$str
,
MB_CASE_TITLE
,
$encoding
);
}
/**
* Replace function `ucfirst` for UTF-8 characters in the class definition and commands
*
* @param string $str
* @param string $encoding (default = 'UTF-8')
*
* @return string
*/
protected
function
mb_ucfirst
(
$str
,
$encoding
=
'UTF-8'
)
{
return
mb_strtoupper
(
mb_substr
(
$str
,
0
,
1
,
$encoding
),
$encoding
)
.
mb_strtolower
(
mb_substr
(
$str
,
1
,
mb_strlen
(
$str
),
$encoding
),
$encoding
);
}
}
<?php
/**
* This file is part of the TelegramBot package.
*
* (c) Avtandil Kikabidze aka LONGMAN <akalongman@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace
Longman\TelegramBot
;
define
(
'BASE_PATH'
,
__DIR__
);
define
(
'BASE_COMMANDS_PATH'
,
BASE_PATH
.
'/Commands'
);
use
Longman\TelegramBot\Entities\Update
;
use
Longman\TelegramBot\Exception\TelegramException
;
/**
* @package Telegram
* @author Avtandil Kikabidze <akalongman@gmail.com>
* @copyright Avtandil Kikabidze <akalongman@gmail.com>
* @license http://opensource.org/licenses/mit-license.php The MIT License (MIT)
* @link http://www.github.com/akalongman/php-telegram-bot
*/
class
Telegram
{
/**
* Version
*
* @var string
*/
protected
$version
=
'0.30.0'
;
/**
* Telegram API key
*
* @var string
*/
protected
$api_key
=
''
;
/**
* Telegram Bot name
*
* @var string
*/
protected
$bot_name
=
''
;
/**
* Raw request data (json) for webhook methods
*
* @var string
*/
protected
$input
;
/**
* Custom commands paths
*
* @var array
*/
protected
$commands_paths
=
[];
/**
* Current Update object
*
* @var Entities\Update
*/
protected
$update
;
/**
* Log verbose curl output
*
* @var bool
*/
protected
$log_requests
;
/**
* Log path
*
* @var string
*/
protected
$log_path
;
/**
* Upload path
*
* @var string
*/
protected
$upload_path
;
/**
* Download path
*
* @var string
*/
protected
$download_path
;
/**
* Log verbosity
*
* @var int
*/
protected
$log_verbosity
=
1
;
/**
* MySQL integration
*
* @var boolean
*/
protected
$mysql_enabled
=
false
;
/**
* PDO object
*
* @var \PDO
*/
protected
$pdo
;
/**
* Commands config
*
* @var array
*/
protected
$commands_config
=
[];
/**
* Admins list
*
* @var array
*/
protected
$admins_list
=
[];
/**
* ServerResponse of the last Command execution
*
* @var Entities\ServerResponse
*/
protected
$last_command_response
;
/**
* Constructor
*
* @param string $api_key
* @param string $bot_name
*/
public
function
__construct
(
$api_key
,
$bot_name
)
{
if
(
empty
(
$api_key
))
{
throw
new
TelegramException
(
'API KEY not defined!'
);
}
if
(
empty
(
$bot_name
))
{
throw
new
TelegramException
(
'Bot Username not defined!'
);
}
$this
->
api_key
=
$api_key
;
$this
->
bot_name
=
$bot_name
;
//Set default download and upload path
$this
->
setDownloadPath
(
BASE_PATH
.
'/../Download'
);
$this
->
setUploadPath
(
BASE_PATH
.
'/../Upload'
);
//Add default system commands path
$this
->
addCommandsPath
(
BASE_COMMANDS_PATH
.
'/SystemCommands'
);
Request
::
initialize
(
$this
);
}
/**
* Initialize Database connection
*
* @param array $credential
* @param string $table_prefix
*
* @return Telegram
*/
public
function
enableMySql
(
array
$credential
,
$table_prefix
=
null
)
{
$this
->
pdo
=
DB
::
initialize
(
$credential
,
$this
,
$table_prefix
);
ConversationDB
::
initializeConversation
();
$this
->
mysql_enabled
=
true
;
return
$this
;
}
/**
* Initialize Database external connection
*
* @param PDO $external_pdo_connection PDO database object
* @param string $table_prefix
*/
public
function
enableExternalMysql
(
$external_pdo_connection
,
$table_prefix
=
null
)
{
$this
->
pdo
=
DB
::
externalInitialize
(
$external_pdo_connection
,
$this
,
$table_prefix
);
ConversationDB
::
initializeConversation
();
$this
->
mysql_enabled
=
true
;
}
/**
* Get commands list
*
* @return array $commands
*/
public
function
getCommandsList
()
{
$commands
=
[];
foreach
(
$this
->
commands_paths
as
$path
)
{
try
{
//Get all "*Command.php" files
$files
=
new
\RegexIterator
(
new
\RecursiveIteratorIterator
(
new
\RecursiveDirectoryIterator
(
$path
)
),
'/^.+Command.php$/'
);
foreach
(
$files
as
$file
)
{
//Remove "Command.php" from filename
$command
=
$this
->
sanitizeCommand
(
substr
(
$file
->
getFilename
(),
0
,
-
11
));
$command_name
=
strtolower
(
$command
);
if
(
array_key_exists
(
$command_name
,
$commands
))
{
continue
;
}
require_once
$file
->
getPathname
();
$command_obj
=
$this
->
getCommandObject
(
$command
);
if
(
$command_obj
instanceof
Commands\Command
)
{
$commands
[
$command_name
]
=
$command_obj
;
}
}
}
catch
(
\Exception
$e
)
{
throw
new
TelegramException
(
'Error getting commands from path: '
.
$path
);
}
}
return
$commands
;
}
/**
* Get an object instance of the passed command
*
* @param string $command
*
* @return Entities\Command|null
*/
public
function
getCommandObject
(
$command
)
{
$which
=
[
'System'
];
(
$this
->
isAdmin
())
&&
$which
[]
=
'Admin'
;
$which
[]
=
'User'
;
foreach
(
$which
as
$auth
)
{
// $command_namespace = __NAMESPACE__ . '\\Commands\\' . $auth . 'Commands\\' . ucfirst($command) . 'Command';
$command_namespace
=
__NAMESPACE__
.
'\\Commands\\'
.
$auth
.
'Commands\\'
.
$this
->
mb_ucfirst
(
$command
)
.
'Command'
;
if
(
class_exists
(
$command_namespace
))
{
return
new
$command_namespace
(
$this
,
$this
->
update
);
}
}
return
null
;
}
/**
* Set log requests
*
* 0 don't store
* 1 store the Curl verbose output with Telegram updates
*
* @param bool $log_requests
*
* @return Telegram
*/
public
function
setLogRequests
(
$log_requests
)
{
$this
->
log_requests
=
$log_requests
;
return
$this
;
}
/**
* Get log requests
*
* @return bool
*/
public
function
getLogRequests
()
{
return
$this
->
log_requests
;
}
/**
* Set log path
*
* @param string $log_path
*
* @return \Longman\TelegramBot\Telegram
*/
public
function
setLogPath
(
$log_path
)
{
$this
->
log_path
=
$log_path
;
return
$this
;
}
/**
* Get log path
*
* @return string
*/
public
function
getLogPath
()
{
return
$this
->
log_path
;
}
/**
* Set log Verbosity
*
* @param int $log_verbosity
*
* 1 only incoming updates from webhook and getUpdates
* 3 incoming updates from webhook and getUpdates and curl request info and response
*
* @return \Longman\TelegramBot\Telegram
*/
public
function
setLogVerbosity
(
$log_verbosity
)
{
$this
->
log_verbosity
=
$log_verbosity
;
return
$this
;
}
/**
* Get log verbosity
*
* @return int
*/
public
function
getLogVerbosity
()
{
return
$this
->
log_verbosity
;
}
/**
* Set custom input string for debug purposes
*
* @param string $input (json format)
*
* @return \Longman\TelegramBot\Telegram
*/
public
function
setCustomInput
(
$input
)
{
$this
->
input
=
$input
;
return
$this
;
}
/**
* Get custom input string for debug purposes
*
* @return string
*/
public
function
getCustomInput
()
{
return
$this
->
input
;
}
/**
* Get the ServerResponse of the last Command execution
*
* @return Entities\ServerResponse
*/
public
function
getLastCommandResponse
()
{
return
$this
->
last_command_response
;
}
/**
* Handle getUpdates method
*
* @param int|null $limit
* @param int|null $timeout
*
* @return \Longman\TelegramBot\Entities\ServerResponse
*/
public
function
handleGetUpdates
(
$limit
=
null
,
$timeout
=
null
)
{
//DB Query
$last_update
=
DB
::
selectTelegramUpdate
(
1
);
//As explained in the telegram bot api documentation
$offset
=
(
isset
(
$last_update
[
0
][
'id'
]))
?
$last_update
[
0
][
'id'
]
+
1
:
null
;
$response
=
Request
::
getUpdates
([
'offset'
=>
$offset
,
'limit'
=>
$limit
,
'timeout'
=>
$timeout
,
]);
if
(
$response
->
isOk
())
{
//Process all updates
foreach
((
array
)
$response
->
getResult
()
as
$result
)
{
$this
->
processUpdate
(
$result
);
}
}
return
$response
;
}
/**
* Handle bot request from webhook
*
* @return bool
*/
public
function
handle
()
{
$this
->
input
=
Request
::
getInput
();
if
(
empty
(
$this
->
input
))
{
throw
new
TelegramException
(
'Input is empty!'
);
}
$post
=
json_decode
(
$this
->
input
,
true
);
if
(
empty
(
$post
))
{
throw
new
TelegramException
(
'Invalid JSON!'
);
}
return
$this
->
processUpdate
(
new
Update
(
$post
,
$this
->
bot_name
))
->
isOk
();
}
/**
* Get the command name from the command type
*
* @param string $type
*
* @return string
*/
private
function
getCommandFromType
(
$type
)
{
// return ucfirst(str_replace('_', '', $type));
return
$this
->
mb_ucfirst
(
str_replace
(
'_'
,
''
,
$type
));
}
/**
* Process bot Update request
*
* @param Entities\Update $update
*
* @return Entities\ServerResponse
*/
public
function
processUpdate
(
Update
$update
)
{
$this
->
update
=
$update
;
//If all else fails, it's a generic message.
$command
=
'genericmessage'
;
$update_type
=
$this
->
update
->
getUpdateType
();
if
(
in_array
(
$update_type
,
[
'inline_query'
,
'chosen_inline_result'
]))
{
$command
=
$this
->
getCommandFromType
(
$update_type
);
}
elseif
(
$update_type
===
'message'
)
{
$message
=
$this
->
update
->
getMessage
();
//Load admin commands
if
(
$this
->
isAdmin
())
{
$this
->
addCommandsPath
(
BASE_COMMANDS_PATH
.
'/AdminCommands'
,
false
);
}
$this
->
addCommandsPath
(
BASE_COMMANDS_PATH
.
'/UserCommands'
,
false
);
$type
=
$message
->
getType
();
if
(
$type
===
'command'
)
{
$command
=
$message
->
getCommand
();
}
elseif
(
in_array
(
$type
,
[
'channel_chat_created'
,
'delete_chat_photo'
,
'group_chat_created'
,
'left_chat_participant'
,
'migrate_from_chat_id'
,
'migrate_to_chat_id'
,
'new_chat_participant'
,
'new_chat_photo'
,
'new_chat_title'
,
'supergroup_chat_created'
,
]))
{
$command
=
$this
->
getCommandFromType
(
$type
);
}
}
//Make sure we have an up-to-date command list
//This is necessary to "require" all the necessary command files!
$this
->
getCommandsList
();
DB
::
insertRequest
(
$this
->
update
);
return
$this
->
executeCommand
(
$command
);
}
/**
* Execute /command
*
* @param string $command
*
* @return mixed
*/
public
function
executeCommand
(
$command
)
{
$command_obj
=
$this
->
getCommandObject
(
$command
);
if
(
!
$command_obj
||
!
$command_obj
->
isEnabled
())
{
//Failsafe in case the Generic command can't be found
if
(
$command
===
'Generic'
)
{
throw
new
TelegramException
(
'Generic command missing!'
);
}
//Handle a generic command or non existing one
$this
->
last_command_response
=
$this
->
executeCommand
(
'Generic'
);
}
else
{
//execute() method is executed after preExecute()
//This is to prevent executing a DB query without a valid connection
$this
->
last_command_response
=
$command_obj
->
preExecute
();
}
return
$this
->
last_command_response
;
}
/**
* @todo Complete DocBlock
*/
protected
function
sanitizeCommand
(
$command
)
{
// return str_replace(' ', '', ucwords(str_replace('_', ' ', $command)));
return
str_replace
(
' '
,
''
,
$this
->
mb_ucwords
(
str_replace
(
'_'
,
' '
,
$command
)));
}
/**
* Enable Admin Account
*
* @param array $admins_list List of admins
*
* @return string
*/
public
function
enableAdmins
(
array
$admins_list
)
{
foreach
(
$admins_list
as
$admin
)
{
if
(
$admin
>
0
)
{
$this
->
admins_list
[]
=
$admin
;
}
else
{
throw
new
TelegramException
(
'Invalid value "'
.
$admin
.
'" for admin!'
);
}
}
return
$this
;
}
/**
* Get list of admins
*
* @return array
*/
public
function
getAdminList
()
{
return
$this
->
admins_list
;
}
/**
* Check if the passed user is an admin
*
* If no user id is passed, the current update is checked for a valid message sender.
*
* @param int|null $user_id
*
* @return bool
*/
public
function
isAdmin
(
$user_id
=
null
)
{
if
(
$user_id
===
null
&&
$this
->
update
!==
null
)
{
if
((
$message
=
$this
->
update
->
getMessage
())
&&
(
$from
=
$message
->
getFrom
()))
{
$user_id
=
$from
->
getId
();
}
}
return
(
$user_id
===
null
)
?
false
:
in_array
(
$user_id
,
$this
->
admins_list
);
}
/**
* Check if user required the db connection
*
* @return bool
*/
public
function
isDbEnabled
()
{
if
(
$this
->
mysql_enabled
)
{
return
true
;
}
else
{
return
false
;
}
}
/**
* Add custom commands path
*
* @param string $path Custom commands path
* @param bool $before If the path should be prepended or appended to the list
*
* @return \Longman\TelegramBot\Telegram
*/
public
function
addCommandsPath
(
$path
,
$before
=
true
)
{
if
(
!
is_dir
(
$path
))
{
throw
new
TelegramException
(
'Commands path "'
.
$path
.
'" does not exist!'
);
}
if
(
!
in_array
(
$path
,
$this
->
commands_paths
))
{
if
(
$before
)
{
array_unshift
(
$this
->
commands_paths
,
$path
);
}
else
{
array_push
(
$this
->
commands_paths
,
$path
);
}
}
return
$this
;
}
/**
* Set custom upload path
*
* @param string $path Custom upload path
*
* @return \Longman\TelegramBot\Telegram
*/
public
function
setUploadPath
(
$path
)
{
$this
->
upload_path
=
$path
;
return
$this
;
}
/**
* Get custom upload path
*
* @return string
*/
public
function
getUploadPath
()
{
return
$this
->
upload_path
;
}
/**
* Set custom download path
*
* @param string $path Custom download path
*
* @return \Longman\TelegramBot\Telegram
*/
public
function
setDownloadPath
(
$path
)
{
$this
->
download_path
=
$path
;
return
$this
;
}
/**
* Get custom download path
*
* @return string
*/
public
function
getDownloadPath
()
{
return
$this
->
download_path
;
}
/**
* Set command config
*
* Provide further variables to a particular commands.
* For example you can add the channel name at the command /sendtochannel
* Or you can add the api key for external service.
*
* @param string $command
* @param array $config
*
* @return \Longman\TelegramBot\Telegram
*/
public
function
setCommandConfig
(
$command
,
array
$config
)
{
$this
->
commands_config
[
$command
]
=
$config
;
return
$this
;
}
/**
* Get command config
*
* @param string $command
*
* @return array
*/
public
function
getCommandConfig
(
$command
)
{
return
isset
(
$this
->
commands_config
[
$command
])
?
$this
->
commands_config
[
$command
]
:
[];
}
/**
* Get API key
*
* @return string
*/
public
function
getApiKey
()
{
return
$this
->
api_key
;
}
/**
* Get Bot name
*
* @return string
*/
public
function
getBotName
()
{
return
$this
->
bot_name
;
}
/**
* Get Version
*
* @return string
*/
public
function
getVersion
()
{
return
$this
->
version
;
}
/**
* Set Webhook for bot
*
* @param string $url
* @param string|null $path_certificate
*
* @return \Longman\TelegramBot\Entities\ServerResponse
*/
public
function
setWebHook
(
$url
,
$path_certificate
=
null
)
{
if
(
empty
(
$url
))
{
throw
new
TelegramException
(
'Hook url is empty!'
);
}
$result
=
Request
::
setWebhook
(
$url
,
$path_certificate
);
if
(
!
$result
->
isOk
())
{
throw
new
TelegramException
(
'Webhook was not set! Error: '
.
$result
->
getErrorCode
()
.
' '
.
$result
->
getDescription
()
);
}
return
$result
;
}
/**
* Unset Webhook for bot
*
* @return \Longman\TelegramBot\Entities\ServerResponse
*/
public
function
unsetWebHook
()
{
$result
=
Request
::
setWebhook
();
if
(
!
$result
->
isOk
())
{
throw
new
TelegramException
(
'Webhook was not unset! Error: '
.
$result
->
getErrorCode
()
.
' '
.
$result
->
getDescription
()
);
}
return
$result
;
}
/**
* Replace function `ucwords` for UTF-8 characters in the class definition and commands
*
* @param string $str
* @param string $encoding (default = 'UTF-8')
*
* @return string
*/
protected
function
mb_ucwords
(
$str
,
$encoding
=
'UTF-8'
)
{
return
mb_convert_case
(
$str
,
MB_CASE_TITLE
,
$encoding
);
}
/**
* Replace function `ucfirst` for UTF-8 characters in the class definition and commands
*
* @param string $str
* @param string $encoding (default = 'UTF-8')
*
* @return string
*/
protected
function
mb_ucfirst
(
$str
,
$encoding
=
'UTF-8'
)
{
return
mb_strtoupper
(
mb_substr
(
$str
,
0
,
1
,
$encoding
),
$encoding
)
.
mb_strtolower
(
mb_substr
(
$str
,
1
,
mb_strlen
(
$str
),
$encoding
),
$encoding
);
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment