Skip to content

Commit

Permalink
support chat room connection token (#5)
Browse files Browse the repository at this point in the history
  • Loading branch information
flowbehappy authored Jul 26, 2023
1 parent de7d2ad commit 609d9d9
Show file tree
Hide file tree
Showing 11 changed files with 399 additions and 329 deletions.
10 changes: 5 additions & 5 deletions lib/components/chat.dart
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ class _ChatWindowState extends State<ChatWindow> {

final MessageController messageController = Get.find();
final ChatRoomController chatRoomController = Get.find();
var chatRoomUuid = chatRoomController.currentChatRoomUuid.value;
final room = chatRoomController.getCurrentRoom();
var first_letters =
message.substring(0, min(3, message.length)).toLowerCase();
var ask_ai = first_letters == "@ai";
Expand All @@ -150,7 +150,7 @@ class _ChatWindowState extends State<ChatWindow> {
source: MessageSource.user,
ask_ai: ask_ai,
);
messageController.addMessage(chatRoomUuid, newMessage, ai_question);
messageController.addMessage(room, newMessage, ai_question);
_formKey.currentState!.reset();
}

Expand Down Expand Up @@ -261,7 +261,7 @@ class _ChatWindowState extends State<ChatWindow> {
var polling = false;
_timer = Timer.periodic(
const Duration(seconds: 3),
(Timer timer) {
(Timer timer) {
if (polling) {
return;
}
Expand All @@ -275,8 +275,8 @@ class _ChatWindowState extends State<ChatWindow> {

void _loadMessagesRemote() async {
final ChatRoomController chatRoomController = Get.find();
var chatRoomUuid = chatRoomController.currentChatRoomUuid.value;
final room = chatRoomController.getCurrentRoom();
final MessageController messageController = Get.find();
messageController.upsertRemoteMessages(chatRoomUuid);
messageController.upsertRemoteMessages(room);
}
}
19 changes: 11 additions & 8 deletions lib/components/chat_room.dart
Original file line number Diff line number Diff line change
Expand Up @@ -58,10 +58,10 @@ class _ChatRoomState extends State<ChatRoom> {
final comp.ChatRoomController chatRoomController = Get.find();
chatRoomController.setCurrentRoom(index);
if (index >= 0) {
String roomUuid = chatRoomController.roomList[index].uuid;
chatRoomController.currentChatRoomUuid(roomUuid);
final room = chatRoomController.getCurrentRoom();
chatRoomController.currentChatRoomUuid(room.uuid);
MessageController controllerMessage = Get.find();
controllerMessage.loadAllMessages(roomUuid);
controllerMessage.loadAllMessages(room);
}
}
}
Expand Down Expand Up @@ -219,10 +219,12 @@ class NewChatButton extends StatelessWidget {
const uuid = Uuid();
var createTime = DateTime.now().toUtc();
repo.ChatRoom chatRoom = repo.ChatRoom(
uuid: uuid.v1(),
name: "New Chat Room",
createTime: createTime,
connectionToken: "");
uuid: uuid.v1(),
name: "New Chat Room",
createTime: createTime,
connectionToken: repo.ChatRoomRepository.myTiDBConn.toToken(),
role: repo.Role.host,
);
chatRoomController.addChatRoom(chatRoom);
FirebaseAnalytics.instance.logEvent(name: "chat_room_add");

Expand Down Expand Up @@ -323,8 +325,9 @@ class _ChatDetailButtonState extends State<ChatDetailButton>
final comp.ChatRoomController chatRoomController = Get.find();
final MessageController messageController = Get.find();
messageController.messageList.value = [];
final room = chatRoomController.getCurrentRoom();
chatRoomController.setCurrentRoom(-1);
chatRoomController.deleteChatRoom();
chatRoomController.deleteChatRoom(room);
FirebaseAnalytics.instance.logEvent(name: "chat_room_delete");
}

Expand Down
5 changes: 3 additions & 2 deletions lib/components/setting.dart
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,8 @@ class _SettingPageState extends State<SettingPage> {
children: [
const Text("AGI"),
Tooltip(
message: "Artificial General Intelligence",
message:
"Artificial General Intelligence.\nYou can use @ai to talk to the AI service in any chat room.",
child: IconButton(
iconSize: 10.0,
splashRadius: 10,
Expand Down Expand Up @@ -256,7 +257,7 @@ class _SettingPageState extends State<SettingPage> {
const Text("TiDB Serverless"),
Tooltip(
message:
"TiDB Serverless is an online database service which can be accessed from any where. Get it for free: www.tidbcloud.com",
"TiDB Serverless is an online database service.\nMoyubie can store your chat messages on TiDB Serverless, so that you can access them from anywhere with any devices.\nTiDB Serverless is also required for group chat.",
child: IconButton(
iconSize: 10.0,
splashRadius: 10,
Expand Down
8 changes: 6 additions & 2 deletions lib/controller/chat_room.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@ class ChatRoomController extends GetxController {
super.onInit();
}

ChatRoom getCurrentRoom() {
return roomList[currentRoomIndex.value.value];
}

void setCurrentRoom(int index) async {
currentRoomIndex.value = IntegerWrapper(index);
if (index > 0) {
Expand All @@ -22,8 +26,8 @@ class ChatRoomController extends GetxController {
update();
}

void deleteChatRoom() async {
await ChatRoomRepository().deleteChatRoom(currentChatRoomUuid.value);
void deleteChatRoom(ChatRoom room) async {
await ChatRoomRepository().deleteChatRoom(room);
roomList.value = await ChatRoomRepository().getChatRooms();
update();
}
Expand Down
28 changes: 15 additions & 13 deletions lib/controller/message.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,20 @@ class MessageController extends GetxController {
final messageList = <Message>[].obs;
final uuid = const Uuid();

void loadAllMessages(String chatRoomUuid) async {
final msgList = await ChatRoomRepository().getMessagesByChatRoomUUid(chatRoomUuid);
void loadAllMessages(ChatRoom room) async {
final msgList = await ChatRoomRepository().getMessagesByChatRoomUUid(room);
messageList.value = msgList;
final messageListRemote = await ChatRoomRepository().getNewMessagesByChatRoomUuidRemote(
chatRoomUuid, msgList.lastOrNull?.createTime);
final messageListRemote = await ChatRoomRepository()
.getNewMessagesByChatRoomUuidRemote(
room, msgList.lastOrNull?.createTime);
messageList.value = [...msgList, ...messageListRemote];
update();
}

void upsertRemoteMessages(String roomUuid) async {
void upsertRemoteMessages(ChatRoom room) async {
final lastMsgTime = messageList.lastOrNull?.createTime;
final newMessages = await ChatRoomRepository().getNewMessagesByChatRoomUuidRemote(roomUuid, lastMsgTime);
final newMessages = await ChatRoomRepository()
.getNewMessagesByChatRoomUuidRemote(room, lastMsgTime);
bool needUpdate = false;
for (var item in newMessages) {
if (messageList.where((m) => m.uuid == item.uuid).isEmpty) {
Expand All @@ -35,13 +37,13 @@ class MessageController extends GetxController {
}
}

void addMessage(
String chatRoomUuid, Message input, String ai_question) async {
void addMessage(ChatRoom room, Message input, String ai_question) async {
// Add user intput to message list
await ChatRoomRepository().addMessage(chatRoomUuid, input);
await ChatRoomRepository().addMessage(room, input);

final messages =
await ChatRoomRepository().getMessagesByChatRoomUUid(chatRoomUuid);
final chatRoomUuid = room.uuid;

final messages = await ChatRoomRepository().getMessagesByChatRoomUUid(room);
if (!input.ask_ai) {
messageList.value = messages;
return;
Expand All @@ -65,9 +67,9 @@ class MessageController extends GetxController {
}, //
(Message res) async {
// if streaming is done ,load all the message
ChatRoomRepository().addMessage(chatRoomUuid, res);
ChatRoomRepository().addMessage(room, res);
final messages =
await ChatRoomRepository().getMessagesByChatRoomUUid(chatRoomUuid);
await ChatRoomRepository().getMessagesByChatRoomUUid(room);
messageList.value = messages;
completer.complete();
});
Expand Down
72 changes: 7 additions & 65 deletions lib/controller/settings.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:moyubie/repository/chat_room.dart';
import 'package:moyubie/utils/package.dart';
import 'package:moyubie/utils/tidb.dart';
import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';

Expand Down Expand Up @@ -63,28 +64,6 @@ class SettingsController extends GetxController {
version.value = await getAppVersion();
}

// void setGlmBaseUrl(String baseUrl) {
// glmBaseUrl.value = baseUrl;
// GetStorage _box = GetStorage();
// _box.write('glmBaseUrl', baseUrl);
// }

// getGlmBaseUrlFromPreferences() async {
// GetStorage _box = GetStorage();
// String baseUrl = _box.read('glmBaseUrl') ?? "https://api.openai-proxy.com";
// setGlmBaseUrl(baseUrl);
// }

Future<String?> validateTiDB() async {
var crr = ChatRoomRepository();
var conn = await crr.getRemoteDb(forceInit: true);
if (conn == null) {
return "Cannot connect to remote database with ${crr.remoteDBToString()}, ";
}

return null;
}

Future<String?> validateLLM() async {
if (llm.value == "OpenAI") {
if (openAiKey.value.length <= 10) {
Expand Down Expand Up @@ -141,26 +120,25 @@ class SettingsController extends GetxController {
}

var res = updateTiDBCmdToRepo(serverlessCmd.value);
res ??= await validateTiDB();
res ??= await ChatRoomRepository.myTiDBConn.validateRemoteDB();

String popMsg;
switch (res) {
case null:
{
ChatRoomRepository().setRemoteDBValid(true);
popMsg = "OK";
break;
}
case "Empty":
{
ChatRoomRepository().setRemoteDBValid(false);
ChatRoomRepository.myTiDBConn.clearConnect();
popMsg =
"Warn: Chat messages are only saved to local if you don't specify TiDB Serverless connectin.";
break;
}
default:
{
ChatRoomRepository().setRemoteDBValid(false);
ChatRoomRepository.myTiDBConn.clearConnect();
popMsg = "Connect to TiDB Serverless failed:\n$res.";
}
}
Expand All @@ -186,46 +164,10 @@ class SettingsController extends GetxController {
String? updateTiDBCmdToRepo(String cmd) {
if (cmd.isEmpty) return "Empty";

cmd = cmd.replaceFirst(" -p", " -p ");
final options = cmd.split(" ");
var nextOpts = List.from(options);
nextOpts.removeAt(0);
nextOpts.add("");
String user = "";
String host = "";
int port = 0;
String password = "";

try {
for (int i = 0; i < options.length; i += 1) {
final opt = options[i];
final nextOpt = nextOpts[i];
switch (opt) {
case "-u":
case "--user":
user = nextOpt.replaceAll("'", "");
user = user.replaceAll('"', "");
user = user.replaceAll("'", "");
break;
case "-h":
case "--host":
host = nextOpt;
break;
case "-P":
case "--port":
port = int.parse(nextOpt);
break;
case "-p":
case "--password":
password = nextOpt;
break;
default:
}
}
} catch (e) {
return e.toString();
var (host, port, user, password) = parseTiDBConnectionText(cmd);
if (port == 0) {
return user;
}

ChatRoomRepository().updateRemoteDBConfig(host, port, user, password);

if (user.isEmpty || host.isEmpty || port == 0 || password.isEmpty) {
Expand Down
95 changes: 0 additions & 95 deletions lib/data/glm.dart

This file was deleted.

Loading

0 comments on commit 609d9d9

Please sign in to comment.