Artifact
decd6d1c81df9d3144c56b008312c0777be9851e34f1f77a5873c98f4a83a675:
0000: 75 73 65 20 63 72 61 74 65 3a 3a 75 74 69 6c 73 use crate::utils
0010: 3a 3a 7b 0a 09 41 74 74 61 63 68 6d 65 6e 74 2c ::{..Attachment,
0020: 0a 09 52 45 5f 53 50 45 43 49 41 4c 2c 0a 7d 3b ..RE_SPECIAL,.};
0030: 0a 0a 75 73 65 20 73 74 64 3a 3a 7b 0a 09 62 6f ..use std::{..bo
0040: 72 72 6f 77 3a 3a 43 6f 77 2c 0a 09 63 6f 6c 6c rrow::Cow,..coll
0050: 65 63 74 69 6f 6e 73 3a 3a 48 61 73 68 4d 61 70 ections::HashMap
0060: 2c 0a 09 66 6d 74 3a 3a 44 65 62 75 67 2c 0a 7d ,..fmt::Debug,.}
0070: 3b 0a 0a 75 73 65 20 73 74 61 63 6b 65 64 5f 65 ;..use stacked_e
0080: 72 72 6f 72 73 3a 3a 7b 0a 09 52 65 73 75 6c 74 rrors::{..Result
0090: 2c 0a 09 53 74 61 63 6b 61 62 6c 65 45 72 72 2c ,..StackableErr,
00a0: 0a 7d 3b 0a 75 73 65 20 74 67 62 6f 74 3a 3a 7b .};.use tgbot::{
00b0: 0a 09 61 70 69 3a 3a 43 6c 69 65 6e 74 2c 0a 09 ..api::Client,..
00c0: 74 79 70 65 73 3a 3a 7b 0a 09 09 43 68 61 74 50 types::{...ChatP
00d0: 65 65 72 49 64 2c 0a 09 09 49 6e 70 75 74 46 69 eerId,...InputFi
00e0: 6c 65 2c 0a 09 09 49 6e 70 75 74 46 69 6c 65 52 le,...InputFileR
00f0: 65 61 64 65 72 2c 0a 09 09 49 6e 70 75 74 4d 65 eader,...InputMe
0100: 64 69 61 44 6f 63 75 6d 65 6e 74 2c 0a 09 09 4d diaDocument,...M
0110: 65 64 69 61 47 72 6f 75 70 2c 0a 09 09 4d 65 64 ediaGroup,...Med
0120: 69 61 47 72 6f 75 70 49 74 65 6d 2c 0a 09 09 4d iaGroupItem,...M
0130: 65 73 73 61 67 65 2c 0a 09 09 50 61 72 73 65 4d essage,...ParseM
0140: 6f 64 65 3a 3a 4d 61 72 6b 64 6f 77 6e 56 32 2c ode::MarkdownV2,
0150: 0a 09 09 53 65 6e 64 4d 65 64 69 61 47 72 6f 75 ...SendMediaGrou
0160: 70 2c 0a 09 09 53 65 6e 64 4d 65 73 73 61 67 65 p,...SendMessage
0170: 2c 0a 09 09 53 65 6e 64 44 6f 63 75 6d 65 6e 74 ,...SendDocument
0180: 2c 0a 09 7d 2c 0a 7d 3b 0a 0a 2f 2f 2f 20 45 6e ,..},.};../// En
0190: 63 6f 64 65 73 20 73 70 65 63 69 61 6c 20 48 54 codes special HT
01a0: 4d 4c 20 65 6e 74 69 74 69 65 73 20 74 6f 20 70 ML entities to p
01b0: 72 65 76 65 6e 74 20 74 68 65 6d 20 69 6e 74 65 revent them inte
01c0: 72 66 65 72 69 6e 67 20 77 69 74 68 20 54 65 6c rfering with Tel
01d0: 65 67 72 61 6d 20 48 54 4d 4c 0a 70 75 62 20 66 egram HTML.pub f
01e0: 6e 20 65 6e 63 6f 64 65 20 28 74 65 78 74 3a 20 n encode (text:
01f0: 26 73 74 72 29 20 2d 3e 20 43 6f 77 3c 27 5f 2c &str) -> Cow<'_,
0200: 20 73 74 72 3e 20 7b 0a 09 52 45 5f 53 50 45 43 str> {..RE_SPEC
0210: 49 41 4c 2e 72 65 70 6c 61 63 65 5f 61 6c 6c 28 IAL.replace_all(
0220: 74 65 78 74 2c 20 22 5c 5c 24 31 22 29 0a 7d 0a text, "\\$1").}.
0230: 0a 23 5b 64 65 72 69 76 65 28 44 65 62 75 67 29 .#[derive(Debug)
0240: 5d 0a 70 75 62 20 73 74 72 75 63 74 20 54 65 6c ].pub struct Tel
0250: 65 67 72 61 6d 54 72 61 6e 73 70 6f 72 74 20 7b egramTransport {
0260: 0a 09 74 67 3a 20 43 6c 69 65 6e 74 2c 0a 09 72 ..tg: Client,..r
0270: 65 63 69 70 69 65 6e 74 73 3a 20 48 61 73 68 4d ecipients: HashM
0280: 61 70 3c 53 74 72 69 6e 67 2c 20 43 68 61 74 50 ap<String, ChatP
0290: 65 65 72 49 64 3e 2c 0a 09 70 75 62 20 64 65 66 eerId>,..pub def
02a0: 61 75 6c 74 3a 20 43 68 61 74 50 65 65 72 49 64 ault: ChatPeerId
02b0: 2c 0a 7d 0a 0a 69 6d 70 6c 20 54 65 6c 65 67 72 ,.}..impl Telegr
02c0: 61 6d 54 72 61 6e 73 70 6f 72 74 20 7b 0a 0a 09 amTransport {...
02d0: 70 75 62 20 66 6e 20 6e 65 77 20 28 61 70 69 5f pub fn new (api_
02e0: 6b 65 79 3a 20 53 74 72 69 6e 67 2c 20 72 65 63 key: String, rec
02f0: 69 70 69 65 6e 74 73 3a 20 48 61 73 68 4d 61 70 ipients: HashMap
0300: 3c 53 74 72 69 6e 67 2c 20 69 36 34 3e 2c 20 64 <String, i64>, d
0310: 65 66 61 75 6c 74 3a 20 69 36 34 29 20 2d 3e 20 efault: i64) ->
0320: 52 65 73 75 6c 74 3c 54 65 6c 65 67 72 61 6d 54 Result<TelegramT
0330: 72 61 6e 73 70 6f 72 74 3e 20 7b 0a 09 09 6c 65 ransport> {...le
0340: 74 20 74 67 20 3d 20 43 6c 69 65 6e 74 3a 3a 6e t tg = Client::n
0350: 65 77 28 61 70 69 5f 6b 65 79 29 0a 09 09 09 2e ew(api_key).....
0360: 63 6f 6e 74 65 78 74 28 22 46 61 69 6c 65 64 20 context("Failed
0370: 74 6f 20 63 72 65 61 74 65 20 41 50 49 2e 5c 6e to create API.\n
0380: 22 29 3f 3b 0a 09 09 6c 65 74 20 72 65 63 69 70 ")?;...let recip
0390: 69 65 6e 74 73 20 3d 20 72 65 63 69 70 69 65 6e ients = recipien
03a0: 74 73 2e 69 6e 74 6f 5f 69 74 65 72 28 29 0a 09 ts.into_iter()..
03b0: 09 09 2e 6d 61 70 28 7c 28 61 2c 20 62 29 7c 20 ...map(|(a, b)|
03c0: 28 61 2c 20 43 68 61 74 50 65 65 72 49 64 3a 3a (a, ChatPeerId::
03d0: 66 72 6f 6d 28 62 29 29 29 2e 63 6f 6c 6c 65 63 from(b))).collec
03e0: 74 28 29 3b 0a 09 09 6c 65 74 20 64 65 66 61 75 t();...let defau
03f0: 6c 74 20 3d 20 43 68 61 74 50 65 65 72 49 64 3a lt = ChatPeerId:
0400: 3a 66 72 6f 6d 28 64 65 66 61 75 6c 74 29 3b 0a :from(default);.
0410: 0a 09 09 4f 6b 28 54 65 6c 65 67 72 61 6d 54 72 ...Ok(TelegramTr
0420: 61 6e 73 70 6f 72 74 20 7b 0a 09 09 09 74 67 2c ansport {....tg,
0430: 0a 09 09 09 72 65 63 69 70 69 65 6e 74 73 2c 0a ....recipients,.
0440: 09 09 09 64 65 66 61 75 6c 74 2c 0a 09 09 7d 29 ...default,...})
0450: 0a 09 7d 0a 0a 09 2f 2f 2f 20 53 65 6e 64 20 6d ..}.../// Send m
0460: 65 73 73 61 67 65 20 74 6f 20 64 65 66 61 75 6c essage to defaul
0470: 74 20 75 73 65 72 2c 20 75 73 65 64 20 66 6f 72 t user, used for
0480: 20 64 65 62 75 67 2f 6c 6f 67 2f 69 6e 66 6f 20 debug/log/info
0490: 70 75 72 70 6f 73 65 73 0a 09 70 75 62 20 61 73 purposes..pub as
04a0: 79 6e 63 20 66 6e 20 64 65 62 75 67 20 28 26 73 ync fn debug (&s
04b0: 65 6c 66 2c 20 6d 73 67 3a 20 26 73 74 72 29 20 elf, msg: &str)
04c0: 2d 3e 20 52 65 73 75 6c 74 3c 4d 65 73 73 61 67 -> Result<Messag
04d0: 65 3e 20 7b 0a 09 09 73 65 6c 66 2e 73 65 6e 64 e> {...self.send
04e0: 28 26 73 65 6c 66 2e 64 65 66 61 75 6c 74 2c 20 (&self.default,
04f0: 65 6e 63 6f 64 65 28 6d 73 67 29 29 2e 61 77 61 encode(msg)).awa
0500: 69 74 0a 09 7d 0a 0a 09 2f 2f 2f 20 47 65 74 20 it..}.../// Get
0510: 72 65 63 69 70 69 65 6e 74 20 62 79 20 61 64 64 recipient by add
0520: 72 65 73 73 0a 09 70 75 62 20 66 6e 20 67 65 74 ress..pub fn get
0530: 20 28 26 73 65 6c 66 2c 20 6e 61 6d 65 3a 20 26 (&self, name: &
0540: 73 74 72 29 20 2d 3e 20 52 65 73 75 6c 74 3c 26 str) -> Result<&
0550: 43 68 61 74 50 65 65 72 49 64 3e 20 7b 0a 09 09 ChatPeerId> {...
0560: 73 65 6c 66 2e 72 65 63 69 70 69 65 6e 74 73 2e self.recipients.
0570: 67 65 74 28 6e 61 6d 65 29 0a 09 09 09 2e 77 69 get(name).....wi
0580: 74 68 5f 63 6f 6e 74 65 78 74 28 7c 7c 20 66 6f th_context(|| fo
0590: 72 6d 61 74 21 28 22 52 65 63 69 70 69 65 6e 74 rmat!("Recipient
05a0: 20 5c 22 7b 6e 61 6d 65 7d 5c 22 20 6e 6f 74 20 \"{name}\" not
05b0: 66 6f 75 6e 64 20 69 6e 20 63 6f 6e 66 69 67 75 found in configu
05c0: 72 61 74 69 6f 6e 22 29 29 0a 09 7d 0a 0a 09 2f ration"))..}.../
05d0: 2f 2f 20 53 65 6e 64 20 6d 65 73 73 61 67 65 20 // Send message
05e0: 74 6f 20 73 70 65 63 69 66 69 65 64 20 75 73 65 to specified use
05f0: 72 0a 09 70 75 62 20 61 73 79 6e 63 20 66 6e 20 r..pub async fn
0600: 73 65 6e 64 20 3c 53 3e 20 28 26 73 65 6c 66 2c send <S> (&self,
0610: 20 74 6f 3a 20 26 43 68 61 74 50 65 65 72 49 64 to: &ChatPeerId
0620: 2c 20 6d 73 67 3a 20 53 29 20 2d 3e 20 52 65 73 , msg: S) -> Res
0630: 75 6c 74 3c 4d 65 73 73 61 67 65 3e 0a 09 77 68 ult<Message>..wh
0640: 65 72 65 20 53 3a 20 49 6e 74 6f 3c 53 74 72 69 ere S: Into<Stri
0650: 6e 67 3e 20 2b 20 44 65 62 75 67 7b 0a 09 09 73 ng> + Debug{...s
0660: 65 6c 66 2e 74 67 2e 65 78 65 63 75 74 65 28 0a elf.tg.execute(.
0670: 09 09 09 53 65 6e 64 4d 65 73 73 61 67 65 3a 3a ...SendMessage::
0680: 6e 65 77 28 2a 74 6f 2c 20 6d 73 67 29 0a 09 09 new(*to, msg)...
0690: 09 2e 77 69 74 68 5f 70 61 72 73 65 5f 6d 6f 64 ..with_parse_mod
06a0: 65 28 4d 61 72 6b 64 6f 77 6e 56 32 29 0a 09 09 e(MarkdownV2)...
06b0: 29 2e 61 77 61 69 74 2e 73 74 61 63 6b 28 29 0a ).await.stack().
06c0: 09 7d 0a 0a 09 2f 2f 2f 20 53 65 6e 64 20 6d 65 .}.../// Send me
06d0: 64 69 61 20 74 6f 20 73 70 65 63 69 66 69 65 64 dia to specified
06e0: 20 75 73 65 72 0a 09 70 75 62 20 61 73 79 6e 63 user..pub async
06f0: 20 66 6e 20 73 65 6e 64 67 72 6f 75 70 20 28 26 fn sendgroup (&
0700: 73 65 6c 66 2c 20 74 6f 3a 20 26 43 68 61 74 50 self, to: &ChatP
0710: 65 65 72 49 64 2c 20 6d 65 64 69 61 3a 20 56 65 eerId, media: Ve
0720: 63 3c 41 74 74 61 63 68 6d 65 6e 74 3e 2c 20 6d c<Attachment>, m
0730: 73 67 3a 20 26 73 74 72 29 20 2d 3e 20 52 65 73 sg: &str) -> Res
0740: 75 6c 74 3c 28 29 3e 20 7b 0a 09 09 69 66 20 6d ult<()> {...if m
0750: 65 64 69 61 2e 6c 65 6e 28 29 20 3e 20 31 20 7b edia.len() > 1 {
0760: 0a 09 09 09 6c 65 74 20 6d 75 74 20 61 74 74 61 ....let mut atta
0770: 63 68 20 3d 20 76 65 63 21 5b 5d 3b 0a 09 09 09 ch = vec![];....
0780: 6c 65 74 20 6d 75 74 20 70 6f 73 20 3d 20 6d 65 let mut pos = me
0790: 64 69 61 2e 6c 65 6e 28 29 3b 0a 09 09 09 66 6f dia.len();....fo
07a0: 72 20 66 69 6c 65 20 69 6e 20 6d 65 64 69 61 20 r file in media
07b0: 7b 0a 09 09 09 09 6c 65 74 20 6d 75 74 20 63 61 {.....let mut ca
07c0: 70 74 69 6f 6e 20 3d 20 49 6e 70 75 74 4d 65 64 ption = InputMed
07d0: 69 61 44 6f 63 75 6d 65 6e 74 3a 3a 64 65 66 61 iaDocument::defa
07e0: 75 6c 74 28 29 3b 0a 09 09 09 09 69 66 20 70 6f ult();.....if po
07f0: 73 20 3d 3d 20 31 20 7b 0a 09 09 09 09 09 63 61 s == 1 {......ca
0800: 70 74 69 6f 6e 20 3d 20 63 61 70 74 69 6f 6e 2e ption = caption.
0810: 77 69 74 68 5f 63 61 70 74 69 6f 6e 28 6d 73 67 with_caption(msg
0820: 29 0a 09 09 09 09 09 09 2e 77 69 74 68 5f 63 61 )........with_ca
0830: 70 74 69 6f 6e 5f 70 61 72 73 65 5f 6d 6f 64 65 ption_parse_mode
0840: 28 4d 61 72 6b 64 6f 77 6e 56 32 29 3b 0a 09 09 (MarkdownV2);...
0850: 09 09 7d 0a 09 09 09 09 70 6f 73 20 2d 3d 20 31 ..}.....pos -= 1
0860: 3b 0a 09 09 09 09 61 74 74 61 63 68 2e 70 75 73 ;.....attach.pus
0870: 68 28 0a 09 09 09 09 09 4d 65 64 69 61 47 72 6f h(......MediaGro
0880: 75 70 49 74 65 6d 3a 3a 66 6f 72 5f 64 6f 63 75 upItem::for_docu
0890: 6d 65 6e 74 28 0a 09 09 09 09 09 09 49 6e 70 75 ment(.......Inpu
08a0: 74 46 69 6c 65 3a 3a 66 72 6f 6d 28 0a 09 09 09 tFile::from(....
08b0: 09 09 09 09 49 6e 70 75 74 46 69 6c 65 52 65 61 ....InputFileRea
08c0: 64 65 72 3a 3a 66 72 6f 6d 28 66 69 6c 65 2e 64 der::from(file.d
08d0: 61 74 61 29 0a 09 09 09 09 09 09 09 09 2e 77 69 ata)..........wi
08e0: 74 68 5f 66 69 6c 65 5f 6e 61 6d 65 28 66 69 6c th_file_name(fil
08f0: 65 2e 6e 61 6d 65 29 0a 09 09 09 09 09 09 29 2c e.name).......),
0900: 0a 09 09 09 09 09 09 63 61 70 74 69 6f 6e 0a 09 .......caption..
0910: 09 09 09 09 29 0a 09 09 09 09 29 3b 0a 09 09 09 ....).....);....
0920: 7d 0a 09 09 09 73 65 6c 66 2e 74 67 2e 65 78 65 }....self.tg.exe
0930: 63 75 74 65 28 53 65 6e 64 4d 65 64 69 61 47 72 cute(SendMediaGr
0940: 6f 75 70 3a 3a 6e 65 77 28 2a 74 6f 2c 20 4d 65 oup::new(*to, Me
0950: 64 69 61 47 72 6f 75 70 3a 3a 6e 65 77 28 61 74 diaGroup::new(at
0960: 74 61 63 68 29 2e 73 74 61 63 6b 28 29 3f 29 29 tach).stack()?))
0970: 2e 61 77 61 69 74 2e 73 74 61 63 6b 28 29 3f 3b .await.stack()?;
0980: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 73 ...} else {....s
0990: 65 6c 66 2e 74 67 2e 65 78 65 63 75 74 65 28 0a elf.tg.execute(.
09a0: 09 09 09 09 53 65 6e 64 44 6f 63 75 6d 65 6e 74 ....SendDocument
09b0: 3a 3a 6e 65 77 28 0a 09 09 09 09 09 2a 74 6f 2c ::new(......*to,
09c0: 0a 09 09 09 09 09 49 6e 70 75 74 46 69 6c 65 52 ......InputFileR
09d0: 65 61 64 65 72 3a 3a 66 72 6f 6d 28 6d 65 64 69 eader::from(medi
09e0: 61 5b 30 5d 2e 64 61 74 61 2e 63 6c 6f 6e 65 28 a[0].data.clone(
09f0: 29 29 0a 09 09 09 09 09 2e 77 69 74 68 5f 66 69 )).......with_fi
0a00: 6c 65 5f 6e 61 6d 65 28 6d 65 64 69 61 5b 30 5d le_name(media[0]
0a10: 2e 6e 61 6d 65 2e 63 6c 6f 6e 65 28 29 29 0a 09 .name.clone())..
0a20: 09 09 09 29 2e 77 69 74 68 5f 63 61 70 74 69 6f ...).with_captio
0a30: 6e 28 6d 73 67 29 0a 09 09 09 09 2e 77 69 74 68 n(msg)......with
0a40: 5f 63 61 70 74 69 6f 6e 5f 70 61 72 73 65 5f 6d _caption_parse_m
0a50: 6f 64 65 28 4d 61 72 6b 64 6f 77 6e 56 32 29 0a ode(MarkdownV2).
0a60: 09 09 09 29 2e 61 77 61 69 74 2e 73 74 61 63 6b ...).await.stack
0a70: 28 29 3f 3b 0a 09 09 7d 0a 09 09 4f 6b 28 28 29 ()?;...}...Ok(()
0a80: 29 0a 09 7d 0a 7d 0a )..}.}.