· 8 years ago · May 13, 2018, 01:50 PM
1<?php
2
3class phpIBModule extends ModuleCore
4{
5 private $db, $wordIdCache;
6 public function getWordId($word)
7 {
8 $db = $this->db;
9 $word = trim($word);
10 if(!$word) return 0;
11 if(!isset($this->wordIdCache[$word]))
12 {
13 $obj = $db ->prepare('SELECT id FROM words WHERE word = :word');
14 $obj->execute(array('word' => $word));
15 $id = $obj->fetchColumn();
16 if(!$id)
17 {
18 $obj = $db->prepare('
19 INSERT INTO
20 words
21 (`word`)
22 VALUES
23 (:word)'
24 );
25 $obj->execute(array('word' => $word));
26 $id = $db->lastInsertId();
27 }
28 if(isset($this->wordIdCache[$word]))
29 {
30 unset($this->wordIdCache[$word]);
31 }
32 $this->wordIdCache[$word] = $id;
33 if(count($this->wordIdCache) > 100) array_shift($this->wordIdCache);
34 }else{
35 $id = $this->wordIdCache[$word];
36 }
37 return $id;
38 }
39 public function ModuleInit()
40 {
41 $db = new PDO('sqlite:ai.db');
42 $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
43 $db->query('
44 CREATE TABLE IF NOT EXISTS
45 phrases
46 (
47 `word` INTEGER,
48 `left` INTEGER,
49 `right` INTEGER,
50 PRIMARY KEY (`word`, `left`, `right`)
51 );
52 ');
53 $db->query('
54 CREATE TABLE IF NOT EXISTS
55 words
56 (
57 `id` INTEGER PRIMARY KEY ASC,
58 `word` VARCHAR(45) NOT NULL
59 );
60 ');
61 $db->query('
62 CREATE INDEX IF NOT EXISTS
63 idx_words_word
64 ON `words` (`word`)
65 ');
66 $this->db = $db;
67 }
68 public function OnChannelText(ircChannel $channel, ircUser $user, $message)
69 {
70 $db = $this->db;
71 $chan = $channel->channel;
72 if($user->nick == "namelessbot" || $chan == '#opers') return;
73 $left = null;
74 $leftId = 0;
75 $message = preg_replace("/[^a-zA-Z0-9\s]/", "", $message);
76
77 $words = explode(' ', strtolower($message));
78 $words = array_map('trim', $words);
79 $words = array_filter($words);
80 //if($chan == '#vanadiel') $channel->sendMessage('got words:'.implode(',', $words));
81 $isRakia = array_search('rakia', $words);
82 if($isRakia !== false && count($words) > 1)
83 {
84 unset($words[$isRakia]);
85 $count = mt_rand(2,5);
86 if($count > count($words)) $count = count($words);
87 $keys = (array) array_rand($words, $count);
88
89 $string = array();
90 $subsetids = array();
91 $getWordId = $db->prepare('SELECT id FROM words WHERE word = :word');
92 $getPhrase = $db->prepare('SELECT
93 left, word, right
94 FROM phrases
95 WHERE
96 left = :word
97 OR
98 word = :word
99 OR
100 right = :word
101 ORDER BY RANDOM() LIMIT 1');
102 $getRandomNext = $db->prepare('
103 SELECT
104 word, right
105 FROM phrases
106 WHERE
107 left = :word
108 ORDER BY RANDOM() LIMIT 1
109 ');
110 if($keys)
111 {
112 foreach($keys as $key)
113 {
114 //error_log('word:'.$words[$key]);
115 $getWordId->execute(array('word' => $words[$key]));
116 $wordId = $getWordId->fetchColumn();
117 $getPhrase->execute(array('word' => $wordId));
118 $res = $getPhrase->fetch(PDO::FETCH_ASSOC);
119 if($res)
120 {
121 //if($chan == '#vanadiel') $channel->sendMessage('orig res:'.str_replace("\n",'',print_r($res,true)));
122 foreach($res as $sid)
123 {
124 //error_log('got row'.print_r($sid,true));
125 if($sid) $subsetids[] = $sid;
126 }
127 $next = $res['right'];
128 if($next)
129 {
130 $getRandomNext->execute(array('word' => $next));
131 $res = $getRandomNext->fetch(PDO::FETCH_ASSOC);
132 if($res)
133 {
134 //if($chan == '#vanadiel') $channel->sendMessage('added res:'.str_replace("\n",'',print_r($res,true)));
135 foreach($res as $sid)
136 {
137 //error_log('got row'.print_r($sid,true));
138 if($sid) $subsetids[] = $sid;
139 }
140 }else{
141 //$channel->sendMessage('failed res on next'.$next);
142 }
143 }else{
144 //$channel->sendMessage('next was empty ' . $next);
145 }
146 }
147 }
148 $getWord = $db->prepare('
149 SELECT
150 word
151 FROM
152 words
153 WHERE id = :id
154 ');
155 foreach($subsetids as $sid )
156 {
157
158 $getWord->execute(array('id' => $sid));
159 $string[] = $getWord->fetchColumn();
160 }
161
162 $string = implode(' ', $string);
163 $channel->sendMessage($string);
164 }
165 return;
166 }
167
168 reset($words);
169 if(count($words) > 2)
170 {
171 do
172 {
173 $word = current($words);
174 $next = next($words);
175 if($next === FALSE) $next = null;
176 if($left)
177 {
178 $leftId = $this->getWordId($left);
179 }else{
180 $leftId = 0;
181 }
182 $curId = $this->getWordId($word);
183 $left = $word;
184 if($next)
185 {
186 $rightId = $this->getWordId($next);
187 $word = $next;
188 }else{
189 $rightId = 0;
190 $word = null;
191 }
192 $db->prepare('
193 INSERT OR IGNORE INTO
194 phrases
195 (`word`, `left`, `right`)
196 VALUES
197 (:cur, :left, :right)
198 ')->execute(array(
199 'left' => $leftId,
200 'cur' => $curId,
201 'right' => $rightId)
202 );
203 } while($word);
204 }
205 }
206}