dont give old clients new activity types and catch old activity content better
This commit is contained in:
parent
c62753d9d1
commit
bc20769daa
7 changed files with 66 additions and 97 deletions
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
);
|
||||
|
||||
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!);
|
||||
|
||||
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()}');
|
||||
|
||||
_sendAndPackageEvent(res.activity!, event);
|
||||
_cache[cacheKey] =
|
||||
_RequestCacheItem(req: req, practiceActivityEvent: 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,
|
||||
),
|
||||
final MessageActivityResponse res = await _fetch(
|
||||
accessToken: _pangeaController.userController.accessToken,
|
||||
requestModel: req,
|
||||
);
|
||||
|
||||
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!);
|
||||
|
||||
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()}');
|
||||
|
||||
_sendAndPackageEvent(res.activity!, event);
|
||||
_cache[cacheKey] =
|
||||
_RequestCacheItem(req: req, practiceActivity: res.activity!);
|
||||
|
||||
return _cache[cacheKey]!.practiceActivity;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<PracticeActivityEvent> practiceActivitiesByLangCode(
|
||||
String langCode, {
|
||||
bool debug = false,
|
||||
}) {
|
||||
try {
|
||||
debugger(when: debug);
|
||||
final List<PracticeActivityEvent> 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<PracticeActivityEvent> get practiceActivities =>
|
||||
|
|
|
|||
|
|
@ -41,7 +41,6 @@ class PracticeActivityEvent {
|
|||
return _content!;
|
||||
} catch (e, s) {
|
||||
final contentMap = event.content;
|
||||
debugger(when: kDebugMode);
|
||||
rethrow;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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(),
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -14,7 +14,6 @@ class TtsController {
|
|||
List<String> 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<String>()
|
||||
.toList();
|
||||
|
||||
debugPrint("lang supported? $isLanguageFullySupported");
|
||||
debugPrint("availableLangCodes: $availableLangCodes");
|
||||
|
||||
debugger(when: kDebugMode && !isLanguageFullySupported);
|
||||
} catch (e, s) {
|
||||
debugger(when: kDebugMode);
|
||||
ErrorHandler.logError(e: e, s: s);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue