コード例 #1
0
ファイル: App.php プロジェクト: WaveCutz/skype-bot
 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();
 }
コード例 #2
0
ファイル: Rss.php プロジェクト: WaveCutz/skype-bot
 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;
     }
 }
コード例 #3
0
ファイル: Broker.php プロジェクト: WaveCutz/skype-bot
 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);
         }
     }
 }
コード例 #4
0
<?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);
}
コード例 #5
0
ファイル: Commands.php プロジェクト: WaveCutz/skype-bot
 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;
 }
コード例 #6
0
ファイル: Web.php プロジェクト: WaveCutz/skype-bot
 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);
     }
 }
コード例 #7
0
ファイル: xmldoc.php プロジェクト: floatla/ModLayer-Docs
 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;
     }
 }
コード例 #8
0
ファイル: Web.php プロジェクト: rakauchuk/skype-bot
 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;
     }
 }
コード例 #9
0
ファイル: Linux.php プロジェクト: WaveCutz/skype-bot
 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 '';
 }
コード例 #10
0
ファイル: Reactions.php プロジェクト: WaveCutz/skype-bot
 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'));
     }
 }
コード例 #11
0
ファイル: bot.php プロジェクト: rakauchuk/skype-bot
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();