function SendTweets($msg) { $tweetId = SendTweet($msg); if ($tweetId && $tweetId !== true) { Retweet($tweetId, 'WoWTokenNA'); Retweet($tweetId, 'WoWTokenEU'); } }
function CheckForNewAlert() { $alert = GetCurrentAlert(); if (!$alert) { return; } if ($alert == GetLastAlert()) { return; } file_put_contents(LAST_ALERT_PATH, $alert); DebugMessage("New alert:\n{$alert}"); $tweet = GetTwitterSnippet($alert); $pngImage = GetTextImage($alert); SendTweet($tweet, $pngImage); }
function SendTweets($regions) { global $db; global $resultCodes, $timeZones, $timeLeftCodes; foreach ($regions as $region) { $fileRegion = strtolower($region); if ($fileRegion == 'us') { $fileRegion = 'na'; } $filenm = __DIR__ . '/wowtoken_cache/' . $fileRegion . '.tweets.json'; $lastTweetData = []; if (file_exists($filenm)) { $lastTweetData = json_decode(file_get_contents($filenm), true); if (json_last_error() != JSON_ERROR_NONE) { $lastTweetData = []; } } $sql = 'select * from tblWowToken w where region = ? order by `when` desc limit 2'; $stmt = $db->prepare($sql); $stmt->bind_param('s', $region); $stmt->execute(); $result = $stmt->get_result(); $bothTokenData = DBMapArray($result, null); $tokenData = array_shift($bothTokenData); $prevTokenData = count($bothTokenData) ? array_shift($bothTokenData) : []; $stmt->close(); $d = new DateTime('now', timezone_open($timeZones[$region])); $d->setTimestamp(strtotime($tokenData['when'])); $tweetData = ['timestamp' => strtotime($tokenData['when']), 'direction' => 0, 'record' => $tokenData, 'formatted' => ['BUY' => number_format($tokenData['marketgold']), 'TIMETOSELL' => isset($timeLeftCodes[$tokenData['timeleft']]) ? $timeLeftCodes[$tokenData['timeleft']] : $tokenData['timeleft'], 'RESULT' => isset($resultCodes[$tokenData['result']]) ? $resultCodes[$tokenData['result']] : 'Unknown: ' . $tokenData['result'], 'UPDATED' => $d->format('M jS, Y g:ia T')]]; $needTweet = false; $lastAmt = isset($lastTweetData['record']) ? $lastTweetData['record']['marketgold'] : 0; if ($lastAmt && $lastAmt != $tokenData['marketgold']) { $tweetData['formatted']['BUYCHANGEPERCENT'] = ($lastAmt < $tokenData['marketgold'] ? '+' : '') . round(($tokenData['marketgold'] / $lastAmt - 1) * 100, 2) . '%'; $tweetData['formatted']['BUYCHANGEAMOUNT'] = ($lastAmt < $tokenData['marketgold'] ? '+' : '') . number_format($tokenData['marketgold'] - $lastAmt); } $direction = 0; $sql = <<<EOF select if(count(*) < 2, 0, sign(sum(direction))) from ( select direction from ( select aa.*, sign(cast(market as signed) - cast(@prev as signed)) direction, @prev := market ignoreme from ( SELECT `when`, marketgold market FROM `tblWowToken` WHERE region = ? and result=1 order by `when` desc limit 100 ) aa, (select @prev := null) ab order by aa.`when` asc ) bb where bb.direction != 0 order by bb.`when` desc limit 2 ) cc EOF; $stmt = $db->prepare($sql); $stmt->bind_param('s', $region); $stmt->execute(); $stmt->bind_result($direction); if (!$stmt->fetch()) { DebugMessage('Direction fetch failed: ' . $stmt->error); $direction = 0; } $stmt->close(); // direction is either 1 (going up), 0 (mix/not sure), or -1 (going down) $tweetData['direction'] = $direction; //DebugMessage('Debug: '.$region.' last direction: '.(isset($lastTweetData['direction']) ? $lastTweetData['direction'] : 'unset').', cur direction: '.$direction); if (false && !$needTweet && $direction && isset($lastTweetData['direction']) && $lastTweetData['direction'] && $direction != $lastTweetData['direction']) { $needTweet = true; // this is a new confirmed, consistent direction DebugMessage('Need ' . $region . ' tweet after confirmed direction change from ' . $lastTweetData['direction'] . ' to ' . $direction); $tweetData['formatted']['TURNAROUND'] = 'Price going ' . ($direction > 0 ? 'up' : 'down') . '.'; } if (!$needTweet && !isset($lastTweetData['timestamp'])) { $needTweet = true; DebugMessage('Need ' . $region . ' tweet after no last tweet data'); } if (!$needTweet && $lastTweetData['timestamp'] < $tweetData['timestamp'] - TWEET_FREQUENCY_MINUTES * 60 + 5 && $tweetData['record']['result'] == 1) { // tweet at least every X minutes when result is good $needTweet = true; DebugMessage('Need ' . $region . ' tweet after ' . TWEET_FREQUENCY_MINUTES . ' minutes. (' . $lastTweetData['timestamp'] . ')'); } if (!$needTweet && $lastTweetData['record']['result'] != $tweetData['record']['result']) { $needTweet = true; DebugMessage('Need ' . $region . ' tweet after result changed'); } if (!$needTweet && $lastTweetData['record']['marketgold'] * (1 + PRICE_CHANGE_THRESHOLD) < $tweetData['record']['marketgold']) { $needTweet = true; DebugMessage('Need ' . $region . ' tweet after market price went up over ' . PRICE_CHANGE_THRESHOLD . '%'); } if (!$needTweet && $lastTweetData['record']['marketgold'] * (1 - PRICE_CHANGE_THRESHOLD) > $tweetData['record']['marketgold']) { $needTweet = true; DebugMessage('Need ' . $region . ' tweet after market price went down over ' . PRICE_CHANGE_THRESHOLD . '%'); } /* $changePct = (isset($prevTokenData['marketgold']) && $prevTokenData['marketgold']) ? round(($tokenData['marketgold'] / $prevTokenData['marketgold'] - 1) * 2000) : 0; if (($direction != 0) && ($changePct != 0) && (abs($changePct) != 20)) { // change happened this snapshot, and not by 1%, possible turnaround if (!$needTweet) { DebugMessage('Need '.$region.' tweet after non-1% change happened this snapshot ('.$changePct.')'); $needTweet = true; } if (!isset($tweetData['formatted']['TURNAROUND'])) { $tweetData['formatted']['TURNAROUND'] = 'Possible '.($direction > 0 ? 'maximum' : 'minimum').'.'; } } */ if (!$needTweet) { DebugMessage('No ' . $region . ' tweet needed.'); continue; } /* DebugMessage(print_r($prevTokenData, true)); DebugMessage(print_r($tweetData, true)); DebugMessage(print_r($lastTweetData, true)); */ if ($tweetId = SendTweet(strtoupper($fileRegion), $tweetData, GetChartURL($region, strtoupper($fileRegion)), $lastTweetData)) { file_put_contents($filenm, json_encode($tweetData)); } if ($tweetId && $tweetId !== true) { switch (strtoupper($fileRegion)) { case 'NA': case 'EU': Retweet($tweetId, 'WoWToken' . strtoupper($fileRegion)); break; } } } }