@learnpack/learnpack 5.0.10 → 5.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -21,7 +21,7 @@ $ npm install -g @learnpack/learnpack
21
21
  $ learnpack COMMAND
22
22
  running command...
23
23
  $ learnpack (-v|--version|version)
24
- @learnpack/learnpack/5.0.10 win32-x64 node-v20.16.0
24
+ @learnpack/learnpack/5.0.12 win32-x64 node-v20.16.0
25
25
  $ learnpack --help [COMMAND]
26
26
  USAGE
27
27
  $ learnpack COMMAND
@@ -75,7 +75,7 @@ DESCRIPTION
75
75
  12. If there is a file within the exercises folder but not inside of any particular exercise's folder. (Warning)
76
76
  ```
77
77
 
78
- _See code: [src\commands\audit.ts](https://github.com/learnpack/learnpack-cli/blob/v5.0.10/src\commands\audit.ts)_
78
+ _See code: [src\commands\audit.ts](https://github.com/learnpack/learnpack-cli/blob/v5.0.12/src\commands\audit.ts)_
79
79
 
80
80
  ## `learnpack clean`
81
81
 
@@ -90,7 +90,7 @@ DESCRIPTION
90
90
  Extra documentation goes here
91
91
  ```
92
92
 
93
- _See code: [src\commands\clean.ts](https://github.com/learnpack/learnpack-cli/blob/v5.0.10/src\commands\clean.ts)_
93
+ _See code: [src\commands\clean.ts](https://github.com/learnpack/learnpack-cli/blob/v5.0.12/src\commands\clean.ts)_
94
94
 
95
95
  ## `learnpack download [PACKAGE]`
96
96
 
@@ -108,7 +108,7 @@ DESCRIPTION
108
108
  Extra documentation goes here
109
109
  ```
110
110
 
111
- _See code: [src\commands\download.ts](https://github.com/learnpack/learnpack-cli/blob/v5.0.10/src\commands\download.ts)_
111
+ _See code: [src\commands\download.ts](https://github.com/learnpack/learnpack-cli/blob/v5.0.12/src\commands\download.ts)_
112
112
 
113
113
  ## `learnpack help [COMMAND]`
114
114
 
@@ -139,7 +139,7 @@ OPTIONS
139
139
  -h, --grading show CLI help
140
140
  ```
141
141
 
142
- _See code: [src\commands\init.ts](https://github.com/learnpack/learnpack-cli/blob/v5.0.10/src\commands\init.ts)_
142
+ _See code: [src\commands\init.ts](https://github.com/learnpack/learnpack-cli/blob/v5.0.12/src\commands\init.ts)_
143
143
 
144
144
  ## `learnpack login [PACKAGE]`
145
145
 
@@ -157,7 +157,7 @@ DESCRIPTION
157
157
  Extra documentation goes here
158
158
  ```
159
159
 
160
- _See code: [src\commands\login.ts](https://github.com/learnpack/learnpack-cli/blob/v5.0.10/src\commands\login.ts)_
160
+ _See code: [src\commands\login.ts](https://github.com/learnpack/learnpack-cli/blob/v5.0.12/src\commands\login.ts)_
161
161
 
162
162
  ## `learnpack logout [PACKAGE]`
163
163
 
@@ -175,7 +175,7 @@ DESCRIPTION
175
175
  Extra documentation goes here
176
176
  ```
177
177
 
178
- _See code: [src\commands\logout.ts](https://github.com/learnpack/learnpack-cli/blob/v5.0.10/src\commands\logout.ts)_
178
+ _See code: [src\commands\logout.ts](https://github.com/learnpack/learnpack-cli/blob/v5.0.12/src\commands\logout.ts)_
179
179
 
180
180
  ## `learnpack plugins`
181
181
 
@@ -306,7 +306,7 @@ OPTIONS
306
306
  -h, --help show CLI help
307
307
  ```
308
308
 
309
- _See code: [src\commands\publish.ts](https://github.com/learnpack/learnpack-cli/blob/v5.0.10/src\commands\publish.ts)_
309
+ _See code: [src\commands\publish.ts](https://github.com/learnpack/learnpack-cli/blob/v5.0.12/src\commands\publish.ts)_
310
310
 
311
311
  ## `learnpack start`
312
312
 
@@ -327,7 +327,7 @@ OPTIONS
327
327
  -w, --watch Watch for file changes
328
328
  ```
329
329
 
330
- _See code: [src\commands\start.ts](https://github.com/learnpack/learnpack-cli/blob/v5.0.10/src\commands\start.ts)_
330
+ _See code: [src\commands\start.ts](https://github.com/learnpack/learnpack-cli/blob/v5.0.12/src\commands\start.ts)_
331
331
 
332
332
  ## `learnpack test [EXERCISESLUG]`
333
333
 
@@ -341,7 +341,7 @@ ARGUMENTS
341
341
  EXERCISESLUG The name of the exercise to test
342
342
  ```
343
343
 
344
- _See code: [src\commands\test.ts](https://github.com/learnpack/learnpack-cli/blob/v5.0.10/src\commands\test.ts)_
344
+ _See code: [src\commands\test.ts](https://github.com/learnpack/learnpack-cli/blob/v5.0.12/src\commands\test.ts)_
345
345
 
346
346
  ## `learnpack translate`
347
347
 
@@ -352,7 +352,7 @@ USAGE
352
352
  $ learnpack translate
353
353
  ```
354
354
 
355
- _See code: [src\commands\translate.ts](https://github.com/learnpack/learnpack-cli/blob/v5.0.10/src\commands\translate.ts)_
355
+ _See code: [src\commands\translate.ts](https://github.com/learnpack/learnpack-cli/blob/v5.0.12/src\commands\translate.ts)_
356
356
  <!-- commandsstop -->
357
357
 
358
358
  > > > > > > > 0cb3e56d84c197f9d008836bb573eade212b7e57
@@ -69,6 +69,7 @@ class StartCommand extends SessionCommand_1.default {
69
69
  compilations: [],
70
70
  tests: [],
71
71
  is_testeable: e.graded || false,
72
+ quiz_submissions: [],
72
73
  }));
73
74
  if (path && steps.length > 0) {
74
75
  telemetry_1.default.start(agent, steps, path, tutorialSlug);
@@ -141,6 +142,10 @@ class StartCommand extends SessionCommand_1.default {
141
142
  telemetry: telemetry_1.default,
142
143
  });
143
144
  });
145
+ socket_1.default.on("quiz_submission", (data) => {
146
+ const { stepPosition, event, eventData } = data;
147
+ telemetry_1.default.registerStepEvent(stepPosition, event, eventData);
148
+ });
144
149
  socket_1.default.on("ai_interaction", (data) => {
145
150
  const { stepPosition, event, eventData } = data;
146
151
  telemetry_1.default.registerStepEvent(stepPosition, event, eventData);
@@ -134,6 +134,11 @@ async function default_1(app, configObject, configManager) {
134
134
  const payload = await session_1.default.getPayload();
135
135
  if (payload && payload.rigobot && payload.rigobot.key) {
136
136
  res.json({ rigoToken: payload.rigobot.key, payload: payload });
137
+ telemetry_1.default.setStudent({
138
+ user_id: payload.user_id,
139
+ email: payload.email,
140
+ token: payload.token,
141
+ });
137
142
  }
138
143
  else {
139
144
  res
@@ -49,8 +49,13 @@ const Session = {
49
49
  },
50
50
  setPayload: async function (value) {
51
51
  await this.initialize();
52
- await storage.setItem("bc-payload", Object.assign({ token: this.token }, value));
52
+ await storage.setItem("bc-payload", Object.assign({}, value));
53
53
  console_1.default.debug("Payload successfuly found and set for " + value.email);
54
+ // TelemetryManager.setStudent({
55
+ // user_id: value.user_id.toString(),
56
+ // email: value.email,
57
+ // token: value.token,
58
+ // })
54
59
  return true;
55
60
  },
56
61
  getPayload: async function () {
@@ -20,6 +20,16 @@ type TAIInteraction = {
20
20
  starting_at: number;
21
21
  ending_at: number;
22
22
  };
23
+ type TQuizSelection = {
24
+ question: string;
25
+ answer: string;
26
+ isCorrect: boolean;
27
+ };
28
+ type TQuizSubmission = {
29
+ quiz_hash: string;
30
+ selections: TQuizSelection[];
31
+ submitted_at: number;
32
+ };
23
33
  export type TStep = {
24
34
  slug: string;
25
35
  position: number;
@@ -30,6 +40,7 @@ export type TStep = {
30
40
  compilations: TCompilationAttempt[];
31
41
  tests: TTestAttempt[];
32
42
  ai_interactions: TAIInteraction[];
43
+ quiz_submissions: TQuizSubmission[];
33
44
  };
34
45
  type TWorkoutSession = {
35
46
  started_at: number;
@@ -45,20 +56,27 @@ export interface ITelemetryJSONSchema {
45
56
  user_id?: number | string;
46
57
  slug: string;
47
58
  agent?: string;
48
- tutorial_started_at?: number;
49
- last_interaction_at?: number;
59
+ tutorial_started_at: number;
60
+ last_interaction_at: number;
50
61
  steps: Array<TStep>;
51
62
  workout_session: TWorkoutSession[];
52
63
  }
53
- type TStepEvent = "compile" | "test" | "ai_interaction" | "open_step";
64
+ type TStepEvent = "compile" | "test" | "ai_interaction" | "open_step" | "quiz_submission";
54
65
  export type TTelemetryUrls = {
55
66
  streaming?: string;
56
67
  batch?: string;
57
68
  };
69
+ type TUser = {
70
+ token: string;
71
+ id: string;
72
+ email: string;
73
+ };
58
74
  interface ITelemetryManager {
59
75
  current: ITelemetryJSONSchema | null;
60
76
  configPath: string | null;
77
+ user: TUser;
61
78
  urls: TTelemetryUrls;
79
+ started: boolean;
62
80
  salute: (message: string) => void;
63
81
  start: (agent: string, steps: TStep[], path: string, tutorialSlug: string) => void;
64
82
  prevStep?: number;
@@ -13,7 +13,13 @@ function stringToBase64(input) {
13
13
  const TelemetryManager = {
14
14
  current: null,
15
15
  urls: {},
16
+ user: {
17
+ token: "",
18
+ id: "",
19
+ email: "",
20
+ },
16
21
  configPath: "",
22
+ started: false,
17
23
  salute: message => {
18
24
  console_1.default.info(message);
19
25
  },
@@ -33,6 +39,7 @@ const TelemetryManager = {
33
39
  slug: tutorialSlug,
34
40
  agent,
35
41
  tutorial_started_at: Date.now(),
42
+ last_interaction_at: Date.now(),
36
43
  steps,
37
44
  workout_session: [
38
45
  {
@@ -41,7 +48,16 @@ const TelemetryManager = {
41
48
  ],
42
49
  };
43
50
  }
51
+ if (this.current.user_id) {
52
+ this.user.id = this.current.user_id.toString();
53
+ }
44
54
  this.save();
55
+ this.started = true;
56
+ console_1.default.debug("Telemetry started successfully!");
57
+ if (!this.user.id) {
58
+ console_1.default.debug("No user ID found, impossible to submit telemetry at start");
59
+ return;
60
+ }
45
61
  this.submit();
46
62
  })
47
63
  .catch(error => {
@@ -52,18 +68,16 @@ const TelemetryManager = {
52
68
  });
53
69
  }
54
70
  },
55
- // verifyStudent: function () {
56
- // if (!this.current) {
57
- // return;
58
- // }
59
- // if (!this.current.user_id) {
60
- // }
61
- // },
62
71
  setStudent: function (student) {
63
72
  if (!this.current) {
73
+ console_1.default.debug("Telemetry has not been started");
64
74
  return;
65
75
  }
76
+ console_1.default.debug("Setting student", student);
66
77
  this.current.user_id = student.user_id;
78
+ this.user.id = student.user_id;
79
+ this.user.token = student.token;
80
+ this.user.email = student.email;
67
81
  this.save();
68
82
  this.submit();
69
83
  },
@@ -83,6 +97,7 @@ const TelemetryManager = {
83
97
  }
84
98
  },
85
99
  registerStepEvent: function (stepPosition, event, data) {
100
+ console_1.default.debug(`Registering Event ${event} for user ${this.user.id}`);
86
101
  if (!this.current) {
87
102
  // throw new Error("Telemetry has not been started");
88
103
  return;
@@ -129,6 +144,13 @@ const TelemetryManager = {
129
144
  }
130
145
  step.ai_interactions.push(data);
131
146
  break;
147
+ case "quiz_submission": {
148
+ if (!step.quiz_submissions) {
149
+ step.quiz_submissions = [];
150
+ }
151
+ step.quiz_submissions.push(data);
152
+ break;
153
+ }
132
154
  case "open_step": {
133
155
  const now = Date.now();
134
156
  if (!step.opened_at) {
@@ -178,13 +200,23 @@ const TelemetryManager = {
178
200
  },
179
201
  submit: async function () {
180
202
  console_1.default.debug("Submitting telemetry...");
181
- if (!this.current)
203
+ if (!this.current) {
204
+ console_1.default.debug("Telemetry has not been started");
205
+ return Promise.resolve();
206
+ }
207
+ if (!this.user.id) {
208
+ console_1.default.debug("User ID not found, skipping batch telemetry delivery");
182
209
  return Promise.resolve();
210
+ }
183
211
  const url = this.urls.batch;
184
212
  if (!url) {
185
- return;
213
+ console_1.default.debug("Batch URL not found, skipping batch telemetry delivery");
214
+ return Promise.resolve();
186
215
  }
187
216
  const body = this.current;
217
+ if (!body.user_id) {
218
+ body.user_id = this.user.id;
219
+ }
188
220
  api_1.default.sendBatchTelemetry(url, body);
189
221
  },
190
222
  save: function () {
@@ -1,6 +1,8 @@
1
1
  import { IConfig, IConfigObj } from "./config";
2
2
  export interface IPayload {
3
3
  email: string;
4
+ user_id: number;
5
+ token: string;
4
6
  }
5
7
  export interface IStartProps {
6
8
  token: string;
@@ -8,7 +8,7 @@ declare const _default: {
8
8
  lang?: string;
9
9
  slug?: string;
10
10
  }) => Promise<any>;
11
- sendBatchTelemetry: (url: string, body: object) => Promise<void>;
11
+ sendBatchTelemetry: (url: string, body: any) => Promise<void>;
12
12
  sendStreamTelemetry: (url: string, body: object) => Promise<void>;
13
13
  };
14
14
  export default _default;
package/lib/utils/api.js CHANGED
@@ -207,16 +207,21 @@ const sendBatchTelemetry = async function (url, body) {
207
207
  if (!session ||
208
208
  !Object.prototype.hasOwnProperty.call(session, "token") ||
209
209
  session.token === "") {
210
- console_1.default.debug("No token found, skipping stream telemetry delivery");
210
+ console_1.default.debug("No token found, skipping batch telemetry delivery");
211
+ return;
212
+ }
213
+ if (!session || !session.user_id || session.user_id === "") {
214
+ console_1.default.debug("No user_id found, skipping batch telemetry delivery");
211
215
  return;
212
216
  }
217
+ body.user_id = session.user_id;
213
218
  fetch(url, {
214
219
  method: "POST",
215
220
  body: JSON.stringify(body),
216
221
  }, false)
217
222
  .then(response => {
218
223
  console_1.default.debug("Telemetry sent successfully");
219
- return response.text();
224
+ return response;
220
225
  })
221
226
  .catch(error => {
222
227
  console_1.default.debug("Error while sending batch Telemetry", error);
@@ -126,7 +126,8 @@ const installDependencies = async (deps, packageManager) => {
126
126
  const checkNotInstalledDependencies = async (neededPlugins) => {
127
127
  console_1.default.info("Checking needed dependencies...");
128
128
  const jsPluginsDependencies = ["jest@29.7.0", "jest-environment-jsdom@29.7.0"];
129
- const pyPluginsDependencies = ["pytest==6.2.5", "pytest-testdox", "mock"];
129
+ // pytest up to 6.2.5
130
+ const pyPluginsDependencies = ["pytest", "pytest-testdox", "mock"];
130
131
  const npmLsCommand = "npm ls jest jest-environment-jsdom -g";
131
132
  let pytestNeeded = false;
132
133
  let jestNeeded = false;
@@ -159,7 +160,6 @@ const checkNotInstalledDependencies = async (neededPlugins) => {
159
160
  await installDependencies(jsPluginsDependencies, "npm");
160
161
  }
161
162
  if (pytestNeeded) {
162
- console.log("Trying to install pytest dependencies");
163
163
  const { stdout, stderr } = await exec("pip list");
164
164
  if (stderr) {
165
165
  console_1.default.error(`Error executing pip list. Use debug for more info`);
@@ -1 +1 @@
1
- {"version":"5.0.10","commands":{"audit":{"id":"audit","description":"learnpack audit is the command in charge of creating an auditory of the repository\n...\nlearnpack audit checks for the following information in a repository:\n 1. The configuration object has slug, repository and description. (Error)\n 2. The command learnpack clean has been run. (Error)\n 3. If a markdown or test file doesn't have any content. (Error)\n 4. The links are accessing to valid servers. (Error)\n 5. The relative images are working (If they have the shortest path to the image or if the images exists in the assets). (Error)\n 6. The external images are working (If they are pointing to a valid server). (Error)\n 7. The exercises directory names are valid. (Error)\n 8. If an exercise doesn't have a README file. (Error)\n 9. The exercises array (Of the config file) has content. (Error)\n 10. The exercses have the same translations. (Warning)\n 11. The .gitignore file exists. (Warning)\n 12. If there is a file within the exercises folder but not inside of any particular exercise's folder. (Warning)\n","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{},"args":[]},"clean":{"id":"clean","description":"Clean the configuration object\n ...\n Extra documentation goes here\n ","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{},"args":[]},"download":{"id":"download","description":"Describe the command here\n...\nExtra documentation goes here\n","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{},"args":[{"name":"package","description":"The unique string that identifies this package on learnpack","required":false,"hidden":false}]},"init":{"id":"init","description":"Create a new learning package: Book, Tutorial or Exercise","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{"grading":{"name":"grading","type":"boolean","char":"h","description":"show CLI help","allowNo":false}},"args":[]},"login":{"id":"login","description":"Describe the command here\n ...\n Extra documentation goes here\n ","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{},"args":[{"name":"package","description":"The unique string that identifies this package on learnpack","required":false,"hidden":false}]},"logout":{"id":"logout","description":"Describe the command here\n ...\n Extra documentation goes here\n ","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{},"args":[{"name":"package","description":"The unique string that identifies this package on learnpack","required":false,"hidden":false}]},"publish":{"id":"publish","description":"Builds the project by copying necessary files and directories into a zip file","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{"help":{"name":"help","type":"boolean","char":"h","description":"show CLI help","allowNo":false}},"args":[]},"start":{"id":"start","description":"Runs a small server with all the exercise instructions","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{"port":{"name":"port","type":"option","char":"p","description":"server port"},"host":{"name":"host","type":"option","char":"h","description":"server host"},"disableGrading":{"name":"disableGrading","type":"boolean","char":"D","description":"disble grading functionality","allowNo":false},"watch":{"name":"watch","type":"boolean","char":"w","description":"Watch for file changes","allowNo":false},"editor":{"name":"editor","type":"option","char":"e","description":"[preview, extension]","options":["extension","preview"]},"version":{"name":"version","type":"option","char":"v","description":"E.g: 1.0.1"},"grading":{"name":"grading","type":"option","char":"g","description":"[isolated, incremental]","options":["isolated","incremental"]},"debug":{"name":"debug","type":"boolean","char":"d","description":"debugger mode for more verbage","allowNo":false}},"args":[]},"test":{"id":"test","description":"Test exercises","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{},"args":[{"name":"exerciseSlug","description":"The name of the exercise to test","required":false,"hidden":false}]},"translate":{"id":"translate","description":"List all the lessons, the user is able of select many of them to translate to the given languages","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{},"args":[]}}}
1
+ {"version":"5.0.12","commands":{"audit":{"id":"audit","description":"learnpack audit is the command in charge of creating an auditory of the repository\n...\nlearnpack audit checks for the following information in a repository:\n 1. The configuration object has slug, repository and description. (Error)\n 2. The command learnpack clean has been run. (Error)\n 3. If a markdown or test file doesn't have any content. (Error)\n 4. The links are accessing to valid servers. (Error)\n 5. The relative images are working (If they have the shortest path to the image or if the images exists in the assets). (Error)\n 6. The external images are working (If they are pointing to a valid server). (Error)\n 7. The exercises directory names are valid. (Error)\n 8. If an exercise doesn't have a README file. (Error)\n 9. The exercises array (Of the config file) has content. (Error)\n 10. The exercses have the same translations. (Warning)\n 11. The .gitignore file exists. (Warning)\n 12. If there is a file within the exercises folder but not inside of any particular exercise's folder. (Warning)\n","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{},"args":[]},"clean":{"id":"clean","description":"Clean the configuration object\n ...\n Extra documentation goes here\n ","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{},"args":[]},"download":{"id":"download","description":"Describe the command here\n...\nExtra documentation goes here\n","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{},"args":[{"name":"package","description":"The unique string that identifies this package on learnpack","required":false,"hidden":false}]},"init":{"id":"init","description":"Create a new learning package: Book, Tutorial or Exercise","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{"grading":{"name":"grading","type":"boolean","char":"h","description":"show CLI help","allowNo":false}},"args":[]},"login":{"id":"login","description":"Describe the command here\n ...\n Extra documentation goes here\n ","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{},"args":[{"name":"package","description":"The unique string that identifies this package on learnpack","required":false,"hidden":false}]},"logout":{"id":"logout","description":"Describe the command here\n ...\n Extra documentation goes here\n ","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{},"args":[{"name":"package","description":"The unique string that identifies this package on learnpack","required":false,"hidden":false}]},"publish":{"id":"publish","description":"Builds the project by copying necessary files and directories into a zip file","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{"help":{"name":"help","type":"boolean","char":"h","description":"show CLI help","allowNo":false}},"args":[]},"start":{"id":"start","description":"Runs a small server with all the exercise instructions","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{"port":{"name":"port","type":"option","char":"p","description":"server port"},"host":{"name":"host","type":"option","char":"h","description":"server host"},"disableGrading":{"name":"disableGrading","type":"boolean","char":"D","description":"disble grading functionality","allowNo":false},"watch":{"name":"watch","type":"boolean","char":"w","description":"Watch for file changes","allowNo":false},"editor":{"name":"editor","type":"option","char":"e","description":"[preview, extension]","options":["extension","preview"]},"version":{"name":"version","type":"option","char":"v","description":"E.g: 1.0.1"},"grading":{"name":"grading","type":"option","char":"g","description":"[isolated, incremental]","options":["isolated","incremental"]},"debug":{"name":"debug","type":"boolean","char":"d","description":"debugger mode for more verbage","allowNo":false}},"args":[]},"test":{"id":"test","description":"Test exercises","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{},"args":[{"name":"exerciseSlug","description":"The name of the exercise to test","required":false,"hidden":false}]},"translate":{"id":"translate","description":"List all the lessons, the user is able of select many of them to translate to the given languages","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{},"args":[]}}}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@learnpack/learnpack",
3
3
  "description": "Seamlessly build, sell and/or take interactive & auto-graded tutorials, start learning now or build a new tutorial to your audience.",
4
- "version": "5.0.10",
4
+ "version": "5.0.12",
5
5
  "author": "Alejandro Sanchez @alesanchezr",
6
6
  "contributors": [
7
7
  {
@@ -157,6 +157,7 @@ export default class StartCommand extends SessionCommand {
157
157
  compilations: [],
158
158
  tests: [],
159
159
  is_testeable: e.graded || false,
160
+ quiz_submissions: [],
160
161
  })
161
162
  )
162
163
  if (path && steps.length > 0) {
@@ -248,6 +249,11 @@ export default class StartCommand extends SessionCommand {
248
249
  })
249
250
  })
250
251
 
252
+ socket.on("quiz_submission", (data: any) => {
253
+ const { stepPosition, event, eventData } = data
254
+ TelemetryManager.registerStepEvent(stepPosition, event, eventData)
255
+ })
256
+
251
257
  socket.on("ai_interaction", (data: any) => {
252
258
  const { stepPosition, event, eventData } = data
253
259
  TelemetryManager.registerStepEvent(stepPosition, event, eventData)
@@ -177,6 +177,12 @@ export default async function (
177
177
 
178
178
  if (payload && payload.rigobot && payload.rigobot.key) {
179
179
  res.json({ rigoToken: payload.rigobot.key, payload: payload })
180
+
181
+ TelemetryManager.setStudent({
182
+ user_id: payload.user_id,
183
+ email: payload.email,
184
+ token: payload.token,
185
+ })
180
186
  } else {
181
187
  res
182
188
  .status(400)
@@ -66,8 +66,15 @@ const Session: ISession = {
66
66
  },
67
67
  setPayload: async function (value: IPayload) {
68
68
  await this.initialize()
69
- await storage.setItem("bc-payload", { token: this.token, ...value })
69
+ await storage.setItem("bc-payload", { ...value })
70
70
  Console.debug("Payload successfuly found and set for " + value.email)
71
+
72
+ // TelemetryManager.setStudent({
73
+ // user_id: value.user_id.toString(),
74
+ // email: value.email,
75
+ // token: value.token,
76
+ // })
77
+
71
78
  return true
72
79
  },
73
80
  getPayload: async function () {
@@ -128,6 +135,7 @@ const Session: ISession = {
128
135
  const data = await api.login(email, password)
129
136
  if (data) {
130
137
  this.start({ token: data.token, payload: data })
138
+
131
139
  TelemetryManager.setStudent({
132
140
  user_id: data.user_id,
133
141
  email: data.email,