Jacek Kowalski
2012-07-09 a430ee3e4fe39274e92fd311458e84ee2d539f99
commit | author | age
8bd4d9 1 <?php
JK 2 class bot_help_module implements BotModule {
3     const BOT_HELP_FILE = '/cache/help.cache';
4     
5     private $PDO;
6     
7     private function getHelp() {
8         if(is_file(BOT_TOPDIR.self::BOT_HELP_FILE)) {
9             return unserialize(file_get_contents(BOT_TOPDIR.self::BOT_HELP_FILE));
10         }
11         
12         $st = $this->PDO->prepare('SELECT DISTINCT dir, init FROM functions ORDER BY dir ASC');
13         $st->execute();
14         $data = $st->fetchAll();
15         
16         $help = new BotMsg();
17         
18         foreach($data as $element) {
19             $dir = $element['dir'];
20             
21             if(!is_file(BOT_TOPDIR.$dir.'/init.php')) {
22                 continue;
23             }
24             
25             $class = include_once(BOT_TOPDIR.$dir.'/init.php');
26             if($class === TRUE) {
27                 $class = $element['init'];
28             }
29             
30             if(!$class || !class_exists($class, FALSE)) {
31                 continue;
32             }
33             
34             $init = new $class;
35             if(!($init instanceof BotModuleInit)) {
36                 continue;
37             }
38             
39             $row = $init->help();
40             if(!($row instanceof BotMsg)) {
41                 continue;
42             }
43             
44             $help->append($row);
45         }
46         
47         $help->append('Objaśnienie:<br />'."\n"
48             . '   <i>argument</i> jest wymagany<br />'."\n"
49             . '   <i>[argument]</i> jest opcjonalny');
50         
51         file_put_contents(BOT_TOPDIR.self::BOT_HELP_FILE, serialize($help));
52         
53         return $help;
54     }
55     
56     function handle($msg, $params) {
57         try {
58             try {
59                 $this->PDO = new PDO('sqlite:'.BOT_TOPDIR.'/cache/functions.sqlite');
60                 $this->PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
61                 $this->PDO->setAttribute(PDO::ATTR_ORACLE_NULLS, PDO::NULL_TO_STRING);
62             }
63             catch(Exception $e) {
64                 @unlink(BOT_TOPDIR.'/cache/functions.sqlite');
65                 throw $e;
66             }
67             
68             $args = trim($msg->args);
69             
70             if(empty($args)) {
71                 return $this->getHelp();
72             }
73             
74             $args = strtok($args, " \t\n\r\0\x0B");
75             
76             $st = $this->PDO->prepare('SELECT dir, init FROM functions WHERE name=? ORDER BY priority ASC');
77             $st->execute(array($args));
78             $data1 = $st->fetchAll();
79             $st->execute(array('*'));
80             $data2 = $st->fetchAll();
81             
82             $data = array_merge($data1, $data2);
83             unset($data1, $data2);
84             
85             foreach($data as $func) {
86                 if(!is_file(BOT_TOPDIR.$func['dir'].'/init.php')) {
87                     continue;
88                 }
89                 
90                 $class = require_once(BOT_TOPDIR.$func['dir'].'/init.php');
91                 if($class === TRUE) {
92                     $class = $func['init'];
93                 }
94                 
95                 if(!$class || !class_exists($class, FALSE)) {
96                     continue;
97                 }
98             
99                 $init = new $class;
100                 if(!($init instanceof BotModuleInit)) {
101                     continue;
102                 }
103                 
104                 $help = $init->help($args);
105                 if($help instanceof BotMsg) {
106                     return $help;
107                 }
108             }
109         }
110         catch(Exception $e) {
111             return new BotMsg('Wystąpił błąd podczas pobierania pomocy dla polecenia. Komunikat:<br />'.nl2br($e));
112         }
113     }
114 }
115 ?>