// maunium-stickerpicker - A fast and simple Matrix sticker picker widget. // Copyright (C) 2020 Tulir Asokan // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero 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 Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . const urlParams = new URLSearchParams(window.location.search); const widgetId = urlParams.get('widgetId'); // if you know the widget ID, supply it. console.log("Widget ID:"+widgetId); const api = new mxwidgets.WidgetApi(widgetId, '*'); // Before doing anything else, request capabilities: api.requestCapabilities(mxwidgets.StickerpickerCapabilities); api.requestCapability(mxwidgets.MatrixCapabilities.MSC4039UploadFile); api.on("ready", () => {console.log("ready event received")}); // Start the messaging api.start(); // If waitForIframeLoad is false, tell the client that we're good to go //api.sendContentLoaded(); export function sendSticker(content){ const data = { content: {...content}, name: content.body, }; // do the same thing that tulir does delete data.content.id; // send data api.sendSticker(data); } export function sendGIF(content){ // just print out content, should be URL console.log("Content:"+content.url); return new Promise((resolve, reject) => { const xhr = new XMLHttpRequest(); xhr.open('GET', content.url, true); xhr.onreadystatechange = function() { if (xhr.readyState === 4) { if (xhr.status === 200) { const responseData = xhr.responseText; // Call uploadFile with response data api.uploadFile(responseData) .then(result => { console.log("Here's the result:"+result.content_uri); // mess around with the content object, then send it as sticker content.url = result.content_uri; sendSticker(content); resolve(result); }) .catch(error => { reject(error); }); } else { reject(new Error('Failed to fetch data')); // Reject the outer promise if fetching data fails } } }; xhr.send(); }); } /* *let widgetId = null * *window.onmessage = event => { * if (!window.parent || !event.data) { * return * } * * const request = event.data * if (!request.requestId || !request.widgetId || !request.action || request.api !== "toWidget") { * return * } * * if (widgetId) { * if (widgetId !== request.widgetId) { * return * } * } else { * widgetId = request.widgetId * } * * let response * * if (request.action === "visibility") { * response = {} * } else if (request.action === "capabilities") { * response = { capabilities: ["m.sticker", "org.matrix.msc4039.upload_file"] } * } else { * response = { error: { message: "Action not supported" } } * } * * window.parent.postMessage({ ...request, response }, event.origin) *} * *export function sendSticker(content) { * const data = { * content: { ...content }, * // `name` is for Element Web (and also the spec) * // Element Android uses content -> body as the name * name: content.body, * } * // Custom field that stores the ID even for non-telegram stickers * delete data.content.id * * // This is for Element iOS * const widgetData = { * ...data, * description: content.body, * file: `${content.id}.png`, * } * // Element iOS explodes if there are extra fields present * delete widgetData.content["net.maunium.telegram.sticker"] * * window.parent.postMessage({ * api: "fromWidget", * action: "m.sticker", * requestId: `sticker-${Date.now()}`, * widgetId, * data, * widgetData, * }, "*") *} * *export function sendGIF(content) { * const data = { * content: { ...content }, * name: content.body, * msgtype: "m.image" * } * * delete data.content.id * // This is for Element iOS * const widgetData = { * ...data, * description: content.body, * file: `${content.id}.png`, * } * * window.parent.postMessage({ * api: "fromWidget", * action: "m.room.message", * requestId: `gif-${Date.now()}`, * widgetId, * data, * widgetData, * }, "*") *} */