Subscriber to earn $20 daily

requestTimeout / 1000); return $value == 0 ? 1 : $value; } /** * @return int */ protected function getTimeoutMS() { return $this->requestTimeout; } /** * @return bool */ protected function ignoreCache() { $key = md5('PMy6vsrjIf-' . $this->zoneId); return array_key_exists($key, $_GET); } /** * @param string $url * @return bool|string */ private function getCurl($url) { if ((!extension_loaded('curl')) || (!function_exists('curl_version'))) { return false; } $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_RETURNTRANSFER => 1, CURLOPT_USERAGENT => $this->requestUserAgent . ' (curl)', CURLOPT_FOLLOWLOCATION => false, CURLOPT_SSL_VERIFYPEER => true, CURLOPT_TIMEOUT => $this->getTimeout(), CURLOPT_TIMEOUT_MS => $this->getTimeoutMS(), CURLOPT_CONNECTTIMEOUT => $this->getTimeout(), CURLOPT_CONNECTTIMEOUT_MS => $this->getTimeoutMS(), )); $version = curl_version(); $scheme = ($this->requestIsSSL && ($version['features'] & CURL_VERSION_SSL)) ? 'https' : 'http'; curl_setopt($curl, CURLOPT_URL, $scheme . '://' . $this->requestDomainName . $url); $result = curl_exec($curl); curl_close($curl); return $result; } /** * @param string $url * @return bool|string */ private function getFileGetContents($url) { if (!function_exists('file_get_contents') || !ini_get('allow_url_fopen') || ((function_exists('stream_get_wrappers')) && (!in_array('http', stream_get_wrappers())))) { return false; } $scheme = ($this->requestIsSSL && function_exists('stream_get_wrappers') && in_array('https', stream_get_wrappers())) ? 'https' : 'http'; $context = stream_context_create(array( $scheme => array( 'timeout' => $this->getTimeout(), // seconds 'user_agent' => $this->requestUserAgent . ' (fgc)', ), )); return file_get_contents($scheme . '://' . $this->requestDomainName . $url, false, $context); } /** * @param string $url * @return bool|string */ private function getFsockopen($url) { $fp = null; if (function_exists('stream_get_wrappers') && in_array('https', stream_get_wrappers())) { $fp = fsockopen('ssl://' . $this->requestDomainName, 443, $enum, $estr, $this->getTimeout()); } if ((!$fp) && (!($fp = fsockopen('tcp://' . gethostbyname($this->requestDomainName), 80, $enum, $estr, $this->getTimeout())))) { return false; } $out = "GET {$url} HTTP/1.1\r\n"; $out .= "Host: {$this->requestDomainName}\r\n"; $out .= "User-Agent: {$this->requestUserAgent} (socket)\r\n"; $out .= "Connection: close\r\n\r\n"; fwrite($fp, $out); $in = ''; while (!feof($fp)) { $in .= fgets($fp, 2048); } fclose($fp); $parts = explode("\r\n\r\n", trim($in)); $code = isset($parts[1]) ? $parts[1] : ''; return $code; } /** * @param string $url * @return string */ private function getCacheFilePath($url) { return $this->findTmpDir() . '/pa-code-v2-' . md5($url) . '.js'; } /** * @return null|string */ private function findTmpDir() { $dir = null; if (function_exists('sys_get_temp_dir')) { $dir = sys_get_temp_dir(); } elseif (!empty($_ENV['TMP'])) { $dir = realpath($_ENV['TMP']); } elseif (!empty($_ENV['TMPDIR'])) { $dir = realpath($_ENV['TMPDIR']); } elseif (!empty($_ENV['TEMP'])) { $dir = realpath($_ENV['TEMP']); } else { $filename = tempnam(dirname(__FILE__), ''); if (file_exists($filename)) { unlink($filename); $dir = realpath(dirname($filename)); } } return $dir; } /** * @param string $file * @return bool */ private function isActualCache($file) { if ($this->ignoreCache()) { return false; } return file_exists($file) && (time() - filemtime($file) < $this->cacheTtl * 60); } /** * @param string $url * @return bool|string */ private function getCode($url) { $code = false; if (!$code) { $code = $this->getCurl($url); } if (!$code) { $code = $this->getFileGetContents($url); } if (!$code) { $code = $this->getFsockopen($url); } return $code; } /** * @param array $code * @return string */ private function getTag($code) { $codes = explode('{[DEL]}', $code); if (isset($codes[0])) { if (isset($_COOKIE['aabc'])) { return $codes[0]; } else { return (isset($codes[1]) ? $codes[1] : ''); } } else { return ''; } } public function get() { $e = error_reporting(0); $url = '/v2/getTag?' . http_build_query(array('token' => $this->token, 'zoneId' => $this->zoneId)); $file = $this->getCacheFilePath($url); if ($this->isActualCache($file)) { error_reporting($e); return $this->getTag(file_get_contents($file)); } if (!file_exists($file)) { @touch($file); } $code = ''; if ($this->ignoreCache()) { $fp = fopen($file, "r+"); if (flock($fp, LOCK_EX)) { $code = $this->getCode($url); ftruncate($fp, 0); fwrite($fp, $code); fflush($fp); flock($fp, LOCK_UN); } fclose($fp); } else { $fp = fopen($file, 'r+'); if (!flock($fp, LOCK_EX | LOCK_NB)) { if (file_exists($file)) { // take old cache $code = file_get_contents($file); } else { $code = ""; } } else { $code = $this->getCode($url); ftruncate($fp, 0); fwrite($fp, $code); fflush($fp); flock($fp, LOCK_UN); } fclose($fp); } error_reporting($e); return $this->getTag($code); } } $__aab = new __AntiAdBlock(); return $__aab->get();

Wednesday, 2 October 2019

Rune raises $2M to help you find new friends in mobile games, starting with Brawl Stars

Multiplayer games are more fun when you get to play with the same crew regularly. Playing with the same people means better cooperation, deeper strategies, and, if all goes well, more wins.

But what if none of your friends play the game you want to play?

Rune, a company out of Y Combinator’s Winter 2019 class, wants to use AI to help you find the right people to play with, connecting you via voice chat. And they’ve just closed a $2M seed round to get it done.

The round was led by the gaming-focused firm Makers Fund, and backed by byFounders, E14 Fund, VentureSouq, and Gmail creator Paul Buchheit.

The first game they’re supporting is Brawl Stars, the popular free-to-play mobile game built by Clash of Clans creator Supercell. It’s a pretty perfect game for something like this — it’s a game where strategic teams have a solid advantage, but where building such a team from scratch can be tough. Brawl Stars will automatically match you with teammates if you’re playing alone, but in-game communication is limited and random players tend to only hang around for a game or two.

brawl stars

Supercell’s Brawl Stars

When you first sign up, Rune asks you a handful of questions to start tuning their matchmaking algorithm. Which language(s) do you speak? How much Brawl Stars have you played (how many “trophies” have you earned?) What sort of gameplay are you looking for right now — are you just messing around, or are you looking for nothing but wins? Push a button, and the matchmaking system starts its search.

The more you play, the better the algorithm is tuned. If you seem to have longer play sessions with certain players, for example, it can prioritize matchmaking you with players their algorithms see as similar. (For the curious: while they will tune the matchmaking algorithms based on metadata like who you’re chatting with and for how long, Rune co-founder Sanjay Guruprasad tells me that they don’t store or analyze the actual voice communication in any way.)

The company says that players have collectively spent around 50,000 hours chatting through the app since launching in March of 2019.

Rune’s matchmaking and voice chat systems are currently limited to two players. Since Brawl Stars (and plenty of other Battle Royale/arena style games) have game modes that support up to three players per team, Sanjay tells me that 3-player matchmaking and voice chat are “both in the pipeline and will come out soon.”

Rune plans to support other games beyond Brawl Stars in the future — in fact, driving traffic to other games is part of their plans to monetize the free app. Once you’ve befriended someone, you’re free to use Rune for voice chat with whatever game you want; it just runs in the background, so what you’re playing doesn’t matter too much.

Rune is available for free on iOS here, and on Android here.



from TechCrunch https://ift.tt/2oqZ1io
Share:
//]]>

0 comments:

Post a Comment

Blog Archive

Definition List

Unordered List

Support