<?php
require 'config.php';
define('CREATOR', $config['creator']);
require 'libs/Telegram-PHP/src/Autoloader.php';
require 'core/Core.php';
require 'core/Module.php';
require 'core/Functions.php';
require 'core/User.php';
require 'core/Chat.php';
if($config['telegram']['id'] == 0){
die("Please edit config.php before running.");
}
$core = new TelegramApp\Core();
// $core->addTimelog("Startup");
// Block unknown hosts
// ------------
if($config['safe_connect'] != FALSE){
$addr = array();
$pass = FALSE;
if(is_array($config['safe_connect'])){ $addr = $config['safe_connect']; }
// Add Default Telegram IP
// Updated in https://core.telegram.org/bots/webhooks
for($ip = 160; $ip <= 175; $ip++){
$addr[] = "149.154.${ip}.";
}
$addr[] = "91.108.4.";
$addr[] = "91.108.5.";
$addr[] = "91.108.6.";
$addr[] = "91.108.7.";
foreach($addr as $a){
if(strpos($_SERVER['REMOTE_ADDR'], $a) !== FALSE){
$pass = TRUE; break;
}
}
$headers = apache_request_headers();
// Need this headers
$check = [
"Content-Type" => "application/json",
"Connection" => "keep-alive"
];
if($pass){
foreach($check as $h => $v){
$get = FALSE;
$h = strtolower($h);
// $v = strtolower($v);
foreach($headers as $ah => $av){
if($h == trim(strtolower($ah)) and $v == $av){
$get = TRUE;
break;
}
}
if(!$get){
$pass = FALSE;
break;
}
}
}
if(!$pass){
error_log("Access denied from " .$_SERVER['REMOTE_ADDR'] ." to bot " .$config['telegram']['username']);
http_response_code(401);
die();
}
}
$bot = new Telegram\Bot($config['telegram']);
$tg = new Telegram\Receiver($bot);
$core->setTelegram($tg);
if($config['ignore_older_than'] > 5 and $tg->date(TRUE) >= $config['ignore_older_than']){
die();
}
if(!$config['convert_emoji']){ $tg->send->convert_emoji = FALSE; }
// Log received data
// ------------
if($config['log']){
$log = __DIR__ ."/log.txt";
$set = (!file_exists($log));
$fp = fopen($log, "a");
fwrite($fp, $tg->dump(TRUE) ."\n");
fclose($fp);
if($set){
chmod($log, 0220);
exec("chattr +a $log");
}
unset($log, $set, $fp);
}
// Detect and remove Telegram lock
// ------------
if($config['repeat_updateid'] > 0){
$updates = array();
if(file_exists("updateid.txt")){
$updates = file_get_contents("updateid.txt");
$updates = explode("\n", $updates);
}
array_unshift($updates, $tg->id); // Add element to beginning
if(count($updates) > $config['repeat_updateid']){
array_pop($updates); // Remove last element
}
file_put_contents("updateid.txt", implode("\n", $updates));
$c = 0;
foreach($updates as $u){
if($u == $updates[0]){ $c++; }
}
// Skip message - 200 OK
if($c >= $config['repeat_updateid']){ die(); }
unset($updates, $c);
}
// Blacklist user
// ------------
if(file_exists("blacklist.txt") && is_readable("blacklist.txt")){
$users = file_get_contents("blacklist.txt");
$users = explode("\n", $users);
foreach($users as $u){
if(empty($u) or substr($u, 0, 1) == "#"){ continue; }
if(
(is_numeric($u) && $tg->chat->id == $u) or
(is_string($u) && isset($tg->chat->username) && $tg->chat->username == $u)
){
die(); // Exit bot.
}
}
}
// Load DB class
// ------------
if($config['mysql']['enable']){
require 'libs/PHP-MySQLi-Database-Class/MysqliDb.php';
// require 'libs/PHP-MySQLi-Database-Class/dbObject.php';
$mysql = new MysqliDb($config['mysql']);
$core->setDB($mysql);
}
// Load User model
// ------------
if(file_exists('app/User.php')){
$core->load('User');
$User = new User($tg->user);
$User->setVar('telegram', $tg);
$core->addInherit('user', $User);
}
// Load Chat model
// ------------
if(file_exists('app/Chat.php')){
$core->load('Chat');
$Chat = new Chat($tg->chat);
$Chat->setVar('telegram', $tg);
$core->addInherit('chat', $Chat);
}
// Force add MySQL
// ------------
if($config['mysql']['enable']){
if($core->is_loaded('User')){ $User->setDB($mysql); }
if($core->is_loaded('Chat')){ $Chat->setDB($mysql); }
}
// Add tracking functions
// ------------
if($config['tracking'] !== FALSE){
require 'core/Tracking.php';
$track = ['name' => key($config['tracking']), 'token' => current($config['tracking'])];
if(!file_exists('core/Tracking/' .$track['name'] .'.php')){
die('Tracking core does not exist.');
}
require 'core/Tracking/' .$track['name'] .'.php';
$class = 'TelegramApp\\Tracking\\' .$track['name'];
$Tracking = new $class($track['token']);
$Tracking->setTelegram($tg);
$core->addInherit('tracking', $Tracking);
unset($track, $class);
}
// Add cache (currently Memcached)
// ------------
if($config['cache_memcached'] !== FALSE){
$Cache = new Memcached("TGAPP" .$config['telegram']['id']);
if(!count($Cache->getServerList())){
$Cache->addServers($config['cache_memcached']);
}
$core->addInherit('cache', $Cache);
}
// Add locale / string Functions
// -----------
if(is_dir("locale")){
require 'core/Strings.php';
$lang = $tg->language;
if(empty($lang)){ $lang = $config['language']; }
$Strings = new TelegramApp\Strings($lang);
$Strings->load();
$core->addInherit('strings', $Strings);
}
// Load modules
foreach(scandir("app") as $file){
if(is_readable("app/$file") && substr($file, -4) == ".php"){
$name = substr($file, 0, -4);
if(in_array($name, ["Main", "User", "Chat"])){ continue; }
$core->load($name);
}
}
$core->addTimelog("Running");
// Run bot
$core->load('Main', TRUE);
$core->addTimelog("Finished");
if(isset($config['log_time']) and $config['log_time']){
$log = __DIR__ ."/logtime.txt";
$set = (!file_exists($log));
$times = $core->getTimelogs();
$start = array_shift($times);
$end = array_pop($times);
$time = floor(($end[0] - $start[0]) * 1000);
$str = floor($start[0]) ." " .$tg->id ." $time\n";
$fp = fopen($log, "a");
fwrite($fp, $str);
fclose($fp);
}
?>
|