#if XAPI_REGISTRY_EXISTS using System.Collections.Generic; using System.ComponentModel; using System.Linq; using OmiLAXR.Composers; using OmiLAXR.Endpoints; using OmiLAXR.xAPI.Composers; using OmiLAXR.xAPI.Extensions; using TinCan; using UnityEngine; namespace OmiLAXR.xAPI.Endpoints { [AddComponentMenu("OmiLAXR / 6) Endpoints / Learning Record Store (LRS for xAPI)")] [Description("Sends all received statements a Learning Record Store asynchronously.")] public class LearningRecordStore : BasicAuthEndpoint { private RemoteLRS _remoteLrs; protected override int MaxBatchSize => 20; /// /// Transfer multiple statements to LRS. /// /// /// public static Dictionary TransferStatements(ILRS lrs, IEnumerable statements) { var resultTransferStatements = new Dictionary(); foreach (var statement in statements) { //transfer single statement var response = lrs.SaveStatement(statement); //successful transfer: add statement with boolean true to returning dictionary resultTransferStatements.Add(statement, response.success); //no successful transfer: add statement with boolean false to returning dictionary } return resultTransferStatements; } public override void StartSending(bool resetQueue = false) { var credentials = Credentials; _remoteLrs = new RemoteLRS(credentials.endpoint, credentials.username, credentials.password); base.StartSending(resetQueue); } protected override TransferCode HandleSending(List batch) { if (batch.Count == 0) return TransferCode.NoStatements; var stmts = batch.Select(s => (s as xApiStatement).ToTinCanStatement()).ToList(); var resp = _remoteLrs.SaveStatements(stmts); if (!resp.success) { DebugLog.xAPI.Error($"Error Message: {resp.errMsg}, Http Error: {resp.httpException}"); foreach (var statement in batch) { TriggerFailedStatement(statement); QueuedStatements.Enqueue(statement); } TriggerFailedBatch(batch); return TransferCode.Error; } foreach (var statement in batch) TriggerSentStatement(statement); return TransferCode.Success; } protected override TransferCode HandleSending(IStatement stmt) { var statement = stmt as xApiStatement; var tinCanStatement = statement.ToTinCanStatement(); // Transfer single statement to LRS var resp = _remoteLrs.SaveStatement(tinCanStatement); if (resp.success) return TransferCode.Success; // Print error message to know more about on debug DebugLog.xAPI.Error($"Error Message: {resp.errMsg}, Http Error: {resp.httpException}"); return TransferCode.Error; } } } #endif