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