Merge pull request #350 from AlphaX-Qortal/master

Various updates
This commit is contained in:
AlphaX 2025-02-11 20:31:31 +01:00 committed by GitHub
commit 4457215a0e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
28 changed files with 242 additions and 156 deletions

View File

@ -1417,6 +1417,7 @@
"mpchange83": "ABGELEHNT", "mpchange83": "ABGELEHNT",
"mpchange84": "FEHLER", "mpchange84": "FEHLER",
"mpchange85": "ERFOLGREICH", "mpchange85": "ERFOLGREICH",
"mpchange86": "Immer automatisches Abrufen des Wallet-Guthabens zulassen" "mpchange86": "Immer automatisches Abrufen des Wallet-Guthabens zulassen",
"mpchange87": "Bitte geben Sie die Gruppen-ID ein"
} }
} }

View File

@ -1417,6 +1417,7 @@
"mpchange83": "RECHAZADO", "mpchange83": "RECHAZADO",
"mpchange84": "ERROR", "mpchange84": "ERROR",
"mpchange85": "ÉXITO", "mpchange85": "ÉXITO",
"mpchange86": "Permitir siempre obtener el saldo de la billetera automáticamente" "mpchange86": "Permitir siempre obtener el saldo de la billetera automáticamente",
"mpchange87": "Por favor, introduzca el ID del grupo"
} }
} }

View File

@ -1417,6 +1417,7 @@
"mpchange83": "DECLINED", "mpchange83": "DECLINED",
"mpchange84": "FAILURE", "mpchange84": "FAILURE",
"mpchange85": "EDU", "mpchange85": "EDU",
"mpchange86": "Luba alati rahakoti saldo automaatne hankimine" "mpchange86": "Luba alati rahakoti saldo automaatne hankimine",
"mpchange87": "Palun sisestage grupi ID"
} }
} }

View File

@ -1417,6 +1417,7 @@
"mpchange83": "hylätty", "mpchange83": "hylätty",
"mpchange84": "FAILURE", "mpchange84": "FAILURE",
"mpchange85": "SUCCESS", "mpchange85": "SUCCESS",
"mpchange86": "Salli aina saada lompakon saldo automaattisesti" "mpchange86": "Salli aina saada lompakon saldo automaattisesti",
"mpchange87": "Anna ryhmän tunnus"
} }
} }

View File

@ -1417,6 +1417,7 @@
"mpchange83": "REFUSÉ", "mpchange83": "REFUSÉ",
"mpchange84": "ÉCHEC", "mpchange84": "ÉCHEC",
"mpchange85": "SUCCÈS", "mpchange85": "SUCCÈS",
"mpchange86": "Toujours autoriser l'obtention automatique du solde du portefeuille" "mpchange86": "Toujours autoriser l'obtention automatique du solde du portefeuille",
"mpchange87": "Veuillez saisir l'ID du groupe"
} }
} }

View File

@ -1417,6 +1417,7 @@
"mpchange83": "अस्वीकृत", "mpchange83": "अस्वीकृत",
"mpchange84": "विफल", "mpchange84": "विफल",
"mpchange85": "सफल", "mpchange85": "सफल",
"mpchange86": "हमेशा वॉलेट बैलेंस को स्वचालित रूप से प्राप्त करने की अनुमति दें" "mpchange86": "हमेशा वॉलेट बैलेंस को स्वचालित रूप से प्राप्त करने की अनुमति दें",
"mpchange87": "कृपया ग्रुप आईडी दर्ज करें"
} }
} }

View File

@ -1417,6 +1417,7 @@
"mpchange83": "ODBIJENO", "mpchange83": "ODBIJENO",
"mpchange84": "GREŠKA", "mpchange84": "GREŠKA",
"mpchange85": "USPJEH", "mpchange85": "USPJEH",
"mpchange86": "Uvijek dopusti automatsko dobivanje stanja novčanika" "mpchange86": "Uvijek dopusti automatsko dobivanje stanja novčanika",
"mpchange87": "Molimo unesite ID grupe"
} }
} }

View File

@ -1417,6 +1417,7 @@
"mpchange83": "Elutasítva", "mpchange83": "Elutasítva",
"mpchange84": "FAILURE", "mpchange84": "FAILURE",
"mpchange85": "SIKER", "mpchange85": "SIKER",
"mpchange86": "Mindig engedélyezze a pénztárcaegyenleg automatikus lekérését" "mpchange86": "Mindig engedélyezze a pénztárcaegyenleg automatikus lekérését",
"mpchange87": "Kérjük, adja meg a csoport azonosítóját"
} }
} }

View File

@ -1417,6 +1417,7 @@
"mpchange83": "RIFIUTATO", "mpchange83": "RIFIUTATO",
"mpchange84": "FALLITO", "mpchange84": "FALLITO",
"mpchange85": "RIUSCITO", "mpchange85": "RIUSCITO",
"mpchange86": "Consenti sempre di ottenere automaticamente il saldo del portafoglio" "mpchange86": "Consenti sempre di ottenere automaticamente il saldo del portafoglio",
"mpchange87": "Inserisci l'ID del gruppo"
} }
} }

View File

@ -1417,6 +1417,7 @@
"mpchange83": "拒否されました", "mpchange83": "拒否されました",
"mpchange84": "失敗", "mpchange84": "失敗",
"mpchange85": "成功", "mpchange85": "成功",
"mpchange86": "ウォレット残高の自動取得を常に許可する" "mpchange86": "ウォレット残高の自動取得を常に許可する",
"mpchange87": "グループ ID を入力してください"
} }
} }

View File

@ -1417,6 +1417,7 @@
"mpchange83": "거부됨", "mpchange83": "거부됨",
"mpchange84": "실패", "mpchange84": "실패",
"mpchange85": "성공", "mpchange85": "성공",
"mpchange86": "항상 지갑 잔액을 자동으로 가져오도록 허용" "mpchange86": "항상 지갑 잔액을 자동으로 가져오도록 허용",
"mpchange87": "그룹 ID를 입력하세요"
} }
} }

View File

@ -1417,6 +1417,7 @@
"mpchange83": "GEWEIGERD", "mpchange83": "GEWEIGERD",
"mpchange84": "MISLUKT", "mpchange84": "MISLUKT",
"mpchange85": "SUCCES", "mpchange85": "SUCCES",
"mpchange86": "Altijd toestaan om automatisch saldo in portemonnee op te halen" "mpchange86": "Altijd toestaan om automatisch saldo in portemonnee op te halen",
"mpchange87": "Voer de groeps-ID in"
} }
} }

View File

@ -1417,6 +1417,7 @@
"mpchange83": "AVSLAGT", "mpchange83": "AVSLAGT",
"mpchange84": "FEIL", "mpchange84": "FEIL",
"mpchange85": "SUKSESS", "mpchange85": "SUKSESS",
"mpchange86": "Tillat alltid få lommeboksaldo automatisk" "mpchange86": "Tillat alltid få lommeboksaldo automatisk",
"mpchange87": "Vennligst skriv inn gruppe-ID"
} }
} }

View File

@ -1417,6 +1417,7 @@
"mpchange83": "ODRZUCONE", "mpchange83": "ODRZUCONE",
"mpchange84": "NIEPOWODZENIE", "mpchange84": "NIEPOWODZENIE",
"mpchange85": "POWODZENIE", "mpchange85": "POWODZENIE",
"mpchange86": "Zawsze zezwalaj na automatyczne pobieranie salda portfela" "mpchange86": "Zawsze zezwalaj na automatyczne pobieranie salda portfela",
"mpchange87": "Wprowadź identyfikator grupy"
} }
} }

View File

@ -1417,6 +1417,7 @@
"mpchange83": "RECLINADO", "mpchange83": "RECLINADO",
"mpchange84": "FALHA", "mpchange84": "FALHA",
"mpchange85": "SUCESSO", "mpchange85": "SUCESSO",
"mpchange86": "Permitir sempre obter saldo da carteira automaticamente" "mpchange86": "Permitir sempre obter saldo da carteira automaticamente",
"mpchange87": "Por favor introduza o ID do grupo"
} }
} }

View File

@ -1417,6 +1417,7 @@
"mpchange83": "RESFUS", "mpchange83": "RESFUS",
"mpchange84": "Eșec", "mpchange84": "Eșec",
"mpchange85": "SUCCES", "mpchange85": "SUCCES",
"mpchange86": "Permiteți întotdeauna obținerea automată a soldului portofelului" "mpchange86": "Permiteți întotdeauna obținerea automată a soldului portofelului",
"mpchange87": "Vă rugăm să introduceți ID-ul grupului"
} }
} }

View File

@ -1417,6 +1417,7 @@
"mpchange83": "ODBIJENO", "mpchange83": "ODBIJENO",
"mpchange84": "GREŠKA", "mpchange84": "GREŠKA",
"mpchange85": "USPEH", "mpchange85": "USPEH",
"mpchange86": "Uvek dozvoli automatsko dobijanje stanja novčanika" "mpchange86": "Uvek dozvoli automatsko dobijanje stanja novčanika",
"mpchange87": "Unesite ID grupe"
} }
} }

View File

@ -1417,6 +1417,7 @@
"mpchange83": "ОТКЛОНЕНО", "mpchange83": "ОТКЛОНЕНО",
"mpchange84": "НЕУДАЧА", "mpchange84": "НЕУДАЧА",
"mpchange85": "УСПЕШНО", "mpchange85": "УСПЕШНО",
"mpchange86": "Всегда разрешать автоматически получать баланс кошелька" "mpchange86": "Всегда разрешать автоматически получать баланс кошелька",
"mpchange87": "Пожалуйста, введите идентификатор группы"
} }
} }

View File

@ -1417,6 +1417,7 @@
"mpchange83": "DECLINED", "mpchange83": "DECLINED",
"mpchange84": "FAILURE", "mpchange84": "FAILURE",
"mpchange85": "SUCCESS", "mpchange85": "SUCCESS",
"mpchange86": "Always allow get wallet balance automatically" "mpchange86": "Always allow get wallet balance automatically",
"mpchange87": "Please Enter The Group ID"
} }
} }

View File

@ -1417,6 +1417,7 @@
"mpchange83": "拒绝", "mpchange83": "拒绝",
"mpchange84": "失败", "mpchange84": "失败",
"mpchange85": "成功", "mpchange85": "成功",
"mpchange86": "始终允许自动获取钱包余额" "mpchange86": "始终允许自动获取钱包余额",
"mpchange87": "请输入群组ID"
} }
} }

View File

@ -1417,6 +1417,7 @@
"mpchange83": "拒絕", "mpchange83": "拒絕",
"mpchange84": "失敗", "mpchange84": "失敗",
"mpchange85": "成功", "mpchange85": "成功",
"mpchange86": "隨時允許自動取得錢包餘額" "mpchange86": "隨時允許自動取得錢包餘額",
"mpchange87": "請輸入群組 ID"
} }
} }

View File

@ -14,6 +14,15 @@ import {
const Base64Message = {} const Base64Message = {}
Base64Message.decode = function (string, keys, ref) { Base64Message.decode = function (string, keys, ref) {
let repliedToStr = ''
let hubSpecialId = ''
let hubMessageStr = ''
let newMessageObject = ''
let messageUseEmbed = {}
let isHubReaction = false
let editStr = false
let embedFileStr = '"images":[""]'
const binaryString = atob(string) const binaryString = atob(string)
const binaryLength = binaryString.length const binaryLength = binaryString.length
const bytes = new Uint8Array(binaryLength) const bytes = new Uint8Array(binaryLength)
@ -34,88 +43,54 @@ Base64Message.decode = function (string, keys, ref) {
return decodedString return decodedString
} }
} else { } else {
let repliedToStr = ''
let addedFileStr = ''
let messageStr = ''
let hubString = ''
let messageRep = ''
let messageUseEmbed = {}
const res = decryptSingle(string, keys, false) const res = decryptSingle(string, keys, false)
if (res === 'noKey' || res === 'decryptionFailed') { if (res === 'noKey' || res === 'decryptionFailed') {
return '{"messageText":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"This message could not be decrypted"}]}]}' + addedFileStr + ',"repliedTo":"","version":3,"isFromHub":true}' return '{"specialId":"","message":"<p>This message could not be decrypted</p>","repliedTo":"","isEdited":false,"isFromHub":true,"isReaction":false,"version": 3}'
} }
const decryptToUnit8Array = base64ToUint8Array(res) const decryptToUnit8Array = base64ToUint8Array(res)
const responseData = uint8ArrayToObject(decryptToUnit8Array) const responseData = uint8ArrayToObject(decryptToUnit8Array)
if (responseData.type === "notification") { if (responseData.type === "notification") {
const messageStrRaw = responseData.data.message hubMessageStr = responseData.data.message
messageStr = messageStrRaw.trim()
} }
if (ref !== "noref") { if (ref !== "noref") {
if (responseData.type === "reaction") { if (responseData.type === "reaction") {
isHubReaction = true
repliedToStr = ref repliedToStr = ref
messageStr = responseData.content hubMessageStr = responseData.content
} }
} }
if (responseData.hasOwnProperty('message') && typeof responseData['message'] === 'string' && responseData['message'].length) { if (responseData.type === "edit") {
if (responseData.message.includes('qortal://use-embed/')) { editStr = true
const useEmbed1 = extensionToPointer(responseData.message)
const useEmbed2 = /<newpointer>(.*?)<\/newpointer>/g.exec(useEmbed1)
const useEmbed3 = encodedToChar(useEmbed2[1])
messageUseEmbed = parseQortalLink(useEmbed3)
addedFileStr = embedToString(messageUseEmbed)
const useEmbed4 = responseData.message.split(useEmbed2[1]).join('')
if (useEmbed4 === "<p></p>") {
messageRep = useEmbed4.split('<p></p>').join('<p>Qortal-Hub embed link</p>')
} else {
messageRep = useEmbed4
}
} else {
messageRep = responseData.message
addedFileStr = ',"images":[""]'
}
const messageRep1 = messageRep.split('"').join('<upvote>')
const messageRep2 = messageRep1.split('</p><p></p><p></p><p></p><p>').join('"},{"type":"hardBreak"},{"type":"hardBreak"},{"type":"hardBreak"},{"type":"hardBreak"},{"type":"text","text":"')
const messageRep3 = messageRep2.split('</p><p></p><p></p><p>').join('"},{"type":"hardBreak"},{"type":"hardBreak"},{"type":"hardBreak"},{"type":"text","text":"')
const messageRep4 = messageRep3.split('</p><p></p><p>').join('"},{"type":"hardBreak"},{"type":"hardBreak"},{"type":"text","text":"')
const messageRep5 = messageRep4.replace('</p><p>', '')
const messageRep6 = messageRep5.replace('<p></p>', '')
const messageRep7 = messageRep6.replace('<p>', '')
const messageRep8 = messageRep7.replace('<br></p>', '')
const messageRep9 = messageRep8.replace('</p>', '')
const messageRep10 = messageRep9.trim()
const messageRep11 = messageRep10.split('<br><br><br><br>').join('"},{"type":"hardBreak"},{"type":"hardBreak"},{"type":"hardBreak"},{"type":"hardBreak"},{"type":"text","text":"')
const messageRep12 = messageRep11.split('<br><br><br>').join('"},{"type":"hardBreak"},{"type":"hardBreak"},{"type":"hardBreak"},{"type":"text","text":"')
const messageRep13 = messageRep12.split('<br><br>').join('"},{"type":"hardBreak"},{"type":"hardBreak"},{"type":"text","text":"')
const messageRep14 = messageRep13.split('<br>').join('"},{"type":"hardBreak"},{"type":"text","text":"')
messageStr = messageRep14
} }
if (responseData.repliedTo) { if (responseData.repliedTo) {
repliedToStr = responseData.repliedTo repliedToStr = responseData.repliedTo
} }
if (responseData.type === "edit") { if (responseData.specialId) {
hubString = '{"messageText":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"' + messageStr + '"}]}]}' + addedFileStr + ',"repliedTo":"' + repliedToStr + '","version":3,"isEdited":true,"isFromHub":true}' hubSpecialId = responseData.specialId
} else if (responseData.type === "reaction") {
hubString = '{"messageText":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"' + messageStr + '"}]}]}' + addedFileStr + ',"repliedTo":"' + repliedToStr + '","version":3,"isReaction":true,"isFromHub":true}'
} else {
hubString = '{"messageText":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"' + messageStr + '"}]}]}' + addedFileStr + ',"repliedTo":"' + repliedToStr + '","version":3,"isFromHub":true}'
} }
const preparedString = hubString.split('<upvote>').join('\\"') if (responseData.message.includes('qortal://use-embed/')) {
const finalString = preparedString.replace(/<\/?[^>]+(>|$)/g, '') const useEmbed1 = extensionToPointer(responseData.message)
const useEmbed2 = /<newpointer>(.*?)<\/newpointer>/g.exec(useEmbed1)
const useEmbed3 = encodedToChar(useEmbed2[1])
return finalString messageUseEmbed = parseQortalLink(useEmbed3)
embedFileStr = embedToString(messageUseEmbed)
hubMessageStr = responseData.message.split(useEmbed2[1]).join('')
} else {
hubMessageStr = responseData.message
}
newMessageObject = '{"specialId":"' + hubSpecialId + '","message":"' + hubMessageStr + '",' + embedFileStr + ',"repliedTo":"' + repliedToStr + '","isEdited":' + editStr + ',"isFromHub":true,"isReaction":' + isHubReaction + ',"version": 3}'
return newMessageObject
} }
} }

View File

@ -1081,17 +1081,22 @@ class MessageTemplate extends LitElement {
let version = 0 let version = 0
let isForwarded = false let isForwarded = false
let isEdited = false let isEdited = false
let isFromHub = false let isEncrypted = false
try { try {
const parsedMessageObj = JSON.parse(this.messageObj.decodedMessage) const parsedMessageObj = JSON.parse(this.messageObj.decodedMessage)
if (+parsedMessageObj.version > 1 && parsedMessageObj.messageText) { if (parsedMessageObj.version > 1 && parsedMessageObj.messageText) {
messageVersion2 = generateHTML(parsedMessageObj.messageText, [StarterKit, Underline, Highlight, Mention]) messageVersion2 = generateHTML(parsedMessageObj.messageText, [StarterKit, Underline, Highlight, Mention])
messageVersion2WithLink = processText(messageVersion2) messageVersion2WithLink = processText(messageVersion2)
} }
message = parsedMessageObj.messageText if (parsedMessageObj.version > 1 && parsedMessageObj.message) {
messageVersion2 = parsedMessageObj.message
messageVersion2WithLink = processText(messageVersion2)
}
message = parsedMessageObj.messageText ? parsedMessageObj.messageText : parsedMessageObj.message
repliedToData = this.messageObj.repliedToData repliedToData = this.messageObj.repliedToData
isImageDeleted = parsedMessageObj.isImageDeleted isImageDeleted = parsedMessageObj.isImageDeleted
isGifDeleted = parsedMessageObj.isGifDeleted isGifDeleted = parsedMessageObj.isGifDeleted
@ -1101,7 +1106,7 @@ class MessageTemplate extends LitElement {
version = parsedMessageObj.version version = parsedMessageObj.version
isForwarded = parsedMessageObj.type === 'forward' isForwarded = parsedMessageObj.type === 'forward'
isEdited = parsedMessageObj.isEdited && true isEdited = parsedMessageObj.isEdited && true
isFromHub = parsedMessageObj.isFromHub && true isEncrypted = parsedMessageObj.isFromHub || parsedMessageObj.message ? true : false
if (parsedMessageObj.images && Array.isArray(parsedMessageObj.images) && parsedMessageObj.images.length > 0) { if (parsedMessageObj.images && Array.isArray(parsedMessageObj.images) && parsedMessageObj.images.length > 0) {
image = parsedMessageObj.images[0] image = parsedMessageObj.images[0]
@ -1133,8 +1138,8 @@ class MessageTemplate extends LitElement {
let hideit = hidemsg.includes(this.messageObj.sender) let hideit = hidemsg.includes(this.messageObj.sender)
let forwarded = '' let forwarded = ''
let edited = '' let edited = ''
let fromHubOk = '' let encrypted = ''
let fromHubNo = '' let decrypted = ''
levelFounder = html`<level-founder checkleveladdress="${this.messageObj.sender}"></level-founder>` levelFounder = html`<level-founder checkleveladdress="${this.messageObj.sender}"></level-founder>`
@ -1250,9 +1255,9 @@ class MessageTemplate extends LitElement {
</span> </span>
` `
fromHubOk = html`&nbsp;&nbsp;&nbsp;<mwc-icon style="font-size:16px; color: var(--chat-group);">key</mwc-icon>&nbsp;&nbsp;&nbsp;` encrypted = html`&nbsp;&nbsp;&nbsp;<mwc-icon style="font-size:16px; color: var(--chat-group);">key</mwc-icon>&nbsp;&nbsp;&nbsp;`
fromHubNo = html`&nbsp;&nbsp;&nbsp;<mwc-icon style="font-size:16px; color: var(--chat-group);">key_off</mwc-icon>&nbsp;&nbsp;&nbsp;` decrypted = html`&nbsp;&nbsp;&nbsp;<mwc-icon style="font-size:16px; color: var(--chat-group);">key_off</mwc-icon>&nbsp;&nbsp;&nbsp;`
if (repliedToData) { if (repliedToData) {
try { try {
@ -1672,7 +1677,7 @@ class MessageTemplate extends LitElement {
` : this.isAgo ? html` ` : this.isAgo ? html`
<div style="display: flex; align-items: center;"> <div style="display: flex; align-items: center;">
<div style="margin-top: 4px;"> <div style="margin-top: 4px;">
${isFromHub ? html`${fromHubOk}` : html`${fromHubNo}`} ${isEncrypted ? html`${encrypted}` : html`${decrypted}`}
</div> </div>
<div id="timeformat"> <div id="timeformat">
<span> <span>
@ -1683,7 +1688,7 @@ class MessageTemplate extends LitElement {
` : this.isIso ? html` ` : this.isIso ? html`
<div style="display: flex; align-items: center;"> <div style="display: flex; align-items: center;">
<div style="margin-top: 4px;"> <div style="margin-top: 4px;">
${isFromHub ? html`${fromHubOk}` : html`${fromHubNo}`} ${isEncrypted ? html`${encrypted}` : html`${decrypted}`}
</div> </div>
<div id="timeformat"> <div id="timeformat">
<span> <span>
@ -1694,7 +1699,7 @@ class MessageTemplate extends LitElement {
` : this.isBoth ? html` ` : this.isBoth ? html`
<div style="display: flex; align-items: center;"> <div style="display: flex; align-items: center;">
<div style="margin-top: 4px;"> <div style="margin-top: 4px;">
${isFromHub ? html`${fromHubOk}` : html`${fromHubNo}`} ${isEncrypted ? html`${encrypted}` : html`${decrypted}`}
</div> </div>
<div id="timeformat"> <div id="timeformat">
<span> <span>

View File

@ -2014,8 +2014,13 @@ export const chatStyles = css`
} }
#messageContent code { #messageContent code {
background-color: rgba(#616161, 0.1); background: #0D0D0D;
color: #616161; color: #FFF;
font-family: 'JetBrainsMono', monospace;
padding: 0.75rem 1rem;
border-radius: 0.5rem;
white-space: pre-wrap;
margin-top: 10px;
} }
#messageContent pre { #messageContent pre {
@ -2034,12 +2039,10 @@ export const chatStyles = css`
font-size: 0.8rem; font-size: 0.8rem;
} }
#messageContent img { #messageContent img {
width: 1.7em; width: 1.7em;
height: 1.5em; height: 1.5em;
margin: 0px; margin: 0px;
} }
#messageContent blockquote { #messageContent blockquote {
@ -2078,8 +2081,13 @@ export const chatStyles = css`
} }
.replied-message code { .replied-message code {
background-color: rgba(#616161, 0.1); background: #0D0D0D;
color: #616161; color: #FFF;
font-family: 'JetBrainsMono', monospace;
padding: 0.75rem 1rem;
border-radius: 0.5rem;
white-space: pre-wrap;
margin: 0px;
} }
.replied-message pre { .replied-message pre {

View File

@ -159,15 +159,15 @@ export const embedToString = (embed) => {
embedService = embed.service embedService = embed.service
embedName = embed.name embedName = embed.name
embedIdentifier = embed.identifier embedIdentifier = embed.identifier
embedString = ',"images":[{"service":"' + embedService + '","name":"' + embedName + '","identifier":"' + embedIdentifier + '"}],"isImageDeleted":false' embedString = '"images":[{"service":"' + embedService + '","name":"' + embedName + '","identifier":"' + embedIdentifier + '"}],"isImageDeleted":false'
} else if (embed.type === "ATTACHMENT") { } else if (embed.type === "ATTACHMENT") {
embedService = embed.service embedService = embed.service
embedName = embed.name embedName = embed.name
embedIdentifier = embed.identifier embedIdentifier = embed.identifier
embedAttachmentName = embed.fileName embedAttachmentName = embed.fileName
embedString = ',"attachments":[{"service":"' + embedService + '","name":"' + embedName + '","identifier":"' + embedIdentifier + '","attachmentName":"' + embedAttachmentName + '","attachmentSize":0}],"isAttachmentDeleted":false' embedString = '"attachments":[{"service":"' + embedService + '","name":"' + embedName + '","identifier":"' + embedIdentifier + '","attachmentName":"' + embedAttachmentName + '","attachmentSize":0}],"isAttachmentDeleted":false'
} else { } else {
embedString = ',"images":[""]' embedString = '"images":[""]'
} }
return embedString return embedString

View File

@ -2767,6 +2767,15 @@ self.addEventListener('message', async (e) => {
}) })
const decode = (string, keys, ref) => { const decode = (string, keys, ref) => {
let repliedToStr = ''
let hubSpecialId = ''
let hubMessageStr = ''
let newMessageObject = ''
let messageUseEmbed = {}
let isHubReaction = false
let editStr = false
let embedFileStr = '"images":[""]'
const binaryString = atob(string) const binaryString = atob(string)
const binaryLength = binaryString.length const binaryLength = binaryString.length
const bytes = new Uint8Array(binaryLength) const bytes = new Uint8Array(binaryLength)
@ -2787,88 +2796,54 @@ const decode = (string, keys, ref) => {
return decodedString return decodedString
} }
} else { } else {
let repliedToStr = ''
let addedFileStr = ''
let messageStr = ''
let hubString = ''
let messageRep = ''
let messageUseEmbed = {}
const res = decryptSingle(string, keys, false) const res = decryptSingle(string, keys, false)
if (res === 'noKey' || res === 'decryptionFailed') { if (res === 'noKey' || res === 'decryptionFailed') {
return '{"messageText":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"This message could not be decrypted"}]}]}' + addedFileStr + ',"repliedTo":"","version":3,"isFromHub":true}' return '{"specialId":"","message":"<p>This message could not be decrypted</p>","repliedTo":"","isEdited":false,"isFromHub":true,"isReaction":false,"version": 3}'
} }
const decryptToUnit8Array = base64ToUint8Array(res) const decryptToUnit8Array = base64ToUint8Array(res)
const responseData = uint8ArrayToObject(decryptToUnit8Array) const responseData = uint8ArrayToObject(decryptToUnit8Array)
if (responseData.type === "notification") { if (responseData.type === "notification") {
const messageStrRaw = responseData.data.message hubMessageStr = responseData.data.message
messageStr = messageStrRaw.trim()
} }
if (ref !== "noref") { if (ref !== "noref") {
if (responseData.type === "reaction") { if (responseData.type === "reaction") {
isHubReaction = true
repliedToStr = ref repliedToStr = ref
messageStr = responseData.content hubMessageStr = responseData.content
} }
} }
if (responseData.hasOwnProperty('message') && typeof responseData['message'] === 'string' && responseData['message'].length) { if (responseData.type === "edit") {
if (responseData.message.includes('qortal://use-embed/')) { editStr = true
const useEmbed1 = extensionToPointer(responseData.message)
const useEmbed2 = /<newpointer>(.*?)<\/newpointer>/g.exec(useEmbed1)
const useEmbed3 = encodedToChar(useEmbed2[1])
messageUseEmbed = parseQortalLink(useEmbed3)
addedFileStr = embedToString(messageUseEmbed)
const useEmbed4 = responseData.message.split(useEmbed2[1]).join('')
if (useEmbed4 === "<p></p>") {
messageRep = useEmbed4.split('<p></p>').join('<p>Qortal-Hub embed link</p>')
} else {
messageRep = useEmbed4
}
} else {
messageRep = responseData.message
addedFileStr = ',"images":[""]'
}
const messageRep1 = messageRep.split('"').join('<upvote>')
const messageRep2 = messageRep1.split('</p><p></p><p></p><p></p><p>').join('"},{"type":"hardBreak"},{"type":"hardBreak"},{"type":"hardBreak"},{"type":"hardBreak"},{"type":"text","text":"')
const messageRep3 = messageRep2.split('</p><p></p><p></p><p>').join('"},{"type":"hardBreak"},{"type":"hardBreak"},{"type":"hardBreak"},{"type":"text","text":"')
const messageRep4 = messageRep3.split('</p><p></p><p>').join('"},{"type":"hardBreak"},{"type":"hardBreak"},{"type":"text","text":"')
const messageRep5 = messageRep4.replace('</p><p>', '')
const messageRep6 = messageRep5.replace('<p></p>', '')
const messageRep7 = messageRep6.replace('<p>', '')
const messageRep8 = messageRep7.replace('<br></p>', '')
const messageRep9 = messageRep8.replace('</p>', '')
const messageRep10 = messageRep9.trim()
const messageRep11 = messageRep10.split('<br><br><br><br>').join('"},{"type":"hardBreak"},{"type":"hardBreak"},{"type":"hardBreak"},{"type":"hardBreak"},{"type":"text","text":"')
const messageRep12 = messageRep11.split('<br><br><br>').join('"},{"type":"hardBreak"},{"type":"hardBreak"},{"type":"hardBreak"},{"type":"text","text":"')
const messageRep13 = messageRep12.split('<br><br>').join('"},{"type":"hardBreak"},{"type":"hardBreak"},{"type":"text","text":"')
const messageRep14 = messageRep13.split('<br>').join('"},{"type":"hardBreak"},{"type":"text","text":"')
messageStr = messageRep14
} }
if (responseData.repliedTo) { if (responseData.repliedTo) {
repliedToStr = responseData.repliedTo repliedToStr = responseData.repliedTo
} }
if (responseData.type === "edit") { if (responseData.specialId) {
hubString = '{"messageText":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"' + messageStr + '"}]}]}' + addedFileStr + ',"repliedTo":"' + repliedToStr + '","version":3,"isEdited":true,"isFromHub":true}' hubSpecialId = responseData.specialId
} else if (responseData.type === "reaction") {
hubString = '{"messageText":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"' + messageStr + '"}]}]}' + addedFileStr + ',"repliedTo":"' + repliedToStr + '","version":3,"isReaction":true,"isFromHub":true}'
} else {
hubString = '{"messageText":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"' + messageStr + '"}]}]}' + addedFileStr + ',"repliedTo":"' + repliedToStr + '","version":3,"isFromHub":true}'
} }
const preparedString = hubString.split('<upvote>').join('\\"') if (responseData.message.includes('qortal://use-embed/')) {
const finalString = preparedString.replace(/<\/?[^>]+(>|$)/g, '') const useEmbed1 = extensionToPointer(responseData.message)
const useEmbed2 = /<newpointer>(.*?)<\/newpointer>/g.exec(useEmbed1)
const useEmbed3 = encodedToChar(useEmbed2[1])
return finalString messageUseEmbed = parseQortalLink(useEmbed3)
embedFileStr = embedToString(messageUseEmbed)
hubMessageStr = responseData.message.split(useEmbed2[1]).join('')
} else {
hubMessageStr = responseData.message
}
newMessageObject = '{"specialId":"' + hubSpecialId + '","message":"' + hubMessageStr + '",' + embedFileStr + ',"repliedTo":"' + repliedToStr + '","isEdited":' + editStr + ',"isFromHub":true,"isReaction":' + isHubReaction + ',"version": 3}'
return newMessageObject
} }
} }

View File

@ -317,7 +317,7 @@ class Chat extends LitElement {
<!-- View Chat Over ID --> <!-- View Chat Over ID -->
<mwc-dialog id="viewChatDialog"> <mwc-dialog id="viewChatDialog">
<div style="text-align: center;"> <div style="text-align: center;">
<h1>Please Enter The Group ID</h1> <h1>${translate("modals.mpchange87")}</h1>
<hr> <hr>
<br> <br>
</div> </div>
@ -326,7 +326,7 @@ class Chat extends LitElement {
style="width: 100%;" style="width: 100%;"
required required
id="groupIdInput" id="groupIdInput"
label="Emter Group ID" label="${translate("managegroup.mg8")}"
type="number" type="number"
auto-validate="false" auto-validate="false"
value="" value=""

View File

@ -17,7 +17,7 @@ import {
} from '../../../utils/classes' } from '../../../utils/classes'
import {appendBuffer} from '../../../utils/utilities' import {appendBuffer} from '../../../utils/utilities'
import {QORT_DECIMALS} from '../../../../../crypto/api/constants' import {QORT_DECIMALS} from '../../../../../crypto/api/constants'
import {listOfAllQortalRequests} from '../../components/qdn-action-constants' import {mimeToExtensionMap, listOfAllQortalRequests} from '../../components/qdn-action-constants'
import { import {
createSymmetricKeyAndNonce, createSymmetricKeyAndNonce,
decryptGroupEncryptionWithSharingKey, decryptGroupEncryptionWithSharingKey,
@ -2252,6 +2252,108 @@ class WebBrowser extends LitElement {
} }
break break
case actions.SAVE_FILE: {
try {
const requiredFields = ['filename', 'blob']
const missingFields = []
let dataSentBack = {}
requiredFields.forEach((field) => {
if (!data[field]) {
missingFields.push(field)
}
})
if (missingFields.length > 0) {
const missingFieldsString = missingFields.join(', ')
const tryAgain = get("walletpage.wchange44")
await showErrorAndWait(
"MISSING_FIELDS",
{
id1: missingFieldsString,
id2: tryAgain
}
)
dataSentBack['error'] = `Missing fields: ${missingFieldsString}`
response = JSON.stringify(dataSentBack)
break
}
const filename = data.filename
const blob = data.blob
const res = await showModalAndWait(
actions.SAVE_FILE,
{
filename
}
)
if (res.action === 'reject') {
let myMsg1 = get("transactions.declined")
let myMsg2 = get("walletpage.wchange44")
await showErrorAndWait("DECLINED_REQUEST", { id1: myMsg1, id2: myMsg2 })
response = '{"error": "User declined request"}'
break
}
const mimeType = blob.type || data.mimeType
let backupExention = filename.split('.').pop()
if (backupExention) {
backupExention = '.' + backupExention
}
const fileExtension = mimeToExtensionMap[mimeType] || backupExention
let fileHandleOptions = {}
if (!mimeType) {
const obj = {}
obj['error'] = 'A mimeType could not be derived'
response = JSON.stringify(obj)
break
}
if (!fileExtension) {
const obj = {}
obj['error'] = 'A file extension could not be derived'
response = JSON.stringify(obj)
break
}
if (fileExtension && mimeType) {
fileHandleOptions = {
accept: {
[mimeType]: [fileExtension]
}
}
}
try {
const fileHandle = await self.showSaveFilePicker({
suggestedName: filename,
types: [
{
description: mimeType,
...fileHandleOptions
}
]
})
const writeFile = async (fileHandle, contents) => {
const writable = await fileHandle.createWritable()
await writable.write(contents)
await writable.close()
}
writeFile(fileHandle, blob).then(() => console.log("FILE SAVED"))
} catch (error) {
if (error.name === 'AbortError') {
const obj = {}
obj['error'] = 'User declined the download'
response = JSON.stringify(obj)
break
}
FileSaver.saveAs(blob, filename)
}
response = JSON.stringify(true)
} catch (error) {
let myMsg1 = get("managegroup.mg58")
let myMsg2 = get("walletpage.wchange44")
await showErrorAndWait("ACTION_FAILED", { id1: myMsg1, id2: myMsg2 })
const obj = {}
obj['error'] = error.message || 'Failed to initiate download'
response = JSON.stringify(obj)
}
}
break
case actions.DEPLOY_AT: { case actions.DEPLOY_AT: {
const requiredFields = ['name', 'description', 'tags', 'creationBytes', 'amount', 'assetId', 'type'] const requiredFields = ['name', 'description', 'tags', 'creationBytes', 'amount', 'assetId', 'type']
const missingFields = [] const missingFields = []