feat(plugin): WebRichPresence (arRPC) (#223)

This commit is contained in:
CanadaHonk 2022-11-20 13:31:00 +00:00 committed by GitHub
parent 82911386db
commit e85d763f22
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 78 additions and 0 deletions

74
src/plugins/arRPC.tsx Normal file

@ -0,0 +1,74 @@
/*
* Vencord, a modification for Discord's desktop app
* Copyright (c) 2022 OpenAsar
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import { popNotice,showNotice } from "../api/Notices";
import { Link } from "../components/Link";
import { Devs } from "../utils/constants";
import definePlugin from "../utils/types";
import { FluxDispatcher, Forms, Toasts } from "../webpack/common";
let ws: WebSocket;
export default definePlugin({
name: "WebRichPresence (arRPC)",
description: "Client plugin for arRPC to enable RPC on Discord Web (experimental)",
authors: [Devs.Ducko],
target: "WEB",
settingsAboutComponent: () => (
<>
<Forms.FormTitle tag="h3">How to use arRPC</Forms.FormTitle>
<Forms.FormText>
<Link href="https://github.com/OpenAsar/arrpc/tree/main#server">Follow the instructions in the GitHub repo</Link> to get the server running, and then enable the plugin.
</Forms.FormText>
</>
),
async start() {
if (ws) ws.close();
ws = new WebSocket("ws://127.0.0.1:1337"); // try to open WebSocket
ws.onmessage = e => { // on message, set status to data
const data = JSON.parse(e.data);
FluxDispatcher.dispatch({ type: "LOCAL_ACTIVITY_UPDATE", ...data });
};
const connectionSuccessful = await new Promise(res => setTimeout(() => res(ws.readyState === WebSocket.OPEN), 1000)); // check if open after 1s
if (!connectionSuccessful) {
showNotice("Failed to connect to arRPC, is it running?", "Retry", () => { // show notice about failure to connect, with retry/ignore
popNotice();
this.start();
});
return;
}
Toasts.show({ // show toast on success
message: "Connected to arRPC",
type: Toasts.Type.SUCCESS,
id: Toasts.genId(),
options: {
duration: 1000,
position: Toasts.Position.BOTTOM
}
});
},
stop() {
FluxDispatcher.dispatch({ type: "LOCAL_ACTIVITY_UPDATE", activity: null }); // clear status
ws.close(); // close WebSocket
}
});

@ -144,5 +144,9 @@ export const Devs = Object.freeze({
dzshn: { dzshn: {
name: "dzshn", name: "dzshn",
id: 310449948011528192n id: 310449948011528192n
},
Ducko: {
name: "Ducko",
id: 506482395269169153n
} }
}); });