From 2b970c2083ef385820bbf164457efe829a5c91c2 Mon Sep 17 00:00:00 2001
From: octospacc https://maunium.net/stickers-demo/packs/pusheen02.json
.
The URL must be in the format "{optionally, http://
or https://
}{t.me
or telegram.me
}/addstickers/
{name of the pack}".
@@ -190,6 +185,11 @@ TODO:
[2024-01-09]
+[2024-01-08]
${content}
`; } $`#LayoutDebugLog`.innerHTML += `[${type}] [${new Date().toISOString().split('.').slice(0, -1).join('.')}] ${content}\n`; } @@ -281,6 +281,11 @@ TODO: : query) : document); + const LogFetch = (url, options) => { + Logger(`Trying to fetch ${url}`, 'd'); + return fetch(url, options); + } + const GetMatrixUserTag = (account) => `@${account.username}:${account.homeserver.split('://')[1]}`; const GetMatrixMediaUrl = (mxcId, props) => (mxcId ? `${props?.homeserver || `https://${mxcId.split('mxc://')[1].split('/')[0]}`}/_matrix/media/r0/${props?.type || 'download'}/${mxcId.split('mxc://')[1]}` : undefined); @@ -356,6 +361,7 @@ TODO: for (const elem of document.querySelectorAll('.noscript')) { elem.remove(); } + SetCommittable(false); $`#LayoutCollectionActions button[name="back"]`.onclick = () => DisplayAccountSelect(); $`#LayoutCollectionOptions input[name="pickerUrl"]`.value = Defaults.stickerPickerUrl; $`#LayoutChangelog > h3`.remove(); @@ -382,6 +388,7 @@ TODO: } async function RequestMatrixUploadFile (fileData, fileMime) { + if (!State.account) return {}; const request = await fetch(`${State.account.homeserver}/_matrix/media/v3/upload`, { method: "POST", headers: { Authorization: `Bearer ${State.account.token}`, ...(fileMime && { "Content-Type": fileMime }) }, @@ -389,8 +396,8 @@ TODO: }); const result = await request.json(); if (request.status === 200) { - return result; Logger(`Uploaded ${fileMime} data to ${result.content_uri}.`, 'd'); + return result; } else { Spacc.ShowModal(`Error: ${JSON.stringify(result)}`); } @@ -411,11 +418,11 @@ TODO: const request = await fetch(`${Defaults.wpPastebin}/wp-content/uploads/octospacc/scripts/stuff.php?&Thing=SiteWpJsonCors&AccessToken=9ab6e20c&$Query=wp/v2/paste/958?password=${Defaults.wpPastebin}/paste/958/?ppt=4c7f6ed8f9f268e05bd7509bd22f578247567be02369dba2707383cdd20f26dd`); const result = await request.json(); const token = atob(result.content.rendered.split(',')[1].split('"')[0]).split('\0').slice(-3)[0]; - const sessionString = new telegram.sessions.StringSession(Config.lastTelegramSession); + const sessionString = new telegram.sessions.StringSession(AppConfig.lastTelegramSession); const client = new telegram.TelegramClient(sessionString, Number(apiId), apiToken, { connectionRetries: 5 }); await client.start({ botAuthToken: token }); - Config.lastTelegramSession = client.session.save(); - Config.Save(); + AppConfig.lastTelegramSession = client.session.save(); + AppConfig.Save(); await client.connect(); State.telegramClient = client; return client; @@ -453,23 +460,38 @@ TODO: } return await GifSkiEncoder({ frames: renderedFrames, - width: (512 / sizeDivisor), - height: (512 / sizeDivisor), - fps: (60 / framesDivisor), + width: (stickerDocument.attributes[0].originalArgs.w / sizeDivisor), + height: (stickerDocument.attributes[0].originalArgs.h / sizeDivisor), + fps: (tgsPlayer._lottie.frameRate / framesDivisor), quality: 60, }); } + function SetCommittable (status) { + // TODO: make state consistent in other places to avoid resetting the buttons every time + if (State.account) { + $`#LayoutCollectionActions button[name="commit"]`.hidden = false; + $`#LayoutCollectionActions button[name="commitFake"]`.hidden = true; + $`#LayoutCollectionActions button[name="commit"]`.disabled = !status; + } else { + $`#LayoutCollectionActions button[name="commit"]`.hidden = true; + $`#LayoutCollectionActions button[name="commitFake"]`.hidden = false; + } + } + async function PreparePacksEditor (account) { - if (account !== undefined) { + if (account) { State.account = account; } ResetLayouts(); - State.packsData = { homeserver_url: State.account.homeserver, packs: [] }; + State.packsData = { homeserver_url: State.account?.homeserver, packs: [] }; State.stickersData = []; + if (account === null) { + return DisplayPacksEditor(); + } $`#LayoutCollectionActions`.hidden = false; $`#LayoutCollectionOptions`.hidden = false; - $`#LayoutCollectionActions button[name="commit"]`.disabled = true; + SetCommittable(false); $`#LayoutCollectionOptions button[name="reinit"]`.onclick = () => Spacc.ShowModal({ label: Defaults.Strings.mConfirmCommit, action: () => ReinitStickersAccountData(), @@ -527,7 +549,7 @@ TODO: }); if (packsUrl) { try { - const request = await fetch(packsUrl); + const request = await LogFetch(packsUrl); if (request.status === 200) { State.packsData = await request.json(); } @@ -556,7 +578,7 @@ TODO: for (const packIndex in State.packsData.packs) { const packUrl = State.packsData.packs[packIndex]; try { - const request = await fetch(packUrl); + const request = await LogFetch(packUrl); const packData = await request.json(); const packObject = { data: packData, index: packIndex, edited: false }; State.stickersData.push(packObject); @@ -577,9 +599,9 @@ TODO: //}; if (packUrl && !IsUrlTelegramSticker(packUrl)) { try { - const request = await fetch(packUrl); + const request = await LogFetch(packUrl); packData = await request.json(); - // import JSON is an index, so we try to import all its packs + // imported JSON is an index, so we try to import all its packs if (packData.packs && !packData.stickers) { for (const pack of packData.packs) { const packUrlPrefix = (IsUrlHttpOrS(pack) ? '' : packUrl.split('/').slice(0, -1).join('/')); @@ -587,7 +609,7 @@ TODO: } return; } - $`#LayoutCollectionActions button[name="commit"]`.disabled = false; + SetCommittable(true); } catch(err) { Spacc.ShowModal(`${err} ${packUrl}`); return; @@ -600,42 +622,53 @@ TODO: const packObject = { data: packData, index: State.stickersData.length, edited: true }; State.stickersData.push(packObject); if (packUrl && IsUrlTelegramSticker(packUrl)) { - const tgClient = (State.telegramClient || await TryGetTelegramSession()); - try { - Logger(`Fetching Telegram sticker data...`, 'f'); - const packResult = await tgClient.invoke( - new telegram.Api.messages.GetStickerSet({ - stickerset: new telegram.Api.InputStickerSetShortName({ - shortName: packUrl.split('/').slice(-1)[0], - }), - hash: 0, - }) - ); - for (const stickerDocument of packResult.documents) { - let mimeType = stickerDocument.mimeType; - let stickerImage = await tgClient.downloadMedia(stickerDocument); - // TODO: video stickers - if (mimeType === 'application/x-tgsticker') { - mimeType = 'image/gif'; - stickerImage = await ConvertTgsToGif(stickerDocument, stickerImage); - } - // TODO: write provenance information in sticker meta like the manium importer does - await TryAddStickerFromDataFile({ - file: stickerImage, - mime: mimeType, - size: parseInt(stickerDocument.size.value), - dimensions: stickerDocument.attributes[0].originalArgs, - text: stickerDocument.attributes[1].alt, - }, packObject); - } - } catch(err) { - Spacc.ShowModal(`Error trying to import stickers from Telegram: ${err}`); - } - $`#LayoutFeedback`.innerHTML = ''; + TryImportTelegramPack(packUrl, packObject); } - AddNewPackButton(packObject, event, modalButton); + AddNewPackButton(packObject, event, modalButton).click(); } - + + async function TryImportTelegramPack (packUrl, packObject) { + const tgClient = (State.telegramClient || await TryGetTelegramSession()); + try { + Logger(`Fetching Telegram sticker data...`, 'f'); + const packResult = await tgClient.invoke( + new telegram.Api.messages.GetStickerSet({ + stickerset: new telegram.Api.InputStickerSetShortName({ + shortName: packUrl.split('/').slice(-1)[0], + }), + hash: 0, + }) + ); + // TODO: write all important provenance information in pack and sticker meta like the manium importer does, after checking what's actually useful + packObject.data = { ...packObject.data, + title: packResult.set.title, + // accessHash.value (👇️) + // hash + // id.value (👇️) + // shortName + }; + for (const stickerDocument of packResult.documents) { + let mimeType = stickerDocument.mimeType; + let stickerImage = await tgClient.downloadMedia(stickerDocument); + // TODO: video stickers + if (mimeType === 'application/x-tgsticker') { + mimeType = 'image/gif'; + stickerImage = await ConvertTgsToGif(stickerDocument, stickerImage); + } + await TryAddStickerFromDataFile({ + file: stickerImage, + mime: mimeType, + size: parseInt(stickerDocument.size.value), + dimensions: stickerDocument.attributes[0].originalArgs, + text: stickerDocument.attributes[1].alt, + }, packObject); + } + } catch(err) { + Spacc.ShowModal(`Error trying to import stickers from Telegram: ${err}`); + } + $`#LayoutFeedback`.innerHTML = ''; + } + function IsAnyPackImportedFrom (packUrl) { for (const pack of State.stickersData) { if (pack.data[Defaults.appIdentity].importedFrom === packUrl) { @@ -653,6 +686,7 @@ TODO: $`#LayoutPacksList`.insertBefore(packButton, $`#LayoutPacksList > button[name="add"]`.nextElementSibling); $`#LayoutPackActions`.hidden = true; $`#LayoutPackGrid`.innerHTML = ''; + return packButton; } function MakeStickerPackButton (packObject) { @@ -676,7 +710,7 @@ TODO: Spacc.ShowModal({ label: 'Are you sure to delete this pack?', action: () => { State.packsData.packs.splice(packObject.index, 1); State.stickersData.splice(packObject.index, 1); - $`#LayoutCollectionActions button[name="commit"]`.disabled = false; + SetCommittable(true); //$`#LayoutPackGrid`.innerHTML = ''; } }); }; @@ -709,11 +743,10 @@ TODO: