Entitlement API

Entitlement API

Jaime_Alonso
Enthusiast Enthusiast
1,432 Views
3 Replies
Message 1 of 4

Entitlement API

Jaime_Alonso
Enthusiast
Enthusiast

We have been working in a c# paid subscription Revit Add In and it is tested and ready to be published pending of the entitlement checking.

 

We consider the documentation at: https://damassets.autodesk.net/content/dam/autodesk/www/adn/pdf/entitlement-api-for-desktop-apps.pdf

 

We added a draft app (not yet submited) in the publisher corner to get the app id and work on the methods but the app is not actually blocking any buttons or displaying any TaskDialog even though my current username is not registered in the entitlement (no one has actually bought the app yet). It does not actually do anything...

 

Attached you can find our code;

 

  • We subscribe to the Application Initialized event in public Result OnStartup(UIControlledApplication application);

 

application.ControlledApplication.ApplicationInitialized += ControlledApplication_ApplicationInitialized;

 

  • We declared the constant from our draft app ID;

        public const string _baseApiUrl = @"https://apps.autodesk.com/";

 

       public const string _appId = @"(The ID of my unpublished app)";

 

  • We define ControlledApplication_ApplicationInitialized event and Entitlement event (leave codeline references);

 

  1. void ControlledApplication_ApplicationInitialized(object sender, Autodesk.Revit.DB.Events.ApplicationInitializedEventArgs e)
  2.         {
  3.             Autodesk.Revit.ApplicationServices.Application rvtApp = sender as Autodesk.Revit.ApplicationServices.Application;
  4.  
  5.             UIApplication uiapp = new UIApplication(rvtApp);
  6.  
  7.             if (!Autodesk.Revit.ApplicationServices.Application.IsLoggedIn)
  8.             {
  9.                 SplitButton splitbuttonselector = App.Instance.SplitButtons.Find(x => x.Name == "pullDownToolPlaceSelector");
  10.                 SplitButton splitbutton1 = App.Instance.SplitButtons.Find(x => x.Name == "pullDownToolPlace1");
  11.                 SplitButton splitbutton2 = App.Instance.SplitButtons.Find(x => x.Name == "pullDownToolPlace2");
  12.                 SplitButton splitbutton3 = App.Instance.SplitButtons.Find(x => x.Name == "pullDownToolPlace3");
  13.                 SplitButton splitbutton4 = App.Instance.SplitButtons.Find(x => x.Name == "pullDownToolPlace4");
  14.                 SplitButton splitbutton5 = App.Instance.SplitButtons.Find(x => x.Name == "pullDownToolPlace5");
  15.                 SplitButton splitbutton6 = App.Instance.SplitButtons.Find(x => x.Name == "pullDownToolPlace6");
  16.                 SplitButton splitbutton7 = App.Instance.SplitButtons.Find(x => x.Name == "pullDownToolPlace7");
  17.                 SplitButton splitbutton8 = App.Instance.SplitButtons.Find(x => x.Name == "pullDownToolPlace8");
  18.                 SplitButton splitbutton9 = App.Instance.SplitButtons.Find(x => x.Name == "pullDownToolPlace9");
  19.                 SplitButton splitbutton10 = App.Instance.SplitButtons.Find(x => x.Name == "pullDownToolPlace10");
  20.                 SplitButton splitbutton11 = App.Instance.SplitButtons.Find(x => x.Name == "pullDownToolPlace11");
  21.                 SplitButton splitbutton12 = App.Instance.SplitButtons.Find(x => x.Name == "pullDownToolPlace12");
  22.  
  23.                 splitbuttonselector.Visible = false;
  24.                 splitbutton1.Visible = false;
  25.                 splitbutton2.Visible = false;
  26.                 splitbutton3.Visible = false;
  27.                 splitbutton4.Visible = false;
  28.                 splitbutton5.Visible = false;
  29.                 splitbutton6.Visible = false;
  30.                 splitbutton7.Visible = false;
  31.                 splitbutton8.Visible = false;
  32.                 splitbutton9.Visible = false;
  33.                 splitbutton10.Visible = false;
  34.                 splitbutton11.Visible = false;
  35.                 splitbutton12.Visible = false;
  36.  
  37.                 TaskDialog.Show("Entitlement", "Please, login to Autodesk 360.\n");
  38.  
  39.             }
  40.             else
  41.             {
  42.                 string userId = rvtApp.LoginUserId;
  43.                 bool isValid = Entitlement(_appId, userId);
  44.  
  45.                 if (isValid == false || isValid == null)
  46.                 {
  47.                     SplitButton splitbuttonselector = App.Instance.SplitButtons.Find(x => x.Name == "pullDownToolPlaceSelector");
  48.                     SplitButton splitbutton1 = App.Instance.SplitButtons.Find(x => x.Name == "pullDownToolPlace1");
  49.                     SplitButton splitbutton2 = App.Instance.SplitButtons.Find(x => x.Name == "pullDownToolPlace2");
  50.                     SplitButton splitbutton3 = App.Instance.SplitButtons.Find(x => x.Name == "pullDownToolPlace3");
  51.                     SplitButton splitbutton4 = App.Instance.SplitButtons.Find(x => x.Name == "pullDownToolPlace4");
  52.                     SplitButton splitbutton5 = App.Instance.SplitButtons.Find(x => x.Name == "pullDownToolPlace5");
  53.                     SplitButton splitbutton6 = App.Instance.SplitButtons.Find(x => x.Name == "pullDownToolPlace6");
  54.                     SplitButton splitbutton7 = App.Instance.SplitButtons.Find(x => x.Name == "pullDownToolPlace7");
  55.                     SplitButton splitbutton8 = App.Instance.SplitButtons.Find(x => x.Name == "pullDownToolPlace8");
  56.                     SplitButton splitbutton9 = App.Instance.SplitButtons.Find(x => x.Name == "pullDownToolPlace9");
  57.                     SplitButton splitbutton10 = App.Instance.SplitButtons.Find(x => x.Name == "pullDownToolPlace10");
  58.                     SplitButton splitbutton11 = App.Instance.SplitButtons.Find(x => x.Name == "pullDownToolPlace11");
  59.                     SplitButton splitbutton12 = App.Instance.SplitButtons.Find(x => x.Name == "pullDownToolPlace12");
  60.  
  61.                     splitbuttonselector.Visible = false;
  62.                     splitbutton1.Visible = false;
  63.                     splitbutton2.Visible = false;
  64.                     splitbutton3.Visible = false;
  65.                     splitbutton4.Visible = false;
  66.                     splitbutton5.Visible = false;
  67.                     splitbutton6.Visible = false;
  68.                     splitbutton7.Visible = false;
  69.                     splitbutton8.Visible = false;
  70.                     splitbutton9.Visible = false;
  71.                     splitbutton10.Visible = false;
  72.                     splitbutton11.Visible = false;
  73.                     splitbutton12.Visible = false;
  74.  
  75.                     TaskDialog.Show("Entitlement", "This Autodesk account cannot be verified.\n");
  76.                 }
  77.                 
  78.  
  79.             }
  80.         }
  81.         private bool Entitlement(string appId, string userId)
  82.         {
  83.             //REST API call for the entitlement API.
  84.             //We are using RestSharp for simplicity.
  85.             //You may choose to use another library.
  86.  
  87.             //(1) Build request
  88.             var client = new RestClient();
  89.             client.BaseUrl = new System.Uri(_baseApiUrl);
  90.  
  91.             //Set resource/end point
  92.             var request = new RestRequest();
  93.             request.Resource = "webservices/checkentitlement";
  94.             request.Method = Method.GET;
  95.  
  96.             //Add parameters
  97.             request.AddParameter("userid", userId);
  98.             request.AddParameter("appid", appId);
  99.  
  100.             //(2) Execute request and get response
  101.             IRestResponse response = client.Execute(request);
  102.  
  103.             //Get the entitlement status.
  104.             bool isValid = false;
  105.             if (response.StatusCode == HttpStatusCode.OK)
  106.             {
  107.                 JsonDeserializer deserial = new JsonDeserializer();
  108.                 EntitlementResponse entitlementResponse =
  109.                 deserial.Deserialize<EntitlementResponse>(response);
  110.                 isValid = entitlementResponse.IsValid;
  111.             }
  112.  
  113.             //
  114.             return isValid;
  115.         }
  116.         [Serializable]
  117.         public class EntitlementResponse
  118.         {
  119.             public string UserId { get; set; }
  120.             public string AppId { get; set; }
  121.             public bool IsValid { get; set; }
  122.             public
  123.             string Message
  124.             { get; set; }
  125.         }

 

 

We wonder if we should implement an internal check to confirm that the app is only used in one seat. Could one autodesk account have a license with several seats and use the same account in several computers? In that case, I guess the current checking will allow them to have our app in all their computers with only one paid license of our app.

 

Any help would be much appreciated.

Thanks

 

0 Likes
Accepted solutions (1)
1,433 Views
3 Replies
Replies (3)
Message 2 of 4

Jaime_Alonso
Enthusiast
Enthusiast
Accepted solution

Apologies. I was subscribing the event after the return Result.Succeeded; of the application OnStartup.

 

Anyway, the code is posted and working if it is of any help to anyone.

 

I also needed the Autodesk App Store team to set up my email and App ID for testing.

0 Likes
Message 3 of 4

landis.mark
Contributor
Contributor

I have been unable to get entitlement built into my app. I have it in draft mode as well and know my app ID. Is there any further information you could provide.

 

Thanks in advance.

0 Likes
Message 4 of 4

landis.mark
Contributor
Contributor

I get a warning that ControlledApplication_ApplicationInitialized is declared but never used? 

I had a warning about  if (isValid == false || isValid == null) this line indicating "The result of the expression is always the same since a value of this type is never equal to 'null'". so I have disabled it.

 

So close yet so far away.

 

Any help would be apricated.

 

Thanks