Hex Artifact Content
Logged in as anonymous

Artifact 65c59c91da0f81f26739a60f9f3538199e6641e7544fd754b051e0020d904a5c:


0000: 6d 6f 64 20 63 6f 6d 6d 61 6e 64 3b 0a 6d 6f 64  mod command;.mod
0010: 20 63 6f 72 65 3b 0a 0a 75 73 65 20 63 6f 6e 66   core;..use conf
0020: 69 67 3b 0a 75 73 65 20 66 75 74 75 72 65 73 3a  ig;.use futures:
0030: 3a 53 74 72 65 61 6d 45 78 74 3b 0a 75 73 65 20  :StreamExt;.use 
0040: 74 6f 6b 69 6f 3b 0a 75 73 65 20 74 65 6c 65 67  tokio;.use teleg
0050: 72 61 6d 5f 62 6f 74 3b 0a 0a 23 5b 6d 61 63 72  ram_bot;..#[macr
0060: 6f 5f 75 73 65 5d 0a 65 78 74 65 72 6e 20 63 72  o_use].extern cr
0070: 61 74 65 20 6c 61 7a 79 5f 73 74 61 74 69 63 3b  ate lazy_static;
0080: 0a 0a 75 73 65 20 61 6e 79 68 6f 77 3a 3a 52 65  ..use anyhow::Re
0090: 73 75 6c 74 3b 0a 0a 23 5b 74 6f 6b 69 6f 3a 3a  sult;..#[tokio::
00a0: 6d 61 69 6e 5d 0a 61 73 79 6e 63 20 66 6e 20 6d  main].async fn m
00b0: 61 69 6e 28 29 20 2d 3e 20 52 65 73 75 6c 74 3c  ain() -> Result<
00c0: 28 29 3e 20 7b 0a 09 6c 65 74 20 6d 75 74 20 73  ()> {..let mut s
00d0: 65 74 74 69 6e 67 73 20 3d 20 63 6f 6e 66 69 67  ettings = config
00e0: 3a 3a 43 6f 6e 66 69 67 3a 3a 64 65 66 61 75 6c  ::Config::defaul
00f0: 74 28 29 3b 0a 09 73 65 74 74 69 6e 67 73 2e 6d  t();..settings.m
0100: 65 72 67 65 28 63 6f 6e 66 69 67 3a 3a 46 69 6c  erge(config::Fil
0110: 65 3a 3a 77 69 74 68 5f 6e 61 6d 65 28 22 72 73  e::with_name("rs
0120: 73 74 67 22 29 29 3f 3b 0a 0a 09 6c 65 74 20 63  stg"))?;...let c
0130: 6f 72 65 20 3d 20 63 6f 72 65 3a 3a 43 6f 72 65  ore = core::Core
0140: 3a 3a 6e 65 77 28 73 65 74 74 69 6e 67 73 29 2e  ::new(settings).
0150: 61 77 61 69 74 3f 3b 0a 0a 09 6c 65 74 20 6d 75  await?;...let mu
0160: 74 20 73 74 72 65 61 6d 20 3d 20 63 6f 72 65 2e  t stream = core.
0170: 73 74 72 65 61 6d 28 29 3b 0a 09 73 74 72 65 61  stream();..strea
0180: 6d 2e 61 6c 6c 6f 77 65 64 5f 75 70 64 61 74 65  m.allowed_update
0190: 73 28 26 5b 74 65 6c 65 67 72 61 6d 5f 62 6f 74  s(&[telegram_bot
01a0: 3a 3a 41 6c 6c 6f 77 65 64 55 70 64 61 74 65 3a  ::AllowedUpdate:
01b0: 3a 4d 65 73 73 61 67 65 5d 29 3b 0a 09 6c 65 74  :Message]);..let
01c0: 20 6d 75 74 20 72 65 70 6c 79 5f 74 6f 3a 20 4f   mut reply_to: O
01d0: 70 74 69 6f 6e 3c 74 65 6c 65 67 72 61 6d 5f 62  ption<telegram_b
01e0: 6f 74 3a 3a 55 73 65 72 49 64 3e 3b 0a 0a 09 6c  ot::UserId>;...l
01f0: 6f 6f 70 20 7b 0a 09 09 72 65 70 6c 79 5f 74 6f  oop {...reply_to
0200: 20 3d 20 4e 6f 6e 65 3b 0a 09 09 6d 61 74 63 68   = None;...match
0210: 20 73 74 72 65 61 6d 2e 6e 65 78 74 28 29 2e 61   stream.next().a
0220: 77 61 69 74 20 7b 0a 09 09 09 53 6f 6d 65 28 75  wait {....Some(u
0230: 70 64 61 74 65 29 20 3d 3e 20 7b 0a 09 09 09 09  pdate) => {.....
0240: 69 66 20 6c 65 74 20 45 72 72 28 65 72 72 29 20  if let Err(err) 
0250: 3d 20 68 61 6e 64 6c 65 28 75 70 64 61 74 65 3f  = handle(update?
0260: 2c 20 26 63 6f 72 65 2c 20 26 6d 75 74 20 72 65  , &core, &mut re
0270: 70 6c 79 5f 74 6f 29 2e 61 77 61 69 74 20 7b 0a  ply_to).await {.
0280: 09 09 09 09 09 63 6f 72 65 2e 73 65 6e 64 28 26  .....core.send(&
0290: 66 6f 72 6d 61 74 21 28 22 f0 9f 9b 91 20 7b 3a  format!("🛑 {:
02a0: 3f 7d 22 2c 20 65 72 72 29 2c 20 72 65 70 6c 79  ?}", err), reply
02b0: 5f 74 6f 2c 20 4e 6f 6e 65 29 3f 3b 0a 09 09 09  _to, None)?;....
02c0: 09 7d 3b 0a 09 09 09 7d 2c 0a 09 09 09 4e 6f 6e  .};....},....Non
02d0: 65 20 3d 3e 20 7b 0a 09 09 09 09 63 6f 72 65 2e  e => {.....core.
02e0: 73 65 6e 64 28 26 66 6f 72 6d 61 74 21 28 22 f0  send(&format!("ð
02f0: 9f 9b 91 20 4e 6f 6e 65 20 65 72 72 6f 72 2e 22  Ÿ›‘ None error."
0300: 29 2c 20 4e 6f 6e 65 2c 20 4e 6f 6e 65 29 3f 3b  ), None, None)?;
0310: 0a 09 09 09 7d 0a 09 09 7d 3b 0a 09 7d 0a 7d 0a  ....}...};..}.}.
0320: 0a 61 73 79 6e 63 20 66 6e 20 68 61 6e 64 6c 65  .async fn handle
0330: 28 75 70 64 61 74 65 3a 20 74 65 6c 65 67 72 61  (update: telegra
0340: 6d 5f 62 6f 74 3a 3a 55 70 64 61 74 65 2c 20 63  m_bot::Update, c
0350: 6f 72 65 3a 20 26 63 6f 72 65 3a 3a 43 6f 72 65  ore: &core::Core
0360: 2c 20 6d 75 74 20 5f 72 65 70 6c 79 5f 74 6f 3a  , mut _reply_to:
0370: 20 26 4f 70 74 69 6f 6e 3c 74 65 6c 65 67 72 61   &Option<telegra
0380: 6d 5f 62 6f 74 3a 3a 55 73 65 72 49 64 3e 29 20  m_bot::UserId>) 
0390: 2d 3e 20 52 65 73 75 6c 74 3c 28 29 3e 20 7b 0a  -> Result<()> {.
03a0: 09 6d 61 74 63 68 20 75 70 64 61 74 65 2e 6b 69  .match update.ki
03b0: 6e 64 20 7b 0a 09 09 74 65 6c 65 67 72 61 6d 5f  nd {...telegram_
03c0: 62 6f 74 3a 3a 55 70 64 61 74 65 4b 69 6e 64 3a  bot::UpdateKind:
03d0: 3a 4d 65 73 73 61 67 65 28 6d 65 73 73 61 67 65  :Message(message
03e0: 29 20 3d 3e 20 7b 0a 09 09 09 6d 61 74 63 68 20  ) => {....match 
03f0: 6d 65 73 73 61 67 65 2e 6b 69 6e 64 20 7b 0a 09  message.kind {..
0400: 09 09 09 74 65 6c 65 67 72 61 6d 5f 62 6f 74 3a  ...telegram_bot:
0410: 3a 4d 65 73 73 61 67 65 4b 69 6e 64 3a 3a 54 65  :MessageKind::Te
0420: 78 74 20 7b 20 72 65 66 20 64 61 74 61 2c 20 2e  xt { ref data, .
0430: 2e 20 7d 20 3d 3e 20 7b 0a 09 09 09 09 09 6c 65  . } => {......le
0440: 74 20 73 65 6e 64 65 72 20 3d 20 6d 65 73 73 61  t sender = messa
0450: 67 65 2e 66 72 6f 6d 2e 69 64 3b 0a 09 09 09 09  ge.from.id;.....
0460: 09 6c 65 74 20 77 6f 72 64 73 3a 20 56 65 63 3c  .let words: Vec<
0470: 26 73 74 72 3e 20 3d 20 64 61 74 61 2e 73 70 6c  &str> = data.spl
0480: 69 74 5f 77 68 69 74 65 73 70 61 63 65 28 29 2e  it_whitespace().
0490: 63 6f 6c 6c 65 63 74 28 29 3b 0a 09 09 09 09 09  collect();......
04a0: 6d 61 74 63 68 20 6d 61 74 63 68 20 77 6f 72 64  match match word
04b0: 73 5b 30 5d 20 7b 0a 09 09 09 09 09 09 22 2f 63  s[0] {......."/c
04c0: 68 65 63 6b 22 20 7c 20 22 2f 63 6c 65 61 6e 22  heck" | "/clean"
04d0: 20 7c 20 22 2f 65 6e 61 62 6c 65 22 20 7c 20 22   | "/enable" | "
04e0: 2f 64 65 6c 65 74 65 22 20 7c 20 22 2f 64 69 73  /delete" | "/dis
04f0: 61 62 6c 65 22 20 3d 3e 20 63 6f 6d 6d 61 6e 64  able" => command
0500: 3a 3a 63 6f 6d 6d 61 6e 64 28 63 6f 72 65 2c 20  ::command(core, 
0510: 73 65 6e 64 65 72 2c 20 77 6f 72 64 73 29 2e 61  sender, words).a
0520: 77 61 69 74 2c 0a 09 09 09 09 09 09 22 2f 73 74  wait,......."/st
0530: 61 72 74 22 20 3d 3e 20 63 6f 6d 6d 61 6e 64 3a  art" => command:
0540: 3a 73 74 61 72 74 28 63 6f 72 65 2c 20 73 65 6e  :start(core, sen
0550: 64 65 72 29 2e 61 77 61 69 74 2c 0a 09 09 09 09  der).await,.....
0560: 09 09 22 2f 6c 69 73 74 22 20 3d 3e 20 63 6f 6d  .."/list" => com
0570: 6d 61 6e 64 3a 3a 6c 69 73 74 28 63 6f 72 65 2c  mand::list(core,
0580: 20 73 65 6e 64 65 72 29 2e 61 77 61 69 74 2c 0a   sender).await,.
0590: 09 09 09 09 09 09 22 2f 61 64 64 22 20 7c 20 22  ......"/add" | "
05a0: 2f 75 70 64 61 74 65 22 20 3d 3e 20 63 6f 6d 6d  /update" => comm
05b0: 61 6e 64 3a 3a 75 70 64 61 74 65 28 63 6f 72 65  and::update(core
05c0: 2c 20 73 65 6e 64 65 72 2c 20 77 6f 72 64 73 29  , sender, words)
05d0: 2e 61 77 61 69 74 2c 0a 09 09 09 09 09 09 5f 20  .await,......._ 
05e0: 3d 3e 20 4f 6b 28 28 29 29 2c 0a 09 09 09 09 09  => Ok(()),......
05f0: 7d 20 7b 0a 09 09 09 09 09 09 45 72 72 28 65 72  } {.......Err(er
0600: 72 29 20 3d 3e 20 63 6f 72 65 2e 73 65 6e 64 28  r) => core.send(
0610: 26 66 6f 72 6d 61 74 21 28 22 f0 9f 9b 91 20 7b  &format!("🛑 {
0620: 3a 3f 7d 22 2c 20 65 72 72 29 2c 20 53 6f 6d 65  :?}", err), Some
0630: 28 73 65 6e 64 65 72 29 2c 20 4e 6f 6e 65 29 3f  (sender), None)?
0640: 2c 0a 09 09 09 09 09 09 4f 6b 28 28 29 29 20 3d  ,.......Ok(()) =
0650: 3e 20 7b 7d 2c 0a 09 09 09 09 09 7d 3b 0a 09 09  > {},......};...
0660: 09 09 7d 2c 0a 09 09 09 09 5f 20 3d 3e 20 7b 0a  ..},....._ => {.
0670: 09 09 09 09 7d 2c 0a 09 09 09 7d 3b 0a 09 09 7d  ....},....};...}
0680: 2c 0a 09 09 5f 20 3d 3e 20 7b 7d 2c 0a 09 7d 3b  ,..._ => {},..};
0690: 0a 0a 09 4f 6b 28 28 29 29 0a 7d 0a              ...Ok(()).}.