function SendTweets($msg)
{
    $tweetId = SendTweet($msg);
    if ($tweetId && $tweetId !== true) {
        Retweet($tweetId, 'WoWTokenNA');
        Retweet($tweetId, 'WoWTokenEU');
    }
}
Exemple #2
0
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;
            }
        }
    }
}