<?php

define('BOT_TOKEN', '<token>');
define('API_URL', 'https://api.telegram.org/bot'.BOT_TOKEN.'/');

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

$mysql_user	= 'mysql_user';
$mysql_pass	= 'mysql_password';

$db = new PDO('mysql:host=127.0.0.1;dbname=certalertbot;charset=utf8mb4', $mysql_user, $mysql_pass);

$help = "
<strong>CertAlert</strong> bot
This bot sends an alert when a certificate matching a certain rule is logged in the Certificate Trasparency.


<pre>/list
</pre>
To list the current rules.

<pre>/delete &lt;id&gt;
</pre>
To delete a rule.

<pre>/add &lt;in/start/end&gt; &lt;string&gt;
</pre>
To add a rule.
<i>in</i> matches the given substring in any postition, <i>start</i> at the beginning and <i>end</i> at the end.

For special characters use the IDNA encoding. 
";

function reply($chatid, $reply) {           
        return file_get_contents(API_URL."sendmessage?chat_id=".$chatid."&text=".urlencode($reply)."&parse_mode=HTML");
} 
	
$content = file_get_contents("php://input");
//error_log($content);
$update = json_decode($content, true);
$chatid = $update["message"]["chat"]["id"];

$fromid = $update["message"]["from"]["id"];
$fromusername = $update["message"]["from"]["username"];
$command = explode(" ", $update['message']['text'])[0];

switch($command) {
	case '/start':
		$reply = $help;
	break;
	case '/list':
		$stmt = $db->prepare("SELECT id, type, value FROM rules where userid = ? ORDER BY timestamp ASC");
		$stmt->execute(array($fromid));
		$rules = $stmt->fetchAll(PDO::FETCH_ASSOC);
		if (!empty($rules)) {
			$reply = "<strong>ID\tType\tValue</strong>\n";
			foreach ($rules as $rule) {
				switch($rule['type']) {
					case 0:
						$type = "in";
					break;
					case 1:
						$type = "start";
					break;
					case 2:
						$type = "end";
					break;
				}
				$reply .= $rule['id']."\t<i>".$type."</i>\t".htmlentities($rule['value'])."\n";
			}	
		} else {
			$reply = "There are no rules yet";
		}	
	break;
	break;
	case '/add':
                $exp = explode(" ", $update['message']['text']);                                  
		$type = $exp[1];
		$value = $exp[2];
		if (strlen($value) < 5) {
			$reply = "The filter must be at least 5 chars.";
			break;
		}
		switch($type) {
			case 'in':
				$type = 0;
			break;
			case 'start':
				$type = 1;
			break;
			case 'end':
				$type = 2;
			break;
			default:
				$type = -1;
			break;
		}
		if ($type > -1) {
	        	$stmt = $db->prepare("INSERT INTO rules (userid, chatid, type, value, timestamp) VALUES (?, ?, ?, ?, CURRENT_TIMESTAMP())");
			$stmt->execute(array($fromid, $chatid, $type, $value));
			$id = $db->lastInsertId();
			$toadd["id"] = $id;
			$toadd["value"] = array("t" => $type, "v" => $value, "c" => $chatid);
			$toadd = json_encode($toadd, JSON_NUMERIC_CHECK);
			$redis->rPush('toadd', $toadd);
			$reply = "Rule added, check with /list";
		} else {
			$reply = "Invalid rule type.";
		}                                                                     

	break;
	case '/delete':
                $exp = explode(" ", $update['message']['text']);
                $id = $exp[1];                                                                                                
                $stmt = $db->prepare("DELETE FROM rules WHERE id = ? AND userid = ?");
		$stmt->execute(array($id, $fromid));
		$redis->rPush('todel', $id);
		$reply = "Rule ".$id." deleted";                          
	break;
	default:
		$reply = "Unknown command";
	break;
}
reply($chatid, $reply);
	
?>
