funpay-client 0.1.1

Unofficial async client for FunPay chats and orders polling
Documentation

funpay-client

Неофициальный асинхронный клиент для FunPay. Авторизация по golden_key, получение событий чатов и заказов в реальном времени.

Установка

[dependencies]

funpay-client = "0.1"

tokio = { version = "1", features = ["full"] }

Простой пример

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

Примеры фильтрации и реакции

Только сообщения с ключевым словом

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
}

Реакция на изменение статуса заказа

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
}