remove former version of editted messages from analytics

pull/1077/head
Gabby Gurdin 2 years ago
parent 8aa05a1016
commit 62a4ea785a

@ -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:fluffychat/pangea/utils/error_handler.dart';
import 'package:flutter/foundation.dart';
import 'package:matrix/matrix.dart';
import 'package:fluffychat/pangea/utils/error_handler.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…
Cancel
Save