2024-11-11 19:28:44 +08:00

479 lines
16 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'dart:io';
import 'package:dio/dio.dart';
import 'package:dio/io.dart';
import 'package:example/const.dart';
import 'package:wukongimfluttersdk/entity/channel.dart';
import 'package:wukongimfluttersdk/entity/conversation.dart';
import 'package:wukongimfluttersdk/entity/msg.dart';
import 'package:wukongimfluttersdk/type/const.dart';
import 'package:wukongimfluttersdk/wkim.dart';
class HttpUtils {
// static String apiURL = "https://api.githubim.com";
static String apiURL = "http://62.234.8.38:7090/v1";
// static String apiURL = "http://175.27.245.108:15001";
static getAvatarUrl(String uid) {
return "$apiURL/users/$uid/avatar";
}
static getGroupAvatarUrl(String gid) {
return "$apiURL/groups/$gid/avatar";
}
static Future<int> login(String uid, String token) async {
final httpClient = HttpClient();
httpClient.badCertificateCallback =
(X509Certificate cert, String host, int port) {
// 信任所有证书
return true;
};
final dio = Dio();
dio.httpClientAdapter = DefaultHttpClientAdapter()
..onHttpClientCreate = (client) {
return httpClient;
};
final response = await dio.post("$apiURL/user/login", data: {
'uid': uid,
'token': token,
'device_flag': 0,
'device_level': 1
});
return response.statusCode!;
}
static Future<String> getIP(String uid) async {
final httpClient = HttpClient();
httpClient.badCertificateCallback =
(X509Certificate cert, String host, int port) {
// 信任所有证书
return true;
};
final dio = Dio();
dio.httpClientAdapter = DefaultHttpClientAdapter()
..onHttpClientCreate = (client) {
return httpClient;
};
String ip = '';
final response = await dio.get('$apiURL/users/$uid/route');
if (response.statusCode == HttpStatus.ok) {
ip = response.data['tcp_addr'];
}
return ip;
}
static syncConversation(String lastSsgSeqs, int msgCount, int version,
Function(WKSyncConversation) back) async {
final httpClient = HttpClient();
httpClient.badCertificateCallback =
(X509Certificate cert, String host, int port) {
// 信任所有证书
return true;
};
final dio = Dio();
dio.httpClientAdapter = DefaultHttpClientAdapter()
..onHttpClientCreate = (client) {
return httpClient;
};
final response = await dio.post('$apiURL/conversation/sync', data: {
"login_uid": UserInfo.uid, // 当前登录用户uid
"version": version, // 当前客户端的会话最大版本号(从保存的结果里取最大的version如果本地没有数据则传0)
"last_msg_seqs":
lastSsgSeqs, // 客户端所有频道会话的最后一条消息序列号拼接出来的同步串 格式: channelID:channelType:last_msg_seq|channelID:channelType:last_msg_seq (此字段非必填,如果不填就获取全量数据,填写了获取增量数据,看你自己的需求。)
"msg_count": 10, // 每个会话获取最大的消息数量一般为app点进去第一屏的数据
"device_uuid": UserInfo.uid,
});
// print(response.data);
WKSyncConversation conversation = WKSyncConversation();
conversation.conversations = [];
if (response.statusCode == HttpStatus.ok) {
try {
var list = response.data['conversations'];
// var list = jsonDecode(response.data);
for (int i = 0; i < list.length; i++) {
var json = list[i];
WKSyncConvMsg convMsg = WKSyncConvMsg();
convMsg.channelID = json['channel_id'];
convMsg.channelType = json['channel_type'];
convMsg.unread = json['unread'] ?? 0;
convMsg.timestamp = json['timestamp'];
convMsg.lastMsgSeq = json['last_msg_seq'];
convMsg.lastClientMsgNO = json['last_client_msg_no'];
convMsg.version = json['version'];
var msgListJson = json['recents'] as List<dynamic>;
List<WKSyncMsg> msgList = [];
if (msgListJson.isNotEmpty) {
for (int j = 0; j < msgListJson.length; j++) {
var msgJson = msgListJson[j];
msgList.add(getWKSyncMsg(msgJson));
}
}
convMsg.recents = msgList;
conversation.conversations!.add(convMsg);
}
} catch (e) {
print('同步最近会话错误');
}
}
back(conversation);
}
static syncChannelMsg(
String channelID,
int channelType,
int startMsgSeq,
int endMsgSeq,
int limit,
int pullMode,
Function(WKSyncChannelMsg) back) async {
final httpClient = HttpClient();
httpClient.badCertificateCallback =
(X509Certificate cert, String host, int port) {
// 信任所有证书
return true;
};
final dio = Dio();
dio.httpClientAdapter = DefaultHttpClientAdapter()
..onHttpClientCreate = (client) {
return httpClient;
};
final response = await dio.post('$apiURL/message/channel/sync', data: {
"login_uid": UserInfo.uid, // 当前登录用户uid
"channel_id": channelID, // 频道ID
"channel_type": channelType, // 频道类型
"start_message_seq": startMsgSeq, // 开始消息列号结果包含start_message_seq的消息
"end_message_seq": endMsgSeq, // 结束消息列号结果不包含end_message_seq的消息
"limit": limit, // 消息数量限制
"pull_mode": pullMode // 拉取模式 0:向下拉取 1:向上拉取
});
if (response.statusCode == HttpStatus.ok) {
var data = response.data;
WKSyncChannelMsg msg = WKSyncChannelMsg();
msg.startMessageSeq = data['start_message_seq'];
msg.endMessageSeq = data['end_message_seq'];
msg.more = data['more'];
var messages = data['messages'];
List<WKSyncMsg> msgList = [];
for (int i = 0; i < messages.length; i++) {
dynamic json = messages[i];
msgList.add(getWKSyncMsg(json));
}
print('同步channel消息数量${msgList.length}');
msg.messages = msgList;
back(msg);
}
}
static WKSyncMsg getWKSyncMsg(dynamic json) {
WKSyncMsg msg = WKSyncMsg();
msg.channelID = json['channel_id'];
msg.messageID = json['message_id'].toString();
msg.channelType = json['channel_type'];
msg.clientMsgNO = json['client_msg_no'];
msg.messageSeq = json['message_seq'];
msg.fromUID = json['from_uid'];
msg.isDeleted = json['is_deleted'];
msg.timestamp = json['timestamp'];
// msg.payload = json['payload'];
// String payload = json['payload'];
try {
msg.payload = json['payload'];
// msg.payload = jsonDecode(utf8.decode(base64Decode(payload)));
} catch (e) {
// print('异常了');
}
// 解析扩展
var extraJson = json['message_extra'];
if (extraJson != null) {
var extra = getMsgExtra(extraJson);
msg.messageExtra = extra;
}
return msg;
}
static WKSyncExtraMsg getMsgExtra(dynamic extraJson) {
var extra = WKSyncExtraMsg();
extra.messageID = extraJson['message_id'];
extra.messageIdStr = extraJson['message_id_str'];
extra.revoke = extraJson['revoke'] ?? 0;
extra.revoker = extraJson['revoker'] ?? '';
extra.readed = extraJson['readed'] ?? 0;
extra.readedCount = extraJson['readed_count'] ?? 0;
extra.isMutualDeleted = extraJson['is_mutual_deleted'] ?? 0;
return extra;
}
static getGroupInfo(String groupId) async {
final httpClient = HttpClient();
httpClient.badCertificateCallback =
(X509Certificate cert, String host, int port) {
// 信任所有证书
return true;
};
final dio = Dio();
dio.httpClientAdapter = DefaultHttpClientAdapter()
..onHttpClientCreate = (client) {
return httpClient;
};
final response = await dio.get('$apiURL/groups/$groupId');
if (response.statusCode == HttpStatus.ok) {
var json = response.data;
var channel = WKChannel(groupId, WKChannelType.group);
channel.channelName = json['name'];
channel.avatar = json['avatar'];
WKIM.shared.channelManager.addOrUpdateChannel(channel);
} else {
print('获取群信息失败');
}
}
static getUserInfo(String uid) async {
final httpClient = HttpClient();
httpClient.badCertificateCallback =
(X509Certificate cert, String host, int port) {
// 信任所有证书
return true;
};
final dio = Dio();
dio.httpClientAdapter = DefaultHttpClientAdapter()
..onHttpClientCreate = (client) {
return httpClient;
};
try {
final response = await dio.get('$apiURL/users/$uid');
if (response.statusCode == HttpStatus.ok) {
var json = response.data;
var channel = WKChannel(uid, WKChannelType.personal);
channel.channelName = json['name'];
channel.avatar = json['avatar'];
WKIM.shared.channelManager.addOrUpdateChannel(channel);
}
} catch (e) {
print('获取用户信息失败$e');
}
}
static revokeMsg(String clientMsgNo, String channelId, int channelType,
int msgSeq, String msgId) async {
final httpClient = HttpClient();
httpClient.badCertificateCallback =
(X509Certificate cert, String host, int port) {
// 信任所有证书
return true;
};
final dio = Dio();
dio.httpClientAdapter = DefaultHttpClientAdapter()
..onHttpClientCreate = (client) {
return httpClient;
};
try {
final response = await dio.post('$apiURL/message/revoke', data: {
'login_uid': UserInfo.uid,
'channel_id': channelId,
'channel_type': channelType,
'client_msg_no': clientMsgNo,
'message_id': msgId,
});
if (response.statusCode == HttpStatus.ok) {
print('撤回消息成功');
}
} catch (e) {
print('获取用户信息失败$e');
}
}
static deleteMsg(String clientMsgNo, String channelId, int channelType,
int msgSeq, String msgId) async {
final httpClient = HttpClient();
httpClient.badCertificateCallback =
(X509Certificate cert, String host, int port) {
// 信任所有证书
return true;
};
final dio = Dio();
dio.httpClientAdapter = DefaultHttpClientAdapter()
..onHttpClientCreate = (client) {
return httpClient;
};
try {
final response = await dio.delete('$apiURL/message', data: {
'login_uid': UserInfo.uid,
'channel_id': channelId,
'channel_type': channelType,
'message_seq': msgSeq,
'message_id': msgId,
});
if (response.statusCode == HttpStatus.ok) {
WKIM.shared.messageManager.deleteWithClientMsgNo(clientMsgNo);
}
} catch (e) {
print('删除消息失败$e');
}
}
static syncMsgExtra(String channelId, int channelType, int version) async {
final httpClient = HttpClient();
httpClient.badCertificateCallback =
(X509Certificate cert, String host, int port) {
// 信任所有证书
return true;
};
final dio = Dio();
dio.httpClientAdapter = DefaultHttpClientAdapter()
..onHttpClientCreate = (client) {
return httpClient;
};
try {
final response = await dio.post('$apiURL/message/extra/sync', data: {
'login_uid': UserInfo.uid,
'channel_id': channelId,
'channel_type': channelType,
'source': UserInfo.uid,
'limit': 100,
'extra_version': version,
});
if (response.statusCode == HttpStatus.ok) {
var arrJson = response.data;
if (arrJson != null && arrJson.length > 0) {
List<WKMsgExtra> list = [];
for (int i = 0; i < arrJson.length; i++) {
var extraJson = arrJson[i];
WKMsgExtra extra = WKMsgExtra();
extra.messageID = extraJson['message_id_str'];
extra.revoke = extraJson['revoke'] ?? 0;
extra.revoker = extraJson['revoker'] ?? '';
extra.readed = extraJson['readed'] ?? 0;
extra.readedCount = extraJson['readed_count'] ?? 0;
extra.isMutualDeleted = extraJson['is_mutual_deleted'] ?? 0;
list.add(extra);
}
WKIM.shared.messageManager.saveRemoteExtraMsg(list);
}
}
} catch (e) {
print('同步消息扩展失败$e');
}
}
// 清空红点
static clearUnread(String channelId, int channelType) async {
final httpClient = HttpClient();
httpClient.badCertificateCallback =
(X509Certificate cert, String host, int port) {
// 信任所有证书
return true;
};
final dio = Dio();
dio.httpClientAdapter = DefaultHttpClientAdapter()
..onHttpClientCreate = (client) {
return httpClient;
};
try {
final response = await dio.put('$apiURL/conversation/clearUnread', data: {
'login_uid': UserInfo.uid,
'channel_id': channelId,
'channel_type': channelType,
'unread': 0,
});
if (response.statusCode == HttpStatus.ok) {
print('清空红点成功');
}
} catch (e) {
print('清空红点失败$e');
}
}
// 清除频道消息
static clearChannelMsg(String channelId, int channelType) async {
final httpClient = HttpClient();
httpClient.badCertificateCallback =
(X509Certificate cert, String host, int port) {
// 信任所有证书
return true;
};
final dio = Dio();
dio.httpClientAdapter = DefaultHttpClientAdapter()
..onHttpClientCreate = (client) {
return httpClient;
};
try {
int maxSeq = await WKIM.shared.messageManager
.getMaxMessageSeq(channelId, channelType);
final response = await dio.post('$apiURL/message/offset', data: {
'login_uid': UserInfo.uid,
'channel_id': channelId,
'channel_type': channelType,
'message_seq': maxSeq
});
if (response.statusCode == HttpStatus.ok) {
WKIM.shared.messageManager.clearWithChannel(channelId, channelType);
}
} catch (e) {
print('清除频道消息失败$e');
}
}
// 创建群
static Future<bool> createGroup(String groupNo) async {
final httpClient = HttpClient();
httpClient.badCertificateCallback =
(X509Certificate cert, String host, int port) {
// 信任所有证书
return true;
};
final dio = Dio();
dio.httpClientAdapter = DefaultHttpClientAdapter()
..onHttpClientCreate = (client) {
return httpClient;
};
try {
final response = await dio.post('$apiURL/group/create', data: {
'login_uid': UserInfo.uid,
'group_no': groupNo,
});
if (response.statusCode == HttpStatus.ok) {
return true;
} else {
return false;
}
} catch (e) {
print('创建群失败$e');
return false;
}
}
// 修改群名称
static Future<bool> updateGroupName(String groupNo, String groupName) async {
final httpClient = HttpClient();
httpClient.badCertificateCallback =
(X509Certificate cert, String host, int port) {
// 信任所有证书
return true;
};
final dio = Dio();
dio.httpClientAdapter = DefaultHttpClientAdapter()
..onHttpClientCreate = (client) {
return httpClient;
};
try {
final response = await dio.put('$apiURL/groups/$groupNo', data: {
'login_uid': UserInfo.uid,
'name': groupName,
});
if (response.statusCode == HttpStatus.ok) {
return true;
} else {
return false;
}
} catch (e) {
print('修改群名称失败$e');
return false;
}
}
}