mirror of
https://github.com/zoffline/zwift-offline.git
synced 2026-01-15 14:23:49 -08:00
profile for ZCA support improved
This commit is contained in:
@@ -32,21 +32,6 @@ message Profile {
|
||||
optional fixed64 f30 = 30; //empty
|
||||
optional fixed64 f31 = 31; //empty
|
||||
optional fixed64 f32 = 32; //empty
|
||||
/*message Privacy { //does not stored here
|
||||
optional bool approval_required = 1;
|
||||
optional bool display_weight = 2;
|
||||
optional bool minor = 3;
|
||||
optional bool private_messaging = 4;
|
||||
optional bool default_fitness_data_privacy = 5;
|
||||
optional bool suppress_follower_notification = 6;
|
||||
optional bool display_age = 7;
|
||||
enum ActivityPrivacyType {
|
||||
PUBLIC = 0;
|
||||
PRIVATE = 1;
|
||||
FRIENDS = 2;
|
||||
}
|
||||
optional ActivityPrivacyType default_activity_privacy = 8;
|
||||
}*/
|
||||
optional bytes challenge_info = 33;
|
||||
optional uint32 country_code = 34;
|
||||
optional uint32 total_distance_in_meters = 35;
|
||||
@@ -80,14 +65,14 @@ message Profile {
|
||||
optional uint32 achievement_level = 49;
|
||||
optional bool use_metric = 50;
|
||||
optional bool f51 = 51; //empty
|
||||
optional uint32 power_source = 52;
|
||||
optional uint32 power_source_model = 52;
|
||||
optional uint32 f53 = 53; //empty
|
||||
optional uint32 f54 = 54; //empty
|
||||
optional uint32 age = 55;
|
||||
optional fixed32 f56 = 56; //empty
|
||||
optional uint32 f57 = 57; //empty
|
||||
optional string large_avatar_url = 58;
|
||||
optional fixed64 f59 = 59; //empty
|
||||
optional fixed64 privacy_bits = 59;
|
||||
repeated ProfileEntitlement entitlements = 60;
|
||||
|
||||
optional SocialFacts social_facts = 61;
|
||||
@@ -140,7 +125,7 @@ message Profile {
|
||||
}
|
||||
optional string mix_panel_distinct_id = 83;
|
||||
optional uint32 run_achievement_level = 84;
|
||||
optional uint32 f85 = 85; //0 begin run
|
||||
optional uint32 total_run_time_in_minutes = 85;
|
||||
optional Sport sport = 86;
|
||||
optional uint32 f87 = 87; //360?
|
||||
optional bool connected_to_under_armour = 88;
|
||||
@@ -160,7 +145,7 @@ message Profile {
|
||||
optional uint32 f102 = 102; //empty
|
||||
optional uint32 f103 = 103; //empty
|
||||
optional uint32 f104 = 104; //empty
|
||||
optional bool f105 = 105; //? false
|
||||
optional bool connected_to_withings = 105;
|
||||
optional bool connected_to_fitbit = 106;
|
||||
repeated bytes f107 = 107; //empty
|
||||
optional string launched_game_client = 108;
|
||||
@@ -181,7 +166,7 @@ message Profile {
|
||||
optional bool f112 = 112; //? false
|
||||
repeated Attribute private_attributes = 113;
|
||||
repeated Attribute public_attributes = 114;
|
||||
optional int32 f115 = 115; //false begin run
|
||||
optional int32 total_run_calories = 115;
|
||||
optional int64 f116 = 116; //empty
|
||||
optional int32 run_time_1mi_in_seconds = 117;
|
||||
optional int32 run_time_5km_in_seconds = 118;
|
||||
@@ -197,8 +182,13 @@ message Profile {
|
||||
}
|
||||
optional CyclingOrganization cycling_organization = 123;
|
||||
optional string f124 = 124; /* org name? */
|
||||
optional int32 f125 = 125; //? 0
|
||||
/* 126 ? */
|
||||
enum ActivityPrivacyType {
|
||||
PUBLIC = 0;
|
||||
PRIVATE = 1;
|
||||
FRIENDS = 2;
|
||||
}
|
||||
optional ActivityPrivacyType default_activity_privacy = 125;
|
||||
optional bool connected_to_runtastic = 126;
|
||||
repeated PropertyChange property_changes = 127;
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -10,7 +10,8 @@ app = Flask(__name__)
|
||||
profile = profile_pb2.Profile()
|
||||
#profile_file = '../../zoffline-helper/profile.bin-sul'
|
||||
#profile_file = '../../zoffline-helper/profile.bin'
|
||||
profile_file = '../storage/5/profile.bin'
|
||||
#profile_file = '../storage/2/profile.bin'
|
||||
profile_file = '../storage/profile4357549.bin'
|
||||
with open(profile_file, 'rb') as fd:
|
||||
profile.ParseFromString(fd.read())
|
||||
|
||||
@@ -42,8 +43,32 @@ def copyAttributes(jprofile, jprofileFull, src):
|
||||
dest[di['id']] = di[v]
|
||||
jprofile[src] = dest
|
||||
|
||||
def powerSourceModelToStr(val):
|
||||
if (val == 1):
|
||||
return "Power Meter"
|
||||
else:
|
||||
return "zPower"
|
||||
|
||||
def privacy(profile):
|
||||
privacy_bits = jsf(profile, 'privacy_bits', 0)
|
||||
return {"approvalRequired": bool(privacy_bits & 1), "displayWeight": bool(privacy_bits & 4), "minor": bool(privacy_bits & 2), "privateMessaging": bool(privacy_bits & 8), "defaultFitnessDataPrivacy": bool(privacy_bits & 16),
|
||||
"suppressFollowerNotification": bool(privacy_bits & 32), "displayAge": not bool(privacy_bits & 64), "defaultActivityPrivacy": profile_pb2.Profile.ActivityPrivacyType.Name(jsv0(profile, 'default_activity_privacy'))}
|
||||
|
||||
jprofileFull = MessageToDict(profile)
|
||||
jprofile = {"id": profile.id, "firstName": jsf(profile, 'first_name'), "lastName": jsf(profile, 'last_name'), "preferredLanguage": jsf(profile, 'preferred_language'), "bodyType":jsv0(profile, 'body_type'), "male": jsb1(profile, 'is_male'), "imageSrc": "https://us-or-rly101.zwift.com/download/%s/avatarLarge.jpg" % profile.id, "imageSrcLarge": "https://us-or-rly101.zwift.com/download/%s/avatarLarge.jpg" % profile.id, "playerType": profile_pb2.Profile.PlayerType.Name(jsf(profile, 'player_type', 1)), "playerTypeId": jsf(profile, 'player_type', 1), "playerSubTypeId": None, "emailAddress": jsf(profile, 'email'), "countryCode": jsf(profile, 'country_code'), "dob": jsf(profile, 'dob'), "countryAlpha3": "rus", "useMetric": jsb1(profile, 'use_metric'), "privacy": {"approvalRequired": False, "displayWeight": True, "minor": False, "privateMessaging": False, "defaultFitnessDataPrivacy": False, "suppressFollowerNotification": False, "displayAge": True, "defaultActivityPrivacy": "PUBLIC"}, "age": jsv0(profile, 'age'), "ftp": jsf(profile, 'ftp'), "b": False, "weight": jsf(profile, 'weight_in_grams'), "connectedToStrava": jsb0(profile, 'connected_to_strava'), "connectedToTrainingPeaks": jsb0(profile, 'connected_to_training_peaks'), "connectedToTodaysPlan": jsb0(profile, 'connected_to_todays_plan'), "connectedToUnderArmour": jsb0(profile, 'connected_to_under_armour'), "connectedToFitbit": jsb0(profile, 'connected_to_fitbit'), "connectedToGarmin": jsb0(profile, 'connected_to_garmin'), "height": jsf(profile, 'height_in_millimeters'), "location": "", "socialFacts": jprofileFull.get('socialFacts'), "totalExperiencePoints": jsv0(profile, 'total_xp'), "worldId": jsf(profile, 'world_id'), "totalDistance": jsv0(profile, 'total_distance_in_meters'), "totalDistanceClimbed": jsv0(profile, 'elevation_gain_in_meters'), "totalTimeInMinutes": jsv0(profile, 'time_ridden_in_minutes'), "achievementLevel": jsv0(profile, 'achievement_level'), "totalWattHours": jsv0(profile, 'total_watt_hours'), "runTime1miInSeconds": jsv0(profile, 'run_time_1mi_in_seconds'), "runTime5kmInSeconds": jsv0(profile, 'run_time_5km_in_seconds'), "runTime10kmInSeconds": jsv0(profile, 'run_time_10km_in_seconds'), "runTimeHalfMarathonInSeconds": jsv0(profile, 'run_time_half_marathon_in_seconds'), "runTimeFullMarathonInSeconds": jsv0(profile, 'run_time_full_marathon_in_seconds'), "totalInKomJersey": jsv0(profile, 'total_in_kom_jersey'), "totalInSprintersJersey": jsv0(profile, 'total_in_sprinters_jersey'), "totalInOrangeJersey": jsv0(profile, 'total_in_orange_jersey'), "currentActivityId": jsf(profile, 'current_activity_id'), "enrolledZwiftAcademy": jsv0(profile, 'enrolled_program') == profile.EnrolledProgram.ZWIFT_ACADEMY, "runAchievementLevel": jsv0(profile, 'run_achievement_level'), "totalRunDistance": jsv0(profile, 'total_run_distance'), "totalRunTimeInMinutes": jsv0(profile, 'time_ridden_in_minutes'), "totalRunExperiencePoints": jsv0(profile, 'total_run_experience_points'), "totalRunCalories": int(profile.total_watt_hours * 3.07089), "totalGold": jsv0(profile, 'total_gold_drops'), "powerSourceType": "Power Source", "powerSourceModel": "Power Meter", "virtualBikeModel": "Zwift Carbon", "profilePropertyChanges": jprofileFull.get('propertyChanges'), "cyclingOrganization": jsf(profile, 'cycling_organization'), "userAgent": "CNL/3.13.0 (Android 11) zwift/1.0.85684 curl/7.78.0-DEV", "stravaPremium": False, "profileChanges": False, "launchedGameClient": "09/19/2021 13:24:19 +0000", "createdOn":"2021-09-19T13:24:17.783+0000", "likelyInGame": False, "address": None, "bt":"f97803d3-efac-4510-a17a-ef44e65d3071", "numberOfFolloweesInCommon": 0, "fundraiserId": None, "source": "Android", "origin": None, "licenseNumber": None, "bigCommerceId": None, "marketingConsent": None, "affiliate": None, "avantlinkId": None, "virtualBikeModel": "Zwift Carbon", "connectedToWithings": False, "connectedToRuntastic": False, "connectedToZwiftPower": False, "powerSourceType": "Power Source", "powerSourceModel": "Power Meter", "riding": False, "location": "", "publicId": "5a72e9b1-239f-435e-8757-af9467336b40", "mixpanelDistinctId": "21304417-af2d-4c9b-8543-8ba7c0500e84"}
|
||||
if True:
|
||||
jprofile = {"id": profile.id, "firstName": jsf(profile, 'first_name'), "lastName": jsf(profile, 'last_name'), "preferredLanguage": jsf(profile, 'preferred_language'), "bodyType":jsv0(profile, 'body_type'), "male": jsb1(profile, 'is_male'),
|
||||
"imageSrc": "https://us-or-rly101.zwift.com/download/%s/avatarLarge.jpg" % profile.id, "imageSrcLarge": "https://us-or-rly101.zwift.com/download/%s/avatarLarge.jpg" % profile.id, "playerType": profile_pb2.Profile.PlayerType.Name(jsf(profile, 'player_type', 1)), "playerTypeId": jsf(profile, 'player_type', 1), "playerSubTypeId": None,
|
||||
"emailAddress": jsf(profile, 'email'), "countryCode": jsf(profile, 'country_code'), "dob": jsf(profile, 'dob'), "countryAlpha3": "rus", "useMetric": jsb1(profile, 'use_metric'), "privacy": privacy(profile), "age": jsv0(profile, 'age'), "ftp": jsf(profile, 'ftp'), "b": False, "weight": jsf(profile, 'weight_in_grams'), "connectedToStrava": jsb0(profile, 'connected_to_strava'), "connectedToTrainingPeaks": jsb0(profile, 'connected_to_training_peaks'),
|
||||
"connectedToTodaysPlan": jsb0(profile, 'connected_to_todays_plan'), "connectedToUnderArmour": jsb0(profile, 'connected_to_under_armour'), "connectedToFitbit": jsb0(profile, 'connected_to_fitbit'), "connectedToGarmin": jsb0(profile, 'connected_to_garmin'), "height": jsf(profile, 'height_in_millimeters'), "location": "",
|
||||
"socialFacts": jprofileFull.get('socialFacts'), "totalExperiencePoints": jsv0(profile, 'total_xp'), "worldId": jsf(profile, 'world_id'), "totalDistance": jsv0(profile, 'total_distance_in_meters'), "totalDistanceClimbed": jsv0(profile, 'elevation_gain_in_meters'), "totalTimeInMinutes": jsv0(profile, 'time_ridden_in_minutes'),
|
||||
"achievementLevel": jsv0(profile, 'achievement_level'), "totalWattHours": jsv0(profile, 'total_watt_hours'), "runTime1miInSeconds": jsv0(profile, 'run_time_1mi_in_seconds'), "runTime5kmInSeconds": jsv0(profile, 'run_time_5km_in_seconds'), "runTime10kmInSeconds": jsv0(profile, 'run_time_10km_in_seconds'),
|
||||
"runTimeHalfMarathonInSeconds": jsv0(profile, 'run_time_half_marathon_in_seconds'), "runTimeFullMarathonInSeconds": jsv0(profile, 'run_time_full_marathon_in_seconds'), "totalInKomJersey": jsv0(profile, 'total_in_kom_jersey'), "totalInSprintersJersey": jsv0(profile, 'total_in_sprinters_jersey'),
|
||||
"totalInOrangeJersey": jsv0(profile, 'total_in_orange_jersey'), "currentActivityId": jsf(profile, 'current_activity_id'), "enrolledZwiftAcademy": jsv0(profile, 'enrolled_program') == profile.EnrolledProgram.ZWIFT_ACADEMY, "runAchievementLevel": jsv0(profile, 'run_achievement_level'),
|
||||
"totalRunDistance": jsv0(profile, 'total_run_distance'), "totalRunTimeInMinutes": jsv0(profile, 'total_run_time_in_minutes'), "totalRunExperiencePoints": jsv0(profile, 'total_run_experience_points'), "totalRunCalories": jsv0(profile, 'total_run_calories'), "totalGold": jsv0(profile, 'total_gold_drops'),
|
||||
"profilePropertyChanges": jprofileFull.get('propertyChanges'), "cyclingOrganization": jsf(profile, 'cycling_organization'), "userAgent": "CNL/3.13.0 (Android 11) zwift/1.0.85684 curl/7.78.0-DEV", "stravaPremium": False, "profileChanges": False, "launchedGameClient": "09/19/2021 13:24:19 +0000",
|
||||
"createdOn":"2021-09-19T13:24:17.783+0000", "likelyInGame": False, "address": None, "bt":"f97803d3-efac-4510-a17a-ef44e65d3071", "numberOfFolloweesInCommon": 0, "fundraiserId": None, "source": "Android", "origin": None, "licenseNumber": None, "bigCommerceId": None, "marketingConsent": None, "affiliate": None,
|
||||
"avantlinkId": None, "virtualBikeModel": "Zwift Carbon", "connectedToWithings": jsb0(profile, 'connected_to_withings'), "connectedToRuntastic": jsb0(profile, 'connected_to_runtastic'), "connectedToZwiftPower": False, "powerSourceType": "Power Source", "powerSourceModel": powerSourceModelToStr(profile.power_source_model), "riding": False, "location": "", "publicId": "5a72e9b1-239f-435e-8757-af9467336b40",
|
||||
"mixpanelDistinctId": "21304417-af2d-4c9b-8543-8ba7c0500e84"}
|
||||
|
||||
copyAttributes(jprofile, jprofileFull, 'publicAttributes')
|
||||
copyAttributes(jprofile, jprofileFull, 'privateAttributes')
|
||||
|
||||
@@ -21,6 +21,7 @@ from functools import wraps
|
||||
from io import BytesIO
|
||||
from shutil import copyfile
|
||||
from logging.handlers import RotatingFileHandler
|
||||
from urllib.parse import unquote
|
||||
|
||||
import jwt
|
||||
from flask import Flask, request, jsonify, redirect, render_template, url_for, flash, session, abort, make_response, send_file, send_from_directory
|
||||
@@ -1104,6 +1105,17 @@ def copyAttributes(jprofile, jprofileFull, src):
|
||||
dest[di['id']] = di[v]
|
||||
jprofile[src] = dest
|
||||
|
||||
def powerSourceModelToStr(val):
|
||||
if (val == 1):
|
||||
return "Power Meter"
|
||||
else:
|
||||
return "zPower"
|
||||
|
||||
def privacy(profile):
|
||||
privacy_bits = jsf(profile, 'privacy_bits', 0)
|
||||
return {"approvalRequired": bool(privacy_bits & 1), "displayWeight": bool(privacy_bits & 4), "minor": bool(privacy_bits & 2), "privateMessaging": bool(privacy_bits & 8), "defaultFitnessDataPrivacy": bool(privacy_bits & 16),
|
||||
"suppressFollowerNotification": bool(privacy_bits & 32), "displayAge": not bool(privacy_bits & 64), "defaultActivityPrivacy": profile_pb2.Profile.ActivityPrivacyType.Name(jsv0(profile, 'default_activity_privacy'))}
|
||||
|
||||
def do_api_profiles_me(is_json):
|
||||
profile_id = current_user.player_id
|
||||
if MULTIPLAYER:
|
||||
@@ -1162,13 +1174,19 @@ def do_api_profiles_me(is_json):
|
||||
if profile.dob != "":
|
||||
profile.age = age(datetime.datetime.strptime(profile.dob, "%m/%d/%Y"))
|
||||
jprofileFull = MessageToDict(profile)
|
||||
privacy_file = '%s/%s/privacy.json' % (STORAGE_DIR, profile.id)
|
||||
if not os.path.isfile(privacy_file):
|
||||
jprivacy = {"approvalRequired": False, "displayWeight": True, "minor": False, "privateMessaging": False, "defaultFitnessDataPrivacy": False, "suppressFollowerNotification": False, "displayAge": True, "defaultActivityPrivacy": "PUBLIC"}
|
||||
else:
|
||||
with open(privacy_file, 'r') as fprivacy:
|
||||
jprivacy = json.load(fprivacy)
|
||||
jprofile = {"id": profile.id, "firstName": jsf(profile, 'first_name'), "lastName": jsf(profile, 'last_name'), "preferredLanguage": jsf(profile, 'preferred_language'), "bodyType":jsv0(profile, 'body_type'), "male": jsb1(profile, 'is_male'), "imageSrc": "https://us-or-rly101.zwift.com/download/%s/avatarLarge.jpg" % profile.id, "imageSrcLarge": "https://us-or-rly101.zwift.com/download/%s/avatarLarge.jpg" % profile.id, "playerType": profile_pb2.Profile.PlayerType.Name(jsv0(profile, 'player_type')), "playerTypeId": jsv0(profile, 'player_type'), "playerSubTypeId": None, "emailAddress": jsf(profile, 'email'), "countryCode": jsf(profile, 'country_code'), "dob": jsf(profile, 'dob'), "countryAlpha3": "rus", "useMetric": jsb1(profile, 'use_metric'), "privacy": jprivacy, "age": jsv0(profile, 'age'), "ftp": jsf(profile, 'ftp'), "b": False, "weight": jsf(profile, 'weight_in_grams'), "connectedToStrava": jsb0(profile, 'connected_to_strava'), "connectedToTrainingPeaks": jsb0(profile, 'connected_to_training_peaks'), "connectedToTodaysPlan": jsb0(profile, 'connected_to_todays_plan'), "connectedToUnderArmour": jsb0(profile, 'connected_to_under_armour'), "connectedToFitbit": jsb0(profile, 'connected_to_fitbit'), "connectedToGarmin": jsb0(profile, 'connected_to_garmin'), "height": jsf(profile, 'height_in_millimeters'), "location": "", "socialFacts": jprofileFull.get('socialFacts'), "totalExperiencePoints": jsv0(profile, 'total_xp'), "worldId": jsf(profile, 'world_id'), "totalDistance": jsv0(profile, 'total_distance_in_meters'), "totalDistanceClimbed": jsv0(profile, 'elevation_gain_in_meters'), "totalTimeInMinutes": jsv0(profile, 'time_ridden_in_minutes'), "achievementLevel": jsv0(profile, 'achievement_level'), "totalWattHours": jsv0(profile, 'total_watt_hours'), "runTime1miInSeconds": jsv0(profile, 'run_time_1mi_in_seconds'), "runTime5kmInSeconds": jsv0(profile, 'run_time_5km_in_seconds'), "runTime10kmInSeconds": jsv0(profile, 'run_time_10km_in_seconds'), "runTimeHalfMarathonInSeconds": jsv0(profile, 'run_time_half_marathon_in_seconds'), "runTimeFullMarathonInSeconds": jsv0(profile, 'run_time_full_marathon_in_seconds'), "totalInKomJersey": jsv0(profile, 'total_in_kom_jersey'), "totalInSprintersJersey": jsv0(profile, 'total_in_sprinters_jersey'), "totalInOrangeJersey": jsv0(profile, 'total_in_orange_jersey'), "currentActivityId": jsf(profile, 'current_activity_id'), "enrolledZwiftAcademy": jsv0(profile, 'enrolled_program') == profile.EnrolledProgram.ZWIFT_ACADEMY, "runAchievementLevel": jsv0(profile, 'run_achievement_level'), "totalRunDistance": jsv0(profile, 'total_run_distance'), "totalRunTimeInMinutes": jsv0(profile, 'time_ridden_in_minutes'), "totalRunExperiencePoints": jsv0(profile, 'total_run_experience_points'), "totalRunCalories": int(profile.total_watt_hours * 3.07089), "totalGold": jsv0(profile, 'total_gold_drops'), "powerSourceType": "Power Source", "powerSourceModel": "Power Meter", "virtualBikeModel": "Zwift Carbon", "profilePropertyChanges": jprofileFull.get('propertyChanges'), "cyclingOrganization": jsf(profile, 'cycling_organization'), "userAgent": "CNL/3.13.0 (Android 11) zwift/1.0.85684 curl/7.78.0-DEV", "stravaPremium": False, "profileChanges": False, "launchedGameClient": "09/19/2021 13:24:19 +0000", "createdOn":"2021-09-19T13:24:17.783+0000", "likelyInGame": False, "address": None, "bt":"f97803d3-efac-4510-a17a-ef44e65d3071", "numberOfFolloweesInCommon": 0, "fundraiserId": None, "source": "Android", "origin": None, "licenseNumber": None, "bigCommerceId": None, "marketingConsent": None, "affiliate": None, "avantlinkId": None, "virtualBikeModel": "Zwift Carbon", "connectedToWithings": False, "connectedToRuntastic": False, "connectedToZwiftPower": False, "powerSourceType": "Power Source", "powerSourceModel": "Power Meter", "riding": False, "location": "", "publicId": "5a72e9b1-239f-435e-8757-af9467336b40", "mixpanelDistinctId": "21304417-af2d-4c9b-8543-8ba7c0500e84"}
|
||||
jprofile = {"id": profile.id, "firstName": jsf(profile, 'first_name'), "lastName": jsf(profile, 'last_name'), "preferredLanguage": jsf(profile, 'preferred_language'), "bodyType":jsv0(profile, 'body_type'), "male": jsb1(profile, 'is_male'),
|
||||
"imageSrc": "https://us-or-rly101.zwift.com/download/%s/avatarLarge.jpg" % profile.id, "imageSrcLarge": "https://us-or-rly101.zwift.com/download/%s/avatarLarge.jpg" % profile.id, "playerType": profile_pb2.Profile.PlayerType.Name(jsf(profile, 'player_type', 1)), "playerTypeId": jsf(profile, 'player_type', 1), "playerSubTypeId": None,
|
||||
"emailAddress": jsf(profile, 'email'), "countryCode": jsf(profile, 'country_code'), "dob": jsf(profile, 'dob'), "countryAlpha3": "rus", "useMetric": jsb1(profile, 'use_metric'), "privacy": privacy(profile), "age": jsv0(profile, 'age'), "ftp": jsf(profile, 'ftp'), "b": False, "weight": jsf(profile, 'weight_in_grams'), "connectedToStrava": jsb0(profile, 'connected_to_strava'), "connectedToTrainingPeaks": jsb0(profile, 'connected_to_training_peaks'),
|
||||
"connectedToTodaysPlan": jsb0(profile, 'connected_to_todays_plan'), "connectedToUnderArmour": jsb0(profile, 'connected_to_under_armour'), "connectedToFitbit": jsb0(profile, 'connected_to_fitbit'), "connectedToGarmin": jsb0(profile, 'connected_to_garmin'), "height": jsf(profile, 'height_in_millimeters'), "location": "",
|
||||
"socialFacts": jprofileFull.get('socialFacts'), "totalExperiencePoints": jsv0(profile, 'total_xp'), "worldId": jsf(profile, 'world_id'), "totalDistance": jsv0(profile, 'total_distance_in_meters'), "totalDistanceClimbed": jsv0(profile, 'elevation_gain_in_meters'), "totalTimeInMinutes": jsv0(profile, 'time_ridden_in_minutes'),
|
||||
"achievementLevel": jsv0(profile, 'achievement_level'), "totalWattHours": jsv0(profile, 'total_watt_hours'), "runTime1miInSeconds": jsv0(profile, 'run_time_1mi_in_seconds'), "runTime5kmInSeconds": jsv0(profile, 'run_time_5km_in_seconds'), "runTime10kmInSeconds": jsv0(profile, 'run_time_10km_in_seconds'),
|
||||
"runTimeHalfMarathonInSeconds": jsv0(profile, 'run_time_half_marathon_in_seconds'), "runTimeFullMarathonInSeconds": jsv0(profile, 'run_time_full_marathon_in_seconds'), "totalInKomJersey": jsv0(profile, 'total_in_kom_jersey'), "totalInSprintersJersey": jsv0(profile, 'total_in_sprinters_jersey'),
|
||||
"totalInOrangeJersey": jsv0(profile, 'total_in_orange_jersey'), "currentActivityId": jsf(profile, 'current_activity_id'), "enrolledZwiftAcademy": jsv0(profile, 'enrolled_program') == profile.EnrolledProgram.ZWIFT_ACADEMY, "runAchievementLevel": jsv0(profile, 'run_achievement_level'),
|
||||
"totalRunDistance": jsv0(profile, 'total_run_distance'), "totalRunTimeInMinutes": jsv0(profile, 'total_run_time_in_minutes'), "totalRunExperiencePoints": jsv0(profile, 'total_run_experience_points'), "totalRunCalories": jsv0(profile, 'total_run_calories'), "totalGold": jsv0(profile, 'total_gold_drops'),
|
||||
"profilePropertyChanges": jprofileFull.get('propertyChanges'), "cyclingOrganization": jsf(profile, 'cycling_organization'), "userAgent": "CNL/3.13.0 (Android 11) zwift/1.0.85684 curl/7.78.0-DEV", "stravaPremium": False, "profileChanges": False, "launchedGameClient": "09/19/2021 13:24:19 +0000",
|
||||
"createdOn":"2021-09-19T13:24:17.783+0000", "likelyInGame": False, "address": None, "bt":"f97803d3-efac-4510-a17a-ef44e65d3071", "numberOfFolloweesInCommon": 0, "fundraiserId": None, "source": "Android", "origin": None, "licenseNumber": None, "bigCommerceId": None, "marketingConsent": None, "affiliate": None,
|
||||
"avantlinkId": None, "virtualBikeModel": "Zwift Carbon", "connectedToWithings": jsb0(profile, 'connected_to_withings'), "connectedToRuntastic": jsb0(profile, 'connected_to_runtastic'), "connectedToZwiftPower": False, "powerSourceType": "Power Source", "powerSourceModel": powerSourceModelToStr(profile.power_source_model), "riding": False, "location": "", "publicId": "5a72e9b1-239f-435e-8757-af9467336b40",
|
||||
"mixpanelDistinctId": "21304417-af2d-4c9b-8543-8ba7c0500e84"}
|
||||
copyAttributes(jprofile, jprofileFull, 'publicAttributes')
|
||||
copyAttributes(jprofile, jprofileFull, 'privateAttributes')
|
||||
#print (jsonify(jprofile).data.decode("utf-8"))
|
||||
@@ -1193,8 +1211,38 @@ def api_profiles_me_json():
|
||||
@login_required
|
||||
def api_profiles_id_privacy(player_id):
|
||||
privacy_file = '%s/%s/privacy.json' % (STORAGE_DIR, player_id)
|
||||
jp = request.get_json()
|
||||
with open(privacy_file, 'w', encoding='utf-8') as fprivacy:
|
||||
fprivacy.write(json.dumps(request.get_json(), ensure_ascii=False))
|
||||
fprivacy.write(json.dumps(jp, ensure_ascii=False))
|
||||
#{"displayAge": false, "defaultActivityPrivacy": "PUBLIC", "approvalRequired": false, "privateMessaging": false, "defaultFitnessDataPrivacy": false}
|
||||
profile_dir = '%s/%s' % (STORAGE_DIR, player_id)
|
||||
profile = profile_pb2.Profile()
|
||||
profile_file = '%s/profile.bin' % profile_dir
|
||||
with open(profile_file, 'rb') as fd:
|
||||
profile.ParseFromString(fd.read())
|
||||
profile.privacy_bits = 0
|
||||
if (jp["approvalRequired"]):
|
||||
profile.privacy_bits += 1
|
||||
if ("displayWeight" in jp and jp["displayWeight"]):
|
||||
profile.privacy_bits += 4
|
||||
if ("minor" in jp and jp["minor"]):
|
||||
profile.privacy_bits += 2
|
||||
if (jp["privateMessaging"]):
|
||||
profile.privacy_bits += 8
|
||||
if (jp["defaultFitnessDataPrivacy"]):
|
||||
profile.privacy_bits += 16
|
||||
if ("suppressFollowerNotification" in jp and jp["suppressFollowerNotification"]):
|
||||
profile.privacy_bits += 32
|
||||
if (not jp["displayAge"]):
|
||||
profile.privacy_bits += 64
|
||||
defaultActivityPrivacy = jp["defaultActivityPrivacy"]
|
||||
profile.default_activity_privacy = 0 #PUBLIC
|
||||
if(defaultActivityPrivacy == "PRIVATE"):
|
||||
profile.default_activity_privacy = 1
|
||||
if(defaultActivityPrivacy == "FRIENDS"):
|
||||
profile.default_activity_privacy = 2
|
||||
with open(profile_file, 'wb') as fd:
|
||||
fd.write(profile.SerializeToString())
|
||||
return '', 200
|
||||
|
||||
@app.route('/api/search/profiles', methods=['POST'])
|
||||
@@ -1273,6 +1321,7 @@ def api_profiles_me_id(player_id):
|
||||
@jwt_to_session_cookie
|
||||
@login_required
|
||||
def api_profiles_id(player_id):
|
||||
#print(request.__dict__)
|
||||
if not request.stream:
|
||||
return '', 400
|
||||
if player_id == 0:
|
||||
|
||||
Reference in New Issue
Block a user