Skip to content

Commit

Permalink
Optimize chatgpt plugin and result refresh implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
qianlifeng committed Dec 21, 2023
1 parent 91a18e8 commit 51e7501
Show file tree
Hide file tree
Showing 4 changed files with 147 additions and 47 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'dart:ui';

Expand Down Expand Up @@ -193,13 +192,14 @@ class WoxLauncherController extends GetxController implements WoxLauncherInterfa

if (query.queryType == WoxQueryTypeEnum.WOX_QUERY_TYPE_INPUT.code) {
// save the cursor position
final cursorPosition = queryBoxTextFieldController.selection.baseOffset;
var cursorPosition = queryBoxTextFieldController.selection.baseOffset;
queryBoxTextFieldController.text = query.queryText;

if (moveCursorToEnd) {
moveQueryBoxCursorToEnd();
} else {
// try to restore the cursor position after set text, which will reset the cursor position
cursorPosition = cursorPosition > queryBoxTextFieldController.text.length ? queryBoxTextFieldController.text.length : cursorPosition;
queryBoxTextFieldController.selection = TextSelection(baseOffset: cursorPosition, extentOffset: cursorPosition);
}
} else {
Expand Down Expand Up @@ -273,13 +273,7 @@ class WoxLauncherController extends GetxController implements WoxLauncherInterfa
filterResultActions.refresh();
}

void handleWebSocketMessage(event) {
var msg = WoxWebsocketMsg.fromJson(jsonDecode(event));
if (msg.success == false) {
Logger.instance.error("Received error message: ${msg.toJson()}");
return;
}

void handleWebSocketMessage(WoxWebsocketMsg msg) {
if (msg.method != "Query") {
Logger.instance.info("Received message: ${msg.method}");
}
Expand All @@ -304,9 +298,6 @@ class WoxLauncherController extends GetxController implements WoxLauncherInterfa
final theme = WoxTheme.fromJson(msg.data);
WoxThemeUtil.instance.changeTheme(theme);
woxTheme.value = theme;
} else if (msg.method == "Refresh") {
final result = WoxRefreshableResult.fromJson(msg.data);
onRefreshResult(result);
}
}

Expand Down Expand Up @@ -478,11 +469,23 @@ class WoxLauncherController extends GetxController implements WoxLauncherInterfa
}

startRefreshSchedule() {
Timer.periodic(const Duration(milliseconds: 100), (timer) {
var isRequesting = <String, bool>{};
Timer.periodic(const Duration(milliseconds: 100), (timer) async {
var isVisible = await windowManager.isVisible();
if (!isVisible) {
return;
}

refreshCounter = refreshCounter + 100;
for (var result in queryResults) {
if (result.refreshInterval > 0 && refreshCounter % result.refreshInterval == 0) {
var msg = WoxWebsocketMsg(
if (isRequesting.containsKey(result.id)) {
continue;
} else {
isRequesting[result.id] = true;
}

final msg = WoxWebsocketMsg(
id: const UuidV4().generate(),
type: WoxMsgTypeEnum.WOX_MSG_TYPE_REQUEST.code,
method: WoxMsgMethodEnum.WOX_MSG_METHOD_REFRESH.code,
Expand All @@ -498,27 +501,22 @@ class WoxLauncherController extends GetxController implements WoxLauncherInterfa
).toJson(),
},
);
WoxWebsocketMsgUtil.instance.sendMessage(msg);
WoxWebsocketMsgUtil.instance.sendMessage(msg).then((resp) {
final refreshResult = WoxRefreshableResult.fromJson(resp);
result.title.value = refreshResult.title;
result.subTitle.value = refreshResult.subTitle;
result.icon.value = refreshResult.icon;
result.preview = refreshResult.preview;
currentPreview.value = refreshResult.preview;
result.contextData = refreshResult.contextData;
result.refreshInterval = refreshResult.refreshInterval;
isRequesting.remove(result.id);
});
}
}
});
}

void onRefreshResult(WoxRefreshableResult result) {
for (var i = 0; i < queryResults.length; i++) {
if (queryResults[i].id == result.resultId) {
queryResults[i].title.value = result.title;
queryResults[i].subTitle.value = result.subTitle;
queryResults[i].icon.value = result.icon;
queryResults[i].preview = result.preview;
currentPreview.value = result.preview;
queryResults[i].contextData = result.contextData;
queryResults[i].refreshInterval = result.refreshInterval;
break;
}
}
}

@override
void dispose() {
queryBoxFocusNode.dispose();
Expand Down
31 changes: 29 additions & 2 deletions Wox.UI.Flutter/wox/lib/utils/wox_websocket_msg_util.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import 'dart:async';
import 'dart:convert';

import 'package:web_socket_channel/web_socket_channel.dart';
import 'package:wox/entity/wox_websocket_msg.dart';
import 'package:wox/enums/wox_msg_method_enum.dart';
import 'package:wox/utils/log.dart';

class WoxWebsocketMsgUtil {
Expand All @@ -19,14 +21,28 @@ class WoxWebsocketMsgUtil {

int connectionAttempts = 1;

final Map<String, Completer> _completers = {};

void _connect() {
_channel?.sink.close();
_channel = null;

_channel = WebSocketChannel.connect(uri);
_channel!.stream.listen(
(event) {
onMessageReceived(event);
var msg = WoxWebsocketMsg.fromJson(jsonDecode(event));
if (msg.success == false) {
Logger.instance.error("Received error message: ${msg.toJson()}");
return;
}

if (_completers.containsKey(msg.id)) {
_completers[msg.id]!.complete(msg);
_completers.remove(msg.id);
return;
}

onMessageReceived(msg);
},
onDone: () {
_reconnect();
Expand All @@ -50,7 +66,18 @@ class WoxWebsocketMsgUtil {
}

// send message to websocket server
void sendMessage(WoxWebsocketMsg msg) {
Future<dynamic> sendMessage(WoxWebsocketMsg msg) async {
// if query message, send it directly, no need to wait for response
// because query result may return multiple times
if (msg.method == WoxMsgMethodEnum.WOX_MSG_METHOD_QUERY.code) {
_channel?.sink.add(jsonEncode(msg));
return;
}

Completer completer = Completer();
_completers[msg.id] = completer;
_channel?.sink.add(jsonEncode(msg));
var responseMsg = await completer.future as WoxWebsocketMsg;
return responseMsg.data;
}
}
83 changes: 68 additions & 15 deletions Wox/plugin/system/chatgpt.go

Large diffs are not rendered by default.

22 changes: 22 additions & 0 deletions Wox/plugin/system/url.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package system
import (
"context"
"regexp"
"time"
"wox/plugin"
"wox/util"
)
Expand Down Expand Up @@ -51,6 +52,27 @@ func (r *UrlPlugin) Init(ctx context.Context, initParams plugin.InitParams) {

func (r *UrlPlugin) Query(ctx context.Context, query plugin.Query) (results []plugin.QueryResult) {
if len(r.reg.FindStringIndex(query.Search)) > 0 {
results = append(results, plugin.QueryResult{
Title: query.Search,
SubTitle: "Open the typed URL from Wox",
Score: 100,
Icon: urlIcon,
RefreshInterval: 100,
OnRefresh: func(result plugin.RefreshableResult) plugin.RefreshableResult {
time.Sleep(time.Second)
result.Title = util.GetSystemTimestampStr()
result.SubTitle = util.GetSystemTimestampStr()
return result
},
Actions: []plugin.QueryResultAction{
{
Name: "Open in browser",
Action: func(actionContext plugin.ActionContext) {
util.ShellOpen(query.Search)
},
},
},
})
results = append(results, plugin.QueryResult{
Title: query.Search,
SubTitle: "Open the typed URL from Wox",
Expand Down

0 comments on commit 51e7501

Please sign in to comment.