From 9df635ad927535802eb6951793e210ce9b1f3d5a Mon Sep 17 00:00:00 2001 From: teidesu Date: Mon, 10 May 2021 17:04:46 +0300 Subject: [PATCH] refactor(client): extract message media to separate type and file --- .../client/src/types/media/document-utils.ts | 2 +- .../src/types/messages/message-action.ts | 1 + .../src/types/messages/message-media.ts | 74 +++++++++++++++++++ packages/client/src/types/messages/message.ts | 72 +----------------- 4 files changed, 80 insertions(+), 69 deletions(-) create mode 100644 packages/client/src/types/messages/message-media.ts diff --git a/packages/client/src/types/media/document-utils.ts b/packages/client/src/types/media/document-utils.ts index 9c97d368..d3366773 100644 --- a/packages/client/src/types/media/document-utils.ts +++ b/packages/client/src/types/media/document-utils.ts @@ -6,7 +6,7 @@ import { Video } from './video' import { Voice } from './voice' import { Sticker } from './sticker' -/** @ignore */ +/** @internal */ export function parseDocument( client: TelegramClient, doc: tl.RawDocument diff --git a/packages/client/src/types/messages/message-action.ts b/packages/client/src/types/messages/message-action.ts index 2b9a252e..b7ea40b4 100644 --- a/packages/client/src/types/messages/message-action.ts +++ b/packages/client/src/types/messages/message-action.ts @@ -277,6 +277,7 @@ export type MessageAction = | MessageAction.ActionSetTtl | null +/** @internal */ export function _messageActionFromTl(act: tl.TypeMessageAction): MessageAction { switch (act._) { case 'messageActionChatCreate': diff --git a/packages/client/src/types/messages/message-media.ts b/packages/client/src/types/messages/message-media.ts new file mode 100644 index 00000000..5579cb6b --- /dev/null +++ b/packages/client/src/types/messages/message-media.ts @@ -0,0 +1,74 @@ +import { + Audio, + Contact, + Dice, + Document, + Game, + Invoice, + LiveLocation, + Location, + Photo, + Poll, + Sticker, + Venue, + Video, + Voice, + WebPage, +} from '../media' +import { tl } from '@mtcute/tl' +import { parseDocument } from '../media/document-utils' + +/** A media inside of a {@link Message} */ +export type MessageMedia = + | Photo + | Dice + | Contact + | Audio + | Voice + | Sticker + | Document + | Video + | Location + | LiveLocation + | Game + | WebPage + | Venue + | Poll + | Invoice + | null +// todo: successful_payment, connected_website + +/** @internal */ +export function _messageMediaFromTl(m: tl.TypeMessageMedia): MessageMedia { + switch (m._) { + case 'messageMediaPhoto': + if (!(m.photo?._ === 'photo')) return null + return new Photo(this.client, m.photo) + case 'messageMediaDice': + return new Dice(m) + case 'messageMediaContact': + return new Contact(m) + case 'messageMediaDocument': + if (!(m.document?._ === 'document')) return null + return parseDocument(this.client, m.document) + case 'messageMediaGeo': + if (!(m.geo._ === 'geoPoint')) return null + return new Location(this.client, m.geo) + case 'messageMediaGeoLive': + if (!(m.geo._ === 'geoPoint')) return null + return new LiveLocation(this.client, m) + case 'messageMediaGame': + return new Game(this.client, m.game) + case 'messageMediaWebPage': + if (!(m.webpage._ === 'webPage')) return null + return new WebPage(this.client, m.webpage) + case 'messageMediaVenue': + return new Venue(this.client, m) + case 'messageMediaPoll': + return new Poll(this.client, m.poll, this._users, m.results) + case 'messageMediaInvoice': + return new Invoice(this.client, m) + default: + return null + } +} diff --git a/packages/client/src/types/messages/message.ts b/packages/client/src/types/messages/message.ts index af137e12..692575e3 100644 --- a/packages/client/src/types/messages/message.ts +++ b/packages/client/src/types/messages/message.ts @@ -34,6 +34,7 @@ import { CallDiscardReason, } from '../calls/discard-reason' import { _messageActionFromTl, MessageAction } from './message-action' +import { _messageMediaFromTl, MessageMedia } from './message-media' /** * A message or a service message @@ -64,26 +65,6 @@ export namespace Message { */ signature?: string } - - // todo: venue, poll, invoice, successful_payment, - // connected_website - export type MessageMedia = - | Photo - | Dice - | Contact - | Audio - | Voice - | Sticker - | Document - | Video - | Location - | LiveLocation - | Game - | WebPage - | Venue - | Poll - | Invoice - | null } /** @@ -409,14 +390,14 @@ export class Message { return this._action } - private _media?: Message.MessageMedia + private _media?: MessageMedia /** * Message media. `null` for text-only and service messages * and for unsupported media types. * * For unsupported media types, use `.raw.media` directly. */ - get media(): Message.MessageMedia { + get media(): MessageMedia { if (this._media === undefined) { if ( this.raw._ === 'messageService' || @@ -425,52 +406,7 @@ export class Message { ) { this._media = null } else { - const m = this.raw.media - let media: Message.MessageMedia - if (m._ === 'messageMediaPhoto' && m.photo?._ === 'photo') { - media = new Photo(this.client, m.photo) - } else if (m._ === 'messageMediaDice') { - media = new Dice(m) - } else if (m._ === 'messageMediaContact') { - media = new Contact(m) - } else if ( - m._ === 'messageMediaDocument' && - m.document?._ === 'document' - ) { - media = parseDocument(this.client, m.document) - } else if ( - m._ === 'messageMediaGeo' && - m.geo._ === 'geoPoint' - ) { - media = new Location(this.client, m.geo) - } else if ( - m._ === 'messageMediaGeoLive' && - m.geo._ === 'geoPoint' - ) { - media = new LiveLocation(this.client, m) - } else if (m._ === 'messageMediaGame') { - media = new Game(this.client, m.game) - } else if ( - m._ === 'messageMediaWebPage' && - m.webpage._ === 'webPage' - ) { - media = new WebPage(this.client, m.webpage) - } else if (m._ === 'messageMediaVenue') { - media = new Venue(this.client, m) - } else if (m._ === 'messageMediaPoll') { - media = new Poll( - this.client, - m.poll, - this._users, - m.results - ) - } else if (m._ === 'messageMediaInvoice') { - media = new Invoice(this.client, m) - } else { - media = null - } - - this._media = media + this._media = _messageMediaFromTl(this.raw.media) } }