refactor(client): extract message media to separate type and file

This commit is contained in:
teidesu 2021-05-10 17:04:46 +03:00
parent fe0f0849a4
commit 9df635ad92
4 changed files with 80 additions and 69 deletions

View file

@ -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

View file

@ -277,6 +277,7 @@ export type MessageAction =
| MessageAction.ActionSetTtl
| null
/** @internal */
export function _messageActionFromTl(act: tl.TypeMessageAction): MessageAction {
switch (act._) {
case 'messageActionChatCreate':

View file

@ -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
}
}

View file

@ -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)
}
}