From 109b3d256018aa6291268c0607d8dc2d017ccad2 Mon Sep 17 00:00:00 2001 From: Cadence Ember Date: Thu, 29 Jun 2023 08:08:17 +1200 Subject: [PATCH] add appservice listener --- db/ooye.db | Bin 106496 -> 131072 bytes index.js | 7 ++++++- m2d/appservice.js | 8 ++++++++ m2d/event-dispatcher.js | 8 ++++++++ passthrough.js | 1 + 5 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 m2d/appservice.js create mode 100644 m2d/event-dispatcher.js diff --git a/db/ooye.db b/db/ooye.db index 5168a0f57405b2bfa3d220e31089a5c75bca3e6c..9c7d480b489cab00620de78d776874b511700f41 100644 GIT binary patch delta 22266 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 YYneHQn7QDl#}jL=dVJnZkL$qv4~bBlCIA2c delta 1447 zcmYLHeNYuu6yNjSeY^Yi;~t&}BJ%M>6U_x#Y;ZJ35R@buDyeC-KnJsg1VP2p(m==W z2Biz_P$NP)pbRSb!k00L7BWui1S()@keZ_Lp-g``idy$M)3h^Z_IJe4oLf{R z7o8IKj?)7LK?vq1af8yyGa#^W>DM?qM~DJ{fv&fG1%)=*c^&5I>CCS^Y&3M^eyL3= zmnYlK>rLSANP!wQyFHj?wHFbXCzw|K5X7>e4wLnUnQV2q$tnX)Rv2uuxg5{AXb}4n z!DKP@vFsb}2pwxO+ocRbwhFDRBFeCe20>)ymkggLi+yq=mOZ#sLP#IaDL5L-nlBr~ zv4KZUPcs~|I5JsCXC@JK?%LG3hlo`ixVrWbX*vfT$D&wAR~C^T@I#fyV9UD8h&;fP zM!JWIGmV4$S2Bqz35;3C4aWqIve@Axv7V-17XneUIYGV336HtEhxfAoY6j6V1@rT3 znM9A^(FER8*|id)-{x1R_aKU;|IP?qz(e?h!2)|?3BAe>uk`F8n8#Imd!h)RwaNT? zGYPhHFr&p__v%G9FWB%!V%X^xL((~VPL!DBPHn7ia(JXk4`&8(-+!Nt1C^WaZ?l5( z;XQ9rKI|l=4U@c4g>YH%3An@x0awxAXcD9OA&u3mM8^sjDF!xvO^EmVHb{1cDL$IB zK+t-XE!t-KwlY@jrf2kFJyhSW{NYJ1dLBIPm?^TSU?&qNy0jYt&evV~D(!~;Sg+JC z=m~TxT};2jwHQcu;zio$d2R1)xv}B0oyAoIvi@~J9>0CVw)c6R7_mdZU$9bY!(5z= zDsSu%{fNFq1NB?d1F=K@R-P=C>s$1N`grZW)}obY8JeMvs6VR}>I!v+Dk`1I0cDMn zDA^R3^SU(M+2H)tnI^sK43!7uW_g#qsIfX*WF0ke*2FCou;%VloQ&4o2b_PHv;# zfiwu>(sYWQ*5Wd}jY)VGYv>f*g*J?!t@LHuM|aaa&bCv2m-%27)If+gB@>!qRH)o4 uU@LCN1p1JkpzGyUD|#tJC<;*)sCMP7@)^(DEL$(;LHM(kcp)49iTf8qX36pZ diff --git a/index.js b/index.js index 807b49f..f4c59c6 100644 --- a/index.js +++ b/index.js @@ -9,13 +9,18 @@ const db = new sqlite("db/ooye.db") const sync = new HeatSync() -Object.assign(passthrough, { config, sync, db }) +Object.assign(passthrough, {config, sync, db}) const DiscordClient = require("./d2m/discord-client") const discord = new DiscordClient(config.discordToken) passthrough.discord = discord +const as = require("./m2d/appservice") +passthrough.as = as + +sync.require("./m2d/event-dispatcher") + ;(async () => { await discord.cloud.connect() console.log("Discord gateway started") diff --git a/m2d/appservice.js b/m2d/appservice.js new file mode 100644 index 0000000..e99a822 --- /dev/null +++ b/m2d/appservice.js @@ -0,0 +1,8 @@ +const reg = require("../matrix/read-registration") +const AppService = require("matrix-appservice").AppService +const as = new AppService({ + homeserverToken: reg.hs_token +}) +as.listen(+(new URL(reg.url).port)) + +module.exports = as diff --git a/m2d/event-dispatcher.js b/m2d/event-dispatcher.js new file mode 100644 index 0000000..136aae0 --- /dev/null +++ b/m2d/event-dispatcher.js @@ -0,0 +1,8 @@ +const assert = require("assert").strict +const {sync, as} = require("../passthrough") + +// Grab Matrix events we care about for the bridge, check them, and pass them on + +sync.addTemporaryListener(as, "type:m.room.message", event => { + console.log(event) +}) diff --git a/passthrough.js b/passthrough.js index 8ef75db..16de1bb 100644 --- a/passthrough.js +++ b/passthrough.js @@ -7,6 +7,7 @@ * @property {import("./d2m/discord-client")} discord * @property {import("heatsync")} sync * @property {import("better-sqlite3/lib/database")} db + * @property {import("matrix-appservice").AppService} as */ /** @type {Passthrough} */ // @ts-ignore