# funpay-client
Неофициальный асинхронный клиент для FunPay. Авторизация по `golden_key`, получение событий чатов и заказов в реальном времени.
## Установка
```toml
[dependencies]
funpay-client = "0.1"
tokio = { version = "1", features = ["full"] }
```
## Простой пример
```rust
use funpay_client::events::Event;
use funpay_client::types::FunPayAccount;
#[tokio::main]
async fn main() -> std::io::Result<()> {
let golden_key = std::env::var("FUNPAY_GOLDEN_KEY").unwrap_or_else(|_| String::from("YOUR_KEY"));
let mut account = FunPayAccount::new(golden_key);
let mut rx = account.subscribe();
tokio::spawn(async move {
loop {
match rx.recv().await {
Ok(ev) => match ev {
Event::InitialChat { .. } => println!("InitialChat"),
Event::ChatsListChanged => println!("ChatsListChanged"),
Event::LastChatMessageChanged { .. } => println!("LastChatMessageChanged"),
Event::NewMessage { .. } => println!("NewMessage"),
Event::InitialOrder { .. } => println!("InitialOrder"),
Event::OrdersListChanged { purchases, sales } => println!("OrdersListChanged {purchases} {sales}"),
Event::NewOrder { .. } => println!("NewOrder"),
Event::OrderStatusChanged { .. } => println!("OrderStatusChanged"),
},
Err(_) => break,
}
}
});
account.start_polling_loop().await
}
```
## События
- InitialChat
- ChatsListChanged
- LastChatMessageChanged
- NewMessage
- InitialOrder
- OrdersListChanged
- NewOrder
- OrderStatusChanged
## Требования
- Rust 1.74+
- Tokio 1.x
## Примеры фильтрации и реакции
### Только сообщения с ключевым словом
```rust
use funpay_client::events::Event;
use funpay_client::types::FunPayAccount;
#[tokio::main]
async fn main() -> std::io::Result<()> {
let mut account = FunPayAccount::new(std::env::var("FUNPAY_GOLDEN_KEY").unwrap());
let mut rx = account.subscribe();
tokio::spawn(async move {
loop {
if let Ok(Event::NewMessage { message }) = rx.recv().await {
if message.text.as_deref().map(|t| t.to_lowercase().contains("оплатил")).unwrap_or(false) {
println!("msg {}: {:?}", message.chat_id, message.text);
}
}
}
});
account.start_polling_loop().await
}
```
### Реакция на изменение статуса заказа
```rust
use funpay_client::events::Event;
use funpay_client::types::{FunPayAccount, OrderStatus};
#[tokio::main]
async fn main() -> std::io::Result<()> {
let mut account = FunPayAccount::new(std::env::var("FUNPAY_GOLDEN_KEY").unwrap());
let mut rx = account.subscribe();
tokio::spawn(async move {
loop {
match rx.recv().await {
Ok(Event::OrderStatusChanged { order }) => {
match order.status {
OrderStatus::Paid => println!("paid {}", order.id),
OrderStatus::Closed => println!("closed {}", order.id),
OrderStatus::Refunded => println!("refunded {}", order.id),
}
}
_ => {}
}
}
});
account.start_polling_loop().await
}
```