From 3acab885d9f204925e8c3a4a0ccf26b4184cb198 Mon Sep 17 00:00:00 2001 From: ggurdin <46800240+ggurdin@users.noreply.github.com> Date: Fri, 4 Apr 2025 13:47:14 -0400 Subject: [PATCH] feat: initial work to prevent giving points for copy-pasted text (#2345) * feat: initial work to prevent giving points for copy-pasted text * chore: replace tokenization with comparing token content with pasted content --- .../choreographer/controllers/choreographer.dart | 10 +++++----- lib/pangea/choreographer/models/choreo_record.dart | 4 ++-- .../choreographer/utils/input_paste_listener.dart | 14 +++++++++++--- .../models/representation_content_model.dart | 13 ++++++++++++- 4 files changed, 30 insertions(+), 11 deletions(-) diff --git a/lib/pangea/choreographer/controllers/choreographer.dart b/lib/pangea/choreographer/controllers/choreographer.dart index d52961316..37636a198 100644 --- a/lib/pangea/choreographer/controllers/choreographer.dart +++ b/lib/pangea/choreographer/controllers/choreographer.dart @@ -66,11 +66,7 @@ class Choreographer { _initialize() { tts = TtsController(chatController: chatController); _textController = PangeaTextController(choreographer: this); - InputPasteListener( - _textController, - // TODO, do something on paste - () => debugPrint("on paste"), - ); + InputPasteListener(_textController, onPaste); itController = ITController(this); igc = IgcController(this); errorService = ErrorService(this); @@ -571,6 +567,10 @@ class Choreographer { giveInputFocus(); } + Future onPaste(value) async { + choreoRecord.pastedStrings.add(value); + } + dispose() { _textController.dispose(); _trialStream?.cancel(); diff --git a/lib/pangea/choreographer/models/choreo_record.dart b/lib/pangea/choreographer/models/choreo_record.dart index 3d13d4450..b6af64479 100644 --- a/lib/pangea/choreographer/models/choreo_record.dart +++ b/lib/pangea/choreographer/models/choreo_record.dart @@ -16,10 +16,10 @@ class ChoreoRecord { /// there is not a 1-to-1 map from steps to matches List choreoSteps; - // String current; - List openMatches; + final Set pastedStrings = {}; + ChoreoRecord({ required this.choreoSteps, required this.openMatches, diff --git a/lib/pangea/choreographer/utils/input_paste_listener.dart b/lib/pangea/choreographer/utils/input_paste_listener.dart index 9195527a0..b50bf20e6 100644 --- a/lib/pangea/choreographer/utils/input_paste_listener.dart +++ b/lib/pangea/choreographer/utils/input_paste_listener.dart @@ -5,7 +5,7 @@ import 'package:fluffychat/pangea/choreographer/widgets/igc/pangea_text_controll class InputPasteListener { final PangeaTextController controller; - final VoidCallback onPaste; + final Function(String) onPaste; String _currentText = ''; @@ -14,10 +14,18 @@ class InputPasteListener { this.onPaste, ) { controller.addListener(() { - if (controller.editType != EditType.keyboard) return; final difference = controller.text.characters.length - _currentText.characters.length; - if (difference > 1) onPaste(); + if (difference > 1 && controller.editType == EditType.keyboard) { + onPaste( + controller.text.characters + .getRange( + _currentText.characters.length, + controller.text.characters.length, + ) + .join(), + ); + } _currentText = controller.text; }); } diff --git a/lib/pangea/events/models/representation_content_model.dart b/lib/pangea/events/models/representation_content_model.dart index 3f1843624..893dec42d 100644 --- a/lib/pangea/events/models/representation_content_model.dart +++ b/lib/pangea/events/models/representation_content_model.dart @@ -119,8 +119,19 @@ class PangeaRepresentation { ); // for each token, record whether selected in ga, ta, or wa - final tokensToSave = + List tokensToSave = tokens.where((token) => token.lemma.saveVocab).toList(); + if (choreo != null && choreo.pastedStrings.isNotEmpty) { + tokensToSave = tokensToSave + .where( + (token) => !choreo.pastedStrings.any( + (pasted) => pasted + .toLowerCase() + .contains(token.text.content.toLowerCase()), + ), + ) + .toList(); + } for (final token in tokensToSave) { uses.addAll( _getUsesForToken(