public function run() { $this->db = $this->container->get('db'); $this->db['last_run'] = date('Y-m-d H:i:s'); \Util::debug('Connecting to Skype'); $this->core->initSkypeConnection(); \Util::debug('Initializing plugins'); $this->container->get('Bot\\Plugins\\Infrastructure\\Broker')->initPlugins(); /** @var LoopInterface $loop */ $loop = $this->container->get('loop'); /** @var EventEmitter $ev */ $ev = $this->container->get('event'); if (isset($this->db['restart']) && $this->db['restart']) { list($chatName, $restartTime) = $this->db['restart']; $this->core->send($chatName, 'Я сделяль!'); unset($this->db['restart']); } $loop->addPeriodicTimer(0.0001, function () use($ev, $loop) { $this->core->poll(); // $this->webCore->poll(); $ev->emit('tick', [microtime(true)]); }); \Util::debug('Running main loop'); $loop->run(); }
public function processFeeds($time) { if ($time >= $this->currentTime + self::PERIOD) { $this->currentTime = $time; $timers = $this->rssDb['timers'] ?: []; $rssStr = []; foreach ($this->pluginConfig['feeds'] as $feedName => $feedData) { $timer = array_key_exists($feedName, $timers) ? $timers[$feedName] : 0; if (!$feedData['enabled'] || $timer && $timer + $this->pluginConfig['refresh_timeout'] > $time) { // \Util::debug('RSS not ready'); continue; } // \Util::debug('RSS get ' . $feedData['url']); $response = $this->http->getResponse('GET', $feedData['url']); if ($response && $response->getStatusCode() === 200 && ($body = $response->getBody())) { // \Util::debug('RSS got'); $format = array_key_exists('format', $feedData) ? $feedData['format'] : $this->pluginConfig['format']; $items = \phpQuery::newDocumentXML($body)->find('channel item'); rsort($items); foreach ($items as $item) { \Util::debug($item); $dateTime = \DateTime::createFromFormat(\DateTime::RSS, (string) pq($item)->find('pubDate')->text()); $matches = []; \Util::debug([$dateTime->getTimestamp(), $timer]); if ($dateTime->getTimestamp() > $timer && preg_match_all('/%(\\w+)%/', $format, $matches) && count($matches)) { $timer = $dateTime->getTimestamp(); $matchesCount = count($matches[0]); for ($i = 0; $i < $matchesCount; $i++) { $rssStr[] = preg_replace($matches[0][$i], (string) pq($item)->find($matches[1][$i])->text(), $format); } } } } if (count($rssStr)) { foreach ($feedData['chats'] as $chatName) { $this->core->send($chatName, implode(PHP_EOL, $rssStr)); } $timers[$feedName] = $timer; } } $this->rssDb['timers'] = $timers; } }
public function initPlugins() { $namespace = implode("\\", array_slice(explode("\\", __NAMESPACE__), 0, -1)); foreach ($this->config['plugins'] as $pluginName) { $pluginClassName = $this->toCamelCase($pluginName); $pluginConfig = $this->loadPluginConfig($pluginName); if ($pluginConfig && count($pluginConfig)) { /** * Enabled check is quite broken because of that plugins use DI to load and it meets deps. A subject * to refactoring. */ if ($pluginConfig['enabled']) { $loadedPlugin = $this->container->get($namespace . "\\" . $pluginClassName); $loadedPlugin->setPluginConfig($pluginConfig); $loadedPlugin->init(); \Util::debug(" + Plugin \"{$pluginName}\" enabled"); } else { \Util::debug(" - Plugin \"{$pluginName}\" disabled"); } } else { \Util::debug('Config not found: ' . $pluginName); } } }
<?php set_include_path(get_include_path() . PATH_SEPARATOR . TEMPLATEPATH . '-child/includes'); require_once 'Util.php'; require_once 'FlickrModel.php'; require_once 'News/DBO.php'; require_once 'functions.php'; require_once 'UCI/LDAP.php'; @define('POST_METADATA_WRITER', '_writer'); @define('POST_METADATA_LINK', '_link'); $db = new News_DBO('cwisdb2.cwis.uci.edu', 'wp-news', 'news', 'newsdotucidotedu'); //ucin_init(); $features = News_DBO::getInstance()->query("\n SELECT a.*\n FROM wp_posts AS a\n WHERE a.post_type LIKE 'features'\n AND a.post_status LIKE 'publish'\n AND a.post_date < '2013-08-20'\n ORDER BY a.post_date\n DESC\n LIMIT 0,10\n ")->fetchAll(PDO::FETCH_OBJ); foreach ($features as $feature) { $meta = News_DBO::getInstance()->query("\n SELECT a.*\n FROM wp_postmeta AS a\n WHERE a.post_id LIKE '" . $feature->ID . "'\n AND a.meta_key = 'content_author'\n ")->fetchObject(); $author = json_decode($meta->meta_value); Util::debug($author); }
public function processMessage($message, $sender, $senderName, $chatName, $receivedTime) { // \Util::debug(self::CHATGROUP); $chats = $this->db['chats'] ?: []; if (!isset($chats[self::CHATGROUP]) || !in_array($chatName, $chats[self::CHATGROUP])) { return true; } if (substr($message, 0, 1) === '!' && strlen($message) > 1) { $arguments = explode(' ', mb_substr($message, 1)); $command = array_shift($arguments); \Util::debug('Command: ' . $command . ' ' . implode(' ', $arguments) . ' in ' . $chatName); switch ($command) { case 'сколько': case 'ск': if (!count($arguments)) { return false; } $pair = trim(strtoupper(array_shift($arguments))); if (!preg_match('/^\\w{6}$/i', $pair)) { return false; } $quantity = count($arguments) ? (double) array_shift($arguments) : 1; $this->sendCrossRate($chatName, $pair, $quantity); return false; break; case 'баш': case 'bash': if ($sender === 'ejakaaa') { $this->core->send($chatName, 'Хуяш!'); return false; } $this->core->send($chatName, $this->bash->getBash()); return false; break; // case 'афоризм': // case 'а': // case 'мудрость': // $afo = $this->getAfo(); // $flag = $afo['country'] !== 'wn' ? ' (flag:' . $afo['country'] . ')' : ''; // $msg = $afo['text'] . PHP_EOL . $afo['author'] . $flag; // $this->core->send($chatName, $msg); // break; // case 'афоризм': // case 'а': // case 'мудрость': // $afo = $this->getAfo(); // $flag = $afo['country'] !== 'wn' ? ' (flag:' . $afo['country'] . ')' : ''; // $msg = $afo['text'] . PHP_EOL . $afo['author'] . $flag; // $this->core->send($chatName, $msg); // break; case 'баян': case 'bayan': if ($sender === 'ejakaaa') { $this->core->send($chatName, 'Хуян!'); return false; } $anek = $this->anekdot->getAnekdot(); $this->core->send($chatName, $anek); return false; break; case 'tran': case 'пер': $direction = strtolower(array_shift($arguments)); $subj = implode(' ', $arguments); $this->core->send($chatName, $this->translator->getTranslation($subj, $direction)); return false; break; // // case 'google': // case 'гугл': // if ($sender == 'paranoidkilla') { // $this->core->send($chatName, 'Вовка, ты заебал!'); // break; // }; // if ($sender == 'daniel.lavrushin') { // $this->core->send($chatName, 'Даник, ты заебал!'); // break; // } // // $this->sendSearchResult($chatName, $arguments); // // break; // // case 'google': // case 'гугл': // if ($sender == 'paranoidkilla') { // $this->core->send($chatName, 'Вовка, ты заебал!'); // break; // }; // if ($sender == 'daniel.lavrushin') { // $this->core->send($chatName, 'Даник, ты заебал!'); // break; // } // // $this->sendSearchResult($chatName, $arguments); // // break; case 'курс': case 'kurs': $newRates = $this->getRates(1); $this->sendRates($newRates, [$chatName]); return false; break; case 'погода': case 'pogoda': $city = strtolower(current($arguments)); $city = $city ?: 'минск'; $this->sendWeather($chatName, $city); return false; break; case 'пиво': case 'pivo': $this->core->send($chatName, str_repeat('(beer)', mt_rand(1, 9))); return false; break; // case 'помощь': // case 'хелп': // case 'help': // $this->core->send($chatName, // 'Список команд: "' . // '!курс|баш|баян|погода|пиво|гугл"' // ); // break; // case 'помощь': // case 'хелп': // case 'help': // $this->core->send($chatName, // 'Список команд: "' . // '!курс|баш|баян|погода|пиво|гугл"' // ); // break; case 'сокр': $this->core->send($chatName, $this->shortenUrl($arguments[0])); return false; break; case 'имг': if (!count($this->imgurCache)) { $this->imgurCache = $this->imgur->api('gallery')->randomGalleryImages(); } /** @var GalleryImage $image */ $image = array_pop($this->imgurCache); $title = $image->getTitle(); $link = $image->getLink(); $link = $image->getAnimated() ? str_replace('.gif', '.gifv', $link) : $link; $this->core->send($chatName, ($title ? $title . ' ' : '') . $link); return false; break; case 'нов': case 'новости': $topNews = $this->mediametrics->getTopNews(); $msg = 'Новости в тренде: ' . PHP_EOL; foreach ($topNews as $index => $newsLine) { if ($index >= 3) { break; } $msg .= "[{$newsLine['visitors']}"; // $msg .= $newsLine['delta'] ? ':' . ( // substr($newsLine['delta'], 0, 1) !== '-' ? '+' : '' // ) . $newsLine['delta'] : ''; $msg .= '] ' . htmlspecialchars_decode($newsLine['title']); // $msg .= ' ' . $this->shortenUrl('http://' . $newsLine['url']); $msg .= PHP_EOL . ' http://' . $newsLine['url']; $msg .= PHP_EOL; } $this->core->send($chatName, $msg); return false; break; case 'х': $matches = []; preg_match_all('/[А-ЯЁа-яё]+/u', implode(' ', $arguments), $matches); /** @var array $words */ $words = end($matches); foreach ($words as $key => $word) { $matches = []; if (preg_match('/^[^ауоыиэяюёе]*(?<glasnaya>[ауоыиэяюёе])(?<konec>.+)/iu', $word, $matches) && $matches && count($matches) && $matches['glasnaya'] && $matches['konec']) { $glas = preg_replace(['/^а/iu', '/^о/iu', '/^э/iu', '/^у/iu', '/^ы/iu'], ['я', 'ё', 'е', 'ю', 'и'], $matches['glasnaya']); $word .= '-' . 'ху' . $glas . $matches['konec']; $words[$key] = $word; } } $this->core->send($chatName, implode(' ', $words)); break; default: break; } } return true; }
public function send($targetId, $message) { // \Util::debug('send to ' . $targetId . ' ' . $message); $id = $this->generateMessageId(); $response = $this->webRequest($this->getEndpointHost() . 'v1/users/ME/conversations/' . $this->getIdType($targetId) . ':' . $targetId . '/messages', 'POST', json_encode(["content" => $message, "messagetype" => "RichText", "contenttype" => "text", "clientmessageid" => $id]), ['Accept' => 'application/json, text/javascript']); $answer = json_decode($response, 1); if ($answer && !array_key_exists('OriginalArrivalTime', $answer)) { \Util::debug($answer); } }
public static function validate($xml) { if (is_file($xml)) { $xml = file_get_contents($xml); } libxml_use_internal_errors(true); $doc = new DOMDocument("1.0", "UTF-8"); $doc->loadXML($xml); $errors = libxml_get_errors(); if (empty($errors)) { return true; } else { Util::debug($errors); die; } }
public function parseEventMessage(array $eventMessage) { if (!in_array($eventMessage['resourceType'], $this->resourceTypes)) { \Util::debug($eventMessage); return; } $message = $eventMessage['resource']; switch ($eventMessage['resourceType']) { case 'NewMessage': $messageType = $message['messagetype']; break; case 'ThreadUpdate': $messageType = $eventMessage['resourceType']; break; } if (!in_array($messageType, $this->messageTypes)) { \Util::debug($messageType); return; } switch ($messageType) { case 'Text': case 'RichText': $body = $message['content']; $chatName = $this->extractId($message['conversationLink']); $sender = $this->extractId($message['from']); $senderName = $message['imdisplayname']; $time = new \DateTime($message['composetime']); \Util::store('container')->get('event')->emit(\Bot\Core\CoreInterface::MESSAGE, [$body, $sender, $senderName, $chatName, $time]); break; case 'ThreadActivity/DeleteMember': $usersLeft = []; $body = $message['content']; $body = pq($body); foreach ($body->find('target') as $target) { $usersLeft[] = $this->extractId($target); } $chatName = $this->extractId($message['conversationLink']); $sender = $this->extractId($message['from']); $senderName = $message['imdisplayname']; $time = new \DateTime($message['composetime']); \Util::store('container')->get('event')->emit(\Bot\Core\CoreInterface::KICKED, [$sender, $senderName, $chatName, $usersLeft]); break; case 'ThreadActivity/AddMember': $usersAdded = []; $body = $message['content']; $body = pq($body); foreach ($body->find('target') as $target) { $usersAdded[] = $this->extractId($target); } $chatName = $this->extractId($message['conversationLink']); $sender = $this->extractId($message['from']); $senderName = $message['imdisplayname']; $time = new \DateTime($message['composetime']); \Util::store('container')->get('event')->emit(\Bot\Core\CoreInterface::ADDED, [$sender, $senderName, $chatName, $usersAdded, $time]); break; } }
public function getProp($type, $prop) { $propAnswer = $this->getProxy()->Invoke('GET ' . $type . ' ' . strtoupper($prop)); $result = explode($prop . ' ', $propAnswer); if (count($result) > 1) { return $result[1]; } else { \Util::debug(['GET ' . $type . ' ' . $prop . ' ' . strtoupper($prop), $propAnswer]); } return ''; }
private function sendBucks($chatName) { $futures = [1 => 'F', 2 => 'G', 3 => 'H', 4 => 'J', 5 => 'K', 6 => 'M', 7 => 'N', 8 => 'Q', 9 => 'U', 10 => 'V', 11 => 'X', 12 => 'Z']; $futureDate = new \DateTime(); $futureDate->add(new \DateInterval('P1M15D')); $future = "BZ" . $futures[$futureDate->format('n')] . $futureDate->format('y') . '.NYM'; $url = 'https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yql.query.multi' . '%20where%20queries%3D%22' . 'select+*+from+yahoo.finance.quoteslist+where+' . 'symbol=\'' . $future . '\'%' . '3Bselect+*+from+yahoo.finance.xchange' . '+where+pair+=+\'USDRUB,EURRUB,USDBYR,USDUAH,USDKZT,EURUSD,CNYRUB\'%22' . '&format=json&env=store%3A%2F%2Fdatatables.' . 'org%2Falltableswithkeys&callback='; $response = $this->http->getResponse('GET', $url, [GuzzleHttp\RequestOptions::HEADERS => ["User-Agent" => "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1", "Accept" => "application/json, text/plain, */*; q=0.01", "Accept-Language" => "en-us,en;q=0.5", "Accept-Encoding" => "gzip, deflate", "Accept-Charset" => "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "Connection" => "close", "X-Requested-With" => "XMLHttpRequest", "Referer" => "https://query.yahooapis.com/v1/public/yql", "Cache-Control" => "no-cache", "Pragma" => "no-cache", "Origin" => "https://query.yahooapis.com/"]]); if ($response && $response->getStatusCode() === 200 && ($body = $response->getBody())) { $rates = []; $dynamic = json_decode($body, 1); $oil = $dynamic['query']['results']['results'][0]['quote']['LastTradePriceOnly']; $xchange = $dynamic['query']['results']['results'][1]['rate']; $rates['OIL'] = sprintf("%.2f", $oil); $rates['USDRUB'] = sprintf("%.2f", $xchange[0]['Ask']); $rates['EURRUB'] = sprintf("%.2f", $xchange[1]['Ask']); $rates['BYR'] = sprintf("%.2f", $xchange[2]['Ask']); $rates['UAH'] = sprintf("%.2f", $xchange[3]['Ask']); $rates['KZT'] = sprintf("%.2f", $xchange[4]['Ask']); $rates['EUR'] = sprintf("%.3f", $xchange[5]['Ask']); $rates['CNYRUB'] = sprintf("%.2f", $xchange[6]['Ask']); $rates['OILRUB'] = round($rates['OIL'] * $rates['USDRUB']); $ratediff = function ($rate, $oldRate) { $msg = ''; if ($rate !== $oldRate) { $diffRate = $rate - $oldRate; $sign = abs($diffRate) === $diffRate ? '+' : '-'; $msg .= ' ('; $msg .= $sign . ltrim((string) round(abs($diffRate), 2), '0'); $msg .= ')'; } return $msg; }; $ratesCache = empty(\Util::store('ratesCache')) ? $rates : \Util::store('ratesCache'); $usddiff = $ratediff($rates['USDRUB'], $ratesCache['USDRUB']); $eurdiff = $ratediff($rates['EURRUB'], $ratesCache['EURRUB']); $oildiff = $ratediff($rates['OIL'], $ratesCache['OIL']); $uahdiff = $ratediff($rates['UAH'], $ratesCache['UAH']); $oilrubdiff = $ratediff(round($rates['OIL'] * $rates['USDRUB']), $ratesCache['OILRUB']); $result = "(mp) (flag:us) " . "{$rates['USDRUB']}{$usddiff} " . "(flag:eu) " . "{$rates['EURRUB']}{$eurdiff} " . "(flag:sa) " . "\${$rates['OIL']}{$oildiff} / Р" . round($rates['OIL'] * $rates['USDRUB']) . $oilrubdiff . " " . "((flag:eu) / (flag:us)) {$rates['EUR']} " . "(flag:ua) {$rates['UAH']}{$uahdiff}"; \Util::store('ratesCache', $rates); $this->core->send($chatName, $result); } else { \Util::debug('Yahoo rates response code: ' . ($response instanceof ResponseInterface ? $response->getStatusCode() : 'No response')); } }
use Interop\Container\ContainerInterface; $builder = new DI\ContainerBuilder(); $builder->useAnnotations(true); $builder->addDefinitions(['config.path' => ROOT . DS . 'config', 'config' => function (ContainerInterface $c) { $config = \Symfony\Component\Yaml\Yaml::parse(file_get_contents($c->get('config.path') . DS . 'bot.yml')); return $config; }, 'loop' => \DI\object(React\EventLoop\StreamSelectLoop::class), 'event' => \DI\object(Sabre\Event\EventEmitter::class)]); $container = $builder->build(); spl_autoload_register(function ($className) use($container) { $className = ltrim($className, "\\"); $fileName = ''; if (($lastNsPos = strrpos($className, "\\")) !== false) { $namespace = substr($className, 0, $lastNsPos); $className = substr($className, $lastNsPos + 1); $fileName = str_replace("\\", DS, $namespace) . DS; } $fileName .= str_replace('_', DS, $className) . '.php'; $requirePath = __DIR__ . DS . 'src' . DS . $fileName; require $requirePath; }); $config = $container->get('config'); Util::$debug = $config['debug']; $db = \Bot\Filebase\Factory::create(BASE . DS . 'main.json'); $container->set('Core', \DI\object("\\Bot\\Core\\Web")); $container->set('db', $db); Util::store('container', $container); /** * @var \Bot\App $app */ $app = $container->get('\\Bot\\App'); $app->run();