async function run() {
    try {
        await intent.setPowerLevel(options.roomid, options.userid, options.power);
        console.log("Power levels set");
        process.exit(0);
    } catch (err) {
        console.error("Could not apply power levels to room:", err);
        process.exit(1);
    }
}
Exemplo n.º 2
0
    /**
     * uploadContentFromUrl - Upload content from a given URL to the homeserver
     * and return a MXC URL.
     */
    public static async UploadContentFromUrl(url: string, intent: Intent, name: string | null): Promise<IUploadResult> {
        let contenttype;
        name = name || null;
        try {
            const bufferRet = (await (new Promise((resolve, reject) => {
                let ht;
                if (url.startsWith("https")) {
                    ht = https;
                } else {
                    ht = http;
                }
                const req = ht.get( url, (res) => {
                    let buffer = Buffer.alloc(0);

                    if (res.headers.hasOwnProperty("content-type")) {
                        contenttype = res.headers["content-type"];
                    } else {
                        log.verbose("No content-type given by server, guessing based on file name.");
                        contenttype = mime.lookup(url);
                    }

                    if (name === null) {
                        const names = url.split("/");
                        name = names[names.length - 1];
                    }

                    res.on("data", (d) => {
                        buffer = Buffer.concat([buffer, d]);
                    });

                    res.on("end", () => {
                        resolve(buffer);
                    });
                });
                req.on("error", (err) => {
                    reject(`Failed to download. ${err.code}`);
                });
            }))) as Buffer;
            const size = bufferRet.length;
            const contentUri = await intent.getClient().uploadContent(bufferRet, {
                name,
                onlyContentUri: true,
                rawResponse: false,
                type: contenttype,
            });
            log.verbose("Media uploaded to ", contentUri);
            return {
                mxcUrl: contentUri,
                size,
            };
        } catch (reason) {
            log.error("Failed to upload content:\n", reason);
            throw reason;
        }
    }
Exemplo n.º 3
0
 public static async GetMxidFromName(intent: Intent, name: string, channelMxids: string[]) {
     if (name[0] === "@" && name.includes(":")) {
         return name;
     }
     const client = intent.getClient();
     const matrixUsers = {};
     let matches = 0;
     await Promise.all(channelMxids.map((chan) => {
         // we would use this.bridge.getBot().getJoinedMembers()
         // but we also want to be able to search through banned members
         // so we gotta roll our own thing
         return client._http.authedRequestWithPrefix(
             undefined,
             "GET",
             `/rooms/${encodeURIComponent(chan)}/members`,
             undefined,
             undefined,
             "/_matrix/client/r0",
         ).then((res) => {
             res.chunk.forEach((member) => {
                 if (member.membership !== "join" && member.membership !== "ban") {
                     return;
                 }
                 const mxid = member.state_key;
                 if (mxid.startsWith("@_discord_")) {
                     return;
                 }
                 let displayName = member.content.displayname;
                 if (!displayName && member.unsigned && member.unsigned.prev_content &&
                     member.unsigned.prev_content.displayname) {
                     displayName = member.unsigned.prev_content.displayname;
                 }
                 if (!displayName) {
                     displayName = mxid.substring(1, mxid.indexOf(":"));
                 }
                 if (name.toLowerCase() === displayName.toLowerCase() || name === mxid) {
                     matrixUsers[mxid] = displayName;
                     matches++;
                 }
             });
         });
     }));
     if (matches === 0) {
         throw Error(`No users matching ${name} found`);
     }
     if (matches > 1) {
         let errStr = "Multiple matching users found:\n";
         for (const mxid of Object.keys(matrixUsers)) {
             errStr += `${matrixUsers[mxid]} (\`${mxid}\`)\n`;
         }
         throw Error(errStr);
     }
     return Object.keys(matrixUsers)[0];
 }