Hex Artifact Content
Logged in as anonymous

Artifact 9286def5b595dc5ae1eaf27b99762d58815a3f643cd8e98c9bd6c089adcf44ff:


0000: 75 73 65 20 63 72 61 74 65 3a 3a 75 74 69 6c 73  use crate::utils
0010: 3a 3a 41 74 74 61 63 68 6d 65 6e 74 3b 0a 0a 75  ::Attachment;..u
0020: 73 65 20 73 74 64 3a 3a 7b 0a 09 63 6f 6c 6c 65  se std::{..colle
0030: 63 74 69 6f 6e 73 3a 3a 48 61 73 68 4d 61 70 2c  ctions::HashMap,
0040: 0a 09 66 6d 74 3a 3a 44 65 62 75 67 2c 0a 7d 3b  ..fmt::Debug,.};
0050: 0a 0a 75 73 65 20 73 74 61 63 6b 65 64 5f 65 72  ..use stacked_er
0060: 72 6f 72 73 3a 3a 7b 0a 09 52 65 73 75 6c 74 2c  rors::{..Result,
0070: 0a 09 53 74 61 63 6b 61 62 6c 65 45 72 72 2c 0a  ..StackableErr,.
0080: 7d 3b 0a 75 73 65 20 74 67 62 6f 74 3a 3a 7b 0a  };.use tgbot::{.
0090: 09 61 70 69 3a 3a 43 6c 69 65 6e 74 2c 0a 09 74  .api::Client,..t
00a0: 79 70 65 73 3a 3a 7b 0a 09 09 43 68 61 74 50 65  ypes::{...ChatPe
00b0: 65 72 49 64 2c 0a 09 09 49 6e 70 75 74 46 69 6c  erId,...InputFil
00c0: 65 2c 0a 09 09 49 6e 70 75 74 46 69 6c 65 52 65  e,...InputFileRe
00d0: 61 64 65 72 2c 0a 09 09 49 6e 70 75 74 4d 65 64  ader,...InputMed
00e0: 69 61 44 6f 63 75 6d 65 6e 74 2c 0a 09 09 4d 65  iaDocument,...Me
00f0: 64 69 61 47 72 6f 75 70 2c 0a 09 09 4d 65 64 69  diaGroup,...Medi
0100: 61 47 72 6f 75 70 49 74 65 6d 2c 0a 09 09 4d 65  aGroupItem,...Me
0110: 73 73 61 67 65 2c 0a 09 09 50 61 72 73 65 4d 6f  ssage,...ParseMo
0120: 64 65 3a 3a 48 74 6d 6c 2c 0a 09 09 53 65 6e 64  de::Html,...Send
0130: 4d 65 64 69 61 47 72 6f 75 70 2c 0a 09 09 53 65  MediaGroup,...Se
0140: 6e 64 4d 65 73 73 61 67 65 2c 0a 09 09 53 65 6e  ndMessage,...Sen
0150: 64 44 6f 63 75 6d 65 6e 74 2c 0a 09 7d 2c 0a 7d  dDocument,..},.}
0160: 3b 0a 0a 23 5b 64 65 72 69 76 65 28 44 65 62 75  ;..#[derive(Debu
0170: 67 29 5d 0a 70 75 62 20 73 74 72 75 63 74 20 54  g)].pub struct T
0180: 65 6c 65 67 72 61 6d 54 72 61 6e 73 70 6f 72 74  elegramTransport
0190: 20 7b 0a 09 74 67 3a 20 43 6c 69 65 6e 74 2c 0a   {..tg: Client,.
01a0: 09 72 65 63 69 70 69 65 6e 74 73 3a 20 48 61 73  .recipients: Has
01b0: 68 4d 61 70 3c 53 74 72 69 6e 67 2c 20 43 68 61  hMap<String, Cha
01c0: 74 50 65 65 72 49 64 3e 2c 0a 09 70 75 62 20 64  tPeerId>,..pub d
01d0: 65 66 61 75 6c 74 3a 20 43 68 61 74 50 65 65 72  efault: ChatPeer
01e0: 49 64 2c 0a 7d 0a 0a 69 6d 70 6c 20 54 65 6c 65  Id,.}..impl Tele
01f0: 67 72 61 6d 54 72 61 6e 73 70 6f 72 74 20 7b 0a  gramTransport {.
0200: 09 2f 2f 2f 20 43 72 65 61 74 65 73 20 6e 65 77  ./// Creates new
0210: 20 54 65 6c 65 67 72 61 6d 54 72 61 6e 73 70 6f   TelegramTranspo
0220: 72 74 20 6f 62 6a 65 63 74 2e 0a 09 70 75 62 20  rt object...pub 
0230: 66 6e 20 6e 65 77 20 28 61 70 69 5f 6b 65 79 3a  fn new (api_key:
0240: 20 53 74 72 69 6e 67 2c 20 72 65 63 69 70 69 65   String, recipie
0250: 6e 74 73 3a 20 48 61 73 68 4d 61 70 3c 53 74 72  nts: HashMap<Str
0260: 69 6e 67 2c 20 69 36 34 3e 2c 20 73 65 74 74 69  ing, i64>, setti
0270: 6e 67 73 3a 20 26 63 6f 6e 66 69 67 3a 3a 43 6f  ngs: &config::Co
0280: 6e 66 69 67 29 20 2d 3e 20 52 65 73 75 6c 74 3c  nfig) -> Result<
0290: 54 65 6c 65 67 72 61 6d 54 72 61 6e 73 70 6f 72  TelegramTranspor
02a0: 74 3e 20 7b 0a 09 09 6c 65 74 20 64 65 66 61 75  t> {...let defau
02b0: 6c 74 20 3d 20 73 65 74 74 69 6e 67 73 2e 67 65  lt = settings.ge
02c0: 74 5f 69 6e 74 28 22 64 65 66 61 75 6c 74 22 29  t_int("default")
02d0: 0a 09 09 09 2e 63 6f 6e 74 65 78 74 28 22 5b 73  .....context("[s
02e0: 6d 74 70 32 74 67 2e 74 6f 6d 6c 5d 20 6d 69 73  mtp2tg.toml] mis
02f0: 73 69 6e 67 20 5c 22 64 65 66 61 75 6c 74 5c 22  sing \"default\"
0300: 20 72 65 63 69 70 69 65 6e 74 2e 5c 6e 22 29 3f   recipient.\n")?
0310: 3b 0a 09 09 6c 65 74 20 61 70 69 5f 67 61 74 65  ;...let api_gate
0320: 77 61 79 20 3d 20 73 65 74 74 69 6e 67 73 2e 67  way = settings.g
0330: 65 74 5f 73 74 72 69 6e 67 28 22 61 70 69 5f 67  et_string("api_g
0340: 61 74 65 77 61 79 22 29 0a 09 09 09 2e 63 6f 6e  ateway").....con
0350: 74 65 78 74 28 22 5b 73 6d 74 70 32 74 67 2e 74  text("[smtp2tg.t
0360: 6f 6d 6c 5d 20 6d 69 73 73 69 6e 67 20 5c 22 61  oml] missing \"a
0370: 70 69 5f 67 61 74 65 77 61 79 5c 22 20 64 65 73  pi_gateway\" des
0380: 74 69 6e 61 74 69 6f 6e 2e 5c 6e 22 29 3f 3b 0a  tination.\n")?;.
0390: 0a 09 09 6c 65 74 20 74 67 20 3d 20 43 6c 69 65  ...let tg = Clie
03a0: 6e 74 3a 3a 6e 65 77 28 61 70 69 5f 6b 65 79 29  nt::new(api_key)
03b0: 0a 09 09 09 2e 63 6f 6e 74 65 78 74 28 22 46 61  .....context("Fa
03c0: 69 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 41  iled to create A
03d0: 50 49 2e 5c 6e 22 29 3f 0a 09 09 09 2e 77 69 74  PI.\n")?.....wit
03e0: 68 5f 68 6f 73 74 28 61 70 69 5f 67 61 74 65 77  h_host(api_gatew
03f0: 61 79 29 3b 0a 09 09 6c 65 74 20 72 65 63 69 70  ay);...let recip
0400: 69 65 6e 74 73 20 3d 20 72 65 63 69 70 69 65 6e  ients = recipien
0410: 74 73 2e 69 6e 74 6f 5f 69 74 65 72 28 29 0a 09  ts.into_iter()..
0420: 09 09 2e 6d 61 70 28 7c 28 61 2c 20 62 29 7c 20  ...map(|(a, b)| 
0430: 28 61 2c 20 43 68 61 74 50 65 65 72 49 64 3a 3a  (a, ChatPeerId::
0440: 66 72 6f 6d 28 62 29 29 29 2e 63 6f 6c 6c 65 63  from(b))).collec
0450: 74 28 29 3b 0a 09 09 6c 65 74 20 64 65 66 61 75  t();...let defau
0460: 6c 74 20 3d 20 43 68 61 74 50 65 65 72 49 64 3a  lt = ChatPeerId:
0470: 3a 66 72 6f 6d 28 64 65 66 61 75 6c 74 29 3b 0a  :from(default);.
0480: 0a 09 09 4f 6b 28 54 65 6c 65 67 72 61 6d 54 72  ...Ok(TelegramTr
0490: 61 6e 73 70 6f 72 74 20 7b 0a 09 09 09 74 67 2c  ansport {....tg,
04a0: 0a 09 09 09 72 65 63 69 70 69 65 6e 74 73 2c 0a  ....recipients,.
04b0: 09 09 09 64 65 66 61 75 6c 74 2c 0a 09 09 7d 29  ...default,...})
04c0: 0a 09 7d 0a 0a 09 2f 2f 2f 20 53 65 6e 64 20 6d  ..}.../// Send m
04d0: 65 73 73 61 67 65 20 74 6f 20 64 65 66 61 75 6c  essage to defaul
04e0: 74 20 75 73 65 72 2c 20 75 73 65 64 20 66 6f 72  t user, used for
04f0: 20 64 65 62 75 67 2f 6c 6f 67 2f 69 6e 66 6f 20   debug/log/info 
0500: 70 75 72 70 6f 73 65 73 0a 09 70 75 62 20 61 73  purposes..pub as
0510: 79 6e 63 20 66 6e 20 64 65 62 75 67 20 28 26 73  ync fn debug (&s
0520: 65 6c 66 2c 20 6d 73 67 3a 20 26 73 74 72 29 20  elf, msg: &str) 
0530: 2d 3e 20 52 65 73 75 6c 74 3c 4d 65 73 73 61 67  -> Result<Messag
0540: 65 3e 20 7b 0a 09 09 73 65 6c 66 2e 73 65 6e 64  e> {...self.send
0550: 28 26 73 65 6c 66 2e 64 65 66 61 75 6c 74 2c 20  (&self.default, 
0560: 66 6f 72 6d 61 74 21 28 22 3c 70 72 65 3e 7b 6d  format!("<pre>{m
0570: 73 67 7d 3c 2f 70 72 65 3e 22 29 29 2e 61 77 61  sg}</pre>")).awa
0580: 69 74 0a 09 7d 0a 0a 09 2f 2f 2f 20 47 65 74 20  it..}.../// Get 
0590: 72 65 63 69 70 69 65 6e 74 20 62 79 20 61 64 64  recipient by add
05a0: 72 65 73 73 0a 09 70 75 62 20 66 6e 20 67 65 74  ress..pub fn get
05b0: 20 28 26 73 65 6c 66 2c 20 6e 61 6d 65 3a 20 26   (&self, name: &
05c0: 73 74 72 29 20 2d 3e 20 52 65 73 75 6c 74 3c 26  str) -> Result<&
05d0: 43 68 61 74 50 65 65 72 49 64 3e 20 7b 0a 09 09  ChatPeerId> {...
05e0: 73 65 6c 66 2e 72 65 63 69 70 69 65 6e 74 73 2e  self.recipients.
05f0: 67 65 74 28 6e 61 6d 65 29 0a 09 09 09 2e 77 69  get(name).....wi
0600: 74 68 5f 63 6f 6e 74 65 78 74 28 7c 7c 20 66 6f  th_context(|| fo
0610: 72 6d 61 74 21 28 22 52 65 63 69 70 69 65 6e 74  rmat!("Recipient
0620: 20 5c 22 7b 6e 61 6d 65 7d 5c 22 20 6e 6f 74 20   \"{name}\" not 
0630: 66 6f 75 6e 64 20 69 6e 20 63 6f 6e 66 69 67 75  found in configu
0640: 72 61 74 69 6f 6e 22 29 29 0a 09 7d 0a 0a 09 2f  ration"))..}.../
0650: 2f 2f 20 53 65 6e 64 20 6d 65 73 73 61 67 65 20  // Send message 
0660: 74 6f 20 73 70 65 63 69 66 69 65 64 20 75 73 65  to specified use
0670: 72 0a 09 70 75 62 20 61 73 79 6e 63 20 66 6e 20  r..pub async fn 
0680: 73 65 6e 64 20 3c 53 3e 20 28 26 73 65 6c 66 2c  send <S> (&self,
0690: 20 74 6f 3a 20 26 43 68 61 74 50 65 65 72 49 64   to: &ChatPeerId
06a0: 2c 20 6d 73 67 3a 20 53 29 20 2d 3e 20 52 65 73  , msg: S) -> Res
06b0: 75 6c 74 3c 4d 65 73 73 61 67 65 3e 0a 09 77 68  ult<Message>..wh
06c0: 65 72 65 20 53 3a 20 49 6e 74 6f 3c 53 74 72 69  ere S: Into<Stri
06d0: 6e 67 3e 20 2b 20 44 65 62 75 67 7b 0a 09 09 73  ng> + Debug{...s
06e0: 65 6c 66 2e 74 67 2e 65 78 65 63 75 74 65 28 0a  elf.tg.execute(.
06f0: 09 09 09 53 65 6e 64 4d 65 73 73 61 67 65 3a 3a  ...SendMessage::
0700: 6e 65 77 28 2a 74 6f 2c 20 6d 73 67 29 0a 09 09  new(*to, msg)...
0710: 09 2e 77 69 74 68 5f 70 61 72 73 65 5f 6d 6f 64  ..with_parse_mod
0720: 65 28 48 74 6d 6c 29 0a 09 09 29 2e 61 77 61 69  e(Html)...).awai
0730: 74 2e 73 74 61 63 6b 28 29 0a 09 7d 0a 0a 09 2f  t.stack()..}.../
0740: 2f 2f 20 53 65 6e 64 20 6d 65 64 69 61 20 74 6f  // Send media to
0750: 20 73 70 65 63 69 66 69 65 64 20 75 73 65 72 0a   specified user.
0760: 09 70 75 62 20 61 73 79 6e 63 20 66 6e 20 73 65  .pub async fn se
0770: 6e 64 67 72 6f 75 70 20 28 26 73 65 6c 66 2c 20  ndgroup (&self, 
0780: 74 6f 3a 20 26 43 68 61 74 50 65 65 72 49 64 2c  to: &ChatPeerId,
0790: 20 6d 65 64 69 61 3a 20 56 65 63 3c 41 74 74 61   media: Vec<Atta
07a0: 63 68 6d 65 6e 74 3e 2c 20 6d 73 67 3a 20 26 73  chment>, msg: &s
07b0: 74 72 29 20 2d 3e 20 52 65 73 75 6c 74 3c 28 29  tr) -> Result<()
07c0: 3e 20 7b 0a 09 09 69 66 20 6d 65 64 69 61 2e 6c  > {...if media.l
07d0: 65 6e 28 29 20 3e 20 31 20 7b 0a 09 09 09 6c 65  en() > 1 {....le
07e0: 74 20 6d 75 74 20 61 74 74 61 63 68 20 3d 20 76  t mut attach = v
07f0: 65 63 21 5b 5d 3b 0a 09 09 09 6c 65 74 20 6d 75  ec![];....let mu
0800: 74 20 70 6f 73 20 3d 20 6d 65 64 69 61 2e 6c 65  t pos = media.le
0810: 6e 28 29 3b 0a 09 09 09 66 6f 72 20 66 69 6c 65  n();....for file
0820: 20 69 6e 20 6d 65 64 69 61 20 7b 0a 09 09 09 09   in media {.....
0830: 6c 65 74 20 6d 75 74 20 63 61 70 74 69 6f 6e 20  let mut caption 
0840: 3d 20 49 6e 70 75 74 4d 65 64 69 61 44 6f 63 75  = InputMediaDocu
0850: 6d 65 6e 74 3a 3a 64 65 66 61 75 6c 74 28 29 3b  ment::default();
0860: 0a 09 09 09 09 69 66 20 70 6f 73 20 3d 3d 20 31  .....if pos == 1
0870: 20 7b 0a 09 09 09 09 09 63 61 70 74 69 6f 6e 20   {......caption 
0880: 3d 20 63 61 70 74 69 6f 6e 2e 77 69 74 68 5f 63  = caption.with_c
0890: 61 70 74 69 6f 6e 28 6d 73 67 29 0a 09 09 09 09  aption(msg).....
08a0: 09 09 2e 77 69 74 68 5f 63 61 70 74 69 6f 6e 5f  ...with_caption_
08b0: 70 61 72 73 65 5f 6d 6f 64 65 28 48 74 6d 6c 29  parse_mode(Html)
08c0: 3b 0a 09 09 09 09 7d 0a 09 09 09 09 70 6f 73 20  ;.....}.....pos 
08d0: 2d 3d 20 31 3b 0a 09 09 09 09 61 74 74 61 63 68  -= 1;.....attach
08e0: 2e 70 75 73 68 28 0a 09 09 09 09 09 4d 65 64 69  .push(......Medi
08f0: 61 47 72 6f 75 70 49 74 65 6d 3a 3a 66 6f 72 5f  aGroupItem::for_
0900: 64 6f 63 75 6d 65 6e 74 28 0a 09 09 09 09 09 09  document(.......
0910: 49 6e 70 75 74 46 69 6c 65 3a 3a 66 72 6f 6d 28  InputFile::from(
0920: 0a 09 09 09 09 09 09 09 49 6e 70 75 74 46 69 6c  ........InputFil
0930: 65 52 65 61 64 65 72 3a 3a 66 72 6f 6d 28 66 69  eReader::from(fi
0940: 6c 65 2e 64 61 74 61 29 0a 09 09 09 09 09 09 09  le.data)........
0950: 09 2e 77 69 74 68 5f 66 69 6c 65 5f 6e 61 6d 65  ..with_file_name
0960: 28 66 69 6c 65 2e 6e 61 6d 65 29 0a 09 09 09 09  (file.name).....
0970: 09 09 29 2c 0a 09 09 09 09 09 09 63 61 70 74 69  ..),.......capti
0980: 6f 6e 0a 09 09 09 09 09 29 0a 09 09 09 09 29 3b  on......).....);
0990: 0a 09 09 09 7d 0a 09 09 09 73 65 6c 66 2e 74 67  ....}....self.tg
09a0: 2e 65 78 65 63 75 74 65 28 53 65 6e 64 4d 65 64  .execute(SendMed
09b0: 69 61 47 72 6f 75 70 3a 3a 6e 65 77 28 2a 74 6f  iaGroup::new(*to
09c0: 2c 20 4d 65 64 69 61 47 72 6f 75 70 3a 3a 6e 65  , MediaGroup::ne
09d0: 77 28 61 74 74 61 63 68 29 2e 73 74 61 63 6b 28  w(attach).stack(
09e0: 29 3f 29 29 2e 61 77 61 69 74 2e 73 74 61 63 6b  )?)).await.stack
09f0: 28 29 3f 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  ()?;...} else {.
0a00: 09 09 09 73 65 6c 66 2e 74 67 2e 65 78 65 63 75  ...self.tg.execu
0a10: 74 65 28 0a 09 09 09 09 53 65 6e 64 44 6f 63 75  te(.....SendDocu
0a20: 6d 65 6e 74 3a 3a 6e 65 77 28 0a 09 09 09 09 09  ment::new(......
0a30: 2a 74 6f 2c 0a 09 09 09 09 09 49 6e 70 75 74 46  *to,......InputF
0a40: 69 6c 65 52 65 61 64 65 72 3a 3a 66 72 6f 6d 28  ileReader::from(
0a50: 6d 65 64 69 61 5b 30 5d 2e 64 61 74 61 2e 63 6c  media[0].data.cl
0a60: 6f 6e 65 28 29 29 0a 09 09 09 09 09 2e 77 69 74  one()).......wit
0a70: 68 5f 66 69 6c 65 5f 6e 61 6d 65 28 6d 65 64 69  h_file_name(medi
0a80: 61 5b 30 5d 2e 6e 61 6d 65 2e 63 6c 6f 6e 65 28  a[0].name.clone(
0a90: 29 29 0a 09 09 09 09 29 2e 77 69 74 68 5f 63 61  )).....).with_ca
0aa0: 70 74 69 6f 6e 28 6d 73 67 29 0a 09 09 09 09 2e  ption(msg)......
0ab0: 77 69 74 68 5f 63 61 70 74 69 6f 6e 5f 70 61 72  with_caption_par
0ac0: 73 65 5f 6d 6f 64 65 28 48 74 6d 6c 29 0a 09 09  se_mode(Html)...
0ad0: 09 29 2e 61 77 61 69 74 2e 73 74 61 63 6b 28 29  .).await.stack()
0ae0: 3f 3b 0a 09 09 7d 0a 09 09 4f 6b 28 28 29 29 0a  ?;...}...Ok(()).
0af0: 09 7d 0a 7d 0a                                   .}.}.