refactor(client): extract message media to separate type and file
This commit is contained in:
parent
fe0f0849a4
commit
9df635ad92
4 changed files with 80 additions and 69 deletions
|
@ -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
|
||||
|
|
|
@ -277,6 +277,7 @@ export type MessageAction =
|
|||
| MessageAction.ActionSetTtl
|
||||
| null
|
||||
|
||||
/** @internal */
|
||||
export function _messageActionFromTl(act: tl.TypeMessageAction): MessageAction {
|
||||
switch (act._) {
|
||||
case 'messageActionChatCreate':
|
||||
|
|
74
packages/client/src/types/messages/message-media.ts
Normal file
74
packages/client/src/types/messages/message-media.ts
Normal 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
|
||||
}
|
||||
}
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue