Hex Artifact Content
Logged in as anonymous

Artifact 57583491942125a84063734a0d939382fc744f992726dad54848d134a01deea0:


0000: 2f 2f 21 20 54 65 6c 65 67 72 61 6d 20 41 50 49  //! Telegram API
0010: 20 69 6e 74 65 67 72 61 74 69 6f 6e 20 66 6f 72   integration for
0020: 20 73 65 6e 64 69 6e 67 20 6d 65 73 73 61 67 65   sending message
0030: 73 20 61 6e 64 20 61 74 74 61 63 68 6d 65 6e 74  s and attachment
0040: 73 2e 0a 0a 75 73 65 20 63 72 61 74 65 3a 3a 75  s...use crate::u
0050: 74 69 6c 73 3a 3a 7b 0a 09 41 74 74 61 63 68 6d  tils::{..Attachm
0060: 65 6e 74 2c 0a 09 76 61 6c 69 64 61 74 65 2c 0a  ent,..validate,.
0070: 7d 3b 0a 0a 75 73 65 20 73 74 64 3a 3a 7b 0a 09  };..use std::{..
0080: 63 6f 6c 6c 65 63 74 69 6f 6e 73 3a 3a 48 61 73  collections::Has
0090: 68 4d 61 70 2c 0a 09 66 6d 74 3a 3a 44 65 62 75  hMap,..fmt::Debu
00a0: 67 2c 0a 7d 3b 0a 0a 75 73 65 20 73 74 61 63 6b  g,.};..use stack
00b0: 65 64 5f 65 72 72 6f 72 73 3a 3a 7b 0a 09 52 65  ed_errors::{..Re
00c0: 73 75 6c 74 2c 0a 09 53 74 61 63 6b 61 62 6c 65  sult,..Stackable
00d0: 45 72 72 2c 0a 7d 3b 0a 75 73 65 20 74 67 62 6f  Err,.};.use tgbo
00e0: 74 3a 3a 7b 0a 09 61 70 69 3a 3a 43 6c 69 65 6e  t::{..api::Clien
00f0: 74 2c 0a 09 74 79 70 65 73 3a 3a 7b 0a 09 09 43  t,..types::{...C
0100: 68 61 74 50 65 65 72 49 64 2c 0a 09 09 49 6e 70  hatPeerId,...Inp
0110: 75 74 46 69 6c 65 2c 0a 09 09 49 6e 70 75 74 46  utFile,...InputF
0120: 69 6c 65 52 65 61 64 65 72 2c 0a 09 09 49 6e 70  ileReader,...Inp
0130: 75 74 4d 65 64 69 61 44 6f 63 75 6d 65 6e 74 2c  utMediaDocument,
0140: 0a 09 09 4d 65 64 69 61 47 72 6f 75 70 2c 0a 09  ...MediaGroup,..
0150: 09 4d 65 64 69 61 47 72 6f 75 70 49 74 65 6d 2c  .MediaGroupItem,
0160: 0a 09 09 4d 65 73 73 61 67 65 2c 0a 09 09 50 61  ...Message,...Pa
0170: 72 73 65 4d 6f 64 65 3a 3a 48 74 6d 6c 2c 0a 09  rseMode::Html,..
0180: 09 53 65 6e 64 4d 65 64 69 61 47 72 6f 75 70 2c  .SendMediaGroup,
0190: 0a 09 09 53 65 6e 64 4d 65 73 73 61 67 65 2c 0a  ...SendMessage,.
01a0: 09 09 53 65 6e 64 44 6f 63 75 6d 65 6e 74 2c 0a  ..SendDocument,.
01b0: 09 7d 2c 0a 7d 3b 0a 0a 23 5b 64 65 72 69 76 65  .},.};..#[derive
01c0: 28 44 65 62 75 67 29 5d 0a 70 75 62 20 73 74 72  (Debug)].pub str
01d0: 75 63 74 20 54 65 6c 65 67 72 61 6d 54 72 61 6e  uct TelegramTran
01e0: 73 70 6f 72 74 20 7b 0a 09 74 67 3a 20 43 6c 69  sport {..tg: Cli
01f0: 65 6e 74 2c 0a 09 72 65 63 69 70 69 65 6e 74 73  ent,..recipients
0200: 3a 20 48 61 73 68 4d 61 70 3c 53 74 72 69 6e 67  : HashMap<String
0210: 2c 20 43 68 61 74 50 65 65 72 49 64 3e 2c 0a 09  , ChatPeerId>,..
0220: 70 75 62 20 64 65 66 61 75 6c 74 3a 20 43 68 61  pub default: Cha
0230: 74 50 65 65 72 49 64 2c 0a 7d 0a 0a 69 6d 70 6c  tPeerId,.}..impl
0240: 20 54 65 6c 65 67 72 61 6d 54 72 61 6e 73 70 6f   TelegramTranspo
0250: 72 74 20 7b 0a 09 2f 2f 2f 20 43 72 65 61 74 65  rt {../// Create
0260: 73 20 61 20 6e 65 77 20 60 54 65 6c 65 67 72 61  s a new `Telegra
0270: 6d 54 72 61 6e 73 70 6f 72 74 60 20 69 6e 73 74  mTransport` inst
0280: 61 6e 63 65 2e 0a 09 2f 2f 2f 0a 09 2f 2f 2f 20  ance...///../// 
0290: 23 20 41 72 67 75 6d 65 6e 74 73 0a 09 2f 2f 2f  # Arguments..///
02a0: 20 2a 20 60 61 70 69 5f 6b 65 79 60 20 2d 20 54   * `api_key` - T
02b0: 65 6c 65 67 72 61 6d 20 42 6f 74 20 41 50 49 20  elegram Bot API 
02c0: 74 6f 6b 65 6e 2e 0a 09 2f 2f 2f 20 2a 20 60 72  token.../// * `r
02d0: 65 63 69 70 69 65 6e 74 73 60 20 2d 20 4d 61 70  ecipients` - Map
02e0: 70 69 6e 67 20 6f 66 20 65 6d 61 69 6c 20 61 64  ping of email ad
02f0: 64 72 65 73 73 65 73 20 74 6f 20 54 65 6c 65 67  dresses to Teleg
0300: 72 61 6d 20 63 68 61 74 20 49 44 73 2e 0a 09 2f  ram chat IDs.../
0310: 2f 2f 20 2a 20 60 73 65 74 74 69 6e 67 73 60 20  // * `settings` 
0320: 2d 20 41 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6e  - Additional con
0330: 66 69 67 75 72 61 74 69 6f 6e 20 28 41 50 49 20  figuration (API 
0340: 67 61 74 65 77 61 79 2c 20 64 65 66 61 75 6c 74  gateway, default
0350: 20 63 68 61 74 29 2e 0a 09 2f 2f 2f 0a 09 2f 2f   chat)...///..//
0360: 2f 20 23 20 45 72 72 6f 72 73 0a 09 2f 2f 2f 20  / # Errors../// 
0370: 52 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  Returns an error
0380: 20 69 66 20 41 50 49 20 63 6c 69 65 6e 74 20 63   if API client c
0390: 72 65 61 74 69 6f 6e 20 66 61 69 6c 73 2e 0a 09  reation fails...
03a0: 70 75 62 20 66 6e 20 6e 65 77 20 28 61 70 69 5f  pub fn new (api_
03b0: 6b 65 79 3a 20 53 74 72 69 6e 67 2c 20 72 65 63  key: String, rec
03c0: 69 70 69 65 6e 74 73 3a 20 48 61 73 68 4d 61 70  ipients: HashMap
03d0: 3c 53 74 72 69 6e 67 2c 20 69 36 34 3e 2c 20 73  <String, i64>, s
03e0: 65 74 74 69 6e 67 73 3a 20 26 63 6f 6e 66 69 67  ettings: &config
03f0: 3a 3a 43 6f 6e 66 69 67 29 20 2d 3e 20 52 65 73  ::Config) -> Res
0400: 75 6c 74 3c 54 65 6c 65 67 72 61 6d 54 72 61 6e  ult<TelegramTran
0410: 73 70 6f 72 74 3e 20 7b 0a 09 09 6c 65 74 20 64  sport> {...let d
0420: 65 66 61 75 6c 74 20 3d 20 73 65 74 74 69 6e 67  efault = setting
0430: 73 2e 67 65 74 5f 69 6e 74 28 22 64 65 66 61 75  s.get_int("defau
0440: 6c 74 22 29 0a 09 09 09 2e 63 6f 6e 74 65 78 74  lt").....context
0450: 28 22 5b 73 6d 74 70 32 74 67 2e 74 6f 6d 6c 5d  ("[smtp2tg.toml]
0460: 20 6d 69 73 73 69 6e 67 20 5c 22 64 65 66 61 75   missing \"defau
0470: 6c 74 5c 22 20 72 65 63 69 70 69 65 6e 74 2e 5c  lt\" recipient.\
0480: 6e 22 29 3f 3b 0a 09 09 6c 65 74 20 61 70 69 5f  n")?;...let api_
0490: 67 61 74 65 77 61 79 20 3d 20 73 65 74 74 69 6e  gateway = settin
04a0: 67 73 2e 67 65 74 5f 73 74 72 69 6e 67 28 22 61  gs.get_string("a
04b0: 70 69 5f 67 61 74 65 77 61 79 22 29 0a 09 09 09  pi_gateway")....
04c0: 2e 63 6f 6e 74 65 78 74 28 22 5b 73 6d 74 70 32  .context("[smtp2
04d0: 74 67 2e 74 6f 6d 6c 5d 20 6d 69 73 73 69 6e 67  tg.toml] missing
04e0: 20 5c 22 61 70 69 5f 67 61 74 65 77 61 79 5c 22   \"api_gateway\"
04f0: 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 5c 6e 22   destination.\n"
0500: 29 3f 3b 0a 0a 09 09 6c 65 74 20 74 67 20 3d 20  )?;....let tg = 
0510: 43 6c 69 65 6e 74 3a 3a 6e 65 77 28 61 70 69 5f  Client::new(api_
0520: 6b 65 79 29 0a 09 09 09 2e 63 6f 6e 74 65 78 74  key).....context
0530: 28 22 46 61 69 6c 65 64 20 74 6f 20 63 72 65 61  ("Failed to crea
0540: 74 65 20 41 50 49 2e 5c 6e 22 29 3f 0a 09 09 09  te API.\n")?....
0550: 2e 77 69 74 68 5f 68 6f 73 74 28 61 70 69 5f 67  .with_host(api_g
0560: 61 74 65 77 61 79 29 3b 0a 09 09 6c 65 74 20 72  ateway);...let r
0570: 65 63 69 70 69 65 6e 74 73 20 3d 20 72 65 63 69  ecipients = reci
0580: 70 69 65 6e 74 73 2e 69 6e 74 6f 5f 69 74 65 72  pients.into_iter
0590: 28 29 0a 09 09 09 2e 6d 61 70 28 7c 28 61 2c 20  ().....map(|(a, 
05a0: 62 29 7c 20 28 61 2c 20 43 68 61 74 50 65 65 72  b)| (a, ChatPeer
05b0: 49 64 3a 3a 66 72 6f 6d 28 62 29 29 29 2e 63 6f  Id::from(b))).co
05c0: 6c 6c 65 63 74 28 29 3b 0a 09 09 6c 65 74 20 64  llect();...let d
05d0: 65 66 61 75 6c 74 20 3d 20 43 68 61 74 50 65 65  efault = ChatPee
05e0: 72 49 64 3a 3a 66 72 6f 6d 28 64 65 66 61 75 6c  rId::from(defaul
05f0: 74 29 3b 0a 0a 09 09 4f 6b 28 54 65 6c 65 67 72  t);....Ok(Telegr
0600: 61 6d 54 72 61 6e 73 70 6f 72 74 20 7b 0a 09 09  amTransport {...
0610: 09 74 67 2c 0a 09 09 09 72 65 63 69 70 69 65 6e  .tg,....recipien
0620: 74 73 2c 0a 09 09 09 64 65 66 61 75 6c 74 2c 0a  ts,....default,.
0630: 09 09 7d 29 0a 09 7d 0a 0a 09 2f 2f 2f 20 53 65  ..})..}.../// Se
0640: 6e 64 73 20 61 20 64 65 62 75 67 20 6d 65 73 73  nds a debug mess
0650: 61 67 65 20 74 6f 20 74 68 65 20 64 65 66 61 75  age to the defau
0660: 6c 74 20 63 68 61 74 2e 0a 09 2f 2f 2f 0a 09 2f  lt chat...///../
0670: 2f 2f 20 23 20 41 72 67 75 6d 65 6e 74 73 0a 09  // # Arguments..
0680: 2f 2f 2f 20 2a 20 60 6d 73 67 60 20 2d 20 4d 65  /// * `msg` - Me
0690: 73 73 61 67 65 20 74 65 78 74 20 74 6f 20 73 65  ssage text to se
06a0: 6e 64 2e 0a 09 2f 2f 2f 0a 09 2f 2f 2f 20 23 20  nd...///../// # 
06b0: 52 65 74 75 72 6e 73 0a 09 2f 2f 2f 20 2a 20 60  Returns../// * `
06c0: 52 65 73 75 6c 74 3c 4d 65 73 73 61 67 65 3e 60  Result<Message>`
06d0: 20 2d 20 54 65 6c 65 67 72 61 6d 20 41 50 49 20   - Telegram API 
06e0: 72 65 73 70 6f 6e 73 65 2e 0a 09 70 75 62 20 61  response...pub a
06f0: 73 79 6e 63 20 66 6e 20 64 65 62 75 67 20 28 26  sync fn debug (&
0700: 73 65 6c 66 2c 20 6d 73 67 3a 20 26 73 74 72 29  self, msg: &str)
0710: 20 2d 3e 20 52 65 73 75 6c 74 3c 4d 65 73 73 61   -> Result<Messa
0720: 67 65 3e 20 7b 0a 09 09 73 65 6c 66 2e 73 65 6e  ge> {...self.sen
0730: 64 28 26 73 65 6c 66 2e 64 65 66 61 75 6c 74 2c  d(&self.default,
0740: 20 66 6f 72 6d 61 74 21 28 22 3c 70 72 65 3e 7b   format!("<pre>{
0750: 7d 3c 2f 70 72 65 3e 22 2c 20 76 61 6c 69 64 61  }</pre>", valida
0760: 74 65 28 6d 73 67 29 2e 73 74 61 63 6b 28 29 3f  te(msg).stack()?
0770: 29 29 2e 61 77 61 69 74 0a 09 7d 0a 0a 09 2f 2f  )).await..}...//
0780: 2f 20 52 65 74 72 69 65 76 65 73 20 61 20 63 68  / Retrieves a ch
0790: 61 74 20 49 44 20 62 79 20 6e 61 6d 65 2e 0a 09  at ID by name...
07a0: 2f 2f 2f 0a 09 2f 2f 2f 20 23 20 41 72 67 75 6d  ///../// # Argum
07b0: 65 6e 74 73 0a 09 2f 2f 2f 20 2a 20 60 6e 61 6d  ents../// * `nam
07c0: 65 60 20 2d 20 4e 61 6d 65 20 6f 72 20 65 6d 61  e` - Name or ema
07d0: 69 6c 20 74 6f 20 6c 6f 6f 6b 20 75 70 2e 0a 09  il to look up...
07e0: 2f 2f 2f 0a 09 2f 2f 2f 20 23 20 52 65 74 75 72  ///../// # Retur
07f0: 6e 73 0a 09 2f 2f 2f 20 2a 20 60 52 65 73 75 6c  ns../// * `Resul
0800: 74 3c 26 43 68 61 74 50 65 65 72 49 64 3e 60 20  t<&ChatPeerId>` 
0810: 2d 20 43 68 61 74 20 49 44 20 69 66 20 66 6f 75  - Chat ID if fou
0820: 6e 64 2e 0a 09 70 75 62 20 66 6e 20 67 65 74 20  nd...pub fn get 
0830: 28 26 73 65 6c 66 2c 20 6e 61 6d 65 3a 20 26 73  (&self, name: &s
0840: 74 72 29 20 2d 3e 20 52 65 73 75 6c 74 3c 26 43  tr) -> Result<&C
0850: 68 61 74 50 65 65 72 49 64 3e 20 7b 0a 09 09 73  hatPeerId> {...s
0860: 65 6c 66 2e 72 65 63 69 70 69 65 6e 74 73 2e 67  elf.recipients.g
0870: 65 74 28 6e 61 6d 65 29 0a 09 09 09 2e 77 69 74  et(name).....wit
0880: 68 5f 63 6f 6e 74 65 78 74 28 7c 7c 20 66 6f 72  h_context(|| for
0890: 6d 61 74 21 28 22 52 65 63 69 70 69 65 6e 74 20  mat!("Recipient 
08a0: 5c 22 7b 6e 61 6d 65 7d 5c 22 20 6e 6f 74 20 66  \"{name}\" not f
08b0: 6f 75 6e 64 20 69 6e 20 63 6f 6e 66 69 67 75 72  ound in configur
08c0: 61 74 69 6f 6e 22 29 29 0a 09 7d 0a 0a 09 2f 2f  ation"))..}...//
08d0: 2f 20 53 65 6e 64 73 20 61 20 74 65 78 74 20 6d  / Sends a text m
08e0: 65 73 73 61 67 65 20 74 6f 20 61 20 73 70 65 63  essage to a spec
08f0: 69 66 69 65 64 20 63 68 61 74 2e 0a 09 2f 2f 2f  ified chat...///
0900: 0a 09 2f 2f 2f 20 23 20 41 72 67 75 6d 65 6e 74  ../// # Argument
0910: 73 0a 09 2f 2f 2f 20 2a 20 60 74 6f 60 20 2d 20  s../// * `to` - 
0920: 54 61 72 67 65 74 20 63 68 61 74 20 49 44 2e 0a  Target chat ID..
0930: 09 2f 2f 2f 20 2a 20 60 6d 73 67 60 20 2d 20 4d  ./// * `msg` - M
0940: 65 73 73 61 67 65 20 74 65 78 74 20 28 73 75 70  essage text (sup
0950: 70 6f 72 74 73 20 48 54 4d 4c 20 66 6f 72 6d 61  ports HTML forma
0960: 74 74 69 6e 67 29 2e 0a 09 2f 2f 2f 0a 09 2f 2f  tting)...///..//
0970: 2f 20 23 20 52 65 74 75 72 6e 73 0a 09 2f 2f 2f  / # Returns..///
0980: 20 2a 20 60 52 65 73 75 6c 74 3c 4d 65 73 73 61   * `Result<Messa
0990: 67 65 3e 60 20 2d 20 54 65 6c 65 67 72 61 6d 20  ge>` - Telegram 
09a0: 41 50 49 20 72 65 73 70 6f 6e 73 65 2e 0a 09 70  API response...p
09b0: 75 62 20 61 73 79 6e 63 20 66 6e 20 73 65 6e 64  ub async fn send
09c0: 20 3c 53 3e 20 28 26 73 65 6c 66 2c 20 74 6f 3a   <S> (&self, to:
09d0: 20 26 43 68 61 74 50 65 65 72 49 64 2c 20 6d 73   &ChatPeerId, ms
09e0: 67 3a 20 53 29 20 2d 3e 20 52 65 73 75 6c 74 3c  g: S) -> Result<
09f0: 4d 65 73 73 61 67 65 3e 0a 09 77 68 65 72 65 20  Message>..where 
0a00: 53 3a 20 49 6e 74 6f 3c 53 74 72 69 6e 67 3e 20  S: Into<String> 
0a10: 2b 20 44 65 62 75 67 7b 0a 09 09 73 65 6c 66 2e  + Debug{...self.
0a20: 74 67 2e 65 78 65 63 75 74 65 28 0a 09 09 09 53  tg.execute(....S
0a30: 65 6e 64 4d 65 73 73 61 67 65 3a 3a 6e 65 77 28  endMessage::new(
0a40: 2a 74 6f 2c 20 6d 73 67 29 0a 09 09 09 2e 77 69  *to, msg).....wi
0a50: 74 68 5f 70 61 72 73 65 5f 6d 6f 64 65 28 48 74  th_parse_mode(Ht
0a60: 6d 6c 29 0a 09 09 29 2e 61 77 61 69 74 2e 73 74  ml)...).await.st
0a70: 61 63 6b 28 29 0a 09 7d 0a 0a 09 2f 2f 2f 20 53  ack()..}.../// S
0a80: 65 6e 64 73 20 61 20 6d 65 73 73 61 67 65 20 77  ends a message w
0a90: 69 74 68 20 61 74 74 61 63 68 6d 65 6e 74 73 20  ith attachments 
0aa0: 74 6f 20 61 20 73 70 65 63 69 66 69 65 64 20 63  to a specified c
0ab0: 68 61 74 2e 0a 09 2f 2f 2f 0a 09 2f 2f 2f 20 23  hat...///../// #
0ac0: 20 41 72 67 75 6d 65 6e 74 73 0a 09 2f 2f 2f 20   Arguments../// 
0ad0: 2a 20 60 74 6f 60 20 2d 20 54 61 72 67 65 74 20  * `to` - Target 
0ae0: 63 68 61 74 20 49 44 2e 0a 09 2f 2f 2f 20 2a 20  chat ID.../// * 
0af0: 60 6d 65 64 69 61 60 20 2d 20 4c 69 73 74 20 6f  `media` - List o
0b00: 66 20 61 74 74 61 63 68 6d 65 6e 74 73 2e 0a 09  f attachments...
0b10: 2f 2f 2f 20 2a 20 60 6d 73 67 60 20 2d 20 4d 65  /// * `msg` - Me
0b20: 73 73 61 67 65 20 74 65 78 74 20 28 73 75 70 70  ssage text (supp
0b30: 6f 72 74 73 20 48 54 4d 4c 20 66 6f 72 6d 61 74  orts HTML format
0b40: 74 69 6e 67 29 2e 0a 09 2f 2f 2f 0a 09 2f 2f 2f  ting)...///..///
0b50: 20 23 20 52 65 74 75 72 6e 73 0a 09 2f 2f 2f 20   # Returns../// 
0b60: 2a 20 60 52 65 73 75 6c 74 3c 28 29 3e 60 20 2d  * `Result<()>` -
0b70: 20 53 75 63 63 65 73 73 20 6f 72 20 65 72 72 6f   Success or erro
0b80: 72 2e 0a 09 70 75 62 20 61 73 79 6e 63 20 66 6e  r...pub async fn
0b90: 20 73 65 6e 64 67 72 6f 75 70 20 28 26 73 65 6c   sendgroup (&sel
0ba0: 66 2c 20 74 6f 3a 20 26 43 68 61 74 50 65 65 72  f, to: &ChatPeer
0bb0: 49 64 2c 20 6d 65 64 69 61 3a 20 56 65 63 3c 41  Id, media: Vec<A
0bc0: 74 74 61 63 68 6d 65 6e 74 3e 2c 20 6d 73 67 3a  ttachment>, msg:
0bd0: 20 26 73 74 72 29 20 2d 3e 20 52 65 73 75 6c 74   &str) -> Result
0be0: 3c 28 29 3e 20 7b 0a 09 09 69 66 20 6d 65 64 69  <()> {...if medi
0bf0: 61 2e 6c 65 6e 28 29 20 3e 20 31 20 7b 0a 09 09  a.len() > 1 {...
0c00: 09 6c 65 74 20 6d 75 74 20 61 74 74 61 63 68 20  .let mut attach 
0c10: 3d 20 76 65 63 21 5b 5d 3b 0a 09 09 09 6c 65 74  = vec![];....let
0c20: 20 6d 75 74 20 70 6f 73 20 3d 20 6d 65 64 69 61   mut pos = media
0c30: 2e 6c 65 6e 28 29 3b 0a 09 09 09 66 6f 72 20 66  .len();....for f
0c40: 69 6c 65 20 69 6e 20 6d 65 64 69 61 20 7b 0a 09  ile in media {..
0c50: 09 09 09 6c 65 74 20 6d 75 74 20 63 61 70 74 69  ...let mut capti
0c60: 6f 6e 20 3d 20 49 6e 70 75 74 4d 65 64 69 61 44  on = InputMediaD
0c70: 6f 63 75 6d 65 6e 74 3a 3a 64 65 66 61 75 6c 74  ocument::default
0c80: 28 29 3b 0a 09 09 09 09 69 66 20 70 6f 73 20 3d  ();.....if pos =
0c90: 3d 20 31 20 7b 0a 09 09 09 09 09 63 61 70 74 69  = 1 {......capti
0ca0: 6f 6e 20 3d 20 63 61 70 74 69 6f 6e 2e 77 69 74  on = caption.wit
0cb0: 68 5f 63 61 70 74 69 6f 6e 28 6d 73 67 29 0a 09  h_caption(msg)..
0cc0: 09 09 09 09 09 2e 77 69 74 68 5f 63 61 70 74 69  ......with_capti
0cd0: 6f 6e 5f 70 61 72 73 65 5f 6d 6f 64 65 28 48 74  on_parse_mode(Ht
0ce0: 6d 6c 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09 70  ml);.....}.....p
0cf0: 6f 73 20 2d 3d 20 31 3b 0a 09 09 09 09 61 74 74  os -= 1;.....att
0d00: 61 63 68 2e 70 75 73 68 28 0a 09 09 09 09 09 4d  ach.push(......M
0d10: 65 64 69 61 47 72 6f 75 70 49 74 65 6d 3a 3a 66  ediaGroupItem::f
0d20: 6f 72 5f 64 6f 63 75 6d 65 6e 74 28 0a 09 09 09  or_document(....
0d30: 09 09 09 49 6e 70 75 74 46 69 6c 65 3a 3a 66 72  ...InputFile::fr
0d40: 6f 6d 28 0a 09 09 09 09 09 09 09 49 6e 70 75 74  om(........Input
0d50: 46 69 6c 65 52 65 61 64 65 72 3a 3a 66 72 6f 6d  FileReader::from
0d60: 28 66 69 6c 65 2e 64 61 74 61 29 0a 09 09 09 09  (file.data).....
0d70: 09 09 09 09 2e 77 69 74 68 5f 66 69 6c 65 5f 6e  .....with_file_n
0d80: 61 6d 65 28 66 69 6c 65 2e 6e 61 6d 65 29 0a 09  ame(file.name)..
0d90: 09 09 09 09 09 29 2c 0a 09 09 09 09 09 09 63 61  .....),.......ca
0da0: 70 74 69 6f 6e 0a 09 09 09 09 09 29 0a 09 09 09  ption......)....
0db0: 09 29 3b 0a 09 09 09 7d 0a 09 09 09 73 65 6c 66  .);....}....self
0dc0: 2e 74 67 2e 65 78 65 63 75 74 65 28 53 65 6e 64  .tg.execute(Send
0dd0: 4d 65 64 69 61 47 72 6f 75 70 3a 3a 6e 65 77 28  MediaGroup::new(
0de0: 2a 74 6f 2c 20 4d 65 64 69 61 47 72 6f 75 70 3a  *to, MediaGroup:
0df0: 3a 6e 65 77 28 61 74 74 61 63 68 29 2e 73 74 61  :new(attach).sta
0e00: 63 6b 28 29 3f 29 29 2e 61 77 61 69 74 2e 73 74  ck()?)).await.st
0e10: 61 63 6b 28 29 3f 3b 0a 09 09 7d 20 65 6c 73 65  ack()?;...} else
0e20: 20 7b 0a 09 09 09 73 65 6c 66 2e 74 67 2e 65 78   {....self.tg.ex
0e30: 65 63 75 74 65 28 0a 09 09 09 09 53 65 6e 64 44  ecute(.....SendD
0e40: 6f 63 75 6d 65 6e 74 3a 3a 6e 65 77 28 0a 09 09  ocument::new(...
0e50: 09 09 09 2a 74 6f 2c 0a 09 09 09 09 09 49 6e 70  ...*to,......Inp
0e60: 75 74 46 69 6c 65 52 65 61 64 65 72 3a 3a 66 72  utFileReader::fr
0e70: 6f 6d 28 6d 65 64 69 61 5b 30 5d 2e 64 61 74 61  om(media[0].data
0e80: 2e 63 6c 6f 6e 65 28 29 29 0a 09 09 09 09 09 2e  .clone()).......
0e90: 77 69 74 68 5f 66 69 6c 65 5f 6e 61 6d 65 28 6d  with_file_name(m
0ea0: 65 64 69 61 5b 30 5d 2e 6e 61 6d 65 2e 63 6c 6f  edia[0].name.clo
0eb0: 6e 65 28 29 29 0a 09 09 09 09 29 2e 77 69 74 68  ne()).....).with
0ec0: 5f 63 61 70 74 69 6f 6e 28 6d 73 67 29 0a 09 09  _caption(msg)...
0ed0: 09 09 2e 77 69 74 68 5f 63 61 70 74 69 6f 6e 5f  ...with_caption_
0ee0: 70 61 72 73 65 5f 6d 6f 64 65 28 48 74 6d 6c 29  parse_mode(Html)
0ef0: 0a 09 09 09 29 2e 61 77 61 69 74 2e 73 74 61 63  ....).await.stac
0f00: 6b 28 29 3f 3b 0a 09 09 7d 0a 09 09 4f 6b 28 28  k()?;...}...Ok((
0f10: 29 29 0a 09 7d 0a 7d 0a                          ))..}.}.