# R701 🕰️ [![Rust](https://img.shields.io/badge/Rust-f74c00?logo=rust)](https://www.rust-lang.org) [![Claude Code](https://img.shields.io/badge/Claude%20Code-grey?logo=claude&logoColor=d97757)](https://claude.com/product/claude-code) [![GNU AGPLv3.0 License](https://img.shields.io/badge/License-GNU%20AGPLv3.0-dark_green?logo=gnu)](https://choosealicense.com/licenses/agpl-3.0) [![Buymeacoffee](https://img.shields.io/badge/Buymeacoffee-gray?logo=buymeacoffee)](https://buymeacoffee.com/nicolabelluti)
[![CI Badge](https://git.nicolabelluti.me/nicolabelluti/r701/actions/workflows/check-format-and-test.yaml/badge.svg)](https://git.nicolabelluti.me/nicolabelluti/r701/actions/?workflow=check-format-and-test.yaml)

> A reverse-engineered library to communicate with the > [R701](https://ipsattendant.it/rilevatore-presenze-r701/) by [I.P.S. > Informatica](https://ipsinformatica.info/), written in Rust If you want to read about this reverse engineering attempt, check out . ## Library Usage 1. Add the library to you project: ```shell cargo add r701 --git https://git.nicolabelluti.me/nicolabelluti/r701.git ``` 2. Use the library in you project: This library is async and built on [tokio](https://tokio.rs); add it to your own `[dependencies]` (e.g. `tokio = { version = "1", features = ["rt-multi-thread", "macros"] }`) to run the example below. ```rust use r701::R701; use tokio_stream::StreamExt; #[tokio::main] async fn main() { let mut r701 = R701::connect("127.0.0.1:5005").await.unwrap(); let records = r701 .into_record_iter() .await .unwrap() .collect::>() .await; println!("No\tMchn\tEnNo\t\tName\t\tMode\tIOMd\tDateTime\t"); for (id, record) in records.iter().rev().enumerate() { let record = record.as_ref().unwrap(); let name = r701 .get_name(record.employee_id) .await .unwrap() .unwrap_or(format!("user #{}", record.employee_id)); println!( "{:0>6}\t{}\t{:0>9}\t{: <10}\t{}\t{}\t{}", id + 1, 1, record.employee_id, name, 35, record.clock as u8, record.datetime.format("%Y/%m/%d %H:%M:%S"), ); } } ```