Add files via upload

This commit is contained in:
Bluzume 2022-03-05 18:39:07 -05:00 committed by GitHub
parent 396a707b93
commit 8f174af37f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 1238 additions and 0 deletions

150
ON/api_en/data.json Normal file
View File

@ -0,0 +1,150 @@
{
"EN": {
"AppVer": "1.4.1",
"Challanges": [
{
"dsp_type": "0",
"end_at": "2100-12-31 23:59:59",
"id": "19",
"kind": "2",
"reward1": "1,tg18_ac15036_1",
"reward10": "50,tg18_bg15005",
"reward2": "3,tg18_as15019_1",
"reward3": "5,tg18_oy15024_1",
"reward4": "10,tg18_as15001_1",
"reward5": "15,tg18_as15015_1",
"reward6": "20,tg18_bg15010",
"reward7": "25,tg18_as15021_1",
"reward8": "30,tg18_bg15018",
"reward9": "40,tg18_as15016_1",
"start_at": "2020-03-27 15:00:00",
"title": "Play the game in the Park and earn at least 1 point!"
},
{
"dsp_type": "0",
"end_at": "2100-12-31 23:59:59",
"id": "20",
"kind": "2",
"reward1": "1,tg18_ac15043_1",
"reward10": "50,tg18_as15009_1",
"reward2": "3,tg18_gh15007_1",
"reward3": "5,tg18_gh15001_1",
"reward4": "10,tg18_gh15004_1",
"reward5": "15,tg18_gh15013_1",
"reward6": "20,tg18_gh15015_1",
"reward7": "25,tg18_gh15010_1",
"reward8": "30,tg18_gh15002_1",
"reward9": "40,tg18_as15013_1",
"start_at": "2020-03-27 15:00:00",
"title": "Play the Restaurant game and earn at least 1 point!"
},
{
"dsp_type": "0",
"end_at": "2100-12-31 23:59:59",
"id": "21",
"kind": "2",
"reward1": "1,tg18_ac15041_1",
"reward10": "0",
"reward2": "0",
"reward3": "0",
"reward4": "0",
"reward5": "0",
"reward6": "0",
"reward7": "0",
"reward8": "0",
"reward9": "0",
"start_at": "2020-03-27 15:00:00",
"title": "Update your area in My Profile."
},
{
"dsp_type": "0",
"end_at": "2100-12-31 23:59:59",
"id": "22",
"kind": "2",
"reward1": "1,tg18_ac15030_1",
"reward10": "0",
"reward2": "0",
"reward3": "0",
"reward4": "0",
"reward5": "0",
"reward6": "0",
"reward7": "0",
"reward8": "0",
"reward9": "0",
"start_at": "2020-03-27 15:00:00",
"title": "Update your avatar in My Profile."
},
{
"dsp_type": "0",
"end_at": "2100-12-31 23:59:59",
"id": "23",
"kind": "2",
"reward1": "1,tg18_oy15021_1",
"reward10": "50,tg18_bg15009",
"reward2": "5,tg18_oy15032_1",
"reward3": "10,tg18_oy15012_1",
"reward4": "20,tg18_oy15020_1",
"reward5": "25,tg18_oy15011_1",
"reward6": "30,tg18_as15007_1",
"reward7": "35,tg18_oy15016_1",
"reward8": "40,tg18_bg15017",
"reward9": "45,tg18_as15010_1",
"start_at": "2020-03-27 15:00:00",
"title": "Go to the Tama Party!"
},
{
"dsp_type": "0",
"end_at": "2100-12-31 23:59:59",
"id": "24",
"kind": "2",
"reward1": "1,tg18_ac15037_1",
"reward10": "50,tg18_as15005_1",
"reward2": "3,tg18_as15011_1",
"reward3": "5,tg18_as15018_1",
"reward4": "10,tg18_as15003_1",
"reward5": "15,tg18_ac15035_1",
"reward6": "20,tg18_as15008_1",
"reward7": "25,tg18_ac15042_1",
"reward8": "30,tg18_as15004_1",
"reward9": "40,tg18_bg15007",
"start_at": "2020-03-27 15:00:00",
"title": "Bring your My Tama into the APP!"
},
{
"dsp_type": "0",
"end_at": "2100-12-31 23:59:59",
"id": "25",
"kind": "3",
"reward1": "2,tg18_oy15035_1",
"reward10": "50,tg18_oy15013_1",
"reward2": "3,tg18_oy15027_1",
"reward3": "4,tg18_oy15019_1",
"reward4": "5,tg18_gh15016_1",
"reward5": "10,tg18_oy15037_1",
"reward6": "15,tg18_oy15029_1",
"reward7": "20,tg18_oy15036_1",
"reward8": "30,tg18_oy15014_1",
"reward9": "40,tg18_oy15006_1",
"start_at": "2020-03-27 15:00:00",
"title": "Welcome Bonus Login Completed!"
}
],
"EventCollabAsset": 55,
"EventGameId": [
1,
2
],
"EventInfoHtml": "en_eventinfo_220301",
"EventMonthlyId": 0,
"GameAsset": 1,
"InfoHtml": "en_info_220301",
"MenteFlag": 0,
"ParkAsset": 1,
"PartyAsset": 1,
"Tutorials": [
1,
2
]
},
"JP": {}
}

809
ON/api_en/meets.php Normal file
View File

@ -0,0 +1,809 @@
<?php
// == COMMANDS ==
define("COMMAND_AUTH", 11);
define("COMMAND_GET_HOME", 12);
define("COMMAND_PARENTAL_CONTROL", 30);
define("COMMAND_SAVE_CHAR_DATA", 44);
define("COMMAND_GET_PROFILE", 46);
define("COMMAND_GET_NOTEBOOK", 51);
define("COMMAND_GET_SETTINGS", 58);
// == STATUS ==
define("STATUS_INVALID_JSON", 9);
define("STATUS_INVALID_AUTH", 7);
define("STATUS_INVALID_LOGINCODE", 8);
define("STATUS_OK", 0);
// == USER TYPES ==
define("USER_GUEST", 0);
define("USER_BNID", 1);
define("USER_LINE", 2);
define("USER_MIX", 3);
define("USER_MIX2", 4);
// == API CONSTANTS ==
define("ENGLISH_API", true);
define("API_KEY", "695719951020924");
define("FLAG_ON", "ON");
define("FLAG_OFF", "OFF");
define("DEFAULT_BNID_NAME", "");
define("DEFAULT_BNID_FLAG", FLAG_OFF);
define("MOVING_FLAG", 0);
define("TERMS_COUNT", "2");
// == DATABASE CONFIG ==
$dbname = 'MeetsEn';
$dbuser = 'root';
$dbpass = 'kingofitall413';
$dbhost = '127.0.0.1';
// == FUNCTIONS ==
$connect = NULL;
$gameData = json_decode(file_get_contents('data.json'));
$result = array( "ResultCode" => STATUS_INVALID_JSON );
if(ENGLISH_API)
$gameData = $gameData->EN;
else
$gameData = $gameData->JP;
function ReadGameSettings(){
global $gameData;
return $gameData;
}
function DbConnect(){
global $connect;
global $dbhost;
global $dbuser;
global $dbpass;
global $dbname;
if($connect === NULL)
$connect = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname);
return $connect;
}
function populate_db()
{
$connect = DbConnect();
mysqli_query($connect, "CREATE TABLE IF NOT EXISTS Users(
UserId INT,
LoginSecret TEXT,
CustomerId BIGINT,
LastLoginCode TEXT,
BnidName TEXT,
BnidFlag TEXT,
UserKind INT,
UserLang INT,
LastLogin INT)");
mysqli_query($connect, "CREATE TABLE IF NOT EXISTS ParentalControls(
UserId INT,
DisableSearchTarget INT,
DisableViewSearchFriend INT,
DisableStampArea INT)");
mysqli_query($connect, "CREATE TABLE IF NOT EXISTS Profiles(
UserId INT,
CharaData TEXT,
CharaToyKey TEXT,
LikeCount INT,
LikeTotal INT,
AddressCode INT,
Sex INT,
Body INT,
Face INT,
Hair INT,
Top INT,
Bottom INT,
UserCode TEXT)");
mysqli_query($connect, "CREATE TABLE IF NOT EXISTS HomeInfo(
UserId INT,
Point INT,
EventPoint INT,
SearchFlag INT)");
mysqli_query($connect, "CREATE TABLE IF NOT EXISTS TutorialsCompleted(
UserId INT,
TutorialId INT,
TutorialData TEXT,
TutorialFlag INT,
TutorialGuestFlag INT,
TutorialMeetsFlag INT)");
mysqli_query($connect, "CREATE TABLE IF NOT EXISTS ChallangesCompleted(
UserId INT,
ChallangeId INT,
UserCount INT,
UserReward1Flag INT,
UserReward2Flag INT,
UserReward3Flag INT,
UserReward4Flag INT,
UserReward5Flag INT,
UserReward6Flag INT,
UserReward7Flag INT,
UserReward8Flag INT,
UserReward9Flag INT,
UserReward10Flag INT)");
mysqli_query($connect, "CREATE TABLE IF NOT EXISTS Notebook(
UserId INT,
NoteId INT,
RefUserId INT)");
}
function generate_usercode(){
$valid_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$total_valid = strlen($valid_chars);
$ascii_part = "";
for($i = 0; $i < 3; $i++){
$ascii_part .= $valid_chars[random_int(0, $total_valid-1)];
}
$id_part = random_int(100000, 999999);
return $ascii_part . strval($id_part);
}
function add_user($userId, $loginSecret, $customerId, $lastLoginCode, $bnidName, $bnidFlag, $userKind, $userLang)
{
$connect = DbConnect();
mysqli_begin_transaction($connect);
// Create users table entry
$loginDate = time();
$stmt = $connect->prepare("INSERT INTO Users VALUES(?,?,?,?,?,?,?,?,?)");
$stmt->bind_param("isssssiii", $userId,
$loginSecret,
$customerId,
$lastLoginCode,
$bnidName,
$bnidFlag,
$userKind,
$userLang,
$loginDate);
$stmt->execute();
// Create parental controls table entry
$stmt = $connect->prepare("INSERT INTO ParentalControls VALUES(?,0,0,0)");
$stmt->bind_param("i", $userId);
$stmt->execute();
// Create profile entry
$userCode = generate_usercode();
$stmt = $connect->prepare("INSERT INTO Profiles VALUES(?, '', 0, 0, 0, 100, 1, 1101, 1203, 1301, 1401, 1508, ?)");
$stmt->bind_param("is", $userId, $userCode);
$stmt->execute();
// Create home entry
$userCode = generate_usercode();
$stmt = $connect->prepare("INSERT INTO HomeInfo VALUES(?, 0, 0, 0)");
$stmt->bind_param("i", $userId);
$stmt->execute();
// Initalize Tutorials
foreach(ReadGameSettings()->Tutorials as $tutorial){
$stmt = $connect->prepare("INSERT INTO TutorialsCompleted VALUES(?, ?, '', 0, 0, 0)");
$stmt->bind_param("ii", $userId, $tutorial);
$stmt->execute();
}
// Initalize Challanges
foreach(ReadGameSettings()->Challanges as $challange){
$chid = intval($challange->id);
$stmt = $connect->prepare("INSERT INTO ChallangesCompleted VALUES(?, ?, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)");
$stmt->bind_param("ii", $userId, $chid);
$stmt->execute();
}
mysqli_commit($connect);
}
function set_last_login_date($userId){
$connect = DbConnect();
$lognDate = time();
$stmt = $connect->prepare("UPDATE Users SET LastLogin=? WHERE UserId=?");
$stmt->bind_param("ii", $loginDate,
$userId);
$stmt->execute();
}
function set_last_login_code($userId, $lastLoginCode){
$connect = DbConnect();
$stmt = $connect->prepare("UPDATE Users SET LastLoginCode=? WHERE UserId=?");
$stmt->bind_param("si", $lastLoginCode,
$userId);
$stmt->execute();
}
function validate_login_code($userId, $gotLoginCode){
$connect = DbConnect();
$stmt = $connect->prepare("SELECT LastLoginCode FROM Users WHERE UserId=?");
$stmt->bind_param("i", $userId);
$stmt->execute();
$result = $stmt->get_result();
return ($result->fetch_row()[0] === $gotLoginCode);
}
function get_user_parental_control($userId)
{
$connect = DbConnect();
$stmt = $connect->prepare("SELECT * FROM ParentalControls WHERE UserId=?");
$stmt->bind_param("i", $userId);
$stmt->execute();
$result = $stmt->get_result();
return $result->fetch_row();
}
function get_profile_data($userId)
{
$connect = DbConnect();
$stmt = $connect->prepare("SELECT * FROM Profiles WHERE UserId=?");
$stmt->bind_param("i", $userId);
$stmt->execute();
$result = $stmt->get_result();
return $result->fetch_row();
}
function get_notebook_data($userId)
{
$connect = DbConnect();
$stmt = $connect->prepare("SELECT * FROM Notebook WHERE UserId=?");
$stmt->bind_param("i", $userId);
$stmt->execute();
$result = $stmt->get_result();
return $result->fetch_all();
}
function get_user_tutorial_info($userId, $tutorialId){
$connect = DbConnect();
$stmt = $connect->prepare("SELECT * FROM TutorialsCompleted WHERE UserId=? AND TutorialId=?");
$stmt->bind_param("ii", $userId, $tutorialId);
$stmt->execute();
$result = $stmt->get_result();
return $result->fetch_row();
}
function get_user_home_info($userId){
$connect = DbConnect();
$stmt = $connect->prepare("SELECT * FROM HomeInfo WHERE UserId=?");
$stmt->bind_param("i", $userId);
$stmt->execute();
$result = $stmt->get_result();
return $result->fetch_row();
}
function get_user_challange_info($userId, $challangeId){
$connect = DbConnect();
$stmt = $connect->prepare("SELECT * FROM ChallangesCompleted WHERE UserId=? AND ChallangeId=?");
$stmt->bind_param("i", $userId, $challangeId);
$stmt->execute();
$result = $stmt->get_result();
return $result->fetch_row();
}
function get_user_info($userId)
{
$connect = DbConnect();
$stmt = $connect->prepare("SELECT * FROM Users WHERE UserId=?");
$stmt->bind_param("i", $userId);
$stmt->execute();
$result = $stmt->get_result();
return $result->fetch_row();
}
function get_latest_userid(){
$connect = DbConnect();
$result = mysqli_query($connect, "SELECT MAX(UserId)+1 FROM Users");
$userId = $result->fetch_row()[0];
if($userId == NULL)
$userId = 1;
return $userId;
}
function set_chara_data($userId, $charaData){
$connect = DbConnect();
$stmt = $connect->prepare("UPDATE Profiles SET CharaData=? WHERE UserId=?");
$stmt->bind_param("si", $charaData,
$userId);
$stmt->execute();
}
function set_user_kind($userId, $userKind){
$connect = DbConnect();
$stmt = $connect->prepare("UPDATE Users SET UserKind=? WHERE UserId=?");
$stmt->bind_param("ii", $charaData,
$userId);
$stmt->execute();
}
function set_results_defaults($c){
global $result;
$result['ServerDate'] = date("Ymdihs");
$result['c'] = intval($c);
}
function set_user_challange_count($userId, $challangeId, $userCount){
$connect = DbConnect();
$stmt = $connect->prepare("UPDATE ChallangesCompleted SET UserCount=? WHERE UserId=? AND ChallangeId=?");
$stmt->bind_param("iii",$userCount,
$userId,
$challangeId);
$stmt->execute();
}
function set_user_reward_1($userId, $challangeId){
$connect = DbConnect();
$stmt = $connect->prepare("UPDATE ChallangesCompleted SET UserReward1Flag=1 WHERE UserId=? AND ChallangeId=?");
$stmt->bind_param("ii", $userId,
$challangeId);
$stmt->execute();
}
function set_user_reward_2($userId, $challangeId){
$connect = DbConnect();
$stmt = $connect->prepare("UPDATE ChallangesCompleted SET UserReward2Flag=1 WHERE UserId=? AND ChallangeId=?");
$stmt->bind_param("ii", $userId,
$challangeId);
$stmt->execute();
}
function set_user_reward_3($userId, $challangeId){
$connect = DbConnect();
$stmt = $connect->prepare("UPDATE ChallangesCompleted SET UserReward3Flag=1 WHERE UserId=? AND ChallangeId=?");
$stmt->bind_param("ii", $userId,
$challangeId);
$stmt->execute();
}
function set_user_reward_4($userId, $challangeId){
$connect = DbConnect();
$stmt = $connect->prepare("UPDATE ChallangesCompleted SET UserReward4Flag=1 WHERE UserId=? AND ChallangeId=?");
$stmt->bind_param("ii", $userId,
$challangeId);
$stmt->execute();
}
function set_user_reward_5($userId, $challangeId){
$connect = DbConnect();
$stmt = $connect->prepare("UPDATE ChallangesCompleted SET UserReward5Flag=1 WHERE UserId=? AND ChallangeId=?");
$stmt->bind_param("ii", $userId,
$challangeId);
$stmt->execute();
}
function set_user_reward_6($userId, $challangeId){
$connect = DbConnect();
$stmt = $connect->prepare("UPDATE ChallangesCompleted SET UserReward6Flag=1 WHERE UserId=? AND ChallangeId=?");
$stmt->bind_param("ii", $userId,
$challangeId);
$stmt->execute();
}
function set_user_reward_7($userId, $challangeId){
$connect = DbConnect();
$stmt = $connect->prepare("UPDATE ChallangesCompleted SET UserReward7Flag=1 WHERE UserId=? AND ChallangeId=?");
$stmt->bind_param("ii", $userId,
$challangeId);
$stmt->execute();
}
function set_user_reward_8($userId, $challangeId){
$connect = DbConnect();
$stmt = $connect->prepare("UPDATE ChallangesCompleted SET UserReward8Flag=1 WHERE UserId=? AND ChallangeId=?");
$stmt->bind_param("ii", $userId,
$challangeId);
$stmt->execute();
}
function set_user_reward_9($userId, $challangeId){
$connect = DbConnect();
$stmt = $connect->prepare("UPDATE ChallangesCompleted SET UserReward9Flag=1 WHERE UserId=? AND ChallangeId=?");
$stmt->bind_param("ii", $userId,
$challangeId);
$stmt->execute();
}
function set_user_reward_10($userId, $challangeId){
$connect = DbConnect();
$stmt = $connect->prepare("UPDATE ChallangesCompleted SET UserReward10Flag=1 WHERE UserId=? AND ChallangeId=?");
$stmt->bind_param("ii", $userId,
$challangeId);
$stmt->execute();
}
function earn_challange($userId, $challangeId){
foreach(ReadGameSettings()->Challanges as $challange){
if($challange->id == $challangeId){
$cinfo = get_user_challange_info($userId, $challangeId);
$cres = array(
'id' => strval($challange->id),
'title' => $challange->title,
'kind' => strval($challange->kind),
'last_flag' => 0
);
set_user_challange_count($userId, $challangeId, $cinfo[2] + 1);
if($cinfo[3] == 0){
set_user_reward_1($userId, $challangeId);
$cres['reward_no'] = 1;
$cres['achiv'] = $challange->reward1;
}
else if($cinfo[4] == 0){
set_user_reward_2($userId, $challangeId);
$cres['reward_no'] = 2;
$cres['achiv'] = $challange->reward2;
}
else if($cinfo[5] == 0){
set_user_reward_3($userId, $challangeId);
$cres['reward_no'] = 3;
$cres['achiv'] = $challange->reward3;
}
else if($cinfo[6] == 0){
set_user_reward_4($userId, $challangeId);
$cres['reward_no'] = 4;
$cres['achiv'] = $challange->reward4;
}
else if($cinfo[7] == 0){
set_user_reward_5($userId, $challangeId);
$cres['reward_no'] = 5;
$cres['achiv'] = $challange->reward5;
}
else if($cinfo[8] == 0){
set_user_reward_6($userId, $challangeId);
$cres['reward_no'] = 6;
$cres['achiv'] = $challange->reward6;
}
else if($cinfo[9] == 0){
set_user_reward_7($userId, $challangeId);
$cres['reward_no'] = 7;
$cres['achiv'] = $challange->reward7;
}
else if($cinfo[10] == 0){
set_user_reward_8($userId, $challangeId);
$cres['reward_no'] = 8;
$cres['achiv'] = $challange->reward8;
}
else if($cinfo[11] == 0){
set_user_reward_9($userId, $challangeId);
$cres['reward_no'] = 9;
$cres['achiv'] = $challange->reward9;
}
else if($cinfo[12] == 0){
set_user_reward_10($userId, $challangeId);
$cres['reward_no'] = 10;
$cres['achiv'] = $challange->reward10;
$cres['last_flag'] = 1;
}
$cres['reward'] = explode(",", $cres['achiv'])[1];
return array( strval($challange->id) => $cres );
}
}
}
function check_acheivements($userData){
global $result;
$curDate = time();
$lastLognDate = $userData[8];
$diff = $curDate - $lastLognDate;
$result['AchievementRewardList'] = array();
// Add login bonus acheivements
if( ($diff >= 86400) && ($diff < 172800) ){
foreach(ReadGameSettings()->Challanges as $challange){
if($challange->kind == 3){
$cinfo = earn_challange($userData[0], $challange->id);
array_push($result['AchievementRewardList'], $cinfo);
}
}
}
set_last_login_date($userData[0]);
}
populate_db();
// == API Logic ==
if(isset($_SERVER["HTTP_APICODE"])) {
$apicode = $_SERVER["HTTP_APICODE"];
if(isset($_POST["json"])) {
$json = $_POST["json"];
$signature = strtoupper(hash_hmac('sha256', $json, API_KEY));
if(hash_equals($apicode, $signature)){
// Signature validation successful
$jdata = json_decode($json);
switch(intval($jdata->c)){
case COMMAND_GET_SETTINGS:
set_results_defaults($jdata->c);
$result['ResultCode'] = STATUS_INVALID_LOGINCODE;
$result['MenteFlag'] = ReadGameSettings()->MenteFlag;
if(validate_login_code($jdata->u, $jdata->z)){
$result['EventCollabAsset'] = strval(ReadGameSettings()->EventCollabAsset);
$result['EventGameId'] = implode(",",ReadGameSettings()->EventGameId);
$result['EventMonthlyId'] = strval(ReadGameSettings()->EventMonthlyId);
$result['GameAsset'] = strval(ReadGameSettings()->GameAsset);
$result['ParkAsset'] = strval(ReadGameSettings()->ParkAsset);
$result['PartyAsset'] = strval(ReadGameSettings()->PartyAsset);
$result['ResultCode'] = STATUS_OK;
}
case COMMAND_GET_NOTEBOOK:
set_results_defaults($jdata->c);
$result['ResultCode'] = STATUS_INVALID_LOGINCODE;
if(validate_login_code($jdata->u, $jdata->z)){
$result['NotebookList'] = array();
$ndata = get_notebook_data($jdata->u);
foreach($ndata as $note){
$nres = array(
"notebook_id" => strval($ndata[1]),
"profile_uid" => strval($ndata[2])
);
$pdata = get_profile_data($ndata[2]);
$udata = get_user_info($ndata[2]);
// Read profile data
$nres['chara_data'] = $pdata[1];
$nres['chara_toy_key'] = $pdata[2];
$nres['address_code'] = strval($pdata[5]);
$nres['avatar_data'] = $pdata[6].",".$pdata[7].",".$pdata[8].",".$pdata[9].",".$pdata[10].",".$pdata[11];
$nres['profile_user_code'] = $pdata[12];
// Read user data
$nres['profile_user_kind'] = strval($udata[6]);
$nres['profile_user_lang'] = strval($udata[7]);
array_push($result['NotebookList'], array( strval($ndata[1]) => $nres ));
}
$result['ResultCode'] = STATUS_OK;
$result['ResultDetail'] = STATUS_OK;
}
break;
case COMMAND_GET_HOME:
set_results_defaults($jdata->c);
$result['ResultCode'] = STATUS_INVALID_LOGINCODE;
if(validate_login_code($jdata->u, $jdata->z)){
// Check achievements
$userData = get_user_info($jdata->u);
$userId = $userData[0];
check_acheivements($userData);
// Read home info
$userHome = get_user_home_info($userId);
$result['Point'] = strval($userHome[1]);
$result['EventPoint'] = strval($userHome[2]);
$result['SearchFlag'] = strval($userHome[3]);
// Read Tutorials
$result['TutorialList'] = array();
foreach(ReadGameSettings()->Tutorials as $tutorialId){
$userTutorals = get_user_tutorial_info($userId, $tutorialId);
$tinfo = array(strval($tutorialId) => array(
"tutorial_data" => $userTutorals[2],
"tutorial_flag" => $userTutorals[3],
"tutorial_guset_flag" => $userTutorals[4],
"tutorial_id" => $tutorialId,
"tutorial_meets_flag" => $userTutorals[5]
));
array_push($result['TutorialList'], $tinfo);
}
$result['ResultCode'] = STATUS_OK;
}
break;
case COMMAND_GET_PROFILE:
set_results_defaults($jdata->c);
$result['ResultCode'] = STATUS_INVALID_LOGINCODE;
if(validate_login_code($jdata->u, $jdata->z)){
$pdata = get_profile_data($jdata->u);
// Return profile data
$result['CharaData'] = $pdata[1];
$result['CharaToyKey'] = $pdata[2];
$result['LikeCount'] = $pdata[3];
$result['LikeTotal'] = $pdata[4];
$result['ProfileAddressCode'] = $pdata[5];
$result['ProfileAvatarData'] = $pdata[6].",".$pdata[7].",".$pdata[8].",".$pdata[9].",".$pdata[10].",".$pdata[11];
$result['UserCode'] = $pdata[12];
// Give ResultDetail too.. for some reason
$result['ResultDetail'] = STATUS_OK;
$result['ResultCode'] = STATUS_OK;
}
break;
case COMMAND_SAVE_CHAR_DATA:
set_results_defaults($jdata->c);
$result['ResultCode'] = STATUS_INVALID_LOGINCODE;
if(validate_login_code($jdata->u, $jdata->z)){
// TODO: add validation
set_user_kind($jdata->u, $jdata->k);
set_chara_data($jdata->u, $jdata->d);
// Return profile data
$pdata = get_profile_data($jdata->u);
$result['ProfileAddressCode'] = $pdata[5];
$result['ProfileAvatarData'] = $pdata[6].",".$pdata[7].",".$pdata[8].",".$pdata[9].",".$pdata[10].",".$pdata[11];
$result['UserCode'] = $pdata[12];
// Give ResultDetail too..
$result['ResultDetail'] = STATUS_OK;
$result['ResultCode'] = STATUS_OK;
}
break;
case COMMAND_PARENTAL_CONTROL:
set_results_defaults($jdata->c);
$result['ResultCode'] = STATUS_INVALID_LOGINCODE;
if(validate_login_code($jdata->u, $jdata->z)){
$pinfo = get_user_parental_control($jdata->u);
// Why are we dealing with overzealus parents?
$result['ParentExcluded'] = $pinfo[0];
$result['ParentSearch'] = $pinfo[1];
$result['ParentStamp'] = $pinfo[2];
$result['ResultCode'] = STATUS_OK;
}
break;
// Special Case:
// Login to the app
case COMMAND_AUTH:
set_results_defaults($jdata->c);
$result['ResultCode'] = STATUS_INVALID_AUTH;
$result['AppVersion'] = ReadGameSettings()->AppVer;
$result['MovingFlag'] = MOVING_FLAG;
$result['MenteFlag'] = ReadGameSettings()->MenteFlag;
$result['TermsCount'] = TERMS_COUNT;
$result['AssetVersion'] = ReadGameSettings()->GameAsset;
if($jdata->u == 0) { // Register
$result['ResultCode'] = STATUS_OK;
// Set default language and userkind
$result['UserLang'] = intval(ENGLISH_API);
$result['UserKind'] = strval(USER_GUEST);
// Return InfoHtml and EventInfoHtml.
$result['InfoHtml'] = ReadGameSettings()->InfoHtml;
$result['EventInfoHtml'] = ReadGameSettings()->EventInfoHtml;
// No Bandai Namco ID used by default.
$result['BnidName'] = DEFAULT_BNID_NAME;
$result['BnidFlag'] = DEFAULT_BNID_FLAG;
// Generate LoginCode "Token"
$result['LoginCode'] = bin2hex(random_bytes(0x14));
// Generate Customer ID
$loginSecret = bin2hex(random_bytes(0x18));
$customerId = random_int(1000000000000000,9999999999999999);
$result['AppCode'] = $loginSecret.'.'.$customerId;
// Generate UserID
$result['UserId'] = strval(get_latest_userid());
// Add to database.
add_user($result['UserId'],
$loginSecret,
strval($customerId),
$result['LoginCode'],
$result['BnidName'],
$result['BnidFlag'],
$result['UserKind'],
$result['UserLang']);
}
else{
// Read user info from database,
$userInfo = get_user_info($jdata->u);
// Read user secrets
$loginSecret = $userInfo[1];
$customerId = $userInfo[2];
// Generate App Codes
$expectedAppCode = $loginSecret.'.'.$customerId;
// Check if correct secrets were given:
if($expectedAppCode === $jdata->q) {
$result['ResultCode'] = STATUS_OK;
// Read User Id
$result['UserId'] = $userInfo[0];
// Set default language and userkind
$result['UserLang'] = $userInfo[7];
$result['UserKind'] = strval($userInfo[6]);
// Return InfoHtml and EventInfoHtml.
$result['InfoHtml'] = ReadGameSettings()->InfoHtml;
$result['EventInfoHtml'] = ReadGameSettings()->EventInfoHtml;
// Get Bandai Namco Id Information
$result['BnidName'] = $userInfo[4];
$result['BnidFlag'] = $userInfo[5];
// Generate LoginCode "Token"
$result['LoginCode'] = bin2hex(random_bytes(0x14));
// Return Expected AppCode
$result['AppCode'] = $expectedAppCode;
set_last_login_code($result['UserId'], $result['LoginCode']);
}
}
break;
default:
break;
}
}
}
}
header("Content-Type: application/json");
echo(json_encode($result));
?>

45
ON/bruteforce.py Normal file
View File

@ -0,0 +1,45 @@
import requests
import os
def incDate(date):
yr = int(date[0:2])
mo = int(date[2:4])
dy = int(date[4:6])
dy += 1
if dy > 32:
dy = 0
mo += 1
if mo > 12:
dy = 0
mo = 0
yr += 1
if yr > 22:
os._exit(0)
ndate = ""
ndate += str(yr).zfill(2)
ndate += str(mo).zfill(2)
ndate += str(dy).zfill(2)
return ndate
s = requests.Session()
date = "180000"
log = open("urls.txt", "w")
while True:
url = "https://tmgcmeetsapp.com/page/en_eventinfo_"+date+".html"
r = s.head(url)
if r.status_code == 200:
print("FOUND: "+url)
log.write(url + "\n")
log.flush()
else:
print("Nothing on "+date)
date = incDate(date)

100
ON/download_data.py Normal file
View File

@ -0,0 +1,100 @@
import requests
import hmac
import json
import hashlib
import time
import urllib
data = {}
s = requests.Session()
headers = {"APICODE": "-",
"Content-Type": "application/x-www-form-urlencoded"}
defaultApiReq = {"c":0,"u":0,"z":"","v":"","t":0,"k":0,"d":"","a":"","i":"","o":0,"b":0,"n":0,"w":"","m":"","q":"","p":0,"g":0,"x":0.0,"y":0.0,"e":0,"f":0,"s":0}
def sendEnApiRequest(jdata):
jdata['t'] = int(time.time())
jdata = json.dumps(jdata)
headers["APICODE"] = hmac.new(bytes("695719951020924", "UTF-8"), msg = bytes(jdata , 'UTF-8'), digestmod = hashlib.sha256).hexdigest().upper()
edata = "json="+urllib.parse.quote_plus(jdata)
r = s.post("https://tmgcmeetsapp.com/api_en/meets.php",
headers=headers,
data=edata)
print(jdata)
print(r.content)
time.sleep(1)
return json.loads(r.content)
data['EN'] = {}
data['JP'] = {}
req = defaultApiReq
req['c'] = 11
req['v'] = '1.4.3'
enUser = sendEnApiRequest(req)
req['u'] = enUser['UserId']
req['z'] = enUser['LoginCode']
data['EN']['InfoHtml'] = enUser['InfoHtml']
data['EN']['EventInfoHtml'] = enUser['EventInfoHtml']
data['EN']['AppVer'] = enUser['AppVersion']
# Read Tutorials
req['c'] = 12
req['k'] = 0
cmd12 = sendEnApiRequest(req)
tutorialList = cmd12['TutorialList']
data['EN']['Tutorials'] = []
for tutorial in tutorialList.keys():
data['EN']['Tutorials'].append(tutorialList[tutorial]['tutorial_id'])
# Read Game Settngs
req['c'] = 58
cmd58 = sendEnApiRequest(req)
data['EN']['EventCollabAsset'] = int(cmd58['EventCollabAsset'])
data['EN']['EventMonthlyId'] = int(cmd58['EventMonthlyId'])
data['EN']['EventGameId'] = []
for i in cmd58['EventGameId'].split(','):
data['EN']['EventGameId'].append(int(i))
data['EN']['GameAsset'] = int(cmd58['GameAsset'])
data['EN']['ParkAsset'] = int(cmd58['ParkAsset'])
data['EN']['PartyAsset'] = int(cmd58['PartyAsset'])
data['EN']['MenteFlag'] = int(cmd58['MenteFlag'])
# Read Challanges
req['c'] = 55
cmd55 = sendEnApiRequest(req)
challangeList = cmd55['ChallengeList']
data['EN']['Challanges'] = []
for key in challangeList.keys():
del challangeList[key]['user_count']
del challangeList[key]['user_reward1_flag']
del challangeList[key]['user_reward2_flag']
del challangeList[key]['user_reward3_flag']
del challangeList[key]['user_reward4_flag']
del challangeList[key]['user_reward5_flag']
del challangeList[key]['user_reward6_flag']
del challangeList[key]['user_reward7_flag']
del challangeList[key]['user_reward8_flag']
del challangeList[key]['user_reward9_flag']
del challangeList[key]['user_reward10_flag']
data['EN']['Challanges'].append(challangeList[key])
open("data.json", "w").write(json.dumps(data, indent=4, sort_keys=True))

88
ON/download_on.py Normal file
View File

@ -0,0 +1,88 @@
import requests
import os
import hashlib
s = requests.Session()
def genUrl(version, platform, file):
return "https://tmgcmeetsapp.com/asset/"+version+"/"+platform+"/"+file
def genFiles(version, platform, file):
return version+"/"+platform+"/"+file
def makeDirsFor(filename):
dirPath = os.path.dirname(filename)
if not os.path.exists(dirPath):
os.makedirs(dirPath)
def md5(fname):
hash_md5 = hashlib.md5()
hash_md5.update(open(fname, "rb").read())
return hash_md5.hexdigest()
streamingassets = [
"common/common.csv",
"audio/audio.csv",
"accessory/accessory.csv",
"avatar/avatar.csv",
"chara/chara.csv",
"infos/infos.csv",
"npc/npc.csv",
"pet/pet.csv",
"scenes/scenes.csv",
# "chara/settings",
# "accessory/settings",
# "audio/se",
# "avatar/sprites",
"infos_en/infos_en.csv",
"scenes_en/scenes_en.csv",
]
versions = ["v6", "v7"]
platforms = ["Android", "iOS"]
for version in versions:
for platform in platforms:
for streamingasset in streamingassets:
url = genUrl(version, platform, streamingasset)
print(url)
r = s.get(url)
if not r.status_code == 200:
continue
f = genFiles(version, platform, streamingasset)
makeDirsFor(f)
open(f, "wb").write(r.content)
# Download all assets folder
if streamingasset.endswith(".csv"):
csvdata = r.content.replace(b"\r", b"").split(b'\n')
for csv in csvdata:
if csv == b"":
continue
commas = csv.split(b',')
relPath = commas[0].decode("UTF-8")
url = genUrl(version, platform, relPath)
print(url)
f = genFiles(version, platform, relPath)
replace = False
if not os.path.exists(f):
r = s.get(url)
if not r.status_code == 200:
continue
makeDirsFor(f)
open(f, "wb").write(r.content)

26
ON/en_playground.py Normal file
View File

@ -0,0 +1,26 @@
import requests
import urllib
import hmac
import hashlib
import time
import json
headers = {"APICODE": "-",
"Content-Type": "application/x-www-form-urlencoded"}
s = requests.Session()
while True:
jdata = input("Enter str: ");
jj = json.loads(jdata)
jj['t'] = int(time.time())
jdata = json.dumps(jj)
headers["APICODE"] = hmac.new(bytes("695719951020924", "UTF-8"), msg = bytes(jdata , 'UTF-8'), digestmod = hashlib.sha256).hexdigest().upper()
edata = "json="+urllib.parse.quote_plus(jdata)
print(s.post("https://tmgcmeetsapp.com/api_en/meets.php",
headers=headers,
data=edata).text)

20
ON/local_playground.py Normal file
View File

@ -0,0 +1,20 @@
import requests
import urllib
import hmac
import hashlib
headers = {"APICODE": "-",
"Content-Type": "application/x-www-form-urlencoded"}
s = requests.Session()
while True:
jdata = input("Enter str: ");
headers["APICODE"] = hmac.new(bytes("695719951020924", "UTF-8"), msg = bytes(jdata , 'UTF-8'), digestmod = hashlib.sha256).hexdigest().upper()
print(headers["APICODE"])
edata = "json="+urllib.parse.quote_plus(jdata)
print(s.post("http://127.0.0.1/api_en/meets.php",
headers=headers,
data=edata).text)