From a68ef5ba25c98134966ae8454fbf67afc2aca4af Mon Sep 17 00:00:00 2001 From: Linloir <3145078758@qq.com> Date: Sat, 22 Oct 2022 21:27:17 +0800 Subject: [PATCH] New Feature: - Add API ACKFETCH to acknowledge fetch message done --- lib/home/cubit/home_cubit.dart | 35 +++++++++++-------- lib/main.dart | 4 +-- .../tcp_repository/models/tcp_request.dart | 14 +++++++- 3 files changed, 35 insertions(+), 18 deletions(-) diff --git a/lib/home/cubit/home_cubit.dart b/lib/home/cubit/home_cubit.dart index 467dc2c..d697a8d 100644 --- a/lib/home/cubit/home_cubit.dart +++ b/lib/home/cubit/home_cubit.dart @@ -1,7 +1,7 @@ /* * @Author : Linloir * @Date : 2022-10-13 14:02:28 - * @LastEditTime : 2022-10-22 01:20:14 + * @LastEditTime : 2022-10-22 21:08:39 * @Description : */ @@ -44,17 +44,15 @@ class HomeCubit extends Cubit { tcpRepository.pushRequest(FetchMessageRequest( token: (await SharedPreferences.getInstance()).getInt('token') )); - await for(var response in tcpRepository.responseStreamBroadcast) { - if(response.type == TCPResponseType.fetchMessage) { - if(response.status == TCPResponseStatus.ok) { - // response as FetchMessageResponse; - // localServiceRepository.storeMessages(response.messages); - break; - } - } - } - }).then((_) { - emit(state.copyWith(status: HomePageStatus.done)); + // await for(var response in tcpRepository.responseStreamBroadcast) { + // if(response.type == TCPResponseType.fetchMessage) { + // if(response.status == TCPResponseStatus.ok) { + // // response as FetchMessageResponse; + // // localServiceRepository.storeMessages(response.messages); + // break; + // } + // } + // } }); } @@ -71,19 +69,26 @@ class HomeCubit extends Cubit { ); } - void _onTCPResponse(TCPResponse response) { + void _onTCPResponse(TCPResponse response) async { if(response.status == TCPResponseStatus.err) { return; } switch(response.type) { case TCPResponseType.forwardMessage: { response as ForwardMessageResponse; - localServiceRepository.storeMessages([response.message]); + await localServiceRepository.storeMessages([response.message]); break; } case TCPResponseType.fetchMessage: { response as FetchMessageResponse; - localServiceRepository.storeMessages(response.messages); + await localServiceRepository.storeMessages(response.messages); + emit(state.copyWith(status: HomePageStatus.done)); + if(response.messages.isNotEmpty) { + tcpRepository.pushRequest(AckFetchRequest( + timeStamp: response.messages[0].timeStamp, + token: (await SharedPreferences.getInstance()).getInt('token') + )); + } break; } default: { diff --git a/lib/main.dart b/lib/main.dart index bc9b026..fbaee2f 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,7 +1,7 @@ /* * @Author : Linloir * @Date : 2022-10-10 08:04:53 - * @LastEditTime : 2022-10-21 22:49:14 + * @LastEditTime : 2022-10-22 20:43:39 * @Description : */ import 'package:flutter/gestures.dart'; @@ -49,7 +49,7 @@ class SplashPage extends StatelessWidget { return BlocProvider( create: (context) { return InitializationCubit( - serverAddress: 'chat.linloir.cn', + serverAddress: '192.168.43.155', serverPort: 20706 ); }, diff --git a/lib/repositories/tcp_repository/models/tcp_request.dart b/lib/repositories/tcp_repository/models/tcp_request.dart index 77274be..c6bd13e 100644 --- a/lib/repositories/tcp_repository/models/tcp_request.dart +++ b/lib/repositories/tcp_repository/models/tcp_request.dart @@ -1,7 +1,7 @@ /* * @Author : Linloir * @Date : 2022-10-11 09:44:03 - * @LastEditTime : 2022-10-18 14:45:20 + * @LastEditTime : 2022-10-22 21:01:35 * @Description : Abstract TCP request class */ @@ -24,6 +24,7 @@ enum TCPRequestType { modifyProfile ('MODIFYPROFILE'), //Modify user profile sendMessage ('SENDMSG'), //Send message fetchMessage ('FETCHMSG'), //Fetch message + ackFetch ('ACKFETCH'), //Acknowledge message fetch findFile ('FINDFILE'), //Find file by md5 before transmitting the file fetchFile ('FETCHFILE'), //Fetch file and file md5 by message md5 searchUser ('SEARCHUSR'), //Search username and userid by username @@ -243,4 +244,15 @@ class FetchContactRequest extends TCPRequest { @override Map get body => {}; +} + +class AckFetchRequest extends TCPRequest { + final int _timeStamp; + + const AckFetchRequest({required int timeStamp, required int? token}): _timeStamp = timeStamp, super(type: TCPRequestType.ackFetch, token: token); + + @override + Map get body => { + 'timestamp': _timeStamp + }; } \ No newline at end of file