From a303d7072a36a4d09b8814656e010c626c6e6646 Mon Sep 17 00:00:00 2001 From: linghaihui <75124771@qq.com> Date: Mon, 27 Mar 2023 21:38:52 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=B0=8F=E7=A8=8B=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bingchat/app.js | 22 +-- bingchat/app.json | 2 +- bingchat/components/chatbox/index.js | 66 +++++---- bingchat/components/chatbox/index.wxml | 3 +- bingchat/config.js | 4 +- bingchat/pages/index/index.js | 183 +++++++++++++++---------- bingchat/pages/index/index.wxml | 6 +- 7 files changed, 162 insertions(+), 124 deletions(-) diff --git a/bingchat/app.js b/bingchat/app.js index 626c5ca..d22b08d 100644 --- a/bingchat/app.js +++ b/bingchat/app.js @@ -1,19 +1,19 @@ import { doRequest -} from "./config"; +} from "./config" App({ onShow: function () {}, onLaunch: function () { this.getSid(sid => { console.log(sid) - }); + }) }, globalData: {}, getSid: function (callback) { - var that = this; + var that = this if (!this.globalData.sid) { - var sid = wx.getStorageSync("sid1"); + var sid = wx.getStorageSync("sid1") if (!sid) { wx.login({ success: (res) => { @@ -23,24 +23,24 @@ App({ if (data.statusCode != 200) { console.log(data) callback("") - return; + return } - that.globalData.sid = data.data.data.openid; - wx.setStorageSync("sid1", that.globalData.sid); + that.globalData.sid = data.data.data.openid + wx.setStorageSync("sid1", that.globalData.sid) callback(data.data.data.openid) }).catch(err => { console.log(err) callback("") }) }, - }); + }) } else { - this.globalData.sid = sid; - wx.setStorageSync("sid1", this.globalData.sid); + this.globalData.sid = sid + wx.setStorageSync("sid1", this.globalData.sid) callback(sid) } } else { callback(this.globalData.sid) } }, -}); +}) diff --git a/bingchat/app.json b/bingchat/app.json index ba22b1d..5236657 100644 --- a/bingchat/app.json +++ b/bingchat/app.json @@ -14,7 +14,7 @@ "sitemapLocation": "sitemap.json", "networkTimeout": { "request": 900000, - "connectSocket": 900000 + "connectSocket": 120000 }, "resizable": true, "lazyCodeLoading": "requiredComponents" diff --git a/bingchat/components/chatbox/index.js b/bingchat/components/chatbox/index.js index ff10afb..670ee02 100644 --- a/bingchat/components/chatbox/index.js +++ b/bingchat/components/chatbox/index.js @@ -1,4 +1,4 @@ -const app = getApp(); +const app = getApp() Component({ options: { @@ -8,21 +8,21 @@ Component({ properties: {}, pageLifetimes: { show: function () { - this.initMessageHistory(); + this.initMessageHistory() }, }, lifetimes: { attached() { - var that = this; - app.globalData.cht = that; - //that.initMessageHistory(); + var that = this + app.globalData.cht = that + //that.initMessageHistory() wx.getSystemInfo({ success: function (res) { that.setData({ systemInfo: res, - }); + }) }, - }); + }) }, detached() { try {} catch (error) {} @@ -30,62 +30,68 @@ Component({ }, data: { chatList: [], + receiveData: false, }, methods: { initMessageHistory() { - var that = this; - var data = wx.getStorageSync("chatList"); - data = data ? data : []; + var that = this + var data = wx.getStorageSync("chatList") + data = data ? data : [] data.forEach((v) => { if (v["suggests"] === undefined) { - v["suggests"] = []; + v["suggests"] = [] } - }); + }) if (data.length > 0) { that.setData({ chatList: data, - }); + }) } }, clearChat: function (e) { - var that = this; - var index = e.currentTarget.dataset.index; - var data = this.data.chatList; + var that = this + var index = e.currentTarget.dataset.index + var data = this.data.chatList wx.showModal({ content: "是否删除该条聊天?", complete: (res) => { if (res.confirm) { - data.splice(index, 1); + data.splice(index, 1) that.setData({ chatList: data, - }); + }) wx.setStorage({ key: "chatList", data: data, - }); + }) } }, - }); + }) }, copyContent: function (e) { - var index = e.currentTarget.dataset.index; - var content = this.data.chatList[index].originContent; + var index = e.currentTarget.dataset.index + var content = this.data.chatList[index].originContent wx.setClipboardData({ data: content, success: function () { wx.showToast({ title: "复制成功", - }); + }) }, - }); + }) }, suggestSubmit: function (e) { - var suggest = e.currentTarget.dataset.suggest; + var suggest = e.currentTarget.dataset.suggest this.triggerEvent( "suggestSubmit", { suggest, }, {} - ); + ) + }, + cancelReceive: function () { + this.triggerEvent( + "cancelReceive", {}, {} + ) }, deletAllChat: function (e) { var that = this @@ -95,14 +101,14 @@ Component({ if (res.confirm) { that.setData({ chatList: [], - }); + }) wx.setStorage({ key: "chatList", data: [], - }); + }) } }, - }); + }) } }, -}); +}) diff --git a/bingchat/components/chatbox/index.wxml b/bingchat/components/chatbox/index.wxml index 0812f53..fda3bfc 100644 --- a/bingchat/components/chatbox/index.wxml +++ b/bingchat/components/chatbox/index.wxml @@ -9,7 +9,7 @@ {{item.dt}}{{item.num_in_conversation}} - {{suggest}} + {{suggest}} @@ -22,4 +22,5 @@ + \ No newline at end of file diff --git a/bingchat/config.js b/bingchat/config.js index 85c1ae4..cd12fe5 100644 --- a/bingchat/config.js +++ b/bingchat/config.js @@ -1,5 +1,5 @@ -const SERVER_HOST = "https://example.com"; -const SERVER_WSS_HOST = "wss://example.com"; +const SERVER_HOST = "https://example.com" +const SERVER_WSS_HOST = "wss://example.com" function doRequest(url, method = "GET", data = {}) { return new Promise((resolve, reject) => { diff --git a/bingchat/pages/index/index.js b/bingchat/pages/index/index.js index 192c51e..bebfe32 100644 --- a/bingchat/pages/index/index.js +++ b/bingchat/pages/index/index.js @@ -1,19 +1,17 @@ import { doRequest, SERVER_WSS_HOST -} from "../../config"; +} from "../../config" const systemInfo = wx.getSystemInfoSync() +// 各平台对话分离 +const sid_prefix = systemInfo.platform == "ios" || systemInfo.platform == "android" ? "" : systemInfo.platform +const initHeight = inputPop() ? 20 : 5 function inputPop() { return systemInfo.platform == "ios" || systemInfo.platform == "android" } -// 各平台对话分离 -var sid_prefix = systemInfo.platform == "ios" || systemInfo.platform == "android" ? "" : systemInfo.platform - -const initHeight = inputPop() ? 20 : 5 - Date.prototype.format = function (fmt) { var o = { "M+": this.getMonth() + 1, //月份 @@ -23,35 +21,35 @@ Date.prototype.format = function (fmt) { "s+": this.getSeconds(), //秒 "q+": Math.floor((this.getMonth() + 3) / 3), //季度 S: this.getMilliseconds(), //毫秒 - }; + } if (/(y+)/.test(fmt)) { fmt = fmt.replace( RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length) - ); + ) } for (var k in o) { if (new RegExp("(" + k + ")").test(fmt)) { fmt = fmt.replace( RegExp.$1, RegExp.$1.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length) - ); + ) } } - return fmt; -}; - -function getNow() { - return new Date().format("yyyy-MM-dd hh:mm:ss"); + return fmt } -const app = getApp(); -const robAvatar = "../../image/bing-avatar.png"; -const personAvatar = "../../image/person.jpeg"; +function getNow() { + return new Date().format("yyyy-MM-dd hh:mm:ss") +} + +const app = getApp() +const robAvatar = "../../image/bing-avatar.png" +const personAvatar = "../../image/person.jpeg" Page({ data: { - InputBottom: initHeight, + inputBottom: initHeight, content: "", lastContent: "", systemInfo: systemInfo, @@ -62,21 +60,21 @@ Page({ isOpen: false, }, }, - InputFocus(e) { + inputFocus(e) { if (inputPop()) { this.setData({ - InputBottom: e.detail.height, - }); + inputBottom: e.detail.height, + }) } }, - InputBlur(e) { + inputBlur(e) { this.setData({ - InputBottom: initHeight, + inputBottom: initHeight, textareaFocus: false, - }); + }) }, processContent(content) { - return content.replace(/\\n/g, "\n").replace(/\[\^\d+\^\]/g, ""); + return content.replace(/\\n/g, "\n").replace(/\[\^\d+\^\]/g, "") }, resetConversation: function (callback) { app.getSid(sid => { @@ -90,38 +88,38 @@ Page({ }) }, onShow() { - const cht = app.globalData.cht; + const cht = app.globalData.cht if (cht.data.chatList.length > 1) { cht.setData({ scrollId: "item" + (cht.data.chatList.length - 2), - }); + }) } }, onLoad() {}, processData: function (data, suggests, content) { - var robContent = data["data"]["status"]; + var robContent = data["data"]["status"] if (robContent == "Success") { - robContent = data["data"]["text"]; - suggests.push(...data["data"]["suggests"]); + robContent = data["data"]["text"] + suggests.push(...data["data"]["suggests"]) if (robContent.indexOf("New topic") != -1) { - robContent += "\n\n发送“重新对话!”开始新的对话"; - suggests.push("重新对话!"); - suggests.push(content); + robContent += "\n\n发送“重新对话!”开始新的对话" + suggests.push("重新对话!") + suggests.push(content) } } else { if (robContent == "Throttled") { - robContent = "这真是愉快,但你已达到每日限制。是否明天再聊?"; - suggests.push("重新对话!"); - suggests.push(content); + robContent = "这真是愉快,但你已达到每日限制。是否明天再聊?" + suggests.push("重新对话!") + suggests.push(content) } else { - var msg = data["data"]["message"]; + var msg = data["data"]["message"] if (msg.indexOf("has expired") != -1) { - this.resetConversation(); - robContent = "本轮对话已过期,请重新开始。"; - suggests.push(content); + this.resetConversation() + robContent = "本轮对话已过期,请重新开始。" + suggests.push(content) } else { - robContent = "抱歉😭,发生错误:" + msg + ",请重试"; - suggests.push(content); + robContent = "抱歉😭,发生错误:" + msg + suggests.push(content) } } } @@ -139,7 +137,7 @@ Page({ }, sendHttpRequest: function (content) { var that = this - const cht = app.globalData.cht; + const cht = app.globalData.cht app.getSid(sid => { doRequest("/chat", "POST", { q: content, @@ -151,17 +149,17 @@ Page({ var num_in_conversation = -1 if (res.statusCode != 200) { robContent = - "抱歉😭,网络异常,请稍后重试 [" + res.statusCode + "]"; - suggests.push(content); + "抱歉😭,网络异常,请稍后重试 [" + res.statusCode + "]" + suggests.push(content) } else { robContent = that.processData(res.data, suggests, content) - num_in_conversation = res.data["data"]["num_in_conversation"]; + num_in_conversation = res.data["data"]["num_in_conversation"] } that.pushStorageMessage(cht, robContent, "rob", suggests, false, true, num_in_conversation) } catch (error) { wx.showToast({ title: "fatal error", - }); + }) that.pushStorageMessage(cht, "发生致命错误😱", "rob", [], false, true) } }).catch(e => { @@ -181,36 +179,30 @@ Page({ searching: true }) } - var that = this; - const cht = app.globalData.cht; + var that = this + const cht = app.globalData.cht that.pushStorageMessage(cht, content, "man", [], false) that.setData({ content: "", lastContent: content, - }); + }) if (content == "重新对话!") { that.resetConversation(() => { that.pushStorageMessage(cht, "现在我们可以开始新的对话😊", "rob", [], false) - }); - return; + }) + return } else { that.pushStorageMessage(cht, "搜索中🔍...", "rob", [], true) } - return that.sendWSRequest(content) - // 经测试,mac 平台下打开debug才能触发websocket的onOpen回调。。。 - if (systemInfo.platform == "mac") { - if (systemInfo.enableDebug) { - that.sendWSRequest(content) - } else { - that.sendHttpRequest(content) - } - } else { + if (systemInfo.platform != "windows") { that.sendWSRequest(content) + } else { + that.sendHttpRequest(content) } }, pushStorageMessage: function (cht, content, role, suggests, blink, pop, num_in_conversation = -1, final = true) { if (pop) { - cht.data.chatList.pop(); + cht.data.chatList.pop() } cht.data.chatList.push({ type: role, @@ -220,10 +212,10 @@ Page({ suggests: suggests, blink: blink, num_in_conversation: num_in_conversation, - }); + }) cht.setData({ chatList: cht.data.chatList, - }); + }) if (role == "rob" && !blink && final) { this.setData({ searching: false @@ -232,29 +224,29 @@ Page({ wx.setStorage({ key: "chatList", data: cht.data.chatList, - }); + }) setTimeout(() => { cht.setData({ scrollId: "item" + (cht.data.chatList.length - 1), - }); - }, 50); + }) + }, 50) }, submit() { - var content = this.data.content; + var content = this.data.content if (content.length == 0 || content.trim().length == 0) { - return; + return } - this.submitContent(content); + this.submitContent(content) }, onShareAppMessage() { return { title: "New Bing Bot 🤖", path: "/pages/index/index", - }; + } }, onSuggestSubmit: function (e) { - var suggest = e.detail.suggest; - this.submitContent(suggest); + var suggest = e.detail.suggest + this.submitContent(suggest) }, focus: function (e) { this.setData({ @@ -266,6 +258,7 @@ Page({ return } var that = this + const cht = app.globalData.cht const socket = wx.connectSocket({ url: SERVER_WSS_HOST + "/chat", fail: function () { @@ -299,6 +292,9 @@ Page({ }, searching: false, }) + cht.setData({ + receiveData: false + }) }) socket.onError(msg => { console.log('Socket onError', msg) @@ -310,20 +306,29 @@ Page({ searching: false }) wx.showToast({ - title: '网络错误', + title: msg.errMsg, + }) + cht.setData({ + receiveData: false }) }) socket.onMessage(data => { - const cht = app.globalData.cht; + const cht = app.globalData.cht var data = JSON.parse(data.data) var suggests = [] var robContent = '' var num_in_conversation = -1 if (!data['final']) { robContent = data['data'] + ' ...' + cht.setData({ + receiveData: true + }) } else { robContent = that.processData(data['data'], suggests, that.data.lastContent) num_in_conversation = data['data']['data']['num_in_conversation'] + cht.setData({ + receiveData: false + }) } that.pushStorageMessage(cht, robContent, "rob", suggests, false, true, num_in_conversation, data['final']) }) @@ -360,5 +365,31 @@ Page({ reason: "Page Unload" }) } + }, + inputData: function (e) { + var that = this + var value = e.detail.value + that.setData({ + content: value + }) + // 特定用户在桌面版本下触发提交,因为textarea在桌面版下回车是换行,并且无法监听快捷键输入,只能出此下策 + if (systemInfo.platform != 'windows' && systemInfo.platform != 'mac') { + return + } + if (value.indexOf("》》》\n") != -1 || value.indexOf(">>>\n") != -1) { + that.setData({ + content: value.replace("》》》\n", "").replace(">>>\n", ""), + }, () => { + that.submit() + }) + } + }, + onCancelReceive: function (e) { + if (this.data.socket.isOpen) { + this.data.socket.socket.close({ + code: 1000, + reason: "User cancel" + }) + } } -}); +}) diff --git a/bingchat/pages/index/index.wxml b/bingchat/pages/index/index.wxml index c686cac..6fe304e 100644 --- a/bingchat/pages/index/index.wxml +++ b/bingchat/pages/index/index.wxml @@ -1,5 +1,5 @@ - - - + + + 发送 \ No newline at end of file