From 4e35e481fdd8f194e4931b1ae85bb615e1bc5c62 Mon Sep 17 00:00:00 2001 From: Eduard Kuzmenko Date: Wed, 3 Feb 2021 06:15:28 +0200 Subject: [PATCH] Support t.me/c/[0-9]+/[0-9]+ urls --- src/lib/appManagers/appImManager.ts | 27 ++++++++++++++++-------- src/lib/richtextprocessor.ts | 32 +++++++++++++++++------------ 2 files changed, 37 insertions(+), 22 deletions(-) diff --git a/src/lib/appManagers/appImManager.ts b/src/lib/appManagers/appImManager.ts index 03e4c013..7a860e04 100644 --- a/src/lib/appManagers/appImManager.ts +++ b/src/lib/appManagers/appImManager.ts @@ -126,19 +126,28 @@ export class AppImManager { params[item.split('=')[0]] = decodeURIComponent(item.split('=')[1]); }); - this.log('hashchange', splitted[0], params); + this.log('hashchange', hash, splitted[0], params); switch(splitted[0]) { case '#/im': { const p = params.p; - if(p[0] === '@') { - let postId = params.post !== undefined ? appMessagesManager.generateMessageId(+params.post) : undefined; - appUsersManager.resolveUsername(p).then(peer => { - const isUser = peer._ == 'user'; - const peerId = isUser ? peer.id : -peer.id; - - this.setInnerPeer(peerId, postId); - }); + let postId = params.post !== undefined ? appMessagesManager.generateMessageId(+params.post) : undefined; + + switch(p[0]) { + case '@': { + appUsersManager.resolveUsername(p).then(peer => { + const isUser = peer._ == 'user'; + const peerId = isUser ? peer.id : -peer.id; + + this.setInnerPeer(peerId, postId); + }); + break; + } + + default: { // peerId + this.setInnerPeer(postId ? -+p : +p, postId); + break; + } } } } diff --git a/src/lib/richtextprocessor.ts b/src/lib/richtextprocessor.ts index 15965355..cd2393b1 100644 --- a/src/lib/richtextprocessor.ts +++ b/src/lib/richtextprocessor.ts @@ -668,13 +668,13 @@ namespace RichTextProcessor { url = 'https://' + url; } - var tgMeMatch; - var telescoPeMatch; + let tgMeMatch; + let telescoPeMatch; /* if(unsafe == 2) { url = 'tg://unsafe_url?url=' + encodeURIComponent(url); } else */if((tgMeMatch = url.match(/^https?:\/\/t(?:elegram)?\.me\/(.+)/))) { - var fullPath = tgMeMatch[1]; - var path = fullPath.split('/'); + const fullPath = tgMeMatch[1]; + const path = fullPath.split('/'); switch(path[0]) { case 'joinchat': url = 'tg://join?invite=' + path[1]; @@ -685,15 +685,19 @@ namespace RichTextProcessor { break; default: - if(path[1] && path[1].match(/^\d+$/)) { - url = siteMentions['Telegram'].replace('{1}', path[0] + '&post=' + path[1]); - //url = 'tg://resolve?domain=' + path[0] + '&post=' + path[1]; - } else if(path.length == 1) { - var domainQuery = path[0].split('?'); - var domain = domainQuery[0]; - var query = domainQuery[1]; - if(domain == 'iv') { - var match = (query || '').match(/url=([^&=]+)/); + if(path[1] && path[1].match(/^\d+$/)) { // https://t.me/.+/[0-9]+ (channel w/ username) + if(path[0] === 'c' && path[2]) { // https://t.me/c/111111111/111 (channel w/o username) + url = '#/im?p=' + path[1] + '&post=' + path[2]; + } else { // https://t.me/durov/151 (channel w/ username) + url = siteMentions['Telegram'].replace('{1}', path[0] + '&post=' + path[1]); + } + } else if(path.length === 1) { + const domainQuery = path[0].split('?'); + const domain = domainQuery[0]; + const query = domainQuery[1]; + + if(domain === 'iv') { + const match = (query || '').match(/url=([^&=]+)/); if(match) { url = match[1]; try { @@ -707,6 +711,8 @@ namespace RichTextProcessor { url = siteMentions['Telegram'].replace('{1}', domain + (query ? '&' + query : '')); //url = 'tg://resolve?domain=' + domain + (query ? '&' + query : ''); } + + break; } } else if((telescoPeMatch = url.match(/^https?:\/\/telesco\.pe\/([^/?]+)\/(\d+)/))) { url = 'tg://resolve?domain=' + telescoPeMatch[1] + '&post=' + telescoPeMatch[2];