Compare commits

..

5 commits

Author SHA1 Message Date
Nikhil Nawgiri ea43984ec6 Make client reply with html formatted text 2024-08-27 16:50:46 +02:00
Nikhil Nawgiri e8c096108b Create helper for converting md to html 2024-08-27 16:50:14 +02:00
Nikhil Nawgiri 035dea3795 Add remarkable package 2024-08-27 16:47:06 +02:00
Nikhil Nawgiri ce13ed1e26 Add linting script to package.json 2024-08-27 16:45:23 +02:00
Nikhil Nawgiri 3ea5229fd6 Remove console.log 2024-08-25 04:20:11 +02:00
5 changed files with 61 additions and 4 deletions

View file

@ -7,12 +7,17 @@
"license": "MIT",
"type": "module",
"scripts": {
"start": "node --loader ts-node/esm src/main.ts"
"start": "node --loader ts-node/esm src/main.ts ",
"lint": "tslint src/*.ts"
},
"dependencies": {
"@types/node": "^22.5.0",
"matrix-bot-sdk": "^0.7.1",
"remarkable": "^2.0.1",
"ts-node": "^10.9.2",
"typescript": "^5.5.4"
},
"devDependencies": {
"@types/node": "^22.5.0",
"@types/remarkable": "^2.0.8"
}
}

View file

@ -7,6 +7,7 @@ import {
import { config } from "../config.ts";
import { callOpenAiAPI } from "./openai.js";
import { convertMarkdownToHtml } from "./markdownToHtmlHelper.ts";
const {
homeserverUrl,
@ -51,6 +52,8 @@ async function handleCommand(roomId: string, event: Event) {
bearer: openaiApiKey,
});
const htmlResponse = convertMarkdownToHtml(responseFromAi);
await client.setTyping(roomId, false);
await client.replyNotice(roomId, event, responseFromAi);
await client.sendHtmlText(roomId, htmlResponse);
}

View file

@ -0,0 +1,13 @@
import { Remarkable } from "remarkable";
const replaceNewlinesOutsideOfCodeBlocks = (html: string) => (
// Replace all \n with <br> inside the matched <p>...</p> block
html.replace(/(<p>[\s\S]*?)\n([\s\S]*?<\/p>)/g, (match) => (
match.replace(/\n(?!<\/p>)/g, '<br>')
))
);
export const convertMarkdownToHtml = (markdown: string) => {
const md = new Remarkable();
return replaceNewlinesOutsideOfCodeBlocks(md.render(markdown));
};

View file

@ -42,7 +42,6 @@ export const callOpenAiAPI = async ({ prompt, bearer, aiPersonality = "" }: { pr
},
body: JSON.stringify(data),
};
console.log("init:", init);
const response = await fetch(API_URL, init);
const body = await response.json().then(data => data.choices[0].message.content);

View file

@ -125,6 +125,11 @@
resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb"
integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==
"@types/remarkable@^2.0.8":
version "2.0.8"
resolved "https://registry.yarnpkg.com/@types/remarkable/-/remarkable-2.0.8.tgz#e18816db814cdc087e86b0446f6883754d666088"
integrity sha512-eKXqPZfpQl1kOADjdKchHrp2gwn9qMnGXhH/AtZe0UrklzhGJkawJo/Y/D0AlWcdWoWamFNIum8+/nkAISQVGg==
"@types/send@*":
version "0.17.4"
resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a"
@ -196,6 +201,13 @@ arg@^4.1.0:
resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089"
integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==
argparse@^1.0.10:
version "1.0.10"
resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
dependencies:
sprintf-js "~1.0.2"
array-flatten@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
@ -223,6 +235,13 @@ asynckit@^0.4.0:
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
autolinker@^3.11.0:
version "3.16.2"
resolved "https://registry.yarnpkg.com/autolinker/-/autolinker-3.16.2.tgz#6bb4f32432fc111b65659336863e653973bfbcc9"
integrity sha512-JiYl7j2Z19F9NdTmirENSUUIIL/9MytEWtmzhfmsKPCp9E+G35Y0UNCMoM9tFigxT59qSc8Ml2dlZXOCVTYwuA==
dependencies:
tslib "^2.3.0"
aws-sign2@~0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
@ -1064,6 +1083,14 @@ raw-body@2.5.2:
iconv-lite "0.4.24"
unpipe "1.0.0"
remarkable@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/remarkable/-/remarkable-2.0.1.tgz#280ae6627384dfb13d98ee3995627ca550a12f31"
integrity sha512-YJyMcOH5lrR+kZdmB0aJJ4+93bEojRZ1HGDn9Eagu6ibg7aVZhc3OWbbShRid+Q5eAfsEqWxpe+g5W5nYNfNiA==
dependencies:
argparse "^1.0.10"
autolinker "^3.11.0"
request-promise-core@1.1.4:
version "1.1.4"
resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f"
@ -1202,6 +1229,11 @@ source-map-js@^1.2.0:
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af"
integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==
sprintf-js@~1.0.2:
version "1.0.3"
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==
sshpk@^1.7.0:
version "1.18.0"
resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.18.0.tgz#1663e55cddf4d688b86a46b77f0d5fe363aba028"
@ -1273,6 +1305,11 @@ ts-node@^10.9.2:
v8-compile-cache-lib "^3.0.1"
yn "3.1.1"
tslib@^2.3.0:
version "2.7.0"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01"
integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==
tunnel-agent@^0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"