From bc20769daa3a3d34dfd467271d174e7d71cdd056 Mon Sep 17 00:00:00 2001 From: William Jordan-Cooley Date: Mon, 21 Oct 2024 16:39:34 -0400 Subject: [PATCH] dont give old clients new activity types and catch old activity content better --- lib/main.dart | 2 +- ...actice_activity_generation_controller.dart | 93 +++++++------------ lib/pangea/enum/activity_type_enum.dart | 14 +-- .../pangea_message_event.dart | 21 +---- .../practice_activity_event.dart | 1 - .../message_activity_request.dart | 5 + lib/pangea/widgets/chat/tts_controller.dart | 17 +++- 7 files changed, 61 insertions(+), 92 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 6be6edc91..36add47dc 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -22,7 +22,7 @@ void main() async { // #Pangea try { - await dotenv.load(fileName: ".env"); + await dotenv.load(fileName: ".env.local_choreo"); } catch (e) { Logs().e('Failed to load .env file', e); } diff --git a/lib/pangea/controllers/practice_activity_generation_controller.dart b/lib/pangea/controllers/practice_activity_generation_controller.dart index a8d7cca36..410f8eeaa 100644 --- a/lib/pangea/controllers/practice_activity_generation_controller.dart +++ b/lib/pangea/controllers/practice_activity_generation_controller.dart @@ -5,13 +5,10 @@ import 'dart:developer'; import 'package:fluffychat/pangea/config/environment.dart'; import 'package:fluffychat/pangea/constants/pangea_event_types.dart'; import 'package:fluffychat/pangea/controllers/pangea_controller.dart'; -import 'package:fluffychat/pangea/enum/activity_type_enum.dart'; -import 'package:fluffychat/pangea/enum/construct_type_enum.dart'; import 'package:fluffychat/pangea/extensions/pangea_room_extension/pangea_room_extension.dart'; import 'package:fluffychat/pangea/matrix_event_wrappers/pangea_message_event.dart'; import 'package:fluffychat/pangea/matrix_event_wrappers/practice_activity_event.dart'; import 'package:fluffychat/pangea/models/practice_activities.dart/message_activity_request.dart'; -import 'package:fluffychat/pangea/models/practice_activities.dart/multiple_choice_activity_model.dart'; import 'package:fluffychat/pangea/models/practice_activities.dart/practice_activity_model.dart'; import 'package:fluffychat/pangea/network/requests.dart'; import 'package:fluffychat/pangea/network/urls.dart'; @@ -22,11 +19,11 @@ import 'package:matrix/matrix.dart'; /// Represents an item in the completion cache. class _RequestCacheItem { MessageActivityRequest req; - PracticeActivityModel? practiceActivityEvent; + PracticeActivityModel? practiceActivity; _RequestCacheItem({ required this.req, - required this.practiceActivityEvent, + required this.practiceActivity, }); } @@ -109,64 +106,46 @@ class PracticeGenerationController { final int cacheKey = req.hashCode; if (_cache.containsKey(cacheKey)) { - return _cache[cacheKey]!.practiceActivityEvent; - } else { - //TODO - send request to server/bot, either via API or via event of type pangeaActivityReq - // for now, just make and send the event from the client - final MessageActivityResponse res = await _fetch( - accessToken: _pangeaController.userController.accessToken, - requestModel: req, - ); + return _cache[cacheKey]!.practiceActivity; + } - if (res.finished) { - debugPrint('Activity generation finished'); - return null; - } + final MessageActivityResponse res = await _fetch( + accessToken: _pangeaController.userController.accessToken, + requestModel: req, + ); - // if the server points to an existing event, return that event - if (res.existingActivityEventId != null) { - final Event? existingEvent = - await event.room.getEventById(res.existingActivityEventId!); - - debugPrint( - 'Existing activity event found: ${existingEvent?.content}', - ); - if (existingEvent != null) { - return PracticeActivityEvent( - event: existingEvent, - timeline: event.timeline, - ).practiceActivity; - } - } + if (res.finished) { + debugPrint('Activity generation finished'); + return null; + } + + // if the server points to an existing event, return that event + if (res.existingActivityEventId != null) { + final Event? existingEvent = + await event.room.getEventById(res.existingActivityEventId!); - if (res.activity == null) { - debugPrint('No activity generated'); - return null; + debugPrint( + 'Existing activity event found: ${existingEvent?.content}', + ); + if (existingEvent != null) { + return PracticeActivityEvent( + event: existingEvent, + timeline: event.timeline, + ).practiceActivity; } + } + + if (res.activity == null) { + debugPrint('No activity generated'); + return null; + } - debugPrint('Activity generated: ${res.activity!.toJson()}'); + debugPrint('Activity generated: ${res.activity!.toJson()}'); - _sendAndPackageEvent(res.activity!, event); - _cache[cacheKey] = - _RequestCacheItem(req: req, practiceActivityEvent: res.activity!); + _sendAndPackageEvent(res.activity!, event); + _cache[cacheKey] = + _RequestCacheItem(req: req, practiceActivity: res.activity!); - return _cache[cacheKey]!.practiceActivityEvent; - } + return _cache[cacheKey]!.practiceActivity; } - - PracticeActivityModel _dummyModel(PangeaMessageEvent event) => - PracticeActivityModel( - tgtConstructs: [ - ConstructIdentifier(lemma: "be", type: ConstructTypeEnum.vocab), - ], - activityType: ActivityTypeEnum.multipleChoice, - langCode: event.messageDisplayLangCode, - msgId: event.eventId, - content: ActivityContent( - question: "What is a synonym for 'happy'?", - choices: ["sad", "angry", "joyful", "tired"], - answer: "joyful", - spanDisplayDetails: null, - ), - ); } diff --git a/lib/pangea/enum/activity_type_enum.dart b/lib/pangea/enum/activity_type_enum.dart index eace349d2..66bfb3e61 100644 --- a/lib/pangea/enum/activity_type_enum.dart +++ b/lib/pangea/enum/activity_type_enum.dart @@ -1,22 +1,10 @@ -enum ActivityTypeEnum { - multipleChoice, - freeResponse, - listening, - speaking, - wordFocusListening -} +enum ActivityTypeEnum { multipleChoice, wordFocusListening } extension ActivityTypeExtension on ActivityTypeEnum { String get string { switch (this) { case ActivityTypeEnum.multipleChoice: return 'multiple_choice'; - case ActivityTypeEnum.freeResponse: - return 'free_response'; - case ActivityTypeEnum.listening: - return 'listening'; - case ActivityTypeEnum.speaking: - return 'speaking'; case ActivityTypeEnum.wordFocusListening: return 'word_focus_listening'; } diff --git a/lib/pangea/matrix_event_wrappers/pangea_message_event.dart b/lib/pangea/matrix_event_wrappers/pangea_message_event.dart index 3b3a4c1db..324c4a018 100644 --- a/lib/pangea/matrix_event_wrappers/pangea_message_event.dart +++ b/lib/pangea/matrix_event_wrappers/pangea_message_event.dart @@ -603,6 +603,7 @@ class PangeaMessageEvent { event: event, ), ); + final content = practiceEvents.last.practiceActivity; } catch (e, s) { ErrorHandler.logError(e: e, s: s, data: event.toJson()); } @@ -625,22 +626,10 @@ class PangeaMessageEvent { List practiceActivitiesByLangCode( String langCode, { bool debug = false, - }) { - try { - debugger(when: debug); - final List activities = []; - for (final event in _practiceActivityEvents) { - if (event.practiceActivity.langCode == langCode) { - activities.add(event); - } - } - return activities; - } catch (e, s) { - debugger(when: kDebugMode); - ErrorHandler.logError(e: e, s: s, data: event.toJson()); - return []; - } - } + }) => + _practiceActivityEvents + .where((event) => event.practiceActivity.langCode == langCode) + .toList(); /// Returns a list of [PracticeActivityEvent] for the user's active l2. List get practiceActivities => diff --git a/lib/pangea/matrix_event_wrappers/practice_activity_event.dart b/lib/pangea/matrix_event_wrappers/practice_activity_event.dart index f8ac678dd..5ab1cce31 100644 --- a/lib/pangea/matrix_event_wrappers/practice_activity_event.dart +++ b/lib/pangea/matrix_event_wrappers/practice_activity_event.dart @@ -41,7 +41,6 @@ class PracticeActivityEvent { return _content!; } catch (e, s) { final contentMap = event.content; - debugger(when: kDebugMode); rethrow; } } diff --git a/lib/pangea/models/practice_activities.dart/message_activity_request.dart b/lib/pangea/models/practice_activities.dart/message_activity_request.dart index 6261a0215..0740fb8c3 100644 --- a/lib/pangea/models/practice_activities.dart/message_activity_request.dart +++ b/lib/pangea/models/practice_activities.dart/message_activity_request.dart @@ -242,6 +242,11 @@ class MessageActivityRequest { 'existing_activities': existingActivities.map((e) => e.toJson()).toList(), 'activity_quality_feedback': activityQualityFeedback?.toJson(), 'iso_8601_time_of_req': DateTime.now().toIso8601String(), + // this is a list of activity types that the client can handle + // the server will only return activities of these types + // this for backwards compatibility with old clients + 'client_version_compatible_activity_types': + ActivityTypeEnum.values.map((e) => e.string).toList(), }; } diff --git a/lib/pangea/widgets/chat/tts_controller.dart b/lib/pangea/widgets/chat/tts_controller.dart index ea28a66dd..2ced099c6 100644 --- a/lib/pangea/widgets/chat/tts_controller.dart +++ b/lib/pangea/widgets/chat/tts_controller.dart @@ -14,7 +14,6 @@ class TtsController { List availableLangCodes = []; final flutter_tts.FlutterTts tts = flutter_tts.FlutterTts(); - // if targetLanguage isn't set here, it needs to be set later TtsController() { setupTTS(); } @@ -26,8 +25,6 @@ class TtsController { debugger(when: kDebugMode && targetLanguage == null); - debugPrint('setupTTS targetLanguage: $targetLanguage'); - tts.setLanguage( targetLanguage ?? "en", ); @@ -38,16 +35,28 @@ class TtsController { debugPrint("voices: $voices"); availableLangCodes = (voices as List) .map((v) { +<<<<<<< Updated upstream // on iOS / web, the codes are in 'locale', but on Android, they are in 'name' final nameCode = v['name']?.split("-").first; final localeCode = v['locale']?.split("-").first; return nameCode.length == 2 ? nameCode : localeCode; +======= + debugPrint('v: $v'); + + //@ggurdin i changed this from name to locale + //in my testing, that's where the language code is stored + // maybe it's different for different devices? was it different in your android testing? + // return v['name']?.split("-").first; + return v['locale']?.split("-").first; +>>>>>>> Stashed changes }) .toSet() .cast() .toList(); - debugPrint("lang supported? $isLanguageFullySupported"); + debugPrint("availableLangCodes: $availableLangCodes"); + + debugger(when: kDebugMode && !isLanguageFullySupported); } catch (e, s) { debugger(when: kDebugMode); ErrorHandler.logError(e: e, s: s);