/// <summary> /// Initializes the singleton application object. This is the first line of authored code /// executed, and as such is the logical equivalent of main() or WinMain(). /// </summary> public App() { this.InitializeComponent(); this.Suspending += OnSuspending; Tapstream.Create("sdktest", "YGP2pezGTI6ec48uti4o1w"); Tapstream tracker = Tapstream.Instance; Event e = new Event("test-event", false); e.AddPair("player", "John Doe"); e.AddPair("score", 5); tracker.FireEvent(e); e = new Event("test-event-oto", true); tracker.FireEvent(e); Hit h = new Hit("test-tracker"); h.AddTag("tag1"); h.AddTag("tag2"); Task.Run(async () => { Response response = await tracker.FireHitAsync(h); if (response.Status >= 200 && response.Status < 300) { // Success } else { // Error } }); }
/// <summary> /// Constructor for the Application object. /// </summary> public App() { // Global handler for uncaught exceptions. UnhandledException += Application_UnhandledException; // Standard XAML initialization InitializeComponent(); Logging.SetLogger(new MyLogger()); Config config = new Config(); Tapstream.Create("sdktest", "YGP2pezGTI6ec48uti4o1w", config); Tapstream tracker = Tapstream.Instance; tracker.GetConversionData(new MyConversionListener()); Event e = new Event("test-event", false); e.AddPair("player", "John Doe"); e.AddPair("score", 5); tracker.FireEvent(e); e = new Event("test-event-oto-again", true); tracker.FireEvent(e); // Phone-specific initialization InitializePhoneApplication(); // Language display initialization InitializeLanguage(); // Show graphics profiling information while debugging. if (Debugger.IsAttached) { // Display the current frame rate counters. Application.Current.Host.Settings.EnableFrameRateCounter = true; // Show the areas of the app that are being redrawn in each frame. //Application.Current.Host.Settings.EnableRedrawRegions = true; // Enable non-production analysis visualization mode, // which shows areas of a page that are handed off to GPU with a colored overlay. //Application.Current.Host.Settings.EnableCacheVisualization = true; // Prevent the screen from turning off while under the debugger by disabling // the application's idle detection. // Caution:- Use this under debug mode only. Application that disables user idle detection will continue to run // and consume battery power when the user is not using the phone. PhoneApplicationService.Current.UserIdleDetectionMode = IdleDetectionMode.Disabled; } }
/// <summary> /// Constructor for the Application object. /// </summary> public App() { // Global handler for uncaught exceptions. UnhandledException += Application_UnhandledException; Logging.SetLogger(new MyLogger()); Config config = new Config(); config.InstallEventName = "my-custom-install"; Tapstream.Create("sdktest", "YGP2pezGTI6ec48uti4o1w", config); Tapstream tracker = Tapstream.Instance; Event e = new Event("test-event", false); e.AddPair("player", "John Doe"); e.AddPair("score", 5); tracker.FireEvent(e); e = new Event("test-event-oto", true); tracker.FireEvent(e); // Standard Silverlight initialization InitializeComponent(); // Phone-specific initialization InitializePhoneApplication(); // Show graphics profiling information while debugging. if (System.Diagnostics.Debugger.IsAttached) { // Display the current frame rate counters. Application.Current.Host.Settings.EnableFrameRateCounter = true; // Show the areas of the app that are being redrawn in each frame. //Application.Current.Host.Settings.EnableRedrawRegions = true; // Enable non-production analysis visualization mode, // which shows areas of a page that are handed off to GPU with a colored overlay. //Application.Current.Host.Settings.EnableCacheVisualization = true; // Disable the application idle detection by setting the UserIdleDetectionMode property of the // application's PhoneApplicationService object to Disabled. // Caution:- Use this under debug mode only. Application that disables user idle detection will continue to run // and consume battery power when the user is not using the phone. PhoneApplicationService.Current.UserIdleDetectionMode = IdleDetectionMode.Disabled; } }
/// <summary> /// Initializes the singleton application object. This is the first line of authored code /// executed, and as such is the logical equivalent of main() or WinMain(). /// </summary> public App() { this.InitializeComponent(); this.Suspending += OnSuspending; Config config = new Config(); Tapstream.Create("sdktest", "YGP2pezGTI6ec48uti4o1w", config); Tapstream tracker = Tapstream.Instance; Event e = new Event("test-event", false); e.AddPair("player", "John Doe"); e.AddPair("score", 5); tracker.FireEvent(e); e = new Event("test-event-oto", true); tracker.FireEvent(e); }
/// <summary> /// Initializes the singleton application object. This is the first line of authored code /// executed, and as such is the logical equivalent of main() or WinMain(). /// </summary> public App() { this.InitializeComponent(); this.Suspending += OnSuspending; Config config = new Config(); config.GlobalEventParams["locale"] = "ENU"; config.GlobalEventParams["user_id"] = "92429d82a41e"; Tapstream.Create("sdktest", "YGP2pezGTI6ec48uti4o1w", config); Tapstream tracker = Tapstream.Instance; var op = tracker.GetConversionDataAsync().AsTask<string>().ContinueWith((task) => { string jsonData = task.Result; if (jsonData == null) { // No conversion data available } else { JsonObject json = null; if (JsonObject.TryParse(jsonData, out json)) { // Read some data from this json object, and modify your application's behaviour accordingly // ... } } }); Event e = new Event("test-event", false); e.AddPair("player", "John Doe"); e.AddPair("score", 5); tracker.FireEvent(e); e = new Event("test-event-oto", true); tracker.FireEvent(e); }
public void FireEvent(Event e) { lock (this) { // Notify the event that we are going to fire it so it can record the time e.Firing(); if (e.OneTimeOnly) { if (firedEvents.Contains(e.Name)) { Logging.Log(LogLevel.INFO, "Tapstream ignoring event named \"{0}\" because it is a one-time-only event that has already been fired", e.Name); listener.ReportOperation("event-ignored-already-fired", e.Name); listener.ReportOperation("job-ended", e.Name); return; } else if (firingEvents.Contains(e.Name)) { Logging.Log(LogLevel.INFO, "Tapstream ignoring event named \"{0}\" because it is a one-time-only event that is already in progress", e.Name); listener.ReportOperation("event-ignored-already-in-progress", e.Name); listener.ReportOperation("job-ended", e.Name); return; } firingEvents.Add(e.Name); } Core self = this; string url = String.Format(EVENT_URL_TEMPLATE, accountName, e.EncodedName); string data = postData.ToString() + e.PostData; // Always ask the delegate what the delay should be, regardless of what our delay member says. // The delegate may wish to override it if this is a testing scenario. int actualDelay = del.GetDelay(); #if WINDOWS_PHONE scheduler.Schedule(new Action(() => { #else Task.Delay(TimeSpan.FromSeconds(actualDelay)).ContinueWith((prevResult) => { #endif Response response = platform.Request(url, data); bool failed = response.Status < 200 || response.Status >= 300; bool shouldRetry = response.Status < 0 || (response.Status >= 500 && response.Status < 600); lock(self) { if(e.OneTimeOnly) { self.firingEvents.Remove(e.Name); } if(failed) { // Only increase delays if we actually intend to retry the event if(shouldRetry) { // Not every job that fails will increase the retry delay. It will be the responsibility of // the first failed job to increase the delay after every failure. if(delay == 0) { // This is the first job to fail, it must be the one to manage delay timing failingEventId = e.Uid; IncreaseDelay(); } else if(failingEventId == e.Uid) { // This job is failing for a subsequent time IncreaseDelay(); } } } else { if(e.OneTimeOnly) { self.firedEvents.Add(e.Name); platform.SaveFiredEvents(self.firedEvents); listener.ReportOperation("fired-list-saved", e.Name); } // Success of any event resets the delay delay = 0; } } if(failed) { if(response.Status < 0) { Logging.Log(LogLevel.ERROR, "Tapstream Error: Failed to fire event, error={0}", response.Message); } else if(response.Status == 404) { Logging.Log(LogLevel.ERROR, "Tapstream Error: Failed to fire event, http code {0}\nDoes your event name contain characters that are not url safe? This event will not be retried.", response.Status); } else if(response.Status == 403) { Logging.Log(LogLevel.ERROR, "Tapstream Error: Failed to fire event, http code {0}\nAre your account name and application secret correct? This event will not be retried.", response.Status); } else { string retryMsg = ""; if(!shouldRetry) { retryMsg = " This event will not be retried."; } Logging.Log(LogLevel.ERROR, "Tapstream Error: Failed to fire event, http code {0}.{1}", response.Status, retryMsg); } listener.ReportOperation("event-failed", e.Name); if(shouldRetry) { listener.ReportOperation("retry", e.Name); listener.ReportOperation("job-ended", e.Name); if(del.IsRetryAllowed()) { FireEvent(e); } return; } } else { Logging.Log(LogLevel.INFO, "Tapstream fired event named \"{0}\"", e.Name); listener.ReportOperation("event-succeeded", e.Name); } listener.ReportOperation("job-ended", e.Name); #if WINDOWS_PHONE }), TimeSpan.FromSeconds( actualDelay ) ); #else }); #endif } }
public void FireEvent(Event e) { core.FireEvent(e); }
public void prepareEvent(Tapstream ts, Event e) { e.Prepare(ts.config.GlobalEventParams); }