From 7d6d77cfbccc05d58114b46ff152d1b13ae039fe Mon Sep 17 00:00:00 2001 From: slawkens Date: Fri, 15 Apr 2022 19:34:12 +0200 Subject: [PATCH] login.php is now part of official repo Big thanks to folks from OpenTibiaBR Team Will be updated in next commits to support latest TFS too --- .gitignore | 1 - login.php | 226 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 226 insertions(+), 1 deletion(-) create mode 100644 login.php diff --git a/.gitignore b/.gitignore index 3d9b6ccb..3ce9fb84 100644 --- a/.gitignore +++ b/.gitignore @@ -50,7 +50,6 @@ plugins/* !plugins/account-create-hint.json !plugins/account-create-hint landing -/login.php # system system/functions_custom.php diff --git a/login.php b/login.php new file mode 100644 index 00000000..0a641404 --- /dev/null +++ b/login.php @@ -0,0 +1,226 @@ +getAttribute('startdate'); + return date_create("{$date}")->format('U'); + } else { + $date = $table1->getAttribute('enddate'); + return date_create("{$date}")->format('U'); + } + } else { + foreach($table1 as $attr) { + if ($attr) { + return $attr->getAttribute($table2); + } + } + } +} + return; +} + +$request = file_get_contents('php://input'); +$result = json_decode($request); +$action = isset($result->type) ? $result->type : ''; + +switch ($action) { + case 'cacheinfo': + $playersonline = $db->query("select count(*) from `players_online`")->fetchAll(); + die(json_encode([ + 'playersonline' => (intval($playersonline[0][0])), + 'twitchstreams' => 0, + 'twitchviewer' => 0, + 'gamingyoutubestreams' => 0, + 'gamingyoutubeviewer' => 0 + ])); + break; + + case 'eventschedule': + $eventlist = []; + $file_path = config('server_path') . 'data/XML/events.xml'; + if (!file_exists($file_path)) { + die(json_encode([])); + break; + } + $xml = new DOMDocument; + $xml->load($file_path); + $tmplist = []; + $tableevent = $xml->getElementsByTagName('event'); + + foreach ($tableevent as $event) { + if ($event) { $tmplist = [ + 'colorlight' => parseEvent($event->getElementsByTagName('colors'), false, 'colorlight'), + 'colordark' => parseEvent($event->getElementsByTagName('colors'), false, 'colordark'), + 'description' => parseEvent($event->getElementsByTagName('description'), false, 'description'), + 'displaypriority' => intval(parseEvent($event->getElementsByTagName('details'), false, 'displaypriority')), + 'enddate' => intval(parseEvent($event, true, false)), + 'isseasonal' => getBoolean(intval(parseEvent($event->getElementsByTagName('details'), false, 'isseasonal'))), + 'name' => $event->getAttribute('name'), + 'startdate' => intval(parseEvent($event, true, true)), + 'specialevent' => intval(parseEvent($event->getElementsByTagName('details'), false, 'specialevent')) + ]; + $eventlist[] = $tmplist; } } + die(json_encode(['eventlist' => $eventlist, 'lastupdatetimestamp' => time()])); + break; + + case 'boostedcreature': + $boostDB = $db->query("select * from " . $db->tableName('boosted_creature'))->fetchAll(); + foreach ($boostDB as $Tableboost) { + die(json_encode([ + 'boostedcreature' => true, + 'raceid' => intval($Tableboost['raceid']) + ])); + } + break; + + case 'login': + + $port = $config['lua']['gameProtocolPort']; + + // default world info + $world = [ + 'id' => 0, + 'name' => $config['lua']['serverName'], + 'externaladdress' => $config['lua']['ip'], + 'externalport' => $port, + 'externaladdressprotected' => $config['lua']['ip'], + 'externalportprotected' => $port, + 'externaladdressunprotected' => $config['lua']['ip'], + 'externalportunprotected' => $port, + 'previewstate' => 0, + 'location' => 'BRA', // BRA, EUR, USA + 'anticheatprotection' => false, + 'pvptype' => array_search($config['lua']['worldType'], ['pvp', 'no-pvp', 'pvp-enforced']), + 'istournamentworld' => false, + 'restrictedstore' => false, + 'currenttournamentphase' => 2 + ]; + + $characters = []; + $account = null; + + // common columns + $columns = 'name, level, sex, vocation, looktype, lookhead, lookbody, looklegs, lookfeet, lookaddons, lastlogin, isreward, istutorial'; + + $account = new OTS_Account(); + $account->findByEmail($result->email); + $config_salt_enabled = fieldExist('salt', 'accounts'); + $current_password = encrypt(($config_salt_enabled ? $account->getCustomField('salt') : '') . $result->password); + + if (!$account->isLoaded() || $account->getPassword() != $current_password) { + sendError('Email or password is not correct.'); + } + + $players = $db->query("select {$columns} from players where account_id = " . $account->getId() . " AND deletion = 0"); + if($players && $players->rowCount() > 0) { + $players = $players->fetchAll(); + foreach ($players as $player) { + $characters[] = create_char($player); + } + } + + $save = false; + $timeNow = time(); + $query = $db->query("select `premdays`, `lastday` from `accounts` where `id` = " . $account->getId()); + if($query->rowCount() > 0) { + $query = $query->fetch(); + $premDays = (int)$query['premdays']; + $lastDay = (int)$query['lastday']; + $lastLogin = $lastDay; + } + else { + sendError("Error while fetching your account data. Please contact admin."); + } + if($premDays != 0 && $premDays != PHP_INT_MAX ) { + if($lastDay == 0) { + $lastDay = $timeNow; + $save = true; + } else { + $days = (int)(($timeNow - $lastDay) / 86400); + if($days > 0) { + if($days >= $premDays) { + $premDays = 0; + $lastDay = 0; + } else { + $premDays -= $days; + $reminder = (int)(($timeNow - $lastDay) % 86400); + $lastDay = $timeNow - $reminder; + } + + $save = true; + } + } + } else if ($lastDay != 0) { + $lastDay = 0; + $save = true; + } + if($save) { + $db->query("update `accounts` set `premdays` = " . $premDays . ", `lastday` = " . $lastDay . " where `id` = " . $account->getId()); + } + $premiumAccount = $premDays > 0; + $timePremium = time() + ($premDays * 86400); + + $worlds = [$world]; + $playdata = compact('worlds', 'characters'); + $session = [ + 'sessionkey' => "$result->email\n$result->password", + 'lastlogintime' => (!$account) ? 0 : $account->getLastLogin(), + 'ispremium' => ($config['lua']['freePremium']) ? true : $account->isPremium(), + 'premiumuntil' => ($account->getPremDays()) > 0 ? (time() + ($account->getPremDays() * 86400)) : 0, + 'status' => 'active', // active, frozen or suspended + 'returnernotification' => false, + 'showrewardnews' => true, + 'isreturner' => true, + 'fpstracking' => false, + 'optiontracking' => false, + 'tournamentticketpurchasestate' => 0, + 'emailcoderequest' => false + ]; + die(json_encode(compact('session', 'playdata'))); + break; + + default: + sendError("Unrecognized event {$action}."); + break; +} + +function create_char($player) { + global $config; + return [ + 'worldid' => 0, + 'name' => $player['name'], + 'ismale' => intval($player['sex']) === 1, + 'tutorial' => (bool)$player['istutorial'], + 'level' => intval($player['level']), + 'vocation' => $config['vocations'][$player['vocation']], + 'outfitid' => intval($player['looktype']), + 'headcolor' => intval($player['lookhead']), + 'torsocolor' => intval($player['lookbody']), + 'legscolor' => intval($player['looklegs']), + 'detailcolor' => intval($player['lookfeet']), + 'addonsflags' => intval($player['lookaddons']), + 'ishidden' => 0, + 'istournamentparticipant' => false, + 'ismaincharacter' => true, + 'dailyrewardstate' => intval($player['isreward']), + 'remainingdailytournamentplaytime' => 0 + ]; +}