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 { Voice } from './voice'
|
||||||
import { Sticker } from './sticker'
|
import { Sticker } from './sticker'
|
||||||
|
|
||||||
/** @ignore */
|
/** @internal */
|
||||||
export function parseDocument(
|
export function parseDocument(
|
||||||
client: TelegramClient,
|
client: TelegramClient,
|
||||||
doc: tl.RawDocument
|
doc: tl.RawDocument
|
||||||
|
|
|
@ -277,6 +277,7 @@ export type MessageAction =
|
||||||
| MessageAction.ActionSetTtl
|
| MessageAction.ActionSetTtl
|
||||||
| null
|
| null
|
||||||
|
|
||||||
|
/** @internal */
|
||||||
export function _messageActionFromTl(act: tl.TypeMessageAction): MessageAction {
|
export function _messageActionFromTl(act: tl.TypeMessageAction): MessageAction {
|
||||||
switch (act._) {
|
switch (act._) {
|
||||||
case 'messageActionChatCreate':
|
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,
|
CallDiscardReason,
|
||||||
} from '../calls/discard-reason'
|
} from '../calls/discard-reason'
|
||||||
import { _messageActionFromTl, MessageAction } from './message-action'
|
import { _messageActionFromTl, MessageAction } from './message-action'
|
||||||
|
import { _messageMediaFromTl, MessageMedia } from './message-media'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A message or a service message
|
* A message or a service message
|
||||||
|
@ -64,26 +65,6 @@ export namespace Message {
|
||||||
*/
|
*/
|
||||||
signature?: string
|
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
|
return this._action
|
||||||
}
|
}
|
||||||
|
|
||||||
private _media?: Message.MessageMedia
|
private _media?: MessageMedia
|
||||||
/**
|
/**
|
||||||
* Message media. `null` for text-only and service messages
|
* Message media. `null` for text-only and service messages
|
||||||
* and for unsupported media types.
|
* and for unsupported media types.
|
||||||
*
|
*
|
||||||
* For unsupported media types, use `.raw.media` directly.
|
* For unsupported media types, use `.raw.media` directly.
|
||||||
*/
|
*/
|
||||||
get media(): Message.MessageMedia {
|
get media(): MessageMedia {
|
||||||
if (this._media === undefined) {
|
if (this._media === undefined) {
|
||||||
if (
|
if (
|
||||||
this.raw._ === 'messageService' ||
|
this.raw._ === 'messageService' ||
|
||||||
|
@ -425,52 +406,7 @@ export class Message {
|
||||||
) {
|
) {
|
||||||
this._media = null
|
this._media = null
|
||||||
} else {
|
} else {
|
||||||
const m = this.raw.media
|
this._media = _messageMediaFromTl(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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue