remove former version of editted messages from analytics
This commit is contained in:
parent
8aa05a1016
commit
62a4ea785a
9 changed files with 129 additions and 23 deletions
|
|
@ -3952,5 +3952,6 @@
|
|||
"joinToView": "Join this room to view details",
|
||||
"refresh": "Refresh",
|
||||
"autoPlayTitle": "Auto Play Messages",
|
||||
"autoPlayDesc": "When enabled, the text-to-speech audio of messages will play automatically when selected."
|
||||
"autoPlayDesc": "When enabled, the text-to-speech audio of messages will play automatically when selected.",
|
||||
"messageAnalytics": "Message Analytics"
|
||||
}
|
||||
|
|
@ -628,6 +628,7 @@ class ChatController extends State<ChatPageWithRoom>
|
|||
useType: useType ?? UseType.un,
|
||||
time: DateTime.now(),
|
||||
),
|
||||
isEdit: previousEdit != null,
|
||||
);
|
||||
|
||||
if (choreo != null &&
|
||||
|
|
@ -641,6 +642,7 @@ class ChatController extends State<ChatPageWithRoom>
|
|||
...choreo.toGrammarConstructUse(msgEventId, room.id),
|
||||
],
|
||||
originalSent!.langCode,
|
||||
isEdit: previousEdit != null,
|
||||
);
|
||||
}
|
||||
},
|
||||
|
|
|
|||
|
|
@ -24,8 +24,9 @@ class MyAnalyticsController {
|
|||
//PTODO - locally cache and update periodically
|
||||
Future<void> handleMessage(
|
||||
Room room,
|
||||
RecentMessageRecord messageRecord,
|
||||
) async {
|
||||
RecentMessageRecord messageRecord, {
|
||||
bool isEdit = false,
|
||||
}) async {
|
||||
try {
|
||||
debugPrint("in handle message with type ${messageRecord.useType}");
|
||||
if (_userId == null) {
|
||||
|
|
@ -48,7 +49,7 @@ class MyAnalyticsController {
|
|||
|
||||
for (final event in events) {
|
||||
if (event != null) {
|
||||
event.handleNewMessage(messageRecord);
|
||||
event.handleNewMessage(messageRecord, isEdit: isEdit);
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
|
|
@ -76,8 +77,9 @@ class MyAnalyticsController {
|
|||
|
||||
Future<void> saveConstructsMixed(
|
||||
List<OneConstructUse> allUses,
|
||||
String langCode,
|
||||
) async {
|
||||
String langCode, {
|
||||
bool isEdit = false,
|
||||
}) async {
|
||||
try {
|
||||
final Map<String, List<OneConstructUse>> aggregatedVocabUse = {};
|
||||
for (final use in allUses) {
|
||||
|
|
@ -96,6 +98,7 @@ class MyAnalyticsController {
|
|||
uses.key,
|
||||
uses.value.first.constructType!,
|
||||
uses.value,
|
||||
isEdit: isEdit,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -212,4 +212,31 @@ extension PangeaClient on Client {
|
|||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
Future<List<String>> getEditHistory(
|
||||
String roomId,
|
||||
String eventId,
|
||||
) async {
|
||||
final Room? room = getRoomById(roomId);
|
||||
final Event? editEvent = await room?.getEventById(eventId);
|
||||
final String? edittedEventId =
|
||||
editEvent?.content.tryGetMap('m.relates_to')?['event_id'];
|
||||
if (edittedEventId == null) return [];
|
||||
|
||||
final Event? originalEvent = await room!.getEventById(edittedEventId);
|
||||
if (originalEvent == null) return [];
|
||||
|
||||
final Timeline timeline = await room.getTimeline();
|
||||
final List<Event> editEvents = originalEvent
|
||||
.aggregatedEvents(
|
||||
timeline,
|
||||
RelationshipTypes.edit,
|
||||
)
|
||||
.sorted(
|
||||
(a, b) => b.originServerTs.compareTo(a.originServerTs),
|
||||
)
|
||||
.toList();
|
||||
editEvents.add(originalEvent);
|
||||
return editEvents.slice(1).map((e) => e.eventId).toList();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -692,16 +692,39 @@ extension PangeaRoom on Room {
|
|||
}
|
||||
}
|
||||
|
||||
Future<List<OneConstructUse>> removeEdittedLemmas(
|
||||
List<OneConstructUse> lemmaUses,
|
||||
) async {
|
||||
final List<String> removeUses = [];
|
||||
for (final use in lemmaUses) {
|
||||
if (use.msgId == null) continue;
|
||||
final List<String> removeIds = await client.getEditHistory(
|
||||
use.chatId,
|
||||
use.msgId!,
|
||||
);
|
||||
removeUses.addAll(removeIds);
|
||||
}
|
||||
lemmaUses.removeWhere((use) => removeUses.contains(use.msgId));
|
||||
final allEvents = await allConstructEvents;
|
||||
for (final constructEvent in allEvents) {
|
||||
await constructEvent.removeEdittedUses(removeUses, client);
|
||||
}
|
||||
return lemmaUses;
|
||||
}
|
||||
|
||||
Future<void> saveConstructUsesSameLemma(
|
||||
String lemma,
|
||||
ConstructType type,
|
||||
List<OneConstructUse> lemmaUses,
|
||||
) async {
|
||||
List<OneConstructUse> lemmaUses, {
|
||||
bool isEdit = false,
|
||||
}) async {
|
||||
final ConstructEvent? localEvent = _vocabEventLocal(lemma);
|
||||
|
||||
if (isEdit) {
|
||||
lemmaUses = await removeEdittedLemmas(lemmaUses);
|
||||
}
|
||||
|
||||
if (localEvent == null) {
|
||||
final json =
|
||||
ConstructUses(lemma: lemma, type: type, uses: lemmaUses).toJson();
|
||||
await client.setRoomStateWithKey(
|
||||
id,
|
||||
PangeaEventTypes.vocab,
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import 'package:fluffychat/pangea/models/constructs_analytics_model.dart';
|
||||
import 'package:matrix/matrix.dart';
|
||||
|
||||
import 'package:fluffychat/pangea/models/constructs_analytics_model.dart';
|
||||
import '../constants/pangea_event_types.dart';
|
||||
|
||||
class ConstructEvent {
|
||||
|
|
@ -30,4 +30,23 @@ class ConstructEvent {
|
|||
content.uses.addAll(uses);
|
||||
event.content = content.toJson();
|
||||
}
|
||||
|
||||
Future<void> removeEdittedUses(
|
||||
List<String> removeIds,
|
||||
Client client,
|
||||
) async {
|
||||
_contentCache ??= ConstructUses.fromJson(event.content);
|
||||
final previousLength = _contentCache!.uses.length;
|
||||
_contentCache!.uses.removeWhere(
|
||||
(element) => removeIds.contains(element.msgId),
|
||||
);
|
||||
if (previousLength > _contentCache!.uses.length) {
|
||||
await client.setRoomStateWithKey(
|
||||
_event.room.id,
|
||||
_event.type,
|
||||
_event.stateKey!,
|
||||
_contentCache!.toJson(),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,12 +1,12 @@
|
|||
import 'dart:developer';
|
||||
|
||||
import 'package:flutter/foundation.dart';
|
||||
|
||||
import 'package:matrix/matrix.dart';
|
||||
|
||||
import 'package:fluffychat/pangea/constants/class_default_values.dart';
|
||||
import 'package:fluffychat/pangea/extensions/client_extension.dart';
|
||||
import 'package:fluffychat/pangea/models/student_analytics_summary_model.dart';
|
||||
import 'package:fluffychat/pangea/utils/error_handler.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:matrix/matrix.dart';
|
||||
|
||||
import '../constants/pangea_event_types.dart';
|
||||
import 'chart_analytics_model.dart';
|
||||
|
||||
|
|
@ -41,8 +41,27 @@ class StudentAnalyticsEvent {
|
|||
return _contentCache!;
|
||||
}
|
||||
|
||||
Future<void> handleNewMessage(RecentMessageRecord message) async {
|
||||
debugPrint("handle new message");
|
||||
Future<void> removeEdittedMessages(
|
||||
RecentMessageRecord message,
|
||||
) async {
|
||||
final List<String> removeIds = await classRoom.client.getEditHistory(
|
||||
message.chatId,
|
||||
message.eventId,
|
||||
);
|
||||
if (removeIds.isEmpty) return;
|
||||
_messagesToSave.removeWhere(
|
||||
(msg) => removeIds.any((e) => e == msg.eventId),
|
||||
);
|
||||
content.removeEdittedMessages(
|
||||
classRoom.client,
|
||||
removeIds,
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> handleNewMessage(
|
||||
RecentMessageRecord message, {
|
||||
isEdit = false,
|
||||
}) async {
|
||||
if (classRoom.client.userID != _event.stateKey) {
|
||||
debugger(when: kDebugMode);
|
||||
ErrorHandler.logError(
|
||||
|
|
@ -50,6 +69,10 @@ class StudentAnalyticsEvent {
|
|||
);
|
||||
return;
|
||||
}
|
||||
|
||||
if (isEdit) {
|
||||
await removeEdittedMessages(message);
|
||||
}
|
||||
_addMessage(message);
|
||||
|
||||
if (DateTime.now().difference(content.lastUpdated).inMinutes >
|
||||
|
|
@ -66,6 +89,10 @@ class StudentAnalyticsEvent {
|
|||
);
|
||||
return;
|
||||
}
|
||||
for (final message in messages) {
|
||||
await removeEdittedMessages(message);
|
||||
}
|
||||
|
||||
_messagesToSave.addAll(messages);
|
||||
_updateStudentAnalytics();
|
||||
}
|
||||
|
|
@ -75,6 +102,7 @@ class StudentAnalyticsEvent {
|
|||
content.addAll(_messagesToSave);
|
||||
debugPrint("updating student analytics");
|
||||
_clearMessages();
|
||||
|
||||
await classRoom.client.setRoomStateWithKey(
|
||||
classRoom.id,
|
||||
_event.type,
|
||||
|
|
|
|||
|
|
@ -1,8 +1,9 @@
|
|||
import 'dart:convert';
|
||||
|
||||
import 'package:flutter/foundation.dart';
|
||||
|
||||
import 'package:fluffychat/pangea/utils/error_handler.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:matrix/matrix.dart';
|
||||
|
||||
import '../enum/use_type.dart';
|
||||
|
||||
class RecentMessageRecord {
|
||||
|
|
@ -78,6 +79,12 @@ class StudentAnalyticsSummary {
|
|||
}
|
||||
}
|
||||
|
||||
void removeEdittedMessages(Client client, List<String> removeEventIds) {
|
||||
_messages.removeWhere(
|
||||
(element) => removeEventIds.contains(element.eventId),
|
||||
);
|
||||
}
|
||||
|
||||
List<RecentMessageRecord> get messages => _messages;
|
||||
|
||||
static const _messagesKey = "msgs";
|
||||
|
|
|
|||
|
|
@ -49,10 +49,6 @@ class StudentAnalyticsController extends State<StudentAnalyticsPage> {
|
|||
}
|
||||
|
||||
Future<void> initialize() async {
|
||||
await _pangeaController.matrixState.client
|
||||
.updateMyLearningAnalyticsForAllClassesImIn(
|
||||
_pangeaController.pStoreService,
|
||||
);
|
||||
await getClassAndChatAnalytics(context);
|
||||
stateSub = _pangeaController.matrixState.client.onRoomState.stream
|
||||
.where(
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue